@soleri/core 7.0.0 → 8.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 (294) hide show
  1. package/dist/agency/agency-manager.d.ts +27 -1
  2. package/dist/agency/agency-manager.d.ts.map +1 -1
  3. package/dist/agency/agency-manager.js +180 -9
  4. package/dist/agency/agency-manager.js.map +1 -1
  5. package/dist/agency/default-rules.d.ts +7 -0
  6. package/dist/agency/default-rules.d.ts.map +1 -0
  7. package/dist/agency/default-rules.js +79 -0
  8. package/dist/agency/default-rules.js.map +1 -0
  9. package/dist/agency/types.d.ts +48 -0
  10. package/dist/agency/types.d.ts.map +1 -1
  11. package/dist/brain/brain.d.ts +17 -2
  12. package/dist/brain/brain.d.ts.map +1 -1
  13. package/dist/brain/brain.js +118 -8
  14. package/dist/brain/brain.js.map +1 -1
  15. package/dist/brain/knowledge-synthesizer.d.ts +37 -0
  16. package/dist/brain/knowledge-synthesizer.d.ts.map +1 -0
  17. package/dist/brain/knowledge-synthesizer.js +159 -0
  18. package/dist/brain/knowledge-synthesizer.js.map +1 -0
  19. package/dist/brain/learning-radar.d.ts +96 -0
  20. package/dist/brain/learning-radar.d.ts.map +1 -0
  21. package/dist/brain/learning-radar.js +202 -0
  22. package/dist/brain/learning-radar.js.map +1 -0
  23. package/dist/brain/types.d.ts +15 -0
  24. package/dist/brain/types.d.ts.map +1 -1
  25. package/dist/context/context-engine.d.ts.map +1 -1
  26. package/dist/context/context-engine.js +82 -17
  27. package/dist/context/context-engine.js.map +1 -1
  28. package/dist/context/types.d.ts +5 -0
  29. package/dist/context/types.d.ts.map +1 -1
  30. package/dist/control/intent-router.d.ts +12 -1
  31. package/dist/control/intent-router.d.ts.map +1 -1
  32. package/dist/control/intent-router.js +68 -0
  33. package/dist/control/intent-router.js.map +1 -1
  34. package/dist/control/types.d.ts +17 -0
  35. package/dist/control/types.d.ts.map +1 -1
  36. package/dist/curator/classifier.d.ts +18 -0
  37. package/dist/curator/classifier.d.ts.map +1 -0
  38. package/dist/curator/classifier.js +59 -0
  39. package/dist/curator/classifier.js.map +1 -0
  40. package/dist/curator/quality-gate.d.ts +29 -0
  41. package/dist/curator/quality-gate.d.ts.map +1 -0
  42. package/dist/curator/quality-gate.js +86 -0
  43. package/dist/curator/quality-gate.js.map +1 -0
  44. package/dist/domain-packs/index.d.ts +0 -3
  45. package/dist/domain-packs/index.d.ts.map +1 -1
  46. package/dist/domain-packs/index.js +0 -3
  47. package/dist/domain-packs/index.js.map +1 -1
  48. package/dist/domain-packs/loader.d.ts.map +1 -1
  49. package/dist/domain-packs/loader.js +20 -4
  50. package/dist/domain-packs/loader.js.map +1 -1
  51. package/dist/domain-packs/pack-runtime.d.ts +5 -5
  52. package/dist/domain-packs/pack-runtime.d.ts.map +1 -1
  53. package/dist/domain-packs/pack-runtime.js +2 -2
  54. package/dist/domain-packs/pack-runtime.js.map +1 -1
  55. package/dist/domain-packs/types.d.ts +8 -2
  56. package/dist/domain-packs/types.d.ts.map +1 -1
  57. package/dist/domain-packs/types.js.map +1 -1
  58. package/dist/engine/bin/soleri-engine.js +13 -2
  59. package/dist/engine/bin/soleri-engine.js.map +1 -1
  60. package/dist/engine/index.d.ts +2 -0
  61. package/dist/engine/index.d.ts.map +1 -1
  62. package/dist/engine/index.js +1 -0
  63. package/dist/engine/index.js.map +1 -1
  64. package/dist/engine/module-manifest.d.ts +28 -0
  65. package/dist/engine/module-manifest.d.ts.map +1 -0
  66. package/dist/engine/module-manifest.js +85 -0
  67. package/dist/engine/module-manifest.js.map +1 -0
  68. package/dist/engine/register-engine.d.ts +19 -0
  69. package/dist/engine/register-engine.d.ts.map +1 -1
  70. package/dist/engine/register-engine.js +15 -2
  71. package/dist/engine/register-engine.js.map +1 -1
  72. package/dist/events/event-bus.d.ts +30 -0
  73. package/dist/events/event-bus.d.ts.map +1 -0
  74. package/dist/events/event-bus.js +51 -0
  75. package/dist/events/event-bus.js.map +1 -0
  76. package/dist/flows/chain-runner.d.ts +46 -0
  77. package/dist/flows/chain-runner.d.ts.map +1 -0
  78. package/dist/flows/chain-runner.js +271 -0
  79. package/dist/flows/chain-runner.js.map +1 -0
  80. package/dist/flows/chain-types.d.ts +103 -0
  81. package/dist/flows/chain-types.d.ts.map +1 -0
  82. package/dist/flows/chain-types.js +23 -0
  83. package/dist/flows/chain-types.js.map +1 -0
  84. package/dist/health/doctor-checks.d.ts +15 -0
  85. package/dist/health/doctor-checks.d.ts.map +1 -0
  86. package/dist/health/doctor-checks.js +98 -0
  87. package/dist/health/doctor-checks.js.map +1 -0
  88. package/dist/index.d.ts +0 -1
  89. package/dist/index.d.ts.map +1 -1
  90. package/dist/index.js +0 -1
  91. package/dist/index.js.map +1 -1
  92. package/dist/intake/content-classifier.d.ts.map +1 -1
  93. package/dist/intake/content-classifier.js +0 -2
  94. package/dist/intake/content-classifier.js.map +1 -1
  95. package/dist/intake/text-ingester.d.ts +52 -0
  96. package/dist/intake/text-ingester.d.ts.map +1 -0
  97. package/dist/intake/text-ingester.js +181 -0
  98. package/dist/intake/text-ingester.js.map +1 -0
  99. package/dist/llm/llm-client.d.ts.map +1 -1
  100. package/dist/llm/llm-client.js +45 -5
  101. package/dist/llm/llm-client.js.map +1 -1
  102. package/dist/llm/oauth-discovery.d.ts +18 -0
  103. package/dist/llm/oauth-discovery.d.ts.map +1 -0
  104. package/dist/llm/oauth-discovery.js +130 -0
  105. package/dist/llm/oauth-discovery.js.map +1 -0
  106. package/dist/llm/types.d.ts +4 -2
  107. package/dist/llm/types.d.ts.map +1 -1
  108. package/dist/packs/pack-installer.d.ts +2 -1
  109. package/dist/packs/pack-installer.d.ts.map +1 -1
  110. package/dist/packs/pack-installer.js +10 -1
  111. package/dist/packs/pack-installer.js.map +1 -1
  112. package/dist/persistence/index.d.ts +0 -1
  113. package/dist/persistence/index.d.ts.map +1 -1
  114. package/dist/persistence/index.js +0 -1
  115. package/dist/persistence/index.js.map +1 -1
  116. package/dist/persistence/types.d.ts +2 -6
  117. package/dist/persistence/types.d.ts.map +1 -1
  118. package/dist/planning/evidence-collector.d.ts +41 -0
  119. package/dist/planning/evidence-collector.d.ts.map +1 -0
  120. package/dist/planning/evidence-collector.js +194 -0
  121. package/dist/planning/evidence-collector.js.map +1 -0
  122. package/dist/planning/planner.d.ts +4 -0
  123. package/dist/planning/planner.d.ts.map +1 -1
  124. package/dist/planning/planner.js +11 -0
  125. package/dist/planning/planner.js.map +1 -1
  126. package/dist/plugins/index.d.ts +4 -0
  127. package/dist/plugins/index.d.ts.map +1 -1
  128. package/dist/plugins/index.js +4 -0
  129. package/dist/plugins/index.js.map +1 -1
  130. package/dist/plugins/plugin-registry.d.ts +4 -0
  131. package/dist/plugins/plugin-registry.d.ts.map +1 -1
  132. package/dist/plugins/plugin-registry.js +4 -0
  133. package/dist/plugins/plugin-registry.js.map +1 -1
  134. package/dist/plugins/types.d.ts +32 -27
  135. package/dist/plugins/types.d.ts.map +1 -1
  136. package/dist/plugins/types.js +6 -3
  137. package/dist/plugins/types.js.map +1 -1
  138. package/dist/queue/job-queue.d.ts +92 -0
  139. package/dist/queue/job-queue.d.ts.map +1 -0
  140. package/dist/queue/job-queue.js +180 -0
  141. package/dist/queue/job-queue.js.map +1 -0
  142. package/dist/queue/pipeline-runner.d.ts +62 -0
  143. package/dist/queue/pipeline-runner.d.ts.map +1 -0
  144. package/dist/queue/pipeline-runner.js +126 -0
  145. package/dist/queue/pipeline-runner.js.map +1 -0
  146. package/dist/runtime/admin-setup-ops.d.ts +20 -0
  147. package/dist/runtime/admin-setup-ops.d.ts.map +1 -0
  148. package/dist/runtime/admin-setup-ops.js +583 -0
  149. package/dist/runtime/admin-setup-ops.js.map +1 -0
  150. package/dist/runtime/chain-ops.d.ts +9 -0
  151. package/dist/runtime/chain-ops.d.ts.map +1 -0
  152. package/dist/runtime/chain-ops.js +107 -0
  153. package/dist/runtime/chain-ops.js.map +1 -0
  154. package/dist/runtime/claude-md-helpers.d.ts +56 -0
  155. package/dist/runtime/claude-md-helpers.d.ts.map +1 -0
  156. package/dist/runtime/claude-md-helpers.js +160 -0
  157. package/dist/runtime/claude-md-helpers.js.map +1 -0
  158. package/dist/runtime/curator-extra-ops.d.ts +3 -2
  159. package/dist/runtime/curator-extra-ops.d.ts.map +1 -1
  160. package/dist/runtime/curator-extra-ops.js +81 -3
  161. package/dist/runtime/curator-extra-ops.js.map +1 -1
  162. package/dist/runtime/facades/admin-facade.d.ts.map +1 -1
  163. package/dist/runtime/facades/admin-facade.js +5 -2
  164. package/dist/runtime/facades/admin-facade.js.map +1 -1
  165. package/dist/runtime/facades/agency-facade.d.ts.map +1 -1
  166. package/dist/runtime/facades/agency-facade.js +64 -0
  167. package/dist/runtime/facades/agency-facade.js.map +1 -1
  168. package/dist/runtime/facades/brain-facade.d.ts.map +1 -1
  169. package/dist/runtime/facades/brain-facade.js +122 -1
  170. package/dist/runtime/facades/brain-facade.js.map +1 -1
  171. package/dist/runtime/facades/control-facade.d.ts.map +1 -1
  172. package/dist/runtime/facades/control-facade.js +42 -0
  173. package/dist/runtime/facades/control-facade.js.map +1 -1
  174. package/dist/runtime/facades/memory-facade.d.ts.map +1 -1
  175. package/dist/runtime/facades/memory-facade.js +20 -2
  176. package/dist/runtime/facades/memory-facade.js.map +1 -1
  177. package/dist/runtime/facades/plan-facade.d.ts.map +1 -1
  178. package/dist/runtime/facades/plan-facade.js +2 -0
  179. package/dist/runtime/facades/plan-facade.js.map +1 -1
  180. package/dist/runtime/facades/vault-facade.d.ts.map +1 -1
  181. package/dist/runtime/facades/vault-facade.js +25 -5
  182. package/dist/runtime/facades/vault-facade.js.map +1 -1
  183. package/dist/runtime/intake-ops.d.ts +7 -5
  184. package/dist/runtime/intake-ops.d.ts.map +1 -1
  185. package/dist/runtime/intake-ops.js +98 -5
  186. package/dist/runtime/intake-ops.js.map +1 -1
  187. package/dist/runtime/memory-extra-ops.d.ts +6 -3
  188. package/dist/runtime/memory-extra-ops.d.ts.map +1 -1
  189. package/dist/runtime/memory-extra-ops.js +292 -4
  190. package/dist/runtime/memory-extra-ops.js.map +1 -1
  191. package/dist/runtime/pack-ops.d.ts +3 -0
  192. package/dist/runtime/pack-ops.d.ts.map +1 -1
  193. package/dist/runtime/pack-ops.js +18 -1
  194. package/dist/runtime/pack-ops.js.map +1 -1
  195. package/dist/runtime/planning-extra-ops.d.ts.map +1 -1
  196. package/dist/runtime/planning-extra-ops.js +85 -0
  197. package/dist/runtime/planning-extra-ops.js.map +1 -1
  198. package/dist/runtime/playbook-ops.js +1 -1
  199. package/dist/runtime/playbook-ops.js.map +1 -1
  200. package/dist/runtime/plugin-ops.d.ts.map +1 -1
  201. package/dist/runtime/plugin-ops.js +3 -0
  202. package/dist/runtime/plugin-ops.js.map +1 -1
  203. package/dist/runtime/runtime.d.ts.map +1 -1
  204. package/dist/runtime/runtime.js +143 -2
  205. package/dist/runtime/runtime.js.map +1 -1
  206. package/dist/runtime/session-briefing.d.ts +23 -0
  207. package/dist/runtime/session-briefing.d.ts.map +1 -0
  208. package/dist/runtime/session-briefing.js +154 -0
  209. package/dist/runtime/session-briefing.js.map +1 -0
  210. package/dist/runtime/types.d.ts +23 -0
  211. package/dist/runtime/types.d.ts.map +1 -1
  212. package/dist/runtime/vault-linking-ops.d.ts.map +1 -1
  213. package/dist/runtime/vault-linking-ops.js +3 -7
  214. package/dist/runtime/vault-linking-ops.js.map +1 -1
  215. package/dist/vault/vault.d.ts +34 -0
  216. package/dist/vault/vault.d.ts.map +1 -1
  217. package/dist/vault/vault.js +89 -3
  218. package/dist/vault/vault.js.map +1 -1
  219. package/package.json +6 -4
  220. package/src/__tests__/admin-setup-ops.test.ts +355 -0
  221. package/src/__tests__/async-infrastructure.test.ts +307 -0
  222. package/src/__tests__/cognee-client-gaps.test.ts +6 -2
  223. package/src/__tests__/cognee-hybrid-search.test.ts +49 -35
  224. package/src/__tests__/cognee-sync-manager-deep.test.ts +89 -65
  225. package/src/__tests__/curator-extra-ops.test.ts +6 -2
  226. package/src/__tests__/curator-pipeline-e2e.test.ts +545 -0
  227. package/src/__tests__/memory-extra-ops.test.ts +2 -2
  228. package/src/__tests__/module-manifest-drift.test.ts +59 -0
  229. package/src/__tests__/planning-extra-ops.test.ts +2 -2
  230. package/src/__tests__/second-brain-features.test.ts +583 -0
  231. package/src/agency/agency-manager.ts +217 -9
  232. package/src/agency/default-rules.ts +83 -0
  233. package/src/agency/types.ts +61 -0
  234. package/src/brain/brain.ts +110 -8
  235. package/src/brain/knowledge-synthesizer.ts +216 -0
  236. package/src/brain/learning-radar.ts +340 -0
  237. package/src/brain/types.ts +16 -0
  238. package/src/context/context-engine.ts +114 -15
  239. package/src/context/types.ts +5 -0
  240. package/src/control/intent-router.ts +107 -0
  241. package/src/control/types.ts +10 -0
  242. package/src/curator/classifier.ts +86 -0
  243. package/src/curator/quality-gate.ts +127 -0
  244. package/src/domain-packs/index.ts +0 -6
  245. package/src/domain-packs/loader.ts +25 -5
  246. package/src/domain-packs/pack-runtime.ts +6 -6
  247. package/src/domain-packs/types.ts +8 -2
  248. package/src/engine/bin/soleri-engine.ts +18 -2
  249. package/src/engine/index.ts +2 -0
  250. package/src/engine/module-manifest.ts +99 -0
  251. package/src/engine/register-engine.ts +21 -2
  252. package/src/events/event-bus.ts +58 -0
  253. package/src/flows/chain-runner.ts +369 -0
  254. package/src/flows/chain-types.ts +57 -0
  255. package/src/index.ts +0 -1
  256. package/src/intake/content-classifier.ts +0 -2
  257. package/src/intake/text-ingester.ts +234 -0
  258. package/src/llm/llm-client.ts +50 -7
  259. package/src/llm/oauth-discovery.ts +151 -0
  260. package/src/llm/types.ts +4 -2
  261. package/src/packs/pack-installer.ts +16 -1
  262. package/src/persistence/index.ts +0 -1
  263. package/src/persistence/types.ts +2 -6
  264. package/src/planning/evidence-collector.ts +247 -0
  265. package/src/planning/planner.ts +11 -0
  266. package/src/plugins/index.ts +4 -0
  267. package/src/plugins/plugin-registry.ts +6 -1
  268. package/src/plugins/types.ts +10 -5
  269. package/src/queue/job-queue.ts +281 -0
  270. package/src/queue/pipeline-runner.ts +149 -0
  271. package/src/runtime/admin-setup-ops.ts +664 -0
  272. package/src/runtime/chain-ops.ts +121 -0
  273. package/src/runtime/claude-md-helpers.ts +218 -0
  274. package/src/runtime/curator-extra-ops.ts +86 -3
  275. package/src/runtime/facades/admin-facade.ts +5 -2
  276. package/src/runtime/facades/agency-facade.ts +68 -0
  277. package/src/runtime/facades/brain-facade.ts +142 -1
  278. package/src/runtime/facades/control-facade.ts +45 -0
  279. package/src/runtime/facades/memory-facade.ts +20 -2
  280. package/src/runtime/facades/plan-facade.ts +2 -0
  281. package/src/runtime/facades/vault-facade.ts +28 -5
  282. package/src/runtime/intake-ops.ts +107 -5
  283. package/src/runtime/memory-extra-ops.ts +312 -4
  284. package/src/runtime/pack-ops.ts +26 -1
  285. package/src/runtime/planning-extra-ops.ts +94 -0
  286. package/src/runtime/playbook-ops.ts +1 -1
  287. package/src/runtime/plugin-ops.ts +3 -0
  288. package/src/runtime/runtime.ts +138 -2
  289. package/src/runtime/session-briefing.ts +175 -0
  290. package/src/runtime/types.ts +23 -0
  291. package/src/runtime/vault-linking-ops.ts +3 -7
  292. package/src/vault/vault.ts +105 -4
  293. package/src/__tests__/postgres-provider.test.ts +0 -116
  294. package/src/persistence/postgres-provider.ts +0 -310
