@botiverse/oar 0.0.11 → 0.1.1

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 (159) hide show
  1. package/README.md +2 -2
  2. package/dist/contracts/model-catalog.d.ts +1 -1
  3. package/dist/contracts/model-catalog.js +1 -1
  4. package/dist/contracts/provider-auth.d.ts +2 -2
  5. package/dist/contracts/provider-auth.js +2 -2
  6. package/dist/contracts/records.d.ts +214 -0
  7. package/dist/contracts/records.d.ts.map +1 -0
  8. package/dist/contracts/records.js +8 -0
  9. package/dist/contracts/records.js.map +1 -0
  10. package/dist/contracts/session.d.ts +93 -144
  11. package/dist/contracts/session.d.ts.map +1 -1
  12. package/dist/index.d.ts +6 -3
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +3 -1
  15. package/dist/index.js.map +1 -1
  16. package/dist/observe/agent-status.d.ts +32 -18
  17. package/dist/observe/agent-status.d.ts.map +1 -1
  18. package/dist/observe/agent-status.js +66 -14
  19. package/dist/observe/agent-status.js.map +1 -1
  20. package/dist/observe/aggregate-events.d.ts +7 -6
  21. package/dist/observe/aggregate-events.d.ts.map +1 -1
  22. package/dist/observe/aggregate-events.js +38 -28
  23. package/dist/observe/aggregate-events.js.map +1 -1
  24. package/dist/observe/index.d.ts +4 -1
  25. package/dist/observe/index.d.ts.map +1 -1
  26. package/dist/observe/index.js +3 -1
  27. package/dist/observe/index.js.map +1 -1
  28. package/dist/observe/observe-agent.d.ts +4 -4
  29. package/dist/observe/observe-agent.d.ts.map +1 -1
  30. package/dist/observe/observe-agent.js +3 -3
  31. package/dist/observe/observe-agent.js.map +1 -1
  32. package/dist/observe/stall-observer.d.ts +7 -6
  33. package/dist/observe/stall-observer.d.ts.map +1 -1
  34. package/dist/observe/stall-observer.js +6 -5
  35. package/dist/observe/stall-observer.js.map +1 -1
  36. package/dist/observe/tool-activity.d.ts +2 -2
  37. package/dist/observe/tool-activity.d.ts.map +1 -1
  38. package/dist/observe/tool-activity.js +1 -1
  39. package/dist/observe/tool-activity.js.map +1 -1
  40. package/dist/observe/turns.d.ts +37 -0
  41. package/dist/observe/turns.d.ts.map +1 -0
  42. package/dist/observe/turns.js +70 -0
  43. package/dist/observe/turns.js.map +1 -0
  44. package/dist/observe/usage.d.ts +15 -0
  45. package/dist/observe/usage.d.ts.map +1 -0
  46. package/dist/observe/usage.js +94 -0
  47. package/dist/observe/usage.js.map +1 -0
  48. package/dist/runtimes/claude/account-usage.js +1 -1
  49. package/dist/runtimes/claude/context-usage.d.ts +1 -1
  50. package/dist/runtimes/claude/context-usage.js +1 -1
  51. package/dist/runtimes/claude/projection.d.ts +40 -27
  52. package/dist/runtimes/claude/projection.d.ts.map +1 -1
  53. package/dist/runtimes/claude/projection.js +110 -23
  54. package/dist/runtimes/claude/projection.js.map +1 -1
  55. package/dist/runtimes/claude/session.d.ts.map +1 -1
  56. package/dist/runtimes/claude/session.js +120 -87
  57. package/dist/runtimes/claude/session.js.map +1 -1
  58. package/dist/runtimes/codex/app-server-client.d.ts +38 -3
  59. package/dist/runtimes/codex/app-server-client.d.ts.map +1 -1
  60. package/dist/runtimes/codex/app-server-client.js +62 -15
  61. package/dist/runtimes/codex/app-server-client.js.map +1 -1
  62. package/dist/runtimes/codex/projection.d.ts +12 -12
  63. package/dist/runtimes/codex/projection.d.ts.map +1 -1
  64. package/dist/runtimes/codex/projection.js +111 -40
  65. package/dist/runtimes/codex/projection.js.map +1 -1
  66. package/dist/runtimes/codex/rpc-control.d.ts +31 -0
  67. package/dist/runtimes/codex/rpc-control.d.ts.map +1 -0
  68. package/dist/runtimes/codex/rpc-control.js +51 -0
  69. package/dist/runtimes/codex/rpc-control.js.map +1 -0
  70. package/dist/runtimes/codex/session.d.ts.map +1 -1
  71. package/dist/runtimes/codex/session.js +199 -149
  72. package/dist/runtimes/codex/session.js.map +1 -1
  73. package/dist/runtimes/grok/session.d.ts +37 -1
  74. package/dist/runtimes/grok/session.d.ts.map +1 -1
  75. package/dist/runtimes/grok/session.js +74 -0
  76. package/dist/runtimes/grok/session.js.map +1 -1
  77. package/dist/runtimes/kimi/session.d.ts.map +1 -1
  78. package/dist/runtimes/kimi/session.js +5 -0
  79. package/dist/runtimes/kimi/session.js.map +1 -1
  80. package/dist/runtimes/pi/auth.d.ts.map +1 -1
  81. package/dist/runtimes/pi/auth.js +6 -1
  82. package/dist/runtimes/pi/auth.js.map +1 -1
  83. package/dist/runtimes/pi/catalog.d.ts.map +1 -1
  84. package/dist/runtimes/pi/catalog.js +6 -1
  85. package/dist/runtimes/pi/catalog.js.map +1 -1
  86. package/dist/runtimes/pi/http.d.ts +34 -0
  87. package/dist/runtimes/pi/http.d.ts.map +1 -0
  88. package/dist/runtimes/pi/http.js +95 -0
  89. package/dist/runtimes/pi/http.js.map +1 -0
  90. package/dist/runtimes/pi/list-models.d.ts.map +1 -1
  91. package/dist/runtimes/pi/list-models.js +10 -3
  92. package/dist/runtimes/pi/list-models.js.map +1 -1
  93. package/dist/runtimes/pi/open.d.ts +32 -0
  94. package/dist/runtimes/pi/open.d.ts.map +1 -0
  95. package/dist/runtimes/pi/open.js +106 -0
  96. package/dist/runtimes/pi/open.js.map +1 -0
  97. package/dist/runtimes/pi/projection.d.ts +27 -25
  98. package/dist/runtimes/pi/projection.d.ts.map +1 -1
  99. package/dist/runtimes/pi/projection.js +86 -50
  100. package/dist/runtimes/pi/projection.js.map +1 -1
  101. package/dist/runtimes/pi/session.d.ts +1 -22
  102. package/dist/runtimes/pi/session.d.ts.map +1 -1
  103. package/dist/runtimes/pi/session.js +179 -184
  104. package/dist/runtimes/pi/session.js.map +1 -1
  105. package/dist/shared/acp/client-app.d.ts +23 -0
  106. package/dist/shared/acp/client-app.d.ts.map +1 -0
  107. package/dist/shared/acp/client-app.js +55 -0
  108. package/dist/shared/acp/client-app.js.map +1 -0
  109. package/dist/shared/acp/model.d.ts +3 -17
  110. package/dist/shared/acp/model.d.ts.map +1 -1
  111. package/dist/shared/acp/model.js +3 -14
  112. package/dist/shared/acp/model.js.map +1 -1
  113. package/dist/shared/acp/profile.d.ts +32 -7
  114. package/dist/shared/acp/profile.d.ts.map +1 -1
  115. package/dist/shared/acp/profile.js +17 -8
  116. package/dist/shared/acp/profile.js.map +1 -1
  117. package/dist/shared/acp/projection.d.ts +16 -8
  118. package/dist/shared/acp/projection.d.ts.map +1 -1
  119. package/dist/shared/acp/projection.js +59 -32
  120. package/dist/shared/acp/projection.js.map +1 -1
  121. package/dist/shared/acp/records.d.ts +46 -0
  122. package/dist/shared/acp/records.d.ts.map +1 -0
  123. package/dist/shared/acp/records.js +125 -0
  124. package/dist/shared/acp/records.js.map +1 -0
  125. package/dist/shared/acp/session.d.ts.map +1 -1
  126. package/dist/shared/acp/session.js +98 -224
  127. package/dist/shared/acp/session.js.map +1 -1
  128. package/dist/shared/acp/terminal.d.ts +1 -3
  129. package/dist/shared/acp/terminal.d.ts.map +1 -1
  130. package/dist/shared/acp/terminal.js +1 -21
  131. package/dist/shared/acp/terminal.js.map +1 -1
  132. package/dist/shared/acp/turns.d.ts +45 -0
  133. package/dist/shared/acp/turns.d.ts.map +1 -0
  134. package/dist/shared/acp/turns.js +160 -0
  135. package/dist/shared/acp/turns.js.map +1 -0
  136. package/dist/shared/acp/usage-wait.d.ts +6 -6
  137. package/dist/shared/acp/usage-wait.d.ts.map +1 -1
  138. package/dist/shared/acp/usage-wait.js +2 -2
  139. package/dist/shared/acp/usage-wait.js.map +1 -1
  140. package/dist/shared/failure-class.d.ts +1 -1
  141. package/dist/shared/failure-class.js +2 -2
  142. package/dist/shared/failure-class.js.map +1 -1
  143. package/dist/shared/seal-session.d.ts +5 -3
  144. package/dist/shared/seal-session.d.ts.map +1 -1
  145. package/dist/shared/seal-session.js +24 -16
  146. package/dist/shared/seal-session.js.map +1 -1
  147. package/dist/shared/session-kernel.d.ts +68 -18
  148. package/dist/shared/session-kernel.d.ts.map +1 -1
  149. package/dist/shared/session-kernel.js +82 -42
  150. package/dist/shared/session-kernel.js.map +1 -1
  151. package/dist/voyage.d.ts +4 -7
  152. package/dist/voyage.d.ts.map +1 -1
  153. package/dist/voyage.js +14 -19
  154. package/dist/voyage.js.map +1 -1
  155. package/package.json +4 -3
  156. package/dist/runtimes/codex/context-usage.d.ts +0 -10
  157. package/dist/runtimes/codex/context-usage.d.ts.map +0 -1
  158. package/dist/runtimes/codex/context-usage.js +0 -16
  159. package/dist/runtimes/codex/context-usage.js.map +0 -1
