Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions docs/adr/0047-parallel-research-and-report-artifacts.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,3 +50,7 @@ Coordinate only first-use anonymous correlation within a conversation. Two concu
Pin anonymous and authenticated read schemas independently from reviewed live discovery. Authenticated discovery on 2026-10-31 differed from the initial documentation-derived fixture: it closes additional properties, adds explicit nullable defaults and omits the documented fetch URL-array maximum. Update the authenticated pin and deterministic fixture only; preserve strict structural comparison and refusal of unknown tools. Jit's own public-read and output bounds remain in force. A catalog match does not establish successful search/fetch, free capacity or a published quota number. Anonymous remains the installation default; an explicitly selected key never triggers account, model or anonymous fallback.

Authenticated read correlation is independent from the saved anonymous conversation. Do not pass that saved anonymous ID into keyed normalization or replace it with a keyed response ID. A later explicit return to anonymous reuses its original provider-issued correlation.

## Keenable opt-in (keyless)

Keenable is an optional keyless search/fetch provider the owner picks in Settings > Web research instead of Parallel. Parallel stays the default and an absent provider means Parallel, so existing settings and reads need no migration. The Keenable client returns the same normalized result, reuses the outbound guard, byte caps and Retry-After parsing, and sends one request per read with a fixed `X-Keenable-Title: Jit` header and no key, session id or model name. Selection is allowed only in anonymous mode, so a saved Parallel key never reaches Keenable; quota fencing is scoped per provider and a 429 never falls back to the other provider or a key. The body is read in chunks and the read stops and cancels the stream as soon as the byte cap is passed. Fetch evidence follows the ParallelMcp rules: a description-only answer is an excerpt, never full content, and an unmet full-content request is partial; a page returned for a different URL keeps the requested URL in missing. Settings, evidence, setup and lifecycle copy render per the selected provider; only the quota title names the provider, other error titles stay provider-neutral. A keyed Keenable mode is out of scope and would need its own vault, billing and review treatment.
35 changes: 26 additions & 9 deletions src/i18n/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2574,7 +2574,7 @@ export const en: Record<MessageKey, string> = {
"s14.memory.confirm.exact": "Applies to this exact revision:",
"s14.memory.reach.does": "What this does",
"s14.memory.reach.cannot": "What this cannot reach",
"s14.memory.reach.external": "Anything already sent to a model provider or Parallel cannot be recalled",
"s14.memory.reach.external": "Anything already sent to a model provider or web search cannot be recalled",
"s14.memory.reach.native": "Session history on disk is not erased in this build. Old sessions are just never reopened",
"s14.memory.correct.text": "Correct text",
"s14.memory.correct.does_1": "Withdraws the old memory and everything that relied on it, as listed below",
Expand Down Expand Up @@ -2696,22 +2696,22 @@ export const en: Record<MessageKey, string> = {
"s14.memory.done.decision_set_detail": "It applies to new context in this chat",
"s14.memory.done.withdrawn": "Withdrawn:",
"s14.evidence.none_granted": "This work has no web tools",
"s14.evidence.none_granted_detail": "Its grant names no web research, so nothing left this machine through Parallel",
"s14.evidence.none_granted_detail": "Its grant names no web research, so nothing left this machine through web search",
"s14.evidence.none_yet": "No searches or reads yet",
"s14.evidence.none_yet_detail": "Every search and read appears here when a Bot makes one, including failures",
"s14.evidence.left": "Left this machine",
"s14.evidence.queries": "queries",
"s14.evidence.urls": "URLs",
"s14.evidence.sent_to": "Sent to Parallel:",
"s14.evidence.sent_to": "Sent to:",
"s14.evidence.guard_note": "Jit checks for private text word for word before sending, but it cannot detect a paraphrase. The exact text sent is below",
"s14.evidence.gaps": "Evidence has gaps",
"s14.evidence.gaps_detail": "Some reads did not fully return. See below. Jit does not retry, change provider or turn on an account for you",
"s14.evidence.no_gaps": "Every read returned",
"s14.evidence.no_gaps_detail": "The service answered. That does not mean the question is covered or the data is current",
"s14.evidence.refused": "Refused before sending",
"s14.evidence.usage": "Reported usage",
"s14.evidence.usage_reported": "These figures come from Parallel. They are not a bill",
"s14.evidence.usage_empty": "Parallel reported no items",
"s14.evidence.usage_reported": "These figures come from the search provider. They are not a bill",
"s14.evidence.usage_empty": "The provider reported no items",
"s14.evidence.usage_from": "from reads:",
"s14.evidence.usage_unknown": "Unknown:",
"s14.evidence.exact_sent": "Exact text sent",
Expand Down Expand Up @@ -2744,7 +2744,7 @@ export const en: Record<MessageKey, string> = {
"s14.evidence.show_text": "Show the returned text",
"s14.evidence.no_text": "No text came back",
"s14.evidence.contexts": "What this work received from memory",
"s14.evidence.contexts_note": "Memory placed in this work’s context. It is not what was sent to Parallel",
"s14.evidence.contexts_note": "Memory placed in this work’s context. It is not what was sent to the search provider",
"s14.evidence.context_current": "Current",
"s14.evidence.context_retired": "Retired",
"s14.evidence.context_retired_detail": "This context was retired because memory changed, so its text is withheld",
Expand Down Expand Up @@ -2778,13 +2778,17 @@ export const en: Record<MessageKey, string> = {
"s14.web_outcome.quota_known_detail": "The service gave a reset time. New web reads wait until it passes. Jit will not change provider or account for you.",
"s14.web_outcome.resets_at": "Resets at",
"s14.web_outcome.quota_title": "Parallel rate limit",
"s14.web_outcome.quota_title_keenable": "Keenable rate limit",
"s14.web_outcome.quota_detail": "The no-key mode hit a temporary limit. The service did not say when it resets. Jit will not change provider or turn on an account for you.",
"s14.web_outcome.quota_detail_keenable": "Keenable hit a temporary limit. The service did not say when it resets. Jit will not change provider or turn on an account for you.",
"s14.web_outcome.quota_account_title": "Parallel account limit",
"s14.web_outcome.quota_account_detail": "Your account hit its limit or quota. The service did not say when it resets. Jit will not go back to the free mode by itself.",
"s14.web_outcome.schema_changed_title": "The service changed",
"s14.web_outcome.schema_changed_detail": "Parallel’s tools or data format no longer match what Jit reviewed, so Jit did not use this and will not adapt by itself. Jit needs an update.",
"s14.web_outcome.schema_changed_detail_keenable": "Keenable’s tools or data format no longer match what Jit reviewed, so Jit did not use this and will not adapt by itself. Jit needs an update.",
"s14.web_outcome.service_error_title": "Service error",
"s14.web_outcome.service_error_detail": "Parallel could not answer, or the read was interrupted. Jit does not retry by itself.",
"s14.web_outcome.service_error_detail_keenable": "Keenable could not answer, or the read was interrupted. Jit does not retry by itself.",
"s14.web_outcome.blocked_title": "The source or request was refused",
"s14.web_outcome.blocked_detail": "The URL or query failed a rule, or the site refused the read. Jit does not work around it.",
"s14.web_outcome.private_context_title": "Not sent: it matched private text",
Expand All @@ -2807,6 +2811,7 @@ export const en: Record<MessageKey, string> = {
"s14.web.subtitle": "Public research needs no setup",
"s14.web.free_title": "Nothing to set up",
"s14.web.free_detail": "Bots search and read public pages through Parallel for free, with no key, within Parallel’s limits",
"s14.web.free_detail_keenable": "Bots search and read public pages through Keenable for free, with no key, within Keenable’s limits",
Comment thread
greptile-apps[bot] marked this conversation as resolved.
Resolved
"s14.web.paid_title": "Using your account, which may cost money",
"s14.web.paid_detail": "Every search and read uses your key until you change it",
"s14.web.key_gone": "Web research is stopped: no key",
Expand All @@ -2815,13 +2820,17 @@ export const en: Record<MessageKey, string> = {
"s14.web.mode_anonymous": "No key",
"s14.web.mode_authenticated": "Your account",
"s14.web.mode_anonymous_detail": "Free within Parallel’s limits",
"s14.web.mode_anonymous_detail_keenable": "Free within Keenable’s limits",
"s14.web.mode_authenticated_detail": "Uses your key and may cost money with Parallel",
"s14.web.sends": "Sends",
"s14.web.sends_detail": "Only public queries and URLs, plus the model name. Every send is recorded in the work’s evidence",
"s14.web.sends_detail_keenable": "Only public queries and URLs. Every send is recorded in the work’s evidence",
"s14.web.reads": "Who opens pages",
"s14.web.reads_detail": "Parallel opens the pages. Jit checks the URL before sending, but cannot check DNS or redirects on Parallel’s side",
"s14.web.reads_detail_keenable": "Keenable opens the pages. Jit checks the URL before sending, but cannot check DNS or redirects on Keenable’s side",
"s14.web.limit": "Free limit",
"s14.web.limit_detail": "Set by Parallel, not guaranteed, and Jit does not know the number",
"s14.web.limit_detail_keenable": "Set by Keenable, not guaranteed, and Jit does not know the number",
"s14.web.bounds": "Jit’s limits",
"s14.web.bounds_detail": "5 results per search, 15 seconds and 32 KiB per read, no automatic retry, and every read counts against the work’s limits",
"s14.web.unavailable": "When unavailable",
Expand Down Expand Up @@ -2849,6 +2858,14 @@ export const en: Record<MessageKey, string> = {
"s14.web.remove_selected_note": "This key is in use. Removing it stops web research, and Jit will not go back to free by itself",
"s14.web.back_free": "Back to no key",
"s14.web.back_free_note": "Applies to the next read. Saved keys stay saved",
"s14.web.provider": "Search provider (optional)",
"s14.web.provider_lead": "Parallel is the default. Keenable is a keyless alternative for the free mode; it never uses your Parallel key",
"s14.web.provider_parallel": "Parallel",
"s14.web.provider_keenable": "Keenable",
"s14.web.provider_current": "Current provider",
"s14.web.provider_use_parallel": "Use Parallel",
"s14.web.provider_use_keenable": "Use Keenable",
"s14.web.provider_keyed_note": "Switching provider needs the free mode. Go back to no key first to choose Keenable",
"s14.web.back": "Back to More",
"s14.web.done.key_saved": "Key saved",
"s14.web.done.key_saved_detail": "It is not on yet. The current mode is unchanged",
Expand All @@ -2861,7 +2878,7 @@ export const en: Record<MessageKey, string> = {
"s14.setup.research": "Web research",
"s14.setup.research_web_search": "Let Jit search public web pages",
"s14.setup.research_web_fetch": "Let Jit read public web pages",
"s14.setup.research_note": "No key needed. Queries and URLs go to Parallel, free within Parallel’s limits. Tools run only in work you start",
"s14.setup.research_note": "No key needed. Queries and URLs go to the selected search provider, free within its limits. Tools run only in work you start",
"s14.setup.nothing_else": "Nothing else is granted. Jit starts with no accounts, files or computer",
"s14.login.source_title": "Running from source",
"s14.login.source_note": "Stop serve on this machine, run this command to set the password, then start serve again with bun src/main.ts serve --s14",
Expand Down Expand Up @@ -3902,8 +3919,8 @@ export const en: Record<MessageKey, string> = {
"s14.life.tool.web_search": "Search the web",
"s14.life.tool.web_fetch": "Read a public page",
"s14.life.tool.computer": "Use its own computer",
"s14.life.gain.web_search": "Queries leave this machine for Parallel, and only in work you give this tool",
"s14.life.gain.web_fetch": "URLs leave this machine for Parallel, and only in work you give this tool",
"s14.life.gain.web_search": "Queries leave this machine for the search provider, and only in work you give this tool",
"s14.life.gain.web_fetch": "URLs leave this machine for the search provider, and only in work you give this tool",
"s14.life.gain.computer": "Only in work you give this tool. The Bot computer stays isolated",
"s14.life.gain.slot": "Can receive one share. No file or memory comes with it, and sharing is a separate step",
"s14.life.lose.slot": "If a share uses this slot, the Bot can no longer use it",
Expand Down
Loading
Loading