@robota-sdk/agent-transport 3.0.0-beta.82 → 3.0.0-beta.83
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.
- package/CHANGELOG.md +752 -0
- package/dist/browser/client.d.ts +2 -2
- package/dist/browser/client.js +1 -1
- package/dist/browser/index.d.ts +31 -11
- package/dist/browser/index.d.ts.map +1 -1
- package/dist/browser/index.js +1 -1
- package/dist/browser/index.js.map +1 -1
- package/dist/browser/observer-messages-Bx-xReUQ.js +2 -0
- package/dist/browser/observer-messages-Bx-xReUQ.js.map +1 -0
- package/dist/browser/{message-decoders-BB8n-H2X.d.ts → observer-messages-DC_8VHk9.d.ts} +104 -7
- package/dist/browser/observer-messages-DC_8VHk9.d.ts.map +1 -0
- package/dist/node/index.cjs +1 -1
- package/dist/node/index.d.cts +131 -14
- package/dist/node/index.d.cts.map +1 -1
- package/dist/node/index.d.ts +131 -14
- package/dist/node/index.d.ts.map +1 -1
- package/dist/node/index.js +1 -1
- package/dist/node/index.js.map +1 -1
- package/dist/node/node.cjs +1 -1
- package/dist/node/node.d.cts +69 -1
- package/dist/node/node.d.cts.map +1 -1
- package/dist/node/node.d.ts +70 -2
- package/dist/node/node.d.ts.map +1 -1
- package/dist/node/node.js +1 -1
- package/dist/node/node.js.map +1 -1
- package/package.json +13 -11
- package/src/__tests__/bearer-resource-gate.test.ts +120 -0
- package/src/__tests__/history-attached-budget.test.ts +216 -0
- package/src/__tests__/message-decoders.test.ts +201 -5
- package/src/__tests__/session-detail-loop-status.test.ts +169 -0
- package/src/__tests__/session-directory-messages.test.ts +192 -0
- package/src/__tests__/session-history-wire.test.ts +342 -0
- package/src/__tests__/session-message-handler-observe.test.ts +193 -0
- package/src/__tests__/session-message-handler.test.ts +82 -1
- package/src/__tests__/ws-broadcast-events.test.ts +10 -0
- package/src/client.ts +9 -1
- package/src/index.ts +14 -2
- package/src/loop-control-messages.ts +34 -0
- package/src/message-decoders.ts +82 -4
- package/src/node/bearer-resource-gate.ts +291 -0
- package/src/node/index.ts +13 -0
- package/src/observer-messages.ts +36 -0
- package/src/open-prompts.ts +76 -0
- package/src/outbound-delivery.ts +11 -2
- package/src/protocol-session.ts +7 -1
- package/src/session-directory-messages.ts +85 -0
- package/src/session-events.ts +93 -18
- package/src/session-message-handler.ts +53 -8
- package/src/session-query-messages.ts +105 -4
- package/src/wire-messages.ts +105 -7
- package/dist/browser/message-decoders-BB8n-H2X.d.ts.map +0 -1
- package/dist/browser/message-decoders-CDmDoZPR.js +0 -2
- package/dist/browser/message-decoders-CDmDoZPR.js.map +0 -1
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{SESSION_CHANGE_REFUSAL_CODES as e}from"@robota-sdk/agent-interface-session";const t=4*1024*1024;function n(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}const r=e=>typeof e==`string`,i=e=>typeof e==`string`&&e.length>0,a=e=>typeof e==`boolean`,o=e=>typeof e==`number`&&Number.isFinite(e),s=e=>Number.isSafeInteger(e)&&e>=0,c=e=>t=>t===void 0||e(t),l=e=>Array.isArray(e)&&e.every(n),u=e=>e===null||n(e),d=e=>t=>typeof t==`string`&&e.includes(t),f={user:!0,"agent-wakeup":!0,peer:!0,external:!0},p=e=>n(e)&&r(e.id)&&r(e.timestamp)&&r(e.category)&&r(e.type),m=e=>Array.isArray(e)&&e.every(p),h=[`agent`,`process`,`scheduled`],g=[`foreground`,`background`],_=[`queued`,`running`,`waiting_permission`,`sleeping`,`paused`,`completed`,`failed`,`cancelled`],v=[`cancel`,`close`,`send`],y=e=>n(e)&&c(d(h))(e.kind)&&c(d(_))(e.status)&&c(d(g))(e.mode)&&c(a)(e.includeClosed),b=e=>n(e)&&c(r)(e.prompt)&&c(r)(e.stdin),x=e=>n(e)&&o(e.offset),S=e=>n(e)&&s(e.offset),C=e=>a(e)||e===`allow-session`||e===`allow-project`,w=e=>n(e)&&(e.type===`answer`&&Array.isArray(e.values)&&e.values.every(r)&&c(r)(e.text)||e.type===`cancelled`&&e.values===void 0&&e.text===void 0),T={none:{},several:{message:r},stopped:{loopId:i,message:c(r)},failed:{loopId:c(i),message:r}},E=e=>{if(!n(e)||!r(e.kind))return!1;let t=e.kind;if(!Object.prototype.hasOwnProperty.call(T,t))return!1;let i=T[t];return Object.entries(i).every(([t,n])=>n(e[t]))},D={submit:{prompt:i},command:{name:i,args:c(r),requestId:c(i)},abort:{},"cancel-queue":{},"get-messages":{},"get-history":{fromIndex:c(s)},"get-prompts":{},"get-context":{},"get-commands":{},"get-status":{},"list-sessions":{requestId:i},"new-session":{requestId:c(i)},"switch-session":{sessionId:i,requestId:c(i)},"get-usage-report":{},"get-personal-usage-report":{requestId:i,period:d([`7d`,`30d`]),timezone:i},"get-stored-session-usage-report":{requestId:i,sessionId:i},"get-executing":{},"get-pending":{},"get-execution-workspace":{},"read-execution-detail":{requestId:i,entryId:i,cursor:c(S)},"stop-waiting-loop":{requestId:i},"get-background-tasks":{filter:c(y)},"get-background-task":{taskId:i},"get-background-job-groups":{},"get-background-job-group":{groupId:i},"wait-background-job-group":{groupId:i},"cancel-background-task":{taskId:i,reason:c(r)},"close-background-task":{taskId:i},"send-background-task":{taskId:i,input:b},"read-background-task-log":{taskId:i,cursor:c(x)},"permission-response":{id:i,result:C},"ask-response":{id:i,response:w},resume:{lastSeq:o},ack:{seq:o}},O={driverId:c(r)},k={text_delta:{delta:r,...O},user_message:{content:r,...O},tool_start:{state:n,...O},tool_end:{state:n,...O},thinking:{isThinking:a,...O},complete:{result:n,...O},interrupted:{result:n,...O},error:{message:r,...O},command_result:{name:r,message:r,success:a,requestId:c(r)},messages:{messages:l},history:{startIndex:s,total:s,entries:m},context:{state:n},history_changed:{},turn_source:{source:d(Object.keys(f))},commands:{commands:l,skills:l},session_status:{status:n},sessions:{requestId:i,listing:n},sessions_error:{requestId:i,code:d([`not_available`,`list_failed`]),message:r},session_switched:{event:n},session_change_failed:{code:d(e),message:r,requestId:c(r)},usage_report:{report:n},personal_usage_report:{requestId:i,report:n},personal_usage_report_error:{requestId:i,code:d([`not_available`,`report_failed`]),message:r},stored_session_usage_report:{requestId:i,sessionId:i,report:n},stored_session_usage_report_error:{requestId:i,sessionId:i,code:d([`not_available`,`report_failed`]),message:r},executing:{executing:a},pending:{pending:e=>e===null||r(e),pendingCount:c(s)},execution_workspace_event:{snapshot:n},execution_detail:{requestId:i,page:n},execution_detail_error:{requestId:i,message:r},waiting_loop_stop:{requestId:i,outcome:E},background_task_event:{event:n},background_job_group_event:{event:n},plan_event:{event:n},context_file_refreshed:{event:n},branch_event:{event:n},background_tasks:{tasks:l},background_task:{taskId:r,task:u},background_job_groups:{groups:l},background_job_group:{groupId:r,group:u},background_task_log:{taskId:r,page:n},permission_request:{event:n},ask_request:{event:n},prompt_resolved:{event:n},ui_intent:{event:n},session_renamed:{event:n},history_cleared:{},background_task_control_result:{action:d(v),taskId:r,success:a,message:c(r)},protocol_error:{message:r,requestId:c(r)},resume_gap:{}};function A(e,t,i){if(!n(e))return{ok:!1,reason:`message must be a JSON object`};let a=e.type;if(!r(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,n]of Object.entries(o))if(!n(e[t]))return{ok:!1,reason:i(t)};return{ok:!0,message:e}}function j(e){return A(e,D,e=>e===`prompt`?`prompt must be a non-empty string`:`${e} has an invalid shape`)}function M(e){return A(e,k,e=>`${e} has an invalid shape`)}function N(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 P=new Set([`get-messages`,`get-history`,`get-context`,`get-status`,`get-commands`,`get-executing`,`get-pending`,`get-execution-workspace`,`read-execution-detail`,`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`]);function F(e){return P.has(e)}export{M as a,N as i,t as n,j as r,F as t};
|
|
2
|
+
//# sourceMappingURL=observer-messages-Bx-xReUQ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observer-messages-Bx-xReUQ.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 { SESSION_CHANGE_REFUSAL_CODES } 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\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 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/** 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-sessions': { requestId: isNonEmptyString },\n 'new-session': { requestId: isOptional(isNonEmptyString) },\n 'switch-session': { sessionId: isNonEmptyString, requestId: isOptional(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 '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};\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: { message: isString, ...authored },\n command_result: {\n name: isString,\n message: isString,\n success: isBoolean,\n requestId: isOptional(isString),\n },\n messages: { messages: isRecordArray },\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 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 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 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};\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 'get-executing',\n 'get-pending',\n 'get-execution-workspace',\n 'read-execution-detail',\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]);\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,10 +1,25 @@
|
|
|
1
|
+
import { IAskRequestEvent, IBranchEvent, IContextFileRefreshedEvent, IExecutionResult, IPermissionRequestEvent, IPlanApprovalEvent, IPromptResolvedEvent, ISessionConversationRead, ISessionListing, ISessionRenamedEvent, ISessionStatusSnapshot, ISessionSwitchedEvent, IToolState, IUiIntentEvent, TDriverId, TPermissionResultValue, TSessionChangeRefusalCode, TTurnSource, TWaitingLoopStopOutcome } from "@robota-sdk/agent-interface-session";
|
|
1
2
|
import { IPersonalUsageReport, IPersonalUsageRequest, IUsageBySourceReport } from "@robota-sdk/agent-interface-analytics";
|
|
2
|
-
import { ICommandResult } from "@robota-sdk/agent-interface-command";
|
|
3
|
-
import { IBackgroundJobGroupState, IBackgroundTaskInput, IBackgroundTaskListFilter, IBackgroundTaskLogCursor, IBackgroundTaskLogPage, IBackgroundTaskState, IExecutionWorkspaceSnapshot, TBackgroundJobGroupEvent, TBackgroundTaskEvent } from "@robota-sdk/agent-interface-execution";
|
|
4
|
-
import { IAskRequestEvent, IBranchEvent, IContextFileRefreshedEvent, IExecutionResult, IPermissionRequestEvent, IPlanApprovalEvent, IPromptResolvedEvent, ISessionConversationRead, ISessionRenamedEvent, IToolState, IUiIntentEvent, TDriverId, TPermissionResultValue } from "@robota-sdk/agent-interface-session";
|
|
3
|
+
import { ICommandListEntry, ICommandResult, ICommandSkillListEntry } from "@robota-sdk/agent-interface-command";
|
|
4
|
+
import { IBackgroundJobGroupState, IBackgroundTaskInput, IBackgroundTaskListFilter, IBackgroundTaskLogCursor, IBackgroundTaskLogPage, IBackgroundTaskState, IExecutionDetailCursor, IExecutionDetailPage, IExecutionWorkspaceSnapshot, TBackgroundJobGroupEvent, TBackgroundTaskEvent } from "@robota-sdk/agent-interface-execution";
|
|
5
5
|
import { TActionResponse } from "@robota-sdk/agent-interface-transport";
|
|
6
6
|
//#region src/wire-messages.d.ts
|
|
7
7
|
type TBackgroundControlAction = 'cancel' | 'close' | 'send';
|
|
8
|
+
type THistoryEntry = ReturnType<ISessionConversationRead['getFullHistory']>[number];
|
|
9
|
+
/**
|
|
10
|
+
* #3189: one entry of the session's full history as it crosses the wire. The same record the session
|
|
11
|
+
* keeps, except that `timestamp` is an ISO 8601 string: a `Date` does not survive JSON, and a
|
|
12
|
+
* declared `Date` that arrives as a string would let a client call `Date` methods on a string.
|
|
13
|
+
*/
|
|
14
|
+
interface IWireHistoryEntry extends Omit<THistoryEntry, 'timestamp'> {
|
|
15
|
+
/** ISO 8601. */
|
|
16
|
+
timestamp: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* #3189: a turn's result as it crosses the wire. The session's whole history stays behind: it only
|
|
20
|
+
* grows, so a client reads it in bounded pages with `get-history` instead.
|
|
21
|
+
*/
|
|
22
|
+
type TWireExecutionResult = Omit<IExecutionResult, 'history'>;
|
|
8
23
|
/** Inbound message from client to server. */
|
|
9
24
|
type TClientMessage = {
|
|
10
25
|
type: 'submit';
|
|
@@ -13,14 +28,34 @@ type TClientMessage = {
|
|
|
13
28
|
type: 'command';
|
|
14
29
|
name: string;
|
|
15
30
|
args?: string;
|
|
31
|
+
requestId?: string;
|
|
16
32
|
} | {
|
|
17
33
|
type: 'abort';
|
|
18
34
|
} | {
|
|
19
35
|
type: 'cancel-queue';
|
|
20
36
|
} | {
|
|
21
37
|
type: 'get-messages';
|
|
38
|
+
} | {
|
|
39
|
+
type: 'get-history';
|
|
40
|
+
fromIndex?: number;
|
|
41
|
+
} | {
|
|
42
|
+
type: 'get-prompts';
|
|
22
43
|
} | {
|
|
23
44
|
type: 'get-context';
|
|
45
|
+
} | {
|
|
46
|
+
type: 'get-commands';
|
|
47
|
+
} | {
|
|
48
|
+
type: 'get-status';
|
|
49
|
+
} | {
|
|
50
|
+
type: 'list-sessions';
|
|
51
|
+
requestId: string;
|
|
52
|
+
} | {
|
|
53
|
+
type: 'new-session';
|
|
54
|
+
requestId?: string;
|
|
55
|
+
} | {
|
|
56
|
+
type: 'switch-session';
|
|
57
|
+
sessionId: string;
|
|
58
|
+
requestId?: string;
|
|
24
59
|
} | {
|
|
25
60
|
type: 'get-usage-report';
|
|
26
61
|
} | {
|
|
@@ -38,6 +73,14 @@ type TClientMessage = {
|
|
|
38
73
|
type: 'get-pending';
|
|
39
74
|
} | {
|
|
40
75
|
type: 'get-execution-workspace';
|
|
76
|
+
} | {
|
|
77
|
+
type: 'read-execution-detail';
|
|
78
|
+
requestId: string;
|
|
79
|
+
entryId: string;
|
|
80
|
+
cursor?: IExecutionDetailCursor;
|
|
81
|
+
} | {
|
|
82
|
+
type: 'stop-waiting-loop';
|
|
83
|
+
requestId: string;
|
|
41
84
|
} | {
|
|
42
85
|
type: 'get-background-tasks';
|
|
43
86
|
filter?: IBackgroundTaskListFilter;
|
|
@@ -105,11 +148,11 @@ type TServerMessage = {
|
|
|
105
148
|
driverId?: TDriverId;
|
|
106
149
|
} | {
|
|
107
150
|
type: 'complete';
|
|
108
|
-
result:
|
|
151
|
+
result: TWireExecutionResult;
|
|
109
152
|
driverId?: TDriverId;
|
|
110
153
|
} | {
|
|
111
154
|
type: 'interrupted';
|
|
112
|
-
result:
|
|
155
|
+
result: TWireExecutionResult;
|
|
113
156
|
driverId?: TDriverId;
|
|
114
157
|
} | {
|
|
115
158
|
type: 'error';
|
|
@@ -121,12 +164,48 @@ type TServerMessage = {
|
|
|
121
164
|
message: string;
|
|
122
165
|
success: boolean;
|
|
123
166
|
data?: ICommandResult['data'];
|
|
167
|
+
/** The `requestId` of the `command` this answers, when it carried one. */
|
|
168
|
+
requestId?: string;
|
|
124
169
|
} | {
|
|
125
170
|
type: 'messages';
|
|
126
171
|
messages: ReturnType<ISessionConversationRead['getMessages']>;
|
|
172
|
+
} | {
|
|
173
|
+
type: 'history';
|
|
174
|
+
startIndex: number;
|
|
175
|
+
total: number;
|
|
176
|
+
entries: IWireHistoryEntry[];
|
|
127
177
|
} | {
|
|
128
178
|
type: 'context';
|
|
129
179
|
state: ReturnType<ISessionConversationRead['getContextState']>;
|
|
180
|
+
} | {
|
|
181
|
+
type: 'history_changed';
|
|
182
|
+
} | {
|
|
183
|
+
type: 'turn_source';
|
|
184
|
+
source: TTurnSource;
|
|
185
|
+
} | {
|
|
186
|
+
type: 'commands';
|
|
187
|
+
commands: ICommandListEntry[];
|
|
188
|
+
skills: ICommandSkillListEntry[];
|
|
189
|
+
} | {
|
|
190
|
+
type: 'session_status';
|
|
191
|
+
status: ISessionStatusSnapshot;
|
|
192
|
+
} | {
|
|
193
|
+
type: 'sessions';
|
|
194
|
+
requestId: string;
|
|
195
|
+
listing: ISessionListing;
|
|
196
|
+
} | {
|
|
197
|
+
type: 'sessions_error';
|
|
198
|
+
requestId: string;
|
|
199
|
+
code: 'not_available' | 'list_failed';
|
|
200
|
+
message: string;
|
|
201
|
+
} | {
|
|
202
|
+
type: 'session_switched';
|
|
203
|
+
event: ISessionSwitchedEvent;
|
|
204
|
+
} | {
|
|
205
|
+
type: 'session_change_failed';
|
|
206
|
+
code: TSessionChangeRefusalCode;
|
|
207
|
+
message: string;
|
|
208
|
+
requestId?: string;
|
|
130
209
|
} | {
|
|
131
210
|
type: 'usage_report';
|
|
132
211
|
report: IUsageBySourceReport;
|
|
@@ -156,9 +235,22 @@ type TServerMessage = {
|
|
|
156
235
|
} | {
|
|
157
236
|
type: 'pending';
|
|
158
237
|
pending: string | null;
|
|
238
|
+
pendingCount?: number;
|
|
159
239
|
} | {
|
|
160
240
|
type: 'execution_workspace_event';
|
|
161
241
|
snapshot: IExecutionWorkspaceSnapshot;
|
|
242
|
+
} | {
|
|
243
|
+
type: 'execution_detail';
|
|
244
|
+
requestId: string;
|
|
245
|
+
page: IExecutionDetailPage;
|
|
246
|
+
} | {
|
|
247
|
+
type: 'execution_detail_error';
|
|
248
|
+
requestId: string;
|
|
249
|
+
message: string;
|
|
250
|
+
} | {
|
|
251
|
+
type: 'waiting_loop_stop';
|
|
252
|
+
requestId: string;
|
|
253
|
+
outcome: TWaitingLoopStopOutcome;
|
|
162
254
|
} | {
|
|
163
255
|
type: 'background_task_event';
|
|
164
256
|
event: TBackgroundTaskEvent;
|
|
@@ -218,6 +310,7 @@ type TServerMessage = {
|
|
|
218
310
|
} | {
|
|
219
311
|
type: 'protocol_error';
|
|
220
312
|
message: string;
|
|
313
|
+
requestId?: string;
|
|
221
314
|
} | {
|
|
222
315
|
type: 'resume_gap';
|
|
223
316
|
};
|
|
@@ -248,5 +341,9 @@ declare function decodeServerMessage(value: unknown): TMessageDecodeResult<TServ
|
|
|
248
341
|
/** `raw string → JSON → owner decoder`, the one path a carrier implements. */
|
|
249
342
|
declare function decodeFrame<TMessage>(data: string, decode: (value: unknown) => TMessageDecodeResult<TMessage>): TMessageDecodeResult<TMessage>;
|
|
250
343
|
//#endregion
|
|
251
|
-
|
|
252
|
-
|
|
344
|
+
//#region src/observer-messages.d.ts
|
|
345
|
+
/** Whether an observer may send a message of this type. */
|
|
346
|
+
declare function isObserverMessageType(type: string): boolean;
|
|
347
|
+
//#endregion
|
|
348
|
+
export { decodeFrame as a, TClientMessage as c, TWireExecutionResult as d, decodeClientMessage as i, TSeqServerMessage as l, MAX_INBOUND_FRAME_BYTES as n, decodeServerMessage as o, TMessageDecodeResult as r, IWireHistoryEntry as s, isObserverMessageType as t, TServerMessage as u };
|
|
349
|
+
//# sourceMappingURL=observer-messages-DC_8VHk9.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observer-messages-DC_8VHk9.d.ts","names":[],"sources":["../../src/wire-messages.ts","../../src/message-decoders.ts","../../src/observer-messages.ts"],"mappings":";;;;;;KAkDY;KAEP,gBAAgB,WAAW;;;;;;UAOf,0BAA0B,KAAK;;EAE9C;;;;;;KAOU,uBAAuB,KAAK;;KAG5B;EACN;EAAgB;;EAGhB;EAAiB;EAAc;EAAe;;EAC9C;;EACA;;EACA;;EAIA;EAAqB;;EAGrB;;EACA;;EAGA;;EACA;;EAGA;EAAuB;;EACvB;EAAqB;;EACrB;EAAwB;EAAmB;;EAE3C;;EAEA;EACA;EACA,QAAQ;EACR;;EAEA;EAAyC;EAAmB;;EAC5D;;EACA;;EACA;;EAIA;EACA;EACA;EACA,SAAS;;EAGT;EAA2B;;EAC3B;EAA8B,SAAS;;EACvC;EAA6B;;EAC7B;;EACA;EAAkC;;EAClC;EAAmC;;EACnC;EAAgC;EAAgB;;EAChD;EAA+B;;EAC/B;EAA8B;EAAgB,OAAO;;EACrD;EAAkC;EAAgB,SAAS;;EAE3D;EAA6B;EAAY,QAAQ;;EACjD;EAAsB;EAAY,UAAU;;EAG5C;EAAgB;;EAChB;EAAa;;;KAGP;EAIN;EAAoB;EAAe,WAAW;;EAC9C;EAAsB;EAAiB,WAAW;;EAClD;EAAoB,OAAO;EAAY,WAAW;;EAClD;EAAkB,OAAO;EAAY,WAAW;;EAChD;EAAkB;EAAqB,WAAW;;EAClD;EAAkB,QAAQ;EAAsB,WAAW;;EAC3D;EAAqB,QAAQ;EAAsB,WAAW;;EAC9D;EAAe;EAAiB,WAAW;;EAE3C;EACA;EACA;EACA;EACA,OAAO;;EAEP;;EAEA;EAAkB,UAAU,WAAW;;EAGvC;EAAiB;EAAoB;EAAe,SAAS;;EAE7D;EAAiB,OAAO,WAAW;;EAGnC;;EAEA;EAAqB,QAAQ;;EAC7B;EAAkB,UAAU;EAAqB,QAAQ;;EAEzD;EAAwB,QAAQ;;EAChC;EAAkB;EAAmB,SAAS;;EAE9C;EACA;EACA;EACA;;EAIA;EAA0B,OAAO;;EAGjC;EACA,MAAM;EACN;EACA;;EAKA;EAAsB,QAAQ;;EAC9B;EAA+B;EAAmB,QAAQ;;EAE1D;EACA;EACA;EACA;;EAGA;EACA;EACA;EACA,QAAQ;;EAGR;EACA;EACA;EACA;EACA;;EAEA;EAAmB;;EAGnB;EAAiB;EAAwB;;EACzC;EAAmC,UAAU;;EAC7C;EAA0B;EAAmB,MAAM;;EACnD;EAAgC;EAAmB;;EACnD;EAA2B;EAAmB,SAAS;;EACvD;EAA+B,OAAO;;EACtC;EAAoC,OAAO;;EAC3C;EAAoB,OAAO;;EAC3B;EAAgC,OAAO;;EACvC;EAAsB,OAAO;;EAC7B;EAA0B,OAAO;;EACjC;EAAyB;EAAgB,MAAM;;EAC/C;EAA+B,QAAQ;;EACvC;EAA8B;EAAiB,OAAO;;EACtD;EAA6B;EAAgB,MAAM;;EAGnD;EAA4B,OAAO;;EACnC;EAAqB,OAAO;;EAC5B;EAAyB,OAAO;;EAIhC;EAAmB,OAAO;;EAG1B;EAAyB,OAAO;;EAChC;;EAEA;EACA,QAAQ;EACR;EACA;EACA;;EAGA;EAAwB;EAAiB;;EAGzC;;;;;;;;KAQM,oBAAoB;EAAmB;;;;KClPvC,qBAAqB;WAClB;WAAmB,SAAS;;WAC5B;WAAoB;;;cAGtB;;iBA4PG,oBAAoB,iBAAiB,qBAAqB;;iBAO1D,oBAAoB,iBAAiB,qBAAqB;;iBAS1D,YAAY,UAC1B,cACA,SAAS,mBAAmB,qBAAqB,YAChD,qBAAqB;;;;iBCvQR,sBAAsB"}
|
package/dist/node/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});function e(e,t,o){if(o.type===`get-background-tasks`){t({type:`background_tasks`,tasks:e.listBackgroundTasks(o.filter)});return}if(o.type===`get-background-task`){n(e,t,o);return}if(o.type===`get-background-job-groups`){t({type:`background_job_groups`,groups:e.listBackgroundJobGroups()});return}if(o.type===`get-background-job-group`){i(e,t,o);return}if(o.type===`wait-background-job-group`){a(e,t,o);return}r(e,t,o)}function t(e,t,n){if(!n.taskId){t({type:`protocol_error`,message:`taskId is required`});return}if(n.type===`cancel-background-task`){s(t,`cancel`,n.taskId,e.cancelBackgroundTask(n.taskId,n.reason));return}if(n.type===`close-background-task`){s(t,`close`,n.taskId,e.closeBackgroundTask(n.taskId));return}o(e,t,n)}function n(e,t,n){if(!n.taskId){t({type:`protocol_error`,message:`taskId is required`});return}t({type:`background_task`,taskId:n.taskId,task:e.getBackgroundTask(n.taskId)??null})}function r(e,t,n){if(!n.taskId){t({type:`protocol_error`,message:`taskId is required`});return}e.readBackgroundTaskLog(n.taskId,n.cursor).then(e=>t({type:`background_task_log`,taskId:n.taskId,page:e}),e=>t({type:`protocol_error`,message:e.message}))}function i(e,t,n){if(!n.groupId){t({type:`protocol_error`,message:`groupId is required`});return}t({type:`background_job_group`,groupId:n.groupId,group:e.getBackgroundJobGroup(n.groupId)??null})}function a(e,t,n){if(!n.groupId){t({type:`protocol_error`,message:`groupId is required`});return}e.waitBackgroundJobGroup(n.groupId).then(e=>t({type:`background_job_group`,groupId:n.groupId,group:e}),e=>t({type:`protocol_error`,message:e.message}))}function o(e,t,n){if(!n.input){t({type:`protocol_error`,message:`input is required`});return}s(t,`send`,n.taskId,e.sendBackgroundTask(n.taskId,n.input))}function s(e,t,n,r){r.then(()=>e({type:`background_task_control_result`,action:t,taskId:n,success:!0}),r=>e({type:`background_task_control_result`,action:t,taskId:n,success:!1,message:r.message}))}function c(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}const l=e=>typeof e==`string`,u=e=>typeof e==`string`&&e.length>0,d=e=>typeof e==`boolean`,f=e=>typeof e==`number`&&Number.isFinite(e),p=e=>t=>t===void 0||e(t),m=e=>Array.isArray(e)&&e.every(c),h=e=>e===null||c(e),g=e=>t=>typeof t==`string`&&e.includes(t),_=[`agent`,`process`,`scheduled`],v=[`foreground`,`background`],y=[`queued`,`running`,`waiting_permission`,`sleeping`,`paused`,`completed`,`failed`,`cancelled`],b=[`cancel`,`close`,`send`],x={submit:{prompt:u},command:{name:u,args:p(l)},abort:{},"cancel-queue":{},"get-messages":{},"get-context":{},"get-usage-report":{},"get-personal-usage-report":{requestId:u,period:g([`7d`,`30d`]),timezone:u},"get-stored-session-usage-report":{requestId:u,sessionId:u},"get-executing":{},"get-pending":{},"get-execution-workspace":{},"get-background-tasks":{filter:p(e=>c(e)&&p(g(_))(e.kind)&&p(g(y))(e.status)&&p(g(v))(e.mode)&&p(d)(e.includeClosed))},"get-background-task":{taskId:u},"get-background-job-groups":{},"get-background-job-group":{groupId:u},"wait-background-job-group":{groupId:u},"cancel-background-task":{taskId:u,reason:p(l)},"close-background-task":{taskId:u},"send-background-task":{taskId:u,input:e=>c(e)&&p(l)(e.prompt)&&p(l)(e.stdin)},"read-background-task-log":{taskId:u,cursor:p(e=>c(e)&&f(e.offset))},"permission-response":{id:u,result:e=>d(e)||e===`allow-session`||e===`allow-project`},"ask-response":{id:u,response:e=>c(e)&&(e.type===`answer`&&Array.isArray(e.values)&&e.values.every(l)&&p(l)(e.text)||e.type===`cancelled`&&e.values===void 0&&e.text===void 0)},resume:{lastSeq:f},ack:{seq:f}},S={driverId:p(l)},C={text_delta:{delta:l,...S},user_message:{content:l,...S},tool_start:{state:c,...S},tool_end:{state:c,...S},thinking:{isThinking:d,...S},complete:{result:c,...S},interrupted:{result:c,...S},error:{message:l,...S},command_result:{name:l,message:l,success:d},messages:{messages:m},context:{state:c},usage_report:{report:c},personal_usage_report:{requestId:u,report:c},personal_usage_report_error:{requestId:u,code:g([`not_available`,`report_failed`]),message:l},stored_session_usage_report:{requestId:u,sessionId:u,report:c},stored_session_usage_report_error:{requestId:u,sessionId:u,code:g([`not_available`,`report_failed`]),message:l},executing:{executing:d},pending:{pending:e=>e===null||l(e)},execution_workspace_event:{snapshot:c},background_task_event:{event:c},background_job_group_event:{event:c},plan_event:{event:c},context_file_refreshed:{event:c},branch_event:{event:c},background_tasks:{tasks:m},background_task:{taskId:l,task:h},background_job_groups:{groups:m},background_job_group:{groupId:l,group:h},background_task_log:{taskId:l,page:c},permission_request:{event:c},ask_request:{event:c},prompt_resolved:{event:c},ui_intent:{event:c},session_renamed:{event:c},history_cleared:{},background_task_control_result:{action:g(b),taskId:l,success:d,message:p(l)},protocol_error:{message:l},resume_gap:{}};function w(e,t,n){if(!c(e))return{ok:!1,reason:`message must be a JSON object`};let r=e.type;if(!l(r))return{ok:!1,reason:`message type must be a string`};let i=Object.prototype.hasOwnProperty.call(t,r)?t[r]:void 0;if(i===void 0)return{ok:!1,reason:`Unknown message type: ${r}`};for(let[t,r]of Object.entries(i))if(!r(e[t]))return{ok:!1,reason:n(t)};return{ok:!0,message:e}}function T(e){return w(e,x,e=>e===`prompt`?`prompt must be a non-empty string`:`${e} has an invalid shape`)}function E(e){return w(e,C,e=>`${e} has an invalid shape`)}function D(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)}function ee(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function O(e){return typeof e==`string`&&e.length>0?e:void 0}function te(e){if(!(new TextEncoder().encode(e).byteLength>4194304))try{let t=JSON.parse(e);if(!ee(t))return;let n=O(t.requestId);if(!n)return;if(t.type===`get-personal-usage-report`)return{type:`personal`,requestId:n};let r=O(t.sessionId);return t.type===`get-stored-session-usage-report`&&r?{type:`stored-session`,requestId:n,sessionId:r}:void 0}catch{return}}function ne(e,t,n,r){return n.type===`get-personal-usage-report`?(ae(t,n,r.personalUsageReporter),!0):n.type===`get-stored-session-usage-report`?(ie(t,n,r.storedSessionUsageReporter),!0):n.type===`get-usage-report`?(re(e,t,r.usageReporter),!0):!1}function re(e,t,n){if(!n){t({type:`protocol_error`,message:`Per-session usage reporting is not available on this host.`});return}try{Promise.resolve(n(e)).then(e=>t({type:`usage_report`,report:e}),e=>t({type:`protocol_error`,message:j(e)}))}catch(e){t({type:`protocol_error`,message:j(e instanceof Error?e:String(e))})}}function ie(e,t,n){if(!n){k(e,t,`not_available`,`Stored-session usage reporting is not available on this host.`);return}try{Promise.resolve(n(t.sessionId)).then(n=>e({type:`stored_session_usage_report`,requestId:t.requestId,sessionId:t.sessionId,report:n}),n=>k(e,t,`report_failed`,j(n)))}catch(n){k(e,t,`report_failed`,j(n instanceof Error?n:String(n)))}}function k(e,t,n,r){e({type:`stored_session_usage_report_error`,requestId:t.requestId,sessionId:t.sessionId,code:n,message:r})}function ae(e,t,n){if(!n){A(e,t.requestId,`not_available`,`Personal usage reporting is not available on this host.`);return}try{Promise.resolve(n({period:t.period,timezone:t.timezone})).then(n=>e({type:`personal_usage_report`,requestId:t.requestId,report:n}),n=>A(e,t.requestId,`report_failed`,j(n)))}catch(n){A(e,t.requestId,`report_failed`,j(n instanceof Error?n:String(n)))}}function A(e,t,n,r){e({type:`personal_usage_report_error`,requestId:t,code:n,message:r})}function j(e){return e instanceof Error?e.message:String(e)}function M(e,t){let n=D(e,T);if(n.ok)return n.message;let r=te(e);return r?.type===`personal`?(t({type:`personal_usage_report_error`,requestId:r.requestId,code:`report_failed`,message:`Invalid personal usage report request.`}),null):r?.type===`stored-session`?(t({type:`stored_session_usage_report_error`,requestId:r.requestId,sessionId:r.sessionId,code:`report_failed`,message:`Invalid stored-session usage report request.`}),null):(t({type:`protocol_error`,message:n.reason}),null)}const oe={text_delta:`forwarded`,tool_start:`forwarded`,tool_end:`forwarded`,thinking:`forwarded`,complete:`forwarded`,error:`forwarded`,context_update:`non-surface`,compact:`non-surface`,interrupted:`forwarded`,skill_activation:`non-surface`,background_task_event:`forwarded`,background_job_group_event:`forwarded`,execution_workspace_event:`forwarded`,user_message:`forwarded`,turn_source:`non-surface`,context_file_refreshed:`forwarded`,memory_event:`non-surface`,goal_event:`non-surface`,plan_event:`forwarded`,branch_event:`forwarded`,permission_request:`forwarded`,ask_request:`forwarded`,prompt_resolved:`forwarded`,ui_intent:`requester-routed`,session_renamed:`forwarded`,history_cleared:`forwarded`};function N(e,t,n={}){let r=()=>{let t=e.getActiveDriverId();return t?{driverId:t}:{}},i=e=>t({type:`user_message`,content:e,...r()}),a=e=>t({type:`text_delta`,delta:e,...r()}),o=e=>t({type:`tool_start`,state:e,...r()}),s=e=>t({type:`tool_end`,state:e,...r()}),c=e=>t({type:`thinking`,isThinking:e,...r()}),l=e=>t({type:`complete`,result:e,...r()}),u=e=>t({type:`interrupted`,result:e,...r()}),d=e=>t({type:`error`,message:e.message,...r()}),f=e=>t({type:`background_task_event`,event:e}),p=e=>t({type:`background_job_group_event`,event:e}),m=e=>t({type:`execution_workspace_event`,snapshot:e.snapshot}),h=e=>t({type:`plan_event`,event:e}),g=e=>t({type:`context_file_refreshed`,event:e}),_=e=>t({type:`branch_event`,event:e}),v=e=>t({type:`permission_request`,event:e}),y=e=>t({type:`ask_request`,event:e}),b=e=>t({type:`prompt_resolved`,event:e}),x=e=>{(e.requesterDriverId===void 0||e.requesterDriverId===n.getSurfaceDriverId?.())&&t({type:`ui_intent`,event:e})},S=e=>t({type:`session_renamed`,event:e}),C=()=>t({type:`history_cleared`});return e.on(`user_message`,i),e.on(`text_delta`,a),e.on(`tool_start`,o),e.on(`tool_end`,s),e.on(`thinking`,c),e.on(`complete`,l),e.on(`interrupted`,u),e.on(`error`,d),e.on(`background_task_event`,f),e.on(`background_job_group_event`,p),e.on(`execution_workspace_event`,m),e.on(`plan_event`,h),e.on(`context_file_refreshed`,g),e.on(`branch_event`,_),e.on(`permission_request`,v),e.on(`ask_request`,y),e.on(`prompt_resolved`,b),e.on(`ui_intent`,x),e.on(`session_renamed`,S),e.on(`history_cleared`,C),()=>{e.off(`user_message`,i),e.off(`text_delta`,a),e.off(`tool_start`,o),e.off(`tool_end`,s),e.off(`thinking`,c),e.off(`complete`,l),e.off(`interrupted`,u),e.off(`error`,d),e.off(`background_task_event`,f),e.off(`background_job_group_event`,p),e.off(`execution_workspace_event`,m),e.off(`plan_event`,h),e.off(`context_file_refreshed`,g),e.off(`branch_event`,_),e.off(`permission_request`,v),e.off(`ask_request`,y),e.off(`prompt_resolved`,b),e.off(`ui_intent`,x),e.off(`session_renamed`,S),e.off(`history_cleared`,C)}}function se(e){return e.type===`get-messages`||e.type===`get-context`||e.type===`get-executing`||e.type===`get-pending`||e.type===`get-execution-workspace`}function ce(e,t,n){n.type===`get-messages`?t({type:`messages`,messages:e.getMessages()}):n.type===`get-context`?t({type:`context`,state:e.getContextState()}):n.type===`get-executing`?t({type:`executing`,executing:e.isExecuting()}):n.type===`get-execution-workspace`?t({type:`execution_workspace_event`,snapshot:e.getExecutionWorkspaceSnapshot()}):t({type:`pending`,pending:e.getPendingPrompt()})}function le(e){let t=N(e.session,e.deliver,{getSurfaceDriverId:()=>e.driverId});return{onMessage:ue(e.session,e.deliver,e.driverId,{personalUsageReporter:e.personalUsageReporter,usageReporter:e.usageReporter,storedSessionUsageReporter:e.storedSessionUsageReporter},e.surface),cleanup:t}}function ue(e,t,n,r=P,i){return a=>{let o=M(a,t);o&&F(e,t,o,n,r,i)}}const P={personalUsageReporter:void 0,usageReporter:void 0,storedSessionUsageReporter:void 0};function F(n,r,i,a,o=P,s){if(ne(n,r,i,o))return;if(de(i)){R(n,r,i,a,s);return}if(se(i)){ce(n,r,i);return}if(fe(i)){e(n,r,i);return}if(pe(i)){t(n,r,i);return}if(I(i)){L(n,i,a);return}let c=i.type;r({type:`protocol_error`,message:`Unknown message type: ${c}`})}function de(e){return e.type===`submit`||e.type===`command`||e.type===`abort`||e.type===`cancel-queue`}function fe(e){return e.type===`get-background-tasks`||e.type===`get-background-task`||e.type===`read-background-task-log`||e.type===`get-background-job-groups`||e.type===`get-background-job-group`||e.type===`wait-background-job-group`}function pe(e){return e.type===`cancel-background-task`||e.type===`close-background-task`||e.type===`send-background-task`}function I(e){return e.type===`permission-response`||e.type===`ask-response`}function L(e,t,n){t.type===`permission-response`?e.resolvePermission(t.id,t.result,n):e.resolveAsk(t.id,t.response,n)}function R(e,t,n,r,i){if(n.type===`submit`){if(typeof n.prompt!=`string`||n.prompt.length===0){t({type:`protocol_error`,message:`prompt must be a non-empty string`});return}let a={...r?{driverId:r}:{},...i?{surface:i}:{}};e.submit(n.prompt,void 0,void 0,Object.keys(a).length>0?a:void 0).catch(e=>{t({type:`protocol_error`,message:e.message})})}else if(n.type===`command`){if(!n.name){t({type:`protocol_error`,message:`name is required`});return}e.executeCommand(n.name,n.args??``,`remote`,r).then(e=>{t({type:`command_result`,name:n.name,message:e?.message??`Unknown command: ${n.name}`,success:e?.success??!1,data:e?.data})},e=>{t({type:`protocol_error`,message:e.message})})}else n.type===`abort`?e.abort():e.cancelQueue()}const z=8*1048576;function B(e,t=z){return e!==void 0&&e>t}const V=120*1e3;function H(e=V,t=Date.now){let n;return{maxPendingMs:e,observe(r){if(r===void 0)return;if(r===0){n=void 0;return}let i=t();n??=i;let a=i-n;return a>e?a:void 0}}}function U(e,t,n,r=z,i=H()){let a=!1,o=t=>{if(a)return;let o=n?.();if(B(o,r)){a=!0,s(Error(`outbound backpressure budget exceeded: ${o} byte(s) pending, limit ${r}. The peer has accepted frames it is not reading.`),t.type);return}let c=i.observe(o);if(c!==void 0){a=!0,s(Error(`outbound drain budget exceeded: ${o} byte(s) pending for ${c} ms, limit ${i.maxPendingMs} ms. The peer is reading too slowly to ever drain what it accepted.`),t.type);return}try{e(t)}catch(e){a=!0,s(e instanceof Error?e:Error(String(e)),t.type)}};function s(e,n){try{t(e,n)}catch{}}return Object.assign(o,{pendingBytes:()=>n?.()})}var W=class{frames=[];sizes=[];nextSeq=1;bytes=0;maxFrames;maxBytes;sizeOf;constructor(e={}){this.maxFrames=e.maxFrames??512,this.maxBytes=e.maxBytes??4194304,this.sizeOf=e.sizeOf??(e=>JSON.stringify(e).length)}append(e){let t=this.nextSeq;this.nextSeq+=1;let n=this.sizeOf(e);return this.frames.push({seq:t,message:e}),this.sizes.push(n),this.bytes+=n,this.evict(),t}ackThrough(e){let t=0;for(;t<this.frames.length&&this.frames[t].seq<=e;)t+=1;this.removeOldest(t)}tailAfter(e){return this.frames.length===0?e>=this.nextSeq-1?{kind:`tail`,frames:[]}:{kind:`overrun`}:e<this.frames[0].seq-1?{kind:`overrun`}:{kind:`tail`,frames:this.frames.filter(t=>t.seq>e)}}get lastSeq(){return this.nextSeq-1}get size(){return this.frames.length}evict(){let e=0,t=this.bytes;for(;this.frames.length-e>this.maxFrames||t>this.maxBytes&&this.frames.length-e>1;)t-=this.sizes[e],e+=1;this.removeOldest(e)}removeOldest(e){if(!(e<=0)){for(let t=0;t<e;t+=1)this.bytes-=this.sizes[t]??0;this.frames.splice(0,e),this.sizes.splice(0,e),this.frames.length===0&&(this.bytes=0)}}};const G=new TextEncoder,K=new TextDecoder,q=G.encode(`RBF`),J=4294967295;function Y(e,t){let n=G.encode(e);if(n.byteLength===0||n.byteLength>255)throw Error(`channel name must be 1..255 UTF-8 bytes (got ${n.byteLength})`);if(!Number.isInteger(t)||t<0||t>J)throw Error(`seq must be an integer in 0..${J} (got ${t})`);return n}function X(e,t,n,r){e.set(q,0),e[3]=1,e[4]=t,e[5]=n.byteLength,e.set(n,6);let i=6+n.byteLength;return new DataView(e.buffer,e.byteOffset,e.byteLength).setUint32(i,r,!1),i+4}function me(e){let t=Y(e.channel,e.seq),n=new Uint8Array(6+t.byteLength+4+e.payload.byteLength),r=X(n,1,t,e.seq);return n.set(e.payload,r),n}function he(e){let t=Y(e.channel,e.seq),n=G.encode(JSON.stringify({event:e.event,payload:e.payload})),r=new Uint8Array(6+t.byteLength+4+n.byteLength),i=X(r,2,t,e.seq);return r.set(n,i),r}function Z(e){return e.byteLength<q.length?!1:q.every((t,n)=>e[n]===t)}function Q(e){let t=K.decode(e),n;try{n=JSON.parse(t)}catch{return{ok:!1,error:`channel frame: malformed JSON body`}}if(typeof n!=`object`||!n||Array.isArray(n))return{ok:!1,error:`channel frame: event body must be a JSON object`};let{event:r,payload:i}=n;return typeof r!=`string`||r.length===0?{ok:!1,error:"channel frame: event body is missing a non-empty `event` name"}:{ok:!0,event:r,payload:i??null}}function ge(e){if(!Z(e))return{ok:!1,error:`channel frame: bad magic (not a channel frame)`};if(e.byteLength<6)return{ok:!1,error:`channel frame: truncated header`};if(e[3]!==1)return{ok:!1,error:`channel frame: unsupported version ${String(e[3])}`};let t=e[4],n=e[5]??0;if(n===0)return{ok:!1,error:`channel frame: empty channel name`};let r=6+n,i=r+4;if(e.byteLength<i)return{ok:!1,error:`channel frame: truncated (header longer than the frame)`};let a=K.decode(e.subarray(6,r)),o=new DataView(e.buffer,e.byteOffset,e.byteLength).getUint32(r,!1),s=e.subarray(i);if(t===1)return{ok:!0,frame:{kind:`binary`,channel:a,seq:o,payload:Uint8Array.from(s)}};if(t===2){let e=Q(s);return e.ok?{ok:!0,frame:{kind:`event`,channel:a,seq:o,event:e.event,payload:e.payload}}:{ok:!1,error:e.error}}return{ok:!1,error:`channel frame: unknown kind ${String(t)}`}}var _e=class{session;buffer;driverId;reporters;surface;unsubscribe;onDeliveryError;outbound;emitBoundary;disposed=!1;holding=!1;constructor(e){this.session=e.session,this.buffer=new W(e.buffer),this.driverId=e.driverId,this.surface=e.surface,this.reporters={personalUsageReporter:e.personalUsageReporter,usageReporter:e.usageReporter,storedSessionUsageReporter:e.storedSessionUsageReporter},this.emitBoundary=U(e=>this.emit(e),(e,t)=>this.reportDeliveryError(e,t)),this.unsubscribe=N(this.session,this.emitBoundary,{getSurfaceDriverId:()=>this.driverId})}attach(e,t){this.disposed||(this.onDeliveryError=t.onDeliveryError,this.outbound=U(t=>e(JSON.stringify(t)),(e,t)=>this.reportDeliveryError(e,t),t.pendingBytes),this.holding=t.awaitResume===!0)}detach(){this.outbound=void 0,this.onDeliveryError=void 0}setDriverId(e){this.driverId=e}onClientMessage(e){if(this.disposed)return;let t=M(e,this.emitBoundary);if(t){if(t.type===`resume`){this.replay(t.lastSeq);return}if(t.type===`ack`){this.buffer.ackThrough(t.seq);return}F(this.session,this.emitBoundary,t,this.driverId,this.reporters,this.surface)}}dispose(){this.disposed||(this.disposed=!0,this.detach(),this.unsubscribe())}get lastSeq(){return this.buffer.lastSeq}emit(e){if(this.disposed)return;let t=this.buffer.append(e);this.holding||this.deliverFrame({...e,seq:t})}replay(e){let t=this.buffer.tailAfter(e);if(t.kind===`overrun`){this.deliverFrame({type:`resume_gap`}),this.holding=!1;return}for(let e of t.frames)this.deliverFrame({...e.message,seq:e.seq});this.holding=!1}deliverFrame(e){this.outbound?.(e)}reportDeliveryError(e,t){let n=this.onDeliveryError;this.detach();try{n?.(e,t)}catch{}}};function ve(){return{origins:new Map}}function ye(e,t,n){let r=t.origin.sessionId,i=e.origins.get(r);i===void 0&&(i={highestSequence:0,delivered:new Set,issued:new Map},e.origins.set(r,i));let a=i.issued.get(t.id);if(a!==void 0)return{ack:{...a,state:`duplicate`},deliver:!1};if(n!==void 0){let e={id:t.id,sequence:t.sequence,state:n.state,reason:n.reason};return i.issued.set(t.id,e),{ack:e,deliver:!1}}if(i.delivered.has(t.sequence)){let e={id:t.id,sequence:t.sequence,state:`refused`,reason:`sequence ${t.sequence} was already delivered by this origin under a different message id. A retry must repeat its id; a new id on a delivered sequence cannot be ordered against what the receiver already has.`};return i.issued.set(t.id,e),{ack:e,deliver:!1}}let o=i.highestSequence+1,s=t.sequence>o?o:void 0,c={id:t.id,sequence:t.sequence,state:`delivered`};return i.issued.set(t.id,c),i.delivered.add(t.sequence),i.highestSequence=Math.max(i.highestSequence,t.sequence),s===void 0?{ack:c,deliver:!0}:{ack:c,deliver:!0,gapBefore:s}}function be(e,t,n){let r=e.origins.get(t),i=r?.issued.get(n);if(r===void 0||i===void 0||i.state!==`delivered`)return;let a={...i,state:`acknowledged`};return r.issued.set(n,a),a}function xe(e,t){e.origins.delete(t)}const $=16*1024;function Se(e,t,n=$){if(!Number.isInteger(n)||n<1)throw Error(`handoff chunking: maxChunkBytes must be a positive integer, got ${n}. A zero or negative budget produces an infinite sequence of empty chunks, which presents as a hang rather than as the configuration error it is.`);let r=Buffer.from(t,`utf8`),i=Math.max(1,Math.ceil(r.byteLength/n)),a=[];for(let t=0;t<i;t+=1){let o=r.subarray(t*n,(t+1)*n);a.push({handoffId:e,index:t,total:i,data:o.toString(`base64`)})}return a}var Ce=class{handoffId;chunks=new Map;declaredTotal;constructor(e){this.handoffId=e}get received(){return this.chunks.size}get expected(){return this.declaredTotal}accept(e){let t=e=>({outcome:`refused`,rejection:e,received:this.chunks.size,...this.declaredTotal===void 0?{}:{expected:this.declaredTotal}});if(e.handoffId!==this.handoffId)return t(`wrong-handoff`);if(!Number.isInteger(e.total)||e.total<1||this.declaredTotal!==void 0&&e.total!==this.declaredTotal)return t(`inconsistent-total`);if(!Number.isInteger(e.index)||e.index<0||e.index>=e.total)return t(`out-of-range`);let n=Buffer.from(e.data,`base64`);if(n.toString(`base64`)!==e.data)return t(`undecodable`);this.declaredTotal=e.total;let r=this.chunks.get(e.index);return r===void 0?(this.chunks.set(e.index,n),this.chunks.size<e.total?{outcome:`accepted`,received:this.chunks.size,expected:e.total}:{outcome:`complete`,serialized:this.reassemble(e.total),received:this.chunks.size,expected:e.total}):r.equals(n)?{outcome:`duplicate`,received:this.chunks.size,expected:e.total}:t(`inconsistent-total`)}missing(){if(this.declaredTotal===void 0)return[];let e=[];for(let t=0;t<this.declaredTotal;t+=1)this.chunks.has(t)||e.push(t);return e}discard(){this.chunks.clear(),this.declaredTotal=void 0}reassemble(e){let t=[];for(let n=0;n<e;n+=1){let r=this.chunks.get(n);if(r===void 0)throw Error(`handoff chunking: chunk ${n} of ${e} is missing at reassembly.`);t.push(r)}return Buffer.concat(t).toString(`utf8`)}};function we(e,t=$){return Math.max(1,Math.ceil(e.byteLength/t))}exports.CHANNEL_FRAME_MAGIC=q,exports.CHANNEL_FRAME_VERSION=1,exports.DEFAULT_MAX_CHUNK_BYTES=$,exports.DEFAULT_MAX_PENDING_BYTES=z,exports.DEFAULT_MAX_PENDING_MS=V,exports.HandoffChunkAssembler=Ce,exports.MAX_INBOUND_FRAME_BYTES=4194304,exports.PROTOCOL_SESSION_EVENT_CLASSIFICATION=oe,exports.ResumeBuffer=W,exports.SessionResumeBridge=_e,exports.acknowledgePeerMessage=be,exports.admitPeerMessage=ye,exports.chunkCountFor=we,exports.chunkHandoffPayload=Se,exports.createOutboundDelivery=U,exports.createPeerMessageLedger=ve,exports.createPendingStallClock=H,exports.createSessionMessageHandler=le,exports.decodeChannelFrame=ge,exports.decodeClientMessage=T,exports.decodeFrame=D,exports.decodeServerMessage=E,exports.encodeBinaryFrame=me,exports.encodeChannelEventFrame=he,exports.forgetPeerOrigin=xe,exports.isChannelFrame=Z,exports.isOverPendingBudget=B;
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require("@robota-sdk/agent-interface-session");function t(e,t,n){if(n.type===`get-background-tasks`){t({type:`background_tasks`,tasks:e.listBackgroundTasks(n.filter)});return}if(n.type===`get-background-task`){r(e,t,n);return}if(n.type===`get-background-job-groups`){t({type:`background_job_groups`,groups:e.listBackgroundJobGroups()});return}if(n.type===`get-background-job-group`){a(e,t,n);return}if(n.type===`wait-background-job-group`){o(e,t,n);return}i(e,t,n)}function n(e,t,n){if(!n.taskId){t({type:`protocol_error`,message:`taskId is required`});return}if(n.type===`cancel-background-task`){c(t,`cancel`,n.taskId,e.cancelBackgroundTask(n.taskId,n.reason));return}if(n.type===`close-background-task`){c(t,`close`,n.taskId,e.closeBackgroundTask(n.taskId));return}s(e,t,n)}function r(e,t,n){if(!n.taskId){t({type:`protocol_error`,message:`taskId is required`});return}t({type:`background_task`,taskId:n.taskId,task:e.getBackgroundTask(n.taskId)??null})}function i(e,t,n){if(!n.taskId){t({type:`protocol_error`,message:`taskId is required`});return}e.readBackgroundTaskLog(n.taskId,n.cursor).then(e=>t({type:`background_task_log`,taskId:n.taskId,page:e}),e=>t({type:`protocol_error`,message:e.message}))}function a(e,t,n){if(!n.groupId){t({type:`protocol_error`,message:`groupId is required`});return}t({type:`background_job_group`,groupId:n.groupId,group:e.getBackgroundJobGroup(n.groupId)??null})}function o(e,t,n){if(!n.groupId){t({type:`protocol_error`,message:`groupId is required`});return}e.waitBackgroundJobGroup(n.groupId).then(e=>t({type:`background_job_group`,groupId:n.groupId,group:e}),e=>t({type:`protocol_error`,message:e.message}))}function s(e,t,n){if(!n.input){t({type:`protocol_error`,message:`input is required`});return}c(t,`send`,n.taskId,e.sendBackgroundTask(n.taskId,n.input))}function c(e,t,n,r){r.then(()=>e({type:`background_task_control_result`,action:t,taskId:n,success:!0}),r=>e({type:`background_task_control_result`,action:t,taskId:n,success:!1,message:r.message}))}function l(e){return e.type===`stop-waiting-loop`}function u(e,t,n){let{requestId:r}=n;e.stopWaitingSelfPacedLoop().then(e=>t({type:`waiting_loop_stop`,requestId:r,outcome:e}),e=>t({type:`waiting_loop_stop`,requestId:r,outcome:{kind:`failed`,message:d(e)}}))}function d(e){return e instanceof Error?e.message:String(e)}function f(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}const p=e=>typeof e==`string`,m=e=>typeof e==`string`&&e.length>0,h=e=>typeof e==`boolean`,g=e=>typeof e==`number`&&Number.isFinite(e),_=e=>Number.isSafeInteger(e)&&e>=0,v=e=>t=>t===void 0||e(t),y=e=>Array.isArray(e)&&e.every(f),b=e=>e===null||f(e),x=e=>t=>typeof t==`string`&&e.includes(t),S={user:!0,"agent-wakeup":!0,peer:!0,external:!0},C=e=>f(e)&&p(e.id)&&p(e.timestamp)&&p(e.category)&&p(e.type),w=e=>Array.isArray(e)&&e.every(C),T=[`agent`,`process`,`scheduled`],E=[`foreground`,`background`],D=[`queued`,`running`,`waiting_permission`,`sleeping`,`paused`,`completed`,`failed`,`cancelled`],O=[`cancel`,`close`,`send`],k=e=>f(e)&&v(x(T))(e.kind)&&v(x(D))(e.status)&&v(x(E))(e.mode)&&v(h)(e.includeClosed),A=e=>f(e)&&v(p)(e.prompt)&&v(p)(e.stdin),ee=e=>f(e)&&g(e.offset),te=e=>f(e)&&_(e.offset),ne=e=>h(e)||e===`allow-session`||e===`allow-project`,re=e=>f(e)&&(e.type===`answer`&&Array.isArray(e.values)&&e.values.every(p)&&v(p)(e.text)||e.type===`cancelled`&&e.values===void 0&&e.text===void 0),j={none:{},several:{message:p},stopped:{loopId:m,message:v(p)},failed:{loopId:v(m),message:p}},ie=e=>{if(!f(e)||!p(e.kind))return!1;let t=e.kind;if(!Object.prototype.hasOwnProperty.call(j,t))return!1;let n=j[t];return Object.entries(n).every(([t,n])=>n(e[t]))},ae={submit:{prompt:m},command:{name:m,args:v(p),requestId:v(m)},abort:{},"cancel-queue":{},"get-messages":{},"get-history":{fromIndex:v(_)},"get-prompts":{},"get-context":{},"get-commands":{},"get-status":{},"list-sessions":{requestId:m},"new-session":{requestId:v(m)},"switch-session":{sessionId:m,requestId:v(m)},"get-usage-report":{},"get-personal-usage-report":{requestId:m,period:x([`7d`,`30d`]),timezone:m},"get-stored-session-usage-report":{requestId:m,sessionId:m},"get-executing":{},"get-pending":{},"get-execution-workspace":{},"read-execution-detail":{requestId:m,entryId:m,cursor:v(te)},"stop-waiting-loop":{requestId:m},"get-background-tasks":{filter:v(k)},"get-background-task":{taskId:m},"get-background-job-groups":{},"get-background-job-group":{groupId:m},"wait-background-job-group":{groupId:m},"cancel-background-task":{taskId:m,reason:v(p)},"close-background-task":{taskId:m},"send-background-task":{taskId:m,input:A},"read-background-task-log":{taskId:m,cursor:v(ee)},"permission-response":{id:m,result:ne},"ask-response":{id:m,response:re},resume:{lastSeq:g},ack:{seq:g}},M={driverId:v(p)},oe={text_delta:{delta:p,...M},user_message:{content:p,...M},tool_start:{state:f,...M},tool_end:{state:f,...M},thinking:{isThinking:h,...M},complete:{result:f,...M},interrupted:{result:f,...M},error:{message:p,...M},command_result:{name:p,message:p,success:h,requestId:v(p)},messages:{messages:y},history:{startIndex:_,total:_,entries:w},context:{state:f},history_changed:{},turn_source:{source:x(Object.keys(S))},commands:{commands:y,skills:y},session_status:{status:f},sessions:{requestId:m,listing:f},sessions_error:{requestId:m,code:x([`not_available`,`list_failed`]),message:p},session_switched:{event:f},session_change_failed:{code:x(e.SESSION_CHANGE_REFUSAL_CODES),message:p,requestId:v(p)},usage_report:{report:f},personal_usage_report:{requestId:m,report:f},personal_usage_report_error:{requestId:m,code:x([`not_available`,`report_failed`]),message:p},stored_session_usage_report:{requestId:m,sessionId:m,report:f},stored_session_usage_report_error:{requestId:m,sessionId:m,code:x([`not_available`,`report_failed`]),message:p},executing:{executing:h},pending:{pending:e=>e===null||p(e),pendingCount:v(_)},execution_workspace_event:{snapshot:f},execution_detail:{requestId:m,page:f},execution_detail_error:{requestId:m,message:p},waiting_loop_stop:{requestId:m,outcome:ie},background_task_event:{event:f},background_job_group_event:{event:f},plan_event:{event:f},context_file_refreshed:{event:f},branch_event:{event:f},background_tasks:{tasks:y},background_task:{taskId:p,task:b},background_job_groups:{groups:y},background_job_group:{groupId:p,group:b},background_task_log:{taskId:p,page:f},permission_request:{event:f},ask_request:{event:f},prompt_resolved:{event:f},ui_intent:{event:f},session_renamed:{event:f},history_cleared:{},background_task_control_result:{action:x(O),taskId:p,success:h,message:v(p)},protocol_error:{message:p,requestId:v(p)},resume_gap:{}};function se(e,t,n){if(!f(e))return{ok:!1,reason:`message must be a JSON object`};let r=e.type;if(!p(r))return{ok:!1,reason:`message type must be a string`};let i=Object.prototype.hasOwnProperty.call(t,r)?t[r]:void 0;if(i===void 0)return{ok:!1,reason:`Unknown message type: ${r}`};for(let[t,r]of Object.entries(i))if(!r(e[t]))return{ok:!1,reason:n(t)};return{ok:!0,message:e}}function ce(e){return se(e,ae,e=>e===`prompt`?`prompt must be a non-empty string`:`${e} has an invalid shape`)}function le(e){return se(e,oe,e=>`${e} has an invalid shape`)}function N(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)}function ue(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function P(e){return typeof e==`string`&&e.length>0?e:void 0}function de(e){if(!(new TextEncoder().encode(e).byteLength>4194304))try{let t=JSON.parse(e);if(!ue(t))return;let n=P(t.requestId);if(!n)return;if(t.type===`get-personal-usage-report`)return{type:`personal`,requestId:n};let r=P(t.sessionId);return t.type===`get-stored-session-usage-report`&&r?{type:`stored-session`,requestId:n,sessionId:r}:void 0}catch{return}}function fe(e,t,n,r){return n.type===`get-personal-usage-report`?(he(t,n,r.personalUsageReporter),!0):n.type===`get-stored-session-usage-report`?(me(t,n,r.storedSessionUsageReporter),!0):n.type===`get-usage-report`?(pe(e,t,r.usageReporter),!0):!1}function pe(e,t,n){if(!n){t({type:`protocol_error`,message:`Per-session usage reporting is not available on this host.`});return}try{Promise.resolve(n(e)).then(e=>t({type:`usage_report`,report:e}),e=>t({type:`protocol_error`,message:L(e)}))}catch(e){t({type:`protocol_error`,message:L(e instanceof Error?e:String(e))})}}function me(e,t,n){if(!n){F(e,t,`not_available`,`Stored-session usage reporting is not available on this host.`);return}try{Promise.resolve(n(t.sessionId)).then(n=>e({type:`stored_session_usage_report`,requestId:t.requestId,sessionId:t.sessionId,report:n}),n=>F(e,t,`report_failed`,L(n)))}catch(n){F(e,t,`report_failed`,L(n instanceof Error?n:String(n)))}}function F(e,t,n,r){e({type:`stored_session_usage_report_error`,requestId:t.requestId,sessionId:t.sessionId,code:n,message:r})}function he(e,t,n){if(!n){I(e,t.requestId,`not_available`,`Personal usage reporting is not available on this host.`);return}try{Promise.resolve(n({period:t.period,timezone:t.timezone})).then(n=>e({type:`personal_usage_report`,requestId:t.requestId,report:n}),n=>I(e,t.requestId,`report_failed`,L(n)))}catch(n){I(e,t.requestId,`report_failed`,L(n instanceof Error?n:String(n)))}}function I(e,t,n,r){e({type:`personal_usage_report_error`,requestId:t,code:n,message:r})}function L(e){return e instanceof Error?e.message:String(e)}function R(e,t){let n=N(e,ce);if(n.ok)return n.message;let r=de(e);return r?.type===`personal`?(t({type:`personal_usage_report_error`,requestId:r.requestId,code:`report_failed`,message:`Invalid personal usage report request.`}),null):r?.type===`stored-session`?(t({type:`stored_session_usage_report_error`,requestId:r.requestId,sessionId:r.sessionId,code:`report_failed`,message:`Invalid stored-session usage report request.`}),null):(t({type:`protocol_error`,message:n.reason}),null)}const ge=new Set([`get-messages`,`get-history`,`get-context`,`get-status`,`get-commands`,`get-executing`,`get-pending`,`get-execution-workspace`,`read-execution-detail`,`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`]);function z(e){return ge.has(e)}function _e(e){return e.type===`list-sessions`||e.type===`new-session`||e.type===`switch-session`}function ve(t,n,r){if(n.type===`list-sessions`){ye(t,n.requestId,r);return}let i=n.requestId===void 0?{}:{requestId:n.requestId};if(!r){t({type:`session_change_failed`,code:`not_available`,message:`Sessions cannot be switched on this host.`,...i});return}Promise.resolve().then(()=>n.type===`new-session`?r.newSession():r.switchSession(n.sessionId)).catch(n=>t({type:`session_change_failed`,code:(0,e.isSessionChangeRefusal)(n)?n.code:`failed`,message:B(n),...i}))}function ye(e,t,n){if(!n){e({type:`sessions_error`,requestId:t,code:`not_available`,message:`Session listing is not available on this host.`});return}try{e({type:`sessions`,requestId:t,listing:n.listSessions()})}catch(n){e({type:`sessions_error`,requestId:t,code:`list_failed`,message:B(n instanceof Error?n:String(n))})}}function B(e){return e instanceof Error?e.message:String(e)}const V=new WeakMap;function be(e){let t=V.get(e);t===void 0&&(t={frames:new Map,holders:0},V.set(e,t));let n=t;n.holders+=1;let r=!1;return{record:e=>{r||n.frames.set(e.event.id,e)},forget:e=>{n.frames.delete(e)},clear:()=>{n.frames.clear()},release:()=>{r||(r=!0,--n.holders,n.holders===0&&V.get(e)===n&&V.delete(e))}}}function xe(e){return[...V.get(e)?.frames.values()??[]]}const Se={text_delta:`forwarded`,tool_start:`forwarded`,tool_end:`forwarded`,thinking:`forwarded`,complete:`forwarded`,error:`forwarded`,context_update:`forwarded`,compact:`forwarded`,interrupted:`forwarded`,skill_activation:`forwarded`,background_task_event:`forwarded`,background_job_group_event:`forwarded`,execution_workspace_event:`forwarded`,user_message:`forwarded`,turn_source:`forwarded`,context_file_refreshed:`forwarded`,memory_event:`forwarded`,goal_event:`non-surface`,plan_event:`forwarded`,branch_event:`forwarded`,permission_request:`forwarded`,ask_request:`forwarded`,prompt_resolved:`forwarded`,ui_intent:`requester-routed`,session_renamed:`forwarded`,history_cleared:`forwarded`,session_switched:`forwarded`,status_changed:`forwarded`};function H(e,t,n={}){let r=()=>{let t=e.getActiveDriverId();return t?{driverId:t}:{}},i=e=>t({type:`user_message`,content:e,...r()}),a=e=>t({type:`text_delta`,delta:e,...r()}),o=e=>t({type:`tool_start`,state:e,...r()}),s=e=>t({type:`tool_end`,state:e,...r()}),c=e=>t({type:`thinking`,isThinking:e,...r()}),l=e=>t({type:`complete`,result:U(e),...r()}),u=e=>t({type:`interrupted`,result:U(e),...r()}),d=e=>t({type:`error`,message:e.message,...r()}),f=e=>t({type:`background_task_event`,event:e}),p=e=>t({type:`background_job_group_event`,event:e}),m=e=>t({type:`execution_workspace_event`,snapshot:e.snapshot}),h=e=>t({type:`plan_event`,event:e}),g=e=>t({type:`context_file_refreshed`,event:e}),_=e=>t({type:`branch_event`,event:e}),v=n.receivePrompts??!0,y=v?be(e):void 0,b=e=>{let n={type:`permission_request`,event:e};y?.record(n),t(n)},x=e=>{let n={type:`ask_request`,event:e};y?.record(n),t(n)},S=e=>{y?.forget(e.id),t({type:`prompt_resolved`,event:e})},C=e=>{(e.requesterDriverId===void 0||e.requesterDriverId===n.getSurfaceDriverId?.())&&t({type:`ui_intent`,event:e})},w=e=>t({type:`session_renamed`,event:e}),T=()=>t({type:`history_cleared`}),E=e=>{y?.clear(),t({type:`session_switched`,event:e})},D=e=>t({type:`context`,state:e}),O=()=>t({type:`history_changed`}),k=e=>t({type:`turn_source`,source:e}),A=e=>t({type:`session_status`,status:e});return e.on(`user_message`,i),e.on(`text_delta`,a),e.on(`tool_start`,o),e.on(`tool_end`,s),e.on(`thinking`,c),e.on(`complete`,l),e.on(`interrupted`,u),e.on(`error`,d),e.on(`background_task_event`,f),e.on(`background_job_group_event`,p),e.on(`execution_workspace_event`,m),e.on(`plan_event`,h),e.on(`context_file_refreshed`,g),e.on(`branch_event`,_),v&&(e.on(`permission_request`,b),e.on(`ask_request`,x)),e.on(`prompt_resolved`,S),e.on(`ui_intent`,C),e.on(`session_renamed`,w),e.on(`history_cleared`,T),e.on(`session_switched`,E),e.on(`context_update`,D),e.on(`compact`,O),e.on(`skill_activation`,O),e.on(`memory_event`,O),e.on(`turn_source`,k),e.on(`status_changed`,A),()=>{e.off(`user_message`,i),e.off(`text_delta`,a),e.off(`tool_start`,o),e.off(`tool_end`,s),e.off(`thinking`,c),e.off(`complete`,l),e.off(`interrupted`,u),e.off(`error`,d),e.off(`background_task_event`,f),e.off(`background_job_group_event`,p),e.off(`execution_workspace_event`,m),e.off(`plan_event`,h),e.off(`context_file_refreshed`,g),e.off(`branch_event`,_),v&&(e.off(`permission_request`,b),e.off(`ask_request`,x)),e.off(`prompt_resolved`,S),e.off(`ui_intent`,C),e.off(`session_renamed`,w),e.off(`history_cleared`,T),e.off(`session_switched`,E),e.off(`context_update`,D),e.off(`compact`,O),e.off(`skill_activation`,O),e.off(`memory_event`,O),e.off(`turn_source`,k),e.off(`status_changed`,A),y?.release()}}function U(e){let{history:t,...n}=e;return n}const Ce=new TextEncoder;function we(e){return e.type===`get-messages`||e.type===`get-history`||e.type===`get-prompts`||e.type===`get-context`||e.type===`get-commands`||e.type===`get-status`||e.type===`get-executing`||e.type===`get-pending`||e.type===`get-execution-workspace`||e.type===`read-execution-detail`}function Te(e,t,n){if(n.type===`get-messages`)t({type:`messages`,messages:e.getMessages()});else if(n.type===`get-history`)t(De(e,n.fromIndex??0));else if(n.type===`get-prompts`)for(let n of xe(e))t(n);else n.type===`get-context`?t({type:`context`,state:e.getContextState()}):n.type===`get-commands`?t({type:`commands`,commands:e.listCommands(),skills:e.listSkills()}):n.type===`get-status`?t({type:`session_status`,status:e.getStatusSnapshot()}):n.type===`get-executing`?t({type:`executing`,executing:e.isExecuting()}):n.type===`get-execution-workspace`?t({type:`execution_workspace_event`,snapshot:e.getExecutionWorkspaceSnapshot()}):n.type===`read-execution-detail`?Ee(e,t,n):t(W(e))}function Ee(e,t,n){let{requestId:r}=n;e.readExecutionWorkspaceDetail(n.entryId,n.cursor).then(e=>t({type:`execution_detail`,requestId:r,page:e}),e=>t({type:`execution_detail_error`,requestId:r,message:e instanceof Error?e.message:String(e)}))}function W(e){return{type:`pending`,pending:e.getPendingPrompt(),pendingCount:e.getPendingCount()}}function De(e,t){let n=e.getFullHistory(),r=n.length,i=Math.min(t,r),a=[],o=0;for(let e=i;e<r;e+=1){let t=Oe(n[e]),r=Ce.encode(JSON.stringify(t)).byteLength;if(a.length>0&&o+r>262144)break;a.push(t),o+=r}return{type:`history`,startIndex:i,total:r,entries:a}}function Oe(e){return{...e,timestamp:ke(e.timestamp)}}function ke(e){return typeof e==`string`?e:e.toISOString()}function Ae(e){let t=e.role??`drive`,n=H(e.session,e.deliver,{getSurfaceDriverId:()=>e.driverId,receivePrompts:t===`drive`});return{onMessage:je(e.session,e.deliver,e.driverId,{personalUsageReporter:e.personalUsageReporter,usageReporter:e.usageReporter,storedSessionUsageReporter:e.storedSessionUsageReporter},e.surface,t,e.sessionDirectory),cleanup:n}}function je(e,t,n,r=G,i,a=`drive`,o){return s=>{let c=R(s,t);if(c){if(a===`observe`&&!z(c.type)){t({type:`protocol_error`,message:`Not permitted for an observer: ${c.type}`});return}K(e,t,c,n,r,i,o)}}}const G={personalUsageReporter:void 0,usageReporter:void 0,storedSessionUsageReporter:void 0};function K(e,r,i,a,o=G,s,c){if(fe(e,r,i,o))return;if(_e(i)){ve(r,i,c);return}if(Me(i)){Le(e,r,i,a,s);return}if(l(i)){u(e,r,i);return}if(we(i)){Te(e,r,i);return}if(Ne(i)){t(e,r,i);return}if(Pe(i)){n(e,r,i);return}if(Fe(i)){Ie(e,i,a);return}let d=i.type;r({type:`protocol_error`,message:`Unknown message type: ${d}`})}function Me(e){return e.type===`submit`||e.type===`command`||e.type===`abort`||e.type===`cancel-queue`}function Ne(e){return e.type===`get-background-tasks`||e.type===`get-background-task`||e.type===`read-background-task-log`||e.type===`get-background-job-groups`||e.type===`get-background-job-group`||e.type===`wait-background-job-group`}function Pe(e){return e.type===`cancel-background-task`||e.type===`close-background-task`||e.type===`send-background-task`}function Fe(e){return e.type===`permission-response`||e.type===`ask-response`}function Ie(e,t,n){t.type===`permission-response`?e.resolvePermission(t.id,t.result,n):e.resolveAsk(t.id,t.response,n)}function Le(e,t,n,r,i){if(n.type===`submit`){if(typeof n.prompt!=`string`||n.prompt.length===0){t({type:`protocol_error`,message:`prompt must be a non-empty string`});return}let a={...r?{driverId:r}:{},...i?{surface:i}:{}};e.submit(n.prompt,void 0,void 0,Object.keys(a).length>0?a:void 0).then(()=>t(W(e)),e=>t({type:`protocol_error`,message:e.message}))}else if(n.type===`command`){let i=n.requestId===void 0?{}:{requestId:n.requestId};if(!n.name){t({type:`protocol_error`,message:`name is required`,...i});return}e.executeCommand(n.name,n.args??``,`remote`,r).then(e=>{t({type:`command_result`,name:n.name,message:e?.message??`Unknown command: ${n.name}`,success:e?.success??!1,data:e?.data,...i})},e=>{t({type:`protocol_error`,message:e.message,...i})})}else n.type===`abort`?e.abort():e.cancelQueue()}const q=8*1048576;function J(e,t=q){return e!==void 0&&e>t}const Re=120*1e3;function ze(e=Re,t=Date.now){let n;return{maxPendingMs:e,observe(r){if(r===void 0)return;if(r===0){n=void 0;return}let i=t();n??=i;let a=i-n;return a>e?a:void 0}}}function Y(e,t,n,r=q,i=ze()){let a=!1,o=t=>{if(a)return;let o=n?.();if(J(o,r)){a=!0,s(Error(`outbound backpressure budget exceeded: ${o} byte(s) pending, limit ${r}. The peer has accepted frames it is not reading.`),t.type);return}let c=i.observe(o);if(c!==void 0){a=!0,s(Error(`outbound drain budget exceeded: ${o} byte(s) pending for ${c} ms, limit ${i.maxPendingMs} ms. The peer is reading too slowly to ever drain what it accepted.`),t.type);return}try{e(t)}catch(e){a=!0,s(e instanceof Error?e:Error(String(e)),t.type)}};function s(e,n){try{t(e,n)}catch{}}return Object.assign(o,{pendingBytes:()=>n?.()})}var Be=class{frames=[];sizes=[];nextSeq=1;bytes=0;maxFrames;maxBytes;sizeOf;constructor(e={}){this.maxFrames=e.maxFrames??512,this.maxBytes=e.maxBytes??4194304,this.sizeOf=e.sizeOf??(e=>JSON.stringify(e).length)}append(e){let t=this.nextSeq;this.nextSeq+=1;let n=this.sizeOf(e);return this.frames.push({seq:t,message:e}),this.sizes.push(n),this.bytes+=n,this.evict(),t}ackThrough(e){let t=0;for(;t<this.frames.length&&this.frames[t].seq<=e;)t+=1;this.removeOldest(t)}tailAfter(e){return this.frames.length===0?e>=this.nextSeq-1?{kind:`tail`,frames:[]}:{kind:`overrun`}:e<this.frames[0].seq-1?{kind:`overrun`}:{kind:`tail`,frames:this.frames.filter(t=>t.seq>e)}}get lastSeq(){return this.nextSeq-1}get size(){return this.frames.length}evict(){let e=0,t=this.bytes;for(;this.frames.length-e>this.maxFrames||t>this.maxBytes&&this.frames.length-e>1;)t-=this.sizes[e],e+=1;this.removeOldest(e)}removeOldest(e){if(!(e<=0)){for(let t=0;t<e;t+=1)this.bytes-=this.sizes[t]??0;this.frames.splice(0,e),this.sizes.splice(0,e),this.frames.length===0&&(this.bytes=0)}}};const X=new TextEncoder,Ve=new TextDecoder,Z=X.encode(`RBF`),He=4294967295;function Q(e,t){let n=X.encode(e);if(n.byteLength===0||n.byteLength>255)throw Error(`channel name must be 1..255 UTF-8 bytes (got ${n.byteLength})`);if(!Number.isInteger(t)||t<0||t>He)throw Error(`seq must be an integer in 0..${He} (got ${t})`);return n}function Ue(e,t,n,r){e.set(Z,0),e[3]=1,e[4]=t,e[5]=n.byteLength,e.set(n,6);let i=6+n.byteLength;return new DataView(e.buffer,e.byteOffset,e.byteLength).setUint32(i,r,!1),i+4}function We(e){let t=Q(e.channel,e.seq),n=new Uint8Array(6+t.byteLength+4+e.payload.byteLength),r=Ue(n,1,t,e.seq);return n.set(e.payload,r),n}function Ge(e){let t=Q(e.channel,e.seq),n=X.encode(JSON.stringify({event:e.event,payload:e.payload})),r=new Uint8Array(6+t.byteLength+4+n.byteLength),i=Ue(r,2,t,e.seq);return r.set(n,i),r}function Ke(e){return e.byteLength<Z.length?!1:Z.every((t,n)=>e[n]===t)}function qe(e){let t=Ve.decode(e),n;try{n=JSON.parse(t)}catch{return{ok:!1,error:`channel frame: malformed JSON body`}}if(typeof n!=`object`||!n||Array.isArray(n))return{ok:!1,error:`channel frame: event body must be a JSON object`};let{event:r,payload:i}=n;return typeof r!=`string`||r.length===0?{ok:!1,error:"channel frame: event body is missing a non-empty `event` name"}:{ok:!0,event:r,payload:i??null}}function Je(e){if(!Ke(e))return{ok:!1,error:`channel frame: bad magic (not a channel frame)`};if(e.byteLength<6)return{ok:!1,error:`channel frame: truncated header`};if(e[3]!==1)return{ok:!1,error:`channel frame: unsupported version ${String(e[3])}`};let t=e[4],n=e[5]??0;if(n===0)return{ok:!1,error:`channel frame: empty channel name`};let r=6+n,i=r+4;if(e.byteLength<i)return{ok:!1,error:`channel frame: truncated (header longer than the frame)`};let a=Ve.decode(e.subarray(6,r)),o=new DataView(e.buffer,e.byteOffset,e.byteLength).getUint32(r,!1),s=e.subarray(i);if(t===1)return{ok:!0,frame:{kind:`binary`,channel:a,seq:o,payload:Uint8Array.from(s)}};if(t===2){let e=qe(s);return e.ok?{ok:!0,frame:{kind:`event`,channel:a,seq:o,event:e.event,payload:e.payload}}:{ok:!1,error:e.error}}return{ok:!1,error:`channel frame: unknown kind ${String(t)}`}}var Ye=class{session;buffer;driverId;reporters;surface;unsubscribe;onDeliveryError;outbound;emitBoundary;disposed=!1;holding=!1;constructor(e){this.session=e.session,this.buffer=new Be(e.buffer),this.driverId=e.driverId,this.surface=e.surface,this.reporters={personalUsageReporter:e.personalUsageReporter,usageReporter:e.usageReporter,storedSessionUsageReporter:e.storedSessionUsageReporter},this.emitBoundary=Y(e=>this.emit(e),(e,t)=>this.reportDeliveryError(e,t)),this.unsubscribe=H(this.session,this.emitBoundary,{getSurfaceDriverId:()=>this.driverId})}attach(e,t){this.disposed||(this.onDeliveryError=t.onDeliveryError,this.outbound=Y(t=>e(JSON.stringify(t)),(e,t)=>this.reportDeliveryError(e,t),t.pendingBytes),this.holding=t.awaitResume===!0)}detach(){this.outbound=void 0,this.onDeliveryError=void 0}setDriverId(e){this.driverId=e}onClientMessage(e){if(this.disposed)return;let t=R(e,this.emitBoundary);if(t){if(t.type===`resume`){this.replay(t.lastSeq);return}if(t.type===`ack`){this.buffer.ackThrough(t.seq);return}K(this.session,this.emitBoundary,t,this.driverId,this.reporters,this.surface)}}dispose(){this.disposed||(this.disposed=!0,this.detach(),this.unsubscribe())}get lastSeq(){return this.buffer.lastSeq}emit(e){if(this.disposed)return;let t=this.buffer.append(e);this.holding||this.deliverFrame({...e,seq:t})}replay(e){let t=this.buffer.tailAfter(e);if(t.kind===`overrun`){this.deliverFrame({type:`resume_gap`}),this.holding=!1;return}for(let e of t.frames)this.deliverFrame({...e.message,seq:e.seq});this.holding=!1}deliverFrame(e){this.outbound?.(e)}reportDeliveryError(e,t){let n=this.onDeliveryError;this.detach();try{n?.(e,t)}catch{}}};function Xe(){return{origins:new Map}}function Ze(e,t,n){let r=t.origin.sessionId,i=e.origins.get(r);i===void 0&&(i={highestSequence:0,delivered:new Set,issued:new Map},e.origins.set(r,i));let a=i.issued.get(t.id);if(a!==void 0)return{ack:{...a,state:`duplicate`},deliver:!1};if(n!==void 0){let e={id:t.id,sequence:t.sequence,state:n.state,reason:n.reason};return i.issued.set(t.id,e),{ack:e,deliver:!1}}if(i.delivered.has(t.sequence)){let e={id:t.id,sequence:t.sequence,state:`refused`,reason:`sequence ${t.sequence} was already delivered by this origin under a different message id. A retry must repeat its id; a new id on a delivered sequence cannot be ordered against what the receiver already has.`};return i.issued.set(t.id,e),{ack:e,deliver:!1}}let o=i.highestSequence+1,s=t.sequence>o?o:void 0,c={id:t.id,sequence:t.sequence,state:`delivered`};return i.issued.set(t.id,c),i.delivered.add(t.sequence),i.highestSequence=Math.max(i.highestSequence,t.sequence),s===void 0?{ack:c,deliver:!0}:{ack:c,deliver:!0,gapBefore:s}}function Qe(e,t,n){let r=e.origins.get(t),i=r?.issued.get(n);if(r===void 0||i===void 0||i.state!==`delivered`)return;let a={...i,state:`acknowledged`};return r.issued.set(n,a),a}function $e(e,t){e.origins.delete(t)}const $=16*1024;function et(e,t,n=$){if(!Number.isInteger(n)||n<1)throw Error(`handoff chunking: maxChunkBytes must be a positive integer, got ${n}. A zero or negative budget produces an infinite sequence of empty chunks, which presents as a hang rather than as the configuration error it is.`);let r=Buffer.from(t,`utf8`),i=Math.max(1,Math.ceil(r.byteLength/n)),a=[];for(let t=0;t<i;t+=1){let o=r.subarray(t*n,(t+1)*n);a.push({handoffId:e,index:t,total:i,data:o.toString(`base64`)})}return a}var tt=class{handoffId;chunks=new Map;declaredTotal;constructor(e){this.handoffId=e}get received(){return this.chunks.size}get expected(){return this.declaredTotal}accept(e){let t=e=>({outcome:`refused`,rejection:e,received:this.chunks.size,...this.declaredTotal===void 0?{}:{expected:this.declaredTotal}});if(e.handoffId!==this.handoffId)return t(`wrong-handoff`);if(!Number.isInteger(e.total)||e.total<1||this.declaredTotal!==void 0&&e.total!==this.declaredTotal)return t(`inconsistent-total`);if(!Number.isInteger(e.index)||e.index<0||e.index>=e.total)return t(`out-of-range`);let n=Buffer.from(e.data,`base64`);if(n.toString(`base64`)!==e.data)return t(`undecodable`);this.declaredTotal=e.total;let r=this.chunks.get(e.index);return r===void 0?(this.chunks.set(e.index,n),this.chunks.size<e.total?{outcome:`accepted`,received:this.chunks.size,expected:e.total}:{outcome:`complete`,serialized:this.reassemble(e.total),received:this.chunks.size,expected:e.total}):r.equals(n)?{outcome:`duplicate`,received:this.chunks.size,expected:e.total}:t(`inconsistent-total`)}missing(){if(this.declaredTotal===void 0)return[];let e=[];for(let t=0;t<this.declaredTotal;t+=1)this.chunks.has(t)||e.push(t);return e}discard(){this.chunks.clear(),this.declaredTotal=void 0}reassemble(e){let t=[];for(let n=0;n<e;n+=1){let r=this.chunks.get(n);if(r===void 0)throw Error(`handoff chunking: chunk ${n} of ${e} is missing at reassembly.`);t.push(r)}return Buffer.concat(t).toString(`utf8`)}};function nt(e,t=$){return Math.max(1,Math.ceil(e.byteLength/t))}exports.ATTACHED_SURFACE_MAX_PENDING_BYTES=1048576,exports.CHANNEL_FRAME_MAGIC=Z,exports.CHANNEL_FRAME_VERSION=1,exports.DEFAULT_MAX_CHUNK_BYTES=$,exports.DEFAULT_MAX_PENDING_BYTES=q,exports.DEFAULT_MAX_PENDING_MS=Re,exports.HandoffChunkAssembler=tt,exports.MAX_INBOUND_FRAME_BYTES=4194304,exports.PROTOCOL_SESSION_EVENT_CLASSIFICATION=Se,exports.ResumeBuffer=Be,exports.SessionResumeBridge=Ye,exports.acknowledgePeerMessage=Qe,exports.admitPeerMessage=Ze,exports.chunkCountFor=nt,exports.chunkHandoffPayload=et,exports.createOutboundDelivery=Y,exports.createPeerMessageLedger=Xe,exports.createPendingStallClock=ze,exports.createSessionMessageHandler=Ae,exports.decodeChannelFrame=Je,exports.decodeClientMessage=ce,exports.decodeFrame=N,exports.decodeServerMessage=le,exports.encodeBinaryFrame=We,exports.encodeChannelEventFrame=Ge,exports.forgetPeerOrigin=$e,exports.isChannelFrame=Ke,exports.isObserverMessageType=z,exports.isOverPendingBudget=J;
|