@botiverse/oar 0.6.0 → 0.8.0

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 (151) hide show
  1. package/README.md +4 -2
  2. package/dist/contracts/records.d.ts +33 -10
  3. package/dist/contracts/records.d.ts.map +1 -1
  4. package/dist/contracts/session.d.ts +66 -13
  5. package/dist/contracts/session.d.ts.map +1 -1
  6. package/dist/contracts/status.d.ts +25 -0
  7. package/dist/contracts/status.d.ts.map +1 -0
  8. package/dist/contracts/status.js +2 -0
  9. package/dist/contracts/status.js.map +1 -0
  10. package/dist/index.d.ts +5 -5
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +3 -3
  13. package/dist/index.js.map +1 -1
  14. package/dist/kernel.d.ts +12 -0
  15. package/dist/kernel.d.ts.map +1 -0
  16. package/dist/kernel.js +11 -0
  17. package/dist/kernel.js.map +1 -0
  18. package/dist/observe/agent-status.d.ts +4 -18
  19. package/dist/observe/agent-status.d.ts.map +1 -1
  20. package/dist/observe/agent-status.js +41 -0
  21. package/dist/observe/agent-status.js.map +1 -1
  22. package/dist/observe/events.d.ts.map +1 -1
  23. package/dist/observe/events.js +1 -2
  24. package/dist/observe/events.js.map +1 -1
  25. package/dist/observe/index.d.ts +6 -4
  26. package/dist/observe/index.d.ts.map +1 -1
  27. package/dist/observe/index.js +4 -3
  28. package/dist/observe/index.js.map +1 -1
  29. package/dist/observe/session-view-events.d.ts +11 -0
  30. package/dist/observe/session-view-events.d.ts.map +1 -0
  31. package/dist/observe/session-view-events.js +233 -0
  32. package/dist/observe/session-view-events.js.map +1 -0
  33. package/dist/observe/session-view-fold.d.ts +57 -0
  34. package/dist/observe/session-view-fold.d.ts.map +1 -0
  35. package/dist/observe/session-view-fold.js +156 -0
  36. package/dist/observe/session-view-fold.js.map +1 -0
  37. package/dist/observe/session-view.d.ts +153 -0
  38. package/dist/observe/session-view.d.ts.map +1 -0
  39. package/dist/observe/session-view.js +81 -0
  40. package/dist/observe/session-view.js.map +1 -0
  41. package/dist/observe/turns.d.ts +45 -7
  42. package/dist/observe/turns.d.ts.map +1 -1
  43. package/dist/observe/turns.js +77 -7
  44. package/dist/observe/turns.js.map +1 -1
  45. package/dist/observe/usage.d.ts +2 -0
  46. package/dist/observe/usage.d.ts.map +1 -1
  47. package/dist/observe/usage.js +18 -0
  48. package/dist/observe/usage.js.map +1 -1
  49. package/dist/runtimes/claude/effort.d.ts +14 -0
  50. package/dist/runtimes/claude/effort.d.ts.map +1 -0
  51. package/dist/runtimes/claude/effort.js +62 -0
  52. package/dist/runtimes/claude/effort.js.map +1 -0
  53. package/dist/runtimes/claude/projection.js +1 -1
  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 +46 -6
  57. package/dist/runtimes/claude/session.js.map +1 -1
  58. package/dist/runtimes/codex/item-detail.d.ts +2 -0
  59. package/dist/runtimes/codex/item-detail.d.ts.map +1 -1
  60. package/dist/runtimes/codex/item-detail.js +12 -5
  61. package/dist/runtimes/codex/item-detail.js.map +1 -1
  62. package/dist/runtimes/codex/open.d.ts +42 -0
  63. package/dist/runtimes/codex/open.d.ts.map +1 -0
  64. package/dist/runtimes/codex/open.js +116 -0
  65. package/dist/runtimes/codex/open.js.map +1 -0
  66. package/dist/runtimes/codex/projection.d.ts.map +1 -1
  67. package/dist/runtimes/codex/projection.js +29 -4
  68. package/dist/runtimes/codex/projection.js.map +1 -1
  69. package/dist/runtimes/codex/session.d.ts.map +1 -1
  70. package/dist/runtimes/codex/session.js +53 -59
  71. package/dist/runtimes/codex/session.js.map +1 -1
  72. package/dist/runtimes/grok/list-models.d.ts +6 -0
  73. package/dist/runtimes/grok/list-models.d.ts.map +1 -1
  74. package/dist/runtimes/grok/list-models.js +17 -2
  75. package/dist/runtimes/grok/list-models.js.map +1 -1
  76. package/dist/runtimes/kimi/list-models.d.ts +7 -4
  77. package/dist/runtimes/kimi/list-models.d.ts.map +1 -1
  78. package/dist/runtimes/kimi/list-models.js +9 -5
  79. package/dist/runtimes/kimi/list-models.js.map +1 -1
  80. package/dist/runtimes/pi/installation.d.ts.map +1 -1
  81. package/dist/runtimes/pi/installation.js +3 -1
  82. package/dist/runtimes/pi/installation.js.map +1 -1
  83. package/dist/runtimes/pi/list-models.d.ts +16 -4
  84. package/dist/runtimes/pi/list-models.d.ts.map +1 -1
  85. package/dist/runtimes/pi/list-models.js +24 -7
  86. package/dist/runtimes/pi/list-models.js.map +1 -1
  87. package/dist/runtimes/pi/open.d.ts +22 -0
  88. package/dist/runtimes/pi/open.d.ts.map +1 -1
  89. package/dist/runtimes/pi/open.js +50 -0
  90. package/dist/runtimes/pi/open.js.map +1 -1
  91. package/dist/runtimes/pi/projection.d.ts.map +1 -1
  92. package/dist/runtimes/pi/projection.js +21 -2
  93. package/dist/runtimes/pi/projection.js.map +1 -1
  94. package/dist/runtimes/pi/session.d.ts.map +1 -1
  95. package/dist/runtimes/pi/session.js +14 -12
  96. package/dist/runtimes/pi/session.js.map +1 -1
  97. package/dist/shared/acp/effort.d.ts +25 -0
  98. package/dist/shared/acp/effort.d.ts.map +1 -0
  99. package/dist/shared/acp/effort.js +47 -0
  100. package/dist/shared/acp/effort.js.map +1 -0
  101. package/dist/shared/acp/model.d.ts +19 -0
  102. package/dist/shared/acp/model.d.ts.map +1 -1
  103. package/dist/shared/acp/model.js +27 -0
  104. package/dist/shared/acp/model.js.map +1 -1
  105. package/dist/shared/acp/profile.d.ts.map +1 -1
  106. package/dist/shared/acp/profile.js +7 -0
  107. package/dist/shared/acp/profile.js.map +1 -1
  108. package/dist/shared/acp/projection.d.ts.map +1 -1
  109. package/dist/shared/acp/projection.js +37 -3
  110. package/dist/shared/acp/projection.js.map +1 -1
  111. package/dist/shared/acp/records.d.ts +1 -1
  112. package/dist/shared/acp/records.d.ts.map +1 -1
  113. package/dist/shared/acp/records.js +6 -2
  114. package/dist/shared/acp/records.js.map +1 -1
  115. package/dist/shared/acp/session.d.ts.map +1 -1
  116. package/dist/shared/acp/session.js +4 -4
  117. package/dist/shared/acp/session.js.map +1 -1
  118. package/dist/shared/acp/terminal.d.ts.map +1 -1
  119. package/dist/shared/acp/terminal.js +9 -2
  120. package/dist/shared/acp/terminal.js.map +1 -1
  121. package/dist/shared/acp/turns.js +2 -2
  122. package/dist/shared/acp/turns.js.map +1 -1
  123. package/dist/shared/executable/index.d.ts +1 -1
  124. package/dist/shared/executable/index.d.ts.map +1 -1
  125. package/dist/shared/executable/index.js +1 -1
  126. package/dist/shared/executable/index.js.map +1 -1
  127. package/dist/shared/executable/process.d.ts +48 -1
  128. package/dist/shared/executable/process.d.ts.map +1 -1
  129. package/dist/shared/executable/process.js +66 -1
  130. package/dist/shared/executable/process.js.map +1 -1
  131. package/dist/shared/seal-session.d.ts +15 -7
  132. package/dist/shared/seal-session.d.ts.map +1 -1
  133. package/dist/shared/seal-session.js +42 -17
  134. package/dist/shared/seal-session.js.map +1 -1
  135. package/dist/shared/session-kernel.d.ts +1 -0
  136. package/dist/shared/session-kernel.d.ts.map +1 -1
  137. package/dist/shared/session-kernel.js +3 -3
  138. package/dist/shared/session-kernel.js.map +1 -1
  139. package/dist/testing/index.d.ts +8 -0
  140. package/dist/testing/index.d.ts.map +1 -0
  141. package/dist/testing/index.js +7 -0
  142. package/dist/testing/index.js.map +1 -0
  143. package/dist/testing/scripted-runtime.d.ts +50 -0
  144. package/dist/testing/scripted-runtime.d.ts.map +1 -0
  145. package/dist/testing/scripted-runtime.js +187 -0
  146. package/dist/testing/scripted-runtime.js.map +1 -0
  147. package/dist/voyage.d.ts +2 -0
  148. package/dist/voyage.d.ts.map +1 -1
  149. package/dist/voyage.js +4 -1
  150. package/dist/voyage.js.map +1 -1
  151. package/package.json +10 -1
