@robota-sdk/agent-transport 3.0.0-beta.93 → 3.0.0-beta.95

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/CHANGELOG.md +151 -0
  2. package/README.md +2 -1
  3. package/dist/browser/client.d.ts +1 -1
  4. package/dist/browser/client.js +1 -1
  5. package/dist/browser/index.d.ts +34 -4
  6. package/dist/browser/index.d.ts.map +1 -1
  7. package/dist/browser/index.js +1 -1
  8. package/dist/browser/index.js.map +1 -1
  9. package/dist/browser/{observer-messages-Dnff2Tdb.d.ts → observer-messages-DoWb6RNv.d.ts} +23 -1
  10. package/dist/browser/observer-messages-DoWb6RNv.d.ts.map +1 -0
  11. package/dist/browser/observer-messages-UG77sTYK.js +2 -0
  12. package/dist/browser/observer-messages-UG77sTYK.js.map +1 -0
  13. package/dist/node/index.cjs +1 -1
  14. package/dist/node/index.d.cts +54 -3
  15. package/dist/node/index.d.cts.map +1 -1
  16. package/dist/node/index.d.ts +54 -3
  17. package/dist/node/index.d.ts.map +1 -1
  18. package/dist/node/index.js +1 -1
  19. package/dist/node/index.js.map +1 -1
  20. package/dist/node/node.cjs +1 -1
  21. package/dist/node/node.d.cts +19 -1
  22. package/dist/node/node.d.cts.map +1 -1
  23. package/dist/node/node.d.ts +19 -1
  24. package/dist/node/node.d.ts.map +1 -1
  25. package/dist/node/node.js +1 -1
  26. package/dist/node/node.js.map +1 -1
  27. package/package.json +8 -8
  28. package/src/__tests__/__fixtures__/korean-text.json +6 -0
  29. package/src/__tests__/app-tool-messages.test.ts +463 -0
  30. package/src/__tests__/channel-frames.test.ts +3 -2
  31. package/src/__tests__/handoff-chunking.test.ts +6 -3
  32. package/src/__tests__/message-decoders.test.ts +101 -0
  33. package/src/__tests__/permission-summary.test.ts +18 -0
  34. package/src/__tests__/session-message-handler-observe.test.ts +6 -0
  35. package/src/__tests__/session-message-handler.test.ts +3 -2
  36. package/src/__tests__/session-resume-bridge.test.ts +66 -0
  37. package/src/__tests__/stdio-carrier.test.ts +85 -0
  38. package/src/app-tool-messages.ts +140 -0
  39. package/src/index.ts +7 -0
  40. package/src/message-decoders.ts +16 -0
  41. package/src/node/index.ts +2 -0
  42. package/src/node/stdio-carrier.ts +59 -0
  43. package/src/permission-summary.ts +18 -0
  44. package/src/protocol-session.ts +7 -1
  45. package/src/session-events.ts +1 -0
  46. package/src/session-message-handler.ts +37 -1
  47. package/src/session-resume-bridge.ts +15 -0
  48. package/src/wire-messages.ts +35 -0
  49. package/dist/browser/observer-messages-CEeisRaF.js +0 -2
  50. package/dist/browser/observer-messages-CEeisRaF.js.map +0 -1
  51. package/dist/browser/observer-messages-Dnff2Tdb.d.ts.map +0 -1