@@ -1,9 +1,12 @@
1
1
  /**
2
2
  * Plugin System — Types & Manifest Schema
3
3
  *
4
- * A plugin is a directory containing a `soleri-plugin.json` manifest
5
- * and optionally additional intelligence data. Plugins register
6
- * OpDefinition[] (facades) dynamically without re-scaffolding.
4
+ * @deprecated Prefer knowledge packs (`soleri-pack.json`) over plugins (`soleri-plugin.json`).
5
+ * Knowledge packs are a superset of plugins — they support facades, vault entries, skills,
6
+ * hooks, and capability declarations. Plugins only support facades and intelligence entries.
7
+ *
8
+ * This module is maintained for backwards compatibility. New extensions should use
9
+ * the pack system in `../packs/`. See docs/architecture/extension-tiers.md.
7
10
  */
8
11
  import { z } from 'zod';
9
12
  import type { FacadeConfig } from '../facades/types.js';
@@ -25,28 +28,28 @@ export declare const pluginManifestSchema: z.ZodObject<{
25
28
  description: z.ZodDefault<z.ZodOptional<z.ZodString>>;
26
29
  auth: z.ZodDefault<z.ZodOptional<z.ZodEnum<["read", "write", "admin"]>>>;
27
30
  }, "strip", z.ZodTypeAny, {
28
- name: string;
29
31
  description: string;
30
- auth: "write" | "read" | "admin";
32
+ name: string;
33
+ auth: "read" | "write" | "admin";
31
34
  }, {
32
35
  name: string;
33
36
  description?: string | undefined;
34
- auth?: "write" | "read" | "admin" | undefined;
37
+ auth?: "read" | "write" | "admin" | undefined;
35
38
  }>, "many">;