@@ -0,0 +1,153 @@
1
+ import type { ContextUsage, ControlAction, Cursor, Event, RawEvent, ReasoningContent, Session, SessionUsage, TokenTotals, TurnOutcome, Unsubscribe } from "../contracts/session.js";
2
+ import { type AgentStatus } from "./agent-status.js";
3
+ import { type ConversationInput, type ConversationState } from "./conversation.js";
4
+ /**
5
+ * The chat-UI projection: one `SessionView` is everything a conversation
6
+ * surface needs — grouped messages, agent status, model/usage/context, and
7
+ * the runtime requests still awaiting an answer. Pure over the record
8
+ * stream (docs/design/chat-ui.md): replayable from a log, no clock, no IO.
9
+ *
10
+ * Grouping rules, all derived never synthesized:
11
+ * - A TURN is a display segment: it opens on its prompt request or on the
12
+ * first turn-content event while none is open (adopted: queued input
13
+ * consumed, mid-turn subscriber, replay slice). A rejected prompt removes
14
+ * its empty turn — the turn never began (same rule as `reduceStatus`).
15
+ * `turn_ended` of the ROOT session stamps the open segment; an input
16
+ * arriving mid-turn seals the current segment so seq order stays the
17
+ * render order, and later content opens a new segment.
18
+ * - A SECTION is a contiguous run of one lane (`sessionId`, `agentPath`)
19
+ * inside a turn. Sub-agent and child-session activity nests inside the
20
+ * parent turn as sections; a child session's own `turn_ended` degrades
21
+ * to a notice part, it never closes the root turn.
22
+ * - An exited stream never stamps a fabricated outcome on an open turn.
23
+ */
24
+ export type ViewNotice = {
25
+ readonly cause: "compaction_started";
26
+ readonly trigger?: string;
27
+ } | {
28
+ readonly cause: "compaction_ended";
29
+ readonly outcome: "completed" | "aborted" | "failed";
30
+ readonly trigger?: string;
31
+ readonly reason?: string;
32
+ } | {
33
+ readonly cause: "retry";
34
+ readonly attempt: number;
35
+ readonly maxAttempts?: number;
36
+ readonly delayMs?: number;
37
+ readonly reason?: string;
38
+ } | {
39
+ readonly cause: "control_rejected";
40
+ readonly action: ControlAction;
41
+ readonly reason: string;
42
+ } | {
43
+ readonly cause: "child_turn_ended";
44
+ readonly outcome: TurnOutcome;
45
+ } | {
46
+ readonly cause: "exited";
47
+ readonly code: number | null;
48
+ };
49
+ export type ViewPart = {
50
+ readonly kind: "text";
51
+ readonly text: string;
52
+ } | {
53
+ readonly kind: "reasoning";
54
+ readonly content: ReasoningContent;
55
+ } | {
56
+ readonly kind: "tool";
57
+ readonly callId: string;
58
+ readonly tool: string;
59
+ readonly input?: string;
60
+ readonly output?: string;
61
+ readonly result: "running" | "ok" | "failed" | "ended";
62
+ } | {
63
+ readonly kind: "notice";
64
+ readonly notice: ViewNotice;
65
+ } | {
66
+ readonly kind: "app_request";
67
+ readonly requestId: string;
68
+ readonly type: string;
69
+ readonly answered: boolean;
70
+ readonly body?: unknown;
71
+ };
72
+ /** One contiguous lane run inside a turn. */
73
+ export interface ViewSection {
74
+ readonly sessionId: string;
75
+ readonly agentPath: readonly string[];
76
+ readonly parts: readonly ViewPart[];
77
+ }
78
+ export interface ViewTurn {
79
+ readonly kind: "turn";
80
+ readonly id: string;
81
+ /** The prompt request that opened the segment; absent for adopted ones. */
82
+ readonly openedBy?: string;
83
+ readonly sections: readonly ViewSection[];
84
+ /** The runtime's own turn end. Absent on sealed segments and interrupted turns. */
85
+ readonly outcome?: TurnOutcome;
86
+ }
87
+ export type ViewMessage = {
88
+ readonly kind: "input";
89
+ readonly id: string;
90
+ readonly input: ConversationInput;
91
+ } | ViewTurn | {
92
+ readonly kind: "notice";
93
+ readonly id: string;
94
+ readonly notice: ViewNotice;
95
+ };
96
+ /** A runtime→app request still awaiting an answer (or the record of one). */
97
+ export interface PendingRequest {
98
+ readonly requestId: string;
99
+ readonly type: string;
100
+ readonly sessionId: string;
101
+ readonly agentPath: readonly string[];
102
+ readonly seq: number;
103
+ /** The `toApp` request body verbatim; undefined when folded from flat events. */
104
+ readonly body?: unknown;
105
+ }
106
+ export interface AgentTokens {
107
+ readonly agentPath: readonly string[];
108
+ readonly tokens: TokenTotals;
109
+ }
110
+ export interface SessionView {
111
+ readonly messages: readonly ViewMessage[];
112
+ /** Index of the unsealed turn segment in `messages`; -1 when none. */
113
+ readonly openTurn: number;
114
+ readonly status: AgentStatus;
115
+ readonly model: string | null;
116
+ /** The latest reasoning-effort level the runtime reported (`effort` events); null before any. */
117
+ readonly effort: string | null;
118
+ readonly context: ContextUsage | null;
119
+ readonly usage: SessionUsage;
120
+ readonly pendingRequests: readonly PendingRequest[];
121
+ /** The last observed process exit, when the stream recorded one. */
122
+ readonly exited: {
123
+ readonly code: number | null;
124
+ } | null;
125
+ /** The fold internals, exposed like `ConversationState`: all derivable. */
126
+ readonly conversation: ConversationState;
127
+ /** sessionId of the latest prompt request: whose `turn_ended` closes turns. */
128
+ readonly rootSessionId: string | undefined;
129
+ readonly usageByAgent: ReadonlyMap<string, AgentTokens>;
130
+ }
131
+ export declare function initialSessionView(): SessionView;
132
+ /**
133
+ * Fold one record into the view. `streamId` scopes input/request identity the
134
+ * same way it does for `reduceConversation`: one value per native stream,
135
+ * changed across resume so restarted seq domains never collide.
136
+ */
137
+ export declare function reduceSessionView(previous: SessionView, record: RawEvent, streamId?: string): SessionView;
138
+ /**
139
+ * The same fold for pre-flattened `Event`s — `session.events()` subscribers
140
+ * and logs that predate record envelopes. Input facts do not arrive this way;
141
+ * feed them through `reduceSessionViewInput` or use the record path.
142
+ */
143
+ export declare function reduceSessionViewEvent(previous: SessionView, event: Event, streamId?: string): SessionView;
144
+ /** Upsert a user input from a non-record source (an app's own submission log). */
145
+ export declare function reduceSessionViewInput(previous: SessionView, input: ConversationInput): SessionView;
146
+ /** Replay a whole record log into a view. One `streamId` per call. */
147
+ export declare function viewOf(records: readonly RawEvent[], streamId?: string): SessionView;
148
+ /**
149
+ * The composed subscriber: folds the retained prefix, pushes the view on
150
+ * every record after `cursor`. Mirrors `observeConversation`.
151
+ */
152
+ export declare function observeSessionView(session: Session, observer: (view: SessionView) => void, cursor?: Cursor): Unsubscribe;
153
+ //# sourceMappingURL=session-view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-view.d.ts","sourceRoot":"","sources":["../../src/observe/session-view.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,81 @@
1
+ import { initialStatus, reduceStatus } from "./agent-status.js";
2
+ import { initialConversation, reduceConversation, } from "./conversation.js";
3
+ import { assemble, draftOf, upsertInput } from "./session-view-fold.js";
4
+ import { foldEvent, recordFacts } from "./session-view-events.js";
5
+ export function initialSessionView() {
6
+ return {
7
+ messages: [],
8
+ openTurn: -1,
9
+ status: initialStatus,
10
+ model: null,
11
+ effort: null,
12
+ context: null,
13
+ usage: { total: null },
14
+ pendingRequests: [],
15
+ exited: null,
16
+ conversation: initialConversation(),
17
+ rootSessionId: undefined,
18
+ usageByAgent: new Map(),
19
+ };
20
+ }
21
+ /**
22
+ * Fold one record into the view. `streamId` scopes input/request identity the
23
+ * same way it does for `reduceConversation`: one value per native stream,
24
+ * changed across resume so restarted seq domains never collide.
25
+ */
26
+ export function reduceSessionView(previous, record, streamId = "") {
27
+ const draft = draftOf(previous);
28
+ draft.rootSessionId ??= record.sessionId;
29
+ if (record.kind === "request" &&
30
+ record.direction === "toRuntime" &&
31
+ record.body.kind === "prompt") {
32
+ draft.rootSessionId = record.sessionId;
33
+ }
34
+ const status = reduceStatus(previous.status, record, draft.rootSessionId);
35
+ const conversation = reduceConversation(previous.conversation, record, streamId);
36
+ for (const update of conversation.updates) {
37
+ if (update.kind === "input") {
38
+ upsertInput(draft, update.input);
39
+ }
40
+ else {
41
+ foldEvent(draft, update.event, streamId);
42
+ }
43
+ }
44
+ recordFacts(draft, record, streamId);
45
+ return assemble(draft, conversation, status);
46
+ }
47
+ /**
48
+ * The same fold for pre-flattened `Event`s — `session.events()` subscribers
49
+ * and logs that predate record envelopes. Input facts do not arrive this way;
50
+ * feed them through `reduceSessionViewInput` or use the record path.
51
+ */
52
+ export function reduceSessionViewEvent(previous, event, streamId = "") {
53
+ const draft = draftOf(previous);
54
+ draft.rootSessionId ??= event.sessionId;
55
+ foldEvent(draft, event, streamId);
56
+ return assemble(draft, previous.conversation, previous.status);
57
+ }
58
+ /** Upsert a user input from a non-record source (an app's own submission log). */
59
+ export function reduceSessionViewInput(previous, input) {
60
+ const draft = draftOf(previous);
61
+ upsertInput(draft, input);
62
+ return assemble(draft, previous.conversation, previous.status);
63
+ }
64
+ /** Replay a whole record log into a view. One `streamId` per call. */
65
+ export function viewOf(records, streamId = "") {
66
+ return records.reduce((state, record) => reduceSessionView(state, record, streamId), initialSessionView());
67
+ }
68
+ /**
69
+ * The composed subscriber: folds the retained prefix, pushes the view on
70
+ * every record after `cursor`. Mirrors `observeConversation`.
71
+ */
72
+ export function observeSessionView(session, observer, cursor) {
73
+ let state = initialSessionView();
74
+ return session.rawEvents((record) => {
75
+ state = reduceSessionView(state, record, session.id);
76
+ if (record.seq > (cursor?.afterSeq ?? -1)) {
77
+ observer(state);
78
+ }
79
+ }, { sessionId: session.id, afterSeq: -1 });
80
+ }
81
+ //# sourceMappingURL=session-view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-view.js","sourceRoot":"","sources":["../../src/observe/session-view.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { ControlResult, Session, RawEvent, TurnOutcome } from "../contracts/session.js";
1
+ import type { ControlOutcome, RejectionCode, Session, RawEvent, TurnOutcome } from "../contracts/session.js";
2
2
  /**
3
3
  * Turn helpers for consumers. A turn is a SPAN on the stream, not a control
4
4
  * object: it starts at the prompt request record and ends at the runtime's own
@@ -23,15 +23,53 @@ export declare function turnEndAfter(records: readonly RawEvent[], afterSeq: num
23
23
  * A derived child session's turn end never satisfies it.
24
24
  */
