@adia-ai/agent 0.8.28 → 0.8.30

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 (58) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/README.md +384 -11
  3. package/agent.d.ts +44 -3
  4. package/agent.d.ts.map +1 -1
  5. package/agent.js +172 -8
  6. package/agent.js.map +1 -1
  7. package/events.d.ts +46 -2
  8. package/events.d.ts.map +1 -1
  9. package/events.js +30 -1
  10. package/events.js.map +1 -1
  11. package/guardrail.d.ts +68 -0
  12. package/guardrail.d.ts.map +1 -0
  13. package/guardrail.js +79 -0
  14. package/guardrail.js.map +1 -0
  15. package/index.d.ts +15 -7
  16. package/index.d.ts.map +1 -1
  17. package/index.js +7 -3
  18. package/index.js.map +1 -1
  19. package/integrations.d.ts +19 -2
  20. package/integrations.d.ts.map +1 -1
  21. package/integrations.js +6 -1
  22. package/integrations.js.map +1 -1
  23. package/loop.d.ts +19 -8
  24. package/loop.d.ts.map +1 -1
  25. package/loop.js +176 -9
  26. package/loop.js.map +1 -1
  27. package/mcp-transport.d.ts +128 -0
  28. package/mcp-transport.d.ts.map +1 -0
  29. package/mcp-transport.js +361 -0
  30. package/mcp-transport.js.map +1 -0
  31. package/mcp.d.ts +120 -0
  32. package/mcp.d.ts.map +1 -0
  33. package/mcp.js +264 -0
  34. package/mcp.js.map +1 -0
  35. package/package.json +1 -1
  36. package/resource.d.ts +28 -3
  37. package/resource.d.ts.map +1 -1
  38. package/resource.js +43 -5
  39. package/resource.js.map +1 -1
  40. package/session.d.ts +18 -0
  41. package/session.d.ts.map +1 -1
  42. package/session.js +40 -0
  43. package/session.js.map +1 -1
  44. package/stub.d.ts +8 -0
  45. package/stub.d.ts.map +1 -1
  46. package/stub.js +13 -0
  47. package/stub.js.map +1 -1
  48. package/tools.d.ts +6 -0
  49. package/tools.d.ts.map +1 -1
  50. package/tools.js.map +1 -1
  51. package/trace.d.ts +50 -0
  52. package/trace.d.ts.map +1 -0
  53. package/trace.js +60 -0
  54. package/trace.js.map +1 -0
  55. package/workflow.d.ts +113 -11
  56. package/workflow.d.ts.map +1 -1
  57. package/workflow.js +93 -15
  58. package/workflow.js.map +1 -1
package/index.js CHANGED
@@ -8,11 +8,15 @@
8
8
  export { createAgent } from './agent.js';
9
9
  export { promptLayer, composeSystem } from './prompt.js';
10
10
  export { defineTool, executeTool, checkInput, toSpecs } from './tools.js';
11
- export { defineWorkflow, runWorkflow } from './workflow.js';
11
+ export { defineWorkflow, runWorkflow, toVerdict } from './workflow.js';
12
+ export { defineGuardrail } from './guardrail.js';
13
+ export { createTracer, consoleSink, TRACE_PHASES, isTracePhase } from './trace.js';
12
14
  export { defineResource } from './resource.js';
15
+ export { mcpServer, connectMcpSource } from './mcp.js';
16
+ export { connectStreamableHttp, McpError, McpConnectionError, McpCallError, DEFAULT_MCP_TIMEOUT_MS, } from './mcp-transport.js';
13
17
  export { createIntegrationRegistry, resolveIntegrations, buildToolDispatch, MAX_INTEGRATIONS } from './integrations.js';
14
- export { createSession, toJSON, fromJSON } from './session.js';
15
- export { reduce, reduceAll, PROGRESS_STAGES, isProgressStage } from './events.js';
18
+ export { createSession, toJSON, fromJSON, assertJsonSafe } from './session.js';
19
+ export { reduce, reduceAll, remember, PROGRESS_STAGES, isProgressStage } from './events.js';
16
20
  export { frameClientMessage, shouldRunTurn } from './frame.js';
17
21
  export { scriptClient } from './stub.js';
18
22
  //# sourceMappingURL=index.js.map
package/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEzD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1E,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5D,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C,OAAO,EAAE,yBAAyB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAExH,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAE/D,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAElF,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE/D,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEzD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1E,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAKvE,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEnF,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAEvD,OAAO,EACL,qBAAqB,EAAE,QAAQ,EAAE,kBAAkB,EAAE,YAAY,EAAE,sBAAsB,GAC1F,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,yBAAyB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAExH,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE/E,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE5F,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE/D,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC"}
package/integrations.d.ts CHANGED
@@ -48,6 +48,22 @@ export interface IntegrationManifest {
48
48
  };
