@autonome-research/thread-phase 3.0.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 (263) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +226 -0
  3. package/dist/agent/index.d.ts +28 -0
  4. package/dist/agent/index.d.ts.map +1 -0
  5. package/dist/agent/index.js +28 -0
  6. package/dist/agent/index.js.map +1 -0
  7. package/dist/agent/openai-adapter.d.ts +15 -0
  8. package/dist/agent/openai-adapter.d.ts.map +1 -0
  9. package/dist/agent/openai-adapter.js +57 -0
  10. package/dist/agent/openai-adapter.js.map +1 -0
  11. package/dist/agent/parse-json.d.ts +12 -0
  12. package/dist/agent/parse-json.d.ts.map +1 -0
  13. package/dist/agent/parse-json.js +31 -0
  14. package/dist/agent/parse-json.js.map +1 -0
  15. package/dist/agent/retry.d.ts +15 -0
  16. package/dist/agent/retry.d.ts.map +1 -0
  17. package/dist/agent/retry.js +35 -0
  18. package/dist/agent/retry.js.map +1 -0
  19. package/dist/agent/runner.d.ts +25 -0
  20. package/dist/agent/runner.d.ts.map +1 -0
  21. package/dist/agent/runner.js +270 -0
  22. package/dist/agent/runner.js.map +1 -0
  23. package/dist/agent/stream-consumer.d.ts +57 -0
  24. package/dist/agent/stream-consumer.d.ts.map +1 -0
  25. package/dist/agent/stream-consumer.js +126 -0
  26. package/dist/agent/stream-consumer.js.map +1 -0
  27. package/dist/agent/types.d.ts +135 -0
  28. package/dist/agent/types.d.ts.map +1 -0
  29. package/dist/agent/types.js +9 -0
  30. package/dist/agent/types.js.map +1 -0
  31. package/dist/agent-runner.d.ts +10 -0
  32. package/dist/agent-runner.d.ts.map +1 -0
  33. package/dist/agent-runner.js +10 -0
  34. package/dist/agent-runner.js.map +1 -0
  35. package/dist/agents/capability.d.ts +36 -0
  36. package/dist/agents/capability.d.ts.map +1 -0
  37. package/dist/agents/capability.js +51 -0
  38. package/dist/agents/capability.js.map +1 -0
  39. package/dist/agents/event-bus.d.ts +20 -0
  40. package/dist/agents/event-bus.d.ts.map +1 -0
  41. package/dist/agents/event-bus.js +40 -0
  42. package/dist/agents/event-bus.js.map +1 -0
  43. package/dist/agents/index.d.ts +23 -0
  44. package/dist/agents/index.d.ts.map +1 -0
  45. package/dist/agents/index.js +33 -0
  46. package/dist/agents/index.js.map +1 -0
  47. package/dist/agents/inference-adapter.d.ts +52 -0
  48. package/dist/agents/inference-adapter.d.ts.map +1 -0
  49. package/dist/agents/inference-adapter.js +209 -0
  50. package/dist/agents/inference-adapter.js.map +1 -0
  51. package/dist/agents/job-store-bridge.d.ts +44 -0
  52. package/dist/agents/job-store-bridge.d.ts.map +1 -0
  53. package/dist/agents/job-store-bridge.js +58 -0
  54. package/dist/agents/job-store-bridge.js.map +1 -0
  55. package/dist/agents/memory.d.ts +40 -0
  56. package/dist/agents/memory.d.ts.map +1 -0
  57. package/dist/agents/memory.js +14 -0
  58. package/dist/agents/memory.js.map +1 -0
  59. package/dist/agents/protocol.d.ts +302 -0
  60. package/dist/agents/protocol.d.ts.map +1 -0
  61. package/dist/agents/protocol.js +36 -0
  62. package/dist/agents/protocol.js.map +1 -0
  63. package/dist/agents/run-helpers.d.ts +70 -0
  64. package/dist/agents/run-helpers.d.ts.map +1 -0
  65. package/dist/agents/run-helpers.js +131 -0
  66. package/dist/agents/run-helpers.js.map +1 -0
  67. package/dist/agents/serialize-error.d.ts +18 -0
  68. package/dist/agents/serialize-error.d.ts.map +1 -0
  69. package/dist/agents/serialize-error.js +27 -0
  70. package/dist/agents/serialize-error.js.map +1 -0
  71. package/dist/agents/structured-output.d.ts +90 -0
  72. package/dist/agents/structured-output.d.ts.map +1 -0
  73. package/dist/agents/structured-output.js +101 -0
  74. package/dist/agents/structured-output.js.map +1 -0
  75. package/dist/agents/test-utils/conformance.d.ts +59 -0
  76. package/dist/agents/test-utils/conformance.d.ts.map +1 -0
  77. package/dist/agents/test-utils/conformance.js +207 -0
  78. package/dist/agents/test-utils/conformance.js.map +1 -0
  79. package/dist/agents/test-utils/index.d.ts +12 -0
  80. package/dist/agents/test-utils/index.d.ts.map +1 -0
  81. package/dist/agents/test-utils/index.js +12 -0
  82. package/dist/agents/test-utils/index.js.map +1 -0
  83. package/dist/agents/test-utils/mock-agent.d.ts +66 -0
  84. package/dist/agents/test-utils/mock-agent.d.ts.map +1 -0
  85. package/dist/agents/test-utils/mock-agent.js +244 -0
  86. package/dist/agents/test-utils/mock-agent.js.map +1 -0
  87. package/dist/agents/thread.d.ts +57 -0
  88. package/dist/agents/thread.d.ts.map +1 -0
  89. package/dist/agents/thread.js +128 -0
  90. package/dist/agents/thread.js.map +1 -0
  91. package/dist/agents/turn-accumulator.d.ts +94 -0
  92. package/dist/agents/turn-accumulator.d.ts.map +1 -0
  93. package/dist/agents/turn-accumulator.js +150 -0
  94. package/dist/agents/turn-accumulator.js.map +1 -0
  95. package/dist/agents/with-memory.d.ts +55 -0
  96. package/dist/agents/with-memory.d.ts.map +1 -0
  97. package/dist/agents/with-memory.js +155 -0
  98. package/dist/agents/with-memory.js.map +1 -0
  99. package/dist/agents/with-thread.d.ts +45 -0
  100. package/dist/agents/with-thread.d.ts.map +1 -0
  101. package/dist/agents/with-thread.js +70 -0
  102. package/dist/agents/with-thread.js.map +1 -0
  103. package/dist/cache.d.ts +47 -0
  104. package/dist/cache.d.ts.map +1 -0
  105. package/dist/cache.js +81 -0
  106. package/dist/cache.js.map +1 -0
  107. package/dist/context/compressor.d.ts +36 -0
  108. package/dist/context/compressor.d.ts.map +1 -0
  109. package/dist/context/compressor.js +158 -0
  110. package/dist/context/compressor.js.map +1 -0
  111. package/dist/context/index.d.ts +4 -0
  112. package/dist/context/index.d.ts.map +1 -0
  113. package/dist/context/index.js +4 -0
  114. package/dist/context/index.js.map +1 -0
  115. package/dist/context/result-capper.d.ts +32 -0
  116. package/dist/context/result-capper.d.ts.map +1 -0
  117. package/dist/context/result-capper.js +50 -0
  118. package/dist/context/result-capper.js.map +1 -0
  119. package/dist/context/token-budget.d.ts +81 -0
  120. package/dist/context/token-budget.d.ts.map +1 -0
  121. package/dist/context/token-budget.js +99 -0
  122. package/dist/context/token-budget.js.map +1 -0
  123. package/dist/helpers/caller.d.ts +18 -0
  124. package/dist/helpers/caller.d.ts.map +1 -0
  125. package/dist/helpers/caller.js +40 -0
  126. package/dist/helpers/caller.js.map +1 -0
  127. package/dist/helpers/hook.d.ts +73 -0
  128. package/dist/helpers/hook.d.ts.map +1 -0
  129. package/dist/helpers/hook.js +244 -0
  130. package/dist/helpers/hook.js.map +1 -0
  131. package/dist/helpers/index.d.ts +12 -0
  132. package/dist/helpers/index.d.ts.map +1 -0
  133. package/dist/helpers/index.js +11 -0
  134. package/dist/helpers/index.js.map +1 -0
  135. package/dist/helpers/one-shot.d.ts +27 -0
  136. package/dist/helpers/one-shot.d.ts.map +1 -0
  137. package/dist/helpers/one-shot.js +43 -0
  138. package/dist/helpers/one-shot.js.map +1 -0
  139. package/dist/helpers/schedule.d.ts +59 -0
  140. package/dist/helpers/schedule.d.ts.map +1 -0
  141. package/dist/helpers/schedule.js +118 -0
  142. package/dist/helpers/schedule.js.map +1 -0
  143. package/dist/helpers/types.d.ts +34 -0
  144. package/dist/helpers/types.d.ts.map +1 -0
  145. package/dist/helpers/types.js +11 -0
  146. package/dist/helpers/types.js.map +1 -0
  147. package/dist/index.d.ts +26 -0
  148. package/dist/index.d.ts.map +1 -0
  149. package/dist/index.js +37 -0
  150. package/dist/index.js.map +1 -0
  151. package/dist/inference.d.ts +27 -0
  152. package/dist/inference.d.ts.map +1 -0
  153. package/dist/inference.js +34 -0
  154. package/dist/inference.js.map +1 -0
  155. package/dist/messages.d.ts +64 -0
  156. package/dist/messages.d.ts.map +1 -0
  157. package/dist/messages.js +17 -0
  158. package/dist/messages.js.map +1 -0
  159. package/dist/orchestrator.d.ts +56 -0
  160. package/dist/orchestrator.d.ts.map +1 -0
  161. package/dist/orchestrator.js +62 -0
  162. package/dist/orchestrator.js.map +1 -0
  163. package/dist/patterns/bounded-fanout-of.d.ts +61 -0
  164. package/dist/patterns/bounded-fanout-of.d.ts.map +1 -0
  165. package/dist/patterns/bounded-fanout-of.js +142 -0
  166. package/dist/patterns/bounded-fanout-of.js.map +1 -0
  167. package/dist/patterns/bounded-fanout.d.ts +111 -0
  168. package/dist/patterns/bounded-fanout.d.ts.map +1 -0
  169. package/dist/patterns/bounded-fanout.js +151 -0
  170. package/dist/patterns/bounded-fanout.js.map +1 -0
  171. package/dist/patterns/index.d.ts +14 -0
  172. package/dist/patterns/index.d.ts.map +1 -0
  173. package/dist/patterns/index.js +13 -0
  174. package/dist/patterns/index.js.map +1 -0
  175. package/dist/patterns/intent-gate.d.ts +27 -0
  176. package/dist/patterns/intent-gate.d.ts.map +1 -0
  177. package/dist/patterns/intent-gate.js +32 -0
  178. package/dist/patterns/intent-gate.js.map +1 -0
  179. package/dist/patterns/match.d.ts +30 -0
  180. package/dist/patterns/match.d.ts.map +1 -0
  181. package/dist/patterns/match.js +58 -0
  182. package/dist/patterns/match.js.map +1 -0
  183. package/dist/patterns/parallel-fanout.d.ts +28 -0
  184. package/dist/patterns/parallel-fanout.d.ts.map +1 -0
  185. package/dist/patterns/parallel-fanout.js +24 -0
  186. package/dist/patterns/parallel-fanout.js.map +1 -0
  187. package/dist/patterns/parallel-phases.d.ts +27 -0
  188. package/dist/patterns/parallel-phases.d.ts.map +1 -0
  189. package/dist/patterns/parallel-phases.js +77 -0
  190. package/dist/patterns/parallel-phases.js.map +1 -0
  191. package/dist/patterns/preflight-confidence.d.ts +20 -0
  192. package/dist/patterns/preflight-confidence.d.ts.map +1 -0
  193. package/dist/patterns/preflight-confidence.js +38 -0
  194. package/dist/patterns/preflight-confidence.js.map +1 -0
  195. package/dist/patterns/spot-check.d.ts +19 -0
  196. package/dist/patterns/spot-check.d.ts.map +1 -0
  197. package/dist/patterns/spot-check.js +33 -0
  198. package/dist/patterns/spot-check.js.map +1 -0
  199. package/dist/patterns/sub-pipeline.d.ts +84 -0
  200. package/dist/patterns/sub-pipeline.d.ts.map +1 -0
  201. package/dist/patterns/sub-pipeline.js +90 -0
  202. package/dist/patterns/sub-pipeline.js.map +1 -0
  203. package/dist/patterns/synthesize-with-followup.d.ts +35 -0
  204. package/dist/patterns/synthesize-with-followup.d.ts.map +1 -0
  205. package/dist/patterns/synthesize-with-followup.js +45 -0
  206. package/dist/patterns/synthesize-with-followup.js.map +1 -0
  207. package/dist/patterns/while-condition.d.ts +31 -0
  208. package/dist/patterns/while-condition.d.ts.map +1 -0
  209. package/dist/patterns/while-condition.js +59 -0
  210. package/dist/patterns/while-condition.js.map +1 -0
  211. package/dist/patterns/with-retry.d.ts +37 -0
  212. package/dist/patterns/with-retry.d.ts.map +1 -0
  213. package/dist/patterns/with-retry.js +73 -0
  214. package/dist/patterns/with-retry.js.map +1 -0
  215. package/dist/phase.d.ts +78 -0
  216. package/dist/phase.d.ts.map +1 -0
  217. package/dist/phase.js +36 -0
  218. package/dist/phase.js.map +1 -0
  219. package/dist/session/index.d.ts +5 -0
  220. package/dist/session/index.d.ts.map +1 -0
  221. package/dist/session/index.js +4 -0
  222. package/dist/session/index.js.map +1 -0
  223. package/dist/session/job-runner.d.ts +67 -0
  224. package/dist/session/job-runner.d.ts.map +1 -0
  225. package/dist/session/job-runner.js +131 -0
  226. package/dist/session/job-runner.js.map +1 -0
  227. package/dist/session/job-store.d.ts +98 -0
  228. package/dist/session/job-store.d.ts.map +1 -0
  229. package/dist/session/job-store.js +37 -0
  230. package/dist/session/job-store.js.map +1 -0
  231. package/dist/session/sqlite-job-store.d.ts +40 -0
  232. package/dist/session/sqlite-job-store.d.ts.map +1 -0
  233. package/dist/session/sqlite-job-store.js +200 -0
  234. package/dist/session/sqlite-job-store.js.map +1 -0
  235. package/dist/session/sse.d.ts +60 -0
  236. package/dist/session/sse.d.ts.map +1 -0
  237. package/dist/session/sse.js +97 -0
  238. package/dist/session/sse.js.map +1 -0
  239. package/dist/tools/index.d.ts +2 -0
  240. package/dist/tools/index.d.ts.map +1 -0
  241. package/dist/tools/index.js +2 -0
  242. package/dist/tools/index.js.map +1 -0
  243. package/dist/tools/registry.d.ts +44 -0
  244. package/dist/tools/registry.d.ts.map +1 -0
  245. package/dist/tools/registry.js +74 -0
  246. package/dist/tools/registry.js.map +1 -0
  247. package/dist/triggers/index.d.ts +15 -0
  248. package/dist/triggers/index.d.ts.map +1 -0
  249. package/dist/triggers/index.js +14 -0
  250. package/dist/triggers/index.js.map +1 -0
  251. package/dist/triggers/run-trigger.d.ts +86 -0
  252. package/dist/triggers/run-trigger.d.ts.map +1 -0
  253. package/dist/triggers/run-trigger.js +146 -0
  254. package/dist/triggers/run-trigger.js.map +1 -0
  255. package/dist/triggers/timer-trigger.d.ts +46 -0
  256. package/dist/triggers/timer-trigger.d.ts.map +1 -0
  257. package/dist/triggers/timer-trigger.js +74 -0
  258. package/dist/triggers/timer-trigger.js.map +1 -0
  259. package/dist/triggers/types.d.ts +61 -0
  260. package/dist/triggers/types.d.ts.map +1 -0
  261. package/dist/triggers/types.js +23 -0
  262. package/dist/triggers/types.js.map +1 -0
  263. package/package.json +64 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook.d.ts","sourceRoot":"","sources":["../../src/helpers/hook.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAsC,KAAK,MAAM,EAAuB,MAAM,WAAW,CAAC;AAIjG,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAElE,OAAO,KAAK,EACV,mBAAmB,EACnB,aAAa,EAEd,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,QAAQ;IACvB,oDAAoD;IACpD,IAAI,EAAE,MAAM,CAAC;IACb,uDAAuD;IACvD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,6EAA6E;IAC7E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qDAAqD;IACrD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAmCD,wEAAwE;AACxE,wBAAgB,wBAAwB,IAAI,IAAI,CAQ/C;AA8DD,qBAAa,WAAY,YAAW,OAAO,CAAC,OAAO,CAAC;IAClD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,2EAA2E;IAC3E,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAEzB,OAAO,CAAC,GAAG,CAAK;IAChB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAGN;IACR,OAAO,CAAC,MAAM,CAAwC;IACtD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;IACtC,sFAAsF;IACtF,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAsC;IAClE,iFAAiF;IACjF,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA8B;gBAE9C,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAQhE;;;OAGG;IACG,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAe/C;;;OAGG;IACH,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAOtD,6DAA6D;IAC7D,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,GAAG,IAAI;IAO1C,KAAK,IAAI,cAAc,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC;IAerD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAYb,mBAAmB;CAgBlC;AAMD,wBAAgB,IAAI,CAAC,KAAK,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO,EACrD,IAAI,EAAE,QAAQ,EACd,OAAO,EAAE,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,EACtC,OAAO,GAAE,WAAgB,GACxB,mBAAmB,CAqDrB"}