36
39
  }, "strip", z.ZodTypeAny, {
37
- name: string;
38
40
  description: string;
41
+ name: string;
39
42
  ops: {
40
- name: string;
41
43
  description: string;
42
- auth: "write" | "read" | "admin";
44
+ name: string;
45
+ auth: "read" | "write" | "admin";
43
46
  }[];
44
47
  }, {
45
48
  name: string;
46
49
  ops: {
47
50
  name: string;
48
51
  description?: string | undefined;
49
- auth?: "write" | "read" | "admin" | undefined;
52
+ auth?: "read" | "write" | "admin" | undefined;
50
53
  }[];
51
54
  description?: string | undefined;
52
55
  }>, "many">>>;
@@ -60,43 +63,43 @@ export declare const pluginManifestSchema: z.ZodObject<{
60
63
  description: z.ZodString;
61
64
  tags: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString, "many">>>;
62
65
  }, "strip", z.ZodTypeAny, {
63
- id: string;
64
66
  type: string;
65
- description: string;
66
- title: string;
67
67
  tags: string[];
68
+ title: string;
69
+ description: string;
70
+ id: string;
68
71
  domain?: string | undefined;
69
72
  severity?: "critical" | "warning" | "suggestion" | undefined;
70
73
  }, {
71
- id: string;
72
74
  type: string;
73
- description: string;
74
75
  title: string;
76
+ description: string;
77
+ id: string;
75
78
  domain?: string | undefined;
76
79
  severity?: "critical" | "warning" | "suggestion" | undefined;
77
80
  tags?: string[] | undefined;
78
81
  }>, "many">>>;
