@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.
- package/README.md +4 -2
- package/dist/contracts/records.d.ts +33 -10
- package/dist/contracts/records.d.ts.map +1 -1
- package/dist/contracts/session.d.ts +66 -13
- package/dist/contracts/session.d.ts.map +1 -1
- package/dist/contracts/status.d.ts +25 -0
- package/dist/contracts/status.d.ts.map +1 -0
- package/dist/contracts/status.js +2 -0
- package/dist/contracts/status.js.map +1 -0
- package/dist/index.d.ts +5 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/kernel.d.ts +12 -0
- package/dist/kernel.d.ts.map +1 -0
- package/dist/kernel.js +11 -0
- package/dist/kernel.js.map +1 -0
- package/dist/observe/agent-status.d.ts +4 -18
- package/dist/observe/agent-status.d.ts.map +1 -1
- package/dist/observe/agent-status.js +41 -0
- package/dist/observe/agent-status.js.map +1 -1
- package/dist/observe/events.d.ts.map +1 -1
- package/dist/observe/events.js +1 -2
- package/dist/observe/events.js.map +1 -1
- package/dist/observe/index.d.ts +6 -4
- package/dist/observe/index.d.ts.map +1 -1
- package/dist/observe/index.js +4 -3
- package/dist/observe/index.js.map +1 -1
- package/dist/observe/session-view-events.d.ts +11 -0
- package/dist/observe/session-view-events.d.ts.map +1 -0
- package/dist/observe/session-view-events.js +233 -0
- package/dist/observe/session-view-events.js.map +1 -0
- package/dist/observe/session-view-fold.d.ts +57 -0
- package/dist/observe/session-view-fold.d.ts.map +1 -0
- package/dist/observe/session-view-fold.js +156 -0
- package/dist/observe/session-view-fold.js.map +1 -0
- package/dist/observe/session-view.d.ts +153 -0
- package/dist/observe/session-view.d.ts.map +1 -0
- package/dist/observe/session-view.js +81 -0
- package/dist/observe/session-view.js.map +1 -0
- package/dist/observe/turns.d.ts +45 -7
- package/dist/observe/turns.d.ts.map +1 -1
- package/dist/observe/turns.js +77 -7
- package/dist/observe/turns.js.map +1 -1
- package/dist/observe/usage.d.ts +2 -0
- package/dist/observe/usage.d.ts.map +1 -1
- package/dist/observe/usage.js +18 -0
- package/dist/observe/usage.js.map +1 -1
- package/dist/runtimes/claude/effort.d.ts +14 -0
- package/dist/runtimes/claude/effort.d.ts.map +1 -0
- package/dist/runtimes/claude/effort.js +62 -0
- package/dist/runtimes/claude/effort.js.map +1 -0
- package/dist/runtimes/claude/projection.js +1 -1
- package/dist/runtimes/claude/projection.js.map +1 -1
- package/dist/runtimes/claude/session.d.ts.map +1 -1
- package/dist/runtimes/claude/session.js +46 -6
- package/dist/runtimes/claude/session.js.map +1 -1
- package/dist/runtimes/codex/item-detail.d.ts +2 -0
- package/dist/runtimes/codex/item-detail.d.ts.map +1 -1
- package/dist/runtimes/codex/item-detail.js +12 -5
- package/dist/runtimes/codex/item-detail.js.map +1 -1
- package/dist/runtimes/codex/open.d.ts +42 -0
- package/dist/runtimes/codex/open.d.ts.map +1 -0
- package/dist/runtimes/codex/open.js +116 -0
- package/dist/runtimes/codex/open.js.map +1 -0
- package/dist/runtimes/codex/projection.d.ts.map +1 -1
- package/dist/runtimes/codex/projection.js +29 -4
- package/dist/runtimes/codex/projection.js.map +1 -1
- package/dist/runtimes/codex/session.d.ts.map +1 -1
- package/dist/runtimes/codex/session.js +53 -59
- package/dist/runtimes/codex/session.js.map +1 -1
- package/dist/runtimes/grok/list-models.d.ts +6 -0
- package/dist/runtimes/grok/list-models.d.ts.map +1 -1
- package/dist/runtimes/grok/list-models.js +17 -2
- package/dist/runtimes/grok/list-models.js.map +1 -1
- package/dist/runtimes/kimi/list-models.d.ts +7 -4
- package/dist/runtimes/kimi/list-models.d.ts.map +1 -1
- package/dist/runtimes/kimi/list-models.js +9 -5
- package/dist/runtimes/kimi/list-models.js.map +1 -1
- package/dist/runtimes/pi/installation.d.ts.map +1 -1
- package/dist/runtimes/pi/installation.js +3 -1
- package/dist/runtimes/pi/installation.js.map +1 -1
- package/dist/runtimes/pi/list-models.d.ts +16 -4
- package/dist/runtimes/pi/list-models.d.ts.map +1 -1
- package/dist/runtimes/pi/list-models.js +24 -7
- package/dist/runtimes/pi/list-models.js.map +1 -1
- package/dist/runtimes/pi/open.d.ts +22 -0
- package/dist/runtimes/pi/open.d.ts.map +1 -1
- package/dist/runtimes/pi/open.js +50 -0
- package/dist/runtimes/pi/open.js.map +1 -1
- package/dist/runtimes/pi/projection.d.ts.map +1 -1
- package/dist/runtimes/pi/projection.js +21 -2
- package/dist/runtimes/pi/projection.js.map +1 -1
- package/dist/runtimes/pi/session.d.ts.map +1 -1
- package/dist/runtimes/pi/session.js +14 -12
- package/dist/runtimes/pi/session.js.map +1 -1
- package/dist/shared/acp/effort.d.ts +25 -0
- package/dist/shared/acp/effort.d.ts.map +1 -0
- package/dist/shared/acp/effort.js +47 -0
- package/dist/shared/acp/effort.js.map +1 -0
- package/dist/shared/acp/model.d.ts +19 -0
- package/dist/shared/acp/model.d.ts.map +1 -1
- package/dist/shared/acp/model.js +27 -0
- package/dist/shared/acp/model.js.map +1 -1
- package/dist/shared/acp/profile.d.ts.map +1 -1
- package/dist/shared/acp/profile.js +7 -0
- package/dist/shared/acp/profile.js.map +1 -1
- package/dist/shared/acp/projection.d.ts.map +1 -1
- package/dist/shared/acp/projection.js +37 -3
- package/dist/shared/acp/projection.js.map +1 -1
- package/dist/shared/acp/records.d.ts +1 -1
- package/dist/shared/acp/records.d.ts.map +1 -1
- package/dist/shared/acp/records.js +6 -2
- package/dist/shared/acp/records.js.map +1 -1
- package/dist/shared/acp/session.d.ts.map +1 -1
- package/dist/shared/acp/session.js +4 -4
- package/dist/shared/acp/session.js.map +1 -1
- package/dist/shared/acp/terminal.d.ts.map +1 -1
- package/dist/shared/acp/terminal.js +9 -2
- package/dist/shared/acp/terminal.js.map +1 -1
- package/dist/shared/acp/turns.js +2 -2
- package/dist/shared/acp/turns.js.map +1 -1
- package/dist/shared/executable/index.d.ts +1 -1
- package/dist/shared/executable/index.d.ts.map +1 -1
- package/dist/shared/executable/index.js +1 -1
- package/dist/shared/executable/index.js.map +1 -1
- package/dist/shared/executable/process.d.ts +48 -1
- package/dist/shared/executable/process.d.ts.map +1 -1
- package/dist/shared/executable/process.js +66 -1
- package/dist/shared/executable/process.js.map +1 -1
- package/dist/shared/seal-session.d.ts +15 -7
- package/dist/shared/seal-session.d.ts.map +1 -1
- package/dist/shared/seal-session.js +42 -17
- package/dist/shared/seal-session.js.map +1 -1
- package/dist/shared/session-kernel.d.ts +1 -0
- package/dist/shared/session-kernel.d.ts.map +1 -1
- package/dist/shared/session-kernel.js +3 -3
- package/dist/shared/session-kernel.js.map +1 -1
- package/dist/testing/index.d.ts +8 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +7 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/scripted-runtime.d.ts +50 -0
- package/dist/testing/scripted-runtime.d.ts.map +1 -0
- package/dist/testing/scripted-runtime.js +187 -0
- package/dist/testing/scripted-runtime.js.map +1 -0
- package/dist/voyage.d.ts +2 -0
- package/dist/voyage.d.ts.map +1 -1
- package/dist/voyage.js +4 -1
- package/dist/voyage.js.map +1 -1
- 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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"}
|
package/dist/observe/turns.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
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
|
-
|
|
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:
|
|
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:
|
|
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
|
-
/**
|
|
36
|
-
|
|
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;
|
|
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"}
|
package/dist/observe/turns.js
CHANGED
|
@@ -57,14 +57,84 @@ export async function awaitTurnEnd(session, afterSeq) {
|
|
|
57
57
|
unsubscribe();
|
|
58
58
|
return outcome;
|
|
59
59
|
}
|
|
60
|
-
/**
|
|
61
|
-
|
|
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.
|
|
64
|
-
|
|
65
|
-
|
|
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
|
-
|
|
68
|
-
|
|
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":"AAEA;;;;;;;;;;;GAWG;AAEH;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAC1B,OAA4B,EAC5B,QAAgB,EAChB,SAAkB;IAElB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,MAAM,CAAC,GAAG,IAAI,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1D,SAAS;QACX,CAAC;QACD,IAAI,SAAS,KAAK,SAAS,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YAC9D,SAAS;QACX,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC;YAC9E,IAAI,KAAK,EAAE,IAAI,KAAK,YAAY,EAAE,CAAC;gBACjC,OAAO,KAAK,CAAC,OAAO,CAAC;YACvB,CAAC;QACH,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAChE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,gBAAgB,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC;QACjF,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAgB,EAAE,QAAgB;IACnE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,aAAa,EAAe,CAAC;IAClE,IAAI,IAAI,GAAG,KAAK,CAAC;IACjB,MAAM,WAAW,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,EAAE;QAC/C,IAAI,IAAI,EAAE,CAAC;YACT,OAAO;QACT,CAAC;QACD,MAAM,OAAO,GAAG,YAAY,CAAC,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;QAC7D,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACrB,IAAI,GAAG,IAAI,CAAC;YACZ,OAAO,CAAC,OAAO,CAAC,CAAC;QACnB,CAAC;IACH,CAAC,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC;IAC9B,WAAW,EAAE,CAAC;IACd,OAAO,OAAO,CAAC;AACjB,CAAC;
|
|
1
|
+
{"version":3,"file":"turns.js","sourceRoot":"","sources":["../../src/observe/turns.ts"],"names":[],"mappings":"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"}
|
package/dist/observe/usage.d.ts
CHANGED
|
@@ -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"}
|
package/dist/observe/usage.js
CHANGED
|
@@ -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":"AAQA;;;;;;;;;;;;;;;GAeG;AAEH,SAAS,OAAO,CAAC,SAA4B;IAC3C,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,SAAS,CAAC,MAAgB,EAAE,SAA6B;IAChE,OAAO,SAAS,KAAK,SAAS,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,CAAC;AACnE,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,OAAO,CAAC,OAA4B,EAAE,SAAkB;IACtE,IAAI,KAAK,GAAkB,IAAI,CAAC;IAChC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC;IACb,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,CAAC;YAAC,SAAS;QAAC,CAAC;QAChD,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;QACjB,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7D,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;YACrF,IAAI,KAAK,EAAE,IAAI,KAAK,OAAO,EAAE,CAAC;gBAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;YAAC,CAAC;QACvD,CAAC;IACH,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;AACxB,CAAC;AAED,kGAAkG;AAClG,MAAM,UAAU,QAAQ,CAAC,OAA4B,EAAE,SAAkB;IACvE,IAAI,KAAK,GAAkB,IAAI,CAAC;IAChC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC;IACb,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,CAAC;YAAC,SAAS;QAAC,CAAC;QAChD,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;QACjB,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7D,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;YACtF,IAAI,KAAK,EAAE,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAAC,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;YAAC,CAAC;QACzD,CAAC;IACH,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;AACxB,CAAC;AAED,4FAA4F;AAC5F,MAAM,UAAU,cAAc,CAAC,OAA4B,EAAE,SAAkB;IAC7E,IAAI,KAAK,GAAwB,IAAI,CAAC;IACtC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC;IACb,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,CAAC;YAAC,SAAS;QAAC,CAAC;QAChD,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;QACjB,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7D,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,OAAO,IAAI,SAAS,CAAC,KAAK,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC;YAC9H,IAAI,KAAK,EAAE,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;gBAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC;YAAC,CAAC;QACpG,CAAC;IACH,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;AACxB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,OAAO,CAAC,OAA4B,EAAE,SAAkB;IACtE,MAAM,MAAM,GAAG,IAAI,GAAG,EAAmF,CAAC;IAC1G,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC;IACb,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,CAAC;YAAC,SAAS;QAAC,CAAC;QAChD,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;QACjB,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC5B,SAAS;QACX,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACvC,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBAC/D,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;YACrG,CAAC;QACH,CAAC;IACH,CAAC;IACD,MAAM,OAAO,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACrC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,yEAAyE;QACzE,uCAAuC;QACvC,OAAO,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC;IACzC,CAAC;IACD,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAC1B,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EACrG,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CACxB,CAAC;IACF,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC;IAC/F,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,CAAC;AACnE,CAAC"}
|
|
@@ -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
|
}
|