@@ -2,16 +2,33 @@ import { randomUUID } from "node:crypto";
2
2
  import { asRecord } from "../../shared/json.js";
3
3
  import { sealSession } from "../../shared/seal-session.js";
4
4
  import { createSessionKernel } from "../../shared/session-kernel.js";
5
- import { classifyFailure } from "../../shared/failure-class.js";
6
5
  import { startAppServerClient } from "./app-server-client.js";
7
- import { codexContextUsageFromNotification } from "./context-usage.js";
8
- import { codexPrompted, foldCodexNotification, initialCodexProjection, } from "./projection.js";
6
+ import { foldCodexNotification, initialCodexProjection, } from "./projection.js";
7
+ import { openThread, rpcControl } from "./rpc-control.js";
8
+ /*
9
+ * codex app-server v2 mapping:
10
+ * - initialize → initialized, thread/start {cwd, approvalPolicy:never}
11
+ * - turn/start {threadId, input} → {turn{id}}: the RPC reply is the prompt's
12
+ * accepted response; completion is codex's own turn/completed notification
13
+ * (turn.status completed | interrupted | failed): the turn_ended view.
14
+ * - steer: turn/steer with the expectedTurnId precondition (race adjudicated
15
+ * at the runtime); a typed refusal is a rejected response.
16
+ * - abort: turn/interrupt {threadId, turnId}; the reply is the abort's
17
+ * accepted/rejected response, the outcome is turn/completed.
18
+ * - every notification is one event record (verbatim params); notifications
19
+ * of other threads are child-session records; collab items link them.
20
+ * - server-initiated requests are recorded as toApp requests, unanswered.
21
+ * - reachability (exited / disposed) is the kernel's, read off the stream;
22
+ * the adapter holds no liveness flag (record-stream.md, "Reachability").
23
+ * Live probe: codex-session-adapter.ts.
24
+ */
25
+ const text = (input) => [{ type: "text", text: input }];
9
26
  export const codexSession = async (installation, options) => {
10
27
  if (installation.via !== "executable") {
11
28
  throw new Error("The codex session adapter needs an executable installation");
12
29
  }
13
30
  // YOLO default (repo policy 2026-08-24): bypass the sandbox too, not just
14
- // approvals — OAR_CODEX_SANDBOX pins a stricter mode when a host wants one.
31
+ // approvals; OAR_CODEX_SANDBOX pins a stricter mode when a host wants one.
15
32
  // Injected as a launch -c override because that is the only seam that
16
33
  // governs codex's exec tool; thread/start.sandboxMode does NOT (pinned on a
17
34
  // real login). A host that wants the user's own config to win can set
@@ -34,186 +51,219 @@ export const codexSession = async (installation, options) => {
34
51
  ...(options.systemPrompt === undefined ? {} : { baseInstructions: options.systemPrompt }),
35
52
  ...(options.appendSystemPrompt === undefined ? {} : { developerInstructions: options.appendSystemPrompt }),
36
53
  };
37
- const started = options.resume === undefined
38
- ? await client.request("thread/start", {
39
- cwd: options.cwd,
40
- ...(options.model === undefined ? {} : { model: options.model }),
41
- approvalPolicy: "never",
42
- // Required in addition to initialize.experimentalApi. This exposes
43
- // the completed Responses API reasoning item, whose encrypted_content
44
- // lets us distinguish redaction from genuinely empty reasoning.
45
- experimentalRawEvents: true,
46
- ...instructionParams,
47
- })
48
- : await client.request("thread/resume", {
49
- threadId: options.resume,
50
- excludeTurns: true,
51
- cwd: options.cwd,
52
- // Same-runtime model switch = resume the same thread id with a new
53
- // model. thread/resume accepts `model` (codex rust-v0.153.4,
54
- // protocol/v2/thread.rs ThreadResumeParams) and applies it when the
55
- // thread is loaded cold, which is the normal case here because every
56
- // oar session owns its own app-server process.
57
- ...(options.model === undefined ? {} : { model: options.model }),
58
- approvalPolicy: "never",
59
- ...instructionParams,
60
- });
54
+ const openMethod = options.resume === undefined ? "thread/start" : "thread/resume";
55
+ // The open event is marked at the reply's wire position AS the reply line
56
+ // is read (onSettled → client.mark), not after this await: a frame codex
57
+ // wrote in the same chunk right after the reply (thread/started) would
58
+ // otherwise precede it. The mark runs when the handlers register below,
59
+ // once the kernel exists; a failed open registers none, so it never runs.
60
+ let recordOpen = null;
61
+ const markOpen = (outcome) => {
62
+ if (outcome.kind === "result") {
63
+ client.mark(() => recordOpen?.());
64
+ }
65
+ };
66
+ const started = await openThread(client, openMethod, async () => {
67
+ const reply = await (options.resume === undefined
68
+ ? client.request("thread/start", {
69
+ cwd: options.cwd,
70
+ ...(options.model === undefined ? {} : { model: options.model }),
71
+ approvalPolicy: "never",
72
+ // Required in addition to initialize.experimentalApi. This exposes
73
+ // the completed Responses API reasoning item, whose encrypted_content
74
+ // lets us distinguish redaction from genuinely empty reasoning.
75
+ experimentalRawEvents: true,
76
+ ...instructionParams,
77
+ }, markOpen)
78
+ : client.request("thread/resume", {
79
+ threadId: options.resume,
80
+ excludeTurns: true,
81
+ cwd: options.cwd,
82
+ // Same-runtime model switch = resume the same thread id with a new
83
+ // model. thread/resume accepts `model` (codex rust-v0.153.4,
84
+ // protocol/v2/thread.rs ThreadResumeParams) and applies it when the
85
+ // thread is loaded cold, which is the normal case here because every
86
+ // oar session owns its own app-server process.
87
+ ...(options.model === undefined ? {} : { model: options.model }),
88
+ approvalPolicy: "never",
89
+ ...instructionParams,
90
+ }, markOpen));
91
+ return reply;
92
+ });
61
93
  const threadId = asRecord(started.thread)?.id;
62
94
  if (typeof threadId !== "string") {
63
95
  client.kill();
64
96
  throw new TypeError("codex thread start/resume returned no thread id");
65
97
  }
66
- // Both responses report the model that is actually active; that value is
67
- // what Session.model() reads back. Still check it against the request:
68
- // codex's resume_running_thread ignores resume overrides for a thread that
69
- // is already loaded and busy, logging only a warn ("thread/resume overrides
70
- // ignored for loaded thread"), and the response then names the old model.
71
- // A caller who asked for a model must not get a session silently running
72
- // another, so the mismatch fails loudly here and the app-server we just
73
- // started must not outlive the failed session.
98
+ // Both responses report the model actually active (Session.model() reads
99
+ // it back as a model view on the open event). Still check it against the
100
+ // request: codex's resume_running_thread ignores overrides for a thread
101
+ // that is already loaded and busy (warn "thread/resume overrides ignored
102
+ // for loaded thread") and answers with the old model; a caller who asked
103
+ // for a model must not get one silently running another.
74
104
  const effectiveModel = typeof started.model === "string" ? started.model : null;
75
105
  if (options.model !== undefined && effectiveModel !== null && effectiveModel !== options.model) {
76
106
  client.kill();
77
- const verb = options.resume === undefined ? "thread/start" : "thread/resume";
78
- throw new Error(`codex ${verb} kept model ${effectiveModel} although ${options.model} was requested`);
107
+ throw new Error(`codex ${openMethod} kept model ${effectiveModel} although ${options.model} was requested`);
79
108
  }
80
109
  const kernel = createSessionKernel(threadId);
81
- let current = null;
82
- let disposed = false;
83
- let projection = initialCodexProjection;
84
- let latestContextUsage = null;
110
+ const state = {
111
+ active: null,
112
+ spontaneous: false,
113
+ codexTurnId: null,
114
+ projection: initialCodexProjection(threadId),
115
+ };
116
+ const busy = () => state.active !== null || state.spontaneous;
117
+ let disposeRequest = null;
118
+ recordOpen = () => {
119
+ kernel.event({
120
+ type: openMethod,
121
+ native: started,
122
+ views: effectiveModel === null ? [] : [{ kind: "model", model: effectiveModel }],
123
+ });
124
+ };
85
125
  // Drive the pure projection fold, applying its commands to the kernel; the
86
- // fold owns turn framing and event translation, this owns the transport-only
87
- // codexTurnId (steer/abort identity).
88
- client.onNotification((method, params) => {
89
- if (params.threadId !== threadId) {
90
- return;
91
- }
92
- if (method === "thread/tokenUsage/updated") {
93
- latestContextUsage = codexContextUsageFromNotification(params) ?? latestContextUsage;
126
+ // fold owns event translation, attribution and graph links; this owns the
127
+ // transport-only turn id and the control decisions (busy, spontaneous).
128
+ const onNotification = (method, params) => {
129
+ const isRoot = typeof params.threadId !== "string" || params.threadId === threadId;
130
+ if (isRoot && method === "turn/started") {
131
+ const startedTurn = asRecord(params.turn)?.id;
132
+ if (!busy()) {
133
+ // A turn we did not prompt (a drained queue submission): adopt it.
134
+ state.spontaneous = true;
135
+ }
136
+ if (typeof startedTurn === "string") {
137
+ state.codexTurnId = startedTurn;
138
+ }
94
139
  }
95
- const { state: nextProjection, commands } = foldCodexNotification(projection, method, params);
96
- projection = nextProjection;
140
+ const { state: nextProjection, commands } = foldCodexNotification(state.projection, method, params);
141
+ state.projection = nextProjection;
97
142
  for (const command of commands) {
98
143
  switch (command.kind) {
99
- case "begin": {
100
- // Spontaneous turn (a drained queue submission we did not prompt):
101
- // adopt it, taking the runtime turn id from the notification.
102
- const startedTurn = asRecord(params.turn)?.id;
103
- const kernelTurn = kernel.begin();
104
- if (kernelTurn !== null && typeof startedTurn === "string") {
105
- current = { kernelTurn, codexTurnId: Promise.resolve(startedTurn) };
144
+ case "event":
145
+ if (command.sessionId !== undefined) {
146
+ kernel.node(command.sessionId);
106
147
  }
148
+ kernel.event(command.body, {
149
+ ...(command.sessionId === undefined ? {} : { sessionId: command.sessionId }),
150
+ ...(command.spanId === undefined ? {} : { spanId: command.spanId }),
151
+ });
107
152
  break;
108
- }
109
- case "emit":
110
- current?.kernelTurn.emit(command.body);
111
- break;
112
- case "settle":
113
- current?.kernelTurn.settle(command.outcome);
114
- current = null;
153
+ case "link":
154
+ kernel.link(command.edge);
115
155
  break;
116
156
  default:
117
157
  break;
118
158
  }
119
159
  }
120
- });
121
- client.onExit(() => {
122
- if (!disposed) {
123
- kernel.active()?.settle({ kind: "failed", reason: "codex app-server exited", failure: "runtime_exited" });
160
+ if (isRoot && method === "turn/completed") {
161
+ state.active = null;
162
+ state.spontaneous = false;
163
+ state.codexTurnId = null;
124
164
  }
165
+ };
166
+ // Approvals, user input, dynamic tools: recorded verbatim, never answered
167
+ // (approvalPolicy never means none are expected; a dangling request is
168
+ // the honest record when one arrives anyway).
169
+ const onServerRequest = (id, method, params) => {
170
+ kernel.request("toApp", { kind: "native", type: method, native: params }, { id });
171
+ };
172
+ // Registering flushes everything held so far in wire order: the frames
173
+ // from before the thread existed, then the open event (the mark placed at
174
+ // the reply), then whatever codex wrote after the reply.
175
+ client.handle({ onNotification, onServerRequest });
176
+ client.onExit((code) => {
177
+ // The exit is an outcome only oar observes: it answers our dispose when
178
+ // we caused it, and stands alone when the app-server died on its own.
179
+ kernel.respond(disposeRequest?.id ?? "", { kind: "exited", code });
180
+ state.active = null;
181
+ state.spontaneous = false;
182
+ state.codexTurnId = null;
125
183
  });
126
- const makeTurn = (state) => ({
127
- id: state.kernelTurn.id,
128
- outcome: state.kernelTurn.outcome,
129
- abort: async () => {
130
- if (state.kernelTurn.settled()) {
131
- return;
132
- }
133
- const codexTurnId = await state.codexTurnId;
134
- if (!state.kernelTurn.settled()) {
135
- try {
136
- await client.request("turn/interrupt", { threadId, turnId: codexTurnId });
137
- }
138
- catch {
139
- // The turn ended before the interrupt landed — the contractual late
140
- // abort no-op; turn/completed settles the real outcome.
141
- }
142
- await state.kernelTurn.outcome;
184
+ /** Turn a plan builder into a Session control member. */
185
+ const via = (plan) => async (...args) => {
186
+ const result = await rpcControl(kernel, client, plan(...args));
187
+ return result;
188
+ };
189
+ const promptPlan = (input, promptOptions) => ({
190
+ body: { kind: "prompt", input, ...(promptOptions?.lineage === undefined ? {} : { lineage: promptOptions.lineage }) },
191
+ gate: (request) => {
192
+ if (busy()) {
193
+ return { kind: "rejected", reason: "busy" };
143
194
  }
195
+ // Hold the slot while the RPC is in flight so a concurrent prompt is busy.
196
+ state.active = request;
197
+ return null;
144
198
  },
145
- steer: async (input) => {
146
- if (state.kernelTurn.settled()) {
147
- return { kind: "not_steerable", reason: "turn already ended" };
148
- }
149
- const codexTurnId = await state.codexTurnId;
150
- try {
151
- await client.request("turn/steer", {
152
- threadId,
153
- input: [{ type: "text", text: input }],
154
- expectedTurnId: codexTurnId,
155
- });
156
- return { kind: "accepted" };
157
- }
158
- catch (error) {
159
- return { kind: "not_steerable", reason: error instanceof Error ? error.message : "rejected" };
199
+ method: "turn/start",
200
+ params: () => ({ threadId, input: text(input) }),
201
+ onReply: (reply) => {
202
+ const turnId = asRecord(reply.turn)?.id;
203
+ if (typeof turnId !== "string") {
204
+ state.active = null;
205
+ return { kind: "rejected", reason: "codex turn/start returned no turn id", native: reply };
160
206
  }
207
+ state.codexTurnId = turnId;
208
+ return { kind: "accepted", native: reply };
209
+ },
210
+ onError: (message) => {
211
+ state.active = null;
212
+ return { kind: "rejected", reason: message };
161
213
  },
162
214
  });
215
+ const steerPlan = (input) => ({
216
+ body: { kind: "steer", input },
217
+ gate: () => (!busy() || state.codexTurnId === null ? { kind: "rejected", reason: "not_steerable: no active turn" } : null),
218
+ method: "turn/steer",
219
+ params: () => ({ threadId, input: text(input), expectedTurnId: state.codexTurnId }),
220
+ onReply: (reply) => ({ kind: "accepted", native: reply }),
221
+ onError: (message) => ({ kind: "rejected", reason: `not_steerable: ${message}` }),
222
+ });
223
+ // The reply carries the runtime's submission id; it is retained on the response.
224
+ const queuePlan = (input) => ({
225
+ body: { kind: "queue", input },
226
+ gate: () => null,
227
+ method: "thread/queue/add",
228
+ params: () => ({ threadId, input: text(input), clientUserMessageId: randomUUID() }),
229
+ onReply: (reply) => ({ kind: "accepted", native: reply }),
230
+ onError: (message) => ({ kind: "rejected", reason: message }),
231
+ });
232
+ // A refused interrupt is the contractual late abort: the turn ended before
233
+ // it landed, and turn/completed carries the real outcome.
234
+ const abortPlan = () => ({
235
+ body: { kind: "abort" },
236
+ gate: () => (!busy() || state.codexTurnId === null ? { kind: "rejected", reason: "no active turn" } : null),
237
+ method: "turn/interrupt",
238
+ params: () => ({ threadId, turnId: state.codexTurnId }),
239
+ onReply: (reply) => ({ kind: "accepted", native: reply }),
240
+ onError: (message) => ({ kind: "rejected", reason: message }),
241
+ });
163
242
  const session = sealSession({
164
243
  id: kernel.sessionId,
165
- prompt(input) {
166
- const kernelTurn = kernel.begin();
167
- if (kernelTurn === null) {
168
- return { kind: "busy" };
169
- }
170
- const codexTurnId = (async () => {
171
- const response = await client.request("turn/start", {
172
- threadId,
173
- input: [{ type: "text", text: input }],
174
- });
175
- const turnId = asRecord(response.turn)?.id;
176
- if (typeof turnId !== "string") {
177
- throw new TypeError("codex turn/start returned no turn id");
178
- }
179
- return turnId;
180
- })();
181
- void (async () => {
182
- try {
183
- await codexTurnId;
184
- }
185
- catch (error) {
186
- const reason = error instanceof Error ? error.message : "turn/start failed";
187
- kernelTurn.settle({ kind: "failed", reason, failure: classifyFailure(reason) });
188
- }
189
- })();
190
- const state = { kernelTurn, codexTurnId };
191
- current = state;
192
- projection = codexPrompted(projection);
193
- return { kind: "turn", turn: makeTurn(state) };
194
- },
195
- subscribe: (observer) => kernel.subscribe(observer),
196
- model: () => effectiveModel,
197
- contextUsage: () => latestContextUsage,
198
- queue: {
199
- durable: true,
200
- add: async (input) => {
201
- await client.request("thread/queue/add", {
202
- threadId,
203
- input: [{ type: "text", text: input }],
204
- clientUserMessageId: randomUUID(),
205
- });
206
- },
207
- },
244
+ capabilities: { steer: true, queue: { durable: true }, attribution: "nested" },
245
+ prompt: via(promptPlan),
246
+ steer: via(steerPlan),
247
+ queue: via(queuePlan),
248
+ abort: via(abortPlan),
249
+ subscribe: (observer, cursor) => kernel.subscribe(observer, cursor),
250
+ records: () => kernel.records(),
251
+ graph: () => kernel.graph(),
208
252
  dispose: async () => {
209
- if (disposed) {
253
+ if (disposeRequest !== null) {
254
+ return;
255
+ }
256
+ const gone = kernel.unreachable() !== null; // only an observed exit can say so before this dispose is recorded
257
+ disposeRequest = kernel.request("toRuntime", { kind: "dispose" });
258
+ if (gone) {
259
+ // The exit is already recorded; nothing is left to release.
260
+ kernel.respond(disposeRequest.id, { kind: "accepted" });
210
261
  return;
211
262
  }
212
- disposed = true;
213
- kernel.active()?.settle({ kind: "aborted" });
214
263
  client.kill();
215
264
  // Await the actual exit: the process may hold state (codex's sqlite
216
- // runtime in CODEX_HOME) that the next session needs released.
265
+ // runtime in CODEX_HOME) that the next session needs released. The
266
+ // exit response is recorded by onExit.
217
267
  await client.exited;
218
268
  },
219
269
  });
@@ -1 +1 @@
1
- {"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/runtimes/codex/session.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/runtimes/codex/session.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,46 @@
1
- import type { ContextUsage, SessionOptions } from "../../contracts/session.js";
1
+ import type { ContextUsage, SessionOptions, TokenTotals } from "../../contracts/session.js";
2
2
  import { type AcpSessionProfile } from "../../shared/acp/session.js";
3
3
  import { type JsonRecord } from "../../shared/json.js";
4
4
  export declare function selectGrokAuthMethod(initialized: JsonRecord): string | undefined;
5
5
  export declare function grokInitializeMeta(options: SessionOptions): JsonRecord;
6
6
  /** Grok prompt responses carry an authoritative usage snapshot in `_meta`. */
7
7
  export declare function grokContextUsage(response: JsonRecord): ContextUsage | null;
8
+ /**
9
+ * The tokens one prompt answer bills: `_meta.usage` is the prompt's ledger
10
+ * summed over its model calls (grok 1.0.25, live 2026-09-11: three one-word
11
+ * turns billed ~16.8k input each, not a growing total; a steered turn's
12
+ * closing answer summed its two calls). `inputTokens` includes the cached
13
+ * reads (`cachedReadTokens` ≤ it) and, for a prompt that spawned children,
14
+ * the children's model calls too (live-grok-c/subagent seq 159 = the four
15
+ * `response_completed` frames 48+78+119+155, two of them the child's). The
16
+ * turn machinery sums these per session.
17
+ */
18
+ export declare function grokPromptTokens(response: JsonRecord): TokenTotals | null;
19
+ /**
20
+ * Vendor notification methods the SDK must be told about, or it discards
21
+ * the frame unseen. Registered so each is recorded verbatim; one that names
22
+ * a parent/child session pair links the session graph (records.ts).
23
+ *
24
+ * Observed on the live wire, grok 1.0.25 (f7e67d6988e2), 2026-09-11
25
+ * (experiments/grok-wire-tap.ts): `_x.ai/session_notification`, the vendor
26
+ * twin of `session/update` (`{sessionId, update: {sessionUpdate}}`) carrying
27
+ * `model_changed`, `session_summary_generated`, `tool_call_delta_chunk`,
28
+ * `pending_interaction`, `interaction_resolved`, `response_completed`,
29
+ * `turn_completed`, `last_turn_summary`, `background_tasks` (on resume) and
30
+ * the sub-agent lifecycle `subagent_spawned` / `subagent_progress` /
31
+ * `subagent_finished`; `_x.ai/sessions/changed`;
32
+ * `_x.ai/session/prompt_complete`; and, per session start, the connection
33
+ * housekeeping `_x.ai/queue/changed`, `_x.ai/models/update`,
34
+ * `_x.ai/settings/update`, `_x.ai/announcements/update`,
35
+ * `_x.ai/mcp/servers_updated`, `_x.ai/mcp/init_progress`,
36
+ * `_x.ai/mcp/server_status`, `_x.ai/mcp_initialized`, all of which the tap
37
+ * showed on the wire but missing from the stream until listed here.
38
+ *
39
+ * Still [sym] only (in the binary's symbol table, never on a live wire):
40
+ * `_x.ai/session/update`, `_x.ai/task_backgrounded`, `_x.ai/task_completed`,
41
+ * `_x.ai/session/usage`. Kept registered: an unlisted name is a dropped frame.
42
+ */
43
+ export declare const GROK_EXTENSION_NOTIFICATIONS: readonly string[];
8
44
  export declare const grokAcpProfile: AcpSessionProfile;
9
45
  export declare const grokSession: import("../../contracts/session.js").StartSession;
10
46
  //# sourceMappingURL=session.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/runtimes/grok/session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC/E,OAAO,EAAc,KAAK,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AACjF,OAAO,EAAsB,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAS3E,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS,CAQhF;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,cAAc,GAAG,UAAU,CAYtE;AAYD,8EAA8E;AAC9E,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,UAAU,GAAG,YAAY,GAAG,IAAI,CAc1E;AAED,eAAO,MAAM,cAAc,EAAE,iBAQ5B,CAAC;AAEF,eAAO,MAAM,WAAW,mDAA6B,CAAC"}
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/runtimes/grok/session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC5F,OAAO,EAAc,KAAK,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AACjF,OAAO,EAAsB,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAS3E,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS,CAQhF;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,cAAc,GAAG,UAAU,CAYtE;AAYD,8EAA8E;AAC9E,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,UAAU,GAAG,YAAY,GAAG,IAAI,CAc1E;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,UAAU,GAAG,WAAW,GAAG,IAAI,CAUzE;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,eAAO,MAAM,4BAA4B,EAAE,SAAS,MAAM,EAkBzD,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,iBAkB5B,CAAC;AAEF,eAAO,MAAM,WAAW,mDAA6B,CAAC"}
@@ -53,14 +53,88 @@ export function grokContextUsage(response) {
53
53
  : Math.round((tokens / contextWindow) * 100);
54
54
  return { tokens, contextWindow, percent };
55
55
  }
56
+ /**
57
+ * The tokens one prompt answer bills: `_meta.usage` is the prompt's ledger
58
+ * summed over its model calls (grok 1.0.25, live 2026-09-11: three one-word
59
+ * turns billed ~16.8k input each, not a growing total; a steered turn's
60
+ * closing answer summed its two calls). `inputTokens` includes the cached
61
+ * reads (`cachedReadTokens` ≤ it) and, for a prompt that spawned children,
62
+ * the children's model calls too (live-grok-c/subagent seq 159 = the four
63
+ * `response_completed` frames 48+78+119+155, two of them the child's). The
64
+ * turn machinery sums these per session.
65
+ */
66
+ export function grokPromptTokens(response) {
67
+ // oxlint-disable-next-line eslint/no-underscore-dangle -- `_meta` is the ACP extension envelope.
68
+ const usage = asRecord(asRecord(response._meta)?.usage);
69
+ const input = firstNumber(usage, ["inputTokens", "input_tokens"]);
70
+ const output = firstNumber(usage, ["outputTokens", "output_tokens"]);
71
+ // Both or nothing: a half ledger would invent a 0 for the missing side.
72
+ if (input === null || output === null) {
73
+ return null;
74
+ }
75
+ return { input, output };
76
+ }
77
+ /**
78
+ * Vendor notification methods the SDK must be told about, or it discards
79
+ * the frame unseen. Registered so each is recorded verbatim; one that names
80
+ * a parent/child session pair links the session graph (records.ts).
81
+ *
82
+ * Observed on the live wire, grok 1.0.25 (f7e67d6988e2), 2026-09-11
83
+ * (experiments/grok-wire-tap.ts): `_x.ai/session_notification`, the vendor
84
+ * twin of `session/update` (`{sessionId, update: {sessionUpdate}}`) carrying
85
+ * `model_changed`, `session_summary_generated`, `tool_call_delta_chunk`,
86
+ * `pending_interaction`, `interaction_resolved`, `response_completed`,
87
+ * `turn_completed`, `last_turn_summary`, `background_tasks` (on resume) and
88
+ * the sub-agent lifecycle `subagent_spawned` / `subagent_progress` /
89
+ * `subagent_finished`; `_x.ai/sessions/changed`;
90
+ * `_x.ai/session/prompt_complete`; and, per session start, the connection
91
+ * housekeeping `_x.ai/queue/changed`, `_x.ai/models/update`,
92
+ * `_x.ai/settings/update`, `_x.ai/announcements/update`,
93
+ * `_x.ai/mcp/servers_updated`, `_x.ai/mcp/init_progress`,
94
+ * `_x.ai/mcp/server_status`, `_x.ai/mcp_initialized`, all of which the tap
95
+ * showed on the wire but missing from the stream until listed here.
96
+ *
97
+ * Still [sym] only (in the binary's symbol table, never on a live wire):
98
+ * `_x.ai/session/update`, `_x.ai/task_backgrounded`, `_x.ai/task_completed`,
99
+ * `_x.ai/session/usage`. Kept registered: an unlisted name is a dropped frame.
100
+ */
101
+ export const GROK_EXTENSION_NOTIFICATIONS = [
102
+ // live 2026-09-11
103
+ "_x.ai/session_notification",
104
+ "_x.ai/sessions/changed",
105
+ "_x.ai/session/prompt_complete",
106
+ "_x.ai/queue/changed",
107
+ "_x.ai/models/update",
108
+ "_x.ai/settings/update",
109
+ "_x.ai/announcements/update",
110
+ "_x.ai/mcp/servers_updated",
111
+ "_x.ai/mcp/init_progress",
112
+ "_x.ai/mcp/server_status",
113
+ "_x.ai/mcp_initialized",
114
+ // [sym] only
115
+ "_x.ai/session/update",
116
+ "_x.ai/task_backgrounded",
117
+ "_x.ai/task_completed",
118
+ "_x.ai/session/usage",
119
+ ];
56
120
  export const grokAcpProfile = {
57
121
  args: ["agent", "--always-approve", "--no-leader", "stdio"],
122
+ // Native children are independent ACP sessions on the same connection
123
+ // (attribution tier #3, docs/spec/attribution.md): recorded under their own
124
+ // session id, linked in the graph when a lifecycle notification says so.
125
+ capabilities: { steer: true, queue: { durable: false }, attribution: "nested" },
126
+ extensionNotifications: GROK_EXTENSION_NOTIFICATIONS,
58
127
  terminalShellCommand: true,
59
128
  initializeMeta: grokInitializeMeta,
60
129
  sessionMeta: () => ({ yoloMode: true }),
61
130
  selectAuthMethod: selectGrokAuthMethod,
131
+ // `_meta.sendNow` is not an injection: grok answers the running prompt
132
+ // `cancelled` (`cancelTrigger: "send_now"`, live 1.0.25) and starts a fresh
133
+ // model turn that re-issued the interrupted tool calls; both answers fold
134
+ // into the one oar turn (turns.ts).
62
135
  steerParams: () => ({ _meta: { sendNow: true } }),
63
136
  promptContextUsage: grokContextUsage,
137
+ promptTokenUsage: grokPromptTokens,
64
138
  };
65
139
  export const grokSession = acpSession(grokAcpProfile);
66
140
  //# sourceMappingURL=session.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/runtimes/grok/session.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/runtimes/grok/session.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAA0B,MAAM,6BAA6B,CAAC;AACjF,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAmB,MAAM,sBAAsB,CAAC;AAE3E,SAAS,aAAa,CAAC,WAAuB;IAC5C,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;SAC3E,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;SACjC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC;SAC3B,MAAM,CAAC,CAAC,EAAE,EAAgB,EAAE,CAAC,OAAO,EAAE,KAAK,QAAQ,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,WAAuB;IAC1D,MAAM,GAAG,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;IACvC,iGAAiG;IACjG,MAAM,SAAS,GAAG,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,mBAAmB,CAAC;IACnE,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7D,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAAuB;IACxD,OAAO;QACL,gBAAgB,EAAE,KAAK;QACvB,UAAU,EAAE,SAAS;QACrB,YAAY,EAAE;YACZ,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,IAAI;YACnB,iBAAiB,EAAE,IAAI;SACxB;QACD,GAAG,CAAC,OAAO,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,oBAAoB,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC;QAC7F,GAAG,CAAC,OAAO,CAAC,kBAAkB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,kBAAkB,EAAE,CAAC;KAC3F,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,MAAyB,EAAE,KAAwB;IACtE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;QACvC,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACnB,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,gBAAgB,CAAC,QAAoB;IACnD,iGAAiG;IACjG,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACtC,0EAA0E;IAC1E,wEAAwE;IACxE,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC,CAAC;IACnE,MAAM,aAAa,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC,eAAe,EAAE,gBAAgB,EAAE,kBAAkB,CAAC,CAAC,CAAC;IACjG,IAAI,MAAM,KAAK,IAAI,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;QAC9C,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,KAAK,IAAI,IAAI,aAAa,KAAK,IAAI,IAAI,aAAa,KAAK,CAAC;QAC9E,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,aAAa,CAAC,GAAG,GAAG,CAAC,CAAC;IAC/C,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC;AAC5C,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAoB;IACnD,iGAAiG;IACjG,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;IACxD,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,EAAE,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC,CAAC;IAClE,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,EAAE,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC,CAAC;IACrE,wEAAwE;IACxE,IAAI,KAAK,KAAK,IAAI,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AAC3B,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAsB;IAC7D,kBAAkB;IAClB,4BAA4B;IAC5B,wBAAwB;IACxB,+BAA+B;IAC/B,qBAAqB;IACrB,qBAAqB;IACrB,uBAAuB;IACvB,4BAA4B;IAC5B,2BAA2B;IAC3B,yBAAyB;IACzB,yBAAyB;IACzB,uBAAuB;IACvB,aAAa;IACb,sBAAsB;IACtB,yBAAyB;IACzB,sBAAsB;IACtB,qBAAqB;CACtB,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAsB;IAC/C,IAAI,EAAE,CAAC,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,OAAO,CAAC;IAC3D,sEAAsE;IACtE,4EAA4E;IAC5E,yEAAyE;IACzE,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,QAAQ,EAAE;IAC/E,sBAAsB,EAAE,4BAA4B;IACpD,oBAAoB,EAAE,IAAI;IAC1B,cAAc,EAAE,kBAAkB;IAClC,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IACvC,gBAAgB,EAAE,oBAAoB;IACtC,uEAAuE;IACvE,4EAA4E;IAC5E,0EAA0E;IAC1E,oCAAoC;IACpC,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;IACjD,kBAAkB,EAAE,gBAAgB;IACpC,gBAAgB,EAAE,gBAAgB;CACnC,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/runtimes/kimi/session.ts"],"names":[],"mappings":"AACA,OAAO,EAAc,KAAK,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AACjF,OAAO,EAAY,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEjE,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS,CAOhF;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,UAAU,GAAG,OAAO,CAU9D;AAQD,eAAO,MAAM,cAAc,EAAE,iBAiB5B,CAAC;AAEF,eAAO,MAAM,WAAW,mDAA6B,CAAC"}
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/runtimes/kimi/session.ts"],"names":[],"mappings":"AACA,OAAO,EAAc,KAAK,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AACjF,OAAO,EAAY,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEjE,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS,CAOhF;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,UAAU,GAAG,OAAO,CAU9D;AAQD,eAAO,MAAM,cAAc,EAAE,iBAsB5B,CAAC;AAEF,eAAO,MAAM,WAAW,mDAA6B,CAAC"}
@@ -26,6 +26,11 @@ function validateKimiOptions(options) {
26
26
  }
27
27
  export const kimiAcpProfile = {
28
28
  args: ["acp"],
29
+ // `kimi acp` binds the native session's `main` agent only (kimi-code
30
+ // f9ca33376 acp-server session.ts), so children exist natively but never
31
+ // reach this transport: opaque (tier #1), honestly root-only. The ACP
32
+ // method set has no steer.
33
+ capabilities: { steer: false, queue: { durable: false }, attribution: "opaque" },
29
34
  requestTimeoutMs: 30_000,
30
35
  selectAuthMethod: selectKimiAuthMethod,
31
36
  validateOptions: validateKimiOptions,