25
25
  export declare function awaitTurnEnd(session: Session, afterSeq: number): Promise<TurnOutcome>;
26
- export type PromptRun = {
26
+ /**
27
+ * Resolve once the root agent is idle: at once (null) when `session.status()`
28
+ * already says so, otherwise with the outcome of the running turn when it
29
+ * ends. The status is read and the subscription placed through one cursor,
30
+ * so a turn ending in between is not missed. Nothing is prompted here: a
31
+ * runtime that runs a queued input as a turn of its own makes the next
32
+ * prompt `busy`, and this is how a caller waits that out instead of polling.
33
+ */
34
+ export declare function awaitIdle(session: Session): Promise<TurnOutcome | null>;
35
+ export interface PromptRunOptions {
36
+ /** Abort the turn when it has not ended after this long; the run then reports `interrupted` with the runtime's own outcome. */
37
+ readonly timeoutMs?: number;
38
+ /** Abort the turn when this fires (a caller-side cancel), reported the same way. */
39
+ readonly signal?: AbortSignal;
40
+ }
41
+ export type PromptRun =
42
+ /** The prompt did not begin a turn (busy, dead runtime); nothing was waited for. */
43
+ {
27
44
  readonly kind: "rejected";
28
- readonly result: ControlResult;
45
+ readonly result: ControlOutcome;
46
+ readonly code: RejectionCode;
29
47
  readonly reason: string;
30
- } | {
48
+ }
49
+ /** The runtime ended the turn on its own. `text` is the root agent's text of this turn, concatenated. */
50
+ | {
31
51
  readonly kind: "ended";
32
- readonly result: ControlResult;
52
+ readonly result: ControlOutcome;
53
+ readonly outcome: TurnOutcome;
54
+ readonly text: string;
55
+ }
56
+ /** The caller's timeout or signal fired first and the abort was taken over; `outcome` is still the runtime's own turn end. */
57
+ | {
58
+ readonly kind: "interrupted";
59
+ readonly by: "timeout" | "signal";
60
+ readonly result: ControlOutcome;
33
61
  readonly outcome: TurnOutcome;
62
+ readonly text: string;
34
63
  };
35
- /** Prompt, then wait for the runtime to end the turn it opened. A rejected prompt (busy, dead runtime) returns without waiting. */
36
- export declare function promptAndWait(session: Session, input: string): Promise<PromptRun>;
64
+ /**
65
+ * Prompt, then wait for the runtime to end the turn it opened. A rejected
66
+ * prompt returns without waiting. With `timeoutMs` / `signal`, a turn still
67
+ * running when either fires is aborted; the result is `interrupted` only when
68
+ * that abort was taken over. An abort the runtime refuses because the turn
69
+ * had just ended is the ordinary late-abort race, and the run is `ended`.
70
+ * After an accepted abort the turn's end is awaited with no further limit:
71
+ * the outcome is the runtime's word, and a runtime that never gives it is a
72
+ * liveness problem `observeStalls` reports, not one this helper guesses at.
73
+ */
74
+ export declare function promptAndWait(session: Session, input: string, options?: PromptRunOptions): Promise<PromptRun>;
37
75
  //# sourceMappingURL=turns.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"turns.d.ts","sourceRoot":"","sources":["../../src/observe/turns.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE7F;;;;;;;;;;;GAWG;AAEH;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,SAAS,QAAQ,EAAE,EAC5B,QAAQ,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,MAAM,GACjB,WAAW,GAAG,IAAI,CAmBpB;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAgB3F;AAED,MAAM,MAAM,SAAS,GACjB;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACtF;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAA;CAAE,CAAC;AAE9F,mIAAmI;AACnI,wBAAsB,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAQvF"}
1
+ {"version":3,"file":"turns.d.ts","sourceRoot":"","sources":["../../src/observe/turns.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE7G;;;;;;;;;;;GAWG;AAEH;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,SAAS,QAAQ,EAAE,EAC5B,QAAQ,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,MAAM,GACjB,WAAW,GAAG,IAAI,CAmBpB;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAgB3F;AAED;;;;;;;GAOG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAO7E;AAED,MAAM,WAAW,gBAAgB;IAC/B,+HAA+H;IAC/H,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,oFAAoF;IACpF,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;CAC/B;AAED,MAAM,MAAM,SAAS;AACnB,oFAAoF;AAClF;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE;AACvH,yGAAyG;GACvG;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE;AACnH,8HAA8H;GAC5H;IAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,GAAG,QAAQ,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/J;;;;;;;;;GASG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,SAAS,CAAC,CA+BvH"}
@@ -57,14 +57,84 @@ export async function awaitTurnEnd(session, afterSeq) {
57
57
  unsubscribe();
58
58
  return outcome;
59
59
  }
60
- /** Prompt, then wait for the runtime to end the turn it opened. A rejected prompt (busy, dead runtime) returns without waiting. */
61
- export async function promptAndWait(session, input) {
60
+ /**
61
+ * Resolve once the root agent is idle: at once (null) when `session.status()`
62
+ * already says so, otherwise with the outcome of the running turn when it
63
+ * ends. The status is read and the subscription placed through one cursor,
64
+ * so a turn ending in between is not missed. Nothing is prompted here: a
65
+ * runtime that runs a queued input as a turn of its own makes the next
66
+ * prompt `busy`, and this is how a caller waits that out instead of polling.
67
+ */
68
+ export async function awaitIdle(session) {
69
+ const status = session.status();
70
+ if (status.value.kind === "idle") {
71
+ return null;
72
+ }
73
+ const outcome = await awaitTurnEnd(session, status.value.sinceSeq);
74
+ return outcome;
75
+ }
76
+ /**
77
+ * Prompt, then wait for the runtime to end the turn it opened. A rejected
78
+ * prompt returns without waiting. With `timeoutMs` / `signal`, a turn still
79
+ * running when either fires is aborted; the result is `interrupted` only when
80
+ * that abort was taken over. An abort the runtime refuses because the turn
81
+ * had just ended is the ordinary late-abort race, and the run is `ended`.
82
+ * After an accepted abort the turn's end is awaited with no further limit:
83
+ * the outcome is the runtime's word, and a runtime that never gives it is a
84
+ * liveness problem `observeStalls` reports, not one this helper guesses at.
85
+ */
86
+ export async function promptAndWait(session, input, options = {}) {
62
87
  const result = await session.prompt(input);
63
- if (result.response.body.kind !== "accepted") {
64
- const reason = result.response.body.kind === "rejected" ? result.response.body.reason : result.response.body.kind;
65
- return { kind: "rejected", result, reason };
88
+ if (result.kind === "rejected") {
89
+ return { kind: "rejected", result, code: result.code, reason: result.reason };
90
+ }
91
+ let text = "";
92
+ const stopReading = session.rawEvents((record) => {
93
+ if (record.kind === "frame" && record.agentPath.length === 0 && record.sessionId === session.id) {
94
+ for (const event of record.body.events) {
95
+ if (event.kind === "text_delta") {
96
+ text += event.text;
97
+ }
98
+ }
99
+ }
100
+ }, { sessionId: session.id, afterSeq: result.seq });
101
+ const limit = armLimits(options);
102
+ try {
103
+ const ended = awaitTurnEnd(session, result.seq);
104
+ const first = await Promise.race([ended, limit.fired]);
105
+ if (typeof first !== "string") {
106
+ return { kind: "ended", result, outcome: first, text };
107
+ }
108
+ const abort = await session.abort();
109
+ const outcome = await ended;
110
+ return abort.kind === "accepted"
111
+ ? { kind: "interrupted", by: first, result, outcome, text }
112
+ : { kind: "ended", result, outcome, text };
113
+ }
114
+ finally {
115
+ limit.disarm();
116
+ stopReading();
66
117
  }
67
- const outcome = await awaitTurnEnd(session, result.request.seq);
68
- return { kind: "ended", result, outcome };
118
+ }
119
+ /** The caller's limits as one promise that settles with whichever fires first (never, when none is set), and the disarm for when the turn ends first. */
120
+ function armLimits(options) {
121
+ const { promise: fired, resolve } = Promise.withResolvers();
122
+ const timer = options.timeoutMs === undefined ? null : setTimeout(() => { resolve("timeout"); }, options.timeoutMs);
123
+ const onAbort = () => { resolve("signal"); };
124
+ if (options.signal?.aborted === true) {
125
+ onAbort();
126
+ }
127
+ else {
128
+ options.signal?.addEventListener("abort", onAbort, { once: true });
129
+ }
130
+ return {
131
+ fired,
132
+ disarm: () => {
133
+ if (timer !== null) {
134
+ clearTimeout(timer);
135
+ }
136
+ options.signal?.removeEventListener("abort", onAbort);
137
+ },
138
+ };
69
139
  }
70
140
  //# sourceMappingURL=turns.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"turns.js","sourceRoot":"","sources":["../../src/observe/turns.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"turns.js","sourceRoot":"","sources":["../../src/observe/turns.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,8 @@
1
1
  import type { ContextUsage, QueryResult, RawEvent, SessionUsage } from "../contracts/session.js";
2
2
  /** The latest model the runtime reported for the root agent; null before any. */
3
3
  export declare function modelOf(records: readonly RawEvent[], sessionId?: string): QueryResult<string | null>;
4
+ /** The latest reasoning-effort level the runtime reported for the root agent; null before any. */
5
+ export declare function effortOf(records: readonly RawEvent[], sessionId?: string): QueryResult<string | null>;
4
6
  /** The latest context fullness the runtime reported for the root agent; null before any. */
5
7
  export declare function contextUsageOf(records: readonly RawEvent[], sessionId?: string): QueryResult<ContextUsage | null>;
6
8
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../../src/observe/usage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,WAAW,EACX,QAAQ,EACR,YAAY,EAEb,MAAM,yBAAyB,CAAC;AA2BjC,iFAAiF;AACjF,wBAAgB,OAAO,CAAC,OAAO,EAAE,SAAS,QAAQ,EAAE,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,CAYpG;AAED,4FAA4F;AAC5F,wBAAgB,cAAc,CAAC,OAAO,EAAE,SAAS,QAAQ,EAAE,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC,YAAY,GAAG,IAAI,CAAC,CAYjH;AAED;;;;;;;GAOG;AACH,wBAAgB,OAAO,CAAC,OAAO,EAAE,SAAS,QAAQ,EAAE,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC,YAAY,CAAC,CA2BnG"}
1
+ {"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../../src/observe/usage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,WAAW,EACX,QAAQ,EACR,YAAY,EAEb,MAAM,yBAAyB,CAAC;AA2BjC,iFAAiF;AACjF,wBAAgB,OAAO,CAAC,OAAO,EAAE,SAAS,QAAQ,EAAE,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,CAYpG;AAED,kGAAkG;AAClG,wBAAgB,QAAQ,CAAC,OAAO,EAAE,SAAS,QAAQ,EAAE,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,CAYrG;AAED,4FAA4F;AAC5F,wBAAgB,cAAc,CAAC,OAAO,EAAE,SAAS,QAAQ,EAAE,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC,YAAY,GAAG,IAAI,CAAC,CAYjH;AAED;;;;;;;GAOG;AACH,wBAAgB,OAAO,CAAC,OAAO,EAAE,SAAS,QAAQ,EAAE,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC,YAAY,CAAC,CA2BnG"}
@@ -38,6 +38,24 @@ export function modelOf(records, sessionId) {
38
38
  }
39
39
  return { value, seq };
40
40
  }
41
+ /** The latest reasoning-effort level the runtime reported for the root agent; null before any. */
42
+ export function effortOf(records, sessionId) {
43
+ let value = null;
44
+ let seq = -1;
45
+ for (const record of records) {
46
+ if (!inSession(record, sessionId)) {
47
+ continue;
48
+ }
49
+ seq = record.seq;
50
+ if (record.kind === "frame" && record.agentPath.length === 0) {
51
+ const event = record.body.events.findLast((candidate) => candidate.kind === "effort");
52
+ if (event?.kind === "effort") {
53
+ value = event.effort;
54
+ }
55
+ }
56
+ }
57
+ return { value, seq };
58
+ }
41
59
  /** The latest context fullness the runtime reported for the root agent; null before any. */
42
60
  export function contextUsageOf(records, sessionId) {
43
61
  let value = null;
@@ -1 +1 @@
1
- {"version":3,"file":"usage.js","sourceRoot":"","sources":["../../src/observe/usage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"usage.js","sourceRoot":"","sources":["../../src/observe/usage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { type JsonRecord } from "../../shared/json.js";
2
+ /** How long the adapter waits for claude to answer its `get_settings` read-back (after the SessionStart hooks). */
3
+ export declare const CLAUDE_EFFORT_READBACK_MS = 30000;
4
+ /** The `get_settings` control request the adapter writes to stdin, under its own request id. */
5
+ export declare function claudeSettingsRequest(requestId: string): string;
6
+ /** The request id a `control_response` frame answers, or null for any other frame. */
7
+ export declare function claudeControlResponseId(message: JsonRecord): string | null;
8
+ /**
9
+ * Why claude will not run `requested`, read off its `get_settings` answer, or
10
+ * null when `applied.effort` is exactly the requested level. The message
11
+ * names the requested level and what claude said instead.
12
+ */
13
+ export declare function claudeEffortRefusal(requested: string, answer: JsonRecord): string | null;
14
+ //# sourceMappingURL=effort.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"effort.d.ts","sourceRoot":"","sources":["../../../src/runtimes/claude/effort.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAwBjE,mHAAmH;AACnH,eAAO,MAAM,yBAAyB,QAAS,CAAC;AAEhD,gGAAgG;AAChG,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE/D;AAED,sFAAsF;AACtF,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,CAM1E;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,CAmBxF"}
@@ -0,0 +1,62 @@
1
+ import { asRecord } from "../../shared/json.js";
2
+ /*
3
+ * claude's word on the reasoning effort it will run (claude 2.1.284, probed
4
+ * 2026-09-29; experiments/effort-channels.ts):
5
+ * - `--effort <level>` reaches the Messages API as `output_config.effort`,
6
+ * on a new session and on `--resume` alike; without it claude sends its
7
+ * default (`medium`), also on a resume of a session that ran another level:
8
+ * claude keeps no effort per session.
9
+ * - Nothing in the stream-json output names the effort: `system/init` carries
10
+ * only `per_turn_effort_active`, `result` none. An unknown level is dropped
11
+ * with a stderr warning ("Unknown --effort value 'x' — ignoring it and using
12
+ * the default effort"), a model without effort (haiku) sends none, and a
13
+ * `maxEffortLevel` setting or `CLAUDE_CODE_EFFORT_LEVEL` can clamp or
14
+ * override the flag, all silently on stdout.
15
+ * - The one report is the `get_settings` control request, answered before any
16
+ * turn (token-free): `response.applied.effort` is "what will actually be
17
+ * sent to the API" after env overrides, session state and model defaults,
18
+ * `null` when the model takes none. The same answer also carries the merged
19
+ * settings of every source (`effective`, `sources`: hooks, permissions, any
20
+ * `env` block) verbatim, which is why the adapter consumes it instead of
21
+ * recording it (see session.ts).
22
+ */
23
+ /** How long the adapter waits for claude to answer its `get_settings` read-back (after the SessionStart hooks). */
24
+ export const CLAUDE_EFFORT_READBACK_MS = 30_000;
25
+ /** The `get_settings` control request the adapter writes to stdin, under its own request id. */
26
+ export function claudeSettingsRequest(requestId) {
27
+ return `${JSON.stringify({ type: "control_request", request_id: requestId, request: { subtype: "get_settings" } })}\n`;
28
+ }
29
+ /** The request id a `control_response` frame answers, or null for any other frame. */
30
+ export function claudeControlResponseId(message) {
31
+ if (message.type !== "control_response") {
32
+ return null;
33
+ }
34
+ const id = asRecord(message.response)?.request_id;
35
+ return typeof id === "string" ? id : null;
36
+ }
37
+ /**
38
+ * Why claude will not run `requested`, read off its `get_settings` answer, or
39
+ * null when `applied.effort` is exactly the requested level. The message
40
+ * names the requested level and what claude said instead.
41
+ */
42
+ export function claudeEffortRefusal(requested, answer) {
43
+ const response = asRecord(answer.response);
44
+ if (response?.subtype !== "success") {
45
+ const error = typeof response?.error === "string" ? response.error : "no success answer";
46
+ return `claude could not report the effort it runs (get_settings: ${error}), so effort ${requested} cannot be confirmed`;
47
+ }
48
+ const applied = asRecord(asRecord(response.response)?.applied);
49
+ if (applied === null || !("effort" in applied)) {
50
+ return `claude's get_settings answer names no applied effort, so effort ${requested} cannot be confirmed`;
51
+ }
52
+ const model = typeof applied.model === "string" ? ` for ${applied.model}` : "";
53
+ const effort = applied.effort;
54
+ if (effort === requested) {
55
+ return null;
56
+ }
57
+ if (effort === null) {
58
+ return `claude sends no effort${model} (the model takes none), so effort ${requested} would be dropped`;
59
+ }
60
+ return `claude applies effort ${typeof effort === "string" ? effort : JSON.stringify(effort)}${model} although ${requested} was requested`;
61
+ }
62
+ //# sourceMappingURL=effort.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"effort.js","sourceRoot":"","sources":["../../../src/runtimes/claude/effort.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAmB,MAAM,sBAAsB,CAAC;AAEjE;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,mHAAmH;AACnH,MAAM,CAAC,MAAM,yBAAyB,GAAG,MAAM,CAAC;AAEhD,gGAAgG;AAChG,MAAM,UAAU,qBAAqB,CAAC,SAAiB;IACrD,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE,EAAE,CAAC,IAAI,CAAC;AACzH,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,uBAAuB,CAAC,OAAmB;IACzD,IAAI,OAAO,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;QACxC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,UAAU,CAAC;IAClD,OAAO,OAAO,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAC5C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,SAAiB,EAAE,MAAkB;IACvE,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC3C,IAAI,QAAQ,EAAE,OAAO,KAAK,SAAS,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,OAAO,QAAQ,EAAE,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,mBAAmB,CAAC;QACzF,OAAO,6DAA6D,KAAK,gBAAgB,SAAS,sBAAsB,CAAC;IAC3H,CAAC;IACD,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;IAC/D,IAAI,OAAO,KAAK,IAAI,IAAI,CAAC,CAAC,QAAQ,IAAI,OAAO,CAAC,EAAE,CAAC;QAC/C,OAAO,mEAAmE,SAAS,sBAAsB,CAAC;IAC5G,CAAC;IACD,MAAM,KAAK,GAAG,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/E,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC9B,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,OAAO,yBAAyB,KAAK,sCAAsC,SAAS,mBAAmB,CAAC;IAC1G,CAAC;IACD,OAAO,yBAAyB,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,KAAK,aAAa,SAAS,gBAAgB,CAAC;AAC7I,CAAC"}
@@ -187,7 +187,7 @@ export function foldClaudeStdout(state, message) {
187
187
  kind: "respond",
188
188
  requestId,
189
189
  body: response?.subtype === "error" || error !== null
190
- ? { kind: "rejected", reason: error ?? "control request failed", native: message }
190
+ ? { kind: "rejected", code: "runtime_refused", reason: error ?? "control request failed", native: message }
191
191
  : { kind: "accepted", native: message },
192
192
  }] };
193
193
  }