@kindgi/agents 0.0.0-bootstrap.0 → 0.1.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 (240) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +131 -2
  3. package/dist/agent-turn-flow.d.ts +57 -0
  4. package/dist/agent-turn-flow.d.ts.map +1 -0
  5. package/dist/agent-turn-flow.js +172 -0
  6. package/dist/agent-turn-flow.js.map +1 -0
  7. package/dist/conversation-binding.d.ts +111 -0
  8. package/dist/conversation-binding.d.ts.map +1 -0
  9. package/dist/conversation-binding.js +4 -0
  10. package/dist/conversation-binding.js.map +1 -0
  11. package/dist/define.d.ts +180 -0
  12. package/dist/define.d.ts.map +1 -0
  13. package/dist/define.js +361 -0
  14. package/dist/define.js.map +1 -0
  15. package/dist/errors.d.ts +62 -0
  16. package/dist/errors.d.ts.map +1 -0
  17. package/dist/errors.js +4 -0
  18. package/dist/errors.js.map +1 -0
  19. package/dist/guardrails-gate.d.ts +169 -0
  20. package/dist/guardrails-gate.d.ts.map +1 -0
  21. package/dist/guardrails-gate.js +202 -0
  22. package/dist/guardrails-gate.js.map +1 -0
  23. package/dist/handlers/budget-check.d.ts +22 -0
  24. package/dist/handlers/budget-check.d.ts.map +1 -0
  25. package/dist/handlers/budget-check.js +109 -0
  26. package/dist/handlers/budget-check.js.map +1 -0
  27. package/dist/handlers/build-initial-messages.d.ts +17 -0
  28. package/dist/handlers/build-initial-messages.d.ts.map +1 -0
  29. package/dist/handlers/build-initial-messages.js +86 -0
  30. package/dist/handlers/build-initial-messages.js.map +1 -0
  31. package/dist/handlers/compose-result.d.ts +10 -0
  32. package/dist/handlers/compose-result.d.ts.map +1 -0
  33. package/dist/handlers/compose-result.js +79 -0
  34. package/dist/handlers/compose-result.js.map +1 -0
  35. package/dist/handlers/constants.d.ts +8 -0
  36. package/dist/handlers/constants.d.ts.map +1 -0
  37. package/dist/handlers/constants.js +10 -0
  38. package/dist/handlers/constants.js.map +1 -0
  39. package/dist/handlers/context.d.ts +210 -0
  40. package/dist/handlers/context.d.ts.map +1 -0
  41. package/dist/handlers/context.js +4 -0
  42. package/dist/handlers/context.js.map +1 -0
  43. package/dist/handlers/dispatch-tools.d.ts +15 -0
  44. package/dist/handlers/dispatch-tools.d.ts.map +1 -0
  45. package/dist/handlers/dispatch-tools.js +511 -0
  46. package/dist/handlers/dispatch-tools.js.map +1 -0
  47. package/dist/handlers/errors.d.ts +133 -0
  48. package/dist/handlers/errors.d.ts.map +1 -0
  49. package/dist/handlers/errors.js +134 -0
  50. package/dist/handlers/errors.js.map +1 -0
  51. package/dist/handlers/evaluate-guardrails.d.ts +14 -0
  52. package/dist/handlers/evaluate-guardrails.d.ts.map +1 -0
  53. package/dist/handlers/evaluate-guardrails.js +128 -0
  54. package/dist/handlers/evaluate-guardrails.js.map +1 -0
  55. package/dist/handlers/final-iteration.d.ts +7 -0
  56. package/dist/handlers/final-iteration.d.ts.map +1 -0
  57. package/dist/handlers/final-iteration.js +26 -0
  58. package/dist/handlers/final-iteration.js.map +1 -0
  59. package/dist/handlers/index.d.ts +5 -0
  60. package/dist/handlers/index.d.ts.map +1 -0
  61. package/dist/handlers/index.js +41 -0
  62. package/dist/handlers/index.js.map +1 -0
  63. package/dist/handlers/model-call.d.ts +13 -0
  64. package/dist/handlers/model-call.d.ts.map +1 -0
  65. package/dist/handlers/model-call.js +136 -0
  66. package/dist/handlers/model-call.js.map +1 -0
  67. package/dist/handlers/persist-final-message.d.ts +14 -0
  68. package/dist/handlers/persist-final-message.d.ts.map +1 -0
  69. package/dist/handlers/persist-final-message.js +54 -0
  70. package/dist/handlers/persist-final-message.js.map +1 -0
  71. package/dist/handlers/persist-provenance.d.ts +12 -0
  72. package/dist/handlers/persist-provenance.d.ts.map +1 -0
  73. package/dist/handlers/persist-provenance.js +34 -0
  74. package/dist/handlers/persist-provenance.js.map +1 -0
  75. package/dist/handlers/persist-user-message.d.ts +15 -0
  76. package/dist/handlers/persist-user-message.d.ts.map +1 -0
  77. package/dist/handlers/persist-user-message.js +59 -0
  78. package/dist/handlers/persist-user-message.js.map +1 -0
  79. package/dist/handlers/public-types.d.ts +201 -0
  80. package/dist/handlers/public-types.d.ts.map +1 -0
  81. package/dist/handlers/public-types.js +4 -0
  82. package/dist/handlers/public-types.js.map +1 -0
  83. package/dist/handlers/rehydrate.d.ts +8 -0
  84. package/dist/handlers/rehydrate.d.ts.map +1 -0
  85. package/dist/handlers/rehydrate.js +94 -0
  86. package/dist/handlers/rehydrate.js.map +1 -0
  87. package/dist/handlers/render-prompt.d.ts +12 -0
  88. package/dist/handlers/render-prompt.d.ts.map +1 -0
  89. package/dist/handlers/render-prompt.js +41 -0
  90. package/dist/handlers/render-prompt.js.map +1 -0
  91. package/dist/handlers/resolve-tools.d.ts +10 -0
  92. package/dist/handlers/resolve-tools.d.ts.map +1 -0
  93. package/dist/handlers/resolve-tools.js +55 -0
  94. package/dist/handlers/resolve-tools.js.map +1 -0
  95. package/dist/handlers/result-shape.d.ts +94 -0
  96. package/dist/handlers/result-shape.d.ts.map +1 -0
  97. package/dist/handlers/result-shape.js +19 -0
  98. package/dist/handlers/result-shape.js.map +1 -0
  99. package/dist/handlers/run-retrievals.d.ts +10 -0
  100. package/dist/handlers/run-retrievals.d.ts.map +1 -0
  101. package/dist/handlers/run-retrievals.js +64 -0
  102. package/dist/handlers/run-retrievals.js.map +1 -0
  103. package/dist/handlers/run-snapshot.d.ts +4 -0
  104. package/dist/handlers/run-snapshot.d.ts.map +1 -0
  105. package/dist/handlers/run-snapshot.js +26 -0
  106. package/dist/handlers/run-snapshot.js.map +1 -0
  107. package/dist/handlers/setup.d.ts +25 -0
  108. package/dist/handlers/setup.d.ts.map +1 -0
  109. package/dist/handlers/setup.js +231 -0
  110. package/dist/handlers/setup.js.map +1 -0
  111. package/dist/handlers/structured-output.d.ts +38 -0
  112. package/dist/handlers/structured-output.d.ts.map +1 -0
  113. package/dist/handlers/structured-output.js +89 -0
  114. package/dist/handlers/structured-output.js.map +1 -0
  115. package/dist/handlers/tool-errors.d.ts +56 -0
  116. package/dist/handlers/tool-errors.d.ts.map +1 -0
  117. package/dist/handlers/tool-errors.js +73 -0
  118. package/dist/handlers/tool-errors.js.map +1 -0
  119. package/dist/handlers/tool-hitl.d.ts +45 -0
  120. package/dist/handlers/tool-hitl.d.ts.map +1 -0
  121. package/dist/handlers/tool-hitl.js +81 -0
  122. package/dist/handlers/tool-hitl.js.map +1 -0
  123. package/dist/handlers/turn-environment.d.ts +26 -0
  124. package/dist/handlers/turn-environment.d.ts.map +1 -0
  125. package/dist/handlers/turn-environment.js +154 -0
  126. package/dist/handlers/turn-environment.js.map +1 -0
  127. package/dist/hitl-policy.d.ts +45 -0
  128. package/dist/hitl-policy.d.ts.map +1 -0
  129. package/dist/hitl-policy.js +74 -0
  130. package/dist/hitl-policy.js.map +1 -0
  131. package/dist/index.d.ts +31 -0
  132. package/dist/index.d.ts.map +1 -0
  133. package/dist/index.js +19 -0
  134. package/dist/index.js.map +1 -0
  135. package/dist/invoke.d.ts +36 -0
  136. package/dist/invoke.d.ts.map +1 -0
  137. package/dist/invoke.js +228 -0
  138. package/dist/invoke.js.map +1 -0
  139. package/dist/migrations-dir.d.ts +11 -0
  140. package/dist/migrations-dir.d.ts.map +1 -0
  141. package/dist/migrations-dir.js +14 -0
  142. package/dist/migrations-dir.js.map +1 -0
  143. package/dist/project-run-result.d.ts +23 -0
  144. package/dist/project-run-result.d.ts.map +1 -0
  145. package/dist/project-run-result.js +116 -0
  146. package/dist/project-run-result.js.map +1 -0
  147. package/dist/prompt.d.ts +83 -0
  148. package/dist/prompt.d.ts.map +1 -0
  149. package/dist/prompt.js +119 -0
  150. package/dist/prompt.js.map +1 -0
  151. package/dist/provenance-emit.d.ts +44 -0
  152. package/dist/provenance-emit.d.ts.map +1 -0
  153. package/dist/provenance-emit.js +51 -0
  154. package/dist/provenance-emit.js.map +1 -0
  155. package/dist/registry.d.ts +38 -0
  156. package/dist/registry.d.ts.map +1 -0
  157. package/dist/registry.js +125 -0
  158. package/dist/registry.js.map +1 -0
  159. package/dist/retrieval.d.ts +47 -0
  160. package/dist/retrieval.d.ts.map +1 -0
  161. package/dist/retrieval.js +155 -0
  162. package/dist/retrieval.js.map +1 -0
  163. package/dist/run-snapshot-binding.d.ts +77 -0
  164. package/dist/run-snapshot-binding.d.ts.map +1 -0
  165. package/dist/run-snapshot-binding.js +4 -0
  166. package/dist/run-snapshot-binding.js.map +1 -0
  167. package/dist/schema.d.ts +497 -0
  168. package/dist/schema.d.ts.map +1 -0
  169. package/dist/schema.js +133 -0
  170. package/dist/schema.js.map +1 -0
  171. package/dist/streaming.d.ts +118 -0
  172. package/dist/streaming.d.ts.map +1 -0
  173. package/dist/streaming.js +17 -0
  174. package/dist/streaming.js.map +1 -0
  175. package/dist/tenant-policy.d.ts +16 -0
  176. package/dist/tenant-policy.d.ts.map +1 -0
  177. package/dist/tenant-policy.js +77 -0
  178. package/dist/tenant-policy.js.map +1 -0
  179. package/dist/types.d.ts +435 -0
  180. package/dist/types.d.ts.map +1 -0
  181. package/dist/types.js +4 -0
  182. package/dist/types.js.map +1 -0
  183. package/dist/versioning.d.ts +29 -0
  184. package/dist/versioning.d.ts.map +1 -0
  185. package/dist/versioning.js +58 -0
  186. package/dist/versioning.js.map +1 -0
  187. package/migrations/0000_sparkling_talkback.sql +18 -0
  188. package/migrations/0001_tired_warhawk.sql +16 -0
  189. package/migrations/0002_violet_ezekiel.sql +2 -0
  190. package/migrations/meta/0000_snapshot.json +172 -0
  191. package/migrations/meta/0001_snapshot.json +275 -0
  192. package/migrations/meta/0002_snapshot.json +287 -0
  193. package/migrations/meta/_journal.json +27 -0
  194. package/package.json +76 -4
  195. package/src/agent-turn-flow.ts +183 -0
  196. package/src/conversation-binding.ts +147 -0
  197. package/src/define.ts +572 -0
  198. package/src/errors.ts +80 -0
  199. package/src/guardrails-gate.ts +342 -0
  200. package/src/handlers/budget-check.ts +143 -0
  201. package/src/handlers/build-initial-messages.ts +103 -0
  202. package/src/handlers/compose-result.ts +90 -0
  203. package/src/handlers/constants.ts +10 -0
  204. package/src/handlers/context.ts +226 -0
  205. package/src/handlers/dispatch-tools.ts +633 -0
  206. package/src/handlers/errors.ts +282 -0
  207. package/src/handlers/evaluate-guardrails.ts +153 -0
  208. package/src/handlers/final-iteration.ts +30 -0
  209. package/src/handlers/index.ts +63 -0
  210. package/src/handlers/model-call.ts +151 -0
  211. package/src/handlers/persist-final-message.ts +67 -0
  212. package/src/handlers/persist-provenance.ts +39 -0
  213. package/src/handlers/persist-user-message.ts +70 -0
  214. package/src/handlers/public-types.ts +209 -0
  215. package/src/handlers/rehydrate.ts +161 -0
  216. package/src/handlers/render-prompt.ts +46 -0
  217. package/src/handlers/resolve-tools.ts +68 -0
  218. package/src/handlers/result-shape.ts +113 -0
  219. package/src/handlers/run-retrievals.ts +77 -0
  220. package/src/handlers/run-snapshot.ts +44 -0
  221. package/src/handlers/setup.ts +269 -0
  222. package/src/handlers/structured-output.ts +117 -0
  223. package/src/handlers/tool-errors.ts +122 -0
  224. package/src/handlers/tool-hitl.ts +126 -0
  225. package/src/handlers/turn-environment.ts +191 -0
  226. package/src/hitl-policy.ts +128 -0
  227. package/src/index.ts +154 -0
  228. package/src/invoke.ts +299 -0
  229. package/src/migrations-dir.ts +17 -0
  230. package/src/project-run-result.ts +131 -0
  231. package/src/prompt.ts +185 -0
  232. package/src/provenance-emit.ts +100 -0
  233. package/src/registry.ts +164 -0
  234. package/src/retrieval.ts +219 -0
  235. package/src/run-snapshot-binding.ts +87 -0
  236. package/src/schema.ts +154 -0
  237. package/src/streaming.ts +153 -0
  238. package/src/tenant-policy.ts +78 -0
  239. package/src/types.ts +453 -0
  240. package/src/versioning.ts +77 -0
