@buoy-gg/agent-core 7.0.34 → 7.0.36
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 +10 -7
- package/lib/commonjs/blocks/receipts.js +83 -24
- package/lib/commonjs/blocks/receipts.js.map +1 -1
- package/lib/commonjs/blocks/runId.js +31 -0
- package/lib/commonjs/blocks/runId.js.map +1 -0
- package/lib/commonjs/blocks/types.js +23 -2
- package/lib/commonjs/blocks/types.js.map +1 -1
- package/lib/commonjs/blocks/uiTool.js +426 -12
- package/lib/commonjs/blocks/uiTool.js.map +1 -1
- package/lib/commonjs/catalog/catalog.g.js +121 -43
- package/lib/commonjs/catalog/catalog.g.js.map +1 -1
- package/lib/commonjs/catalog/catalog.source.json +121 -45
- package/lib/commonjs/catalog/catalog.types.g.js +44 -0
- package/lib/commonjs/catalog/catalog.types.g.js.map +1 -0
- package/lib/commonjs/catalog/normalizeParams.js +333 -0
- package/lib/commonjs/catalog/normalizeParams.js.map +1 -0
- package/lib/commonjs/catalog/signature.js +68 -0
- package/lib/commonjs/catalog/signature.js.map +1 -0
- package/lib/commonjs/catalog/snapshotReads.js +13 -6
- package/lib/commonjs/catalog/snapshotReads.js.map +1 -1
- package/lib/commonjs/catalog/toProviderTools.js +41 -5
- package/lib/commonjs/catalog/toProviderTools.js.map +1 -1
- package/lib/commonjs/context/buildContextPack.js +367 -19
- package/lib/commonjs/context/buildContextPack.js.map +1 -1
- package/lib/commonjs/effects/digest.js +34 -0
- package/lib/commonjs/effects/digest.js.map +1 -0
- package/lib/commonjs/effects/ledger.js +85 -1
- package/lib/commonjs/effects/ledger.js.map +1 -1
- package/lib/commonjs/engine/askGate.js +287 -0
- package/lib/commonjs/engine/askGate.js.map +1 -0
- package/lib/commonjs/engine/effectFor.js +82 -1
- package/lib/commonjs/engine/effectFor.js.map +1 -1
- package/lib/commonjs/engine/historyBudget.js +260 -0
- package/lib/commonjs/engine/historyBudget.js.map +1 -0
- package/lib/commonjs/engine/runAgentTurn.js +958 -88
- package/lib/commonjs/engine/runAgentTurn.js.map +1 -1
- package/lib/commonjs/engine/systemPrompt.js +72 -8
- package/lib/commonjs/engine/systemPrompt.js.map +1 -1
- package/lib/commonjs/engine/textToolCalls.js +276 -0
- package/lib/commonjs/engine/textToolCalls.js.map +1 -0
- package/lib/commonjs/index.js +81 -1
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/policy/labels.js +19 -3
- package/lib/commonjs/policy/labels.js.map +1 -1
- package/lib/commonjs/policy/policy.js +6 -1
- package/lib/commonjs/policy/policy.js.map +1 -1
- package/lib/commonjs/policy/redact.js +42 -5
- package/lib/commonjs/policy/redact.js.map +1 -1
- package/lib/commonjs/providers/anthropic.js +340 -174
- package/lib/commonjs/providers/anthropic.js.map +1 -1
- package/lib/commonjs/providers/openai.js +229 -103
- package/lib/commonjs/providers/openai.js.map +1 -1
- package/lib/commonjs/providers/sse.js +164 -29
- package/lib/commonjs/providers/sse.js.map +1 -1
- package/lib/commonjs/providers/streamTimer.js +123 -0
- package/lib/commonjs/providers/streamTimer.js.map +1 -0
- package/lib/commonjs/providers/transport.js +107 -0
- package/lib/commonjs/providers/transport.js.map +1 -0
- package/lib/commonjs/providers/xhrStream.js +209 -0
- package/lib/commonjs/providers/xhrStream.js.map +1 -0
- package/lib/commonjs/session.js +245 -52
- package/lib/commonjs/session.js.map +1 -1
- package/lib/module/blocks/receipts.js +83 -24
- package/lib/module/blocks/receipts.js.map +1 -1
- package/lib/module/blocks/runId.js +26 -0
- package/lib/module/blocks/runId.js.map +1 -0
- package/lib/module/blocks/types.js +23 -2
- package/lib/module/blocks/types.js.map +1 -1
- package/lib/module/blocks/uiTool.js +424 -12
- package/lib/module/blocks/uiTool.js.map +1 -1
- package/lib/module/catalog/catalog.g.js +121 -43
- package/lib/module/catalog/catalog.g.js.map +1 -1
- package/lib/module/catalog/catalog.source.json +121 -45
- package/lib/module/catalog/catalog.types.g.js +40 -0
- package/lib/module/catalog/catalog.types.g.js.map +1 -0
- package/lib/module/catalog/normalizeParams.js +327 -0
- package/lib/module/catalog/normalizeParams.js.map +1 -0
- package/lib/module/catalog/signature.js +63 -0
- package/lib/module/catalog/signature.js.map +1 -0
- package/lib/module/catalog/snapshotReads.js +13 -6
- package/lib/module/catalog/snapshotReads.js.map +1 -1
- package/lib/module/catalog/toProviderTools.js +41 -5
- package/lib/module/catalog/toProviderTools.js.map +1 -1
- package/lib/module/context/buildContextPack.js +366 -19
- package/lib/module/context/buildContextPack.js.map +1 -1
- package/lib/module/effects/digest.js +29 -0
- package/lib/module/effects/digest.js.map +1 -0
- package/lib/module/effects/ledger.js +85 -1
- package/lib/module/effects/ledger.js.map +1 -1
- package/lib/module/engine/askGate.js +280 -0
- package/lib/module/engine/askGate.js.map +1 -0
- package/lib/module/engine/effectFor.js +83 -1
- package/lib/module/engine/effectFor.js.map +1 -1
- package/lib/module/engine/historyBudget.js +251 -0
- package/lib/module/engine/historyBudget.js.map +1 -0
- package/lib/module/engine/runAgentTurn.js +954 -88
- package/lib/module/engine/runAgentTurn.js.map +1 -1
- package/lib/module/engine/systemPrompt.js +71 -8
- package/lib/module/engine/systemPrompt.js.map +1 -1
- package/lib/module/engine/textToolCalls.js +270 -0
- package/lib/module/engine/textToolCalls.js.map +1 -0
- package/lib/module/index.js +7 -4
- package/lib/module/index.js.map +1 -1
- package/lib/module/policy/labels.js +19 -3
- package/lib/module/policy/labels.js.map +1 -1
- package/lib/module/policy/policy.js +6 -1
- package/lib/module/policy/policy.js.map +1 -1
- package/lib/module/policy/redact.js +42 -5
- package/lib/module/policy/redact.js.map +1 -1
- package/lib/module/providers/anthropic.js +341 -175
- package/lib/module/providers/anthropic.js.map +1 -1
- package/lib/module/providers/openai.js +230 -104
- package/lib/module/providers/openai.js.map +1 -1
- package/lib/module/providers/sse.js +160 -29
- package/lib/module/providers/sse.js.map +1 -1
- package/lib/module/providers/streamTimer.js +118 -0
- package/lib/module/providers/streamTimer.js.map +1 -0
- package/lib/module/providers/transport.js +103 -0
- package/lib/module/providers/transport.js.map +1 -0
- package/lib/module/providers/xhrStream.js +204 -0
- package/lib/module/providers/xhrStream.js.map +1 -0
- package/lib/module/session.js +228 -54
- package/lib/module/session.js.map +1 -1
- package/lib/typescript/blocks/receipts.d.ts +5 -10
- package/lib/typescript/blocks/receipts.d.ts.map +1 -1
- package/lib/typescript/blocks/runId.d.ts +20 -0
- package/lib/typescript/blocks/runId.d.ts.map +1 -0
- package/lib/typescript/blocks/types.d.ts +23 -2
- package/lib/typescript/blocks/types.d.ts.map +1 -1
- package/lib/typescript/blocks/uiTool.d.ts +11 -2
- package/lib/typescript/blocks/uiTool.d.ts.map +1 -1
- package/lib/typescript/catalog/catalog.g.d.ts.map +1 -1
- package/lib/typescript/catalog/catalog.types.g.d.ts +40 -0
- package/lib/typescript/catalog/catalog.types.g.d.ts.map +1 -0
- package/lib/typescript/catalog/normalizeParams.d.ts +43 -0
- package/lib/typescript/catalog/normalizeParams.d.ts.map +1 -0
- package/lib/typescript/catalog/signature.d.ts +29 -0
- package/lib/typescript/catalog/signature.d.ts.map +1 -0
- package/lib/typescript/catalog/snapshotReads.d.ts.map +1 -1
- package/lib/typescript/catalog/toProviderTools.d.ts +28 -15
- package/lib/typescript/catalog/toProviderTools.d.ts.map +1 -1
- package/lib/typescript/context/buildContextPack.d.ts +24 -2
- package/lib/typescript/context/buildContextPack.d.ts.map +1 -1
- package/lib/typescript/effects/digest.d.ts +10 -0
- package/lib/typescript/effects/digest.d.ts.map +1 -0
- package/lib/typescript/effects/ledger.d.ts +55 -0
- package/lib/typescript/effects/ledger.d.ts.map +1 -1
- package/lib/typescript/engine/askGate.d.ts +29 -0
- package/lib/typescript/engine/askGate.d.ts.map +1 -0
- package/lib/typescript/engine/effectFor.d.ts +6 -1
- package/lib/typescript/engine/effectFor.d.ts.map +1 -1
- package/lib/typescript/engine/historyBudget.d.ts +92 -0
- package/lib/typescript/engine/historyBudget.d.ts.map +1 -0
- package/lib/typescript/engine/runAgentTurn.d.ts +115 -1
- package/lib/typescript/engine/runAgentTurn.d.ts.map +1 -1
- package/lib/typescript/engine/systemPrompt.d.ts +41 -0
- package/lib/typescript/engine/systemPrompt.d.ts.map +1 -1
- package/lib/typescript/engine/textToolCalls.d.ts +58 -0
- package/lib/typescript/engine/textToolCalls.d.ts.map +1 -0
- package/lib/typescript/index.d.ts +8 -5
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/policy/labels.d.ts.map +1 -1
- package/lib/typescript/policy/policy.d.ts.map +1 -1
- package/lib/typescript/policy/redact.d.ts.map +1 -1
- package/lib/typescript/providers/anthropic.d.ts +5 -0
- package/lib/typescript/providers/anthropic.d.ts.map +1 -1
- package/lib/typescript/providers/openai.d.ts +0 -16
- package/lib/typescript/providers/openai.d.ts.map +1 -1
- package/lib/typescript/providers/sse.d.ts +82 -1
- package/lib/typescript/providers/sse.d.ts.map +1 -1
- package/lib/typescript/providers/streamTimer.d.ts +59 -0
- package/lib/typescript/providers/streamTimer.d.ts.map +1 -0
- package/lib/typescript/providers/transport.d.ts +40 -0
- package/lib/typescript/providers/transport.d.ts.map +1 -0
- package/lib/typescript/providers/types.d.ts +116 -3
- package/lib/typescript/providers/types.d.ts.map +1 -1
- package/lib/typescript/providers/xhrStream.d.ts +43 -0
- package/lib/typescript/providers/xhrStream.d.ts.map +1 -0
- package/lib/typescript/session.d.ts +63 -2
- package/lib/typescript/session.d.ts.map +1 -1
- package/package.json +2 -2
package/lib/commonjs/session.js
CHANGED
|
@@ -3,12 +3,32 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
+
Object.defineProperty(exports, "compressConsumed", {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: function () {
|
|
9
|
+
return _historyBudget.compressConsumed;
|
|
10
|
+
}
|
|
11
|
+
});
|
|
6
12
|
exports.createAskBuoySession = createAskBuoySession;
|
|
13
|
+
exports.resumableHistory = resumableHistory;
|
|
14
|
+
Object.defineProperty(exports, "trimHistory", {
|
|
15
|
+
enumerable: true,
|
|
16
|
+
get: function () {
|
|
17
|
+
return _historyBudget.trimHistory;
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
Object.defineProperty(exports, "trimHistoryReport", {
|
|
21
|
+
enumerable: true,
|
|
22
|
+
get: function () {
|
|
23
|
+
return _historyBudget.trimHistoryReport;
|
|
24
|
+
}
|
|
25
|
+
});
|
|
7
26
|
var _catalog = require("./catalog/catalog.g");
|
|
8
27
|
var _buildContextPack = require("./context/buildContextPack");
|
|
9
28
|
var _runAgentTurn = require("./engine/runAgentTurn");
|
|
10
29
|
var _systemPrompt = require("./engine/systemPrompt");
|
|
11
30
|
var _ledger = require("./effects/ledger");
|
|
31
|
+
var _historyBudget = require("./engine/historyBudget");
|
|
12
32
|
var _anthropic = require("./providers/anthropic");
|
|
13
33
|
var _openai = require("./providers/openai");
|
|
14
34
|
var _policy = require("./policy/policy");
|
|
@@ -19,49 +39,91 @@ var _redact = require("./policy/redact");
|
|
|
19
39
|
* This is the one-call surface the UI packages use. It owns the pieces that
|
|
20
40
|
* have to agree with each other across a whole session — the provider, the
|
|
21
41
|
* catalog filtered to what this device can actually do, the system prompt
|
|
22
|
-
* (built once
|
|
42
|
+
* (the stable part built once after grounding, the RIGHT NOW part re-read every
|
|
43
|
+
* turn), the effect ledger, and the message history —
|
|
23
44
|
* so a chat UI is a message list plus a text box rather than an orchestrator.
|
|
24
45
|
*/
|
|
25
46
|
|
|
26
47
|
/**
|
|
27
|
-
* A
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
48
|
+
* A stored history, made safe to send as the start of a new request.
|
|
49
|
+
*
|
|
50
|
+
* Two things make a saved conversation unusable as-is.
|
|
51
|
+
*
|
|
52
|
+
* A history captured mid-turn ends with an assistant message whose `tool_use`
|
|
53
|
+
* blocks were never answered, or with the `tool_result`s and no reply after
|
|
54
|
+
* them. Every provider rejects both: the blocks must pair up. So this rewinds
|
|
55
|
+
* to the last COMPLETE round — an assistant message that made no tool calls,
|
|
56
|
+
* which is where a conversation is always safe to resume from.
|
|
57
|
+
*
|
|
58
|
+
* And thinking blocks are dropped. Anthropic needs them replayed only when the
|
|
59
|
+
* very next thing sent is that turn's `tool_result`s; a restored conversation
|
|
60
|
+
* always resumes with a fresh user message instead, so their signatures are
|
|
61
|
+
* dead weight at best and a stale-signature 400 at worst.
|
|
33
62
|
*/
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
function trimHistory(messages) {
|
|
44
|
-
let total = 0;
|
|
45
|
-
for (const m of messages) total += messageSize(m);
|
|
46
|
-
if (total <= MAX_HISTORY_CHARS) return messages;
|
|
47
|
-
const out = [...messages];
|
|
48
|
-
while (out.length > MIN_KEEP_MESSAGES && total > MAX_HISTORY_CHARS) {
|
|
49
|
-
total -= messageSize(out[0]);
|
|
50
|
-
out.shift();
|
|
51
|
-
while (out.length > MIN_KEEP_MESSAGES && out[0].role !== "user") {
|
|
52
|
-
total -= messageSize(out[0]);
|
|
53
|
-
out.shift();
|
|
54
|
-
}
|
|
63
|
+
// Re-exported: these were defined here before the engine needed them too, and
|
|
64
|
+
// the tests and the package surface still reach them through this module.
|
|
65
|
+
|
|
66
|
+
function resumableHistory(history) {
|
|
67
|
+
let end = history.length;
|
|
68
|
+
while (end > 0) {
|
|
69
|
+
const m = history[end - 1];
|
|
70
|
+
if (m.role === "assistant" && !m.toolCalls?.length) break;
|
|
71
|
+
end -= 1;
|
|
55
72
|
}
|
|
56
|
-
return
|
|
73
|
+
return history.slice(0, end).map(m => m.role === "assistant" && m.thinking ? {
|
|
74
|
+
...m,
|
|
75
|
+
thinking: undefined
|
|
76
|
+
} : m);
|
|
57
77
|
}
|
|
58
78
|
function createAskBuoySession(config) {
|
|
59
79
|
const catalog = config.catalog ?? _catalog.CATALOG;
|
|
60
80
|
const ledger = new _ledger.EffectLedger();
|
|
61
81
|
const policy = config.policy ?? {};
|
|
62
82
|
let messages = [];
|
|
83
|
+
/**
|
|
84
|
+
* Image-URL provenance for the whole conversation, not one turn of it.
|
|
85
|
+
*
|
|
86
|
+
* "Show me the shop as pictures" and "no, actually render them" are two
|
|
87
|
+
* turns; the second has no tool calls of its own, so a per-turn set held
|
|
88
|
+
* nothing and every image was stripped out from under the model. It kept
|
|
89
|
+
* describing artwork that was not on screen. The rule is unchanged — a URL
|
|
90
|
+
* still has to have been READ — the window is just the conversation. Reset
|
|
91
|
+
* with the conversation.
|
|
92
|
+
*/
|
|
93
|
+
const seenUrls = new Set();
|
|
63
94
|
let system;
|
|
64
95
|
let primed = false;
|
|
96
|
+
/** See `setApprovalBypass`. Consulted per turn, never captured. */
|
|
97
|
+
let bypassApproval = false;
|
|
98
|
+
/** See `setReadOnly`. */
|
|
99
|
+
let deviceReadOnly = false;
|
|
100
|
+
/**
|
|
101
|
+
* Rounds dropped by `restore` — reported on the first send, because there is
|
|
102
|
+
* no open turn to carry the event when the restore happens.
|
|
103
|
+
*/
|
|
104
|
+
let trimmedOnRestore = 0;
|
|
105
|
+
/**
|
|
106
|
+
* Which conversation is live. Bumped by `reset`.
|
|
107
|
+
*
|
|
108
|
+
* A turn's history is committed when its generator drains, and a turn does
|
|
109
|
+
* not stop the moment Stop is pressed — an in-flight dispatch has to settle
|
|
110
|
+
* first, and nothing can pull a store write back out of an adapter. So the
|
|
111
|
+
* sequence Stop -> "New conversation" -> the write finishes used to end with
|
|
112
|
+
* the OLD turn assigning its whole history over the empty one: a chat the
|
|
113
|
+
* user had just cleared came back, carrying a change they never saw made.
|
|
114
|
+
* The turn still finishes and its effect still lands in the app; it simply
|
|
115
|
+
* no longer owns a conversation that has moved on.
|
|
116
|
+
*/
|
|
117
|
+
let generation = 0;
|
|
118
|
+
/**
|
|
119
|
+
* The grounding probe's result, held past `prime`.
|
|
120
|
+
*
|
|
121
|
+
* The system prompt is a pure function of this plus the policy, and the
|
|
122
|
+
* approval paragraph changes when the device toggle does — holding the
|
|
123
|
+
* digest lets the prompt be rebuilt without re-probing the app for state it
|
|
124
|
+
* already read.
|
|
125
|
+
*/
|
|
126
|
+
let digest = {};
|
|
65
127
|
/**
|
|
66
128
|
* `storage key -> the live store that owns it`, derived from the grounding.
|
|
67
129
|
*
|
|
@@ -75,16 +137,62 @@ function createAskBuoySession(config) {
|
|
|
75
137
|
// So the agent's own requests to the model endpoint never come back to it
|
|
76
138
|
// out of the network tool — that would feed it its own auth headers.
|
|
77
139
|
(0, _redact.registerSelfEndpoint)(config.endpoint);
|
|
78
|
-
const provider = config.protocol === "openai" ? (0, _openai.createOpenAIProvider)(config) : (0, _anthropic.createAnthropicProvider)(config);
|
|
140
|
+
const provider = config.provider ?? (config.protocol === "openai" ? (0, _openai.createOpenAIProvider)(config) : (0, _anthropic.createAnthropicProvider)(config));
|
|
79
141
|
|
|
80
142
|
// Mutable: the device's tool list fills in over the first frames and can
|
|
81
143
|
// change while the sheet is open. See setAvailableActions.
|
|
82
144
|
let availableActions = config.availableActions;
|
|
83
145
|
let availableToolIds = Object.keys(availableActions);
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* THE policy object the engine reads, mutated in place.
|
|
149
|
+
*
|
|
150
|
+
* One object for the life of the session, not a fresh one per turn: the
|
|
151
|
+
* engine reads `policy.readOnly` and the approval lists at each call, so a
|
|
152
|
+
* toggle flipped mid-turn lands on the very next call of that turn. A new
|
|
153
|
+
* object per turn would leave a running turn on the old rules until it
|
|
154
|
+
* finished — "Read only" switched on while the agent was writing would let
|
|
155
|
+
* the rest of the batch through.
|
|
156
|
+
*/
|
|
157
|
+
const live = {
|
|
158
|
+
...policy
|
|
159
|
+
};
|
|
160
|
+
function refreshLive() {
|
|
161
|
+
for (const k of Object.keys(live)) delete live[k];
|
|
162
|
+
Object.assign(live, policy);
|
|
163
|
+
if (bypassApproval) {
|
|
164
|
+
live.requireApproval = [];
|
|
165
|
+
live.requireApprovalFor = [];
|
|
166
|
+
}
|
|
167
|
+
// OR, never override: the device can narrow, the app's own read-only stands.
|
|
168
|
+
if (deviceReadOnly) live.readOnly = true;
|
|
169
|
+
}
|
|
170
|
+
function activePolicy() {
|
|
171
|
+
return live;
|
|
172
|
+
}
|
|
173
|
+
function composeSystem() {
|
|
174
|
+
system = (0, _systemPrompt.buildSystemPrompt)({
|
|
175
|
+
catalog,
|
|
176
|
+
context: {
|
|
177
|
+
...config.context,
|
|
178
|
+
digest: {
|
|
179
|
+
...digest,
|
|
180
|
+
...config.context?.digest
|
|
181
|
+
}
|
|
182
|
+
},
|
|
183
|
+
isRelease: config.isRelease,
|
|
184
|
+
readOnly: live.readOnly ?? false,
|
|
185
|
+
readOnlySource: policy.readOnly ? "app" : deviceReadOnly ? "device" : undefined,
|
|
186
|
+
requireApproval: (0, _policy.resolveRequireApproval)(live),
|
|
187
|
+
approvalsBypassed: bypassApproval,
|
|
188
|
+
appName: config.appName,
|
|
189
|
+
platform: config.platform
|
|
190
|
+
});
|
|
191
|
+
}
|
|
84
192
|
async function prime() {
|
|
85
193
|
if (primed) return;
|
|
86
194
|
primed = true;
|
|
87
|
-
|
|
195
|
+
digest = {};
|
|
88
196
|
try {
|
|
89
197
|
digest = await (0, _buildContextPack.buildContextDigest)({
|
|
90
198
|
dispatch: config.dispatch,
|
|
@@ -101,21 +209,7 @@ function createAskBuoySession(config) {
|
|
|
101
209
|
const store = raw;
|
|
102
210
|
if (store?.persistsTo && store.name) storeKeyOwners[store.persistsTo] = store.name;
|
|
103
211
|
}
|
|
104
|
-
|
|
105
|
-
catalog,
|
|
106
|
-
context: {
|
|
107
|
-
...config.context,
|
|
108
|
-
digest: {
|
|
109
|
-
...digest,
|
|
110
|
-
...config.context?.digest
|
|
111
|
-
}
|
|
112
|
-
},
|
|
113
|
-
isRelease: config.isRelease,
|
|
114
|
-
readOnly: policy.readOnly ?? false,
|
|
115
|
-
requireApproval: (0, _policy.resolveRequireApproval)(policy),
|
|
116
|
-
appName: config.appName,
|
|
117
|
-
platform: config.platform
|
|
118
|
-
});
|
|
212
|
+
composeSystem();
|
|
119
213
|
}
|
|
120
214
|
return {
|
|
121
215
|
ledger,
|
|
@@ -127,29 +221,122 @@ function createAskBuoySession(config) {
|
|
|
127
221
|
availableActions = actions;
|
|
128
222
|
availableToolIds = Object.keys(actions);
|
|
129
223
|
},
|
|
224
|
+
setApprovalBypass(enabled) {
|
|
225
|
+
if (bypassApproval === enabled) return;
|
|
226
|
+
bypassApproval = enabled;
|
|
227
|
+
refreshLive();
|
|
228
|
+
// The prompt tells the model whether a card will appear before its
|
|
229
|
+
// change lands; leaving that paragraph stale would have it announce an
|
|
230
|
+
// approval step that no longer exists. Rebuilt from the held digest, so
|
|
231
|
+
// toggling mid-conversation costs nothing and re-reads nothing.
|
|
232
|
+
if (system) composeSystem();
|
|
233
|
+
},
|
|
234
|
+
setReadOnly(enabled) {
|
|
235
|
+
if (deviceReadOnly === enabled) return;
|
|
236
|
+
deviceReadOnly = enabled;
|
|
237
|
+
refreshLive();
|
|
238
|
+
if (system) composeSystem();
|
|
239
|
+
},
|
|
240
|
+
restore(history) {
|
|
241
|
+
// Only into a session that has not been talked to. Restoring over a live
|
|
242
|
+
// conversation would drop whatever was said since the app started.
|
|
243
|
+
if (messages.length > 0) return;
|
|
244
|
+
const report = (0, _historyBudget.trimHistoryReport)(resumableHistory(history));
|
|
245
|
+
messages = report.messages;
|
|
246
|
+
trimmedOnRestore = report.droppedRounds;
|
|
247
|
+
},
|
|
130
248
|
async *send(text, signal) {
|
|
249
|
+
/**
|
|
250
|
+
* Captured FIRST, before any await.
|
|
251
|
+
*
|
|
252
|
+
* Priming and the live-context probes are awaits like any other, and a
|
|
253
|
+
* reset can land inside them. Reading the generation after them would
|
|
254
|
+
* pick up the NEW conversation's value and let this turn commit into it —
|
|
255
|
+
* the precise bug this guards against, reintroduced one line lower.
|
|
256
|
+
*/
|
|
257
|
+
const myGeneration = generation;
|
|
131
258
|
await prime();
|
|
132
|
-
|
|
259
|
+
// The RIGHT NOW block: re-read on EVERY turn, not once at open. The
|
|
260
|
+
// stable digest above was once the whole picture, and it was built
|
|
261
|
+
// before the user had navigated anywhere — so the query that owned the
|
|
262
|
+
// screen they were looking at was simply not in the prompt. This is the
|
|
263
|
+
// uncached tail of the system prompt (see ProviderRequest.systemVolatile).
|
|
264
|
+
let live;
|
|
265
|
+
try {
|
|
266
|
+
live = await (0, _buildContextPack.buildLiveContext)({
|
|
267
|
+
dispatch: config.dispatch,
|
|
268
|
+
readSnapshot: config.readSnapshot,
|
|
269
|
+
availableToolIds,
|
|
270
|
+
availableActions
|
|
271
|
+
});
|
|
272
|
+
} catch {
|
|
273
|
+
live = undefined;
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* The conversation was cleared while this turn was still getting ready.
|
|
277
|
+
*
|
|
278
|
+
* Priming and the live probes take real time, so "New conversation"
|
|
279
|
+
* lands here often enough to matter. Abandoning now costs nothing: the
|
|
280
|
+
* model has not been asked anything yet.
|
|
281
|
+
*/
|
|
282
|
+
if (myGeneration !== generation) {
|
|
283
|
+
yield {
|
|
284
|
+
type: "done"
|
|
285
|
+
};
|
|
286
|
+
return;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
/**
|
|
290
|
+
* The turn works on its OWN array, and `messages` is assigned in exactly
|
|
291
|
+
* one place — the commit at the bottom.
|
|
292
|
+
*
|
|
293
|
+
* `runAgentTurn` pushes each round into the array it is handed. Handing
|
|
294
|
+
* it the session's own array made every push a live edit of session
|
|
295
|
+
* state, so a turn racing a reset wrote its whole history into the new
|
|
296
|
+
* conversation one push at a time and the commit guard had nothing left
|
|
297
|
+
* to protect. Copying makes ownership checkable in one place instead of
|
|
298
|
+
* spread across the loop.
|
|
299
|
+
*/
|
|
300
|
+
const trimmed = (0, _historyBudget.trimHistoryReport)([...messages, {
|
|
133
301
|
role: "user",
|
|
134
302
|
text
|
|
135
|
-
});
|
|
136
|
-
|
|
303
|
+
}]);
|
|
304
|
+
const working = trimmed.messages;
|
|
305
|
+
// Said once, before the answer it affects. The screen still shows the
|
|
306
|
+
// rounds the model just lost; this is the only thing that tells the two
|
|
307
|
+
// apart. See the `history-trimmed` event.
|
|
308
|
+
const droppedRounds = trimmed.droppedRounds + trimmedOnRestore;
|
|
309
|
+
trimmedOnRestore = 0;
|
|
310
|
+
if (droppedRounds > 0) yield {
|
|
311
|
+
type: "history-trimmed",
|
|
312
|
+
droppedRounds
|
|
313
|
+
};
|
|
137
314
|
const gen = (0, _runAgentTurn.runAgentTurn)({
|
|
138
315
|
provider,
|
|
139
316
|
catalog,
|
|
140
|
-
messages,
|
|
317
|
+
messages: working,
|
|
141
318
|
system: system,
|
|
319
|
+
systemVolatile: (0, _systemPrompt.buildLiveBlock)(live,
|
|
320
|
+
// What this conversation has already done to the app. See
|
|
321
|
+
// buildLiveBlock — without it the model answers "what have you
|
|
322
|
+
// changed?" from memory of its own sentences, and reports a value it
|
|
323
|
+
// overwrote itself as the app's own.
|
|
324
|
+
ledger.list().map(e => ({
|
|
325
|
+
label: `${e.toolId}.${e.action}${e.effect.label ? ` — ${e.effect.label}` : ""}`,
|
|
326
|
+
undone: e.undoneAt !== undefined
|
|
327
|
+
}))),
|
|
142
328
|
model: config.model,
|
|
143
329
|
maxTokens: config.maxTokens ?? 4096,
|
|
144
330
|
dispatch: config.dispatch,
|
|
145
331
|
readSnapshot: config.readSnapshot,
|
|
146
332
|
storeKeyOwners,
|
|
147
333
|
ledger,
|
|
148
|
-
policy,
|
|
334
|
+
policy: activePolicy(),
|
|
149
335
|
isRelease: config.isRelease,
|
|
150
336
|
availableToolIds,
|
|
151
337
|
availableActions,
|
|
152
338
|
requestApproval: config.requestApproval,
|
|
339
|
+
seenUrls,
|
|
153
340
|
signal
|
|
154
341
|
});
|
|
155
342
|
let next = await gen.next();
|
|
@@ -158,11 +345,17 @@ function createAskBuoySession(config) {
|
|
|
158
345
|
next = await gen.next();
|
|
159
346
|
}
|
|
160
347
|
// The generator's return value is the full history including tool turns.
|
|
161
|
-
|
|
348
|
+
// Committed only if this turn still owns the conversation — see
|
|
349
|
+
// `generation`.
|
|
350
|
+
if (myGeneration === generation) messages = next.value;
|
|
162
351
|
},
|
|
163
352
|
reset() {
|
|
353
|
+
// Before anything else: a turn still draining must not commit over this.
|
|
354
|
+
generation += 1;
|
|
164
355
|
messages = [];
|
|
356
|
+
trimmedOnRestore = 0;
|
|
165
357
|
ledger.clear();
|
|
358
|
+
seenUrls.clear();
|
|
166
359
|
// The grounding digest is a snapshot of the app AT OPEN — stores and
|
|
167
360
|
// routes registered since are invisible to it. A new conversation is
|
|
168
361
|
// the natural moment to re-read the world.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_catalog","require","_buildContextPack","_runAgentTurn","_systemPrompt","_ledger","_anthropic","_openai","_policy","_redact","
|
|
1
|
+
{"version":3,"names":["_catalog","require","_buildContextPack","_runAgentTurn","_systemPrompt","_ledger","_historyBudget","_anthropic","_openai","_policy","_redact","resumableHistory","history","end","length","m","role","toolCalls","slice","map","thinking","undefined","createAskBuoySession","config","catalog","CATALOG","ledger","EffectLedger","policy","messages","seenUrls","Set","system","primed","bypassApproval","deviceReadOnly","trimmedOnRestore","generation","digest","storeKeyOwners","registerSelfEndpoint","endpoint","provider","protocol","createOpenAIProvider","createAnthropicProvider","availableActions","availableToolIds","Object","keys","live","refreshLive","k","assign","requireApproval","requireApprovalFor","readOnly","activePolicy","composeSystem","buildSystemPrompt","context","isRelease","readOnlySource","resolveRequireApproval","approvalsBypassed","appName","platform","prime","buildContextDigest","dispatch","readSnapshot","raw","zustandStores","store","persistsTo","name","setAvailableActions","actions","setApprovalBypass","enabled","setReadOnly","restore","report","trimHistoryReport","droppedRounds","send","text","signal","myGeneration","buildLiveContext","type","trimmed","working","gen","runAgentTurn","systemVolatile","buildLiveBlock","list","e","label","toolId","action","effect","undone","undoneAt","model","maxTokens","requestApproval","next","done","value","reset","clear"],"sourceRoot":"../../src","sources":["session.ts"],"mappings":"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","ignoreList":[]}
|