79
82
  }, "strip", z.ZodTypeAny, {
83
+ description: string;
80
84
  id: string;
81
85
  name: string;
82
- description: string;
83
86
  version: string;
84
87
  dependencies: string[];
85
88
  facades: {
86
- name: string;
87
89
  description: string;
90
+ name: string;
88
91
  ops: {
89
- name: string;
90
92
  description: string;
91
- auth: "write" | "read" | "admin";
93
+ name: string;
94
+ auth: "read" | "write" | "admin";
92
95
  }[];
93
96
  }[];
94
97
  intelligence: {
95
- id: string;
96
98
  type: string;
97
- description: string;
98
- title: string;
99
99
  tags: string[];
100
+ title: string;
101
+ description: string;
102
+ id: string;
100
103
  domain?: string | undefined;
101
104
  severity?: "critical" | "warning" | "suggestion" | undefined;
102
105
  }[];
@@ -105,23 +108,23 @@ export declare const pluginManifestSchema: z.ZodObject<{
105
108
  id: string;
106
109
  name: string;
107
110
  version: string;
108
- description?: string | undefined;
109
111
  domain?: string | undefined;
112
+ description?: string | undefined;
110
113
  dependencies?: string[] | undefined;
111
114
  facades?: {
112
115
  name: string;
113
116
  ops: {
114
117
  name: string;
115
118
  description?: string | undefined;
116
- auth?: "write" | "read" | "admin" | undefined;
119
+ auth?: "read" | "write" | "admin" | undefined;
117
120
  }[];
118
121
  description?: string | undefined;
119
122
  }[] | undefined;
120
123
  intelligence?: {
121
- id: string;
122
124
  type: string;
123
- description: string;
124
125
  title: string;
126
+ description: string;
127
+ id: string;
125
128
  domain?: string | undefined;
126
129
  severity?: "critical" | "warning" | "suggestion" | undefined;
127
130
  tags?: string[] | undefined;
@@ -163,7 +166,9 @@ export type PluginFacadeBuilder = (ctx: PluginContext) => FacadeConfig[];
163
166
  * Context passed to plugin facade builders during activation.
164
167
  */
165
168
  export interface PluginContext {
166
- /** The agent runtime — full access to vault, brain, planner, etc. */
169
+ /** Narrowed runtime — vault, projects, session checks. Preferred over full runtime. */
170
+ packRuntime: import('../domain-packs/pack-runtime.js').PackRuntime;
171
+ /** @deprecated Full agent runtime. Use packRuntime instead — only vault, projects, and session checks are guaranteed. */
167
172
  runtime: unknown;
168
173
  /** The plugin's own manifest */
169
174
  manifest: PluginManifest;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/plugins/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAMxD,eAAO,MAAM,oBAAoB;;;;;IAK/B,oDAAoD;;IAEpD,+DAA+D;;IAE/D,oDAAoD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAiBpD,kDAAkD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAelD,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAMlE,MAAM,MAAM,YAAY,GAAG,YAAY,GAAG,QAAQ,GAAG,OAAO,GAAG,aAAa,CAAC;AAC7E,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;AAE/D;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,cAAc,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,gBAAgB,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,cAAc,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,gBAAgB,CAAC;IAC7B,MAAM,EAAE,YAAY,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;;;GAKG;AACH,MAAM,MAAM,mBAAmB,GAAG,CAAC,GAAG,EAAE,aAAa,KAAK,YAAY,EAAE,CAAC;AAEzE;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,qEAAqE;IACrE,OAAO,EAAE,OAAO,CAAC;IACjB,gCAAgC;IAChC,QAAQ,EAAE,cAAc,CAAC;IACzB,qCAAqC;IACrC,SAAS,EAAE,MAAM,CAAC;CACnB;AAMD,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,MAAM,EAAE,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACrD"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/plugins/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAMxD,eAAO,MAAM,oBAAoB;;;;;IAK/B,oDAAoD;;IAEpD,+DAA+D;;IAE/D,oDAAoD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAiBpD,kDAAkD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAelD,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAMlE,MAAM,MAAM,YAAY,GAAG,YAAY,GAAG,QAAQ,GAAG,OAAO,GAAG,aAAa,CAAC;AAC7E,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;AAE/D;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,cAAc,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,gBAAgB,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,cAAc,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,gBAAgB,CAAC;IAC7B,MAAM,EAAE,YAAY,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;;;GAKG;AACH,MAAM,MAAM,mBAAmB,GAAG,CAAC,GAAG,EAAE,aAAa,KAAK,YAAY,EAAE,CAAC;AAEzE;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,uFAAuF;IACvF,WAAW,EAAE,OAAO,iCAAiC,EAAE,WAAW,CAAC;IACnE,yHAAyH;IACzH,OAAO,EAAE,OAAO,CAAC;IACjB,gCAAgC;IAChC,QAAQ,EAAE,cAAc,CAAC;IACzB,qCAAqC;IACrC,SAAS,EAAE,MAAM,CAAC;CACnB;AAMD,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,MAAM,EAAE,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACrD"}
@@ -1,9 +1,12 @@
1
1
  /**
2
2
  * Plugin System — Types & Manifest Schema
3
3
  *
4
- * A plugin is a directory containing a `soleri-plugin.json` manifest
5
- * and optionally additional intelligence data. Plugins register
6
- * OpDefinition[] (facades) dynamically without re-scaffolding.
4
+ * @deprecated Prefer knowledge packs (`soleri-pack.json`) over plugins (`soleri-plugin.json`).
5
+ * Knowledge packs are a superset of plugins — they support facades, vault entries, skills,
6
+ * hooks, and capability declarations. Plugins only support facades and intelligence entries.
7
+ *
8
+ * This module is maintained for backwards compatibility. New extensions should use
9
+ * the pack system in `../packs/`. See docs/architecture/extension-tiers.md.
7
10
  */
8
11
  import { z } from 'zod';
9
12
  // =============================================================================
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/plugins/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,gFAAgF;AAChF,2CAA2C;AAC3C,gFAAgF;AAEhF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,cAAc,EAAE,uDAAuD,CAAC;IAC7F,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,iBAAiB,EAAE,gCAAgC,CAAC;IAC9E,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IAC9C,oDAAoD;IACpD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,+DAA+D;IAC/D,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IACxD,oDAAoD;IACpD,OAAO,EAAE,CAAC;SACP,KAAK,CACJ,CAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;QAChB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9C,GAAG,EAAE,CAAC,CAAC,KAAK,CACV,CAAC,CAAC,MAAM,CAAC;YACP,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;YAChB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9C,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;SACpE,CAAC,CACH;KACF,CAAC,CACH;SACA,QAAQ,EAAE;SACV,OAAO,CAAC,EAAE,CAAC;IACd,kDAAkD;IAClD,YAAY,EAAE,CAAC;SACZ,KAAK,CACJ,CAAC,CAAC,MAAM,CAAC;QACP,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;QACd,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;QAChB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC7B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;QACjB,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC,QAAQ,EAAE;QAClE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;QACvB,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;KACjD,CAAC,CACH;SACA,QAAQ,EAAE;SACV,OAAO,CAAC,EAAE,CAAC;CACf,CAAC,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/plugins/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,gFAAgF;AAChF,2CAA2C;AAC3C,gFAAgF;AAEhF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,cAAc,EAAE,uDAAuD,CAAC;IAC7F,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,iBAAiB,EAAE,gCAAgC,CAAC;IAC9E,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IAC9C,oDAAoD;IACpD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,+DAA+D;IAC/D,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IACxD,oDAAoD;IACpD,OAAO,EAAE,CAAC;SACP,KAAK,CACJ,CAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;QAChB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9C,GAAG,EAAE,CAAC,CAAC,KAAK,CACV,CAAC,CAAC,MAAM,CAAC;YACP,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;YAChB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9C,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;SACpE,CAAC,CACH;KACF,CAAC,CACH;SACA,QAAQ,EAAE;SACV,OAAO,CAAC,EAAE,CAAC;IACd,kDAAkD;IAClD,YAAY,EAAE,CAAC;SACZ,KAAK,CACJ,CAAC,CAAC,MAAM,CAAC;QACP,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;QACd,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;QAChB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC7B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;QACjB,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC,QAAQ,EAAE;QAClE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;QACvB,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;KACjD,CAAC,CACH;SACA,QAAQ,EAAE;SACV,OAAO,CAAC,EAAE,CAAC;CACf,CAAC,CAAC"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Job Queue — SQLite-backed FIFO queue with DAG dependencies and retries.
3
+ *
4
+ * Generic infrastructure — not curator-specific. Reusable by agency, intake, etc.
5
+ *
6
+ * Features:
7
+ * - Persistent jobs (survive process restarts)
8
+ * - DAG dependency resolution (job B waits for job A)
9
+ * - Pipeline grouping (group related jobs under one ID)
10
+ * - Configurable retries with max limit
11
+ * - Status tracking: pending → running → completed | failed
12
+ */
13
+ import type { PersistenceProvider } from '../persistence/types.js';
14
+ export type JobStatus = 'pending' | 'running' | 'completed' | 'failed';
15
+ export interface Job {
16
+ id: string;
17
+ type: string;
18
+ status: JobStatus;
19
+ entryId: string | null;
20
+ payload: Record<string, unknown>;
21
+ dependsOn: string[];
22
+ pipelineId: string | null;
23
+ retryCount: number;
24
+ maxRetries: number;
25
+ result: unknown | null;
26
+ error: string | null;
27
+ createdAt: string;
28
+ startedAt: string | null;
29
+ completedAt: string | null;
30
+ }
31
+ export interface JobQueueStats {
32
+ pending: number;
33
+ running: number;
34
+ completed: number;
35
+ failed: number;
36
+ total: number;
37
+ }
38
+ export interface EnqueueOptions {
39
+ entryId?: string;
40
+ payload?: Record<string, unknown>;
41
+ dependsOn?: string[];
42
+ pipelineId?: string;
43
+ maxRetries?: number;
44
+ }
45
+ export declare class JobQueue {
46
+ private provider;
47
+ constructor(provider: PersistenceProvider);
48
+ private initializeTable;
49
+ /**
50
+ * Enqueue a new job. Returns the job ID.
51
+ */
52
+ enqueue(type: string, options?: EnqueueOptions): string;
53
+ /**
54
+ * Dequeue the oldest pending job with all dependencies completed.
55
+ * Marks it as running. Returns null if no ready jobs.
56
+ */
57
+ dequeue(): Job | null;
58
+ /**
59
+ * Dequeue up to `limit` pending jobs whose dependencies are all completed.
60
+ */
61
+ dequeueReady(limit?: number): Job[];
62
+ /**
63
+ * Mark a job as completed with an optional result.
64
+ */
65
+ complete(jobId: string, result?: unknown): void;
66
+ /**
67
+ * Mark a job as failed with an error message.
68
+ */
69
+ fail(jobId: string, error: string): void;
70
+ /**
71
+ * Retry a failed job (resets to pending). Returns false if max retries exceeded.
72
+ */
73
+ retry(jobId: string): boolean;
74
+ /**
75
+ * Get queue statistics.
76
+ */
77
+ getStats(): JobQueueStats;
78
+ /**
79
+ * Get all jobs for a pipeline.
80
+ */
81
+ getByPipeline(pipelineId: string): Job[];
82
+ /**
83
+ * Get a single job by ID.
84
+ */
85
+ get(jobId: string): Job | null;
86
+ /**
87
+ * Purge completed/failed jobs older than N days.
88
+ */
89
+ purge(olderThanDays?: number): number;
90
+ private allDepsCompleted;
91
+ }
92
+ //# sourceMappingURL=job-queue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"job-queue.d.ts","sourceRoot":"","sources":["../../src/queue/job-queue.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAInE,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;AAEvE,MAAM,WAAW,GAAG;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,CAAC;IAClB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;IACvB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAID,qBAAa,QAAQ;IACnB,OAAO,CAAC,QAAQ,CAAsB;gBAE1B,QAAQ,EAAE,mBAAmB;IAKzC,OAAO,CAAC,eAAe;IAwBvB;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,MAAM;IAkBvD;;;OAGG;IACH,OAAO,IAAI,GAAG,GAAG,IAAI;IAKrB;;OAEG;IACH,YAAY,CAAC,KAAK,GAAE,MAAW,GAAG,GAAG,EAAE;IAuBvC;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,IAAI;IAO/C;;OAEG;IACH,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAOxC;;OAEG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAY7B;;OAEG;IACH,QAAQ,IAAI,aAAa;IAmBzB;;OAEG;IACH,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,GAAG,EAAE;IAQxC;;OAEG;IACH,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,GAAG,IAAI;IAK9B;;OAEG;IACH,KAAK,CAAC,aAAa,GAAE,MAAW,GAAG,MAAM;IAUzC,OAAO,CAAC,gBAAgB;CAUzB"}
@@ -0,0 +1,180 @@
1
+ /**
2
+ * Job Queue — SQLite-backed FIFO queue with DAG dependencies and retries.
3
+ *
4
+ * Generic infrastructure — not curator-specific. Reusable by agency, intake, etc.
5
+ *
6
+ * Features:
7
+ * - Persistent jobs (survive process restarts)
8
+ * - DAG dependency resolution (job B waits for job A)
9
+ * - Pipeline grouping (group related jobs under one ID)
10
+ * - Configurable retries with max limit
11
+ * - Status tracking: pending → running → completed | failed
12
+ */
13
+ import { randomUUID } from 'node:crypto';
14
+ // ─── Class ───────────────────────────────────────────────────────────
15
+ export class JobQueue {
16
+ provider;
17
+ constructor(provider) {
18
+ this.provider = provider;
19
+ this.initializeTable();
20
+ }
21
+ initializeTable() {
22
+ this.provider.execSql(`
23
+ CREATE TABLE IF NOT EXISTS job_queue (
24
+ id TEXT PRIMARY KEY,
25
+ type TEXT NOT NULL,
26
+ status TEXT NOT NULL DEFAULT 'pending',
27
+ entry_id TEXT,
28
+ payload TEXT DEFAULT '{}',
29
+ depends_on TEXT DEFAULT '[]',
30
+ pipeline_id TEXT,
31
+ retry_count INTEGER DEFAULT 0,
32
+ max_retries INTEGER DEFAULT 3,
33
+ result TEXT,
34
+ error TEXT,
35
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
36
+ started_at TEXT,
37
+ completed_at TEXT
38
+ );
39
+
40
+ CREATE INDEX IF NOT EXISTS idx_job_queue_status ON job_queue(status);
41
+ CREATE INDEX IF NOT EXISTS idx_job_queue_pipeline ON job_queue(pipeline_id);
42
+ `);
43
+ }
44
+ /**
45
+ * Enqueue a new job. Returns the job ID.
46
+ */
47
+ enqueue(type, options) {
48
+ const id = randomUUID().slice(0, 12);
49
+ this.provider.run(`INSERT INTO job_queue (id, type, entry_id, payload, depends_on, pipeline_id, max_retries)
50
+ VALUES (?, ?, ?, ?, ?, ?, ?)`, [
51
+ id,
52
+ type,
53
+ options?.entryId ?? null,
54
+ JSON.stringify(options?.payload ?? {}),
55
+ JSON.stringify(options?.dependsOn ?? []),
56
+ options?.pipelineId ?? null,
57
+ options?.maxRetries ?? 3,
58
+ ]);
59
+ return id;
60
+ }
61
+ /**
62
+ * Dequeue the oldest pending job with all dependencies completed.
63
+ * Marks it as running. Returns null if no ready jobs.
64
+ */
65
+ dequeue() {
66
+ const ready = this.dequeueReady(1);
67
+ return ready.length > 0 ? ready[0] : null;
68
+ }
69
+ /**
70
+ * Dequeue up to `limit` pending jobs whose dependencies are all completed.
71
+ */
72
+ dequeueReady(limit = 10) {
73
+ const rows = this.provider.all("SELECT * FROM job_queue WHERE status = 'pending' ORDER BY created_at ASC LIMIT ?", [limit * 3]);
74
+ const ready = [];
75
+ for (const row of rows) {
76
+ if (ready.length >= limit)
77
+ break;
78
+ const deps = JSON.parse(row.depends_on);
79
+ if (deps.length === 0 || this.allDepsCompleted(deps)) {
80
+ this.provider.run("UPDATE job_queue SET status = 'running', started_at = datetime('now') WHERE id = ?", [row.id]);
81
+ const job = rowToJob(row);
82
+ job.status = 'running';
83
+ ready.push(job);
84
+ }
85
+ }
86
+ return ready;
87
+ }
88
+ /**
89
+ * Mark a job as completed with an optional result.
90
+ */
91
+ complete(jobId, result) {
92
+ this.provider.run("UPDATE job_queue SET status = 'completed', completed_at = datetime('now'), result = ? WHERE id = ?", [result !== undefined ? JSON.stringify(result) : null, jobId]);
93
+ }
94
+ /**
95
+ * Mark a job as failed with an error message.
96
+ */
97
+ fail(jobId, error) {
98
+ this.provider.run("UPDATE job_queue SET status = 'failed', completed_at = datetime('now'), error = ? WHERE id = ?", [error, jobId]);
99
+ }
100
+ /**
101
+ * Retry a failed job (resets to pending). Returns false if max retries exceeded.
102
+ */
103
+ retry(jobId) {
104
+ const row = this.provider.get('SELECT * FROM job_queue WHERE id = ?', [jobId]);
105
+ if (!row)
106
+ return false;
107
+ if (row.retry_count >= row.max_retries)
108
+ return false;
109
+ this.provider.run("UPDATE job_queue SET status = 'pending', retry_count = retry_count + 1, error = NULL, started_at = NULL, completed_at = NULL WHERE id = ?", [jobId]);
110
+ return true;
111
+ }
112
+ /**
113
+ * Get queue statistics.
114
+ */
115
+ getStats() {
116
+ const rows = this.provider.all('SELECT status, COUNT(*) as count FROM job_queue GROUP BY status');
117
+ const byStatus = {};
118
+ let total = 0;
119
+ for (const row of rows) {
120
+ byStatus[row.status] = row.count;
121
+ total += row.count;
122
+ }
123
+ return {
124
+ pending: byStatus['pending'] ?? 0,
125
+ running: byStatus['running'] ?? 0,
126
+ completed: byStatus['completed'] ?? 0,
127
+ failed: byStatus['failed'] ?? 0,
128
+ total,
129
+ };
130
+ }
131
+ /**
132
+ * Get all jobs for a pipeline.
133
+ */
134
+ getByPipeline(pipelineId) {
135
+ const rows = this.provider.all('SELECT * FROM job_queue WHERE pipeline_id = ? ORDER BY created_at ASC', [pipelineId]);
136
+ return rows.map(rowToJob);
137
+ }
138
+ /**
139
+ * Get a single job by ID.
140
+ */
141
+ get(jobId) {
142
+ const row = this.provider.get('SELECT * FROM job_queue WHERE id = ?', [jobId]);
143
+ return row ? rowToJob(row) : null;
144
+ }
145
+ /**
146
+ * Purge completed/failed jobs older than N days.
147
+ */
148
+ purge(olderThanDays = 30) {
149
+ const result = this.provider.run("DELETE FROM job_queue WHERE status IN ('completed', 'failed') AND completed_at < datetime('now', ?)", [`-${olderThanDays} days`]);
150
+ return result.changes;
151
+ }
152
+ // ─── Internal ──────────────────────────────────────────────────────
153
+ allDepsCompleted(deps) {
154
+ for (const depId of deps) {
155
+ const row = this.provider.get('SELECT status FROM job_queue WHERE id = ?', [depId]);
156
+ if (!row || row.status !== 'completed')
157
+ return false;
158
+ }
159
+ return true;
160
+ }
161
+ }
162
+ function rowToJob(row) {
163
+ return {
164
+ id: row.id,
165
+ type: row.type,
166
+ status: row.status,
167
+ entryId: row.entry_id,
168
+ payload: JSON.parse(row.payload),
169
+ dependsOn: JSON.parse(row.depends_on),
170
+ pipelineId: row.pipeline_id,
171
+ retryCount: row.retry_count,
172
+ maxRetries: row.max_retries,
173
+ result: row.result ? JSON.parse(row.result) : null,
174
+ error: row.error,
175
+ createdAt: row.created_at,
176
+ startedAt: row.started_at,
177
+ completedAt: row.completed_at,
178
+ };
179
+ }
180
+ //# sourceMappingURL=job-queue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"job-queue.js","sourceRoot":"","sources":["../../src/queue/job-queue.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Pipeline Runner — background polling loop for DAG job execution.
3
+ *
4
+ * Polls the job queue for ready jobs (dependencies completed),
5
+ * dispatches them to registered handlers, and marks them complete/failed.
6
+ *
7
+ * Generic — handlers are registered by type, any module can add its own.
8
+ */
9
+ import type { JobQueue, Job } from './job-queue.js';
10
+ export type JobHandler = (job: Job) => Promise<unknown>;
11
+ export interface PipelineRunnerStatus {
12
+ running: boolean;
13
+ pollIntervalMs: number;
14
+ tickCount: number;
15
+ jobsProcessed: number;
16
+ jobsFailed: number;
17
+ jobsRetried: number;
18
+ lastTickAt: string | null;
19
+ }
20
+ export declare class PipelineRunner {
21
+ private queue;
22
+ private handlers;
23
+ private pollIntervalMs;
24
+ private running;
25
+ private timer;
26
+ private tickCount;
27
+ private jobsProcessed;
28
+ private jobsFailed;
29
+ private jobsRetried;
30
+ private lastTickAt;
31
+ private processing;
32
+ constructor(queue: JobQueue, pollIntervalMs?: number);
33
+ /**
34
+ * Register a handler for a job type. When a job of this type is dequeued,
35
+ * the handler is called. Return value is stored as the job result.
36
+ */
37
+ registerHandler(type: string, handler: JobHandler): void;
38
+ /**
39
+ * Start background polling. Idempotent — calling start() twice is safe.
40
+ */
41
+ start(): void;
42
+ /**
43
+ * Stop background polling.
44
+ */
45
+ stop(): void;
46
+ /**
47
+ * Process one batch of ready jobs immediately (without waiting for poll).
48
+ * Useful for testing or manual triggering.
49
+ */
50
+ processOnce(batchSize?: number): Promise<number>;
51
+ /**
52
+ * Get runner status.
53
+ */
54
+ getStatus(): PipelineRunnerStatus;
55
+ /**
56
+ * Check if a handler is registered for a job type.
57
+ */
58
+ hasHandler(type: string): boolean;
59
+ private tick;
60
+ private processBatch;
61
+ }
62
+ //# sourceMappingURL=pipeline-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline-runner.d.ts","sourceRoot":"","sources":["../../src/queue/pipeline-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAIpD,MAAM,MAAM,UAAU,GAAG,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAExD,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAID,qBAAa,cAAc;IACzB,OAAO,CAAC,KAAK,CAAW;IACxB,OAAO,CAAC,QAAQ,CAAiC;IACjD,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,KAAK,CAA+C;IAC5D,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,UAAU,CAAS;gBAEf,KAAK,EAAE,QAAQ,EAAE,cAAc,GAAE,MAAa;IAK1D;;;OAGG;IACH,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,IAAI;IAIxD;;OAEG;IACH,KAAK,IAAI,IAAI;IAMb;;OAEG;IACH,IAAI,IAAI,IAAI;IAQZ;;;OAGG;IACG,WAAW,CAAC,SAAS,GAAE,MAAU,GAAG,OAAO,CAAC,MAAM,CAAC;IAIzD;;OAEG;IACH,SAAS,IAAI,oBAAoB;IAYjC;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAMjC,OAAO,CAAC,IAAI;YASE,YAAY;CAkC3B"}
@@ -0,0 +1,126 @@
1
+ /**
2
+ * Pipeline Runner — background polling loop for DAG job execution.
3
+ *
4
+ * Polls the job queue for ready jobs (dependencies completed),
5
+ * dispatches them to registered handlers, and marks them complete/failed.
6
+ *
7
+ * Generic — handlers are registered by type, any module can add its own.
8
+ */
9
+ // ─── Class ───────────────────────────────────────────────────────────
10
+ export class PipelineRunner {
11
+ queue;
12
+ handlers = new Map();
13
+ pollIntervalMs;
14
+ running = false;
15
+ timer = null;
16
+ tickCount = 0;
17
+ jobsProcessed = 0;
18
+ jobsFailed = 0;
19
+ jobsRetried = 0;
20
+ lastTickAt = null;
21
+ processing = false;
22
+ constructor(queue, pollIntervalMs = 5000) {
23
+ this.queue = queue;
24
+ this.pollIntervalMs = pollIntervalMs;
25
+ }
26
+ /**
27
+ * Register a handler for a job type. When a job of this type is dequeued,
28
+ * the handler is called. Return value is stored as the job result.
29
+ */
30
+ registerHandler(type, handler) {
31
+ this.handlers.set(type, handler);
32
+ }
33
+ /**
34
+ * Start background polling. Idempotent — calling start() twice is safe.
35
+ */
36
+ start() {
37
+ if (this.running)
38
+ return;
39
+ this.running = true;
40
+ this.timer = setInterval(() => this.tick(), this.pollIntervalMs);
41
+ }
42
+ /**
43
+ * Stop background polling.
44
+ */
45
+ stop() {
46
+ this.running = false;
47
+ if (this.timer) {
48
+ clearInterval(this.timer);
49
+ this.timer = null;
50
+ }
51
+ }
52
+ /**
53
+ * Process one batch of ready jobs immediately (without waiting for poll).
54
+ * Useful for testing or manual triggering.
55
+ */
56
+ async processOnce(batchSize = 5) {
57
+ return this.processBatch(batchSize);
58
+ }
59
+ /**
60
+ * Get runner status.
61
+ */
62
+ getStatus() {
63
+ return {
64
+ running: this.running,
65
+ pollIntervalMs: this.pollIntervalMs,
66
+ tickCount: this.tickCount,
67
+ jobsProcessed: this.jobsProcessed,
68
+ jobsFailed: this.jobsFailed,
69
+ jobsRetried: this.jobsRetried,
70
+ lastTickAt: this.lastTickAt,
71
+ };
72
+ }
73
+ /**
74
+ * Check if a handler is registered for a job type.
75
+ */
76
+ hasHandler(type) {
77
+ return this.handlers.has(type);
78
+ }
79
+ // ─── Internal ──────────────────────────────────────────────────────
80
+ tick() {
81
+ if (this.processing)
82
+ return; // Skip if previous tick still running
83
+ this.tickCount++;
84
+ this.lastTickAt = new Date().toISOString();
85
+ this.processBatch(5).catch(() => {
86
+ /* best-effort */
87
+ });
88
+ }
89
+ async processBatch(batchSize) {
90
+ this.processing = true;
91
+ let processed = 0;
92
+ try {
93
+ const jobs = this.queue.dequeueReady(batchSize);
94
+ for (const job of jobs) {
95
+ const handler = this.handlers.get(job.type);
96
+ if (!handler) {
97
+ this.queue.fail(job.id, `No handler registered for job type: ${job.type}`);
98
+ this.jobsFailed++;
99
+ continue;
100
+ }
101
+ try {
102
+ const result = await handler(job);
103
+ this.queue.complete(job.id, result);
104
+ this.jobsProcessed++;
105
+ processed++;
106
+ }
107
+ catch (err) {
108
+ const errorMsg = err instanceof Error ? err.message : String(err);
109
+ const retried = this.queue.retry(job.id);
110
+ if (retried) {
111
+ this.jobsRetried++;
112
+ }
113
+ else {
114
+ this.queue.fail(job.id, errorMsg);
115
+ this.jobsFailed++;
116
+ }
117
+ }
118
+ }
119
+ }
120
+ finally {
121
+ this.processing = false;
122
+ }
123
+ return processed;
124
+ }
125
+ }
126
+ //# sourceMappingURL=pipeline-runner.js.map