@primo-ai/core 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 (194) hide show
  1. package/README.md +114 -0
  2. package/dist/agent.d.ts +66 -0
  3. package/dist/agent.d.ts.map +1 -0
  4. package/dist/agent.js +260 -0
  5. package/dist/agent.js.map +1 -0
  6. package/dist/checkpoint-store.d.ts +19 -0
  7. package/dist/checkpoint-store.d.ts.map +1 -0
  8. package/dist/checkpoint-store.js +79 -0
  9. package/dist/checkpoint-store.js.map +1 -0
  10. package/dist/concurrency-controller.d.ts +9 -0
  11. package/dist/concurrency-controller.d.ts.map +1 -0
  12. package/dist/concurrency-controller.js +71 -0
  13. package/dist/concurrency-controller.js.map +1 -0
  14. package/dist/config-merge.d.ts +12 -0
  15. package/dist/config-merge.d.ts.map +1 -0
  16. package/dist/config-merge.js +47 -0
  17. package/dist/config-merge.js.map +1 -0
  18. package/dist/config.d.ts +16 -0
  19. package/dist/config.d.ts.map +1 -0
  20. package/dist/config.js +144 -0
  21. package/dist/config.js.map +1 -0
  22. package/dist/context-builder.d.ts +29 -0
  23. package/dist/context-builder.d.ts.map +1 -0
  24. package/dist/context-builder.js +178 -0
  25. package/dist/context-builder.js.map +1 -0
  26. package/dist/dynamic-resolver.d.ts +7 -0
  27. package/dist/dynamic-resolver.d.ts.map +1 -0
  28. package/dist/dynamic-resolver.js +11 -0
  29. package/dist/dynamic-resolver.js.map +1 -0
  30. package/dist/errors.d.ts +30 -0
  31. package/dist/errors.d.ts.map +1 -0
  32. package/dist/errors.js +40 -0
  33. package/dist/errors.js.map +1 -0
  34. package/dist/event-bus.d.ts +8 -0
  35. package/dist/event-bus.d.ts.map +1 -0
  36. package/dist/event-bus.js +36 -0
  37. package/dist/event-bus.js.map +1 -0
  38. package/dist/event-system.d.ts +19 -0
  39. package/dist/event-system.d.ts.map +1 -0
  40. package/dist/event-system.js +58 -0
  41. package/dist/event-system.js.map +1 -0
  42. package/dist/fallback-runner.d.ts +30 -0
  43. package/dist/fallback-runner.d.ts.map +1 -0
  44. package/dist/fallback-runner.js +40 -0
  45. package/dist/fallback-runner.js.map +1 -0
  46. package/dist/gateways/builtin-gateway.d.ts +17 -0
  47. package/dist/gateways/builtin-gateway.d.ts.map +1 -0
  48. package/dist/gateways/builtin-gateway.js +58 -0
  49. package/dist/gateways/builtin-gateway.js.map +1 -0
  50. package/dist/gateways/gateway-chain.d.ts +9 -0
  51. package/dist/gateways/gateway-chain.d.ts.map +1 -0
  52. package/dist/gateways/gateway-chain.js +18 -0
  53. package/dist/gateways/gateway-chain.js.map +1 -0
  54. package/dist/gateways/openai-compatible-gateway.d.ts +10 -0
  55. package/dist/gateways/openai-compatible-gateway.d.ts.map +1 -0
  56. package/dist/gateways/openai-compatible-gateway.js +26 -0
  57. package/dist/gateways/openai-compatible-gateway.js.map +1 -0
  58. package/dist/harness.d.ts +44 -0
  59. package/dist/harness.d.ts.map +1 -0
  60. package/dist/harness.js +70 -0
  61. package/dist/harness.js.map +1 -0
  62. package/dist/hook-manager.d.ts +22 -0
  63. package/dist/hook-manager.d.ts.map +1 -0
  64. package/dist/hook-manager.js +92 -0
  65. package/dist/hook-manager.js.map +1 -0
  66. package/dist/index.d.ts +34 -0
  67. package/dist/index.d.ts.map +1 -0
  68. package/dist/index.js +34 -0
  69. package/dist/index.js.map +1 -0
  70. package/dist/llm-invoker.d.ts +34 -0
  71. package/dist/llm-invoker.d.ts.map +1 -0
  72. package/dist/llm-invoker.js +124 -0
  73. package/dist/llm-invoker.js.map +1 -0
  74. package/dist/loop-orchestrator.d.ts +48 -0
  75. package/dist/loop-orchestrator.d.ts.map +1 -0
  76. package/dist/loop-orchestrator.js +247 -0
  77. package/dist/loop-orchestrator.js.map +1 -0
  78. package/dist/model-factory.d.ts +13 -0
  79. package/dist/model-factory.d.ts.map +1 -0
  80. package/dist/model-factory.js +40 -0
  81. package/dist/model-factory.js.map +1 -0
  82. package/dist/model-profile.d.ts +17 -0
  83. package/dist/model-profile.d.ts.map +1 -0
  84. package/dist/model-profile.js +57 -0
  85. package/dist/model-profile.js.map +1 -0
  86. package/dist/model-resolver.d.ts +16 -0
  87. package/dist/model-resolver.d.ts.map +1 -0
  88. package/dist/model-resolver.js +28 -0
  89. package/dist/model-resolver.js.map +1 -0
  90. package/dist/parse-model.d.ts +6 -0
  91. package/dist/parse-model.d.ts.map +1 -0
  92. package/dist/parse-model.js +11 -0
  93. package/dist/parse-model.js.map +1 -0
  94. package/dist/pipeline.d.ts +28 -0
  95. package/dist/pipeline.d.ts.map +1 -0
  96. package/dist/pipeline.js +286 -0
  97. package/dist/pipeline.js.map +1 -0
  98. package/dist/plugin-manager.d.ts +42 -0
  99. package/dist/plugin-manager.d.ts.map +1 -0
  100. package/dist/plugin-manager.js +148 -0
  101. package/dist/plugin-manager.js.map +1 -0
  102. package/dist/processors/build-context.d.ts +3 -0
  103. package/dist/processors/build-context.d.ts.map +1 -0
  104. package/dist/processors/build-context.js +5 -0
  105. package/dist/processors/build-context.js.map +1 -0
  106. package/dist/processors/evaluate-iteration.d.ts +13 -0
  107. package/dist/processors/evaluate-iteration.d.ts.map +1 -0
  108. package/dist/processors/evaluate-iteration.js +196 -0
  109. package/dist/processors/evaluate-iteration.js.map +1 -0
  110. package/dist/processors/execute-tools.d.ts +4 -0
  111. package/dist/processors/execute-tools.d.ts.map +1 -0
  112. package/dist/processors/execute-tools.js +69 -0
  113. package/dist/processors/execute-tools.js.map +1 -0
  114. package/dist/processors/gate-tool.d.ts +3 -0
  115. package/dist/processors/gate-tool.d.ts.map +1 -0
  116. package/dist/processors/gate-tool.js +6 -0
  117. package/dist/processors/gate-tool.js.map +1 -0
  118. package/dist/processors/index.d.ts +10 -0
  119. package/dist/processors/index.d.ts.map +1 -0
  120. package/dist/processors/index.js +10 -0
  121. package/dist/processors/index.js.map +1 -0
  122. package/dist/processors/invoke-llm.d.ts +13 -0
  123. package/dist/processors/invoke-llm.d.ts.map +1 -0
  124. package/dist/processors/invoke-llm.js +138 -0
  125. package/dist/processors/invoke-llm.js.map +1 -0
  126. package/dist/processors/prepare-step.d.ts +3 -0
  127. package/dist/processors/prepare-step.d.ts.map +1 -0
  128. package/dist/processors/prepare-step.js +5 -0
  129. package/dist/processors/prepare-step.js.map +1 -0
  130. package/dist/processors/process-input.d.ts +3 -0
  131. package/dist/processors/process-input.d.ts.map +1 -0
  132. package/dist/processors/process-input.js +20 -0
  133. package/dist/processors/process-input.js.map +1 -0
  134. package/dist/processors/process-output.d.ts +3 -0
  135. package/dist/processors/process-output.d.ts.map +1 -0
  136. package/dist/processors/process-output.js +5 -0
  137. package/dist/processors/process-output.js.map +1 -0
  138. package/dist/processors/process-step-output.d.ts +3 -0
  139. package/dist/processors/process-step-output.d.ts.map +1 -0
  140. package/dist/processors/process-step-output.js +23 -0
  141. package/dist/processors/process-step-output.js.map +1 -0
  142. package/dist/processors/provider-history-compat.d.ts +7 -0
  143. package/dist/processors/provider-history-compat.d.ts.map +1 -0
  144. package/dist/processors/provider-history-compat.js +166 -0
  145. package/dist/processors/provider-history-compat.js.map +1 -0
  146. package/dist/provider-capabilities.d.ts +4 -0
  147. package/dist/provider-capabilities.d.ts.map +1 -0
  148. package/dist/provider-capabilities.js +47 -0
  149. package/dist/provider-capabilities.js.map +1 -0
  150. package/dist/retry.d.ts +6 -0
  151. package/dist/retry.d.ts.map +1 -0
  152. package/dist/retry.js +26 -0
  153. package/dist/retry.js.map +1 -0
  154. package/dist/serialize.d.ts +12 -0
  155. package/dist/serialize.d.ts.map +1 -0
  156. package/dist/serialize.js +22 -0
  157. package/dist/serialize.js.map +1 -0
  158. package/dist/session-manager.d.ts +17 -0
  159. package/dist/session-manager.d.ts.map +1 -0
  160. package/dist/session-manager.js +143 -0
  161. package/dist/session-manager.js.map +1 -0
  162. package/dist/session-persistence.d.ts +13 -0
  163. package/dist/session-persistence.d.ts.map +1 -0
  164. package/dist/session-persistence.js +63 -0
  165. package/dist/session-persistence.js.map +1 -0
  166. package/dist/session-storage.d.ts +19 -0
  167. package/dist/session-storage.d.ts.map +1 -0
  168. package/dist/session-storage.js +103 -0
  169. package/dist/session-storage.js.map +1 -0
  170. package/dist/state-machine.d.ts +13 -0
  171. package/dist/state-machine.d.ts.map +1 -0
  172. package/dist/state-machine.js +49 -0
  173. package/dist/state-machine.js.map +1 -0
  174. package/dist/storage-replay-backend.d.ts +7 -0
  175. package/dist/storage-replay-backend.d.ts.map +1 -0
  176. package/dist/storage-replay-backend.js +14 -0
  177. package/dist/storage-replay-backend.js.map +1 -0
  178. package/dist/sub-agent.d.ts +13 -0
  179. package/dist/sub-agent.d.ts.map +1 -0
  180. package/dist/sub-agent.js +87 -0
  181. package/dist/sub-agent.js.map +1 -0
  182. package/dist/task-manager.d.ts +22 -0
  183. package/dist/task-manager.d.ts.map +1 -0
  184. package/dist/task-manager.js +151 -0
  185. package/dist/task-manager.js.map +1 -0
  186. package/dist/token-counter.d.ts +9 -0
  187. package/dist/token-counter.d.ts.map +1 -0
  188. package/dist/token-counter.js +74 -0
  189. package/dist/token-counter.js.map +1 -0
  190. package/dist/tool-registry.d.ts +31 -0
  191. package/dist/tool-registry.d.ts.map +1 -0
  192. package/dist/tool-registry.js +147 -0
  193. package/dist/tool-registry.js.map +1 -0
  194. package/package.json +37 -0
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Find the first ModelProfile whose modelPattern matches the given model string.
3
+ * String patterns use simple `includes`; RegExp patterns use `test()`.
4
+ */
5
+ export function matchProfile(model, profiles) {
6
+ for (const profile of profiles) {
7
+ if (profile.modelPattern instanceof RegExp) {
8
+ if (profile.modelPattern.test(model))
9
+ return profile;
10
+ }
11
+ else {
12
+ if (model.includes(profile.modelPattern))
13
+ return profile;
14
+ }
15
+ }
16
+ return undefined;
17
+ }
18
+ /**
19
+ * Apply a ModelProfile to a PipelineContext, returning a new context
20
+ * (original is not mutated).
21
+ *
22
+ * - extraPromptFragments are converted from PromptFragment[] to strings
23
+ * by extracting `.content`, then appended to promptFragments.
24
+ * - systemPromptSuffix is appended as a plain string after fragments.
25
+ * - toolOverrides.exclude removes matching tools; description overrides update them.
26
+ */
27
+ export function applyProfile(ctx, profile) {
28
+ // Build new promptFragments: existing + extra (converted) + suffix
29
+ const newFragments = profile.extraPromptFragments?.map((f) => f.content) ?? [];
30
+ const promptFragments = [...ctx.agent.promptFragments, ...newFragments];
31
+ if (profile.systemPromptSuffix) {
32
+ promptFragments.push(profile.systemPromptSuffix);
33
+ }
34
+ // Apply tool overrides
35
+ const overrides = profile.toolOverrides ?? {};
36
+ const toolDeclarations = ctx.agent.toolDeclarations
37
+ .filter((tool) => {
38
+ const override = overrides[tool.name];
39
+ return !override?.exclude;
40
+ })
41
+ .map((tool) => {
42
+ const override = overrides[tool.name];
43
+ if (override?.description) {
44
+ return { ...tool, description: override.description };
45
+ }
46
+ return tool;
47
+ });
48
+ return {
49
+ ...ctx,
50
+ agent: {
51
+ ...ctx.agent,
52
+ promptFragments,
53
+ toolDeclarations,
54
+ },
55
+ };
56
+ }
57
+ //# sourceMappingURL=model-profile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-profile.js","sourceRoot":"","sources":["../src/model-profile.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,UAAU,YAAY,CAC1B,KAAa,EACb,QAAwB;IAExB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,OAAO,CAAC,YAAY,YAAY,MAAM,EAAE,CAAC;YAC3C,IAAI,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;gBAAE,OAAO,OAAO,CAAC;QACvD,CAAC;aAAM,CAAC;YACN,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC;gBAAE,OAAO,OAAO,CAAC;QAC3D,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,YAAY,CAC1B,GAAoB,EACpB,OAAqB;IAErB,mEAAmE;IACnE,MAAM,YAAY,GAAG,OAAO,CAAC,oBAAoB,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IAC/E,MAAM,eAAe,GAAG,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,eAAe,EAAE,GAAG,YAAY,CAAC,CAAC;IAExE,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;QAC/B,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACnD,CAAC;IAED,uBAAuB;IACvB,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,IAAI,EAAE,CAAC;IAC9C,MAAM,gBAAgB,GAAG,GAAG,CAAC,KAAK,CAAC,gBAAgB;SAChD,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QACf,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC5B,CAAC,CAAC;SACD,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACZ,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,QAAQ,EAAE,WAAW,EAAE,CAAC;YAC1B,OAAO,EAAE,GAAG,IAAI,EAAE,WAAW,EAAE,QAAQ,CAAC,WAAW,EAAE,CAAC;QACxD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IAEL,OAAO;QACL,GAAG,GAAG;QACN,KAAK,EAAE;YACL,GAAG,GAAG,CAAC,KAAK;YACZ,eAAe;YACf,gBAAgB;SACjB;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { LanguageModel } from 'ai';
2
+ import type { GatewayConfig } from '@primo-ai/sdk';
3
+ import { GatewayChain } from './gateways/gateway-chain.js';
4
+ import { BuiltInGateway } from './gateways/builtin-gateway.js';
5
+ import { OpenAICompatibleGateway } from './gateways/openai-compatible-gateway.js';
6
+ export { registerProvider } from './gateways/builtin-gateway.js';
7
+ export { GatewayChain, BuiltInGateway, OpenAICompatibleGateway };
8
+ export { parseModel, type ParsedModel } from './parse-model.js';
9
+ /**
10
+ * Resolve a model string to a LanguageModel using the default gateway chain.
11
+ * @deprecated Use `ModelFactory` instead for injectable, instance-based resolution.
12
+ */
13
+ export declare function resolveModel(modelString: string): Promise<LanguageModel>;
14
+ /** Create a gateway chain with custom gateways prepended before BuiltInGateway. */
15
+ export declare function createChain(configs?: GatewayConfig[]): GatewayChain;
16
+ //# sourceMappingURL=model-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-resolver.d.ts","sourceRoot":"","sources":["../src/model-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACxC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,cAAc,EAA4B,MAAM,+BAA+B,CAAC;AACzF,OAAO,EAAE,uBAAuB,EAAE,MAAM,yCAAyC,CAAC;AAElF,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,uBAAuB,EAAE,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAMhE;;;GAGG;AACH,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAE9E;AAED,mFAAmF;AACnF,wBAAgB,WAAW,CAAC,OAAO,CAAC,EAAE,aAAa,EAAE,GAAG,YAAY,CASnE"}
@@ -0,0 +1,28 @@
1
+ import { GatewayChain } from './gateways/gateway-chain.js';
2
+ import { BuiltInGateway, getDefaultBuiltInGateway } from './gateways/builtin-gateway.js';
3
+ import { OpenAICompatibleGateway } from './gateways/openai-compatible-gateway.js';
4
+ export { registerProvider } from './gateways/builtin-gateway.js';
5
+ export { GatewayChain, BuiltInGateway, OpenAICompatibleGateway };
6
+ export { parseModel } from './parse-model.js';
7
+ // Global default chain: uses the singleton BuiltInGateway so registerProvider() works.
8
+ const defaultChain = new GatewayChain();
9
+ defaultChain.register(getDefaultBuiltInGateway());
10
+ /**
11
+ * Resolve a model string to a LanguageModel using the default gateway chain.
12
+ * @deprecated Use `ModelFactory` instead for injectable, instance-based resolution.
13
+ */
14
+ export async function resolveModel(modelString) {
15
+ return defaultChain.resolve(modelString);
16
+ }
17
+ /** Create a gateway chain with custom gateways prepended before BuiltInGateway. */
18
+ export function createChain(configs) {
19
+ const chain = new GatewayChain();
20
+ if (configs) {
21
+ for (const cfg of configs) {
22
+ chain.register(new OpenAICompatibleGateway(cfg));
23
+ }
24
+ }
25
+ chain.register(getDefaultBuiltInGateway());
26
+ return chain;
27
+ }
28
+ //# sourceMappingURL=model-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-resolver.js","sourceRoot":"","sources":["../src/model-resolver.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzF,OAAO,EAAE,uBAAuB,EAAE,MAAM,yCAAyC,CAAC;AAElF,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,uBAAuB,EAAE,CAAC;AACjE,OAAO,EAAE,UAAU,EAAoB,MAAM,kBAAkB,CAAC;AAEhE,uFAAuF;AACvF,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;AACxC,YAAY,CAAC,QAAQ,CAAC,wBAAwB,EAAE,CAAC,CAAC;AAElD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,WAAmB;IACpD,OAAO,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;AAC3C,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,WAAW,CAAC,OAAyB;IACnD,MAAM,KAAK,GAAG,IAAI,YAAY,EAAE,CAAC;IACjC,IAAI,OAAO,EAAE,CAAC;QACZ,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC1B,KAAK,CAAC,QAAQ,CAAC,IAAI,uBAAuB,CAAC,GAAG,CAAC,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IACD,KAAK,CAAC,QAAQ,CAAC,wBAAwB,EAAE,CAAC,CAAC;IAC3C,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,6 @@
1
+ export interface ParsedModel {
2
+ provider: string;
3
+ modelId: string;
4
+ }
5
+ export declare function parseModel(modelString: string): ParsedModel;
6
+ //# sourceMappingURL=parse-model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-model.d.ts","sourceRoot":"","sources":["../src/parse-model.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,CAW3D"}
@@ -0,0 +1,11 @@
1
+ export function parseModel(modelString) {
2
+ const idx = modelString.indexOf('/');
3
+ if (idx < 1 || idx === modelString.length - 1) {
4
+ throw new Error(`Invalid model string: "${modelString}". Expected format: "provider/model-name"`);
5
+ }
6
+ return {
7
+ provider: modelString.slice(0, idx),
8
+ modelId: modelString.slice(idx + 1),
9
+ };
10
+ }
11
+ //# sourceMappingURL=parse-model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-model.js","sourceRoot":"","sources":["../src/parse-model.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,UAAU,CAAC,WAAmB;IAC5C,MAAM,GAAG,GAAG,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACrC,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,KAAK,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9C,MAAM,IAAI,KAAK,CACb,0BAA0B,WAAW,2CAA2C,CACjF,CAAC;IACJ,CAAC;IACD,OAAO;QACL,QAAQ,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;QACnC,OAAO,EAAE,WAAW,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC;KACpC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,28 @@
1
+ import type { AbortSignal, PipelineContext, Processor, StageName, StreamEvent, SuspensionSignal, Tracer } from '@primo-ai/sdk';
2
+ import type { HookManager } from './hook-manager.js';
3
+ export type RunResult = PipelineContext | AbortSignal | SuspensionSignal;
4
+ export interface PipelineRunnerOptions {
5
+ tracer?: Tracer;
6
+ hookManager?: HookManager;
7
+ }
8
+ export declare class PipelineRunner {
9
+ private processors;
10
+ private tracer;
11
+ private hookManager?;
12
+ constructor(options?: PipelineRunnerOptions);
13
+ register(processor: Processor): void;
14
+ unregister(stage: StageName): void;
15
+ replace(stage: StageName, processor: Processor): void;
16
+ setHookManager(hookManager: HookManager): void;
17
+ run(context: PipelineContext, stages: StageName[], options?: {
18
+ signal?: globalThis.AbortSignal;
19
+ }): Promise<RunResult>;
20
+ stream(context: PipelineContext, stages: StageName[], options?: {
21
+ signal?: globalThis.AbortSignal;
22
+ }): AsyncGenerator<StreamEvent>;
23
+ private executeStage;
24
+ private isAbort;
25
+ private isSuspend;
26
+ private consumeStream;
27
+ }
28
+ //# sourceMappingURL=pipeline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../src/pipeline.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,eAAe,EAEf,SAAS,EAGT,SAAS,EACT,WAAW,EACX,gBAAgB,EAEhB,MAAM,EAEP,MAAM,eAAe,CAAC;AAGvB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAyBrD,MAAM,MAAM,SAAS,GAAG,eAAe,GAAG,WAAW,GAAG,gBAAgB,CAAC;AAEzE,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AA0DD,qBAAa,cAAc;IACzB,OAAO,CAAC,UAAU,CAAmB;IACrC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,WAAW,CAAC,CAAc;gBAEtB,OAAO,CAAC,EAAE,qBAAqB;IAK3C,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI;IAIpC,UAAU,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAIlC,OAAO,CAAC,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI;IAKrD,cAAc,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI;IAIxC,GAAG,CAAC,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,UAAU,CAAC,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,SAAS,CAAC;IA6CpH,MAAM,CAAC,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,UAAU,CAAC,WAAW,CAAA;KAAE,GAAG,cAAc,CAAC,WAAW,CAAC;YAgG1H,YAAY;IAmC1B,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,SAAS;YAIH,aAAa;CAwB5B"}
@@ -0,0 +1,286 @@
1
+ import { SpanType } from '@primo-ai/sdk';
2
+ import { NoOpTracer } from '@primo-ai/observability';
3
+ import { extractTokenUsage } from './llm-invoker.js';
4
+ /**
5
+ * Recursively freezes an object and all nested plain objects / arrays.
6
+ * Uses a WeakSet to guard against circular references.
7
+ * Skips null, non-objects, and already-frozen objects.
8
+ */
9
+ function deepFreeze(obj, seen = new WeakSet()) {
10
+ if (obj === null || typeof obj !== 'object')
11
+ return obj;
12
+ if (Object.isFrozen(obj))
13
+ return obj;
14
+ if (seen.has(obj))
15
+ return obj;
16
+ seen.add(obj);
17
+ Object.freeze(obj);
18
+ for (const value of Object.values(obj)) {
19
+ if (value !== null && typeof value === 'object' && (Array.isArray(value) || Object.getPrototypeOf(value) === Object.prototype)) {
20
+ deepFreeze(value, seen);
21
+ }
22
+ }
23
+ return obj;
24
+ }
25
+ async function parseFullStream(fullStream, callbacks) {
26
+ const chunks = [];
27
+ const toolCalls = [];
28
+ const reasoningParts = [];
29
+ let usage;
30
+ for await (const event of fullStream) {
31
+ if (event.type === 'text-delta') {
32
+ chunks.push(event.text);
33
+ callbacks?.onTextDelta?.(event.text);
34
+ }
35
+ else if (event.type === 'tool-call') {
36
+ const tc = {
37
+ id: (event.toolCallId ?? event.id ?? ''),
38
+ name: (event.toolName ?? event.name ?? ''),
39
+ args: (event.args ?? event.input ?? {}),
40
+ };
41
+ toolCalls.push(tc);
42
+ callbacks?.onToolCall?.(tc);
43
+ }
44
+ else if (event.type === 'reasoning') {
45
+ reasoningParts.push((event.textDelta ?? event.text ?? ''));
46
+ }
47
+ else if (event.type === 'finish-step') {
48
+ usage = extractTokenUsage(event.usage);
49
+ }
50
+ else if (event.type === 'error') {
51
+ throw event.error;
52
+ }
53
+ }
54
+ return { chunks, toolCalls, reasoningParts, usage };
55
+ }
56
+ async function resolveReasoningContent(reasoningParts, reasoningPromise) {
57
+ let reasoningContent = reasoningParts.length > 0 ? reasoningParts.join('') : undefined;
58
+ if (!reasoningContent && reasoningPromise) {
59
+ try {
60
+ reasoningContent = await reasoningPromise ?? undefined;
61
+ }
62
+ catch { /* ignore */ }
63
+ }
64
+ return reasoningContent;
65
+ }
66
+ export class PipelineRunner {
67
+ processors = [];
68
+ tracer;
69
+ hookManager;
70
+ constructor(options) {
71
+ this.tracer = options?.tracer ?? new NoOpTracer();
72
+ this.hookManager = options?.hookManager;
73
+ }
74
+ register(processor) {
75
+ this.processors.push(processor);
76
+ }
77
+ unregister(stage) {
78
+ this.processors = this.processors.filter((p) => p.stage !== stage);
79
+ }
80
+ replace(stage, processor) {
81
+ this.processors = this.processors.filter((p) => p.stage !== stage);
82
+ this.processors.push(processor);
83
+ }
84
+ setHookManager(hookManager) {
85
+ this.hookManager = hookManager;
86
+ }
87
+ async run(context, stages, options) {
88
+ const rootSpan = this.tracer.startSpan(SpanType.AGENT_RUN);
89
+ const signal = options?.signal;
90
+ let ctx = context;
91
+ try {
92
+ for (const stage of stages) {
93
+ if (signal?.aborted)
94
+ throw new DOMException('Pipeline aborted', 'AbortError');
95
+ const stageSpan = rootSpan.startChild(stage);
96
+ try {
97
+ const stageResult = await this.executeStage(ctx, stage, stageSpan);
98
+ if (this.isAbort(stageResult) || this.isSuspend(stageResult)) {
99
+ stageSpan.end();
100
+ rootSpan.end();
101
+ return stageResult;
102
+ }
103
+ ctx = stageResult;
104
+ ctx = await this.consumeStream(ctx);
105
+ // Fire llm.after after stream is consumed (response is now available)
106
+ if (stage === 'invokeLLM' && this.hookManager && ctx.iteration._modelString) {
107
+ await this.hookManager.invoke('llm.after', { model: ctx.iteration._modelString }, { response: ctx.iteration.response });
108
+ }
109
+ // Auto-enrich span with token usage after stream consumption
110
+ if (stage === 'invokeLLM' && ctx.iteration.tokenUsage) {
111
+ stageSpan.setAttribute('tokens.input', ctx.iteration.tokenUsage.input);
112
+ stageSpan.setAttribute('tokens.output', ctx.iteration.tokenUsage.output);
113
+ }
114
+ }
115
+ catch (error) {
116
+ if (this.hookManager) {
117
+ try {
118
+ await this.hookManager.invoke('error', { error, stage }, {});
119
+ }
120
+ catch { /* hook error must not mask original */ }
121
+ }
122
+ throw error;
123
+ }
124
+ finally {
125
+ stageSpan.end();
126
+ }
127
+ }
128
+ }
129
+ finally {
130
+ rootSpan.end();
131
+ }
132
+ return ctx;
133
+ }
134
+ async *stream(context, stages, options) {
135
+ const rootSpan = this.tracer.startSpan(SpanType.AGENT_RUN);
136
+ const signal = options?.signal;
137
+ let ctx = context;
138
+ try {
139
+ for (const stage of stages) {
140
+ if (signal?.aborted)
141
+ throw new DOMException('Pipeline aborted', 'AbortError');
142
+ yield { type: 'stage_start', stage };
143
+ const stageSpan = rootSpan.startChild(stage);
144
+ try {
145
+ const stageResult = await this.executeStage(ctx, stage, stageSpan);
146
+ if (this.isAbort(stageResult)) {
147
+ stageSpan.end();
148
+ rootSpan.end();
149
+ yield { type: 'abort', reason: stageResult.reason, ...(stageResult.retryFrom ? { retryFrom: stageResult.retryFrom } : {}) };
150
+ return;
151
+ }
152
+ if (this.isSuspend(stageResult)) {
153
+ stageSpan.end();
154
+ rootSpan.end();
155
+ yield { type: 'suspended', suspensionId: stageResult.suspensionId, reason: stageResult.reason, checkpoint: stageResult.checkpoint };
156
+ return;
157
+ }
158
+ ctx = stageResult;
159
+ const fullStream = ctx.iteration.fullStream;
160
+ if (fullStream) {
161
+ const chunks = [];
162
+ const toolCalls = [];
163
+ const reasoningParts = [];
164
+ let usage;
165
+ for await (const event of fullStream) {
166
+ if (event.type === 'text-delta') {
167
+ chunks.push(event.text);
168
+ yield { type: 'text_delta', text: event.text };
169
+ }
170
+ else if (event.type === 'tool-call') {
171
+ const tc = {
172
+ id: (event.toolCallId ?? event.id ?? ''),
173
+ name: (event.toolName ?? event.name ?? ''),
174
+ args: (event.args ?? event.input ?? {}),
175
+ };
176
+ toolCalls.push(tc);
177
+ yield { type: 'tool_call', name: tc.name, args: tc.args };
178
+ }
179
+ else if (event.type === 'reasoning') {
180
+ reasoningParts.push((event.textDelta ?? event.text ?? ''));
181
+ }
182
+ else if (event.type === 'finish-step') {
183
+ usage = extractTokenUsage(event.usage);
184
+ }
185
+ else if (event.type === 'error') {
186
+ throw event.error;
187
+ }
188
+ }
189
+ const reasoningContent = await resolveReasoningContent(reasoningParts, ctx.iteration.reasoningPromise);
190
+ const pendingUsage = ctx.iteration.usagePromise
191
+ ? await ctx.iteration.usagePromise
192
+ : undefined;
193
+ ctx = deepFreeze({
194
+ ...ctx,
195
+ iteration: {
196
+ ...ctx.iteration,
197
+ response: chunks.join('') || ctx.iteration.response || '',
198
+ pendingToolCalls: toolCalls.length > 0 ? toolCalls : undefined,
199
+ reasoningContent,
200
+ tokenUsage: usage ?? pendingUsage,
201
+ fullStream: undefined,
202
+ usagePromise: undefined,
203
+ reasoningPromise: undefined,
204
+ },
205
+ });
206
+ }
207
+ // Fire llm.after after stream is consumed (response is now available)
208
+ if (stage === 'invokeLLM' && this.hookManager && ctx.iteration._modelString) {
209
+ await this.hookManager.invoke('llm.after', { model: ctx.iteration._modelString }, { response: ctx.iteration.response });
210
+ }
211
+ // Auto-enrich span with token usage after stream consumption
212
+ if (stage === 'invokeLLM' && ctx.iteration.tokenUsage) {
213
+ stageSpan.setAttribute('tokens.input', ctx.iteration.tokenUsage.input);
214
+ stageSpan.setAttribute('tokens.output', ctx.iteration.tokenUsage.output);
215
+ }
216
+ }
217
+ finally {
218
+ stageSpan.end();
219
+ }
220
+ yield { type: 'stage_complete', stage };
221
+ }
222
+ }
223
+ finally {
224
+ rootSpan.end();
225
+ }
226
+ yield { type: 'complete', context: ctx };
227
+ }
228
+ async executeStage(ctx, stage, stageSpan) {
229
+ const stageProcessors = this.processors.filter((p) => p.stage === stage);
230
+ if (stageProcessors.length === 0)
231
+ return ctx;
232
+ if (stageProcessors.every((p) => p.isNoOp))
233
+ return ctx;
234
+ // stage.before hook
235
+ if (this.hookManager) {
236
+ await this.hookManager.invoke('stage.before', { stage, context: ctx }, {});
237
+ }
238
+ let currentCtx = ctx;
239
+ for (const processor of stageProcessors) {
240
+ const ctxWithSpan = deepFreeze({
241
+ ...currentCtx,
242
+ iteration: { ...currentCtx.iteration, span: stageSpan },
243
+ });
244
+ const result = await processor.execute(ctxWithSpan);
245
+ if ('type' in result && (result.type === 'abort' || result.type === 'suspend')) {
246
+ return result;
247
+ }
248
+ currentCtx = deepFreeze({ ...result });
249
+ }
250
+ // stage.after hook
251
+ if (this.hookManager) {
252
+ await this.hookManager.invoke('stage.after', { stage, context: currentCtx }, {});
253
+ }
254
+ return currentCtx;
255
+ }
256
+ isAbort(result) {
257
+ return 'type' in result && result.type === 'abort';
258
+ }
259
+ isSuspend(result) {
260
+ return 'type' in result && result.type === 'suspend';
261
+ }
262
+ async consumeStream(ctx) {
263
+ const fullStream = ctx.iteration.fullStream;
264
+ if (!fullStream)
265
+ return ctx;
266
+ const result = await parseFullStream(fullStream);
267
+ const reasoningContent = await resolveReasoningContent(result.reasoningParts, ctx.iteration.reasoningPromise);
268
+ const pendingUsage = ctx.iteration.usagePromise
269
+ ? await ctx.iteration.usagePromise
270
+ : undefined;
271
+ return deepFreeze({
272
+ ...ctx,
273
+ iteration: {
274
+ ...ctx.iteration,
275
+ response: result.chunks.join('') || ctx.iteration.response,
276
+ pendingToolCalls: result.toolCalls.length > 0 ? result.toolCalls : undefined,
277
+ reasoningContent,
278
+ tokenUsage: result.usage ?? pendingUsage,
279
+ fullStream: undefined,
280
+ usagePromise: undefined,
281
+ reasoningPromise: undefined,
282
+ },
283
+ });
284
+ }
285
+ }
286
+ //# sourceMappingURL=pipeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../src/pipeline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import type { EventType, HarnessAPI, PluginRegistration, StageMutation } from '@primo-ai/sdk';
2
+ import type { PipelineRunner } from './pipeline.js';
3
+ import type { ToolRegistry } from './tool-registry.js';
4
+ import type { ContextBuilder } from './context-builder.js';
5
+ import { EventBus } from './event-bus.js';
6
+ import { EventSystem } from './event-system.js';
7
+ import { HookManager } from './hook-manager.js';
8
+ export type PluginFactory = (api: HarnessAPI) => PluginRegistration | void;
9
+ export declare class PluginManager {
10
+ private runner;
11
+ private registry;
12
+ private contextBuilder?;
13
+ private _eventSystem;
14
+ readonly hookManager: HookManager;
15
+ private _harnessInstances;
16
+ private resourceInstances;
17
+ private errors;
18
+ private stageMutator?;
19
+ get eventBus(): EventBus;
20
+ get eventSystem(): EventSystem;
21
+ constructor(runner: PipelineRunner, registry: ToolRegistry, contextBuilder?: ContextBuilder);
22
+ loadPlugin(filePath: string): Promise<void>;
23
+ initializePlugin(factory: PluginFactory): void;
24
+ loadPluginsFromConfig(config: {
25
+ plugins?: Array<{
26
+ path: string;
27
+ }>;
28
+ }): Promise<void>;
29
+ getCommand(name: string): ((args: string) => Promise<void>) | undefined;
30
+ getErrors(): Array<{
31
+ source: string;
32
+ error: Error;
33
+ }>;
34
+ setStageMutator(mutator: (mutation: StageMutation) => void): void;
35
+ freezeHarnessInstances(): void;
36
+ emitEvent(eventType: EventType, ...args: unknown[]): void;
37
+ initializeAll(): Promise<void>;
38
+ private _shutdown;
39
+ shutdown(): Promise<void>;
40
+ private createHarnessAPI;
41
+ }
42
+ //# sourceMappingURL=plugin-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-manager.d.ts","sourceRoot":"","sources":["../src/plugin-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,UAAU,EACV,kBAAkB,EAClB,aAAa,EACd,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGhD,MAAM,MAAM,aAAa,GAAG,CAAC,GAAG,EAAE,UAAU,KAAK,kBAAkB,GAAG,IAAI,CAAC;AAe3E,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,QAAQ,CAAe;IAC/B,OAAO,CAAC,cAAc,CAAC,CAAiB;IACxC,OAAO,CAAC,YAAY,CAAqB;IACzC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,OAAO,CAAC,iBAAiB,CAAwB;IACjD,OAAO,CAAC,iBAAiB,CAA8B;IACvD,OAAO,CAAC,MAAM,CAA+C;IAC7D,OAAO,CAAC,YAAY,CAAC,CAAoC;IAEzD,IAAI,QAAQ,IAAI,QAAQ,CAEvB;IAED,IAAI,WAAW,IAAI,WAAW,CAE7B;gBAEW,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,YAAY,EAAE,cAAc,CAAC,EAAE,cAAc;IAQrF,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBjD,gBAAgB,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAKxC,qBAAqB,CAAC,MAAM,EAAE;QAAE,OAAO,CAAC,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAOzF,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,SAAS;IAQvE,SAAS,IAAI,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,KAAK,CAAA;KAAE,CAAC;IAIpD,eAAe,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,aAAa,KAAK,IAAI,GAAG,IAAI;IAIjE,sBAAsB,IAAI,IAAI;IAI9B,SAAS,CAAC,SAAS,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;IAInD,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAepC,OAAO,CAAC,SAAS,CAAS;IAEpB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAwB/B,OAAO,CAAC,gBAAgB;CAezB"}