@buoy-gg/agent-core 7.0.33
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/LICENSE +58 -0
- package/README.md +42 -0
- package/lib/commonjs/blocks/receipts.js +702 -0
- package/lib/commonjs/blocks/receipts.js.map +1 -0
- package/lib/commonjs/blocks/types.js +119 -0
- package/lib/commonjs/blocks/types.js.map +1 -0
- package/lib/commonjs/blocks/uiTool.js +994 -0
- package/lib/commonjs/blocks/uiTool.js.map +1 -0
- package/lib/commonjs/catalog/catalog.g.js +4044 -0
- package/lib/commonjs/catalog/catalog.g.js.map +1 -0
- package/lib/commonjs/catalog/catalog.source.json +4956 -0
- package/lib/commonjs/catalog/snapshotReads.js +256 -0
- package/lib/commonjs/catalog/snapshotReads.js.map +1 -0
- package/lib/commonjs/catalog/toProviderTools.js +107 -0
- package/lib/commonjs/catalog/toProviderTools.js.map +1 -0
- package/lib/commonjs/catalog/validateParams.js +129 -0
- package/lib/commonjs/catalog/validateParams.js.map +1 -0
- package/lib/commonjs/context/buildContextPack.js +141 -0
- package/lib/commonjs/context/buildContextPack.js.map +1 -0
- package/lib/commonjs/effects/ledger.js +229 -0
- package/lib/commonjs/effects/ledger.js.map +1 -0
- package/lib/commonjs/engine/effectFor.js +95 -0
- package/lib/commonjs/engine/effectFor.js.map +1 -0
- package/lib/commonjs/engine/runAgentTurn.js +667 -0
- package/lib/commonjs/engine/runAgentTurn.js.map +1 -0
- package/lib/commonjs/engine/systemPrompt.js +86 -0
- package/lib/commonjs/engine/systemPrompt.js.map +1 -0
- package/lib/commonjs/index.js +288 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/package.json +1 -0
- package/lib/commonjs/policy/labels.js +303 -0
- package/lib/commonjs/policy/labels.js.map +1 -0
- package/lib/commonjs/policy/policy.js +143 -0
- package/lib/commonjs/policy/policy.js.map +1 -0
- package/lib/commonjs/policy/redact.js +135 -0
- package/lib/commonjs/policy/redact.js.map +1 -0
- package/lib/commonjs/providers/anthropic.js +272 -0
- package/lib/commonjs/providers/anthropic.js.map +1 -0
- package/lib/commonjs/providers/openai.js +193 -0
- package/lib/commonjs/providers/openai.js.map +1 -0
- package/lib/commonjs/providers/sse.js +104 -0
- package/lib/commonjs/providers/sse.js.map +1 -0
- package/lib/commonjs/providers/types.js +6 -0
- package/lib/commonjs/providers/types.js.map +1 -0
- package/lib/commonjs/session.js +173 -0
- package/lib/commonjs/session.js.map +1 -0
- package/lib/commonjs/types.js +2 -0
- package/lib/commonjs/types.js.map +1 -0
- package/lib/module/blocks/receipts.js +696 -0
- package/lib/module/blocks/receipts.js.map +1 -0
- package/lib/module/blocks/types.js +113 -0
- package/lib/module/blocks/types.js.map +1 -0
- package/lib/module/blocks/uiTool.js +987 -0
- package/lib/module/blocks/uiTool.js.map +1 -0
- package/lib/module/catalog/catalog.g.js +4040 -0
- package/lib/module/catalog/catalog.g.js.map +1 -0
- package/lib/module/catalog/catalog.source.json +4956 -0
- package/lib/module/catalog/snapshotReads.js +252 -0
- package/lib/module/catalog/snapshotReads.js.map +1 -0
- package/lib/module/catalog/toProviderTools.js +101 -0
- package/lib/module/catalog/toProviderTools.js.map +1 -0
- package/lib/module/catalog/validateParams.js +124 -0
- package/lib/module/catalog/validateParams.js.map +1 -0
- package/lib/module/context/buildContextPack.js +138 -0
- package/lib/module/context/buildContextPack.js.map +1 -0
- package/lib/module/effects/ledger.js +223 -0
- package/lib/module/effects/ledger.js.map +1 -0
- package/lib/module/engine/effectFor.js +91 -0
- package/lib/module/engine/effectFor.js.map +1 -0
- package/lib/module/engine/runAgentTurn.js +663 -0
- package/lib/module/engine/runAgentTurn.js.map +1 -0
- package/lib/module/engine/systemPrompt.js +82 -0
- package/lib/module/engine/systemPrompt.js.map +1 -0
- package/lib/module/index.js +30 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/policy/labels.js +296 -0
- package/lib/module/policy/labels.js.map +1 -0
- package/lib/module/policy/policy.js +137 -0
- package/lib/module/policy/policy.js.map +1 -0
- package/lib/module/policy/redact.js +128 -0
- package/lib/module/policy/redact.js.map +1 -0
- package/lib/module/providers/anthropic.js +268 -0
- package/lib/module/providers/anthropic.js.map +1 -0
- package/lib/module/providers/openai.js +189 -0
- package/lib/module/providers/openai.js.map +1 -0
- package/lib/module/providers/sse.js +99 -0
- package/lib/module/providers/sse.js.map +1 -0
- package/lib/module/providers/types.js +4 -0
- package/lib/module/providers/types.js.map +1 -0
- package/lib/module/session.js +168 -0
- package/lib/module/session.js.map +1 -0
- package/lib/module/types.js +2 -0
- package/lib/module/types.js.map +1 -0
- package/lib/typescript/blocks/receipts.d.ts +32 -0
- package/lib/typescript/blocks/receipts.d.ts.map +1 -0
- package/lib/typescript/blocks/types.d.ts +576 -0
- package/lib/typescript/blocks/types.d.ts.map +1 -0
- package/lib/typescript/blocks/uiTool.d.ts +15 -0
- package/lib/typescript/blocks/uiTool.d.ts.map +1 -0
- package/lib/typescript/catalog/catalog.g.d.ts +11 -0
- package/lib/typescript/catalog/catalog.g.d.ts.map +1 -0
- package/lib/typescript/catalog/snapshotReads.d.ts +37 -0
- package/lib/typescript/catalog/snapshotReads.d.ts.map +1 -0
- package/lib/typescript/catalog/toProviderTools.d.ts +52 -0
- package/lib/typescript/catalog/toProviderTools.d.ts.map +1 -0
- package/lib/typescript/catalog/validateParams.d.ts +33 -0
- package/lib/typescript/catalog/validateParams.d.ts.map +1 -0
- package/lib/typescript/context/buildContextPack.d.ts +32 -0
- package/lib/typescript/context/buildContextPack.d.ts.map +1 -0
- package/lib/typescript/effects/ledger.d.ts +119 -0
- package/lib/typescript/effects/ledger.d.ts.map +1 -0
- package/lib/typescript/engine/effectFor.d.ts +21 -0
- package/lib/typescript/engine/effectFor.d.ts.map +1 -0
- package/lib/typescript/engine/runAgentTurn.d.ts +140 -0
- package/lib/typescript/engine/runAgentTurn.d.ts.map +1 -0
- package/lib/typescript/engine/systemPrompt.d.ts +49 -0
- package/lib/typescript/engine/systemPrompt.d.ts.map +1 -0
- package/lib/typescript/index.d.ts +29 -0
- package/lib/typescript/index.d.ts.map +1 -0
- package/lib/typescript/policy/labels.d.ts +10 -0
- package/lib/typescript/policy/labels.d.ts.map +1 -0
- package/lib/typescript/policy/policy.d.ts +106 -0
- package/lib/typescript/policy/policy.d.ts.map +1 -0
- package/lib/typescript/policy/redact.d.ts +37 -0
- package/lib/typescript/policy/redact.d.ts.map +1 -0
- package/lib/typescript/providers/anthropic.d.ts +22 -0
- package/lib/typescript/providers/anthropic.d.ts.map +1 -0
- package/lib/typescript/providers/openai.d.ts +19 -0
- package/lib/typescript/providers/openai.d.ts.map +1 -0
- package/lib/typescript/providers/sse.d.ts +18 -0
- package/lib/typescript/providers/sse.d.ts.map +1 -0
- package/lib/typescript/providers/types.d.ts +129 -0
- package/lib/typescript/providers/types.d.ts.map +1 -0
- package/lib/typescript/session.d.ts +58 -0
- package/lib/typescript/session.d.ts.map +1 -0
- package/lib/typescript/types.d.ts +119 -0
- package/lib/typescript/types.d.ts.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* SSE reading, with the React Native reality baked in.
|
|
5
|
+
*
|
|
6
|
+
* RN's built-in `fetch` does not implement `response.body`. Under Expo you get
|
|
7
|
+
* a real `ReadableStream` because `expo/fetch` is the global — but
|
|
8
|
+
* `EXPO_PUBLIC_USE_RN_FETCH=1` reverts that, and the bare-RN, NativeScript and
|
|
9
|
+
* TV-CLI lanes never had it. So `readSse` degrades to reading the whole body
|
|
10
|
+
* and replaying it as events rather than failing: a non-streaming answer is a
|
|
11
|
+
* slower chat, while a hard failure is no chat at all.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
function* parseChunk(buffer) {
|
|
15
|
+
let rest = buffer;
|
|
16
|
+
let idx;
|
|
17
|
+
// Frames are separated by a blank line. \r\n\r\n is legal too.
|
|
18
|
+
while ((idx = rest.search(/\r?\n\r?\n/)) !== -1) {
|
|
19
|
+
const raw = rest.slice(0, idx);
|
|
20
|
+
rest = rest.slice(idx + (rest[idx] === "\r" ? 4 : 2));
|
|
21
|
+
let event;
|
|
22
|
+
const dataLines = [];
|
|
23
|
+
for (const line of raw.split(/\r?\n/)) {
|
|
24
|
+
if (line.startsWith(":")) continue; // comment / keepalive
|
|
25
|
+
if (line.startsWith("event:")) event = line.slice(6).trim();else if (line.startsWith("data:")) dataLines.push(line.slice(5).replace(/^ /, ""));
|
|
26
|
+
}
|
|
27
|
+
if (dataLines.length) yield {
|
|
28
|
+
event,
|
|
29
|
+
data: dataLines.join("\n")
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
return rest;
|
|
33
|
+
}
|
|
34
|
+
export async function* readSse(response) {
|
|
35
|
+
const body = response.body;
|
|
36
|
+
if (!body || typeof body.getReader !== "function") {
|
|
37
|
+
// No streaming on this platform — read it all, then replay.
|
|
38
|
+
const text = await response.text();
|
|
39
|
+
let rest = "";
|
|
40
|
+
const gen = parseChunk(text + "\n\n");
|
|
41
|
+
let next = gen.next();
|
|
42
|
+
while (!next.done) {
|
|
43
|
+
yield next.value;
|
|
44
|
+
next = gen.next();
|
|
45
|
+
}
|
|
46
|
+
rest = next.value;
|
|
47
|
+
if (rest.trim()) {
|
|
48
|
+
const tail = parseChunk(rest + "\n\n");
|
|
49
|
+
let t = tail.next();
|
|
50
|
+
while (!t.done) {
|
|
51
|
+
yield t.value;
|
|
52
|
+
t = tail.next();
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
const reader = body.getReader();
|
|
58
|
+
const decoder = new TextDecoder();
|
|
59
|
+
let buffer = "";
|
|
60
|
+
try {
|
|
61
|
+
for (;;) {
|
|
62
|
+
const {
|
|
63
|
+
done,
|
|
64
|
+
value
|
|
65
|
+
} = await reader.read();
|
|
66
|
+
if (done) break;
|
|
67
|
+
buffer += decoder.decode(value, {
|
|
68
|
+
stream: true
|
|
69
|
+
});
|
|
70
|
+
const gen = parseChunk(buffer);
|
|
71
|
+
let next = gen.next();
|
|
72
|
+
while (!next.done) {
|
|
73
|
+
yield next.value;
|
|
74
|
+
next = gen.next();
|
|
75
|
+
}
|
|
76
|
+
buffer = next.value;
|
|
77
|
+
}
|
|
78
|
+
} finally {
|
|
79
|
+
// Cancelling on abort keeps the socket from lingering after the user
|
|
80
|
+
// closes the sheet mid-answer.
|
|
81
|
+
try {
|
|
82
|
+
reader.releaseLock();
|
|
83
|
+
} catch {
|
|
84
|
+
/* already released */
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/** Body text for a failed response, trimmed to something a user can read. */
|
|
90
|
+
export async function errorBody(response) {
|
|
91
|
+
let detail = "";
|
|
92
|
+
try {
|
|
93
|
+
detail = (await response.text()).slice(0, 600);
|
|
94
|
+
} catch {
|
|
95
|
+
/* body already consumed or unreadable */
|
|
96
|
+
}
|
|
97
|
+
return `HTTP ${response.status}${detail ? ` — ${detail}` : ""}`;
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=sse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["parseChunk","buffer","rest","idx","search","raw","slice","event","dataLines","line","split","startsWith","trim","push","replace","length","data","join","readSse","response","body","getReader","text","gen","next","done","value","tail","t","reader","decoder","TextDecoder","read","decode","stream","releaseLock","errorBody","detail","status"],"sourceRoot":"../../../src","sources":["providers/sse.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAOA,UAAUA,UAAUA,CAACC,MAAc,EAAqC;EACtE,IAAIC,IAAI,GAAGD,MAAM;EACjB,IAAIE,GAAW;EACf;EACA,OAAO,CAACA,GAAG,GAAGD,IAAI,CAACE,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,EAAE;IAC/C,MAAMC,GAAG,GAAGH,IAAI,CAACI,KAAK,CAAC,CAAC,EAAEH,GAAG,CAAC;IAC9BD,IAAI,GAAGA,IAAI,CAACI,KAAK,CAACH,GAAG,IAAID,IAAI,CAACC,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAErD,IAAII,KAAyB;IAC7B,MAAMC,SAAmB,GAAG,EAAE;IAC9B,KAAK,MAAMC,IAAI,IAAIJ,GAAG,CAACK,KAAK,CAAC,OAAO,CAAC,EAAE;MACrC,IAAID,IAAI,CAACE,UAAU,CAAC,GAAG,CAAC,EAAE,SAAS,CAAC;MACpC,IAAIF,IAAI,CAACE,UAAU,CAAC,QAAQ,CAAC,EAAEJ,KAAK,GAAGE,IAAI,CAACH,KAAK,CAAC,CAAC,CAAC,CAACM,IAAI,CAAC,CAAC,CAAC,KACvD,IAAIH,IAAI,CAACE,UAAU,CAAC,OAAO,CAAC,EAAEH,SAAS,CAACK,IAAI,CAACJ,IAAI,CAACH,KAAK,CAAC,CAAC,CAAC,CAACQ,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACpF;IACA,IAAIN,SAAS,CAACO,MAAM,EAAE,MAAM;MAAER,KAAK;MAAES,IAAI,EAAER,SAAS,CAACS,IAAI,CAAC,IAAI;IAAE,CAAC;EACnE;EACA,OAAOf,IAAI;AACb;AAEA,OAAO,gBAAgBgB,OAAOA,CAC5BC,QAAkB,EACoB;EACtC,MAAMC,IAAI,GAAID,QAAQ,CAAkDC,IAAI;EAE5E,IAAI,CAACA,IAAI,IAAI,OAAOA,IAAI,CAACC,SAAS,KAAK,UAAU,EAAE;IACjD;IACA,MAAMC,IAAI,GAAG,MAAMH,QAAQ,CAACG,IAAI,CAAC,CAAC;IAClC,IAAIpB,IAAI,GAAG,EAAE;IACb,MAAMqB,GAAG,GAAGvB,UAAU,CAACsB,IAAI,GAAG,MAAM,CAAC;IACrC,IAAIE,IAAI,GAAGD,GAAG,CAACC,IAAI,CAAC,CAAC;IACrB,OAAO,CAACA,IAAI,CAACC,IAAI,EAAE;MACjB,MAAMD,IAAI,CAACE,KAAK;MAChBF,IAAI,GAAGD,GAAG,CAACC,IAAI,CAAC,CAAC;IACnB;IACAtB,IAAI,GAAGsB,IAAI,CAACE,KAAK;IACjB,IAAIxB,IAAI,CAACU,IAAI,CAAC,CAAC,EAAE;MACf,MAAMe,IAAI,GAAG3B,UAAU,CAACE,IAAI,GAAG,MAAM,CAAC;MACtC,IAAI0B,CAAC,GAAGD,IAAI,CAACH,IAAI,CAAC,CAAC;MACnB,OAAO,CAACI,CAAC,CAACH,IAAI,EAAE;QACd,MAAMG,CAAC,CAACF,KAAK;QACbE,CAAC,GAAGD,IAAI,CAACH,IAAI,CAAC,CAAC;MACjB;IACF;IACA;EACF;EAEA,MAAMK,MAAM,GAAGT,IAAI,CAACC,SAAS,CAAC,CAAC;EAC/B,MAAMS,OAAO,GAAG,IAAIC,WAAW,CAAC,CAAC;EACjC,IAAI9B,MAAM,GAAG,EAAE;EACf,IAAI;IACF,SAAS;MACP,MAAM;QAAEwB,IAAI;QAAEC;MAAM,CAAC,GAAG,MAAMG,MAAM,CAACG,IAAI,CAAC,CAAC;MAC3C,IAAIP,IAAI,EAAE;MACVxB,MAAM,IAAI6B,OAAO,CAACG,MAAM,CAACP,KAAK,EAAE;QAAEQ,MAAM,EAAE;MAAK,CAAC,CAAC;MACjD,MAAMX,GAAG,GAAGvB,UAAU,CAACC,MAAM,CAAC;MAC9B,IAAIuB,IAAI,GAAGD,GAAG,CAACC,IAAI,CAAC,CAAC;MACrB,OAAO,CAACA,IAAI,CAACC,IAAI,EAAE;QACjB,MAAMD,IAAI,CAACE,KAAK;QAChBF,IAAI,GAAGD,GAAG,CAACC,IAAI,CAAC,CAAC;MACnB;MACAvB,MAAM,GAAGuB,IAAI,CAACE,KAAK;IACrB;EACF,CAAC,SAAS;IACR;IACA;IACA,IAAI;MACFG,MAAM,CAACM,WAAW,CAAC,CAAC;IACtB,CAAC,CAAC,MAAM;MACN;IAAA;EAEJ;AACF;;AAEA;AACA,OAAO,eAAeC,SAASA,CAACjB,QAAkB,EAAmB;EACnE,IAAIkB,MAAM,GAAG,EAAE;EACf,IAAI;IACFA,MAAM,GAAG,CAAC,MAAMlB,QAAQ,CAACG,IAAI,CAAC,CAAC,EAAEhB,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;EAChD,CAAC,CAAC,MAAM;IACN;EAAA;EAEF,OAAO,QAAQa,QAAQ,CAACmB,MAAM,GAAGD,MAAM,GAAG,MAAMA,MAAM,EAAE,GAAG,EAAE,EAAE;AACjE","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sourceRoot":"../../../src","sources":["providers/types.ts"],"mappings":"","ignoreList":[]}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* A conversation, with everything wired up.
|
|
5
|
+
*
|
|
6
|
+
* This is the one-call surface the UI packages use. It owns the pieces that
|
|
7
|
+
* have to agree with each other across a whole session — the provider, the
|
|
8
|
+
* catalog filtered to what this device can actually do, the system prompt
|
|
9
|
+
* (built once, after grounding), the effect ledger, and the message history —
|
|
10
|
+
* so a chat UI is a message list plus a text box rather than an orchestrator.
|
|
11
|
+
*/
|
|
12
|
+
import { CATALOG } from "./catalog/catalog.g";
|
|
13
|
+
import { buildContextDigest } from "./context/buildContextPack";
|
|
14
|
+
import { runAgentTurn } from "./engine/runAgentTurn";
|
|
15
|
+
import { buildSystemPrompt } from "./engine/systemPrompt";
|
|
16
|
+
import { EffectLedger } from "./effects/ledger";
|
|
17
|
+
import { createAnthropicProvider } from "./providers/anthropic";
|
|
18
|
+
import { createOpenAIProvider } from "./providers/openai";
|
|
19
|
+
import { resolveRequireApproval } from "./policy/policy";
|
|
20
|
+
import { registerSelfEndpoint } from "./policy/redact";
|
|
21
|
+
/**
|
|
22
|
+
* A long QA session must not die on the provider's context limit with an
|
|
23
|
+
* opaque error — the transcript grows without bound (tool results are the
|
|
24
|
+
* heavy part), so the OLDEST rounds are dropped once the history passes a
|
|
25
|
+
* budget. Rounds are dropped whole — a round starts at a user message — so
|
|
26
|
+
* the assistant/tool-result pairing every provider requires stays intact and
|
|
27
|
+
* the history still begins with a user message.
|
|
28
|
+
*/
|
|
29
|
+
const MAX_HISTORY_CHARS = 150_000;
|
|
30
|
+
const MIN_KEEP_MESSAGES = 4;
|
|
31
|
+
function messageSize(m) {
|
|
32
|
+
try {
|
|
33
|
+
return JSON.stringify(m).length;
|
|
34
|
+
} catch {
|
|
35
|
+
return 0;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function trimHistory(messages) {
|
|
39
|
+
let total = 0;
|
|
40
|
+
for (const m of messages) total += messageSize(m);
|
|
41
|
+
if (total <= MAX_HISTORY_CHARS) return messages;
|
|
42
|
+
const out = [...messages];
|
|
43
|
+
while (out.length > MIN_KEEP_MESSAGES && total > MAX_HISTORY_CHARS) {
|
|
44
|
+
total -= messageSize(out[0]);
|
|
45
|
+
out.shift();
|
|
46
|
+
while (out.length > MIN_KEEP_MESSAGES && out[0].role !== "user") {
|
|
47
|
+
total -= messageSize(out[0]);
|
|
48
|
+
out.shift();
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return out;
|
|
52
|
+
}
|
|
53
|
+
export function createAskBuoySession(config) {
|
|
54
|
+
const catalog = config.catalog ?? CATALOG;
|
|
55
|
+
const ledger = new EffectLedger();
|
|
56
|
+
const policy = config.policy ?? {};
|
|
57
|
+
let messages = [];
|
|
58
|
+
let system;
|
|
59
|
+
let primed = false;
|
|
60
|
+
/**
|
|
61
|
+
* `storage key -> the live store that owns it`, derived from the grounding.
|
|
62
|
+
*
|
|
63
|
+
* Kept because the prompt alone is advice, and a cheap model skips advice the
|
|
64
|
+
* same way it skips an optional parameter. With this the ENGINE can tell,
|
|
65
|
+
* at dispatch time, that a storage write landed on a store's saved copy and
|
|
66
|
+
* therefore changed nothing the user can see.
|
|
67
|
+
*/
|
|
68
|
+
let storeKeyOwners = {};
|
|
69
|
+
|
|
70
|
+
// So the agent's own requests to the model endpoint never come back to it
|
|
71
|
+
// out of the network tool — that would feed it its own auth headers.
|
|
72
|
+
registerSelfEndpoint(config.endpoint);
|
|
73
|
+
const provider = config.protocol === "openai" ? createOpenAIProvider(config) : createAnthropicProvider(config);
|
|
74
|
+
|
|
75
|
+
// Mutable: the device's tool list fills in over the first frames and can
|
|
76
|
+
// change while the sheet is open. See setAvailableActions.
|
|
77
|
+
let availableActions = config.availableActions;
|
|
78
|
+
let availableToolIds = Object.keys(availableActions);
|
|
79
|
+
async function prime() {
|
|
80
|
+
if (primed) return;
|
|
81
|
+
primed = true;
|
|
82
|
+
let digest = {};
|
|
83
|
+
try {
|
|
84
|
+
digest = await buildContextDigest({
|
|
85
|
+
dispatch: config.dispatch,
|
|
86
|
+
readSnapshot: config.readSnapshot,
|
|
87
|
+
availableToolIds,
|
|
88
|
+
availableActions
|
|
89
|
+
});
|
|
90
|
+
} catch {
|
|
91
|
+
// Grounding is an optimisation. A chat with no digest still works; a
|
|
92
|
+
// chat that refuses to open because a probe timed out does not.
|
|
93
|
+
}
|
|
94
|
+
storeKeyOwners = {};
|
|
95
|
+
for (const raw of digest.zustandStores ?? []) {
|
|
96
|
+
const store = raw;
|
|
97
|
+
if (store?.persistsTo && store.name) storeKeyOwners[store.persistsTo] = store.name;
|
|
98
|
+
}
|
|
99
|
+
system = buildSystemPrompt({
|
|
100
|
+
catalog,
|
|
101
|
+
context: {
|
|
102
|
+
...config.context,
|
|
103
|
+
digest: {
|
|
104
|
+
...digest,
|
|
105
|
+
...config.context?.digest
|
|
106
|
+
}
|
|
107
|
+
},
|
|
108
|
+
isRelease: config.isRelease,
|
|
109
|
+
readOnly: policy.readOnly ?? false,
|
|
110
|
+
requireApproval: resolveRequireApproval(policy),
|
|
111
|
+
appName: config.appName,
|
|
112
|
+
platform: config.platform
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
return {
|
|
116
|
+
ledger,
|
|
117
|
+
get messages() {
|
|
118
|
+
return messages;
|
|
119
|
+
},
|
|
120
|
+
prime,
|
|
121
|
+
setAvailableActions(actions) {
|
|
122
|
+
availableActions = actions;
|
|
123
|
+
availableToolIds = Object.keys(actions);
|
|
124
|
+
},
|
|
125
|
+
async *send(text, signal) {
|
|
126
|
+
await prime();
|
|
127
|
+
messages.push({
|
|
128
|
+
role: "user",
|
|
129
|
+
text
|
|
130
|
+
});
|
|
131
|
+
messages = trimHistory(messages);
|
|
132
|
+
const gen = runAgentTurn({
|
|
133
|
+
provider,
|
|
134
|
+
catalog,
|
|
135
|
+
messages,
|
|
136
|
+
system: system,
|
|
137
|
+
model: config.model,
|
|
138
|
+
maxTokens: config.maxTokens ?? 4096,
|
|
139
|
+
dispatch: config.dispatch,
|
|
140
|
+
readSnapshot: config.readSnapshot,
|
|
141
|
+
storeKeyOwners,
|
|
142
|
+
ledger,
|
|
143
|
+
policy,
|
|
144
|
+
isRelease: config.isRelease,
|
|
145
|
+
availableToolIds,
|
|
146
|
+
availableActions,
|
|
147
|
+
requestApproval: config.requestApproval,
|
|
148
|
+
signal
|
|
149
|
+
});
|
|
150
|
+
let next = await gen.next();
|
|
151
|
+
while (!next.done) {
|
|
152
|
+
yield next.value;
|
|
153
|
+
next = await gen.next();
|
|
154
|
+
}
|
|
155
|
+
// The generator's return value is the full history including tool turns.
|
|
156
|
+
messages = next.value;
|
|
157
|
+
},
|
|
158
|
+
reset() {
|
|
159
|
+
messages = [];
|
|
160
|
+
ledger.clear();
|
|
161
|
+
// The grounding digest is a snapshot of the app AT OPEN — stores and
|
|
162
|
+
// routes registered since are invisible to it. A new conversation is
|
|
163
|
+
// the natural moment to re-read the world.
|
|
164
|
+
primed = false;
|
|
165
|
+
}
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["CATALOG","buildContextDigest","runAgentTurn","buildSystemPrompt","EffectLedger","createAnthropicProvider","createOpenAIProvider","resolveRequireApproval","registerSelfEndpoint","MAX_HISTORY_CHARS","MIN_KEEP_MESSAGES","messageSize","m","JSON","stringify","length","trimHistory","messages","total","out","shift","role","createAskBuoySession","config","catalog","ledger","policy","system","primed","storeKeyOwners","endpoint","provider","protocol","availableActions","availableToolIds","Object","keys","prime","digest","dispatch","readSnapshot","raw","zustandStores","store","persistsTo","name","context","isRelease","readOnly","requireApproval","appName","platform","setAvailableActions","actions","send","text","signal","push","gen","model","maxTokens","requestApproval","next","done","value","reset","clear"],"sourceRoot":"../../src","sources":["session.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sourceRoot":"../../src","sources":["types.ts"],"mappings":"","ignoreList":[]}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Receipts — blocks the engine builds from tool results, deterministically.
|
|
3
|
+
*
|
|
4
|
+
* The model never authors these, so they cannot hallucinate, and a weak model
|
|
5
|
+
* cannot fail to produce them. They render the SAME redacted result the model
|
|
6
|
+
* gets, so what the user sees and what the model reasons about are one thing.
|
|
7
|
+
*
|
|
8
|
+
* Every projector is small and honest about caps: it truncates and records
|
|
9
|
+
* `total` so the renderer can say "+38 more" truthfully.
|
|
10
|
+
*/
|
|
11
|
+
import { type Block } from "./types";
|
|
12
|
+
/** Shallow diff of two plain objects: top-level keys that differ. */
|
|
13
|
+
export declare function shallowDiff(before: unknown, after: unknown): {
|
|
14
|
+
path: string;
|
|
15
|
+
before?: unknown;
|
|
16
|
+
after?: unknown;
|
|
17
|
+
}[];
|
|
18
|
+
export interface ReceiptInput {
|
|
19
|
+
toolId: string;
|
|
20
|
+
action: string;
|
|
21
|
+
params: Record<string, unknown>;
|
|
22
|
+
result: unknown;
|
|
23
|
+
/** From captureBefore, when the engine read the prior value. */
|
|
24
|
+
before?: unknown;
|
|
25
|
+
effect: "read" | "write" | "destructive";
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* The receipt for one successful call, or nothing. Adding a projector is the
|
|
29
|
+
* whole job of making a tool's result visible — no UI change needed.
|
|
30
|
+
*/
|
|
31
|
+
export declare function projectReceipt(input: ReceiptInput): Block | undefined;
|
|
32
|
+
//# sourceMappingURL=receipts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"receipts.d.ts","sourceRoot":"","sources":["../../../src/blocks/receipts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAQ,KAAK,KAAK,EAAwC,MAAM,SAAS,CAAC;AAqCjF,qEAAqE;AACrE,wBAAgB,WAAW,CACzB,MAAM,EAAE,OAAO,EACf,KAAK,EAAE,OAAO,GACb;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,EAAE,CAYvD;AAiCD,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,MAAM,EAAE,OAAO,CAAC;IAChB,gEAAgE;IAChE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,aAAa,CAAC;CAC1C;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,YAAY,GAAG,KAAK,GAAG,SAAS,CA8frE"}
|