@buoy-gg/agent-core 7.0.35 → 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 +57 -1
- package/lib/commonjs/blocks/receipts.js.map +1 -1
- package/lib/commonjs/blocks/types.js +23 -2
- package/lib/commonjs/blocks/types.js.map +1 -1
- package/lib/commonjs/blocks/uiTool.js +423 -10
- 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 +924 -83
- 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 +58 -0
- 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 +331 -208
- 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 +215 -58
- package/lib/commonjs/session.js.map +1 -1
- package/lib/module/blocks/receipts.js +57 -1
- package/lib/module/blocks/receipts.js.map +1 -1
- package/lib/module/blocks/types.js +23 -2
- package/lib/module/blocks/types.js.map +1 -1
- package/lib/module/blocks/uiTool.js +421 -10
- 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 +920 -83
- 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 +5 -3
- 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 +332 -209
- 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 +199 -60
- package/lib/module/session.js.map +1 -1
- package/lib/typescript/blocks/receipts.d.ts +5 -0
- package/lib/typescript/blocks/receipts.d.ts.map +1 -1
- 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 +83 -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 +5 -3
- 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.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 +91 -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 +40 -2
- package/lib/typescript/session.d.ts.map +1 -1
- package/package.json +2 -2
|
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.EffectLedger = void 0;
|
|
7
7
|
exports.isReversible = isReversible;
|
|
8
|
+
var _digest = require("./digest");
|
|
8
9
|
/**
|
|
9
10
|
* The effect ledger — what the agent changed, and how to put it back.
|
|
10
11
|
*
|
|
@@ -42,7 +43,32 @@ let seq = 0;
|
|
|
42
43
|
class EffectLedger {
|
|
43
44
|
entries = [];
|
|
44
45
|
listeners = new Set();
|
|
45
|
-
|
|
46
|
+
gen = 0;
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Which conversation this ledger is holding, bumped by `clear`.
|
|
50
|
+
*
|
|
51
|
+
* A turn captures it when it starts and hands it back on every `record`.
|
|
52
|
+
* Nothing about a dispatch can be pulled back once it is in flight, so a
|
|
53
|
+
* write that settles after the user has already tapped "New conversation"
|
|
54
|
+
* still lands in the app — but it must not land in the NEW conversation's
|
|
55
|
+
* undo bar, which is what happened: reset cleared the ledger, the old
|
|
56
|
+
* write finished a moment later, and an empty chat came up owning a change
|
|
57
|
+
* nobody in it had made. Recording it here would be worse than dropping it,
|
|
58
|
+
* because Undo would then offer to reverse something the user cannot see.
|
|
59
|
+
*/
|
|
60
|
+
get generation() {
|
|
61
|
+
return this.gen;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* @param generation The value of `generation` when the turn began. Omit for
|
|
66
|
+
* a human-initiated action, which is by definition happening now — and which
|
|
67
|
+
* therefore always returns an entry.
|
|
68
|
+
*/
|
|
69
|
+
|
|
70
|
+
record(toolId, action, effect, generation) {
|
|
71
|
+
if (generation !== undefined && generation !== this.gen) return undefined;
|
|
46
72
|
const entry = {
|
|
47
73
|
id: `fx-${++seq}-${Date.now()}`,
|
|
48
74
|
at: Date.now(),
|
|
@@ -62,6 +88,27 @@ class EffectLedger {
|
|
|
62
88
|
return this.entries;
|
|
63
89
|
}
|
|
64
90
|
|
|
91
|
+
/**
|
|
92
|
+
* Put back the entries of a conversation that outlived the app.
|
|
93
|
+
*
|
|
94
|
+
* The ledger is the ONLY undo surface, and it used to die with the JS
|
|
95
|
+
* context: after a reload the transcript came back — receipt cards, "saved"
|
|
96
|
+
* lines and all — while the changes bar quietly vanished and the changes
|
|
97
|
+
* themselves stayed applied. "New conversation" warns before losing that
|
|
98
|
+
* ("Clearing the conversation loses the only automatic undo for it"); a
|
|
99
|
+
* reload took the same thing without asking.
|
|
100
|
+
*
|
|
101
|
+
* Refuses once anything has been recorded, for the same reason `hydrate`
|
|
102
|
+
* refuses a live transcript: a late disk read must not shuffle old entries
|
|
103
|
+
* in among changes made since.
|
|
104
|
+
*/
|
|
105
|
+
restore(entries) {
|
|
106
|
+
if (this.entries.length > 0 || entries.length === 0) return false;
|
|
107
|
+
this.entries = [...entries];
|
|
108
|
+
this.emit();
|
|
109
|
+
return true;
|
|
110
|
+
}
|
|
111
|
+
|
|
65
112
|
/** New array identity for the snapshot after entries were mutated in place. */
|
|
66
113
|
touch() {
|
|
67
114
|
this.entries = [...this.entries];
|
|
@@ -88,6 +135,9 @@ class EffectLedger {
|
|
|
88
135
|
}
|
|
89
136
|
clear() {
|
|
90
137
|
this.entries = [];
|
|
138
|
+
// Anything a turn already in flight is about to record belongs to the
|
|
139
|
+
// conversation being thrown away, not to the one replacing it.
|
|
140
|
+
this.gen += 1;
|
|
91
141
|
this.emit();
|
|
92
142
|
}
|
|
93
143
|
|
|
@@ -185,6 +235,40 @@ class EffectLedger {
|
|
|
185
235
|
}
|
|
186
236
|
break;
|
|
187
237
|
}
|
|
238
|
+
case "query-write":
|
|
239
|
+
{
|
|
240
|
+
// Same concurrent-writer guard as storage, but the usual "other
|
|
241
|
+
// writer" here is the app itself refetching — in which case the
|
|
242
|
+
// server's data is already back and there is nothing to undo.
|
|
243
|
+
if (fx.wroteDigest !== undefined) {
|
|
244
|
+
try {
|
|
245
|
+
const current = await dispatch("query", "getQueryData", {
|
|
246
|
+
queryHash: fx.queryHash
|
|
247
|
+
});
|
|
248
|
+
if (current?.found === true) {
|
|
249
|
+
const now = current.hasData === false ? undefined : (0, _digest.digestOf)(current.data);
|
|
250
|
+
if (now !== fx.wroteDigest) {
|
|
251
|
+
return "The app has refetched or changed this query since Ask Buoy wrote it — left the newer data alone";
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
} catch {
|
|
255
|
+
/* unreadable now; proceed with the restore */
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
const outcome = await (fx.before === undefined ? dispatch("query", "invalidate", {
|
|
259
|
+
queryHash: fx.queryHash
|
|
260
|
+
}) : dispatch("query", "setQueryData", {
|
|
261
|
+
queryHash: fx.queryHash,
|
|
262
|
+
data: fx.before,
|
|
263
|
+
// The whole prior value, verbatim: the drop-a-field guard is
|
|
264
|
+
// for edits, and this is a restore of what the guard protects.
|
|
265
|
+
force: true
|
|
266
|
+
}));
|
|
267
|
+
if (outcome && typeof outcome === "object" && outcome.ok === false) {
|
|
268
|
+
return typeof outcome.error === "string" ? outcome.error : "The query could not be restored";
|
|
269
|
+
}
|
|
270
|
+
break;
|
|
271
|
+
}
|
|
188
272
|
case "state-write":
|
|
189
273
|
return "This change can't be undone automatically";
|
|
190
274
|
case "transient":
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["isReversible","effect","kind","seq","EffectLedger","entries","listeners","Set","record","toolId","action","entry","id","Date","now","at","emit","list","touch","reversible","filter","e","undoneAt","transients","isEmpty","every","
|
|
1
|
+
{"version":3,"names":["_digest","require","isReversible","effect","kind","seq","EffectLedger","entries","listeners","Set","gen","generation","record","toolId","action","undefined","entry","id","Date","now","at","emit","list","restore","length","touch","reversible","filter","e","undoneAt","transients","isEmpty","every","subscribe","fn","add","delete","clear","noteExternalRevert","params","changed","mark","match","undoError","ruleId","revertOne","dispatch","fx","scope","instanceId","wrote","readAction","current","key","rec","value","found","before","removeAction","wroteDigest","queryHash","hasData","digestOf","data","outcome","force","ok","error","err","msg","Error","message","String","revertAll","reverted","failed","skippedTransients","pending","reverse","push","label","exports"],"sourceRoot":"../../../src","sources":["effects/ledger.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.ACQUISITION_CALLS = void 0;
|
|
7
|
+
exports.synthesizeAskBlock = synthesizeAskBlock;
|
|
8
|
+
exports.synthesizeShortfallBlock = synthesizeShortfallBlock;
|
|
9
|
+
var _runId = require("../blocks/runId");
|
|
10
|
+
/**
|
|
11
|
+
* The last guarantee of a turn: when the turn ends WAITING ON THE USER, the
|
|
12
|
+
* user gets something to tap.
|
|
13
|
+
*
|
|
14
|
+
* `buoy_ui` has had choice/confirm/input since the start and the prompt has
|
|
15
|
+
* asked for them since the start, and models still end turns waiting in prose.
|
|
16
|
+
* Two off a real device, a day apart:
|
|
17
|
+
*
|
|
18
|
+
* Want me to add an Eevee line to the bag?
|
|
19
|
+
* If you want a Blastoise in there, tell me the level
|
|
20
|
+
* (Lv. 5, Lv. 25 or Lv. 50) and how many, and I'll add it.
|
|
21
|
+
*
|
|
22
|
+
* The first is a question. The SECOND IS NOT — no question mark anywhere, the
|
|
23
|
+
* ask is an imperative, and the model had already written the options out. A
|
|
24
|
+
* gate that keys on "?" catches one of these, which is why this one keys on
|
|
25
|
+
* the ask instead: an offer to act, or a request for a value.
|
|
26
|
+
*
|
|
27
|
+
* Deliberately narrow, in this order:
|
|
28
|
+
*
|
|
29
|
+
* - It reads only the LAST sentence of the turn. A question the model asked
|
|
30
|
+
* and then answered itself is not waiting on anybody.
|
|
31
|
+
* - Options the model ALREADY enumerated win. "(Lv. 5, Lv. 25 or Lv. 50)" is
|
|
32
|
+
* the model doing the work and writing it in the wrong place.
|
|
33
|
+
* - Then a clean either-or, split into its two halves.
|
|
34
|
+
* - Then Yes/No, but only for an offer to ACT ("I can add it if you'd like").
|
|
35
|
+
* A request for a value it could not enumerate — "tell me the level" —
|
|
36
|
+
* produces NOTHING. Yes/No against "tell me the level" is worse than the
|
|
37
|
+
* sentence it replaced, and the composer is already a text field.
|
|
38
|
+
*
|
|
39
|
+
* ENGLISH ONLY, AND DELIBERATELY FAIL-SAFE. Both patterns are English, tuned
|
|
40
|
+
* to sentences observed in an English demo app, and there is no honest way to
|
|
41
|
+
* make a regex multilingual. What saves this from being an overfit that ships
|
|
42
|
+
* to everyone is the direction it fails in: no match returns null, the model's
|
|
43
|
+
* own prose question stands, and the user answers it in the composer exactly
|
|
44
|
+
* as they would have. A non-English app loses the extra card; it does not get
|
|
45
|
+
* a wrong one. Do not "fix" that by loosening the patterns — a false positive
|
|
46
|
+
* turns a finished answer into a spurious question, which is the one outcome
|
|
47
|
+
* worse than no card at all.
|
|
48
|
+
*
|
|
49
|
+
* It emits a `choice`, never a `confirm`: choice carries the question in the
|
|
50
|
+
* field `questionBehind` reads after a restore, renders in the neutral tone
|
|
51
|
+
* rather than the warning one, and keeps the "or just type your answer"
|
|
52
|
+
* escape. A synthesized card must never look like an approval.
|
|
53
|
+
*
|
|
54
|
+
* The block is authored AFTER the assistant message and carries no tool call,
|
|
55
|
+
* so nothing enters the provider history: there is no `tool_use` to answer and
|
|
56
|
+
* no `tool_result` to orphan. The user's tap becomes their next message
|
|
57
|
+
* exactly as a model-authored block's would.
|
|
58
|
+
*/
|
|
59
|
+
|
|
60
|
+
const nextId = (0, _runId.idFactory)("ask");
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* An offer to DO something, waiting on yes or no. Includes the trailing
|
|
64
|
+
* conditional models close with — "I can add it **if you'd like**" — which is
|
|
65
|
+
* the same offer with the question mark filed off.
|
|
66
|
+
*/
|
|
67
|
+
const OFFER = /\b(?:want me to|would you like me to|would you like|do you want me to|do you want|should i|shall i|ok(?:ay)? if i|say the word|let me know if|if you'?d (?:like|prefer)|if you want)\b/i;
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* A request for a VALUE the engine cannot invent: "tell me the level", "just
|
|
71
|
+
* say which one". Distinguished from "let me know IF you want…", which is an
|
|
72
|
+
* offer, by what follows the verb.
|
|
73
|
+
*/
|
|
74
|
+
const VALUE_ASK = /\b(?:tell me|let me know|just say|say|give me|pick|choose)\s+(?:the|which|what|how|your|one)\b/i;
|
|
75
|
+
const ASK = new RegExp(`${OFFER.source}|${VALUE_ASK.source}`, "i");
|
|
76
|
+
|
|
77
|
+
/** Markdown and quoting the model wrapped the sentence in. */
|
|
78
|
+
const TRAILING_MARKUP = /[*_`"'’”\s]+$/;
|
|
79
|
+
const LEADING_MARKUP = /^[*_`>\-\s]+/;
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* A sentence boundary that survives "Lv. 5".
|
|
83
|
+
*
|
|
84
|
+
* A terminator only ends a sentence when what follows starts one — a capital
|
|
85
|
+
* or an opening quote. `.` before a digit or a lowercase word is an
|
|
86
|
+
* abbreviation, and splitting there tore the Blastoise sentence into five.
|
|
87
|
+
*/
|
|
88
|
+
const SENTENCE_END = /[.!?]["'’”)\]]*\s+(?=[A-Z("'“])|\n+/;
|
|
89
|
+
|
|
90
|
+
/** "add it to the cart, or just show you the item" → two halves. */
|
|
91
|
+
const OR_SPLIT = /,?\s+or\s+/i;
|
|
92
|
+
|
|
93
|
+
/** A list the model already wrote out: "(Lv. 5, Lv. 25 or Lv. 50)". */
|
|
94
|
+
const PARENTHETICAL = /\(([^()]{3,140})\)/;
|
|
95
|
+
const LIST_SPLIT = /\s*,\s*|\s+or\s+/i;
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* A half that reads as a button. Clause punctuation means the split landed
|
|
99
|
+
* inside a list ("a, b or c") rather than between two real alternatives.
|
|
100
|
+
*/
|
|
101
|
+
const CLEAN_LABEL = /^[A-Za-z0-9][^,;:—–]*$/;
|
|
102
|
+
/** Looser: an enumerated option was already a list item, so commas are gone. */
|
|
103
|
+
const CLEAN_OPTION = /^[A-Za-z0-9$][^;:—–()]*$/;
|
|
104
|
+
const YES_NO = [{
|
|
105
|
+
id: "yes",
|
|
106
|
+
label: "Yes, go ahead"
|
|
107
|
+
}, {
|
|
108
|
+
id: "no",
|
|
109
|
+
label: "No thanks"
|
|
110
|
+
}];
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* The block a turn should have ended with, or null to leave the prose alone.
|
|
114
|
+
*
|
|
115
|
+
* `text` is everything the model said this turn, rounds joined in order.
|
|
116
|
+
*/
|
|
117
|
+
function synthesizeAskBlock(text) {
|
|
118
|
+
const sentence = lastSentence(text);
|
|
119
|
+
if (!sentence || sentence.length < 8 || sentence.length > 240) return null;
|
|
120
|
+
const ask = ASK.exec(sentence);
|
|
121
|
+
if (!ask) return null;
|
|
122
|
+
|
|
123
|
+
// 1. The model already wrote the options; they were just in the wrong place.
|
|
124
|
+
const listed = enumerated(sentence);
|
|
125
|
+
if (listed) return {
|
|
126
|
+
id: nextId(),
|
|
127
|
+
kind: "choice",
|
|
128
|
+
question: sentence,
|
|
129
|
+
options: listed
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
// 2. Two real alternatives, after the verb that offered them.
|
|
133
|
+
const after = sentence.slice(ask.index + ask[0].length).replace(/[?.!,]+$/, "").trim();
|
|
134
|
+
const halves = after ? after.split(OR_SPLIT) : [];
|
|
135
|
+
if (halves.length > 2) return null;
|
|
136
|
+
if (halves.length === 2) {
|
|
137
|
+
const alt = alternatives(halves);
|
|
138
|
+
return alt ? {
|
|
139
|
+
id: nextId(),
|
|
140
|
+
kind: "choice",
|
|
141
|
+
question: sentence,
|
|
142
|
+
options: alt
|
|
143
|
+
} : null;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// 3. Yes or no — but only for an offer to act. A value it could not
|
|
147
|
+
// enumerate stays prose; the composer is already a text field.
|
|
148
|
+
if (VALUE_ASK.test(sentence) || !OFFER.test(sentence)) return null;
|
|
149
|
+
return {
|
|
150
|
+
id: nextId(),
|
|
151
|
+
kind: "choice",
|
|
152
|
+
question: sentence,
|
|
153
|
+
options: YES_NO
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
function lastSentence(text) {
|
|
157
|
+
const trimmed = text.replace(TRAILING_MARKUP, "").trim();
|
|
158
|
+
if (!trimmed) return null;
|
|
159
|
+
const parts = trimmed.split(SENTENCE_END);
|
|
160
|
+
const last = parts[parts.length - 1]?.replace(LEADING_MARKUP, "").trim();
|
|
161
|
+
return last || null;
|
|
162
|
+
}
|
|
163
|
+
function enumerated(sentence) {
|
|
164
|
+
const inside = PARENTHETICAL.exec(sentence)?.[1];
|
|
165
|
+
// `or` is what makes it a list of choices rather than an aside
|
|
166
|
+
// ("(Lv25, quantity 6, $9.99 each)").
|
|
167
|
+
if (!inside || !/\bor\b/i.test(inside)) return null;
|
|
168
|
+
const labels = inside.split(LIST_SPLIT).map(p => p.trim()).filter(Boolean);
|
|
169
|
+
if (labels.length < 2 || labels.length > 5) return null;
|
|
170
|
+
for (const label of labels) {
|
|
171
|
+
if (label.length < 1 || label.length > 48 || !CLEAN_OPTION.test(label)) return null;
|
|
172
|
+
}
|
|
173
|
+
return labels.map((label, i) => ({
|
|
174
|
+
id: `o${i + 1}`,
|
|
175
|
+
label: capitalize(label)
|
|
176
|
+
}));
|
|
177
|
+
}
|
|
178
|
+
function alternatives(halves) {
|
|
179
|
+
const labels = halves.map(h => h.trim().replace(/[?.!]+$/, "").trim());
|
|
180
|
+
for (const label of labels) {
|
|
181
|
+
if (label.length < 2 || label.length > 48 || !CLEAN_LABEL.test(label)) return null;
|
|
182
|
+
}
|
|
183
|
+
return labels.map((label, i) => ({
|
|
184
|
+
id: i === 0 ? "a" : "b",
|
|
185
|
+
label: capitalize(label)
|
|
186
|
+
}));
|
|
187
|
+
}
|
|
188
|
+
function capitalize(label) {
|
|
189
|
+
return /^[a-z]/.test(label) ? label[0].toUpperCase() + label.slice(1) : label;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/* ------------------------------------------------------------------------ *
|
|
193
|
+
* The OTHER way a turn ends badly: it answers a smaller question than the
|
|
194
|
+
* one it was asked, and hands the rest back to the user.
|
|
195
|
+
*
|
|
196
|
+
* Off a real device: "Show me all the pokemon from our poke mart app." The
|
|
197
|
+
* app's home screen holds ten and fetches one per card as you swipe; the user
|
|
198
|
+
* had swiped four. The agent read the cache, found four, showed four, and
|
|
199
|
+
* closed with "that's everything currently in the app's cache, so if you visit
|
|
200
|
+
* other Pokémon in the app I can show those too" — while holding
|
|
201
|
+
* route-events.navigate, describeScreen and tapElement, and having called none
|
|
202
|
+
* of them.
|
|
203
|
+
*
|
|
204
|
+
* `synthesizeAskBlock` above should have caught that last clause — "if you
|
|
205
|
+
* visit … I can" is exactly its OFFER shape. It did not, because the turn had
|
|
206
|
+
* already shipped a `suggestions` block, so `offeredTap` was true. The chips
|
|
207
|
+
* were "Compare their HP", "Show me the bag", "Change Pikachu's stats". The
|
|
208
|
+
* user had something to tap; none of it was the thing the agent had just
|
|
209
|
+
* failed to do.
|
|
210
|
+
*
|
|
211
|
+
* So this gate asks a different question from that one. Not "does the user
|
|
212
|
+
* have something to tap" but "can the user tap THE GAP" — and it fires even
|
|
213
|
+
* when the turn offered chips, because that is the case it exists for.
|
|
214
|
+
*
|
|
215
|
+
* It stays quiet when the agent actually TRIED (see `attempted`). An agent
|
|
216
|
+
* that navigated, tapped and re-read and still came up short has earned its
|
|
217
|
+
* "that's all there is", and nagging it would be worse than silence.
|
|
218
|
+
* ------------------------------------------------------------------------ */
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* A limit on what the answer covers: "that's all", "only", "so far".
|
|
222
|
+
* Meaningless alone — half the sentences in English contain "only".
|
|
223
|
+
*/
|
|
224
|
+
const LIMITED = /\b(?:that'?s (?:all|everything|it)|only|just|so far|nothing else|no others?|the rest (?:are|is)?n'?t)\b/i;
|
|
225
|
+
|
|
226
|
+
/**
|
|
227
|
+
* …AND a word that says the limit is about LOADING rather than about the
|
|
228
|
+
* world. "Only four are cached" is a shortfall; "only four are in stock" is an
|
|
229
|
+
* answer. Both halves have to be present.
|
|
230
|
+
*/
|
|
231
|
+
const NOT_LOADED = /\b(?:cache[ds]?|cached|loaded|fetched|in memory|visited|opened|rendered|recorded|captured)\b/i;
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* The offer that hands the work back, which needs no second half: the user is
|
|
235
|
+
* being asked to go and do the thing the agent could have done itself.
|
|
236
|
+
*/
|
|
237
|
+
const GO_YOURSELF = /\b(?:if|once|when|after) you (?:visit|open|go to|navigate|browse|load|tap|swipe|scroll|look at)\b/i;
|
|
238
|
+
|
|
239
|
+
/** How much of the turn to read. The concession is usually the closing line. */
|
|
240
|
+
const TAIL_SENTENCES = 3;
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* `attempted` — did this turn call anything that GOES AND GETS data?
|
|
244
|
+
* Keyed on the actions the prompt's ladder names, so the two move together.
|
|
245
|
+
*/
|
|
246
|
+
const ACQUISITION_CALLS = exports.ACQUISITION_CALLS = new Set(["route-events.navigate", "route-events.stackGoBack", "route-events.stackNavigateToIndex", "highlight-updates.describeScreen", "highlight-updates.tapElement", "highlight-updates.waitFor", "query.refetch", "query.invalidate"]);
|
|
247
|
+
/**
|
|
248
|
+
* The block a turn should have ended with when it conceded a gap and never
|
|
249
|
+
* tried to close it, or null to leave the prose alone.
|
|
250
|
+
*
|
|
251
|
+
* An `actions` block, not a `choice`: nothing is being ASKED here. The turn is
|
|
252
|
+
* over and the answer stands; this is one button that says the gap is closable
|
|
253
|
+
* and closes it. So it must not end the turn or set `awaiting-user` — a
|
|
254
|
+
* synthesized card must never look like it is blocking on a reply.
|
|
255
|
+
*/
|
|
256
|
+
function synthesizeShortfallBlock({
|
|
257
|
+
text,
|
|
258
|
+
attempted
|
|
259
|
+
}) {
|
|
260
|
+
if (attempted) return null;
|
|
261
|
+
const tail = lastSentences(text, TAIL_SENTENCES);
|
|
262
|
+
if (!tail) return null;
|
|
263
|
+
const conceded = GO_YOURSELF.test(tail) || LIMITED.test(tail) && NOT_LOADED.test(tail);
|
|
264
|
+
if (!conceded) return null;
|
|
265
|
+
return {
|
|
266
|
+
id: nextShortfallId(),
|
|
267
|
+
kind: "actions",
|
|
268
|
+
actions: [{
|
|
269
|
+
label: "Go get the rest",
|
|
270
|
+
primary: true,
|
|
271
|
+
// Phrased as the user would phrase it, because that is what it becomes:
|
|
272
|
+
// the tap is sent as their next message.
|
|
273
|
+
send: "Don't stop at what's already loaded. Drive the app to get the rest — check the other layers, use the sitemap to navigate to the screen that loads it, wait for it, then answer in full. If it truly isn't reachable, tell me exactly what you tried."
|
|
274
|
+
}]
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
const nextShortfallId = (0, _runId.idFactory)("gap");
|
|
278
|
+
|
|
279
|
+
/** The last `count` sentences, joined — see `lastSentence` for the split. */
|
|
280
|
+
function lastSentences(text, count) {
|
|
281
|
+
const trimmed = text.replace(TRAILING_MARKUP, "").trim();
|
|
282
|
+
if (!trimmed) return null;
|
|
283
|
+
const parts = trimmed.split(SENTENCE_END).filter(p => p.trim());
|
|
284
|
+
const tail = parts.slice(-count).join(" ").replace(LEADING_MARKUP, "").trim();
|
|
285
|
+
return tail || null;
|
|
286
|
+
}
|
|
287
|
+
//# sourceMappingURL=askGate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_runId","require","nextId","idFactory","OFFER","VALUE_ASK","ASK","RegExp","source","TRAILING_MARKUP","LEADING_MARKUP","SENTENCE_END","OR_SPLIT","PARENTHETICAL","LIST_SPLIT","CLEAN_LABEL","CLEAN_OPTION","YES_NO","id","label","synthesizeAskBlock","text","sentence","lastSentence","length","ask","exec","listed","enumerated","kind","question","options","after","slice","index","replace","trim","halves","split","alt","alternatives","test","trimmed","parts","last","inside","labels","map","p","filter","Boolean","i","capitalize","h","toUpperCase","LIMITED","NOT_LOADED","GO_YOURSELF","TAIL_SENTENCES","ACQUISITION_CALLS","exports","Set","synthesizeShortfallBlock","attempted","tail","lastSentences","conceded","nextShortfallId","actions","primary","send","count","join"],"sourceRoot":"../../../src","sources":["engine/askGate.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.effectFor = effectFor;
|
|
7
7
|
var _policy = require("../policy/policy");
|
|
8
|
+
var _digest = require("../effects/digest");
|
|
8
9
|
/**
|
|
9
10
|
* Turn a completed mutation into a ledger entry.
|
|
10
11
|
*
|
|
@@ -20,7 +21,31 @@ var _policy = require("../policy/policy");
|
|
|
20
21
|
* banner that admits three of them are permanent.
|
|
21
22
|
*/
|
|
22
23
|
|
|
23
|
-
|
|
24
|
+
/**
|
|
25
|
+
* The largest prior value an undo will hold. The ledger is persisted with the
|
|
26
|
+
* transcript under a 256KB cap; a payload past this is recorded as a visible,
|
|
27
|
+
* honestly-permanent change instead of silently evicting the conversation.
|
|
28
|
+
*/
|
|
29
|
+
const MAX_UNDO_JSON_CHARS = 64_000;
|
|
30
|
+
|
|
31
|
+
/** The `getQueryData` read the engine takes on both sides of a cache write. */
|
|
32
|
+
|
|
33
|
+
const cacheRead = v => v && typeof v === "object" ? v : undefined;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* How each query change is actually put back, named in the row so the bar is
|
|
37
|
+
* useful rather than merely honest. A cache edit's real inverse is a refetch:
|
|
38
|
+
* the tool's own description says a cache edit "lasts until the next
|
|
39
|
+
* successful refetch".
|
|
40
|
+
*/
|
|
41
|
+
const QUERY_RESTORES = {
|
|
42
|
+
setQueryData: "query.invalidate",
|
|
43
|
+
triggerError: "query.restoreError",
|
|
44
|
+
triggerLoading: "query.restoreLoading",
|
|
45
|
+
setOnline: "query.setOnline"
|
|
46
|
+
};
|
|
47
|
+
function effectFor(toolId, descriptor, params, result, before, /** The query cache read before and after a `setQueryData` — see runAgentTurn. */
|
|
48
|
+
cache) {
|
|
24
49
|
const label = (0, _policy.describeCall)(toolId, descriptor, params);
|
|
25
50
|
const rec = result ?? {};
|
|
26
51
|
|
|
@@ -77,6 +102,62 @@ function effectFor(toolId, descriptor, params, result, before) {
|
|
|
77
102
|
};
|
|
78
103
|
}
|
|
79
104
|
|
|
105
|
+
/**
|
|
106
|
+
* A cache edit is a CHANGE, not a one-shot.
|
|
107
|
+
*
|
|
108
|
+
* `setQueryData` is the headline write of the whole product — "THE way to
|
|
109
|
+
* change what a server-backed screen shows" — and it fell through to
|
|
110
|
+
* `transient` here, which the changes bar deliberately does not count. So
|
|
111
|
+
* the sheet said "Anything it changes shows up in a bar at the top, and you
|
|
112
|
+
* can undo it" and then changed the screen in front of you with no row, no
|
|
113
|
+
* count and no undo. Same for `triggerError` and `triggerLoading`: the app
|
|
114
|
+
* is left showing a failure state that nothing on screen admits to putting
|
|
115
|
+
* there, which is exactly how a QA tester files a bug against a state Buoy
|
|
116
|
+
* created.
|
|
117
|
+
*
|
|
118
|
+
* `setQueryData` is now a real `query-write` above, because the engine
|
|
119
|
+
* reads the query's data before the write (captureStoreState) — the same
|
|
120
|
+
* pre-read that makes storage reversible. The rest — triggerError,
|
|
121
|
+
* triggerLoading, setOnline, a setQueryData whose pre-read failed — stay
|
|
122
|
+
* `state-write` (visible, honestly permanent): this module only claims an
|
|
123
|
+
* undo it can actually perform, and the label carries the real revert so
|
|
124
|
+
* the row is still useful.
|
|
125
|
+
*/
|
|
126
|
+
if (toolId === "query" && descriptor.action === "setQueryData") {
|
|
127
|
+
const prior = cacheRead(cache?.before);
|
|
128
|
+
const queryHash = typeof params.queryHash === "string" ? params.queryHash : prior?.queryHash;
|
|
129
|
+
if (prior?.found === true && typeof queryHash === "string") {
|
|
130
|
+
const had = prior.hasData !== false && prior.data !== undefined;
|
|
131
|
+
const beforeData = had ? prior.data : undefined;
|
|
132
|
+
if ((0, _digest.jsonLength)(beforeData) <= MAX_UNDO_JSON_CHARS) {
|
|
133
|
+
const after = cacheRead(cache?.after);
|
|
134
|
+
const wroteDigest = after?.found === true && after.hasData !== false ? (0, _digest.digestOf)(after.data) : undefined;
|
|
135
|
+
return {
|
|
136
|
+
kind: "query-write",
|
|
137
|
+
queryHash,
|
|
138
|
+
before: beforeData,
|
|
139
|
+
wroteDigest,
|
|
140
|
+
label
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
return {
|
|
144
|
+
kind: "state-write",
|
|
145
|
+
toolId,
|
|
146
|
+
action: descriptor.action,
|
|
147
|
+
label: `${label} — prior value too large to hold for undo; undo with query.invalidate`
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
if (toolId === "query" && descriptor.effect !== "read") {
|
|
152
|
+
const restores = QUERY_RESTORES[descriptor.action];
|
|
153
|
+
return {
|
|
154
|
+
kind: "state-write",
|
|
155
|
+
toolId,
|
|
156
|
+
action: descriptor.action,
|
|
157
|
+
label: restores ? `${label} — undo with ${restores}` : label
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
|
|
80
161
|
// Wipes with no captured prior state are permanent. Say so rather than
|
|
81
162
|
// filing them under something Undo appears to cover.
|
|
82
163
|
if (descriptor.effect === "destructive") {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_policy","require","effectFor","toolId","descriptor","params","result","before","label","describeCall","rec","action","rule","ruleId","id","wasCreate","
|
|
1
|
+
{"version":3,"names":["_policy","require","_digest","MAX_UNDO_JSON_CHARS","cacheRead","v","undefined","QUERY_RESTORES","setQueryData","triggerError","triggerLoading","setOnline","effectFor","toolId","descriptor","params","result","before","cache","label","describeCall","rec","action","rule","ruleId","id","wasCreate","kind","key","isMmkv","startsWith","writeAction","instanceId","had","value","wrote","removeAction","prior","queryHash","found","hasData","data","beforeData","jsonLength","after","wroteDigest","digestOf","effect","restores"],"sourceRoot":"../../../src","sources":["engine/effectFor.ts"],"mappings":"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","ignoreList":[]}
|