@@ -0,0 +1,244 @@
1
+ /**
2
+ * `hook` — register a pipeline driven by an inbound HTTP webhook.
3
+ *
4
+ * export default hook({ path: '/webhook/digest' }, async (payload, ctx) => {
5
+ * return { ok: true, processed: payload };
6
+ * });
7
+ *
8
+ * The library maintains one `node:http` server per project — every `hook`
9
+ * registration adds a new route to the same server. The server starts
10
+ * lazily on the first `Trigger.start()`. Routes resolve by exact path
11
+ * match; only POST with a JSON body is supported in v3.0.0.
12
+ *
13
+ * The handler is called with the parsed JSON body and ctx. Its return
14
+ * value is JSON-serialized and sent back as the HTTP response body
15
+ * (status 200). Throws produce status 500 with `{ error: message }`.
16
+ *
17
+ * Server port: `process.env.THREAD_PHASE_HTTP_PORT` if set, else 7777.
18
+ */
19
+ import { createServer } from 'node:http';
20
+ import { PipelineCache } from '../cache.js';
21
+ import { deriveNameFromCaller } from './caller.js';
22
+ let shared;
23
+ function getSharedServer() {
24
+ if (shared)
25
+ return shared;
26
+ const port = Number(process.env.THREAD_PHASE_HTTP_PORT ?? 7777);
27
+ const routes = new Map();
28
+ const server = createServer((req, res) => handleRequest(req, res, routes));
29
+ shared = { server, routes, started: false, port };
30
+ return shared;
31
+ }
32
+ /** Test-only: tear down the shared server so each test starts clean. */
33
+ export function _resetHttpServerForTests() {
34
+ if (!shared)
35
+ return;
36
+ try {
37
+ shared.server.close();
38
+ }
39
+ catch {
40
+ // ignore
41
+ }
42
+ shared = undefined;
43
+ }
44
+ async function handleRequest(req, res, routes) {
45
+ const url = req.url ?? '/';
46
+ const path = url.split('?')[0] ?? url;
47
+ const route = routes.get(path);
48
+ if (!route) {
49
+ res.statusCode = 404;
50
+ res.setHeader('content-type', 'application/json');
51
+ res.end(JSON.stringify({ error: `no hook registered at ${path}` }));
52
+ return;
53
+ }
54
+ if ((req.method ?? '').toUpperCase() !== 'POST') {
55
+ res.statusCode = 405;
56
+ res.setHeader('content-type', 'application/json');
57
+ res.end(JSON.stringify({ error: 'method not allowed' }));
58
+ return;
59
+ }
60
+ let raw = '';
61
+ for await (const chunk of req) {
62
+ raw += typeof chunk === 'string' ? chunk : chunk.toString('utf8');
63
+ }
64
+ let body = undefined;
65
+ if (raw.length > 0) {
66
+ try {
67
+ body = JSON.parse(raw);
68
+ }
69
+ catch {
70
+ res.statusCode = 400;
71
+ res.setHeader('content-type', 'application/json');
72
+ res.end(JSON.stringify({ error: 'invalid JSON body' }));
73
+ return;
74
+ }
75
+ }
76
+ try {
77
+ const result = await route.dispatch(body);
78
+ res.statusCode = 200;
79
+ res.setHeader('content-type', 'application/json');
80
+ res.end(JSON.stringify(result ?? null));
81
+ }
82
+ catch (err) {
83
+ res.statusCode = 500;
84
+ res.setHeader('content-type', 'application/json');
85
+ res.end(JSON.stringify({ error: err.message ?? 'internal error' }));
86
+ }
87
+ }
88
+ // ---------------------------------------------------------------------------
89
+ // HttpTrigger — one per registered hook. Yields TriggerEvents as inbound
90
+ // requests arrive on its `path`. Production wiring (pipeline + handler)
91
+ // happens via the trigger's consumer (`runTrigger`); the response is
92
+ // settled by `route.dispatch` once the handler has finished.
93
+ // ---------------------------------------------------------------------------
94
+ export class HttpTrigger {
95
+ name;
96
+ path;
97
+ method;
98
+ /** @internal — exposed for tests asserting the shared-server invariant. */
99
+ _server;
100
+ seq = 0;
101
+ stopped = false;
102
+ queued = [];
103
+ waiter = null;
104
+ shared;
105
+ /** Map event.id → pending response so the handler's return value can be sent back. */
106
+ pendingById = new Map();
107
+ /** Map event.id → user handler's return value (so dispatch can resolve sync). */
108
+ resultsById = new Map();
109
+ constructor(opts) {
110
+ this.name = opts.name;
111
+ this.path = opts.path;
112
+ this.method = opts.method;
113
+ this.shared = getSharedServer();
114
+ this._server = this.shared.server;
115
+ }
116
+ /**
117
+ * Called by the shared HTTP handler. Enqueues a new event and returns
118
+ * a promise that resolves with the user handler's return value.
119
+ */
120
+ async dispatch(body) {
121
+ const event = {
122
+ id: ++this.seq,
123
+ occurredAt: new Date().toISOString(),
124
+ input: body,
125
+ };
126
+ return new Promise((resolve, reject) => {
127
+ const pending = { resolve, reject };
128
+ this.queued.push({ event, pending });
129
+ this.pendingById.set(event.id, pending);
130
+ this.waiter?.();
131
+ this.waiter = null;
132
+ });
133
+ }
134
+ /**
135
+ * Resolve the pending HTTP response for a given event id. Called by the
136
+ * helper-generated Phase once the user handler has returned.
137
+ */
138
+ resolveResponse(eventId, value) {
139
+ const pending = this.pendingById.get(eventId);
140
+ if (!pending)
141
+ return;
142
+ this.pendingById.delete(eventId);
143
+ pending.resolve(value);
144
+ }
145
+ /** Reject the pending HTTP response for a given event id. */
146
+ rejectResponse(eventId, err) {
147
+ const pending = this.pendingById.get(eventId);
148
+ if (!pending)
149
+ return;
150
+ this.pendingById.delete(eventId);
151
+ pending.reject(err);
152
+ }
153
+ async *start() {
154
+ await this.ensureServerStarted();
155
+ while (!this.stopped) {
156
+ if (this.queued.length === 0) {
157
+ await new Promise((resolve) => {
158
+ this.waiter = resolve;
159
+ });
160
+ if (this.stopped)
161
+ return;
162
+ }
163
+ const item = this.queued.shift();
164
+ if (!item)
165
+ continue;
166
+ yield item.event;
167
+ }
168
+ }
169
+ async stop() {
170
+ if (this.stopped)
171
+ return;
172
+ this.stopped = true;
173
+ this.waiter?.();
174
+ this.waiter = null;
175
+ for (const pending of this.pendingById.values()) {
176
+ pending.reject(new Error('hook stopped'));
177
+ }
178
+ this.pendingById.clear();
179
+ this.shared.routes.delete(this.path);
180
+ }
181
+ async ensureServerStarted() {
182
+ this.shared.routes.set(this.path, this);
183
+ if (this.shared.started)
184
+ return;
185
+ if (this.shared.startPromise) {
186
+ await this.shared.startPromise;
187
+ return;
188
+ }
189
+ this.shared.startPromise = new Promise((resolve, reject) => {
190
+ this.shared.server.once('error', reject);
191
+ this.shared.server.listen(this.shared.port, '127.0.0.1', () => {
192
+ this.shared.started = true;
193
+ resolve();
194
+ });
195
+ });
196
+ await this.shared.startPromise;
197
+ }
198
+ }
199
+ // ---------------------------------------------------------------------------
200
+ // hook() — the public entry point.
201
+ // ---------------------------------------------------------------------------
202
+ export function hook(spec, handler, options = {}) {
203
+ const name = options.name ?? deriveNameFromCaller('hook');
204
+ const triggerName = `${name}:http`;
205
+ const method = spec.method ?? 'POST';
206
+ const trigger = new HttpTrigger({ name: triggerName, path: spec.path, method });
207
+ const phase = {
208
+ name,
209
+ async *run(ctx) {
210
+ const carrier = ctx;
211
+ const event = carrier.__triggerEvent;
212
+ const httpTrig = carrier.__httpTrigger ?? trigger;
213
+ try {
214
+ const result = await handler(event?.input, ctx);
215
+ httpTrig.resolveResponse(event?.id ?? 0, result);
216
+ yield {
217
+ type: 'data',
218
+ key: `${name}.result`,
219
+ value: result,
220
+ };
221
+ }
222
+ catch (err) {
223
+ httpTrig.rejectResponse(event?.id ?? 0, err instanceof Error ? err : new Error(String(err)));
224
+ throw err;
225
+ }
226
+ },
227
+ };
228
+ const pipelineSpec = {
229
+ phases: [phase],
230
+ ctx: (_input, event) => {
231
+ const ctx = { cache: new PipelineCache() };
232
+ ctx.__triggerEvent = event;
233
+ ctx.__httpTrigger = trigger;
234
+ return ctx;
235
+ },
236
+ trigger: triggerName,
237
+ description: options.description,
238
+ };
239
+ return (api) => {
240
+ api.registerTrigger(triggerName, trigger);
241
+ api.registerPipeline(name, pipelineSpec);
242
+ };
243
+ }
244
+ //# sourceMappingURL=hook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook.js","sourceRoot":"","sources":["../../src/helpers/hook.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Convenience helpers — `schedule`, `hook`, `oneShot`.
3
+ *
4
+ * Each helper wraps a single handler function into a Phase, then returns
5
+ * an `ExtensionRegisterFn` `(api) => void` that the CLI auto-loader picks
6
+ * up via the file's default export. See each helper file for examples.
7
+ */
8
+ export { oneShot, type OneShotOptions } from './one-shot.js';
9
+ export { schedule, CronTrigger, type ScheduleSpec, type ScheduleOptions, } from './schedule.js';
10
+ export { hook, HttpTrigger, type HookSpec, type HookOptions, } from './hook.js';
11
+ export type { ExtensionRegisterFn, HelperHandler, PipelineSpec, ThreadPhaseAPI, } from './types.js';
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/helpers/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,EACL,QAAQ,EACR,WAAW,EACX,KAAK,YAAY,EACjB,KAAK,eAAe,GACrB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,IAAI,EACJ,WAAW,EACX,KAAK,QAAQ,EACb,KAAK,WAAW,GACjB,MAAM,WAAW,CAAC;AACnB,YAAY,EACV,mBAAmB,EACnB,aAAa,EACb,YAAY,EACZ,cAAc,GACf,MAAM,YAAY,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Convenience helpers — `schedule`, `hook`, `oneShot`.
3
+ *
4
+ * Each helper wraps a single handler function into a Phase, then returns
5
+ * an `ExtensionRegisterFn` `(api) => void` that the CLI auto-loader picks
6
+ * up via the file's default export. See each helper file for examples.
7
+ */
8
+ export { oneShot } from './one-shot.js';
9
+ export { schedule, CronTrigger, } from './schedule.js';
10
+ export { hook, HttpTrigger, } from './hook.js';
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/helpers/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAuB,MAAM,eAAe,CAAC;AAC7D,OAAO,EACL,QAAQ,EACR,WAAW,GAGZ,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,IAAI,EACJ,WAAW,GAGZ,MAAM,WAAW,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * `oneShot` — register a single-handler pipeline with no trigger binding.
3
+ *
4
+ * Compresses the common "I have a one-off task I want to invoke via
5
+ * `thread-phase run <name>`" case to a single function call. The handler
6
+ * runs as a one-phase pipeline; its return value is captured as a `data`
7
+ * event with key `${name}.result`.
8
+ *
9
+ * Example:
10
+ *
11
+ * export default oneShot(async (ctx) => {
12
+ * await fireAndForget();
13
+ * return { ok: true };
14
+ * });
15
+ *
16
+ * If `name` is omitted, the helper derives it from the basename of the
17
+ * calling file. For production code prefer passing an explicit `name`.
18
+ */
19
+ import type { ExtensionRegisterFn, HelperHandler } from './types.js';
20
+ export interface OneShotOptions {
21
+ /** Pipeline name. If omitted, derived from the calling file's basename. */
22
+ name?: string;
23
+ /** Free-form description for `thread-phase list`. */
24
+ description?: string;
25
+ }
26
+ export declare function oneShot<TResult = unknown>(handler: HelperHandler<unknown, TResult>, options?: OneShotOptions): ExtensionRegisterFn;
27
+ //# sourceMappingURL=one-shot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"one-shot.d.ts","sourceRoot":"","sources":["../../src/helpers/one-shot.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAKH,OAAO,KAAK,EACV,mBAAmB,EACnB,aAAa,EAEd,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,cAAc;IAC7B,2EAA2E;IAC3E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qDAAqD;IACrD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,OAAO,CAAC,OAAO,GAAG,OAAO,EACvC,OAAO,EAAE,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,EACxC,OAAO,GAAE,cAAmB,GAC3B,mBAAmB,CAwBrB"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * `oneShot` — register a single-handler pipeline with no trigger binding.
3
+ *
4
+ * Compresses the common "I have a one-off task I want to invoke via
5
+ * `thread-phase run <name>`" case to a single function call. The handler
6
+ * runs as a one-phase pipeline; its return value is captured as a `data`
7
+ * event with key `${name}.result`.
8
+ *
9
+ * Example:
10
+ *
11
+ * export default oneShot(async (ctx) => {
12
+ * await fireAndForget();
13
+ * return { ok: true };
14
+ * });
15
+ *
16
+ * If `name` is omitted, the helper derives it from the basename of the
17
+ * calling file. For production code prefer passing an explicit `name`.
18
+ */
19
+ import { PipelineCache } from '../cache.js';
20
+ import { deriveNameFromCaller } from './caller.js';
21
+ export function oneShot(handler, options = {}) {
22
+ const name = options.name ?? deriveNameFromCaller('oneShot');
23
+ const phase = {
24
+ name,
25
+ async *run(ctx) {
26
+ const result = await handler(undefined, ctx);
27
+ yield {
28
+ type: 'data',
29
+ key: `${name}.result`,
30
+ value: result,
31
+ };
32
+ },
33
+ };
34
+ const spec = {
35
+ phases: [phase],
36
+ ctx: () => ({ cache: new PipelineCache() }),
37
+ description: options.description,
38
+ };
39
+ return (api) => {
40
+ api.registerPipeline(name, spec);
41
+ };
42
+ }
43
+ //# sourceMappingURL=one-shot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"one-shot.js","sourceRoot":"","sources":["../../src/helpers/one-shot.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAcnD,MAAM,UAAU,OAAO,CACrB,OAAwC,EACxC,UAA0B,EAAE;IAE5B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,oBAAoB,CAAC,SAAS,CAAC,CAAC;IAE7D,MAAM,KAAK,GAA+B;QACxC,IAAI;QACJ,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG;YACZ,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;YAC7C,MAAM;gBACJ,IAAI,EAAE,MAAM;gBACZ,GAAG,EAAE,GAAG,IAAI,SAAS;gBACrB,KAAK,EAAE,MAAM;aACd,CAAC;QACJ,CAAC;KACF,CAAC;IAEF,MAAM,IAAI,GAA+C;QACvD,MAAM,EAAE,CAAC,KAAK,CAAC;QACf,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,aAAa,EAAE,EAAE,CAAC;QAC3C,WAAW,EAAE,OAAO,CAAC,WAAW;KACjC,CAAC;IAEF,OAAO,CAAC,GAAG,EAAE,EAAE;QACb,GAAG,CAAC,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACnC,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * `schedule` — register a recurring pipeline driven by a timer or cron.
3
+ *
4
+ * Two surface forms:
5
+ *
6
+ * schedule({ intervalMs: N }, handler) // fires every N ms
7
+ * schedule({ cron: expr }, handler) // fires per cron expression
8
+ *
9
+ * Both register one Trigger (a `TimerTrigger` for `intervalMs`, a
10
+ * `CronTrigger` for `cron`) and one Pipeline that binds to it. The
11
+ * handler runs as a single Phase per fire; its return value is captured
12
+ * as a `data` event `${name}.result`.
13
+ *
14
+ * The `cron` form lazy-loads the optional peer dependency `cron-parser`
15
+ * at trigger start. Library users who never call the cron form pay
16
+ * nothing for the dep.
17
+ */
18
+ import type { Trigger, TriggerEvent } from '../triggers/types.js';
19
+ import type { ExtensionRegisterFn, HelperHandler } from './types.js';
20
+ export type ScheduleSpec = {
21
+ intervalMs: number;
22
+ } | {
23
+ cron: string;
24
+ };
25
+ export interface ScheduleOptions {
26
+ /** Pipeline + trigger base name. Defaults to the calling file's basename. */
27
+ name?: string;
28
+ /** Free-form description for `thread-phase list`. */
29
+ description?: string;
30
+ }
31
+ export declare function schedule<TResult = unknown>(spec: ScheduleSpec, handler: HelperHandler<TriggerEvent<unknown>, TResult>, options?: ScheduleOptions): ExtensionRegisterFn;
32
+ interface CronParserModule {
33
+ parseExpression(expr: string): {
34
+ next(): {
35
+ toDate(): Date;
36
+ };
37
+ };
38
+ }
39
+ interface CronTriggerOptions {
40
+ cron: string;
41
+ name: string;
42
+ /** Test-only seam: inject a cron-parser implementation. */
43
+ _cronParser?: CronParserModule;
44
+ }
45
+ export declare class CronTrigger implements Trigger<void> {
46
+ readonly name: string;
47
+ private readonly cron;
48
+ private readonly injected?;
49
+ private seq;
50
+ private stopped;
51
+ private pendingTimer;
52
+ private notifyStop;
53
+ constructor(opts: CronTriggerOptions);
54
+ start(): AsyncGenerator<TriggerEvent<void>, void>;
55
+ stop(): Promise<void>;
56
+ private waitOrStop;
57
+ }
58
+ export {};
59
+ //# sourceMappingURL=schedule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schedule.d.ts","sourceRoot":"","sources":["../../src/helpers/schedule.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAKH,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAElE,OAAO,KAAK,EACV,mBAAmB,EACnB,aAAa,EAEd,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,YAAY,GAAG;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAErE,MAAM,WAAW,eAAe;IAC9B,6EAA6E;IAC7E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qDAAqD;IACrD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,QAAQ,CAAC,OAAO,GAAG,OAAO,EACxC,IAAI,EAAE,YAAY,EAClB,OAAO,EAAE,aAAa,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,EACtD,OAAO,GAAE,eAAoB,GAC5B,mBAAmB,CAiDrB;AAQD,UAAU,gBAAgB;IACxB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG;QAAE,IAAI,IAAI;YAAE,MAAM,IAAI,IAAI,CAAA;SAAE,CAAA;KAAE,CAAC;CAC/D;AAED,UAAU,kBAAkB;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,2DAA2D;IAC3D,WAAW,CAAC,EAAE,gBAAgB,CAAC;CAChC;AAED,qBAAa,WAAY,YAAW,OAAO,CAAC,IAAI,CAAC;IAC/C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAmB;IAE7C,OAAO,CAAC,GAAG,CAAK;IAChB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,YAAY,CAA8C;IAClE,OAAO,CAAC,UAAU,CAA6B;gBAEnC,IAAI,EAAE,kBAAkB;IAM7B,KAAK,IAAI,cAAc,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC;IAmBlD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAW3B,OAAO,CAAC,UAAU;CASnB"}
@@ -0,0 +1,118 @@
1
+ /**
2
+ * `schedule` — register a recurring pipeline driven by a timer or cron.
3
+ *
4
+ * Two surface forms:
5
+ *
6
+ * schedule({ intervalMs: N }, handler) // fires every N ms
7
+ * schedule({ cron: expr }, handler) // fires per cron expression
8
+ *
9
+ * Both register one Trigger (a `TimerTrigger` for `intervalMs`, a
10
+ * `CronTrigger` for `cron`) and one Pipeline that binds to it. The
11
+ * handler runs as a single Phase per fire; its return value is captured
12
+ * as a `data` event `${name}.result`.
13
+ *
14
+ * The `cron` form lazy-loads the optional peer dependency `cron-parser`
15
+ * at trigger start. Library users who never call the cron form pay
16
+ * nothing for the dep.
17
+ */
18
+ import { PipelineCache } from '../cache.js';
19
+ import { TimerTrigger } from '../triggers/timer-trigger.js';
20
+ import { deriveNameFromCaller } from './caller.js';
21
+ export function schedule(spec, handler, options = {}) {
22
+ const name = options.name ?? deriveNameFromCaller('schedule');
23
+ const triggerName = `${name}:trigger`;
24
+ let trigger;
25
+ if ('intervalMs' in spec) {
26
+ trigger = new TimerTrigger({
27
+ intervalMs: spec.intervalMs,
28
+ name: triggerName,
29
+ });
30
+ }
31
+ else {
32
+ trigger = new CronTrigger({ cron: spec.cron, name: triggerName });
33
+ }
34
+ const phase = {
35
+ name,
36
+ async *run(ctx) {
37
+ const event = ctx
38
+ .__triggerEvent ?? {
39
+ id: 0,
40
+ occurredAt: new Date().toISOString(),
41
+ input: undefined,
42
+ };
43
+ const result = await handler(event, ctx);
44
+ yield {
45
+ type: 'data',
46
+ key: `${name}.result`,
47
+ value: result,
48
+ };
49
+ },
50
+ };
51
+ const pipelineSpec = {
52
+ phases: [phase],
53
+ ctx: (_input, event) => {
54
+ const ctx = { cache: new PipelineCache() };
55
+ ctx.__triggerEvent = event;
56
+ return ctx;
57
+ },
58
+ trigger: triggerName,
59
+ description: options.description,
60
+ };
61
+ return (api) => {
62
+ api.registerTrigger(triggerName, trigger);
63
+ api.registerPipeline(name, pipelineSpec);
64
+ };
65
+ }
66
+ export class CronTrigger {
67
+ name;
68
+ cron;
69
+ injected;
70
+ seq = 0;
71
+ stopped = false;
72
+ pendingTimer = null;
73
+ notifyStop = null;
74
+ constructor(opts) {
75
+ this.name = opts.name;
76
+ this.cron = opts.cron;
77
+ this.injected = opts._cronParser;
78
+ }
79
+ async *start() {
80
+ if (this.stopped)
81
+ return;
82
+ const parser = this.injected ??
83
+ (await import('cron-parser'));
84
+ while (!this.stopped) {
85
+ const next = parser.parseExpression(this.cron).next().toDate();
86
+ const delay = Math.max(0, next.getTime() - Date.now());
87
+ const waited = await this.waitOrStop(delay);
88
+ if (!waited)
89
+ return;
90
+ yield {
91
+ id: ++this.seq,
92
+ occurredAt: new Date().toISOString(),
93
+ input: undefined,
94
+ };
95
+ }
96
+ }
97
+ async stop() {
98
+ if (this.stopped)
99
+ return;
100
+ this.stopped = true;
101
+ if (this.pendingTimer) {
102
+ clearTimeout(this.pendingTimer);
103
+ this.pendingTimer = null;
104
+ }
105
+ this.notifyStop?.();
106
+ this.notifyStop = null;
107
+ }
108
+ waitOrStop(ms) {
109
+ return new Promise((resolve) => {
110
+ this.pendingTimer = setTimeout(() => {
111
+ this.pendingTimer = null;
112
+ resolve(true);
113
+ }, ms);
114
+ this.notifyStop = () => resolve(false);
115
+ });
116
+ }
117
+ }
118
+ //# sourceMappingURL=schedule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schedule.js","sourceRoot":"","sources":["../../src/helpers/schedule.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Local types for the helpers package.
3
+ *
4
+ * These mirror the shapes of `PipelineSpec` and `ThreadPhaseAPI` from
5
+ * `@autonome-research/thread-phase-cli` but are redeclared here so the
6
+ * core package stays free of any dependency on the CLI. The CLI's
7
+ * `Registry` is structurally compatible with this `ThreadPhaseAPI` —
8
+ * the helpers' return value plugs straight into the CLI auto-loader.
9
+ */
10
+ import type { AgentAdapterMeta, AgentRunResult } from '../agents/index.js';
11
+ import type { BasePipelineContext, Phase } from '../phase.js';
12
+ import type { Trigger, TriggerEvent } from '../triggers/types.js';
13
+ /** A registered pipeline definition. Structurally identical to the CLI's. */
14
+ export interface PipelineSpec<TCtx extends BasePipelineContext = BasePipelineContext, TInput = unknown> {
15
+ phases: ReadonlyArray<Phase<TCtx>> | ((input: TInput, event: TriggerEvent<TInput>) => ReadonlyArray<Phase<TCtx>>);
16
+ ctx: TCtx | ((input: TInput, event: TriggerEvent<TInput>) => TCtx);
17
+ trigger?: string;
18
+ defaultInput?: TInput;
19
+ description?: string;
20
+ }
21
+ /** Registration surface a helper invokes. Structurally compatible with the CLI's `ThreadPhaseAPI`. */
22
+ export interface ThreadPhaseAPI {
23
+ registerTrigger<TInput>(name: string, trigger: Trigger<TInput>): void;
24
+ registerAdapter<TConfig, TResult extends AgentRunResult = AgentRunResult>(name: string, adapter: AgentAdapterMeta<TConfig, TResult>): void;
25
+ registerPipeline<TCtx extends BasePipelineContext, TInput = unknown>(name: string, spec: PipelineSpec<TCtx, TInput>): void;
26
+ getPipeline(name: string): PipelineSpec<BasePipelineContext, unknown> | undefined;
27
+ getAdapter(name: string): AgentAdapterMeta<unknown, AgentRunResult> | undefined;
28
+ getTrigger(name: string): Trigger<unknown> | undefined;
29
+ }
30
+ /** Extension default export: `(api) => void`. */
31
+ export type ExtensionRegisterFn = (api: ThreadPhaseAPI) => void | Promise<void>;
32
+ /** A user-supplied handler wrapped by a helper into a Phase. */
33
+ export type HelperHandler<TInput, TResult> = (input: TInput, ctx: BasePipelineContext) => Promise<TResult> | TResult;
34
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/helpers/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,gBAAgB,EAChB,cAAc,EACf,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,mBAAmB,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAElE,6EAA6E;AAC7E,MAAM,WAAW,YAAY,CAC3B,IAAI,SAAS,mBAAmB,GAAG,mBAAmB,EACtD,MAAM,GAAG,OAAO;IAEhB,MAAM,EACF,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAC1B,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,CAAC,MAAM,CAAC,KAAK,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjF,GAAG,EAAE,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;IACnE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,sGAAsG;AACtG,MAAM,WAAW,cAAc;IAC7B,eAAe,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;IACtE,eAAe,CAAC,OAAO,EAAE,OAAO,SAAS,cAAc,GAAG,cAAc,EACtE,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,GAC1C,IAAI,CAAC;IACR,gBAAgB,CAAC,IAAI,SAAS,mBAAmB,EAAE,MAAM,GAAG,OAAO,EACjE,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,GAC/B,IAAI,CAAC;IACR,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAAC,mBAAmB,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IAClF,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAAC,OAAO,EAAE,cAAc,CAAC,GAAG,SAAS,CAAC;IAChF,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,SAAS,CAAC;CACxD;AAED,iDAAiD;AACjD,MAAM,MAAM,mBAAmB,GAAG,CAAC,GAAG,EAAE,cAAc,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAEhF,gEAAgE;AAChE,MAAM,MAAM,aAAa,CAAC,MAAM,EAAE,OAAO,IAAI,CAC3C,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,mBAAmB,KACrB,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Local types for the helpers package.
3
+ *
4
+ * These mirror the shapes of `PipelineSpec` and `ThreadPhaseAPI` from
5
+ * `@autonome-research/thread-phase-cli` but are redeclared here so the
6
+ * core package stays free of any dependency on the CLI. The CLI's
7
+ * `Registry` is structurally compatible with this `ThreadPhaseAPI` —
8
+ * the helpers' return value plugs straight into the CLI auto-loader.
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/helpers/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Public API — the v1 stable surface.
3
+ *
4
+ * Everything exported from this file is covered by semver:
5
+ * - patch (1.0.x): bug fixes, no API changes
6
+ * - minor (1.x.0): additive only — new exports, new optional fields
7
+ * - major (x.0.0): breaking changes
8
+ *
9
+ * Items marked @internal in their own files (e.g. `consumeStream`,
10
+ * `toOpenAIMessages`) are reachable via deep import for advanced callers
11
+ * but are NOT part of this stable surface and may change in minor releases.
12
+ *
13
+ * Subpath exports (./patterns, ./context, ./session, ./tools) live in their
14
+ * own index files and are exposed via package.json `exports`. They follow
15
+ * the same stability policy.
16
+ */
17
+ export { PipelineCache } from './cache.js';
18
+ export { runPipeline, runPipelineToSummary, type PipelineSummary, } from './orchestrator.js';
19
+ export { requireCtx, type Phase, type BasePipelineContext, type PipelineEvent, } from './phase.js';
20
+ export { type Message, type SystemMessage, type UserMessage, type AssistantMessage, type ToolResultMessage, type ToolCall, type ToolDefinition, type ToolResult, type ToolExecutor, } from './messages.js';
21
+ export { loadInferenceConfig, createInferenceClient, type InferenceConfig, } from './inference.js';
22
+ export { runAgentWithTools, parseJSON, type AgentConfig, type AgentRunnerOptions, type AgentRunResult, type ActivityEntry, type AgentStreamEvent, type FinishReason, type UsageInfo, } from './agent/index.js';
23
+ export { type JobStore, SqliteJobStore, JobRunner, type JobRecord, type EventRecord, type JobStatus, type ListJobsOptions, type LiveEvent, } from './session/index.js';
24
+ export { ToolRegistry, type ToolHandler, type ToolRegistryOptions, } from './tools/index.js';
25
+ export { oneShot, schedule, hook, CronTrigger, HttpTrigger, type OneShotOptions, type ScheduleSpec, type ScheduleOptions, type HookSpec, type HookOptions, type ExtensionRegisterFn, type HelperHandler, type PipelineSpec, type ThreadPhaseAPI, } from './helpers/index.js';
26
+ //# sourceMappingURL=index.d.ts.map