@loopingai/core 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. package/README.md +83 -28
  2. package/dist/a2a/caller.d.ts +24 -0
  3. package/dist/a2a/caller.d.ts.map +1 -0
  4. package/dist/a2a/caller.js +34 -0
  5. package/dist/a2a/caller.js.map +1 -0
  6. package/dist/a2a/card.d.ts +7 -2
  7. package/dist/a2a/card.d.ts.map +1 -1
  8. package/dist/a2a/card.js +16 -7
  9. package/dist/a2a/card.js.map +1 -1
  10. package/dist/a2a/index.d.ts +15 -0
  11. package/dist/a2a/index.d.ts.map +1 -1
  12. package/dist/a2a/index.js +15 -0
  13. package/dist/a2a/index.js.map +1 -1
  14. package/dist/a2a/notify.d.ts +27 -5
  15. package/dist/a2a/notify.d.ts.map +1 -1
  16. package/dist/a2a/notify.js +18 -8
  17. package/dist/a2a/notify.js.map +1 -1
  18. package/dist/a2a/push.d.ts +71 -0
  19. package/dist/a2a/push.d.ts.map +1 -0
  20. package/dist/a2a/push.js +54 -0
  21. package/dist/a2a/push.js.map +1 -0
  22. package/dist/a2a/verify.d.ts +28 -36
  23. package/dist/a2a/verify.d.ts.map +1 -1
  24. package/dist/a2a/verify.js +20 -25
  25. package/dist/a2a/verify.js.map +1 -1
  26. package/dist/agent/index.d.ts +16 -5
  27. package/dist/agent/index.d.ts.map +1 -1
  28. package/dist/agent/index.js +16 -5
  29. package/dist/agent/index.js.map +1 -1
  30. package/dist/config.d.ts +49 -7
  31. package/dist/config.d.ts.map +1 -1
  32. package/dist/config.js +25 -3
  33. package/dist/config.js.map +1 -1
  34. package/dist/db/models/tasks.d.ts +19 -5
  35. package/dist/db/models/tasks.d.ts.map +1 -1
  36. package/dist/db/models/tasks.js +38 -8
  37. package/dist/db/models/tasks.js.map +1 -1
  38. package/dist/host/agent.d.ts +217 -0
  39. package/dist/host/agent.d.ts.map +1 -0
  40. package/dist/host/agent.js +306 -0
  41. package/dist/host/agent.js.map +1 -0
  42. package/dist/host/index.d.ts +21 -0
  43. package/dist/host/index.d.ts.map +1 -0
  44. package/dist/host/index.js +20 -0
  45. package/dist/host/index.js.map +1 -0
  46. package/dist/host/plugin-host.d.ts +47 -0
  47. package/dist/host/plugin-host.d.ts.map +1 -0
  48. package/dist/host/plugin-host.js +2 -0
  49. package/dist/host/plugin-host.js.map +1 -0
  50. package/dist/round/agent.d.ts +267 -0
  51. package/dist/round/agent.d.ts.map +1 -0
  52. package/dist/round/agent.js +691 -0
  53. package/dist/round/agent.js.map +1 -0
  54. package/dist/round/index.d.ts +25 -0
  55. package/dist/round/index.d.ts.map +1 -0
  56. package/dist/round/index.js +24 -0
  57. package/dist/round/index.js.map +1 -0
  58. package/dist/round/policy.d.ts +99 -0
  59. package/dist/round/policy.d.ts.map +1 -0
  60. package/dist/round/policy.js +2 -0
  61. package/dist/round/policy.js.map +1 -0
  62. package/dist/round/subagent.d.ts +67 -0
  63. package/dist/round/subagent.d.ts.map +1 -0
  64. package/dist/round/subagent.js +91 -0
  65. package/dist/round/subagent.js.map +1 -0
  66. package/dist/round/turn.d.ts +231 -0
  67. package/dist/round/turn.d.ts.map +1 -0
  68. package/dist/round/turn.js +497 -0
  69. package/dist/round/turn.js.map +1 -0
  70. package/dist/round/workflow.d.ts +109 -0
  71. package/dist/round/workflow.d.ts.map +1 -0
  72. package/dist/round/workflow.js +316 -0
  73. package/dist/round/workflow.js.map +1 -0
  74. package/dist/runtime/index.d.ts +5 -1
  75. package/dist/runtime/index.d.ts.map +1 -1
  76. package/dist/runtime/index.js.map +1 -1
  77. package/dist/testing/auth.d.ts.map +1 -1
  78. package/dist/testing/auth.js +10 -7
  79. package/dist/testing/auth.js.map +1 -1
  80. package/dist/testing/fixtures.d.ts +17 -0
  81. package/dist/testing/fixtures.d.ts.map +1 -1
  82. package/dist/testing/fixtures.js +17 -0
  83. package/dist/testing/fixtures.js.map +1 -1
  84. package/dist/testing/harness.d.ts +98 -0
  85. package/dist/testing/harness.d.ts.map +1 -0
  86. package/dist/testing/harness.js +139 -0
  87. package/dist/testing/harness.js.map +1 -0
  88. package/dist/testing/index.d.ts +2 -1
  89. package/dist/testing/index.d.ts.map +1 -1
  90. package/dist/testing/index.js +2 -1
  91. package/dist/testing/index.js.map +1 -1
  92. package/dist/testing/vcr-store.d.ts +14 -18
  93. package/dist/testing/vcr-store.d.ts.map +1 -1
  94. package/dist/testing/vcr-store.js +30 -30
  95. package/dist/testing/vcr-store.js.map +1 -1
  96. package/dist/worker/define-agent.d.ts +124 -0
  97. package/dist/worker/define-agent.d.ts.map +1 -0
  98. package/dist/worker/define-agent.js +21 -0
  99. package/dist/worker/define-agent.js.map +1 -0
  100. package/dist/worker/index.d.ts +29 -4
  101. package/dist/worker/index.d.ts.map +1 -1
  102. package/dist/worker/index.js +70 -12
  103. package/dist/worker/index.js.map +1 -1
  104. package/package.json +20 -6
