@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.
Files changed (138) hide show
  1. package/LICENSE +58 -0
  2. package/README.md +42 -0
  3. package/lib/commonjs/blocks/receipts.js +702 -0
  4. package/lib/commonjs/blocks/receipts.js.map +1 -0
  5. package/lib/commonjs/blocks/types.js +119 -0
  6. package/lib/commonjs/blocks/types.js.map +1 -0
  7. package/lib/commonjs/blocks/uiTool.js +994 -0
  8. package/lib/commonjs/blocks/uiTool.js.map +1 -0
  9. package/lib/commonjs/catalog/catalog.g.js +4044 -0
  10. package/lib/commonjs/catalog/catalog.g.js.map +1 -0
  11. package/lib/commonjs/catalog/catalog.source.json +4956 -0
  12. package/lib/commonjs/catalog/snapshotReads.js +256 -0
  13. package/lib/commonjs/catalog/snapshotReads.js.map +1 -0
  14. package/lib/commonjs/catalog/toProviderTools.js +107 -0
  15. package/lib/commonjs/catalog/toProviderTools.js.map +1 -0
  16. package/lib/commonjs/catalog/validateParams.js +129 -0
  17. package/lib/commonjs/catalog/validateParams.js.map +1 -0
  18. package/lib/commonjs/context/buildContextPack.js +141 -0
  19. package/lib/commonjs/context/buildContextPack.js.map +1 -0
  20. package/lib/commonjs/effects/ledger.js +229 -0
  21. package/lib/commonjs/effects/ledger.js.map +1 -0
  22. package/lib/commonjs/engine/effectFor.js +95 -0
  23. package/lib/commonjs/engine/effectFor.js.map +1 -0
  24. package/lib/commonjs/engine/runAgentTurn.js +667 -0
  25. package/lib/commonjs/engine/runAgentTurn.js.map +1 -0
  26. package/lib/commonjs/engine/systemPrompt.js +86 -0
  27. package/lib/commonjs/engine/systemPrompt.js.map +1 -0
  28. package/lib/commonjs/index.js +288 -0
  29. package/lib/commonjs/index.js.map +1 -0
  30. package/lib/commonjs/package.json +1 -0
  31. package/lib/commonjs/policy/labels.js +303 -0
  32. package/lib/commonjs/policy/labels.js.map +1 -0
  33. package/lib/commonjs/policy/policy.js +143 -0
  34. package/lib/commonjs/policy/policy.js.map +1 -0
  35. package/lib/commonjs/policy/redact.js +135 -0
  36. package/lib/commonjs/policy/redact.js.map +1 -0
  37. package/lib/commonjs/providers/anthropic.js +272 -0
  38. package/lib/commonjs/providers/anthropic.js.map +1 -0
  39. package/lib/commonjs/providers/openai.js +193 -0
  40. package/lib/commonjs/providers/openai.js.map +1 -0
  41. package/lib/commonjs/providers/sse.js +104 -0
  42. package/lib/commonjs/providers/sse.js.map +1 -0
  43. package/lib/commonjs/providers/types.js +6 -0
  44. package/lib/commonjs/providers/types.js.map +1 -0
  45. package/lib/commonjs/session.js +173 -0
  46. package/lib/commonjs/session.js.map +1 -0
  47. package/lib/commonjs/types.js +2 -0
  48. package/lib/commonjs/types.js.map +1 -0
  49. package/lib/module/blocks/receipts.js +696 -0
  50. package/lib/module/blocks/receipts.js.map +1 -0
  51. package/lib/module/blocks/types.js +113 -0
  52. package/lib/module/blocks/types.js.map +1 -0
  53. package/lib/module/blocks/uiTool.js +987 -0
  54. package/lib/module/blocks/uiTool.js.map +1 -0
  55. package/lib/module/catalog/catalog.g.js +4040 -0
  56. package/lib/module/catalog/catalog.g.js.map +1 -0
  57. package/lib/module/catalog/catalog.source.json +4956 -0
  58. package/lib/module/catalog/snapshotReads.js +252 -0
  59. package/lib/module/catalog/snapshotReads.js.map +1 -0
  60. package/lib/module/catalog/toProviderTools.js +101 -0
  61. package/lib/module/catalog/toProviderTools.js.map +1 -0
  62. package/lib/module/catalog/validateParams.js +124 -0
  63. package/lib/module/catalog/validateParams.js.map +1 -0
  64. package/lib/module/context/buildContextPack.js +138 -0
  65. package/lib/module/context/buildContextPack.js.map +1 -0
  66. package/lib/module/effects/ledger.js +223 -0
  67. package/lib/module/effects/ledger.js.map +1 -0
  68. package/lib/module/engine/effectFor.js +91 -0
  69. package/lib/module/engine/effectFor.js.map +1 -0
  70. package/lib/module/engine/runAgentTurn.js +663 -0
  71. package/lib/module/engine/runAgentTurn.js.map +1 -0
  72. package/lib/module/engine/systemPrompt.js +82 -0
  73. package/lib/module/engine/systemPrompt.js.map +1 -0
  74. package/lib/module/index.js +30 -0
  75. package/lib/module/index.js.map +1 -0
  76. package/lib/module/policy/labels.js +296 -0
  77. package/lib/module/policy/labels.js.map +1 -0
  78. package/lib/module/policy/policy.js +137 -0
  79. package/lib/module/policy/policy.js.map +1 -0
  80. package/lib/module/policy/redact.js +128 -0
  81. package/lib/module/policy/redact.js.map +1 -0
  82. package/lib/module/providers/anthropic.js +268 -0
  83. package/lib/module/providers/anthropic.js.map +1 -0
  84. package/lib/module/providers/openai.js +189 -0
  85. package/lib/module/providers/openai.js.map +1 -0
  86. package/lib/module/providers/sse.js +99 -0
  87. package/lib/module/providers/sse.js.map +1 -0
  88. package/lib/module/providers/types.js +4 -0
  89. package/lib/module/providers/types.js.map +1 -0
  90. package/lib/module/session.js +168 -0
  91. package/lib/module/session.js.map +1 -0
  92. package/lib/module/types.js +2 -0
  93. package/lib/module/types.js.map +1 -0
  94. package/lib/typescript/blocks/receipts.d.ts +32 -0
  95. package/lib/typescript/blocks/receipts.d.ts.map +1 -0
  96. package/lib/typescript/blocks/types.d.ts +576 -0
  97. package/lib/typescript/blocks/types.d.ts.map +1 -0
  98. package/lib/typescript/blocks/uiTool.d.ts +15 -0
  99. package/lib/typescript/blocks/uiTool.d.ts.map +1 -0
  100. package/lib/typescript/catalog/catalog.g.d.ts +11 -0
  101. package/lib/typescript/catalog/catalog.g.d.ts.map +1 -0
  102. package/lib/typescript/catalog/snapshotReads.d.ts +37 -0
  103. package/lib/typescript/catalog/snapshotReads.d.ts.map +1 -0
  104. package/lib/typescript/catalog/toProviderTools.d.ts +52 -0
  105. package/lib/typescript/catalog/toProviderTools.d.ts.map +1 -0
  106. package/lib/typescript/catalog/validateParams.d.ts +33 -0
  107. package/lib/typescript/catalog/validateParams.d.ts.map +1 -0
  108. package/lib/typescript/context/buildContextPack.d.ts +32 -0
  109. package/lib/typescript/context/buildContextPack.d.ts.map +1 -0
  110. package/lib/typescript/effects/ledger.d.ts +119 -0
  111. package/lib/typescript/effects/ledger.d.ts.map +1 -0
  112. package/lib/typescript/engine/effectFor.d.ts +21 -0
  113. package/lib/typescript/engine/effectFor.d.ts.map +1 -0
  114. package/lib/typescript/engine/runAgentTurn.d.ts +140 -0
  115. package/lib/typescript/engine/runAgentTurn.d.ts.map +1 -0
  116. package/lib/typescript/engine/systemPrompt.d.ts +49 -0
  117. package/lib/typescript/engine/systemPrompt.d.ts.map +1 -0
  118. package/lib/typescript/index.d.ts +29 -0
  119. package/lib/typescript/index.d.ts.map +1 -0
  120. package/lib/typescript/policy/labels.d.ts +10 -0
  121. package/lib/typescript/policy/labels.d.ts.map +1 -0
  122. package/lib/typescript/policy/policy.d.ts +106 -0
  123. package/lib/typescript/policy/policy.d.ts.map +1 -0
  124. package/lib/typescript/policy/redact.d.ts +37 -0
  125. package/lib/typescript/policy/redact.d.ts.map +1 -0
  126. package/lib/typescript/providers/anthropic.d.ts +22 -0
  127. package/lib/typescript/providers/anthropic.d.ts.map +1 -0
  128. package/lib/typescript/providers/openai.d.ts +19 -0
  129. package/lib/typescript/providers/openai.d.ts.map +1 -0
  130. package/lib/typescript/providers/sse.d.ts +18 -0
  131. package/lib/typescript/providers/sse.d.ts.map +1 -0
  132. package/lib/typescript/providers/types.d.ts +129 -0
  133. package/lib/typescript/providers/types.d.ts.map +1 -0
  134. package/lib/typescript/session.d.ts +58 -0
  135. package/lib/typescript/session.d.ts.map +1 -0
  136. package/lib/typescript/types.d.ts +119 -0
  137. package/lib/typescript/types.d.ts.map +1 -0
  138. package/package.json +58 -0
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_snapshotReads","require","PROBE_TIMEOUT_MS","list","value","Array","isArray","items","names","keys","cap","slice","map","item","rec","k","undefined","id","name","key","PROBES","toolId","action","SNAPSHOT_ACTION","shape","v","routes","params","includeValues","Object","state","stores","raw","s","persistName","persistsTo","env","withTimeout","p","ms","Promise","race","catch","resolve","setTimeout","buildContextDigest","dispatch","readSnapshot","availableToolIds","availableActions","runnable","filter","includes","actions","settled","all","probe","read","then","payload","projectSnapshot","digest","empty","length"],"sourceRoot":"../../../src","sources":["context/buildContextPack.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,229 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.EffectLedger = void 0;
7
+ exports.isReversible = isReversible;
8
+ /**
9
+ * The effect ledger — what the agent changed, and how to put it back.
10
+ *
11
+ * Ask Buoy runs mutations immediately rather than asking first, so "undo" has
12
+ * to be real. The model is Scenarios' `AppliedEffect` / `revertEffects`
13
+ * (packages/scenarios/src/engine.ts:238-272), with two deliberate departures,
14
+ * both fixing gaps that engine documents in itself:
15
+ *
16
+ * 1. STORAGE IS ACTUALLY REVERSIBLE HERE. Scenarios classifies storage writes
17
+ * as unrecoverable because it never captured the prior value. An agent can:
18
+ * it reads the key before it writes, so undo restores the old value exactly,
19
+ * and removes the key when it did not exist before.
20
+ * 2. THE COUNT TELLS THE TRUTH. Scenarios' banner counts transients as
21
+ * "changes" and then silently no-ops on them at revert. Here reversible and
22
+ * one-shot effects are counted separately and the banner says both, because
23
+ * a user who taps Undo and sees "4 changes" become nothing changed learns
24
+ * not to trust the banner.
25
+ *
26
+ * Undo runs in REVERSE order — a later write to the same key must be undone
27
+ * before the earlier one, or the earlier value is the one that survives.
28
+ */
29
+
30
+ /**
31
+ * Whether Undo can actually put this effect back. THE one place the answer
32
+ * lives: the bar, the sync snapshot and `revertOne` all agree through it.
33
+ * `state-write` is a wipe or a store write with no captured prior state —
34
+ * the ledger records it so the user can see it happened, and it is
35
+ * PERMANENT. Counting it as undoable made the bar promise "1 undoable" and
36
+ * then fail with "can't be undone automatically" on tap.
37
+ */
38
+ function isReversible(effect) {
39
+ return effect.kind !== "transient" && effect.kind !== "state-write";
40
+ }
41
+ let seq = 0;
42
+ class EffectLedger {
43
+ entries = [];
44
+ listeners = new Set();
45
+ record(toolId, action, effect) {
46
+ const entry = {
47
+ id: `fx-${++seq}-${Date.now()}`,
48
+ at: Date.now(),
49
+ toolId,
50
+ action,
51
+ effect
52
+ };
53
+ // Copy-on-write: `list()` is a useSyncExternalStore snapshot, and React
54
+ // bails out of the re-render when the snapshot is reference-equal. A
55
+ // push would leave the bar showing a stale count until something else
56
+ // happened to re-render it.
57
+ this.entries = [...this.entries, entry];
58
+ this.emit();
59
+ return entry;
60
+ }
61
+ list() {
62
+ return this.entries;
63
+ }
64
+
65
+ /** New array identity for the snapshot after entries were mutated in place. */
66
+ touch() {
67
+ this.entries = [...this.entries];
68
+ this.emit();
69
+ }
70
+
71
+ /** Not-yet-undone entries that Undo can actually deliver on. Agrees with
72
+ * `isReversible` — it used to include state-writes, which revertOne refuses,
73
+ * so the two disagreed about the one fact they both exist to answer. */
74
+ reversible() {
75
+ return this.entries.filter(e => !e.undoneAt && isReversible(e.effect));
76
+ }
77
+
78
+ /** Not-yet-undone one-shots. Counted separately so the banner is honest. */
79
+ transients() {
80
+ return this.entries.filter(e => !e.undoneAt && e.effect.kind === "transient");
81
+ }
82
+ isEmpty() {
83
+ return this.entries.every(e => e.undoneAt !== undefined);
84
+ }
85
+ subscribe(fn) {
86
+ this.listeners.add(fn);
87
+ return () => this.listeners.delete(fn);
88
+ }
89
+ clear() {
90
+ this.entries = [];
91
+ this.emit();
92
+ }
93
+
94
+ /**
95
+ * Reconcile the ledger after a change was reverted OUTSIDE `revertOne` —
96
+ * the model deleting the override it created, a block button's Delete, a
97
+ * stopImpersonation call. Without this the create entry stays "undoable"
98
+ * and Undo later fails against a rule that no longer exists, which reads
99
+ * as the banner lying.
100
+ */
101
+ noteExternalRevert(toolId, action, params) {
102
+ let changed = false;
103
+ const mark = match => {
104
+ for (const entry of this.entries) {
105
+ if (!entry.undoneAt && match(entry)) {
106
+ entry.undoneAt = Date.now();
107
+ entry.undoError = undefined;
108
+ changed = true;
109
+ }
110
+ }
111
+ };
112
+ if (toolId === "network" && action === "deleteOverrideRule") {
113
+ mark(e => e.effect.kind === "network-override" && e.effect.ruleId === params.id);
114
+ } else if (toolId === "network" && action === "clearOverrideRules") {
115
+ mark(e => e.effect.kind === "network-override");
116
+ } else if (toolId === "impersonate" && action === "stopImpersonation") {
117
+ mark(e => e.effect.kind === "impersonation");
118
+ }
119
+ if (changed) this.touch();
120
+ }
121
+ emit() {
122
+ for (const fn of this.listeners) {
123
+ try {
124
+ fn();
125
+ } catch {
126
+ // A throwing listener must not take the ledger down.
127
+ }
128
+ }
129
+ }
130
+
131
+ /** Undo one entry. Returns an error string, or undefined on success. */
132
+ async revertOne(entry, dispatch) {
133
+ if (entry.undoneAt) return undefined;
134
+ const fx = entry.effect;
135
+ try {
136
+ switch (fx.kind) {
137
+ case "network-override":
138
+ await dispatch("network", "deleteOverrideRule", {
139
+ id: fx.ruleId
140
+ });
141
+ break;
142
+ case "impersonation":
143
+ await dispatch("impersonate", "stopImpersonation", {});
144
+ break;
145
+ case "storage-write":
146
+ {
147
+ // `instanceId` rides along for MMKV and is absent for AsyncStorage,
148
+ // whose actions take the key alone.
149
+ const scope = fx.instanceId ? {
150
+ instanceId: fx.instanceId
151
+ } : {};
152
+
153
+ // Concurrent-writer guard: if the key no longer holds the value WE
154
+ // wrote, someone else wrote after us and a blind restore would
155
+ // destroy their newer value. Best-effort — an unreadable key still
156
+ // restores, because a failed read must not strand the undo.
157
+ if (fx.wrote !== undefined) {
158
+ const readAction = fx.action === "mmkv.set" ? "mmkv.get" : "async.getItem";
159
+ try {
160
+ const current = await dispatch(fx.toolId, readAction, {
161
+ ...scope,
162
+ key: fx.key
163
+ });
164
+ const rec = current && typeof current === "object" ? current : undefined;
165
+ const value = rec ? rec.value : current;
166
+ if (rec?.found !== false && value !== undefined && value !== fx.wrote) {
167
+ return "This value was changed again after Ask Buoy wrote it — left the newer value alone";
168
+ }
169
+ } catch {
170
+ /* unreadable now; proceed with the restore */
171
+ }
172
+ }
173
+ if (fx.before === undefined) {
174
+ if (!fx.removeAction) return "No remove action known for this key";
175
+ await dispatch(fx.toolId, fx.removeAction, {
176
+ ...scope,
177
+ key: fx.key
178
+ });
179
+ } else {
180
+ await dispatch(fx.toolId, fx.action, {
181
+ ...scope,
182
+ key: fx.key,
183
+ value: fx.before
184
+ });
185
+ }
186
+ break;
187
+ }
188
+ case "state-write":
189
+ return "This change can't be undone automatically";
190
+ case "transient":
191
+ return undefined;
192
+ }
193
+ entry.undoneAt = Date.now();
194
+ entry.undoError = undefined;
195
+ this.touch();
196
+ return undefined;
197
+ } catch (err) {
198
+ const msg = err instanceof Error ? err.message : String(err);
199
+ entry.undoError = msg;
200
+ this.touch();
201
+ return msg;
202
+ }
203
+ }
204
+
205
+ /** Undo everything still outstanding, newest first. */
206
+ async revertAll(dispatch) {
207
+ const outcome = {
208
+ reverted: 0,
209
+ failed: [],
210
+ skippedTransients: 0
211
+ };
212
+ const pending = [...this.entries].filter(e => !e.undoneAt).reverse();
213
+ for (const entry of pending) {
214
+ if (entry.effect.kind === "transient") {
215
+ outcome.skippedTransients += 1;
216
+ continue;
217
+ }
218
+ const error = await this.revertOne(entry, dispatch);
219
+ if (error) outcome.failed.push({
220
+ label: entry.effect.label,
221
+ error
222
+ });else outcome.reverted += 1;
223
+ }
224
+ this.emit();
225
+ return outcome;
226
+ }
227
+ }
228
+ exports.EffectLedger = EffectLedger;
229
+ //# sourceMappingURL=ledger.js.map
@@ -0,0 +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","undefined","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","err","msg","Error","message","String","revertAll","outcome","reverted","failed","skippedTransients","pending","reverse","error","push","label","exports"],"sourceRoot":"../../../src","sources":["effects/ledger.ts"],"mappings":";;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAgCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASA,YAAYA,CAACC,MAAqB,EAAW;EAC3D,OAAOA,MAAM,CAACC,IAAI,KAAK,WAAW,IAAID,MAAM,CAACC,IAAI,KAAK,aAAa;AACrE;AAoBA,IAAIC,GAAG,GAAG,CAAC;AAEJ,MAAMC,YAAY,CAAC;EAChBC,OAAO,GAAkB,EAAE;EAC3BC,SAAS,GAAG,IAAIC,GAAG,CAAa,CAAC;EAEzCC,MAAMA,CAACC,MAAc,EAAEC,MAAc,EAAET,MAAqB,EAAe;IACzE,MAAMU,KAAkB,GAAG;MACzBC,EAAE,EAAE,MAAM,EAAET,GAAG,IAAIU,IAAI,CAACC,GAAG,CAAC,CAAC,EAAE;MAC/BC,EAAE,EAAEF,IAAI,CAACC,GAAG,CAAC,CAAC;MACdL,MAAM;MACNC,MAAM;MACNT;IACF,CAAC;IACD;IACA;IACA;IACA;IACA,IAAI,CAACI,OAAO,GAAG,CAAC,GAAG,IAAI,CAACA,OAAO,EAAEM,KAAK,CAAC;IACvC,IAAI,CAACK,IAAI,CAAC,CAAC;IACX,OAAOL,KAAK;EACd;EAEAM,IAAIA,CAAA,EAAkB;IACpB,OAAO,IAAI,CAACZ,OAAO;EACrB;;EAEA;EACQa,KAAKA,CAAA,EAAS;IACpB,IAAI,CAACb,OAAO,GAAG,CAAC,GAAG,IAAI,CAACA,OAAO,CAAC;IAChC,IAAI,CAACW,IAAI,CAAC,CAAC;EACb;;EAEA;AACF;AACA;EACEG,UAAUA,CAAA,EAAkB;IAC1B,OAAO,IAAI,CAACd,OAAO,CAACe,MAAM,CAAEC,CAAC,IAAK,CAACA,CAAC,CAACC,QAAQ,IAAItB,YAAY,CAACqB,CAAC,CAACpB,MAAM,CAAC,CAAC;EAC1E;;EAEA;EACAsB,UAAUA,CAAA,EAAkB;IAC1B,OAAO,IAAI,CAAClB,OAAO,CAACe,MAAM,CAAEC,CAAC,IAAK,CAACA,CAAC,CAACC,QAAQ,IAAID,CAAC,CAACpB,MAAM,CAACC,IAAI,KAAK,WAAW,CAAC;EACjF;EAEAsB,OAAOA,CAAA,EAAY;IACjB,OAAO,IAAI,CAACnB,OAAO,CAACoB,KAAK,CAAEJ,CAAC,IAAKA,CAAC,CAACC,QAAQ,KAAKI,SAAS,CAAC;EAC5D;EAEAC,SAASA,CAACC,EAAc,EAAc;IACpC,IAAI,CAACtB,SAAS,CAACuB,GAAG,CAACD,EAAE,CAAC;IACtB,OAAO,MAAM,IAAI,CAACtB,SAAS,CAACwB,MAAM,CAACF,EAAE,CAAC;EACxC;EAEAG,KAAKA,CAAA,EAAS;IACZ,IAAI,CAAC1B,OAAO,GAAG,EAAE;IACjB,IAAI,CAACW,IAAI,CAAC,CAAC;EACb;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;EACEgB,kBAAkBA,CAACvB,MAAc,EAAEC,MAAc,EAAEuB,MAA+B,EAAQ;IACxF,IAAIC,OAAO,GAAG,KAAK;IACnB,MAAMC,IAAI,GAAIC,KAAkC,IAAK;MACnD,KAAK,MAAMzB,KAAK,IAAI,IAAI,CAACN,OAAO,EAAE;QAChC,IAAI,CAACM,KAAK,CAACW,QAAQ,IAAIc,KAAK,CAACzB,KAAK,CAAC,EAAE;UACnCA,KAAK,CAACW,QAAQ,GAAGT,IAAI,CAACC,GAAG,CAAC,CAAC;UAC3BH,KAAK,CAAC0B,SAAS,GAAGX,SAAS;UAC3BQ,OAAO,GAAG,IAAI;QAChB;MACF;IACF,CAAC;IAED,IAAIzB,MAAM,KAAK,SAAS,IAAIC,MAAM,KAAK,oBAAoB,EAAE;MAC3DyB,IAAI,CACDd,CAAC,IAAKA,CAAC,CAACpB,MAAM,CAACC,IAAI,KAAK,kBAAkB,IAAImB,CAAC,CAACpB,MAAM,CAACqC,MAAM,KAAKL,MAAM,CAACrB,EAC5E,CAAC;IACH,CAAC,MAAM,IAAIH,MAAM,KAAK,SAAS,IAAIC,MAAM,KAAK,oBAAoB,EAAE;MAClEyB,IAAI,CAAEd,CAAC,IAAKA,CAAC,CAACpB,MAAM,CAACC,IAAI,KAAK,kBAAkB,CAAC;IACnD,CAAC,MAAM,IAAIO,MAAM,KAAK,aAAa,IAAIC,MAAM,KAAK,mBAAmB,EAAE;MACrEyB,IAAI,CAAEd,CAAC,IAAKA,CAAC,CAACpB,MAAM,CAACC,IAAI,KAAK,eAAe,CAAC;IAChD;IAEA,IAAIgC,OAAO,EAAE,IAAI,CAAChB,KAAK,CAAC,CAAC;EAC3B;EAEQF,IAAIA,CAAA,EAAS;IACnB,KAAK,MAAMY,EAAE,IAAI,IAAI,CAACtB,SAAS,EAAE;MAC/B,IAAI;QACFsB,EAAE,CAAC,CAAC;MACN,CAAC,CAAC,MAAM;QACN;MAAA;IAEJ;EACF;;EAEA;EACA,MAAMW,SAASA,CAAC5B,KAAkB,EAAE6B,QAAoB,EAA+B;IACrF,IAAI7B,KAAK,CAACW,QAAQ,EAAE,OAAOI,SAAS;IACpC,MAAMe,EAAE,GAAG9B,KAAK,CAACV,MAAM;IACvB,IAAI;MACF,QAAQwC,EAAE,CAACvC,IAAI;QACb,KAAK,kBAAkB;UACrB,MAAMsC,QAAQ,CAAC,SAAS,EAAE,oBAAoB,EAAE;YAAE5B,EAAE,EAAE6B,EAAE,CAACH;UAAO,CAAC,CAAC;UAClE;QACF,KAAK,eAAe;UAClB,MAAME,QAAQ,CAAC,aAAa,EAAE,mBAAmB,EAAE,CAAC,CAAC,CAAC;UACtD;QACF,KAAK,eAAe;UAAE;YACpB;YACA;YACA,MAAME,KAAK,GAAGD,EAAE,CAACE,UAAU,GAAG;cAAEA,UAAU,EAAEF,EAAE,CAACE;YAAW,CAAC,GAAG,CAAC,CAAC;;YAEhE;YACA;YACA;YACA;YACA,IAAIF,EAAE,CAACG,KAAK,KAAKlB,SAAS,EAAE;cAC1B,MAAMmB,UAAU,GAAGJ,EAAE,CAAC/B,MAAM,KAAK,UAAU,GAAG,UAAU,GAAG,eAAe;cAC1E,IAAI;gBACF,MAAMoC,OAAO,GAAG,MAAMN,QAAQ,CAACC,EAAE,CAAChC,MAAM,EAAEoC,UAAU,EAAE;kBACpD,GAAGH,KAAK;kBACRK,GAAG,EAAEN,EAAE,CAACM;gBACV,CAAC,CAAC;gBACF,MAAMC,GAAG,GACPF,OAAO,IAAI,OAAOA,OAAO,KAAK,QAAQ,GACjCA,OAAO,GACRpB,SAAS;gBACf,MAAMuB,KAAK,GAAGD,GAAG,GAAIA,GAAG,CAACC,KAAK,GAA2BH,OAA8B;gBACvF,IAAIE,GAAG,EAAEE,KAAK,KAAK,KAAK,IAAID,KAAK,KAAKvB,SAAS,IAAIuB,KAAK,KAAKR,EAAE,CAACG,KAAK,EAAE;kBACrE,OAAO,mFAAmF;gBAC5F;cACF,CAAC,CAAC,MAAM;gBACN;cAAA;YAEJ;YAEA,IAAIH,EAAE,CAACU,MAAM,KAAKzB,SAAS,EAAE;cAC3B,IAAI,CAACe,EAAE,CAACW,YAAY,EAAE,OAAO,qCAAqC;cAClE,MAAMZ,QAAQ,CAACC,EAAE,CAAChC,MAAM,EAAEgC,EAAE,CAACW,YAAY,EAAE;gBAAE,GAAGV,KAAK;gBAAEK,GAAG,EAAEN,EAAE,CAACM;cAAI,CAAC,CAAC;YACvE,CAAC,MAAM;cACL,MAAMP,QAAQ,CAACC,EAAE,CAAChC,MAAM,EAAEgC,EAAE,CAAC/B,MAAM,EAAE;gBACnC,GAAGgC,KAAK;gBACRK,GAAG,EAAEN,EAAE,CAACM,GAAG;gBACXE,KAAK,EAAER,EAAE,CAACU;cACZ,CAAC,CAAC;YACJ;YACA;UACF;QACA,KAAK,aAAa;UAChB,OAAO,2CAA2C;QACpD,KAAK,WAAW;UACd,OAAOzB,SAAS;MACpB;MACAf,KAAK,CAACW,QAAQ,GAAGT,IAAI,CAACC,GAAG,CAAC,CAAC;MAC3BH,KAAK,CAAC0B,SAAS,GAAGX,SAAS;MAC3B,IAAI,CAACR,KAAK,CAAC,CAAC;MACZ,OAAOQ,SAAS;IAClB,CAAC,CAAC,OAAO2B,GAAG,EAAE;MACZ,MAAMC,GAAG,GAAGD,GAAG,YAAYE,KAAK,GAAGF,GAAG,CAACG,OAAO,GAAGC,MAAM,CAACJ,GAAG,CAAC;MAC5D1C,KAAK,CAAC0B,SAAS,GAAGiB,GAAG;MACrB,IAAI,CAACpC,KAAK,CAAC,CAAC;MACZ,OAAOoC,GAAG;IACZ;EACF;;EAEA;EACA,MAAMI,SAASA,CAAClB,QAAoB,EAA0B;IAC5D,MAAMmB,OAAsB,GAAG;MAAEC,QAAQ,EAAE,CAAC;MAAEC,MAAM,EAAE,EAAE;MAAEC,iBAAiB,EAAE;IAAE,CAAC;IAChF,MAAMC,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC1D,OAAO,CAAC,CAACe,MAAM,CAAEC,CAAC,IAAK,CAACA,CAAC,CAACC,QAAQ,CAAC,CAAC0C,OAAO,CAAC,CAAC;IAEtE,KAAK,MAAMrD,KAAK,IAAIoD,OAAO,EAAE;MAC3B,IAAIpD,KAAK,CAACV,MAAM,CAACC,IAAI,KAAK,WAAW,EAAE;QACrCyD,OAAO,CAACG,iBAAiB,IAAI,CAAC;QAC9B;MACF;MACA,MAAMG,KAAK,GAAG,MAAM,IAAI,CAAC1B,SAAS,CAAC5B,KAAK,EAAE6B,QAAQ,CAAC;MACnD,IAAIyB,KAAK,EAAEN,OAAO,CAACE,MAAM,CAACK,IAAI,CAAC;QAAEC,KAAK,EAAExD,KAAK,CAACV,MAAM,CAACkE,KAAK;QAAEF;MAAM,CAAC,CAAC,CAAC,KAChEN,OAAO,CAACC,QAAQ,IAAI,CAAC;IAC5B;IACA,IAAI,CAAC5C,IAAI,CAAC,CAAC;IACX,OAAO2C,OAAO;EAChB;AACF;AAACS,OAAA,CAAAhE,YAAA,GAAAA,YAAA","ignoreList":[]}
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.effectFor = effectFor;
7
+ var _policy = require("../policy/policy");
8
+ /**
9
+ * Turn a completed mutation into a ledger entry.
10
+ *
11
+ * The shape is Scenarios' `extractEffect`, but the classification here is much
12
+ * more conservative, because auditing the catalog's undo claims found almost
13
+ * all of them unsound: the information needed to reverse a call usually does
14
+ * not survive the call. So an effect is only marked reversible when THIS
15
+ * module can point at the exact input the reversal needs.
16
+ *
17
+ * Everything else becomes `state-write` (changed something, no automatic
18
+ * inverse) or `transient` (one-shot). Both are shown to the user as such. A
19
+ * banner that says "4 changes" and then reverses one of them is worse than a
20
+ * banner that admits three of them are permanent.
21
+ */
22
+
23
+ function effectFor(toolId, descriptor, params, result, before) {
24
+ const label = (0, _policy.describeCall)(toolId, descriptor, params);
25
+ const rec = result ?? {};
26
+
27
+ // A network override rule. Reversible ONLY when we created it: `upsert` with
28
+ // an id that already exists UPDATES that rule in place, so deleting it would
29
+ // destroy a rule the user had set up themselves rather than undo our change.
30
+ // The model supplying no id is the create case.
31
+ if (toolId === "network" && descriptor.action === "upsertOverrideRule") {
32
+ const rule = rec.rule;
33
+ const ruleId = rule?.id ?? rec.id;
34
+ const wasCreate = params.id === undefined;
35
+ if (ruleId && wasCreate) return {
36
+ kind: "network-override",
37
+ ruleId,
38
+ label
39
+ };
40
+ return {
41
+ kind: "state-write",
42
+ toolId,
43
+ action: descriptor.action,
44
+ label
45
+ };
46
+ }
47
+
48
+ // Impersonation. `stopImpersonation` restores the identity but ALSO re-runs
49
+ // the data nuke — it clears react-query, redux, AsyncStorage and MMKV per
50
+ // the app's dataNukeSettings. So this is reversible in the sense that
51
+ // matters (the user stops being someone else) and the label has to say the
52
+ // rest out loud, because caches do not come back.
53
+ if (toolId === "impersonate" && descriptor.action === "startImpersonation") {
54
+ return {
55
+ kind: "impersonation",
56
+ label: `${label} — stopping also clears cached app data`
57
+ };
58
+ }
59
+
60
+ // Storage, reversible because we read the old value first (see captureBefore).
61
+ // `before` is undefined when the pre-read could not be made — an MMKV write
62
+ // with no instance, a secure key behind biometrics — and that must fall
63
+ // through to a one-off rather than claim an undo it cannot perform.
64
+ if (toolId === "storage" && typeof params.key === "string" && before) {
65
+ const isMmkv = descriptor.action.startsWith("mmkv.");
66
+ const writeAction = isMmkv ? "mmkv.set" : "async.setItem";
67
+ return {
68
+ kind: "storage-write",
69
+ toolId,
70
+ action: writeAction,
71
+ key: params.key,
72
+ instanceId: isMmkv && typeof params.instanceId === "string" ? params.instanceId : undefined,
73
+ before: before.had ? before.value : undefined,
74
+ wrote: typeof params.value === "string" ? params.value : undefined,
75
+ removeAction: isMmkv ? "mmkv.remove" : "async.removeItem",
76
+ label
77
+ };
78
+ }
79
+
80
+ // Wipes with no captured prior state are permanent. Say so rather than
81
+ // filing them under something Undo appears to cover.
82
+ if (descriptor.effect === "destructive") {
83
+ return {
84
+ kind: "state-write",
85
+ toolId,
86
+ action: descriptor.action,
87
+ label
88
+ };
89
+ }
90
+ return {
91
+ kind: "transient",
92
+ label
93
+ };
94
+ }
95
+ //# sourceMappingURL=effectFor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_policy","require","effectFor","toolId","descriptor","params","result","before","label","describeCall","rec","action","rule","ruleId","id","wasCreate","undefined","kind","key","isMmkv","startsWith","writeAction","instanceId","had","value","wrote","removeAction","effect"],"sourceRoot":"../../../src","sources":["engine/effectFor.ts"],"mappings":";;;;;;AAgBA,IAAAA,OAAA,GAAAC,OAAA;AAhBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAKO,SAASC,SAASA,CACvBC,MAAc,EACdC,UAA4B,EAC5BC,MAA+B,EAC/BC,MAAe,EACfC,MAAoD,EACzB;EAC3B,MAAMC,KAAK,GAAG,IAAAC,oBAAY,EAACN,MAAM,EAAEC,UAAU,EAAEC,MAAM,CAAC;EACtD,MAAMK,GAAG,GAAIJ,MAAM,IAAI,CAAC,CAA6B;;EAErD;EACA;EACA;EACA;EACA,IAAIH,MAAM,KAAK,SAAS,IAAIC,UAAU,CAACO,MAAM,KAAK,oBAAoB,EAAE;IACtE,MAAMC,IAAI,GAAGF,GAAG,CAACE,IAA2C;IAC5D,MAAMC,MAAM,GAAID,IAAI,EAAEE,EAAE,IAAIJ,GAAG,CAACI,EAAyB;IACzD,MAAMC,SAAS,GAAGV,MAAM,CAACS,EAAE,KAAKE,SAAS;IACzC,IAAIH,MAAM,IAAIE,SAAS,EAAE,OAAO;MAAEE,IAAI,EAAE,kBAAkB;MAAEJ,MAAM;MAAEL;IAAM,CAAC;IAC3E,OAAO;MAAES,IAAI,EAAE,aAAa;MAAEd,MAAM;MAAEQ,MAAM,EAAEP,UAAU,CAACO,MAAM;MAAEH;IAAM,CAAC;EAC1E;;EAEA;EACA;EACA;EACA;EACA;EACA,IAAIL,MAAM,KAAK,aAAa,IAAIC,UAAU,CAACO,MAAM,KAAK,oBAAoB,EAAE;IAC1E,OAAO;MACLM,IAAI,EAAE,eAAe;MACrBT,KAAK,EAAE,GAAGA,KAAK;IACjB,CAAC;EACH;;EAEA;EACA;EACA;EACA;EACA,IAAIL,MAAM,KAAK,SAAS,IAAI,OAAOE,MAAM,CAACa,GAAG,KAAK,QAAQ,IAAIX,MAAM,EAAE;IACpE,MAAMY,MAAM,GAAGf,UAAU,CAACO,MAAM,CAACS,UAAU,CAAC,OAAO,CAAC;IACpD,MAAMC,WAAW,GAAGF,MAAM,GAAG,UAAU,GAAG,eAAe;IACzD,OAAO;MACLF,IAAI,EAAE,eAAe;MACrBd,MAAM;MACNQ,MAAM,EAAEU,WAAW;MACnBH,GAAG,EAAEb,MAAM,CAACa,GAAG;MACfI,UAAU,EACRH,MAAM,IAAI,OAAOd,MAAM,CAACiB,UAAU,KAAK,QAAQ,GAAGjB,MAAM,CAACiB,UAAU,GAAGN,SAAS;MACjFT,MAAM,EAAEA,MAAM,CAACgB,GAAG,GAAGhB,MAAM,CAACiB,KAAK,GAAGR,SAAS;MAC7CS,KAAK,EAAE,OAAOpB,MAAM,CAACmB,KAAK,KAAK,QAAQ,GAAGnB,MAAM,CAACmB,KAAK,GAAGR,SAAS;MAClEU,YAAY,EAAEP,MAAM,GAAG,aAAa,GAAG,kBAAkB;MACzDX;IACF,CAAC;EACH;;EAEA;EACA;EACA,IAAIJ,UAAU,CAACuB,MAAM,KAAK,aAAa,EAAE;IACvC,OAAO;MAAEV,IAAI,EAAE,aAAa;MAAEd,MAAM;MAAEQ,MAAM,EAAEP,UAAU,CAACO,MAAM;MAAEH;IAAM,CAAC;EAC1E;EAEA,OAAO;IAAES,IAAI,EAAE,WAAW;IAAET;EAAM,CAAC;AACrC","ignoreList":[]}