@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
@@ -1,47 +1,39 @@
1
1
  import { type JWTPayload } from "jose";
2
+ import { type GatewayIdentity } from "@loopingai/a2a-protocol";
2
3
  /**
3
- * Default namespaced claim carrying the minimal caller identity.
4
+ * Verify the gateway identity JWT (the "B authenticates A" half of zero-trust).
4
5
  *
5
- * Overridable via {@link VerifyOptions.identityClaim} for a deployment that
6
- * isn't behind looping-gateway; the default is the Looping namespace so an
7
- * agent built on this package needs no configuration to interoperate.
8
- */
9
- export declare const IDENTITY_CLAIM = "https://loopingai.org/identity";
10
- /**
11
- * Default namespaced claim naming the **tenant** the gateway minted this token
12
- * for which of the agents on this origin it authorizes the call to reach.
6
+ * The gateway signs a short-lived EdDSA JWT and sends it as a Bearer token on
7
+ * every A2A call. Per RFC 7515 §4.1.2 it embeds a `jku` header pointing at its
8
+ * public JWKS, so remote agents don't need a separately configured JWKS URL —
9
+ * they read `jku` straight from the token and verify the key from there.
10
+ *
11
+ * Security: the `jku` origin is validated against the allowed origins before
12
+ * fetching, preventing key-injection attacks (an attacker cannot point `jku` at
13
+ * their own JWKS and have it accepted).
13
14
  *
14
- * Several agents share one endpoint, so they also share an `aud`: the audience
15
- * proves the token was minted for *this deployment*, and can say nothing about
16
- * which agent on it. This claim is the only thing that can, which is why the
17
- * Worker refuses a token that omits it rather than falling back to a default.
18
- * Without it `tenant` would be an unauthenticated field in the request body,
19
- * and a token legitimately issued for one agent could be replayed against any
20
- * of its siblings.
15
+ * **This file is a guardian.** The four checks below `jku` present → origin
16
+ * allowlist `iss` origin equals `jku` origin `jwtVerify` pinned to EdDSA
17
+ * are the whole zero-trust contract, and they arrived here byte-identical from
18
+ * two independently-evolved agents. Do not weaken any of them, do not make any
19
+ * of them optional, and do not add a bypass for local development: run a local
20
+ * gateway instead.
21
21
  */
22
- export declare const TENANT_CLAIM = "https://loopingai.org/tenant";
23
22
  /**
24
- * The gateway-agent instance identity forwarded by the gatewayi.e. which
25
- * registered agent instance dispatched this call, not the human end user.
26
- * Mirrors `RemoteIdentity` in looping-gateway's `src/auth/agent-jwt.ts`.
23
+ * The wire contract claim names, algorithm, identity shape comes from
24
+ * `@loopingai/a2a-protocol`, which the gateway also depends on directly.
27
25
  *
28
- * Any end user travels unverified, inline in the message text; the gateway
29
- * deliberately excludes it from this signed claim so a remote agent cannot read
30
- * the full caller auth context. Every field is optional because the claim is
31
- * whatever the issuer put there {@link GatewayIdentity.key} is the only one
32
- * anything downstream depends on, and a caller without it is rejected before a
33
- * DO is ever addressed.
26
+ * It used to be declared here and again in the gateway, each with a comment
27
+ * saying it must match the other, because the gateway is not an agent and must
28
+ * not import this package. That failed exactly as it always does: one side
29
+ * moved to the `loopingai.org` namespace while the other still minted
30
+ * `https://looping.ai/tenant`, verification read an empty tenant, and every
31
+ * request 401'd with both builds green.
32
+ *
33
+ * Re-exported below so nothing downstream of `@loopingai/core/a2a` has to know
34
+ * the split happened — an agent still imports these from here.
34
35
  */
35
- export interface GatewayIdentity {
36
- /** Canonical instance key, e.g. `custom:7:analytics`. */
37
- key?: string;
38
- /** Registry name of the logical agent instance. */
39
- name?: string;
40
- /** Dispatch kind of the caller (`"custom"` for remote agents). */
41
- kind?: string;
42
- /** Workspace the calling agent instance belongs to. */
43
- workspaceId?: number | null;
44
- }
36
+ export { IDENTITY_CLAIM, TENANT_CLAIM, type GatewayIdentity } from "@loopingai/a2a-protocol";
45
37
  /** Thrown when a gateway token is missing or fails verification. */