@@ -0,0 +1,267 @@
1
+ import type { AiEnv, A2ASecretsEnv } from "../env.js";
2
+ import type { GatewayIdentity } from "../a2a/verify.js";
3
+ import type { TurnPushContext } from "../a2a/push.js";
4
+ import type { Subtask, SubtaskChunkOutcome, SubtaskId, SubtaskScan, TurnTaskResult } from "../subtasks/types.js";
5
+ import { LoopingAgent } from "../host/agent.js";
6
+ import type { SubagentClass } from "./subagent.js";
7
+ import type { RoundPolicy } from "./policy.js";
8
+ import { type RoundMode } from "./turn.js";
9
+ /**
10
+ * A **delegating** agent: the round loop, the durable Subtask DAG, and the
11
+ * isolated subagent execution beneath it.
12
+ *
13
+ * Everything {@link LoopingAgent} gives every agent, plus the half that only a
14
+ * delegating one needs — and it is all mechanism. A Workflow drives it through
15
+ * native Cloudflare RPC (`runTaskTurn`, `skipBlockedSubtasks`,
16
+ * `executeSubtaskChunk`, …), never HTTP: the DO is a private implementation
17
+ * detail of the Worker.
18
+ *
19
+ * ## Why core owns this
20
+ *
21
+ * Every method below is either idempotent recovery, cancellation ordering, or
22
+ * child lifecycle, and each one has an ordering that is load-bearing and
23
+ * invisible: the acknowledgment is appended *before* the rows exist; a fresh
24
+ * execution deletes its stale child but an ambiguous retry must not; a successful
25
+ * chunk defers its child's deletion to a single post-delivery sweep. Get any of
26
+ * them backwards and nothing fails to compile, nothing fails a lint, and the
27
+ * damage shows up as a duplicated reply or a false-positive error weeks later.
28
+ *
29
+ * None of it varies between agents. What varies is the {@link RoundPolicy} — the
30
+ * words — and the plugins.
31
+ *
32
+ * ## What this class does not know
33
+ *
34
+ * Nothing here names a domain. `resolveRuntime`, `enrichResult` and `onAbort` are
35
+ * hooks on `AgentPlugin`, so a plugin that leases an external session or scores a
36
+ * result gets that without a branch anywhere in this file. That inversion is what
37
+ * lets one class body serve every delegating agent.
38
+ */
39
+ export declare abstract class RoundAgentBase<TEnv extends Cloudflare.Env & AiEnv & A2ASecretsEnv = Cloudflare.Env & AiEnv & A2ASecretsEnv> extends LoopingAgent<TEnv> {
40
+ private _instructions?;
41
+ /**
42
+ * The words: the round contract, the budget-spent note, and the strings a user
43
+ * reads. Core ships none of them — see {@link RoundPolicy}.
44
+ */
45
+ protected abstract roundPolicy(): RoundPolicy;
46
+ /**
47
+ * The facet class this agent's subtasks execute in.
48
+ *
49
+ * A seam because each agent's children must reach that agent's plugins, and a
50
+ * facet cannot be handed a runtime: `parentAgent()` is an RPC stub, and a
51
+ * `SubtaskRuntime` is mostly functions. So the class itself carries the
52
+ * binding — see {@link file://./subagent.ts RecipeSubagentHost}.
53
+ */
54
+ protected abstract subagentClass(): SubagentClass;
55
+ /** The prompt suffixes, built once from this agent's installed subtask types. */
56
+ private get instructions();
57
+ /**
58
+ * The main agent's **work tools** for this caller — the `execute`-bearing tools
59
+ * every round runs its loop over. The control tools that *end* a round are not
60
+ * here; `runTurn` adds those.
61
+ *
62
+ * The Session's own `set_context`/`load_context` come first, with the installed
63
+ * plugins' tools layered over them: a soul that instructs the model to record
64
+ * durable facts with `set_context` needs it actually on the call.
65
+ *
66
+ * Which plugin tools appear is the plugins' business, not this class's. A
67
+ * plugin may shape its surface from durable state — offering a search only once
68
+ * there is something to search, because a tool whose only possible answer is
69
+ * "nothing here yet" costs a call to discover that and costs every round the
70
+ * tokens to describe it.
71
+ */
72
+ private mainAgentTools;
73
+ /** Age out this agent's subtask rows alongside the task rows. */
74
+ protected cleanupAgentState(): void;
75
+ /**
76
+ * One main-agent round: answer the user, or delegate a durable Subtask DAG and
77
+ * return the acknowledgment the user sees while it runs.
78
+ *
79
+ * This is the RPC boundary, so it is where the round's cost becomes a field. The
80
+ * budget is created here, handed to {@link decideRound} to be spent, and read
81
+ * back exactly once — so no branch of the round has to remember to report a
82
+ * number, and none can report the wrong one.
83
+ */
84
+ runTaskTurn(input: {
85
+ taskId: string;
86
+ text: string;
87
+ identity: GatewayIdentity;
88
+ round: number;
89
+ mode: RoundMode;
90
+ /** What the Task has left. Bounds this round. */
91
+ turnsRemaining: number;
92
+ push?: TurnPushContext;
93
+ }): Promise<TurnTaskResult>;
94
+ /**
95
+ * The round itself, charging `budget` as it goes.
96
+ *
97
+ * Idempotent, and the recovery order is the contract:
98
+ *
99
+ * 1. A canceled Task stops here.
100
+ * 2. A durable **final reply** means some round already answered — return it
101
+ * without inference. Re-answering could produce different words for a reply
102
+ * the user may already have received.
103
+ * 3. Durable **rows for this round** mean this round already delegated —
104
+ * recover its acknowledgment from the Session, with no inference and no
105
+ * duplicate rows.
106
+ * 4. Otherwise, infer.
107
+ *
108
+ * Cancellation is re-read **after** inference too, not just before it: the model
109
+ * call is the widest window in the round, and neither the Subtask rows nor the
110
+ * callback may land for a Task the caller already gave up on. The reply is
111
+ * already in the Session by then (`runTurn` appends under deterministic ids
112
+ * before returning) — that is durable history, not output the user sees.
113
+ *
114
+ * Returns a typed `failed` result when both models produce unusable output and
115
+ * no durable work exists to fall back on (the Workflow routes it to failed
116
+ * delivery); throws only on a transient fault, for the step to retry.
117
+ */
118
+ private decideRound;
119
+ /**
120
+ * Every round's branches for a Task, in stable ordinal order — what a round
121
+ * needs to reunite each earlier `delegate` call with its result. Built inside
122
+ * the DO and consumed here, so the 1 MiB Workflow-step cap that keeps
123
+ * {@link SubtaskNode} narrow does not apply.
124
+ */
125
+ private compositionBranches;
126
+ /** A Task's Subtasks, every round, in stable ordinal order. */
127
+ listSubtasks(taskId: string): Promise<Subtask[]>;
128
+ /**
129
+ * The Workflow's per-wave scan for **one round's** DAG: report a cancellation,
130
+ * or skip every pending Subtask blocked by a dependency that did not succeed and
131
+ * return the refreshed DAG as scheduler {@link SubtaskNode}s.
132
+ *
133
+ * Scoped to the round because dependency edges never cross one: an earlier
134
+ * round's rows are already terminal and irrelevant to this wave, and including
135
+ * them would only widen a projection that has a size cap.
136
+ *
137
+ * Skipping runs to a fixpoint because it propagates: a node skipped for a
138
+ * failed prerequisite blocks *its* dependents in turn. Bounded by the
139
+ * per-round maximum. Independent branches are untouched — one branch's failure
140
+ * never stops work that does not depend on it.
141
+ *
142
+ * The cancellation verdict rides along rather than being probed separately, so
143
+ * a wave costs one round trip and cannot act on a stale answer.
144
+ */
145
+ skipBlockedSubtasks(taskId: string, round: number): Promise<SubtaskScan>;
146
+ /** Parent cancellation: cancel every still-pending Subtask. Returns the count. */
147
+ cancelPendingSubtasks(taskId: string): Promise<number>;
148
+ /**
149
+ * Force one branch terminal after the Workflow gave up on it: its
150
+ * `execute:<id>` step exhausted every retry, so `executeSubtaskChunk` will not
151
+ * be called again and no one else will resolve the row.
152
+ *
153
+ * The Workflow fails the *branch* rather than the Task so composition can
154
+ * disclose the gap while sibling branches keep their durable results. The
155
+ * managed child releases its external state and is then swept, both
156
+ * best-effort — nothing will read its cache now, but an abandoned run may still
157
+ * hold something outside this system, and dropping the child is not a reason to
158
+ * leak it. Idempotent: a no-op once the row is terminal.
159
+ */
160
+ failSubtask(id: SubtaskId, error: string): Promise<void>;
161
+ /**
162
+ * Run **one durable chunk** of a Subtask in an isolated, managed subagent,
163
+ * posting any progress the chunk emitted and durably recording a terminal
164
+ * outcome.
165
+ *
166
+ * The Workflow calls this repeatedly (chunk 0, 1, …) until it returns
167
+ * `done: true` — a single-chunk recipe finishes on chunk 0, a long one spans
168
+ * many. The row status distinguishes the cases with no chunk-number bookkeeping:
169
+ * chunk 0 claims `pending → running` (fresh — delete any stale child); every
170
+ * later chunk (and every retry) finds the row already `running` and leaves the
171
+ * child alone so its checkpointed run state resumes.
172
+ *
173
+ * The lifecycle rules that make it safe to re-run:
174
+ *
175
+ * - A terminal row short-circuits: the result is already durable.
176
+ * - A **fresh** execution deletes any stale child first.
177
+ * - An **ambiguous retry** (row already `running`) must *not* delete the child.
178
+ * - A **successful** chunk does *not* delete its child here — deletion is
179
+ * deferred to a single post-delivery {@link sweepTaskChildren}, so a facet is
180
+ * never aborted in the same tick its RPC returned (telemetry would mis-record
181
+ * that as a failure). The result is still copied into the parent before any
182
+ * delete; that now happens strictly later.
183
+ *
184
+ * Throws on a transient fault (the step retries and the child resumes from its
185
+ * checkpoint) and on scheduler-invariant violations — both are bugs, not
186
+ * outcomes.
187
+ */
188
+ executeSubtaskChunk(id: SubtaskId, chunk: number, push?: TurnPushContext): Promise<SubtaskChunkOutcome>;
189
+ /**
190
+ * Delete every managed child this Task created — called **once**, from the
191
+ * Workflow's delivery step, after the Task is terminal.
192
+ *
193
+ * Per-Subtask deletion is deferred to here rather than run right after each
194
+ * successful chunk because `deleteSubAgent` aborts the facet: aborting a child
195
+ * in the same tick its `executeChunk` RPC returned records that
196
+ * already-successful invocation as `outcome:exception`, which is pure
197
+ * false-positive error noise (one per completed Subtask). By delivery every
198
+ * `execute` step has unwound, so these deletes hit **idle** facets and record
199
+ * nothing. Best-effort and idempotent — a name with no live facet is a silent
200
+ * no-op — so a Workflow replay of the sweep step is safe.
201
+ *
202
+ * Cancellation paths do their own child cleanup, so a canceled Task that never
203
+ * reaches delivery does not leak.
204
+ */
205
+ sweepTaskChildren(taskId: string): Promise<void>;
206
+ /**
207
+ * The shared front half of a chunk: resolve terminal/cancel short-circuits,
208
+ * validate the Recipe, claim the row (fresh-vs-retry), and assemble the
209
+ * execution request. Deterministic every chunk, so the request — and thus its
210
+ * fingerprint — is identical across a run's chunks and their retries.
211
+ */
212
+ private prepareChunk;
213
+ /**
214
+ * Invoke the managed child for one chunk, recreating it once on a fingerprint
215
+ * mismatch (a stale child from a *different* request — recoverable exactly once;
216
+ * a second mismatch is a genuine lifecycle bug and must surface).
217
+ */
218
+ private executeChunkInChild;
219
+ /** Let the owning plugin release whatever `resolveRuntime` acquired. */
220
+ private releaseRuntime;
221
+ /** The same, from a durable row rather than a built request. Best-effort. */
222
+ private releaseRuntimeQuietly;
223
+ /** The validated tool families for a Subtask type, or none if unusable. */
224
+ private toolFamiliesForType;
225
+ /**
226
+ * Best-effort release of a child's external state on cancellation (e.g. close a
227
+ * leased resource recorded in its workspace). Swallows failures — an unreleased
228
+ * resource is a documented residual, not a reason to fail cancellation.
229
+ */
230
+ private abortChildQuietly;
231
+ /** Persist a child's terminal outcome. Returns whether the guarded write applied. */
232
+ private persistResult;
233
+ /**
234
+ * Load a Subtask's dependency results, in ordinal order.
235
+ *
236
+ * Order is semantic: it feeds the child's request fingerprint, so a retry must
237
+ * build the identical array or the cache misses. A dependency that has not
238
+ * completed means the scheduler ran this node too early.
239
+ */
240
+ private loadDependencyResults;
241
+ /** Re-read a Subtask that must exist (it was just written). */
242
+ private requireSubtask;
243
+ /** Delete a managed child, swallowing failures (used on best-effort sweeps). */
244
+ private deleteChildQuietly;
245
+ /** Whether the parent Task has been canceled (checked before and after work). */
246
+ private isTaskCanceled;
247
+ /**
248
+ * Interrupt a canceled Task's live children: each `running` Subtask's managed
249
+ * child gets `abortRun`, so a long recipe stops at its current model call
250
+ * instead of at the next chunk boundary (up to `chunkSoftMs` later). A subtask
251
+ * that already finished (e.g. one branch of a wave completed while another was
252
+ * still running) is deliberately retained until the terminal-delivery sweep —
253
+ * but a canceled Task never reaches delivery, so its idle child is deleted
254
+ * here instead, or it would leak until the 30-day row cleanup regardless of
255
+ * that row's own age.
256
+ *
257
+ * Only `running` rows have a live RPC to abort. `subAgent` *creates* a facet
258
+ * that does not exist, so calling it for a `pending` row (no facet was ever
259
+ * made) would materialize one just to delete it — `deleteChildQuietly` is a
260
+ * silent no-op there, so it is called unconditionally instead of branching on
261
+ * status. Bounded by `maxSubtasks`. Best-effort throughout: a child that
262
+ * cannot be reached is logged, never fatal — cancellation must not fail
263
+ * because cleanup did.
264
+ */
265
+ protected onTaskCanceled(taskId: string): Promise<void>;
266
+ }
267
+ //# sourceMappingURL=agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/round/agent.ts"],"names":[],"mappings":"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"}