49
49
  /** Display name for a human (picker, dropped-integration notice). */
50
50
  label: string;
51
+ /** Where the AUTHORITATIVE input check lives.
52
+ *
53
+ * - `'local'` (default) — this process is the only validator, so
54
+ * registration enforces the allowlist below: a keyword `checkInput`
55
+ * cannot enforce would make the manifest's declared contract a lie.
56
+ * - `'remote'` — the executor validates on its own side and reports a
57
+ * rejection back as a normal error result (an MCP server does exactly
58
+ * this). The schema is then a FAITHFUL COPY of a contract someone else
59
+ * owns, and trimming it to this package's allowlist would ship the
60
+ * model a weaker description of the tool than the tool actually has.
61
+ * `checkInput` still runs as a cheap pre-filter on the subset it knows.
62
+ *
63
+ * Only a manifest whose executor genuinely re-validates may claim
64
+ * `'remote'` — it is a statement about the executor, not an escape hatch
65
+ * for a schema that failed registration. */
66
+ validation?: 'local' | 'remote';
51
67
  auth?: {
52
68
  kind: 'serverKey';
53
69
  envKey: string;
@@ -64,8 +80,9 @@ export interface IntegrationContext extends ToolContext {
64
80
  }
65
81
  export interface IntegrationRegistry {
66
82
  /** Boot-fail-fast: throws on a duplicate id, a duplicate tool.name, an
67
- * inputSchema outside checkInput's supported subset, or a serverKey auth
68
- * with a missing/empty envKey. Returns the manifest on success. */
83
+ * inputSchema outside checkInput's supported subset (locally-validated
84
+ * manifests only see `validation`), or a serverKey auth with a
85
+ * missing/empty envKey. Returns the manifest on success. */
69
86
  register(manifest: IntegrationManifest): IntegrationManifest;
70
87
  get(id: string): IntegrationManifest | undefined;
71
88
  list(): IntegrationManifest[];
@@ -1 +1 @@
1
- {"version":3,"file":"integrations.d.ts","sourceRoot":"","sources":["src/integrations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAEH,OAAO,EAAc,KAAK,WAAW,EAAE,KAAK,OAAO,EAAE,MAAM,YAAY,CAAC;AAExE,MAAM,WAAW,mBAAmB;IAClC,kEAAkE;IAClE,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE;QACJ,sEAAsE;QACtE,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACtC,CAAC;IACF,qEAAqE;IACrE,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE;QAAE,IAAI,EAAE,WAAW,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAChE,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,kBAAkB,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAClG;AAED;;uEAEuE;AACvE,MAAM,WAAW,kBAAmB,SAAQ,WAAW;IACrD,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,mBAAmB;IAClC;;wEAEoE;IACpE,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,GAAG,mBAAmB,CAAC;IAC7D,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,mBAAmB,GAAG,SAAS,CAAC;IACjD,IAAI,IAAI,mBAAmB,EAAE,CAAC;CAC/B;AAyCD,wBAAgB,yBAAyB,IAAI,mBAAmB,CAoC/D;AAED;2EAC2E;AAC3E,eAAO,MAAM,gBAAgB,KAAK,CAAC;AAEnC,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,mBAAmB,EAAE,CAAC;IAChC;gFAC4E;IAC5E,OAAO,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAChD;AAED;;;;2EAI2E;AAC3E,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,mBAAmB,EAC7B,UAAU,EAAE,MAAM,EAAE,EACpB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GACtC,oBAAoB,CAyBtB;AAED;;;;;;;;;6EAS6E;AAC7E,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,mBAAmB,EAAE,EAC/B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GACtC;IAAE,KAAK,EAAE,OAAO,EAAE,CAAA;CAAE,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAY9C"}
1
+ {"version":3,"file":"integrations.d.ts","sourceRoot":"","sources":["src/integrations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAEH,OAAO,EAAc,KAAK,WAAW,EAAE,KAAK,OAAO,EAAE,MAAM,YAAY,CAAC;AAExE,MAAM,WAAW,mBAAmB;IAClC,kEAAkE;IAClE,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE;QACJ,sEAAsE;QACtE,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACtC,CAAC;IACF,qEAAqE;IACrE,KAAK,EAAE,MAAM,CAAC;IACd;;;;;;;;;;;;;;iDAc6C;IAC7C,UAAU,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;IAChC,IAAI,CAAC,EAAE;QAAE,IAAI,EAAE,WAAW,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAChE,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,kBAAkB,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAClG;AAED;;uEAEuE;AACvE,MAAM,WAAW,kBAAmB,SAAQ,WAAW;IACrD,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,mBAAmB;IAClC;;;iEAG6D;IAC7D,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,GAAG,mBAAmB,CAAC;IAC7D,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,mBAAmB,GAAG,SAAS,CAAC;IACjD,IAAI,IAAI,mBAAmB,EAAE,CAAC;CAC/B;AAyCD,wBAAgB,yBAAyB,IAAI,mBAAmB,CAyC/D;AAED;2EAC2E;AAC3E,eAAO,MAAM,gBAAgB,KAAK,CAAC;AAEnC,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,mBAAmB,EAAE,CAAC;IAChC;gFAC4E;IAC5E,OAAO,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAChD;AAED;;;;2EAI2E;AAC3E,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,mBAAmB,EAC7B,UAAU,EAAE,MAAM,EAAE,EACpB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GACtC,oBAAoB,CAyBtB;AAED;;;;;;;;;6EAS6E;AAC7E,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,mBAAmB,EAAE,EAC/B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GACtC;IAAE,KAAK,EAAE,OAAO,EAAE,CAAA;CAAE,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAY9C"}
package/integrations.js CHANGED
@@ -87,7 +87,12 @@ export function createIntegrationRegistry() {
87
87
  throw new Error(`createIntegrationRegistry: duplicate tool name "${manifest.tool.name}" — ` +
88
88
  `already registered by integration "${existingOwner}" (integration "${manifest.id}")`);
89
89
  }
90
- const schemaProblem = unsupportedSchemaFeature(manifest.tool.inputSchema);
90
+ const schemaProblem = manifest.validation === 'remote'
91
+ ? (manifest.tool.inputSchema && typeof manifest.tool.inputSchema === 'object'
92
+ && !Array.isArray(manifest.tool.inputSchema)
93
+ ? null
94
+ : 'must be an object')
95
+ : unsupportedSchemaFeature(manifest.tool.inputSchema);
91
96
  if (schemaProblem) {
92
97
  throw new Error(`createIntegrationRegistry "${manifest.id}": inputSchema ${schemaProblem}`);
93
98
  }
@@ -1 +1 @@
1
- {"version":3,"file":"integrations.js","sourceRoot":"","sources":["src/integrations.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"integrations.js","sourceRoot":"","sources":["src/integrations.ts"],"names":[],"mappings":"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"}
package/loop.d.ts CHANGED
@@ -2,18 +2,28 @@
2
2
  * The turn loop — stream → tool_use → execute → tool_result → continue.
3
3
  *
4
4
  * One agent.send() = one runLoop(). Each round streams a model response;
5
- * tool calls are executed (gated by onToolCall when provided) and fed back
6
- * as tool_result parts, then the loop re-enters. A round with no tool calls
7
- * is the final round: the loop emits `done` and returns.
5
+ * tool calls are executed (after the guardrail chain has seen them) and fed
6
+ * back as tool_result parts, then the loop re-enters. A round with no tool
7
+ * calls is the final round: the loop emits `done` and returns.
8
8
  *
9
9
  * Bounded by maxToolRounds: on exhaustion the loop emits `done` with the
10
10
  * synthetic stopReason 'max_tool_rounds' (loop-level signal, not a
11
11
  * provider value — the adapter-level never-normalize rule is untouched).
12
+ * An output guardrail's veto adds the second and last synthetic value,
13
+ * 'guardrail_denied'.
12
14
  *
13
15
  * The loop maintains its OWN working message list; the caller's Session is
14
16
  * never mutated here (reduce() is the single session writer). The events
15
17
  * this generator yields, folded through reduce(), reconstruct exactly the
16
18
  * messages the loop appended internally — one contract, two consumers.
19
+ * Memory is the same story: a tool calling `ctx.remember(patch)` does not
20
+ * write anything, it queues a `memory` EVENT the loop yields.
21
+ *
22
+ * Output guardrails see the text of a round that ENDS the turn. Text from a
23
+ * round that also called tools is intermediate reasoning the model itself
24
+ * will supersede, and denying it mid-turn has no coherent answer for the
25
+ * tool calls already emitted alongside it — so that text passes through
26
+ * unguarded (README records this caveat; revisit if a consumer needs it).
17
27
  *
18
28
  * Progress markers (law 3): the loop emits ONLY the stages it genuinely
19
29
  * reaches — `sent` before every provider call, `retry` before a call that
@@ -24,20 +34,21 @@
24
34
  * observe today — inventing an emission point for them would violate the
25
35
  * honesty guard, so they stay declared-but-unemitted here.
26
36
  */
27
- import type { ChatOpts, LLMClient, ToolUse } from '@adia-ai/llm';
37
+ import type { ChatOpts, LLMClient } from '@adia-ai/llm';
28
38
  import type { AgentEvent } from './events.js';
39
+ import { type Guardrail } from './guardrail.js';
29
40
  import type { Msg } from './session.js';
30
41
  import { type ToolContext, type ToolDef } from './tools.js';
42
+ import type { Tracer } from './trace.js';
31
43
  export interface LoopOpts {
32
44
  client: LLMClient;
33
45
  /** Per-call ChatOpts overrides (model, system, cache, temperature…). */
34
46
  chat?: Partial<ChatOpts>;
35
47
  tools: ToolDef[];
36
48
  maxToolRounds: number;
37
- /** Gate every tool call before it executes. Return false to deny — the
38
- * model receives an isError tool_result and the loop continues. The
39
- * caller owns escalation (same contract as validate-and-repair). */
40
- onToolCall?: (call: ToolUse, ctx: ToolContext) => boolean | Promise<boolean>;
49
+ /** The declared guardrail chain (agent.ts folds `onToolCall` into it). */
50
+ guardrails?: Guardrail[];
51
+ tracer?: Tracer;
41
52
  ctx: ToolContext;
42
53
  }
43
54
  export declare function runLoop(messages: Msg[], opts: LoopOpts): AsyncGenerator<AgentEvent>;
package/loop.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"loop.d.ts","sourceRoot":"","sources":["src/loop.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAQ,OAAO,EAAgB,MAAM,cAAc,CAAC;AACrF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAwB,KAAK,WAAW,EAAE,KAAK,OAAO,EAAE,MAAM,YAAY,CAAC;AAElF,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,SAAS,CAAC;IAClB,wEAAwE;IACxE,IAAI,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IACzB,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB;;yEAEqE;IACrE,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,WAAW,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7E,GAAG,EAAE,WAAW,CAAC;CAClB;AAED,wBAAuB,OAAO,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,GAAG,cAAc,CAAC,UAAU,CAAC,CA2F1F"}
1
+ {"version":3,"file":"loop.d.ts","sourceRoot":"","sources":["src/loop.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAA+B,MAAM,cAAc,CAAC;AACrF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAkD,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChG,OAAO,KAAK,EAAa,GAAG,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAwB,KAAK,WAAW,EAAE,KAAK,OAAO,EAAE,MAAM,YAAY,CAAC;AAClF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEzC,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,SAAS,CAAC;IAClB,wEAAwE;IACxE,IAAI,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IACzB,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,0EAA0E;IAC1E,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,WAAW,CAAC;CAClB;AAED,wBAAuB,OAAO,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,GAAG,cAAc,CAAC,UAAU,CAAC,CAwO1F"}
package/loop.js CHANGED
@@ -2,18 +2,28 @@
2
2
  * The turn loop — stream → tool_use → execute → tool_result → continue.
3
3
  *
4
4
  * One agent.send() = one runLoop(). Each round streams a model response;
5
- * tool calls are executed (gated by onToolCall when provided) and fed back
6
- * as tool_result parts, then the loop re-enters. A round with no tool calls
7
- * is the final round: the loop emits `done` and returns.
5
+ * tool calls are executed (after the guardrail chain has seen them) and fed
6
+ * back as tool_result parts, then the loop re-enters. A round with no tool
7
+ * calls is the final round: the loop emits `done` and returns.
8
8
  *
9
9
  * Bounded by maxToolRounds: on exhaustion the loop emits `done` with the
10
10
  * synthetic stopReason 'max_tool_rounds' (loop-level signal, not a
11
11
  * provider value — the adapter-level never-normalize rule is untouched).
12
+ * An output guardrail's veto adds the second and last synthetic value,
13
+ * 'guardrail_denied'.
12
14
  *
13
15
  * The loop maintains its OWN working message list; the caller's Session is
14
16
  * never mutated here (reduce() is the single session writer). The events
15
17
  * this generator yields, folded through reduce(), reconstruct exactly the
16
18
  * messages the loop appended internally — one contract, two consumers.
19
+ * Memory is the same story: a tool calling `ctx.remember(patch)` does not
20
+ * write anything, it queues a `memory` EVENT the loop yields.
21
+ *
22
+ * Output guardrails see the text of a round that ENDS the turn. Text from a
23
+ * round that also called tools is intermediate reasoning the model itself
24
+ * will supersede, and denying it mid-turn has no coherent answer for the
25
+ * tool calls already emitted alongside it — so that text passes through
26
+ * unguarded (README records this caveat; revisit if a consumer needs it).
17
27
  *
18
28
  * Progress markers (law 3): the loop emits ONLY the stages it genuinely
19
29
  * reaches — `sent` before every provider call, `retry` before a call that
@@ -24,12 +34,36 @@
24
34
  * observe today — inventing an emission point for them would violate the
25
35
  * honesty guard, so they stay declared-but-unemitted here.
26
36
  */
37
+ import { guardOutput, guardToolCall, hasOutputGuardrail } from './guardrail.js';
27
38
  import { executeTool, toSpecs } from './tools.js';
28
39
  export async function* runLoop(messages, opts) {
29
40
  const working = [...messages];
30
41
  const total = { input: 0, output: 0, cacheCreation: 0, cacheRead: 0 };
31
42
  const specs = toSpecs(opts.tools);
32
43
  const byName = new Map(opts.tools.map(t => [t.name, t]));
44
+ const guardrails = opts.guardrails ?? [];
45
+ const tracer = opts.tracer;
46
+ // Memory writes a tool (or a guardrail — same ctx) asks for, drained as
47
+ // `memory` events after each tool result and before every `done`. The
48
+ // asker never touches state.
49
+ const pendingMemory = [];
50
+ const ctx = {
51
+ ...opts.ctx,
52
+ remember: (patch) => { pendingMemory.push(patch); },
53
+ };
54
+ function trace(phase, name, data) {
55
+ const record = tracer?.record(phase, name, data);
56
+ return record ? { type: 'trace', record } : null;
57
+ }
58
+ /** Drain whatever asked to be remembered. Called after each tool result
59
+ * AND before every `done` — a guardrail (which receives the same ctx)
60
+ * or a tool in the final round would otherwise have its write silently
61
+ * dropped when the loop exits without another tool round. */
62
+ function* drainMemory() {
63
+ while (pendingMemory.length) {
64
+ yield { type: 'memory', patch: pendingMemory.shift() };
65
+ }
66
+ }
33
67
  for (let round = 0; round < opts.maxToolRounds; round++) {
34
68
  let text = '';
35
69
  let stopReason = 'end';
@@ -37,11 +71,20 @@ export async function* runLoop(messages, opts) {
37
71
  if (round > 0)
38
72
  yield { type: 'progress', stage: 'retry' };
39
73
  yield { type: 'progress', stage: 'sent' };
74
+ const requestTrace = trace('request', 'provider:call', {
75
+ round,
76
+ ...(opts.chat?.model ? { model: opts.chat.model } : {}),
77
+ tools: specs.length,
78
+ messages: working.length,
79
+ });
80
+ if (requestTrace)
81
+ yield requestTrace;
82
+ const startedAt = Date.now();
40
83
  const stream = opts.client.stream({
41
84
  ...opts.chat,
42
85
  messages: working,
43
86
  ...(specs.length ? { tools: specs } : {}),
44
- ...(opts.ctx.signal ? { signal: opts.ctx.signal } : {}),
87
+ ...(ctx.signal ? { signal: ctx.signal } : {}),
45
88
  });
46
89
  for await (const chunk of stream) {
47
90
  if (chunk.type === 'text') {
@@ -51,6 +94,17 @@ export async function* runLoop(messages, opts) {
51
94
  else if (chunk.type === 'thinking') {
52
95
  yield { type: 'thinking', text: chunk.text };
53
96
  }
97
+ else if (chunk.type === 'tool_use_delta') {
98
+ // Arguments still arriving — progress only. Nothing executes off a
99
+ // partial: the matching `tool_use` chunk is the call.
100
+ yield {
101
+ type: 'tool_input_delta',
102
+ id: chunk.id,
103
+ name: chunk.name,
104
+ partial: chunk.partial,
105
+ snapshot: chunk.snapshot,
106
+ };
107
+ }
54
108
  else if (chunk.type === 'tool_use') {
55
109
  calls.push({ id: chunk.id, name: chunk.name, input: chunk.input });
56
110
  yield { type: 'tool_use', id: chunk.id, name: chunk.name, input: chunk.input };
@@ -71,9 +125,66 @@ export async function* runLoop(messages, opts) {
71
125
  return;
72
126
  }
73
127
  }
128
+ const responseTrace = trace('response', 'provider:done', {
129
+ round,
130
+ chars: text.length,
131
+ toolCalls: calls.length,
132
+ stopReason,
133
+ ms: Date.now() - startedAt,
134
+ });
135
+ if (responseTrace)
136
+ yield responseTrace;
74
137
  if (!calls.length) {
138
+ let finalText = text;
139
+ if (hasOutputGuardrail(guardrails)) {
140
+ const verdict = await guardOutput(guardrails, text, ctx);
141
+ for (const name of verdict.rewrittenBy) {
142
+ yield { type: 'guardrail', name, target: 'output', action: 'rewrite' };
143
+ const rewriteTrace = trace('guardrail', 'output:rewrite', { guardrail: name });
144
+ if (rewriteTrace)
145
+ yield rewriteTrace;
146
+ }
147
+ if (verdict.denied) {
148
+ yield {
149
+ type: 'guardrail',
150
+ name: verdict.denied.name,
151
+ target: 'output',
152
+ action: 'deny',
153
+ reason: verdict.denied.reason,
154
+ };
155
+ const denyTrace = trace('guardrail', 'output:deny', {
156
+ guardrail: verdict.denied.name,
157
+ reason: verdict.denied.reason,
158
+ });
159
+ if (denyTrace)
160
+ yield denyTrace;
161
+ const usageTrace = trace('usage', 'turn:total', { ...total, rounds: round + 1, denied: true });
162
+ if (usageTrace)
163
+ yield usageTrace;
164
+ yield* drainMemory();
165
+ yield { type: 'progress', stage: 'done' };
166
+ // The model's text must not reach the transcript, and reduce()'s
167
+ // draft already holds what streamed — so clear the draft the same
168
+ // way a rewrite re-snapshots it, then close the turn with no
169
+ // assistant content and a synthetic stopReason the caller can
170
+ // branch on. The reason rides the guardrail event above.
171
+ yield { type: 'text', text: '', snapshot: '' };
172
+ yield { type: 'done', text: '', usage: total, stopReason: 'guardrail_denied' };
173
+ return;
174
+ }
175
+ if (verdict.value !== text) {
176
+ finalText = verdict.value;
177
+ // Re-snapshot so a UI folding `text` events lands on the rewritten
178
+ // string rather than the original it already rendered.
179
+ yield { type: 'text', text: '', snapshot: finalText };
180
+ }
181
+ }
182
+ const usageTrace = trace('usage', 'turn:total', { ...total, rounds: round + 1 });
183
+ if (usageTrace)
184
+ yield usageTrace;
185
+ yield* drainMemory();
75
186
  yield { type: 'progress', stage: 'done' };
76
- yield { type: 'done', text, usage: total, stopReason };
187
+ yield { type: 'done', text: finalText, usage: total, stopReason };
77
188
  return;
78
189
  }
79
190
  // Assistant turn: text (when present) + the tool_use parts, then one
@@ -88,14 +199,57 @@ export async function* runLoop(messages, opts) {
88
199
  yield { type: 'progress', stage: 'tool' };
89
200
  const tool = byName.get(call.name);
90
201
  let outcome;
202
+ let effective = call;
91
203
  if (!tool) {
92
204
  outcome = { output: `Unknown tool "${call.name}"`, isError: true };
93
205
  }
94
- else if (opts.onToolCall && (await opts.onToolCall(call, opts.ctx)) === false) {
95
- outcome = { output: `Tool call "${call.name}" denied`, isError: true };
96
- }
97
206
  else {
98
- outcome = await executeTool(tool, call.input, opts.ctx);
207
+ const verdict = await guardToolCall(guardrails, call, ctx);
208
+ for (const name of verdict.rewrittenBy) {
209
+ yield {
210
+ type: 'guardrail',
211
+ name,
212
+ target: 'tool_call',
213
+ action: 'rewrite',
214
+ toolName: call.name,
215
+ toolUseId: call.id,
216
+ };
217
+ const rewriteTrace = trace('guardrail', 'tool_call:rewrite', { guardrail: name, tool: call.name });
218
+ if (rewriteTrace)
219
+ yield rewriteTrace;
220
+ }
221
+ effective = verdict.value;
222
+ if (verdict.denied) {
223
+ yield {
224
+ type: 'guardrail',
225
+ name: verdict.denied.name,
226
+ target: 'tool_call',
227
+ action: 'deny',
228
+ reason: verdict.denied.reason,
229
+ toolName: call.name,
230
+ toolUseId: call.id,
231
+ };
232
+ const denyTrace = trace('guardrail', 'tool_call:deny', {
233
+ guardrail: verdict.denied.name,
234
+ tool: call.name,
235
+ reason: verdict.denied.reason,
236
+ });
237
+ if (denyTrace)
238
+ yield denyTrace;
239
+ outcome = { output: denialMessage(call.name, verdict.denied), isError: true };
240
+ }
241
+ else {
242
+ const startedTool = Date.now();
243
+ outcome = await executeTool(tool, effective.input, ctx);
244
+ const toolTrace = trace('tool', 'execute', {
245
+ tool: call.name,
246
+ id: call.id,
247
+ ms: Date.now() - startedTool,
248
+ ...(outcome.isError ? { isError: true } : {}),
249
+ });
250
+ if (toolTrace)
251
+ yield toolTrace;
252
+ }
99
253
  }
100
254
  resultParts.push({
101
255
  type: 'tool_result',
@@ -111,10 +265,23 @@ export async function* runLoop(messages, opts) {
111
265
  output: outcome.output,
112
266
  ...(outcome.isError ? { isError: true } : {}),
113
267
  };
268
+ yield* drainMemory();
114
269
  }
115
270
  working.push({ role: 'tool', content: resultParts });
116
271
  }
272
+ const usageTrace = trace('usage', 'turn:total', { ...total, rounds: opts.maxToolRounds, exhausted: true });
273
+ if (usageTrace)
274
+ yield usageTrace;
275
+ yield* drainMemory();
117
276
  yield { type: 'progress', stage: 'done' };
118
277
  yield { type: 'done', text: '', usage: total, stopReason: 'max_tool_rounds' };
119
278
  }
279
+ /** The `onToolCall` gate's original wording survives verbatim — it is now
280
+ * one guardrail among others, and a consumer asserting on that string
281
+ * predates guardrails. */
282
+ function denialMessage(toolName, denied) {
283
+ return denied.name === 'onToolCall'
284
+ ? `Tool call "${toolName}" denied`
285
+ : `Tool call "${toolName}" denied by guardrail "${denied.name}": ${denied.reason}`;
286
+ }
120
287
  //# sourceMappingURL=loop.js.map
package/loop.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"loop.js","sourceRoot":"","sources":["src/loop.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"loop.js","sourceRoot":"","sources":["src/loop.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,128 @@
1
+ /**
2
+ * MCP streamable-HTTP client transport — the smallest thing that speaks the
3
+ * protocol.
4
+ *
5
+ * Deliberately NOT `@modelcontextprotocol/sdk`. The subset a client needs to
6
+ * consume a server as a tool/resource source is five methods over one POST
7
+ * endpoint (initialize · notifications/initialized · tools/list · tools/call ·
8
+ * resources/list · resources/read); the SDK brings a server framework, stdio
9
+ * and websocket transports, an auth stack, and zod along with it. This
10
+ * package's whole posture is zero runtime dependencies beyond `@adia-ai/llm`
11
+ * and a browser-first build, so the subset is hand-rolled here and the SDK
12
+ * stays where it belongs — `packages/a2ui/mcp`, which SERVES.
13
+ *
14
+ * Wire rules the spec fixes and this module obeys:
15
+ * - Every request is a POST carrying one JSON-RPC message, with
16
+ * `accept: application/json, text/event-stream` — the server picks.
17
+ * - A `mcp-session-id` response header on the initialize response is echoed
18
+ * on every subsequent request (and on the DELETE that closes the session).
19
+ * - The negotiated `MCP-Protocol-Version` rides every post-initialize
20
+ * request.
21
+ * - An SSE response body is read until the event whose `data:` payload is
22
+ * the JSON-RPC response for THIS request id; server-initiated
23
+ * notifications interleaved on that stream are ignored (this client
24
+ * subscribes to nothing, so there is nothing it can act on).
25
+ * - The protocol headers are the LAST spread in every request, so a caller
26
+ * header cannot quietly replace `accept` or the session id and turn a
27
+ * working connection into an inexplicable one.
28
+ *
29
+ * Nothing here waits forever. Every round trip carries a deadline covering
30
+ * BOTH the fetch and the wait for the answer to arrive on an SSE body — a
31
+ * server that accepts a POST and then says nothing is a real failure mode,
32
+ * and it is indistinguishable from a hang unless someone is holding a clock.
33
+ * The deadline and the caller's `signal` share one abort path, so a timeout
34
+ * and a user cancellation both actually cancel the request rather than
35
+ * abandoning it.
36
+ *
37
+ * Everything is `fetch`-only, so it runs unchanged in a browser — with the
38
+ * CORS caveat the README records. `fetchImpl` exists so a test can hand the
39
+ * transport an in-process server instead of a network.
40
+ */
41
+ /**
42
+ * Default per-request deadline: 60 seconds.
43
+ *
44
+ * It has to clear the slowest legitimate answer, and for MCP that is a tool
45
+ * that thinks — the in-repo a2ui server's `generate_ui` runs an LLM inside
46
+ * `tools/call`. A handshake-sized number (5–10s) would make MCP-client mode
47
+ * useless for exactly the servers this repo has. One knob rather than
48
+ * separate connect/call budgets: two numbers to tune is worse than one
49
+ * generous one, and `timeoutMs` is per-request, so a caller with a slower
50
+ * tool raises it in the one place that matters.
51
+ */
52
+ export declare const DEFAULT_MCP_TIMEOUT_MS = 60000;
53
+ /** Every MCP failure this package raises carries this name, so a consumer
54
+ * can tell an MCP fault from a tool's own bad day without string-matching. */
55
+ export declare class McpError extends Error {
56
+ readonly name: string;
57
+ /** The server the fault belongs to. Empty for a fault raised while
58
+ * assembling several sources, where no single server owns it. */
59
+ readonly url: string;
60
+ constructor(message: string, url?: string, options?: {
61
+ cause?: unknown;
62
+ });
63
+ }
64
+ /** Connect-time faults: unreachable server, non-2xx, protocol mismatch, a
65
+ * timeout, a JSON-RPC error on initialize/list, or a listed tool this
66
+ * harness cannot register. Thrown, never swallowed — an agent that
67
+ * silently ran with an empty tool list would look like a model that forgot
68
+ * how to use its tools. */
69
+ export declare class McpConnectionError extends McpError {
70
+ readonly name = "McpConnectionError";
71
+ }
72
+ /** A `tools/call` or `resources/read` that failed after the connection was
73
+ * established. Thrown inside a ToolDef's `execute`, which `executeTool`
74
+ * turns into an `isError` tool_result — the model sees it and can react. */
75
+ export declare class McpCallError extends McpError {
76
+ readonly name = "McpCallError";
77
+ }
78
+ export interface McpTransportOptions {
79
+ url: string;
80
+ /** Static request headers — the v1 auth story (`authorization: Bearer …`).
81
+ * No OAuth flow: a token this client cannot refresh is the caller's to
82
+ * provision, exactly like `@adia-ai/llm`'s proxy headers. Protocol
83
+ * headers win over these; see the module note. */
84
+ headers?: Record<string, string>;
85
+ /** Per-request deadline in ms. Default `DEFAULT_MCP_TIMEOUT_MS` (60s).
86
+ * `0` disables it — for a caller who owns the clock through `signal` and
87
+ * means it. */
88
+ timeoutMs?: number;
89
+ /** Injected `fetch` — the seam the in-process test server rides on. */
90
+ fetchImpl?: typeof fetch;
91
+ clientInfo?: {
92
+ name: string;
93
+ version: string;
94
+ };
95
+ /** Connection-level cancellation: aborts whatever request is in flight. */
96
+ signal?: AbortSignal;
97
+ }
98
+ /** Per-request overrides. `signal` is how a turn's `ctx.signal` reaches an
99
+ * in-flight `tools/call`, so a user abort cancels the request instead of
100
+ * leaving it running and ignored. */
101
+ export interface McpRequestOptions {
102
+ signal?: AbortSignal;
103
+ timeoutMs?: number;
104
+ }
105
+ export interface McpConnection {
106
+ url: string;
107
+ serverInfo: {
108
+ name: string;
109
+ version: string;
110
+ };
111
+ protocolVersion: string;
112
+ capabilities: Record<string, unknown>;
113
+ /** One JSON-RPC round trip. Rejects with `McpCallError` on transport,
114
+ * timeout, abort, or protocol failure; a JSON-RPC error result rejects
115
+ * too (the caller decides whether that is fatal or model-visible). */
116
+ request<T = unknown>(method: string, params?: Record<string, unknown>, options?: McpRequestOptions): Promise<T>;
117
+ /** Best-effort session teardown (DELETE). Never throws — a close that
118
+ * fails leaves a session the server will time out on its own. */
119
+ close(): Promise<void>;
120
+ }
121
+ /** `connectOptions.signal` covers the HANDSHAKE only. It is deliberately not
122
+ * `options.signal`: that one is connection-level and would keep aborting
123
+ * every later call, so a turn that cancelled the connect would poison every
124
+ * turn after it. */
125
+ export declare function connectStreamableHttp(options: McpTransportOptions, connectOptions?: {
126
+ signal?: AbortSignal;
127
+ }): Promise<McpConnection>;
128
+ //# sourceMappingURL=mcp-transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-transport.d.ts","sourceRoot":"","sources":["src/mcp-transport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAcH;;;;;;;;;;GAUG;AACH,eAAO,MAAM,sBAAsB,QAAS,CAAC;AAE7C;+EAC+E;AAC/E,qBAAa,QAAS,SAAQ,KAAK;IACjC,SAAkB,IAAI,EAAE,MAAM,CAAc;IAC5C;sEACkE;IAClE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;gBACT,OAAO,EAAE,MAAM,EAAE,GAAG,SAAK,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAIrE;AAED;;;;4BAI4B;AAC5B,qBAAa,kBAAmB,SAAQ,QAAQ;IAC9C,SAAkB,IAAI,wBAAwB;CAC/C;AAED;;6EAE6E;AAC7E,qBAAa,YAAa,SAAQ,QAAQ;IACxC,SAAkB,IAAI,kBAAkB;CACzC;AAED,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ;;;uDAGmD;IACnD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC;;oBAEgB;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uEAAuE;IACvE,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,UAAU,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/C,2EAA2E;IAC3E,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED;;sCAEsC;AACtC,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9C,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC;;2EAEuE;IACvE,OAAO,CAAC,CAAC,GAAG,OAAO,EACjB,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAAC,CAAC,CAAC,CAAC;IACd;sEACkE;IAClE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AA4ID;;;qBAGqB;AACrB,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,mBAAmB,EAC5B,cAAc,GAAE;IAAE,MAAM,CAAC,EAAE,WAAW,CAAA;CAAO,GAC5C,OAAO,CAAC,aAAa,CAAC,CA8KxB"}