46
38
  export declare class GatewayAuthError extends Error {
47
39
  constructor(message: string);
@@ -1 +1 @@
1
- {"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/a2a/verify.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,UAAU,EAChB,MAAM,MAAM,CAAC;AAyBd;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,mCAAmC,CAAC;AAE/D;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,YAAY,iCAAiC,CAAC;AAE3D;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,eAAe;IAC9B,yDAAyD;IACzD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,mDAAmD;IACnD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kEAAkE;IAClE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uDAAuD;IACvD,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,oEAAoE;AACpE,qBAAa,gBAAiB,SAAQ,KAAK;gBAC7B,OAAO,EAAE,MAAM;CAI5B;AAcD,wEAAwE;AACxE,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAI3D;AAED,MAAM,WAAW,aAAa;IAC5B,iFAAiF;IACjF,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,8EAA8E;IAC9E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,8EAA8E;IAC9E,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAenE;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC;IACT,OAAO,EAAE,UAAU,CAAC;IACpB,QAAQ,EAAE,eAAe,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC,CA8CD"}
1
+ {"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/a2a/verify.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,UAAU,EAChB,MAAM,MAAM,CAAC;AACd,OAAO,EAIL,KAAK,eAAe,EACrB,MAAM,yBAAyB,CAAC;AAEjC;;;;;;;;;;;;;;;;;;GAkBG;AAEH;;;;;;;;;;;;;GAaG;AACH,OAAO,EACL,cAAc,EACd,YAAY,EACZ,KAAK,eAAe,EACrB,MAAM,yBAAyB,CAAC;AAEjC,oEAAoE;AACpE,qBAAa,gBAAiB,SAAQ,KAAK;gBAC7B,OAAO,EAAE,MAAM;CAI5B;AAcD,wEAAwE;AACxE,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAI3D;AAED,MAAM,WAAW,aAAa;IAC5B,iFAAiF;IACjF,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,8EAA8E;IAC9E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,8EAA8E;IAC9E,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAenE;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC;IACT,OAAO,EAAE,UAAU,CAAC;IACpB,QAAQ,EAAE,eAAe,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC,CAgDD"}
@@ -1,4 +1,5 @@
1
1
  import { createRemoteJWKSet, decodeJwt, decodeProtectedHeader, jwtVerify } from "jose";
2
+ import { A2A_JWS_ALG, readIdentityClaim, readTenantClaim } from "@loopingai/a2a-protocol";
2
3
  /**
3
4
  * Verify the gateway identity JWT (the "B authenticates A" half of zero-trust).
4
5
  *
@@ -18,29 +19,21 @@ import { createRemoteJWKSet, decodeJwt, decodeProtectedHeader, jwtVerify } from
18
19
  * of them optional, and do not add a bypass for local development: run a local
19
20
  * gateway instead.
20
21
  */
21
- /** Algorithm the gateway signs with — reject anything else. */
22
- const ALG = "EdDSA";
23
22
  /**
24
- * Default namespaced claim carrying the minimal caller identity.
23
+ * The wire contract — claim names, algorithm, identity shape — comes from
24
+ * `@loopingai/a2a-protocol`, which the gateway also depends on directly.
25
25
  *
26
- * Overridable via {@link VerifyOptions.identityClaim} for a deployment that
27
- * isn't behind looping-gateway; the default is the Looping namespace so an
28
- * agent built on this package needs no configuration to interoperate.
29
- */
30
- export const IDENTITY_CLAIM = "https://loopingai.org/identity";
31
- /**
32
- * Default namespaced claim naming the **tenant** the gateway minted this token
33
- * for — which of the agents on this origin it authorizes the call to reach.
26
+ * It used to be declared here and again in the gateway, each with a comment
27
+ * saying it must match the other, because the gateway is not an agent and must
28
+ * not import this package. That failed exactly as it always does: one side
29
+ * moved to the `loopingai.org` namespace while the other still minted
30
+ * `https://looping.ai/tenant`, verification read an empty tenant, and every
31
+ * request 401'd with both builds green.
34
32
  *
35
- * Several agents share one endpoint, so they also share an `aud`: the audience
36
- * proves the token was minted for *this deployment*, and can say nothing about
37
- * which agent on it. This claim is the only thing that can, which is why the
38
- * Worker refuses a token that omits it rather than falling back to a default.
39
- * Without it `tenant` would be an unauthenticated field in the request body,
40
- * and a token legitimately issued for one agent could be replayed against any
41
- * of its siblings.
33
+ * Re-exported below so nothing downstream of `@loopingai/core/a2a` has to know
34
+ * the split happened an agent still imports these from here.
42
35
  */
43
- export const TENANT_CLAIM = "https://loopingai.org/tenant";
36
+ export { IDENTITY_CLAIM, TENANT_CLAIM } from "@loopingai/a2a-protocol";
44
37
  /** Thrown when a gateway token is missing or fails verification. */
45
38
  export class GatewayAuthError extends Error {
46
39
  constructor(message) {
@@ -125,15 +118,17 @@ export async function verifyGatewayToken(token, opts) {
125
118
  const { payload } = await jwtVerify(token, jwksFor(jku), {
126
119
  issuer: allowedOrigins,
127
120
  audience: opts.audience,
128
- algorithms: [ALG]
121
+ algorithms: [A2A_JWS_ALG]
129
122
  });
130
- const claim = opts.identityClaim ?? IDENTITY_CLAIM;
131
- const identity = payload[claim] ?? {};
132
- const tenant = payload[opts.tenantClaim ?? TENANT_CLAIM];
123
+ // Read through the protocol package's readers rather than indexing the
124
+ // payload here: they are where "an absent or malformed claim yields an
125
+ // empty value, never a default" has its single implementation, and the
126
+ // emptiness is load-bearing — `createA2AWorker` compares the tenant against
127
+ // the one the request body addressed, and `""` matches none of them.
133
128
  return {
134
129
  payload,
135
- identity,
136
- tenant: typeof tenant === "string" ? tenant : ""
130
+ identity: readIdentityClaim(payload, opts.identityClaim),
131
+ tenant: readTenantClaim(payload, opts.tenantClaim)
137
132
  };
138
133
  }
139
134
  catch (err) {
@@ -1 +1 @@
1
- {"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/a2a/verify.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/a2a/verify.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,SAAS,EACT,qBAAqB,EACrB,SAAS,EAEV,MAAM,MAAM,CAAC;AACd,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,eAAe,EAEhB,MAAM,yBAAyB,CAAC;AAEjC;;;;;;;;;;;;;;;;;;GAkBG;AAEH;;;;;;;;;;;;;GAaG;AACH,OAAO,EACL,cAAc,EACd,YAAY,EAEb,MAAM,yBAAyB,CAAC;AAEjC,oEAAoE;AACpE,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IACzC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF;AAED,8EAA8E;AAC9E,oDAAoD;AACpD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAiD,CAAC;AAC3E,SAAS,OAAO,CAAC,GAAW;IAC1B,IAAI,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,GAAG,GAAG,kBAAkB,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QACvC,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,WAAW,CAAC,OAAgB;IAC1C,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC;IAC1D,MAAM,KAAK,GAAG,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IACrD,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACjC,CAAC;AAYD;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CAAC,OAAiB;IACvD,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;QAC5B,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;QAC9B,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,gBAAgB,CAAC,wCAAwC,CAAC,CAAC;QACvE,CAAC;QACD,IAAI,CAAC;YACH,OAAO,IAAI,GAAG,CAAC,WAAW,OAAO,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC;QAC3E,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,MAAM,IAAI,gBAAgB,CACxB,mCAAmC,MAAM,MAAM,OAAO,EAAE,CACzD,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,KAAa,EACb,IAAmB;IAMnB,IAAI,CAAC;QACH,MAAM,cAAc,GAAG,uBAAuB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACpE,uEAAuE;QACvE,sEAAsE;QACtE,MAAM,MAAM,GAAG,qBAAqB,CAAC,KAAK,CAAqB,CAAC;QAChE,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;QACvB,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,gBAAgB,CACxB,kDAAkD,CACnD,CAAC;QACJ,CAAC;QACD,qEAAqE;QACrE,oEAAoE;QACpE,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;QACtC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YACxC,MAAM,IAAI,gBAAgB,CACxB,eAAe,SAAS,yCAAyC,CAClE,CAAC;QACJ,CAAC;QACD,0EAA0E;QAC1E,gEAAgE;QAChE,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC;QAC1C,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;QACzC,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,MAAM,IAAI,gBAAgB,CACxB,eAAe,SAAS,gCAAgC,SAAS,GAAG,CACrE,CAAC;QACJ,CAAC;QACD,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE;YACvD,MAAM,EAAE,cAAc;YACtB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,UAAU,EAAE,CAAC,WAAW,CAAC;SAC1B,CAAC,CAAC;QACH,uEAAuE;QACvE,uEAAuE;QACvE,uEAAuE;QACvE,4EAA4E;QAC5E,qEAAqE;QACrE,OAAO;YACL,OAAO;YACP,QAAQ,EAAE,iBAAiB,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC;YACxD,MAAM,EAAE,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC;SACnD,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,gBAAgB;YAAE,MAAM,GAAG,CAAC;QAC/C,MAAM,IAAI,gBAAgB,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC;IACrD,CAAC;AACH,CAAC"}
@@ -1,11 +1,22 @@
1
1
  /**
2
2
  * `@loopingai/core/agent` — the primitives a loop is built from.
3
3
  *
4
- * Core ships no loop. `turn.ts` / `loop.ts` are the agent's, because how a round
5
- * ends is the one thing every agent genuinely differs on. What core owns is
6
- * everything both predecessor loops needed identically: the session, the model
7
- * pair with its fallback, the budget, and the control-tool abstraction that
8
- * turns "the model called something that ends the round" into a checked value.
4
+ * The session, the model pair with its fallback, the budget, and the
5
+ * control-tool abstraction that turns "the model called something that ends the
6
+ * round" into a checked value. Everything both predecessor loops needed
7
+ * identically, and nothing about how a round is shaped.
8
+ *
9
+ * This subpath ships **no loop** — that is what makes it importable by one. A
10
+ * loop module needs these primitives without also pulling in a Durable Object
11
+ * base class and drizzle, which is why `LoopingAgent` lives in
12
+ * `@loopingai/core/host` and the delegating round loop in
13
+ * `@loopingai/core/round`.
14
+ *
15
+ * Core as a whole *does* now ship a loop, opt-in, in `/round`. The rule it
16
+ * still keeps is narrower and better: **core ships no prompt copy and no
17
+ * policy** — see `AGENTS.md`, "The line core does not cross". An agent that
18
+ * wants a different round shape imports none of `/round` and builds it from
19
+ * exactly what is here.
9
20
  */
10
21
  export { newTurnBudget, stepAllowance, type TurnBudget } from "./budget.js";
11
22
  export { createModelRuntime, type GatewayMetadata, type ModelOverrides, type ModelPair, type ModelRuntime, type ModelRuntimeDeps } from "./model.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/agent/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAE5E,OAAO,EACL,kBAAkB,EAClB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,SAAS,EACd,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACtB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,UAAU,EACV,iBAAiB,EACjB,mBAAmB,EACnB,KAAK,mBAAmB,EACxB,KAAK,WAAW,EAChB,KAAK,WAAW,EACjB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,2BAA2B,EAC3B,mBAAmB,EACnB,sBAAsB,EACtB,SAAS,EACT,iBAAiB,EACjB,cAAc,EACd,WAAW,EACX,iBAAiB,EACjB,eAAe,EACf,KAAK,UAAU,EAChB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,+BAA+B,EAC/B,kBAAkB,EAClB,KAAK,SAAS,EACf,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,cAAc,EACd,KAAK,WAAW,EAChB,KAAK,YAAY,EAClB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,cAAc,EACf,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/agent/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAE5E,OAAO,EACL,kBAAkB,EAClB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,SAAS,EACd,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACtB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,UAAU,EACV,iBAAiB,EACjB,mBAAmB,EACnB,KAAK,mBAAmB,EACxB,KAAK,WAAW,EAChB,KAAK,WAAW,EACjB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,2BAA2B,EAC3B,mBAAmB,EACnB,sBAAsB,EACtB,SAAS,EACT,iBAAiB,EACjB,cAAc,EACd,WAAW,EACX,iBAAiB,EACjB,eAAe,EACf,KAAK,UAAU,EAChB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,+BAA+B,EAC/B,kBAAkB,EAClB,KAAK,SAAS,EACf,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,cAAc,EACd,KAAK,WAAW,EAChB,KAAK,YAAY,EAClB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,cAAc,EACf,MAAM,kBAAkB,CAAC"}
@@ -1,11 +1,22 @@
1
1
  /**
2
2
  * `@loopingai/core/agent` — the primitives a loop is built from.
3
3
  *
4
- * Core ships no loop. `turn.ts` / `loop.ts` are the agent's, because how a round
5
- * ends is the one thing every agent genuinely differs on. What core owns is
6
- * everything both predecessor loops needed identically: the session, the model
7
- * pair with its fallback, the budget, and the control-tool abstraction that
8
- * turns "the model called something that ends the round" into a checked value.
4
+ * The session, the model pair with its fallback, the budget, and the
5
+ * control-tool abstraction that turns "the model called something that ends the
6
+ * round" into a checked value. Everything both predecessor loops needed
7
+ * identically, and nothing about how a round is shaped.
8
+ *
9
+ * This subpath ships **no loop** — that is what makes it importable by one. A
10
+ * loop module needs these primitives without also pulling in a Durable Object
11
+ * base class and drizzle, which is why `LoopingAgent` lives in
12
+ * `@loopingai/core/host` and the delegating round loop in
13
+ * `@loopingai/core/round`.
14
+ *
15
+ * Core as a whole *does* now ship a loop, opt-in, in `/round`. The rule it
16
+ * still keeps is narrower and better: **core ships no prompt copy and no
17
+ * policy** — see `AGENTS.md`, "The line core does not cross". An agent that
18
+ * wants a different round shape imports none of `/round` and builds it from
19
+ * exactly what is here.
9
20
  */
10
21
  export { newTurnBudget, stepAllowance } from "./budget.js";
11
22
  export { createModelRuntime } from "./model.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/agent/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,aAAa,EAAE,aAAa,EAAmB,MAAM,aAAa,CAAC;AAE5E,OAAO,EACL,kBAAkB,EAMnB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,UAAU,EACV,iBAAiB,EACjB,mBAAmB,EAIpB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,2BAA2B,EAC3B,mBAAmB,EACnB,sBAAsB,EACtB,SAAS,EACT,iBAAiB,EACjB,cAAc,EACd,WAAW,EACX,iBAAiB,EACjB,eAAe,EAEhB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,+BAA+B,EAC/B,kBAAkB,EAEnB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,cAAc,EAGf,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,cAAc,EACf,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/agent/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,aAAa,EAAE,aAAa,EAAmB,MAAM,aAAa,CAAC;AAE5E,OAAO,EACL,kBAAkB,EAMnB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,UAAU,EACV,iBAAiB,EACjB,mBAAmB,EAIpB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,2BAA2B,EAC3B,mBAAmB,EACnB,sBAAsB,EACtB,SAAS,EACT,iBAAiB,EACjB,cAAc,EACd,WAAW,EACX,iBAAiB,EACjB,eAAe,EAEhB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,+BAA+B,EAC/B,kBAAkB,EAEnB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,cAAc,EAGf,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,cAAc,EACf,MAAM,kBAAkB,CAAC"}
package/dist/config.d.ts CHANGED
@@ -13,11 +13,29 @@
13
13
  */
14
14
  /** Model ids and per-call generation settings. */
15
15
  export interface ModelConfig {
16
- /** Workers AI model for the tool loop. Must support function calling. */
16
+ /**
17
+ * Workers AI model for the tool loop. Must support function calling.
18
+ *
19
+ * **Required — core ships no default.** Which model an agent runs on is the
20
+ * single most consequential thing about it: it sets the cost of every turn,
21
+ * the tool-calling reliability the whole control-tool design rests on, and the
22
+ * failure modes the fallback exists to escape. A default here would be core
23
+ * making that choice on a consumer's behalf, silently, and being wrong for
24
+ * most of them — the same reason core ships no prompt copy.
25
+ *
26
+ * It is also the value most likely to age badly. A model id baked into a
27
+ * published package survives every deprecation until someone bumps the
28
+ * package; one written in the agent that uses it is read by whoever owns the
29
+ * bill.
30
+ */
17
31
  chatModelId: string;
18
32
  /**
19
- * Tried when the primary throws. Should be a *different vendor and family* —
20
- * a same-family fallback shares the failure mode you are falling back from.
33
+ * Tried when the primary throws. **Required core ships no default.**
34
+ *
35
+ * Should be a *different vendor and family* — a same-family fallback shares
36
+ * the failure mode you are falling back from, which makes it a retry wearing
37
+ * a costume. Core cannot pick this for you precisely because it depends on
38
+ * what you chose as primary.
21
39
  */
22
40
  fallbackChatModelId: string;
23
41
  /** AI Gateway slug; `"default"` auto-provisions on first request. */
@@ -117,15 +135,39 @@ export interface CoreConfig {
117
135
  maxSubtasks: number;
118
136
  session: SessionConfig;
119
137
  }
138
+ /** The two ids an agent must choose for itself. Core has no opinion. */
139
+ export type RequiredModelIds = Pick<ModelConfig, "chatModelId" | "fallbackChatModelId">;
140
+ /**
141
+ * The baseline, which is everything core *does* still have an opinion about.
142
+ *
143
+ * Note what is missing: the model pair. This type is `CoreConfig` minus those
144
+ * two ids precisely so that no value of it can supply them — a default nobody
145
+ * declared is how an agent ends up billing a model its author never chose.
146
+ */
147
+ export type CoreConfigBaseline = Omit<CoreConfig, "model"> & {
148
+ model: Omit<ModelConfig, keyof RequiredModelIds>;
149
+ };
120
150
  /**
121
151
  * A working baseline. Every value is overridable; none is a ceiling. These are
122
152
  * the values both predecessor agents converged on in production, so they are a
123
153
  * reasonable place to start rather than an opinion about your domain.
154
+ *
155
+ * **It carries no model ids.** See {@link ModelConfig.chatModelId}.
156
+ */
157
+ export declare const DEFAULT_CORE_CONFIG: CoreConfigBaseline;
158
+ /**
159
+ * One level of optionality per nested group — enough for a config this shallow.
160
+ *
161
+ * `model` is the exception, and deliberately not optional: an agent must name
162
+ * its own primary and fallback. That is a compile error rather than a runtime
163
+ * one, so the omission is found while writing the agent rather than on the first
164
+ * request it serves.
124
165
  */
125
- export declare const DEFAULT_CORE_CONFIG: CoreConfig;
126
- /** One level of optionality per nested group — enough for a config this shallow. */
127
166
  export type CoreConfigOverrides = {
128
- [K in keyof CoreConfig]?: CoreConfig[K] extends object ? Partial<CoreConfig[K]> : CoreConfig[K];
167
+ [K in Exclude<keyof CoreConfig, "model">]?: CoreConfig[K] extends object ? Partial<CoreConfig[K]> : CoreConfig[K];
168
+ } & {
169
+ /** Required: the two model ids, plus any generation setting you want changed. */
170
+ model: RequiredModelIds & Partial<Omit<ModelConfig, keyof RequiredModelIds>>;
129
171
  };
130
172
  export declare class ConfigError extends Error {
131
173
  constructor(message: string);
@@ -138,5 +180,5 @@ export declare class ConfigError extends Error {
138
180
  * not call it per-request: the point of resolving is that every module downstream
139
181
  * reads the same object.
140
182
  */
141
- export declare function resolveConfig(overrides?: CoreConfigOverrides): CoreConfig;
183
+ export declare function resolveConfig(overrides: CoreConfigOverrides): CoreConfig;
142
184
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,kDAAkD;AAClD,MAAM,WAAW,WAAW;IAC1B,yEAAyE;IACzE,WAAW,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,mBAAmB,EAAE,MAAM,CAAC;IAC5B,qEAAqE;IACrE,WAAW,EAAE,MAAM,CAAC;IACpB;;;;;OAKG;IACH,eAAe,EAAE,MAAM,CAAC;IACxB,mFAAmF;IACnF,eAAe,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;CAC5C;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,WAAW;IAC1B;;;OAGG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB;;;;;;OAMG;IACH,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,0CAA0C;AAC1C,MAAM,WAAW,aAAa;IAC5B,yEAAyE;IACzE,eAAe,EAAE,MAAM,CAAC;IACxB,uEAAuE;IACvE,kBAAkB,EAAE,MAAM,CAAC;IAC3B;;;;;;;;;;;;;OAaG;IACH,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iFAAiF;IACjF,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,WAAW,CAAC;IACnB,iEAAiE;IACjE,eAAe,EAAE,WAAW,CAAC;IAC7B;;;;OAIG;IACH,cAAc,EAAE,WAAW,CAAC;IAC5B;;;;;;;;;;OAUG;IACH,gBAAgB,EAAE,MAAM,CAAC;IACzB;;;;;;;OAOG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,aAAa,CAAC;CACxB;AAED;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,EAAE,UAoBjC,CAAC;AAEF,oFAAoF;AACpF,MAAM,MAAM,mBAAmB,GAAG;KAC/B,CAAC,IAAI,MAAM,UAAU,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,SAAS,MAAM,GAClD,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GACtB,UAAU,CAAC,CAAC,CAAC;CAClB,CAAC;AAEF,qBAAa,WAAY,SAAQ,KAAK;gBACxB,OAAO,EAAE,MAAM;CAI5B;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,SAAS,GAAE,mBAAwB,GAAG,UAAU,CA2C7E"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,kDAAkD;AAClD,MAAM,WAAW,WAAW;IAC1B;;;;;;;;;;;;;;OAcG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB;;;;;;;OAOG;IACH,mBAAmB,EAAE,MAAM,CAAC;IAC5B,qEAAqE;IACrE,WAAW,EAAE,MAAM,CAAC;IACpB;;;;;OAKG;IACH,eAAe,EAAE,MAAM,CAAC;IACxB,mFAAmF;IACnF,eAAe,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;CAC5C;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,WAAW;IAC1B;;;OAGG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB;;;;;;OAMG;IACH,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,0CAA0C;AAC1C,MAAM,WAAW,aAAa;IAC5B,yEAAyE;IACzE,eAAe,EAAE,MAAM,CAAC;IACxB,uEAAuE;IACvE,kBAAkB,EAAE,MAAM,CAAC;IAC3B;;;;;;;;;;;;;OAaG;IACH,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iFAAiF;IACjF,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,WAAW,CAAC;IACnB,iEAAiE;IACjE,eAAe,EAAE,WAAW,CAAC;IAC7B;;;;OAIG;IACH,cAAc,EAAE,WAAW,CAAC;IAC5B;;;;;;;;;;OAUG;IACH,gBAAgB,EAAE,MAAM,CAAC;IACzB;;;;;;;OAOG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,aAAa,CAAC;CACxB;AAED,wEAAwE;AACxE,MAAM,MAAM,gBAAgB,GAAG,IAAI,CACjC,WAAW,EACX,aAAa,GAAG,qBAAqB,CACtC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,MAAM,kBAAkB,GAAG,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,GAAG;IAC3D,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,MAAM,gBAAgB,CAAC,CAAC;CAClD,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,EAAE,kBAoBjC,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,MAAM,mBAAmB,GAAG;KAC/B,CAAC,IAAI,OAAO,CAAC,MAAM,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,SAAS,MAAM,GACpE,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GACtB,UAAU,CAAC,CAAC,CAAC;CAClB,GAAG;IACF,iFAAiF;IACjF,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,gBAAgB,CAAC,CAAC,CAAC;CAC9E,CAAC;AAEF,qBAAa,WAAY,SAAQ,KAAK;gBACxB,OAAO,EAAE,MAAM;CAI5B;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,mBAAmB,GAAG,UAAU,CAsExE"}
package/dist/config.js CHANGED
@@ -15,11 +15,13 @@
15
15
  * A working baseline. Every value is overridable; none is a ceiling. These are
16
16
  * the values both predecessor agents converged on in production, so they are a
17
17
  * reasonable place to start rather than an opinion about your domain.
18
+ *
19
+ * **It carries no model ids.** See {@link ModelConfig.chatModelId}.
18
20
  */
19
21
  export const DEFAULT_CORE_CONFIG = {
20
22
  model: {
21
- chatModelId: "@cf/zai-org/glm-5.2",
22
- fallbackChatModelId: "@cf/moonshotai/kimi-k2.7-code",
23
+ // Not a model: an AI Gateway slug, and `"default"` is Cloudflare's own
24
+ // auto-provision behaviour rather than a choice core is making for anyone.
23
25
  aiGatewayId: "default",
24
26
  maxOutputTokens: 16_384,
25
27
  reasoningEffort: "medium"
@@ -50,7 +52,7 @@ export class ConfigError extends Error {
50
52
  * not call it per-request: the point of resolving is that every module downstream
51
53
  * reads the same object.
52
54
  */
53
- export function resolveConfig(overrides = {}) {
55
+ export function resolveConfig(overrides) {
54
56
  const config = {
55
57
  model: { ...DEFAULT_CORE_CONFIG.model, ...overrides.model },
56
58
  mainAgentLimits: {
@@ -70,6 +72,26 @@ export function resolveConfig(overrides = {}) {
70
72
  throw new ConfigError(`${name} must be a positive number, got ${value}`);
71
73
  }
72
74
  };
75
+ // The type already requires both ids; this catches the JavaScript consumer,
76
+ // the `as CoreConfigOverrides` cast, and the empty string — which typechecks
77
+ // and then reaches Workers AI as a model that does not exist, failing on the
78
+ // first generation with a binding error that names nothing useful.
79
+ const modelId = (value, name) => {
80
+ if (typeof value !== "string" || value.trim() === "") {
81
+ throw new ConfigError(`model.${name} is required and must be a non-empty model id — core ` +
82
+ `ships no default, because which model an agent runs on is the agent's ` +
83
+ `most consequential choice and cannot be made on its behalf`);
84
+ }
85
+ };
86
+ modelId(config.model.chatModelId, "chatModelId");
87
+ modelId(config.model.fallbackChatModelId, "fallbackChatModelId");
88
+ // A fallback identical to the primary is a retry wearing a costume: it shares
89
+ // the outage, the rate limit and the deprecation you are falling back from.
90
+ if (config.model.chatModelId === config.model.fallbackChatModelId) {
91
+ throw new ConfigError(`model.fallbackChatModelId must differ from model.chatModelId (both are ` +
92
+ `'${config.model.chatModelId}') — a same-model fallback shares every ` +
93
+ `failure mode you are falling back from`);
94
+ }
73
95
  positive(config.mainAgentLimits.maxTurns, "mainAgentLimits.maxTurns");
74
96
  positive(config.mainAgentLimits.maxWallMs, "mainAgentLimits.maxWallMs");
75
97
  positive(config.subagentLimits.maxTurns, "subagentLimits.maxTurns");
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -68,8 +68,16 @@ export declare function makeTasks(db: DB): {
68
68
  * it. That closes the window between a workflow's terminal build and its
69
69
  * callback — the read-check-write is synchronous here, so a `CancelTask`
70
70
  * landing mid-delivery makes this return `false` and the notify never fires.
71
- * Writing `canceled` onto a live row stays allowed: that is how the a2a-js
72
- * handler's own cancel branch records the cancellation.
71
+ *
72
+ * The reverse direction is guarded too: writing `canceled` over an already
73
+ * `completed`/`failed` row is refused, mirroring {@link cancel}'s own source
74
+ * guard. Without it, a cancellation landing between the Workflow's `complete`
75
+ * and `notify` steps — separate, independently-retried steps — could flip
76
+ * storage to canceled while `deliver()` still posts the cached completed
77
+ * task it already built, the exact race this guard exists to close. Writing
78
+ * `canceled` onto a `submitted`/`working` row, or re-writing it onto an
79
+ * already-`canceled` one, stays allowed: that is how the a2a-js handler's own
80
+ * cancel branch records the cancellation.
73
81
  */
74
82
  save(task: Task): boolean;
75
83
  /**
@@ -81,9 +89,15 @@ export declare function makeTasks(db: DB): {
81
89
  */
82
90
  markWorking(taskId: string): "ok" | "canceled";
83
91
  /**
84
- * Flip the task to `canceled` and return it. Terminal: once this lands,
85
- * {@link save} refuses every non-canceled write, so no completed or failed
86
- * callback can be built from this row afterwards.
92
+ * Flip the task to `canceled` and return it, or `null` if the row is not
93
+ * eligible unknown, or already past `submitted`/`working`. Guarding the
94
+ * source state (not just the destination, as {@link save} does) matters
95
+ * because `complete`/`notify` are separate Workflow steps: without this, a
96
+ * cancellation landing between them would flip an already-`completed` or
97
+ * `failed` row to `canceled` right as `deliver()` posts the terminal
98
+ * callback it had already built, silently rewriting a delivered result.
99
+ * Terminal: once this lands, {@link save} refuses every non-canceled write,
100
+ * so no completed or failed callback can be built from this row afterwards.
87
101
  */
88
102
  cancel(taskId: string): PlainTask | null;
89
103
  /** Delete all tasks older than 30 days (called by the maintenance cron). */
@@ -1 +1 @@
1
- {"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../../src/db/models/tasks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE9C,OAAO,EAAkB,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAGnE,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAMnC,kFAAkF;AAClF,MAAM,WAAW,aAAa;IAC5B,iEAAiE;IACjE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6DAA6D;IAC7D,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,6EAA6E;IAC7E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,qEAAqE;IACrE,gBAAgB,EAAE,OAAO,CAAC;IAC1B,8EAA8E;IAC9E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,SAAS,CAE7C;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,SAAS,CAAC,EAAE,EAAE,EAAE;IAiC5B;;;;OAIG;iBACU;QACX,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;KACnB,GAAG,SAAS;IAwBb,6EAA6E;gBACjE,MAAM,GAAG,SAAS,GAAG,IAAI;IAIrC;;;OAGG;gBACS,aAAa,GAAG;QAAE,KAAK,EAAE,SAAS,EAAE,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE;IAiCrE;;;;;;;;;;;OAWG;eACQ,IAAI,GAAG,OAAO;IAazB;;;;;;OAMG;wBACiB,MAAM,GAAG,IAAI,GAAG,UAAU;IAe9C;;;;OAIG;mBACY,MAAM,GAAG,SAAS,GAAG,IAAI;IAaxC,4EAA4E;eACjE,IAAI;EAKlB"}
1
+ {"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../../src/db/models/tasks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE9C,OAAO,EAAkB,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAGnE,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAMnC,kFAAkF;AAClF,MAAM,WAAW,aAAa;IAC5B,iEAAiE;IACjE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6DAA6D;IAC7D,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,6EAA6E;IAC7E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,qEAAqE;IACrE,gBAAgB,EAAE,OAAO,CAAC;IAC1B,8EAA8E;IAC9E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,SAAS,CAE7C;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,SAAS,CAAC,EAAE,EAAE,EAAE;IAiC5B;;;;OAIG;iBACU;QACX,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;KACnB,GAAG,SAAS;IAwBb,6EAA6E;gBACjE,MAAM,GAAG,SAAS,GAAG,IAAI;IAIrC;;;OAGG;gBACS,aAAa,GAAG;QAAE,KAAK,EAAE,SAAS,EAAE,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE;IAiCrE;;;;;;;;;;;;;;;;;;;OAmBG;eACQ,IAAI,GAAG,OAAO;IA0BzB;;;;;;OAMG;wBACiB,MAAM,GAAG,IAAI,GAAG,UAAU;IAe9C;;;;;;;;;;OAUG;mBACY,MAAM,GAAG,SAAS,GAAG,IAAI;IAoBxC,4EAA4E;eACjE,IAAI;EAKlB"}
@@ -133,14 +133,33 @@ export function makeTasks(db) {
133
133
  * it. That closes the window between a workflow's terminal build and its
134
134
  * callback — the read-check-write is synchronous here, so a `CancelTask`
135
135
  * landing mid-delivery makes this return `false` and the notify never fires.
136
- * Writing `canceled` onto a live row stays allowed: that is how the a2a-js
137
- * handler's own cancel branch records the cancellation.
136
+ *
137
+ * The reverse direction is guarded too: writing `canceled` over an already
138
+ * `completed`/`failed` row is refused, mirroring {@link cancel}'s own source
139
+ * guard. Without it, a cancellation landing between the Workflow's `complete`
140
+ * and `notify` steps — separate, independently-retried steps — could flip
141
+ * storage to canceled while `deliver()` still posts the cached completed
142
+ * task it already built, the exact race this guard exists to close. Writing
143
+ * `canceled` onto a `submitted`/`working` row, or re-writing it onto an
144
+ * already-`canceled` one, stays allowed: that is how the a2a-js handler's own
145
+ * cancel branch records the cancellation.
138
146
  */
139
147
  save(task) {
140
148
  const existing = readOne(task.id);
141
- if (existing !== null &&
142
- stateOf(existing) === TaskState.TASK_STATE_CANCELED &&
143
- stateOf(task) !== TaskState.TASK_STATE_CANCELED) {
149
+ if (existing === null) {
150
+ upsert(task);
151
+ return true;
152
+ }
153
+ const existingState = stateOf(existing);
154
+ const incomingState = stateOf(task);
155
+ if (existingState === TaskState.TASK_STATE_CANCELED &&
156
+ incomingState !== TaskState.TASK_STATE_CANCELED) {
157
+ return false;
158
+ }
159
+ if (incomingState === TaskState.TASK_STATE_CANCELED &&
160
+ existingState !== TaskState.TASK_STATE_SUBMITTED &&
161
+ existingState !== TaskState.TASK_STATE_WORKING &&
162
+ existingState !== TaskState.TASK_STATE_CANCELED) {
144
163
  return false;
145
164
  }
146
165
  upsert(task);
@@ -171,14 +190,25 @@ export function makeTasks(db) {
171
190
  return "ok";
172
191
  },
173
192
  /**
174
- * Flip the task to `canceled` and return it. Terminal: once this lands,
175
- * {@link save} refuses every non-canceled write, so no completed or failed
176
- * callback can be built from this row afterwards.
193
+ * Flip the task to `canceled` and return it, or `null` if the row is not
194
+ * eligible unknown, or already past `submitted`/`working`. Guarding the
195
+ * source state (not just the destination, as {@link save} does) matters
196
+ * because `complete`/`notify` are separate Workflow steps: without this, a
197
+ * cancellation landing between them would flip an already-`completed` or
198
+ * `failed` row to `canceled` right as `deliver()` posts the terminal
199
+ * callback it had already built, silently rewriting a delivered result.
200
+ * Terminal: once this lands, {@link save} refuses every non-canceled write,
201
+ * so no completed or failed callback can be built from this row afterwards.
177
202
  */
178
203
  cancel(taskId) {
179
204
  const task = readOne(taskId);
180
205
  if (!task)
181
206
  return null;
207
+ const state = stateOf(task);
208
+ if (state !== TaskState.TASK_STATE_SUBMITTED &&
209
+ state !== TaskState.TASK_STATE_WORKING) {
210
+ return null;
211
+ }
182
212
  task.status = {
183
213
  ...task.status,
184
214
  state: TaskState.TASK_STATE_CANCELED,
@@ -1 +1 @@
1
- {"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../../src/db/models/tasks.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../../src/db/models/tasks.ts"],"names":[],"mappings":"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"}