@@ -0,0 +1,83 @@
1
+ import type { Agent } from './types.js';
2
+ /**
3
+ * Reserved variable namespaces the runtime injects automatically.
4
+ * Callers do not (and cannot) declare these as `PromptParameter`s —
5
+ * they're populated by `renderInstructions` at invoke time.
6
+ *
7
+ * - `today` — ISO date string (yyyy-mm-dd) at UTC.
8
+ * - `now` — ISO datetime string at UTC.
9
+ * - `agent.id` — the invoked agent's id.
10
+ * - `agent.name` — display name.
11
+ * - `agent.version` — semver of the invoked definition.
12
+ * - `conversation.id` — current conversation id (undefined for one-shot).
13
+ * - `conversation.turn` — 1-indexed turn number within this conversation.
14
+ * - `input` — the turn's structured input (`InvokeAgentInput.input`),
15
+ * e.g. `{{ input.grievance.summary }}`; unset when
16
+ * the turn has none.
17
+ */
18
+ export declare const AUTO_INJECTED_VARS: readonly ["today", "now", "agent", "conversation", "input"];
19
+ /**
20
+ * Shape passed to `renderInstructions`. Framework auto-vars are
21
+ * computed inside; the caller supplies parameter values only.
22
+ */
23
+ export interface RenderContext {
24
+ /** Caller-supplied parameter values. Keyed by `PromptParameter.name`. */
25
+ readonly parameters: Readonly<Record<string, string | number | boolean>>;
26
+ /** Turn context — used to fill in `conversation.*` and stamp `now`. */
27
+ readonly conversation?: {
28
+ readonly id: string;
29
+ readonly turn: number;
30
+ };
31
+ /** The turn's structured input, rendered as `{{ input.* }}`. */
32
+ readonly input?: unknown;
33
+ /**
34
+ * Optional clock override — tests inject a fixed date. Defaults to
35
+ * `new Date()`.
36
+ */
37
+ readonly clock?: () => Date;
38
+ }
39
+ export interface RenderResult {
40
+ readonly rendered: string;
41
+ /**
42
+ * The full context the template was rendered against (parameters +
43
+ * auto-vars). Captured for provenance — the auditor sees exactly
44
+ * what values filled the placeholders.
45
+ */
46
+ readonly context: Readonly<Record<string, unknown>>;
47
+ }
48
+ export type PromptRenderError = MissingParameterError | RenderFailureError;
49
+ /**
50
+ * A required parameter has no value at invoke time.
51
+ * `parameterName` is undefined if LiquidJS caught a variable that isn't
52
+ * even declared (typo, or template references a name we didn't validate
53
+ * at define time).
54
+ */
55
+ export interface MissingParameterError {
56
+ readonly code: 'missing-parameter';
57
+ readonly message: string;
58
+ readonly parameterName?: string;
59
+ }
60
+ /** Template failed to render for a reason other than a missing var. */
61
+ export interface RenderFailureError {
62
+ readonly code: 'render-failure';
63
+ readonly message: string;
64
+ readonly cause: unknown;
65
+ }
66
+ /**
67
+ * Render an agent's instructions template with the given context.
68
+ * Populates framework auto-vars, merges caller parameter values, and
69
+ * applies defaults for optional parameters. Missing required parameters
70
+ * are surfaced as `missing-parameter` before Liquid ever runs.
71
+ *
72
+ * Uses `strictVariables: true` so an unresolved `{{ var }}` is an error
73
+ * — never a silent empty string. This is load-bearing for correctness
74
+ * (a system prompt with a missing firm name is worse than a hard fail).
75
+ */
76
+ export declare function renderInstructions(agent: Agent, context: RenderContext): {
77
+ readonly ok: true;
78
+ readonly value: RenderResult;
79
+ } | {
80
+ readonly ok: false;
81
+ readonly error: PromptRenderError;
82
+ };
83
+ //# sourceMappingURL=prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../src/prompt.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,KAAK,EAAmB,MAAM,YAAY,CAAC;AAEzD;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,kBAAkB,6DAA8D,CAAC;AAE9F;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,yEAAyE;IACzE,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IACzE,uEAAuE;IACvE,QAAQ,CAAC,YAAY,CAAC,EAAE;QACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,gEAAgE;IAChE,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB;;;OAGG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B;;;;OAIG;IACH,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACrD;AAED,MAAM,MAAM,iBAAiB,GAAG,qBAAqB,GAAG,kBAAkB,CAAC;AAE3E;;;;;GAKG;AACH,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC;IACnC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,uEAAuE;AACvE,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,aAAa,GAEpB;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAA;CAAE,GACnD;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAA;CAAE,CA2C5D"}
package/dist/prompt.js ADDED
@@ -0,0 +1,119 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright (C) 2026 Kindgi Inc.
3
+ import { Liquid } from 'liquidjs';
4
+ /**
5
+ * Reserved variable namespaces the runtime injects automatically.
6
+ * Callers do not (and cannot) declare these as `PromptParameter`s —
7
+ * they're populated by `renderInstructions` at invoke time.
8
+ *
9
+ * - `today` — ISO date string (yyyy-mm-dd) at UTC.
10
+ * - `now` — ISO datetime string at UTC.
11
+ * - `agent.id` — the invoked agent's id.
12
+ * - `agent.name` — display name.
13
+ * - `agent.version` — semver of the invoked definition.
14
+ * - `conversation.id` — current conversation id (undefined for one-shot).
15
+ * - `conversation.turn` — 1-indexed turn number within this conversation.
16
+ * - `input` — the turn's structured input (`InvokeAgentInput.input`),
17
+ * e.g. `{{ input.grievance.summary }}`; unset when
18
+ * the turn has none.
19
+ */
20
+ export const AUTO_INJECTED_VARS = ['today', 'now', 'agent', 'conversation', 'input'];
21
+ /**
22
+ * Render an agent's instructions template with the given context.
23
+ * Populates framework auto-vars, merges caller parameter values, and
24
+ * applies defaults for optional parameters. Missing required parameters
25
+ * are surfaced as `missing-parameter` before Liquid ever runs.
26
+ *
27
+ * Uses `strictVariables: true` so an unresolved `{{ var }}` is an error
28
+ * — never a silent empty string. This is load-bearing for correctness
29
+ * (a system prompt with a missing firm name is worse than a hard fail).
30
+ */
31
+ export function renderInstructions(agent, context) {
32
+ const declared = agent.parameters ?? [];
33
+ const missing = requiredMissing(declared, context.parameters);
34
+ if (missing.length > 0) {
35
+ return {
36
+ ok: false,
37
+ error: {
38
+ code: 'missing-parameter',
39
+ message: `Required parameter${missing.length === 1 ? '' : 's'} missing: ${missing.join(', ')}`,
40
+ ...(missing.length === 1 && missing[0] !== undefined && { parameterName: missing[0] }),
41
+ },
42
+ };
43
+ }
44
+ const merged = mergeContext(agent, declared, context);
45
+ const liquid = new Liquid({ strictVariables: true, strictFilters: true });
46
+ try {
47
+ const rendered = liquid.parseAndRenderSync(agent.instructions, merged);
48
+ return { ok: true, value: { rendered, context: merged } };
49
+ }
50
+ catch (cause) {
51
+ // LiquidJS throws UndefinedVariableError for unresolved refs — surface
52
+ // as missing-parameter so callers get one consistent error code.
53
+ const message = cause instanceof Error ? cause.message : String(cause);
54
+ if (message.includes('undefined variable')) {
55
+ const nameMatch = /undefined variable: ([\w.]+)/.exec(message);
56
+ return {
57
+ ok: false,
58
+ error: {
59
+ code: 'missing-parameter',
60
+ message: `Template references an unresolved variable: ${nameMatch?.[1] ?? '?'}`,
61
+ ...(nameMatch?.[1] !== undefined && { parameterName: nameMatch[1] }),
62
+ },
63
+ };
64
+ }
65
+ return {
66
+ ok: false,
67
+ error: {
68
+ code: 'render-failure',
69
+ message: `Template render failed: ${message}`,
70
+ cause,
71
+ },
72
+ };
73
+ }
74
+ }
75
+ function requiredMissing(declared, supplied) {
76
+ const missing = [];
77
+ for (const p of declared) {
78
+ const isRequired = p.required !== false;
79
+ if (!isRequired)
80
+ continue;
81
+ if (p.default !== undefined)
82
+ continue;
83
+ if (!(p.name in supplied) || supplied[p.name] === undefined)
84
+ missing.push(p.name);
85
+ }
86
+ return missing;
87
+ }
88
+ function mergeContext(agent, declared, context) {
89
+ const clock = context.clock ?? (() => new Date());
90
+ const at = clock();
91
+ const today = at.toISOString().slice(0, 10);
92
+ const now = at.toISOString();
93
+ // Start with declared defaults, layer caller-supplied on top so
94
+ // callers can override defaults explicitly.
95
+ const values = {};
96
+ for (const p of declared) {
97
+ if (p.default !== undefined)
98
+ values[p.name] = p.default;
99
+ }
100
+ for (const [k, v] of Object.entries(context.parameters))
101
+ values[k] = v;
102
+ values.today = today;
103
+ values.now = now;
104
+ values.agent = {
105
+ id: agent.id,
106
+ name: agent.name,
107
+ version: agent.version,
108
+ };
109
+ if (context.conversation !== undefined) {
110
+ values.conversation = {
111
+ id: context.conversation.id,
112
+ turn: context.conversation.turn,
113
+ };
114
+ }
115
+ if (context.input !== undefined)
116
+ values.input = context.input;
117
+ return values;
118
+ }
119
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../src/prompt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import type { KeyProvider, Provenance, ProvenanceBuilder, ProvenanceEmitBinding } from '@kindgi/provenance';
2
+ import type { Result } from '@kindgi/types';
3
+ import type { PersistenceError } from './errors.js';
4
+ /**
5
+ * Bindings the provenance emission flow consumes. All optional — if
6
+ * `newBuilder` isn't set, provenance is skipped entirely.
7
+ */
8
+ export interface ProvenanceBindings {
9
+ /**
10
+ * Factory the runtime calls at turn start to construct a fresh
11
+ * builder. Callers supply this so they control id + flowRef +
12
+ * schema version.
13
+ */
14
+ readonly newBuilder?: (opts: {
15
+ readonly runId: string;
16
+ readonly tenantId: string;
17
+ }) => ProvenanceBuilder;
18
+ /**
19
+ * When true, the DAG persists via `emitBinding.emit(...)` after a
20
+ * successful turn. Failed turns still build the DAG but don't emit —
21
+ * the caller sees them via the streaming event stream.
22
+ */
23
+ readonly emit?: boolean;
24
+ /**
25
+ * Caller-plugged emit surface. Required whenever `emit` is true.
26
+ * The Kindgi runtime supplies a Postgres-backed implementation;
27
+ * any conforming object works.
28
+ */
29
+ readonly emitBinding?: ProvenanceEmitBinding;
30
+ /**
31
+ * When set, `signProvenance` is called with this key provider before
32
+ * emit. Unsigned DAGs still emit but forensic verification can't
33
+ * chain back to a keyId.
34
+ */
35
+ readonly keyProvider?: KeyProvider;
36
+ }
37
+ /**
38
+ * Persist a completed provenance DAG. Signs first if a key provider is
39
+ * bound. Failures surface as `persistence-error`; upstream turn logic
40
+ * decides how much to bail out — usually the turn already succeeded so
41
+ * this is best-effort.
42
+ */
43
+ export declare function persistProvenance(builder: ProvenanceBuilder, bindings: ProvenanceBindings): Promise<Result<Provenance, PersistenceError>>;
44
+ //# sourceMappingURL=provenance-emit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provenance-emit.d.ts","sourceRoot":"","sources":["../src/provenance-emit.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,WAAW,EACX,UAAU,EACV,iBAAiB,EACjB,qBAAqB,EACtB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAE5C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC;;;;OAIG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE;QAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;KAC3B,KAAK,iBAAiB,CAAC;IACxB;;;;OAIG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB;;;;OAIG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,qBAAqB,CAAC;IAC7C;;;;OAIG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC;CACpC;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,iBAAiB,EAC1B,QAAQ,EAAE,kBAAkB,GAC3B,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC,CA0C/C"}
@@ -0,0 +1,51 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright (C) 2026 Kindgi Inc.
3
+ import { signProvenance } from '@kindgi/provenance';
4
+ /**
5
+ * Persist a completed provenance DAG. Signs first if a key provider is
6
+ * bound. Failures surface as `persistence-error`; upstream turn logic
7
+ * decides how much to bail out — usually the turn already succeeded so
8
+ * this is best-effort.
9
+ */
10
+ export async function persistProvenance(builder, bindings) {
11
+ let provenance = builder.snapshot();
12
+ if (bindings.keyProvider !== undefined) {
13
+ const signed = signProvenance(provenance, bindings.keyProvider);
14
+ if (signed.kind === 'err') {
15
+ return {
16
+ kind: 'err',
17
+ error: {
18
+ code: 'persistence-error',
19
+ message: `Failed to sign provenance: ${signed.error.message}`,
20
+ cause: signed.error,
21
+ },
22
+ };
23
+ }
24
+ provenance = signed.value;
25
+ }
26
+ if (bindings.emit === true) {
27
+ if (bindings.emitBinding === undefined) {
28
+ return {
29
+ kind: 'err',
30
+ error: {
31
+ code: 'persistence-error',
32
+ message: 'Provenance emit=true but no emitBinding wired — pass a ProvenanceEmitBinding as bindings.provenance.emitBinding.',
33
+ cause: null,
34
+ },
35
+ };
36
+ }
37
+ const emitted = await bindings.emitBinding.emit(provenance);
38
+ if (emitted.kind === 'err') {
39
+ return {
40
+ kind: 'err',
41
+ error: {
42
+ code: 'persistence-error',
43
+ message: `Failed to emit provenance: ${emitted.error.message}`,
44
+ cause: emitted.error,
45
+ },
46
+ };
47
+ }
48
+ }
49
+ return { kind: 'ok', value: provenance };
50
+ }
51
+ //# sourceMappingURL=provenance-emit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provenance-emit.js","sourceRoot":"","sources":["../src/provenance-emit.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,iCAAiC;AAQjC,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAuCpD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAA0B,EAC1B,QAA4B;IAE5B,IAAI,UAAU,GAAe,OAAO,CAAC,QAAQ,EAAE,CAAC;IAChD,IAAI,QAAQ,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QACvC,MAAM,MAAM,GAAG,cAAc,CAAC,UAAU,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC;QAChE,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;YAC1B,OAAO;gBACL,IAAI,EAAE,KAAK;gBACX,KAAK,EAAE;oBACL,IAAI,EAAE,mBAAmB;oBACzB,OAAO,EAAE,8BAA8B,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE;oBAC7D,KAAK,EAAE,MAAM,CAAC,KAAK;iBACpB;aACF,CAAC;QACJ,CAAC;QACD,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC;IAC5B,CAAC;IAED,IAAI,QAAQ,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;QAC3B,IAAI,QAAQ,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;YACvC,OAAO;gBACL,IAAI,EAAE,KAAK;gBACX,KAAK,EAAE;oBACL,IAAI,EAAE,mBAAmB;oBACzB,OAAO,EACL,kHAAkH;oBACpH,KAAK,EAAE,IAAI;iBACZ;aACF,CAAC;QACJ,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC5D,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;YAC3B,OAAO;gBACL,IAAI,EAAE,KAAK;gBACX,KAAK,EAAE;oBACL,IAAI,EAAE,mBAAmB;oBACzB,OAAO,EAAE,8BAA8B,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE;oBAC9D,KAAK,EAAE,OAAO,CAAC,KAAK;iBACrB;aACF,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,38 @@
1
+ import type { Result } from '@kindgi/types';
2
+ import type { AgentAlreadyRegisteredError, AgentNotFoundError } from './errors.js';
3
+ import type { Agent, AgentId } from './types.js';
4
+ /**
5
+ * In-memory catalog of agent definitions. Keyed by `(id, version)`,
6
+ * because the same agent id at different versions is a different
7
+ * agent for provenance / audit purposes. `getLatest(id)` returns the
8
+ * highest semver registered under that id.
9
+ *
10
+ * The registry is per-tenant at the application layer — callers
11
+ * typically instantiate one registry per tenant boot. The registry
12
+ * itself does not enforce tenancy: it's a substrate primitive, and
13
+ * multi-tenant deployments layer RLS + tenant-scoped registries on
14
+ * top.
15
+ */
16
+ export interface AgentRegistry {
17
+ register(agent: Agent): Result<void, AgentAlreadyRegisteredError>;
18
+ /**
19
+ * Look up an agent by id + version. If `version` is omitted, returns
20
+ * the latest semver registered under `id`.
21
+ */
22
+ get(id: AgentId, version?: string): Result<Agent, AgentNotFoundError>;
23
+ /** Enumerate every version of every registered agent. */
24
+ list(): readonly Agent[];
25
+ /** Enumerate all versions registered under a given id, semver-sorted asc. */
26
+ listVersions(id: AgentId): readonly Agent[];
27
+ /**
28
+ * Latest semver for id, or `agent-not-found`.
29
+ */
30
+ getLatest(id: AgentId): Result<Agent, AgentNotFoundError>;
31
+ /**
32
+ * Deregister a specific version. Rare — typically used for
33
+ * pack-uninstall flows. Returns `agent-not-found` on miss.
34
+ */
35
+ unregister(id: AgentId, version: string): Result<void, AgentNotFoundError>;
36
+ }
37
+ export declare function createAgentRegistry(seed?: readonly Agent[]): AgentRegistry;
38
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAE5C,OAAO,KAAK,EAAE,2BAA2B,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACnF,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAEjD;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAAC,IAAI,EAAE,2BAA2B,CAAC,CAAC;IAClE;;;OAGG;IACH,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAC;IACtE,yDAAyD;IACzD,IAAI,IAAI,SAAS,KAAK,EAAE,CAAC;IACzB,6EAA6E;IAC7E,YAAY,CAAC,EAAE,EAAE,OAAO,GAAG,SAAS,KAAK,EAAE,CAAC;IAC5C;;OAEG;IACH,SAAS,CAAC,EAAE,EAAE,OAAO,GAAG,MAAM,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAC;IAC1D;;;OAGG;IACH,UAAU,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC;CAC5E;AAED,wBAAgB,mBAAmB,CAAC,IAAI,GAAE,SAAS,KAAK,EAAO,GAAG,aAAa,CAoG9E"}
@@ -0,0 +1,125 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright (C) 2026 Kindgi Inc.
3
+ export function createAgentRegistry(seed = []) {
4
+ const byIdVersion = new Map();
5
+ function key(id, version) {
6
+ return `${id}@${version}`;
7
+ }
8
+ function versionsForId(id) {
9
+ return [...byIdVersion.values()]
10
+ .filter((a) => a.id === id)
11
+ .sort((a, b) => compareSemver(a.version, b.version));
12
+ }
13
+ for (const agent of seed)
14
+ byIdVersion.set(key(agent.id, agent.version), agent);
15
+ return {
16
+ register(agent) {
17
+ const k = key(agent.id, agent.version);
18
+ if (byIdVersion.has(k)) {
19
+ return {
20
+ kind: 'err',
21
+ error: {
22
+ code: 'agent-already-registered',
23
+ message: `Agent "${agent.id}" version "${agent.version}" is already registered`,
24
+ agentId: agent.id,
25
+ version: agent.version,
26
+ },
27
+ };
28
+ }
29
+ byIdVersion.set(k, agent);
30
+ return { kind: 'ok', value: undefined };
31
+ },
32
+ get(id, version) {
33
+ if (version !== undefined) {
34
+ const hit = byIdVersion.get(key(id, version));
35
+ if (hit === undefined) {
36
+ return {
37
+ kind: 'err',
38
+ error: {
39
+ code: 'agent-not-found',
40
+ message: `No agent "${id}" at version "${version}"`,
41
+ agentId: id,
42
+ version,
43
+ },
44
+ };
45
+ }
46
+ return { kind: 'ok', value: hit };
47
+ }
48
+ const versions = versionsForId(id);
49
+ const latest = versions[versions.length - 1];
50
+ if (latest === undefined) {
51
+ return {
52
+ kind: 'err',
53
+ error: {
54
+ code: 'agent-not-found',
55
+ message: `No agent registered with id "${id}"`,
56
+ agentId: id,
57
+ },
58
+ };
59
+ }
60
+ return { kind: 'ok', value: latest };
61
+ },
62
+ list() {
63
+ return [...byIdVersion.values()];
64
+ },
65
+ listVersions(id) {
66
+ return versionsForId(id);
67
+ },
68
+ getLatest(id) {
69
+ const versions = versionsForId(id);
70
+ const latest = versions[versions.length - 1];
71
+ if (latest === undefined) {
72
+ return {
73
+ kind: 'err',
74
+ error: {
75
+ code: 'agent-not-found',
76
+ message: `No agent registered with id "${id}"`,
77
+ agentId: id,
78
+ },
79
+ };
80
+ }
81
+ return { kind: 'ok', value: latest };
82
+ },
83
+ unregister(id, version) {
84
+ const k = key(id, version);
85
+ if (!byIdVersion.has(k)) {
86
+ return {
87
+ kind: 'err',
88
+ error: {
89
+ code: 'agent-not-found',
90
+ message: `No agent "${id}" at version "${version}" to unregister`,
91
+ agentId: id,
92
+ version,
93
+ },
94
+ };
95
+ }
96
+ byIdVersion.delete(k);
97
+ return { kind: 'ok', value: undefined };
98
+ },
99
+ };
100
+ }
101
+ /**
102
+ * Compare two semver strings. Returns negative if a < b, positive if
103
+ * a > b, 0 if equal. Handles pre-release tags by treating any tagged
104
+ * version as lower than the equivalent untagged version — matches
105
+ * semver.org §11.
106
+ */
107
+ function compareSemver(a, b) {
108
+ const [aBase, aPre] = a.split('-', 2);
109
+ const [bBase, bPre] = b.split('-', 2);
110
+ const aParts = (aBase ?? '0.0.0').split('.').map(Number);
111
+ const bParts = (bBase ?? '0.0.0').split('.').map(Number);
112
+ for (let i = 0; i < 3; i++) {
113
+ const diff = (aParts[i] ?? 0) - (bParts[i] ?? 0);
114
+ if (diff !== 0)
115
+ return diff;
116
+ }
117
+ if (aPre === undefined && bPre === undefined)
118
+ return 0;
119
+ if (aPre === undefined)
120
+ return 1;
121
+ if (bPre === undefined)
122
+ return -1;
123
+ return aPre.localeCompare(bPre);
124
+ }
125
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ import type { EmbeddingProviderRegistry } from '@kindgi/embedding';
2
+ import type { MemoryQueryBinding } from '@kindgi/memory';
3
+ import type { Result } from '@kindgi/types';
4
+ import type { AgentError } from './errors.js';
5
+ import type { Agent, Conversation, ConversationId, RetrievedFact } from './types.js';
6
+ /** Bindings the retrieval flow consumes. `memory` is required; the
7
+ * rest are optional — without an embedding registry, the semantic
8
+ * part of an intent is silently skipped. `embeddingModel` picks a
9
+ * specific registered provider; omit to fall back to the registry's
10
+ * sole provider. */
11
+ export interface RetrievalBindings {
12
+ /**
13
+ * Caller-plugged data-access surface for memory reads. Every listFacts /
14
+ * searchByKeyword / searchBySemantic call inside `runRetrievals` routes
15
+ * through this binding — the runtime never touches a database client directly.
16
+ */
17
+ readonly memory: MemoryQueryBinding;
18
+ readonly embeddingRegistry?: EmbeddingProviderRegistry;
19
+ readonly embeddingModel?: string;
20
+ }
21
+ /**
22
+ * Execute every retrieval intent declared on the agent against the
23
+ * current conversation's scope. Returns retrieved facts paired with
24
+ * the intent that pulled them, so downstream provenance can attribute
25
+ * each fact to its retrieval declaration.
26
+ *
27
+ * Retrieval modes:
28
+ * - `mode: 'keyword'` — `searchByKeyword` with the user's message
29
+ * as the query (full-text search in the memory implementation).
30
+ * - `mode: 'semantic'` — `searchBySemantic` with the user's message
31
+ * embedded. Requires `bindings.embeddingRegistry`; without one,
32
+ * the semantic search is silently skipped.
33
+ * - `mode: 'both'` — run both, merge results, dedup by fact id
34
+ * with keyword score preserved.
35
+ * - `mode` omitted — `listFacts` scoped + typed, latest-first.
36
+ * No query needed; useful for "always pull the current
37
+ * working-memory snapshot."
38
+ */
39
+ export declare function runRetrievals(agent: Agent, conversation: Conversation, conversationId: ConversationId, userMessage: string, bindings: RetrievalBindings): Promise<Result<readonly RetrievedFact[], AgentError>>;
40
+ /**
41
+ * Format retrieved facts as a system-role message the model can read
42
+ * as background context. Kept structural (fact headers + JSON content)
43
+ * rather than freeform prose — models handle discriminable fact
44
+ * boundaries better than blended narrative.
45
+ */
46
+ export declare function formatRetrievedForPrompt(facts: readonly RetrievedFact[]): string;
47
+ //# sourceMappingURL=retrieval.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retrieval.d.ts","sourceRoot":"","sources":["../src/retrieval.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,KAAK,EAAQ,kBAAkB,EAAgB,MAAM,gBAAgB,CAAC;AAC7E,OAAO,KAAK,EAAa,MAAM,EAAsB,MAAM,eAAe,CAAC;AAE3E,OAAO,KAAK,EAAE,UAAU,EAAoB,MAAM,aAAa,CAAC;AAChE,OAAO,KAAK,EACV,KAAK,EACL,YAAY,EACZ,cAAc,EAEd,aAAa,EACd,MAAM,YAAY,CAAC;AAEpB;;;;oBAIoB;AACpB,MAAM,WAAW,iBAAiB;IAChC;;;;OAIG;IACH,QAAQ,CAAC,MAAM,EAAE,kBAAkB,CAAC;IACpC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,yBAAyB,CAAC;IACvD,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CAClC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,aAAa,CACjC,KAAK,EAAE,KAAK,EACZ,YAAY,EAAE,YAAY,EAC1B,cAAc,EAAE,cAAc,EAC9B,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,iBAAiB,GAC1B,OAAO,CAAC,MAAM,CAAC,SAAS,aAAa,EAAE,EAAE,UAAU,CAAC,CAAC,CAiBvD;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,SAAS,aAAa,EAAE,GAAG,MAAM,CAUhF"}