@@ -1,3 +1,9 @@
1
+ import type {
2
+ IToolAppView,
3
+ IToolExecutionResult,
4
+ TToolParameters,
5
+ TUniversalMessagePart,
6
+ } from '@robota-sdk/agent-core';
1
7
  import type {
2
8
  IPersonalUsageReport,
3
9
  IPersonalUsageRequest,
@@ -157,6 +163,23 @@ export type TClientMessage =
157
163
  // The Project panel's "Memory" section — project memory as readable text. Answered by
158
164
  // `project_memory`.
159
165
  | { type: 'project-memory'; requestId: string }
166
+ // A driving surface invokes one runtime tool for a hosted app view, through the session's
167
+ // permission gate; a prompt it raises is attributed to that surface's driver. `viewId` names the
168
+ // view (from a `tool_end`'s `appView`) and limits the call to the tools that view's own source
169
+ // declared. Answered by `app_tool_result`; a call that decoded but is refused (the view is gone,
170
+ // the tool is not the view's, the invocation is refused) is answered by `protocol_error` echoing
171
+ // `requestId`. A frame that does not decode, or one an observer sends, carries no `requestId`.
172
+ | {
173
+ type: 'call-app-tool';
174
+ requestId: string;
175
+ viewId: string;
176
+ name: string;
177
+ arguments: TToolParameters;
178
+ }
179
+ // A driving surface reads the view a finished model call named in its `tool_end` (`appView`).
180
+ // Answered by `app_view`; a read that decoded but cannot be served (gone, or too large to send)
181
+ // is answered by `protocol_error` echoing `requestId`.
182
+ | { type: 'read-app-view'; requestId: string; viewId: string }
160
183
  | { type: 'get-background-tasks'; filter?: IBackgroundTaskListFilter }
161
184
  | { type: 'get-background-task'; taskId: string }
162
185
  | { type: 'get-background-job-groups' }
@@ -338,6 +361,18 @@ export type TServerMessage =
338
361
  | { type: 'project_status'; requestId: string; result: TProjectStatusRead }
339
362
  | { type: 'project_diff'; requestId: string; result: TProjectDiffRead }
340
363
  | { type: 'project_memory'; requestId: string; result: TProjectMemoryRead }
364
+ // The outcome of a `call-app-tool`, correlated by `requestId`: the tool's own result, as the
365
+ // session returned it.
366
+ | {
367
+ type: 'app_tool_result';
368
+ requestId: string;
369
+ success: boolean;
370
+ data?: IToolExecutionResult['result'];
371
+ parts?: TUniversalMessagePart[];
372
+ error?: string;
373
+ }
374
+ // The answer to a `read-app-view`: the whole document, to the surface that asked and no other.
375
+ | { type: 'app_view'; requestId: string; view: IToolAppView }
341
376
  | { type: 'background_task_event'; event: TBackgroundTaskEvent }
342
377
  | { type: 'background_job_group_event'; event: TBackgroundJobGroupEvent }
343
378
  | { type: 'plan_event'; event: IPlanApprovalEvent }
@@ -1,2 +0,0 @@
1
- import{SESSION_CHANGE_REFUSAL_CODES as e,SESSION_DELETE_REFUSAL_CODES as t}from"@robota-sdk/agent-interface-session";const n=4*1024*1024;function r(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}const i=e=>typeof e==`string`,a=e=>typeof e==`string`&&e.length>0,o=e=>typeof e==`boolean`,s=e=>typeof e==`number`&&Number.isFinite(e),c=e=>Number.isSafeInteger(e)&&e>=0,l=e=>t=>t===void 0||e(t),u=e=>Array.isArray(e)&&e.every(r),d=e=>e===null||r(e),f=e=>t=>typeof t==`string`&&e.includes(t),p={user:!0,"agent-wakeup":!0,peer:!0,external:!0},m=e=>r(e)&&i(e.id)&&i(e.timestamp)&&i(e.category)&&i(e.type),h=e=>Array.isArray(e)&&e.every(m),g=e=>r(e)&&i(e.name)&&i(e.description)&&i(e.definedIn),_=e=>Array.isArray(e)&&e.every(g),v=[`agent`,`process`,`scheduled`],y=[`foreground`,`background`],b=[`queued`,`running`,`waiting_permission`,`sleeping`,`paused`,`completed`,`failed`,`cancelled`],x=[`cancel`,`close`,`send`],S=e=>r(e)&&l(f(v))(e.kind)&&l(f(b))(e.status)&&l(f(y))(e.mode)&&l(o)(e.includeClosed),C=e=>r(e)&&l(i)(e.prompt)&&l(i)(e.stdin),w=e=>r(e)&&s(e.offset),T=e=>r(e)&&c(e.offset),E=e=>o(e)||e===`allow-session`||e===`allow-project`,D=e=>r(e)&&(e.type===`answer`&&Array.isArray(e.values)&&e.values.every(i)&&l(i)(e.text)||e.type===`cancelled`&&e.values===void 0&&e.text===void 0),O={language:{language:a},outputStyle:{styleId:a},preset:{presetId:a},permissionMode:{mode:a},sandbox:{enabled:o},removePermissionRule:{scope:a,kind:f([`allow`,`deny`,`ask`]),pattern:a},mcpServerEnabled:{serverId:a,enabled:o},reloadMcpServers:{},pluginEnabled:{pluginId:a,enabled:o},reloadPlugins:{},installPlugin:{pluginId:a},uninstallPlugin:{pluginId:a},providerProfile:{profileName:a},providerModel:{profileName:a,modelId:a},deleteProviderProfile:{profileName:a}},k=e=>{if(!r(e)||!i(e.field))return!1;let t=e.field;if(!Object.prototype.hasOwnProperty.call(O,t))return!1;let n=O[t];return Object.entries(n).every(([t,n])=>n(e[t]))},A={none:{},several:{message:i},stopped:{loopId:a,message:l(i)},failed:{loopId:l(a),message:i}},j=e=>{if(!r(e)||!i(e.kind))return!1;let t=e.kind;if(!Object.prototype.hasOwnProperty.call(A,t))return!1;let n=A[t];return Object.entries(n).every(([t,n])=>n(e[t]))};function M(e){return t=>{if(!r(t)||!i(t.kind))return!1;let n=Object.prototype.hasOwnProperty.call(e,t.kind)?e[t.kind]:void 0;return n!==void 0&&Object.entries(n).every(([e,n])=>n(t[e]))}}const N=[`Added`,`Modified`,`Deleted`,`Renamed`,`Copied`,`Untracked`,`Conflicted`],P=e=>r(e)&&a(e.path)&&f(N)(e.status)&&l(a)(e.renamedFrom)&&l(s)(e.added)&&l(s)(e.removed),F=M({status:{branch:l(i),unborn:o,files:e=>Array.isArray(e)&&e.every(P),truncated:o},"not-a-repository":{},failed:{message:i}}),I=[`add`,`remove`,`context`,`hunk`],L=e=>r(e)&&f(I)(e.type)&&i(e.text)&&s(e.lineNumber),R=M({diff:{diffLines:e=>Array.isArray(e)&&e.every(L),truncated:o},"not-a-repository":{},"outside-workspace":{},failed:{message:i}}),z=M({memory:{content:i,path:a,truncated:o},unavailable:{message:i}}),B={submit:{prompt:a},command:{name:a,args:l(i),requestId:l(a)},abort:{},"cancel-queue":{},"get-messages":{},"get-history":{fromIndex:l(c)},"get-prompts":{},"get-context":{},"get-commands":{},"get-status":{},"list-models":{requestId:a},"get-agent-definitions":{requestId:a},"list-sessions":{requestId:a},"new-session":{requestId:l(a)},"switch-session":{sessionId:a,requestId:l(a)},"rename-session":{sessionId:a,name:a,requestId:a},"delete-session":{sessionId:a,requestId:a},"get-usage-report":{},"get-personal-usage-report":{requestId:a,period:f([`7d`,`30d`]),timezone:a},"get-stored-session-usage-report":{requestId:a,sessionId:a},"get-executing":{},"get-pending":{},"get-execution-workspace":{},"read-execution-detail":{requestId:a,entryId:a,cursor:l(T)},"stop-waiting-loop":{requestId:a},"project-status":{requestId:a},"project-diff":{requestId:a,path:a},"project-memory":{requestId:a},"get-background-tasks":{filter:l(S)},"get-background-task":{taskId:a},"get-background-job-groups":{},"get-background-job-group":{groupId:a},"wait-background-job-group":{groupId:a},"cancel-background-task":{taskId:a,reason:l(i)},"close-background-task":{taskId:a},"send-background-task":{taskId:a,input:C},"read-background-task-log":{taskId:a,cursor:l(w)},"permission-response":{id:a,result:E},"ask-response":{id:a,response:D},resume:{lastSeq:s},ack:{seq:s},"get-settings":{requestId:a},"update-settings":{requestId:a,patch:k}},V={driverId:l(i)},H={text_delta:{delta:i,...V},user_message:{content:i,...V},tool_start:{state:r,...V},tool_end:{state:r,...V},thinking:{isThinking:o,...V},complete:{result:r,...V},interrupted:{result:r,...V},error:{message:i,code:l(f([`auth`,`rate_limit`,`model_unavailable`,`network`,`provider`])),provider:l(i),retryAfterSeconds:l(s),model:l(i),...V},command_result:{name:i,message:i,success:o,requestId:l(i)},messages:{messages:u,display:l(u),...V},history:{startIndex:c,total:c,entries:h},context:{state:r},history_changed:{},turn_source:{source:f(Object.keys(p))},commands:{commands:u,skills:u},session_status:{status:r},model_list:{requestId:a,groups:u,currentProfile:l(i),currentModel:i},agent_definitions:{requestId:a,agents:_,current:a},sessions:{requestId:a,listing:r},sessions_error:{requestId:a,code:f([`not_available`,`list_failed`]),message:i},session_switched:{event:r},session_change_failed:{code:f(e),message:i,requestId:l(i)},session_renamed_in_list:{requestId:a,sessionId:i,name:i},session_rename_failed:{requestId:a,message:i},session_deleted:{requestId:a,sessionId:i},session_delete_failed:{requestId:a,code:f(t),message:i},usage_report:{report:r},personal_usage_report:{requestId:a,report:r},personal_usage_report_error:{requestId:a,code:f([`not_available`,`report_failed`]),message:i},stored_session_usage_report:{requestId:a,sessionId:a,report:r},stored_session_usage_report_error:{requestId:a,sessionId:a,code:f([`not_available`,`report_failed`]),message:i},executing:{executing:o},pending:{pending:e=>e===null||i(e),pendingCount:l(c)},execution_workspace_event:{snapshot:r},execution_detail:{requestId:a,page:r},execution_detail_error:{requestId:a,message:i},waiting_loop_stop:{requestId:a,outcome:j},project_status:{requestId:a,result:F},project_diff:{requestId:a,result:R},project_memory:{requestId:a,result:z},background_task_event:{event:r},background_job_group_event:{event:r},plan_event:{event:r},context_file_refreshed:{event:r},branch_event:{event:r},background_tasks:{tasks:u},background_task:{taskId:i,task:d},background_job_groups:{groups:u},background_job_group:{groupId:i,group:d},background_task_log:{taskId:i,page:r},permission_request:{event:r},ask_request:{event:r},prompt_resolved:{event:r},ui_intent:{event:r},session_renamed:{event:r},history_cleared:{},background_task_control_result:{action:f(x),taskId:i,success:o,message:l(i)},protocol_error:{message:i,requestId:l(i)},resume_gap:{},settings:{requestId:a,settings:r},settings_error:{requestId:a,code:f([`not_available`,`invalid`,`refused`,`update_failed`]),message:i}};function U(e,t,n){if(!r(e))return{ok:!1,reason:`message must be a JSON object`};let a=e.type;if(!i(a))return{ok:!1,reason:`message type must be a string`};let o=Object.prototype.hasOwnProperty.call(t,a)?t[a]:void 0;if(o===void 0)return{ok:!1,reason:`Unknown message type: ${a}`};for(let[t,r]of Object.entries(o))if(!r(e[t]))return{ok:!1,reason:n(t)};return{ok:!0,message:e}}function W(e){return U(e,B,e=>e===`prompt`?`prompt must be a non-empty string`:`${e} has an invalid shape`)}function G(e){return U(e,H,e=>`${e} has an invalid shape`)}function K(e,t){if(e.length>4194304)return{ok:!1,reason:`Frame too large`};let n;try{n=JSON.parse(e)}catch{return{ok:!1,reason:`Invalid JSON`}}return t(n)}const q=new Set([`get-messages`,`get-history`,`get-context`,`get-status`,`get-commands`,`list-models`,`get-executing`,`get-pending`,`get-execution-workspace`,`read-execution-detail`,`get-agent-definitions`,`get-usage-report`,`list-sessions`,`get-background-tasks`,`get-background-task`,`get-background-job-groups`,`get-background-job-group`,`wait-background-job-group`,`read-background-task-log`,`get-settings`,`project-status`,`project-diff`,`project-memory`]);function J(e){return q.has(e)}export{G as a,K as i,n,W as r,J as t};
2
- //# sourceMappingURL=observer-messages-CEeisRaF.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"observer-messages-CEeisRaF.js","names":[],"sources":["../../src/message-decoders.ts","../../src/observer-messages.ts"],"sourcesContent":["/**\n * Owner-side runtime decoders for the wire message unions (issue #2045 / TRANS-005 adjacent).\n *\n * `wire-messages.ts` owns the TypeScript unions; this file owns turning `JSON.parse` output into one\n * of them. Before it, the server did `JSON.parse(data) as TClientMessage` and each client did the\n * same for `TServerMessage`, so valid JSON with an invalid shape crossed the boundary wearing a\n * protocol type. Carriers now implement `raw string → owner decoder → typed message` and answer a\n * refusal with the protocol's own `protocol_error` (server side) or client error (client side).\n *\n * `decodeClientMessage` is TOTAL: every variant and every nested field it carries is validated.\n * `decodeServerMessage` validates every variant's discriminator and declared top-level fields; a\n * payload OWNED BY ANOTHER PACKAGE (`IToolState`, `IExecutionResult`, background events, …) is\n * checked as a non-array record (or array of records) here — its own total decoding belongs to its\n * owner and is tracked there, not duplicated in a transport package.\n */\n\nimport {\n SESSION_CHANGE_REFUSAL_CODES,\n SESSION_DELETE_REFUSAL_CODES,\n} from '@robota-sdk/agent-interface-session';\n\nimport type { TBackgroundControlAction, TClientMessage, TServerMessage } from './wire-messages.js';\n\nexport type TMessageDecodeResult<TMessage> =\n | { readonly ok: true; readonly message: TMessage }\n | { readonly ok: false; readonly reason: string };\n\n/** Serialized frames larger than this are refused before any parse (a bounded inbound budget). */\nexport const MAX_INBOUND_FRAME_BYTES = 4 * 1024 * 1024;\n\ntype TRecord = Record<string, unknown>;\n\nfunction isRecord(value: unknown): value is TRecord {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\nconst isString = (v: unknown): v is string => typeof v === 'string';\nconst isNonEmptyString = (v: unknown): v is string => typeof v === 'string' && v.length > 0;\nconst isBoolean = (v: unknown): v is boolean => typeof v === 'boolean';\nconst isFiniteNumber = (v: unknown): v is number => typeof v === 'number' && Number.isFinite(v);\nconst isCount = (v: unknown): v is number => Number.isSafeInteger(v) && (v as number) >= 0;\nconst isOptional =\n (check: (v: unknown) => boolean) =>\n (v: unknown): boolean =>\n v === undefined || check(v);\nconst isRecordArray = (v: unknown): boolean => Array.isArray(v) && v.every(isRecord);\nconst isNullableRecord = (v: unknown): boolean => v === null || isRecord(v);\nconst oneOf =\n (members: readonly string[]) =>\n (v: unknown): boolean =>\n typeof v === 'string' && members.includes(v);\n/** A record, not an array, so a turn source added to the union without one here fails to compile. */\nconst TURN_SOURCES: Readonly<\n Record<Extract<TServerMessage, { type: 'turn_source' }>['source'], true>\n> = { user: true, 'agent-wakeup': true, peer: true, external: true };\n/** A history entry's envelope is this package's (`IWireHistoryEntry`); its `data` is the recorder's. */\nconst isWireHistoryEntry = (v: unknown): boolean =>\n isRecord(v) &&\n isString(v['id']) &&\n isString(v['timestamp']) &&\n isString(v['category']) &&\n isString(v['type']);\nconst isWireHistoryEntries = (v: unknown): boolean =>\n Array.isArray(v) && v.every(isWireHistoryEntry);\n/** #3282 §4: one row of `agent_definitions` — name, one-line description, plain-words location. */\nconst isWireAgentDefinition = (v: unknown): boolean =>\n isRecord(v) && isString(v['name']) && isString(v['description']) && isString(v['definedIn']);\nconst isWireAgentDefinitions = (v: unknown): boolean =>\n Array.isArray(v) && v.every(isWireAgentDefinition);\n\ntype TFieldCheck = (value: unknown) => boolean;\ntype TVariantShape = Readonly<Record<string, TFieldCheck>>;\n\nconst BACKGROUND_TASK_KINDS = ['agent', 'process', 'scheduled'] as const;\nconst BACKGROUND_TASK_MODES = ['foreground', 'background'] as const;\nconst BACKGROUND_TASK_STATUSES = [\n 'queued',\n 'running',\n 'waiting_permission',\n 'sleeping',\n 'paused',\n 'completed',\n 'failed',\n 'cancelled',\n] as const;\nconst BACKGROUND_CONTROL_ACTIONS: readonly TBackgroundControlAction[] = ['cancel', 'close', 'send'];\n\nconst isBackgroundTaskListFilter: TFieldCheck = (v) =>\n isRecord(v) &&\n isOptional(oneOf(BACKGROUND_TASK_KINDS))(v['kind']) &&\n isOptional(oneOf(BACKGROUND_TASK_STATUSES))(v['status']) &&\n isOptional(oneOf(BACKGROUND_TASK_MODES))(v['mode']) &&\n isOptional(isBoolean)(v['includeClosed']);\nconst isBackgroundTaskInput: TFieldCheck = (v) =>\n isRecord(v) && isOptional(isString)(v['prompt']) && isOptional(isString)(v['stdin']);\nconst isBackgroundTaskLogCursor: TFieldCheck = (v) => isRecord(v) && isFiniteNumber(v['offset']);\nconst isExecutionDetailCursor: TFieldCheck = (v) => isRecord(v) && isCount(v['offset']);\nconst isPermissionResultValue: TFieldCheck = (v) =>\n isBoolean(v) || v === 'allow-session' || v === 'allow-project';\nconst isActionResponse: TFieldCheck = (v) =>\n isRecord(v) &&\n ((v['type'] === 'answer' &&\n Array.isArray(v['values']) &&\n v['values'].every(isString) &&\n isOptional(isString)(v['text'])) ||\n (v['type'] === 'cancelled' && v['values'] === undefined && v['text'] === undefined));\n\ntype TSettingsPatch = Extract<TClientMessage, { type: 'update-settings' }>['patch'];\n/** Keyed by `field`, so a patch variant added to the union without a shape here fails to compile. */\nconst SETTINGS_PATCH_SHAPES: Readonly<Record<TSettingsPatch['field'], TVariantShape>> = {\n language: { language: isNonEmptyString },\n outputStyle: { styleId: isNonEmptyString },\n preset: { presetId: isNonEmptyString },\n permissionMode: { mode: isNonEmptyString },\n sandbox: { enabled: isBoolean },\n removePermissionRule: {\n scope: isNonEmptyString,\n kind: oneOf(['allow', 'deny', 'ask']),\n pattern: isNonEmptyString,\n },\n mcpServerEnabled: { serverId: isNonEmptyString, enabled: isBoolean },\n reloadMcpServers: {},\n pluginEnabled: { pluginId: isNonEmptyString, enabled: isBoolean },\n reloadPlugins: {},\n installPlugin: { pluginId: isNonEmptyString },\n uninstallPlugin: { pluginId: isNonEmptyString },\n // #3282 §4b: \"Providers & Models\" — Use, Model, Delete.\n providerProfile: { profileName: isNonEmptyString },\n providerModel: { profileName: isNonEmptyString, modelId: isNonEmptyString },\n deleteProviderProfile: { profileName: isNonEmptyString },\n};\nconst isSettingsPatch: TFieldCheck = (v) => {\n if (!isRecord(v) || !isString(v['field'])) return false;\n const field = v['field'];\n if (!Object.prototype.hasOwnProperty.call(SETTINGS_PATCH_SHAPES, field)) return false;\n const shape = SETTINGS_PATCH_SHAPES[field as TSettingsPatch['field']];\n return Object.entries(shape).every(([key, check]) => check(v[key]));\n};\n\ntype TWaitingLoopStopOutcome = Extract<TServerMessage, { type: 'waiting_loop_stop' }>['outcome'];\n/** Keyed by `kind`, so an outcome added to the union without a shape here fails to compile. */\nconst WAITING_LOOP_STOP_OUTCOME_SHAPES: Readonly<\n Record<TWaitingLoopStopOutcome['kind'], TVariantShape>\n> = {\n none: {},\n several: { message: isString },\n stopped: { loopId: isNonEmptyString, message: isOptional(isString) },\n failed: { loopId: isOptional(isNonEmptyString), message: isString },\n};\nconst isWaitingLoopStopOutcome: TFieldCheck = (v) => {\n if (!isRecord(v) || !isString(v['kind'])) return false;\n const kind = v['kind'];\n if (!Object.prototype.hasOwnProperty.call(WAITING_LOOP_STOP_OUTCOME_SHAPES, kind)) return false;\n const shape = WAITING_LOOP_STOP_OUTCOME_SHAPES[kind as TWaitingLoopStopOutcome['kind']];\n return Object.entries(shape).every(([field, check]) => check(v[field]));\n};\n\n/** Decode a `kind`-discriminated result union (the `TWaitingLoopStopOutcome` convention) from a shape\n * map keyed by `kind`. */\nfunction isKindDiscriminated(shapes: Readonly<Record<string, TVariantShape>>): TFieldCheck {\n return (v) => {\n if (!isRecord(v) || !isString(v['kind'])) return false;\n const shape = Object.prototype.hasOwnProperty.call(shapes, v['kind']) ? shapes[v['kind']] : undefined;\n if (shape === undefined) return false;\n return Object.entries(shape).every(([field, check]) => check(v[field]));\n };\n}\n\n// #3282 §4c: the Project panel's reads. Each result is the session method's own return value, crossing\n// the wire unchanged (the `TWaitingLoopStopOutcome` convention above) — decoded from a `kind`-keyed\n// shape map the same way.\nconst PROJECT_FILE_STATUSES = [\n 'Added',\n 'Modified',\n 'Deleted',\n 'Renamed',\n 'Copied',\n 'Untracked',\n 'Conflicted',\n] as const;\nconst isProjectStatusFile: TFieldCheck = (v) =>\n isRecord(v) &&\n isNonEmptyString(v['path']) &&\n oneOf(PROJECT_FILE_STATUSES)(v['status']) &&\n isOptional(isNonEmptyString)(v['renamedFrom']) &&\n isOptional(isFiniteNumber)(v['added']) &&\n isOptional(isFiniteNumber)(v['removed']);\nconst isProjectStatusFiles: TFieldCheck = (v) => Array.isArray(v) && v.every(isProjectStatusFile);\n\ntype TProjectStatusReadResult = Extract<TServerMessage, { type: 'project_status' }>['result'];\nconst PROJECT_STATUS_READ_SHAPES: Readonly<Record<TProjectStatusReadResult['kind'], TVariantShape>> = {\n status: {\n branch: isOptional(isString),\n unborn: isBoolean,\n files: isProjectStatusFiles,\n truncated: isBoolean,\n },\n 'not-a-repository': {},\n failed: { message: isString },\n};\nconst isProjectStatusRead = isKindDiscriminated(PROJECT_STATUS_READ_SHAPES);\n\nconst DIFF_LINE_TYPES = ['add', 'remove', 'context', 'hunk'] as const;\nconst isDiffLine: TFieldCheck = (v) =>\n isRecord(v) && oneOf(DIFF_LINE_TYPES)(v['type']) && isString(v['text']) && isFiniteNumber(v['lineNumber']);\nconst isDiffLines: TFieldCheck = (v) => Array.isArray(v) && v.every(isDiffLine);\n\ntype TProjectDiffReadResult = Extract<TServerMessage, { type: 'project_diff' }>['result'];\nconst PROJECT_DIFF_READ_SHAPES: Readonly<Record<TProjectDiffReadResult['kind'], TVariantShape>> = {\n diff: { diffLines: isDiffLines, truncated: isBoolean },\n 'not-a-repository': {},\n 'outside-workspace': {},\n failed: { message: isString },\n};\nconst isProjectDiffRead = isKindDiscriminated(PROJECT_DIFF_READ_SHAPES);\n\ntype TProjectMemoryReadResult = Extract<TServerMessage, { type: 'project_memory' }>['result'];\nconst PROJECT_MEMORY_READ_SHAPES: Readonly<Record<TProjectMemoryReadResult['kind'], TVariantShape>> = {\n memory: { content: isString, path: isNonEmptyString, truncated: isBoolean },\n unavailable: { message: isString },\n};\nconst isProjectMemoryRead = isKindDiscriminated(PROJECT_MEMORY_READ_SHAPES);\n\n/** One entry per `TClientMessage` variant — a variant added to the union without one fails the test. */\nexport const CLIENT_MESSAGE_SHAPES: Readonly<Record<TClientMessage['type'], TVariantShape>> = {\n submit: { prompt: isNonEmptyString },\n command: {\n name: isNonEmptyString,\n args: isOptional(isString),\n requestId: isOptional(isNonEmptyString),\n },\n abort: {},\n 'cancel-queue': {},\n 'get-messages': {},\n 'get-history': { fromIndex: isOptional(isCount) },\n 'get-prompts': {},\n 'get-context': {},\n 'get-commands': {},\n 'get-status': {},\n 'list-models': { requestId: isNonEmptyString },\n 'get-agent-definitions': { requestId: isNonEmptyString },\n 'list-sessions': { requestId: isNonEmptyString },\n 'new-session': { requestId: isOptional(isNonEmptyString) },\n 'switch-session': { sessionId: isNonEmptyString, requestId: isOptional(isNonEmptyString) },\n 'rename-session': {\n sessionId: isNonEmptyString,\n name: isNonEmptyString,\n requestId: isNonEmptyString,\n },\n 'delete-session': { sessionId: isNonEmptyString, requestId: isNonEmptyString },\n 'get-usage-report': {},\n 'get-personal-usage-report': {\n requestId: isNonEmptyString,\n period: oneOf(['7d', '30d']),\n timezone: isNonEmptyString,\n },\n 'get-stored-session-usage-report': {\n requestId: isNonEmptyString,\n sessionId: isNonEmptyString,\n },\n 'get-executing': {},\n 'get-pending': {},\n 'get-execution-workspace': {},\n 'read-execution-detail': {\n requestId: isNonEmptyString,\n entryId: isNonEmptyString,\n cursor: isOptional(isExecutionDetailCursor),\n },\n 'stop-waiting-loop': { requestId: isNonEmptyString },\n 'project-status': { requestId: isNonEmptyString },\n 'project-diff': { requestId: isNonEmptyString, path: isNonEmptyString },\n 'project-memory': { requestId: isNonEmptyString },\n 'get-background-tasks': { filter: isOptional(isBackgroundTaskListFilter) },\n 'get-background-task': { taskId: isNonEmptyString },\n 'get-background-job-groups': {},\n 'get-background-job-group': { groupId: isNonEmptyString },\n 'wait-background-job-group': { groupId: isNonEmptyString },\n 'cancel-background-task': { taskId: isNonEmptyString, reason: isOptional(isString) },\n 'close-background-task': { taskId: isNonEmptyString },\n 'send-background-task': { taskId: isNonEmptyString, input: isBackgroundTaskInput },\n 'read-background-task-log': {\n taskId: isNonEmptyString,\n cursor: isOptional(isBackgroundTaskLogCursor),\n },\n 'permission-response': { id: isNonEmptyString, result: isPermissionResultValue },\n 'ask-response': { id: isNonEmptyString, response: isActionResponse },\n resume: { lastSeq: isFiniteNumber },\n ack: { seq: isFiniteNumber },\n 'get-settings': { requestId: isNonEmptyString },\n 'update-settings': { requestId: isNonEmptyString, patch: isSettingsPatch },\n};\n\nconst authored: TVariantShape = { driverId: isOptional(isString) };\n\n/** One entry per `TServerMessage` variant. Foreign-owned payloads are checked as records (see header). */\nexport const SERVER_MESSAGE_SHAPES: Readonly<Record<TServerMessage['type'], TVariantShape>> = {\n text_delta: { delta: isString, ...authored },\n user_message: { content: isString, ...authored },\n tool_start: { state: isRecord, ...authored },\n tool_end: { state: isRecord, ...authored },\n thinking: { isThinking: isBoolean, ...authored },\n complete: { result: isRecord, ...authored },\n interrupted: { result: isRecord, ...authored },\n error: {\n message: isString,\n code: isOptional(oneOf(['auth', 'rate_limit', 'model_unavailable', 'network', 'provider'])),\n provider: isOptional(isString),\n retryAfterSeconds: isOptional(isFiniteNumber),\n model: isOptional(isString),\n ...authored,\n },\n command_result: {\n name: isString,\n message: isString,\n success: isBoolean,\n requestId: isOptional(isString),\n },\n messages: { messages: isRecordArray, display: isOptional(isRecordArray), ...authored },\n history: { startIndex: isCount, total: isCount, entries: isWireHistoryEntries },\n context: { state: isRecord },\n history_changed: {},\n turn_source: { source: oneOf(Object.keys(TURN_SOURCES)) },\n commands: { commands: isRecordArray, skills: isRecordArray },\n session_status: { status: isRecord },\n model_list: {\n requestId: isNonEmptyString,\n groups: isRecordArray,\n currentProfile: isOptional(isString),\n currentModel: isString,\n },\n agent_definitions: {\n requestId: isNonEmptyString,\n agents: isWireAgentDefinitions,\n current: isNonEmptyString,\n },\n sessions: { requestId: isNonEmptyString, listing: isRecord },\n sessions_error: {\n requestId: isNonEmptyString,\n code: oneOf(['not_available', 'list_failed']),\n message: isString,\n },\n session_switched: { event: isRecord },\n session_change_failed: {\n code: oneOf(SESSION_CHANGE_REFUSAL_CODES),\n message: isString,\n requestId: isOptional(isString),\n },\n session_renamed_in_list: { requestId: isNonEmptyString, sessionId: isString, name: isString },\n session_rename_failed: { requestId: isNonEmptyString, message: isString },\n session_deleted: { requestId: isNonEmptyString, sessionId: isString },\n session_delete_failed: {\n requestId: isNonEmptyString,\n code: oneOf(SESSION_DELETE_REFUSAL_CODES),\n message: isString,\n },\n usage_report: { report: isRecord },\n personal_usage_report: { requestId: isNonEmptyString, report: isRecord },\n personal_usage_report_error: {\n requestId: isNonEmptyString,\n code: oneOf(['not_available', 'report_failed']),\n message: isString,\n },\n stored_session_usage_report: {\n requestId: isNonEmptyString,\n sessionId: isNonEmptyString,\n report: isRecord,\n },\n stored_session_usage_report_error: {\n requestId: isNonEmptyString,\n sessionId: isNonEmptyString,\n code: oneOf(['not_available', 'report_failed']),\n message: isString,\n },\n executing: { executing: isBoolean },\n // An older host sends no count; a client then counts the one prompt it can see.\n pending: { pending: (v) => v === null || isString(v), pendingCount: isOptional(isCount) },\n execution_workspace_event: { snapshot: isRecord },\n execution_detail: { requestId: isNonEmptyString, page: isRecord },\n execution_detail_error: { requestId: isNonEmptyString, message: isString },\n waiting_loop_stop: { requestId: isNonEmptyString, outcome: isWaitingLoopStopOutcome },\n project_status: { requestId: isNonEmptyString, result: isProjectStatusRead },\n project_diff: { requestId: isNonEmptyString, result: isProjectDiffRead },\n project_memory: { requestId: isNonEmptyString, result: isProjectMemoryRead },\n background_task_event: { event: isRecord },\n background_job_group_event: { event: isRecord },\n plan_event: { event: isRecord },\n context_file_refreshed: { event: isRecord },\n branch_event: { event: isRecord },\n background_tasks: { tasks: isRecordArray },\n background_task: { taskId: isString, task: isNullableRecord },\n background_job_groups: { groups: isRecordArray },\n background_job_group: { groupId: isString, group: isNullableRecord },\n background_task_log: { taskId: isString, page: isRecord },\n permission_request: { event: isRecord },\n ask_request: { event: isRecord },\n prompt_resolved: { event: isRecord },\n ui_intent: { event: isRecord },\n session_renamed: { event: isRecord },\n history_cleared: {},\n background_task_control_result: {\n action: oneOf(BACKGROUND_CONTROL_ACTIONS),\n taskId: isString,\n success: isBoolean,\n message: isOptional(isString),\n },\n protocol_error: { message: isString, requestId: isOptional(isString) },\n resume_gap: {},\n settings: { requestId: isNonEmptyString, settings: isRecord },\n settings_error: {\n requestId: isNonEmptyString,\n code: oneOf(['not_available', 'invalid', 'refused', 'update_failed']),\n message: isString,\n },\n};\n\nfunction decodeVariant<TMessage extends { type: string }>(\n value: unknown,\n shapes: Readonly<Record<string, TVariantShape>>,\n reasonFor: (field: string) => string,\n): TMessageDecodeResult<TMessage> {\n if (!isRecord(value)) return { ok: false, reason: 'message must be a JSON object' };\n const type = value['type'];\n if (!isString(type)) return { ok: false, reason: 'message type must be a string' };\n const shape = Object.prototype.hasOwnProperty.call(shapes, type) ? shapes[type] : undefined;\n if (shape === undefined) return { ok: false, reason: `Unknown message type: ${type}` };\n for (const [field, check] of Object.entries(shape)) {\n if (!check(value[field])) return { ok: false, reason: reasonFor(field) };\n }\n return { ok: true, message: value as unknown as TMessage };\n}\n\n/** Total decode of a parsed client frame. */\nexport function decodeClientMessage(value: unknown): TMessageDecodeResult<TClientMessage> {\n return decodeVariant<TClientMessage>(value, CLIENT_MESSAGE_SHAPES, (field) =>\n field === 'prompt' ? 'prompt must be a non-empty string' : `${field} has an invalid shape`,\n );\n}\n\n/** Variant-level decode of a parsed server frame (foreign-owned payloads as records, see header). */\nexport function decodeServerMessage(value: unknown): TMessageDecodeResult<TServerMessage> {\n return decodeVariant<TServerMessage>(\n value,\n SERVER_MESSAGE_SHAPES,\n (field) => `${field} has an invalid shape`,\n );\n}\n\n/** `raw string → JSON → owner decoder`, the one path a carrier implements. */\nexport function decodeFrame<TMessage>(\n data: string,\n decode: (value: unknown) => TMessageDecodeResult<TMessage>,\n): TMessageDecodeResult<TMessage> {\n if (data.length > MAX_INBOUND_FRAME_BYTES) return { ok: false, reason: 'Frame too large' };\n let parsed: unknown;\n try {\n parsed = JSON.parse(data);\n // allow-fallback: the parse failure is returned as a typed refusal the carrier answers on the wire\n } catch {\n return { ok: false, reason: 'Invalid JSON' };\n }\n return decode(parsed);\n}\n","import type { TClientMessage } from './wire-messages.js';\n\n/**\n * The only inbound messages an observer may send: reads of this session. An allowlist, so a message\n * type added later is refused to observers until someone decides it is a read. `get-prompts` is left\n * out: an observer never receives prompts, open ones included.\n *\n * The host refuses anything else from an observer, and a client in observe mode sends only these, so\n * both sides read this one list.\n */\nexport const OBSERVER_MESSAGES: ReadonlySet<TClientMessage['type']> = new Set<\n TClientMessage['type']\n>([\n 'get-messages',\n 'get-history',\n 'get-context',\n 'get-status',\n 'get-commands',\n 'list-models',\n 'get-executing',\n 'get-pending',\n 'get-execution-workspace',\n 'read-execution-detail',\n 'get-agent-definitions',\n 'get-usage-report',\n 'list-sessions',\n 'get-background-tasks',\n 'get-background-task',\n 'get-background-job-groups',\n 'get-background-job-group',\n 'wait-background-job-group',\n 'read-background-task-log',\n // #3282 §4a: reading the Settings snapshot is a pure read of this session's own configuration.\n // `update-settings` stays out — an observer never writes.\n 'get-settings',\n // #3282 §4c: the Project panel's reads — git status, one file's diff, project memory. All three are\n // read-only (there is no \"restore\"/write counterpart in this feature — see the SPEC.md design\n // decision on why checkpoints/rewind are excluded entirely), so all three are observer-safe.\n 'project-status',\n 'project-diff',\n 'project-memory',\n]);\n\n/** Whether an observer may send a message of this type. */\nexport function isObserverMessageType(type: string): boolean {\n return (OBSERVER_MESSAGES as ReadonlySet<string>).has(type);\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"observer-messages-Dnff2Tdb.d.ts","names":[],"sources":["../../src/wire-messages.ts","../../src/message-decoders.ts","../../src/observer-messages.ts"],"mappings":"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"}