@jterrats/open-orchestra 1.0.16 → 1.0.18

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 (313) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/CLAUDE.md +25 -2
  3. package/README.md +32 -9
  4. package/dist/active-runtime-store.d.ts +18 -0
  5. package/dist/active-runtime-store.js +75 -0
  6. package/dist/active-runtime-store.js.map +1 -0
  7. package/dist/benchmark.js +65 -27
  8. package/dist/benchmark.js.map +1 -1
  9. package/dist/chat-api-errors.d.ts +7 -0
  10. package/dist/chat-api-errors.js +15 -0
  11. package/dist/chat-api-errors.js.map +1 -0
  12. package/dist/chat-api-message-persistence.d.ts +12 -0
  13. package/dist/chat-api-message-persistence.js +125 -0
  14. package/dist/chat-api-message-persistence.js.map +1 -0
  15. package/dist/chat-api-records.d.ts +35 -0
  16. package/dist/chat-api-records.js +94 -0
  17. package/dist/chat-api-records.js.map +1 -0
  18. package/dist/chat-api-service.d.ts +32 -0
  19. package/dist/chat-api-service.js +120 -0
  20. package/dist/chat-api-service.js.map +1 -0
  21. package/dist/chat-api-storage.d.ts +1 -0
  22. package/dist/chat-api-storage.js +14 -0
  23. package/dist/chat-api-storage.js.map +1 -0
  24. package/dist/chat-api-types.d.ts +81 -0
  25. package/dist/chat-api-types.js +2 -0
  26. package/dist/chat-api-types.js.map +1 -0
  27. package/dist/chat-compliance-service.d.ts +60 -0
  28. package/dist/chat-compliance-service.js +241 -0
  29. package/dist/chat-compliance-service.js.map +1 -0
  30. package/dist/chat-event-stream.d.ts +13 -0
  31. package/dist/chat-event-stream.js +124 -0
  32. package/dist/chat-event-stream.js.map +1 -0
  33. package/dist/chat-pagination.d.ts +6 -0
  34. package/dist/chat-pagination.js +64 -0
  35. package/dist/chat-pagination.js.map +1 -0
  36. package/dist/chat-storage-actor-validation.d.ts +4 -0
  37. package/dist/chat-storage-actor-validation.js +65 -0
  38. package/dist/chat-storage-actor-validation.js.map +1 -0
  39. package/dist/chat-storage-content-policy.d.ts +6 -0
  40. package/dist/chat-storage-content-policy.js +84 -0
  41. package/dist/chat-storage-content-policy.js.map +1 -0
  42. package/dist/chat-storage-errors.d.ts +20 -0
  43. package/dist/chat-storage-errors.js +17 -0
  44. package/dist/chat-storage-errors.js.map +1 -0
  45. package/dist/chat-storage-local-files.d.ts +17 -0
  46. package/dist/chat-storage-local-files.js +78 -0
  47. package/dist/chat-storage-local-files.js.map +1 -0
  48. package/dist/chat-storage-local-paths.d.ts +6 -0
  49. package/dist/chat-storage-local-paths.js +124 -0
  50. package/dist/chat-storage-local-paths.js.map +1 -0
  51. package/dist/chat-storage-local-projection.d.ts +10 -0
  52. package/dist/chat-storage-local-projection.js +55 -0
  53. package/dist/chat-storage-local-projection.js.map +1 -0
  54. package/dist/chat-storage-local-records.d.ts +13 -0
  55. package/dist/chat-storage-local-records.js +56 -0
  56. package/dist/chat-storage-local-records.js.map +1 -0
  57. package/dist/chat-storage-local.d.ts +6 -0
  58. package/dist/chat-storage-local.js +114 -0
  59. package/dist/chat-storage-local.js.map +1 -0
  60. package/dist/chat-storage-validation.d.ts +10 -0
  61. package/dist/chat-storage-validation.js +100 -0
  62. package/dist/chat-storage-validation.js.map +1 -0
  63. package/dist/chat-storage.d.ts +16 -0
  64. package/dist/chat-storage.js +4 -0
  65. package/dist/chat-storage.js.map +1 -0
  66. package/dist/chat-workflow-timeline.d.ts +17 -0
  67. package/dist/chat-workflow-timeline.js +210 -0
  68. package/dist/chat-workflow-timeline.js.map +1 -0
  69. package/dist/{workspace-claude-settings.d.ts → claude-settings.d.ts} +22 -3
  70. package/dist/{workspace-claude-settings.js → claude-settings.js} +28 -9
  71. package/dist/claude-settings.js.map +1 -0
  72. package/dist/command-init.d.ts +2 -0
  73. package/dist/command-init.js +150 -0
  74. package/dist/command-init.js.map +1 -0
  75. package/dist/command-manifest.js +1 -1
  76. package/dist/command-manifest.js.map +1 -1
  77. package/dist/commands.d.ts +1 -1
  78. package/dist/commands.js +1 -140
  79. package/dist/commands.js.map +1 -1
  80. package/dist/constants.d.ts +1 -0
  81. package/dist/constants.js +1 -0
  82. package/dist/constants.js.map +1 -1
  83. package/dist/context-runtime-preprocessor.d.ts +41 -0
  84. package/dist/context-runtime-preprocessor.js +199 -0
  85. package/dist/context-runtime-preprocessor.js.map +1 -0
  86. package/dist/cursor-settings.d.ts +25 -0
  87. package/dist/cursor-settings.js +72 -0
  88. package/dist/cursor-settings.js.map +1 -0
  89. package/dist/health-commands.js +43 -3
  90. package/dist/health-commands.js.map +1 -1
  91. package/dist/metrics-commands.js +3 -0
  92. package/dist/metrics-commands.js.map +1 -1
  93. package/dist/model-aliases.d.ts +5 -0
  94. package/dist/model-aliases.js +37 -0
  95. package/dist/model-aliases.js.map +1 -0
  96. package/dist/ollama-provider.js +25 -0
  97. package/dist/ollama-provider.js.map +1 -1
  98. package/dist/phase-playbooks.js +11 -0
  99. package/dist/phase-playbooks.js.map +1 -1
  100. package/dist/provider-agent-wrapper.js +14 -0
  101. package/dist/provider-agent-wrapper.js.map +1 -1
  102. package/dist/runtime-adapters.js +56 -0
  103. package/dist/runtime-adapters.js.map +1 -1
  104. package/dist/runtime-bootstrap.js +34 -11
  105. package/dist/runtime-bootstrap.js.map +1 -1
  106. package/dist/runtime-capacity-policy.d.ts +38 -0
  107. package/dist/runtime-capacity-policy.js +117 -0
  108. package/dist/runtime-capacity-policy.js.map +1 -0
  109. package/dist/runtime-capacity-scheduler-helpers.d.ts +40 -0
  110. package/dist/runtime-capacity-scheduler-helpers.js +111 -0
  111. package/dist/runtime-capacity-scheduler-helpers.js.map +1 -0
  112. package/dist/runtime-capacity-scheduler-state.d.ts +44 -0
  113. package/dist/runtime-capacity-scheduler-state.js +128 -0
  114. package/dist/runtime-capacity-scheduler-state.js.map +1 -0
  115. package/dist/runtime-capacity-scheduler.d.ts +34 -0
  116. package/dist/runtime-capacity-scheduler.js +193 -0
  117. package/dist/runtime-capacity-scheduler.js.map +1 -0
  118. package/dist/runtime-capacity-snapshot.d.ts +14 -0
  119. package/dist/runtime-capacity-snapshot.js +87 -0
  120. package/dist/runtime-capacity-snapshot.js.map +1 -0
  121. package/dist/runtime-child-prompt.d.ts +2 -1
  122. package/dist/runtime-child-prompt.js +12 -1
  123. package/dist/runtime-child-prompt.js.map +1 -1
  124. package/dist/runtime-claude-native-bridge.js +2 -1
  125. package/dist/runtime-claude-native-bridge.js.map +1 -1
  126. package/dist/runtime-commands.js +6 -0
  127. package/dist/runtime-commands.js.map +1 -1
  128. package/dist/runtime-context-manifest.d.ts +4 -1
  129. package/dist/runtime-context-manifest.js +59 -3
  130. package/dist/runtime-context-manifest.js.map +1 -1
  131. package/dist/runtime-execution-adapters.js +19 -0
  132. package/dist/runtime-execution-adapters.js.map +1 -1
  133. package/dist/runtime-execution-renderer.js +4 -0
  134. package/dist/runtime-execution-renderer.js.map +1 -1
  135. package/dist/runtime-execution.js +13 -82
  136. package/dist/runtime-execution.js.map +1 -1
  137. package/dist/runtime-hooks.d.ts +46 -0
  138. package/dist/runtime-hooks.js +95 -0
  139. package/dist/runtime-hooks.js.map +1 -0
  140. package/dist/runtime-lifecycle-watch.d.ts +5 -2
  141. package/dist/runtime-lifecycle-watch.js +19 -3
  142. package/dist/runtime-lifecycle-watch.js.map +1 -1
  143. package/dist/runtime-load-balancer.d.ts +12 -0
  144. package/dist/runtime-load-balancer.js +106 -0
  145. package/dist/runtime-load-balancer.js.map +1 -0
  146. package/dist/runtime-parent-actions.js +5 -0
  147. package/dist/runtime-parent-actions.js.map +1 -1
  148. package/dist/runtime-spawn-bridge.js +24 -0
  149. package/dist/runtime-spawn-bridge.js.map +1 -1
  150. package/dist/runtime-spawn-guidance.js +15 -46
  151. package/dist/runtime-spawn-guidance.js.map +1 -1
  152. package/dist/runtime-worker-registry.d.ts +19 -0
  153. package/dist/runtime-worker-registry.js +84 -0
  154. package/dist/runtime-worker-registry.js.map +1 -0
  155. package/dist/security/chat-guardrail-policy.d.ts +7 -0
  156. package/dist/security/chat-guardrail-policy.js +61 -0
  157. package/dist/security/chat-guardrail-policy.js.map +1 -0
  158. package/dist/security/chat-guardrail-types.d.ts +65 -0
  159. package/dist/security/chat-guardrail-types.js +2 -0
  160. package/dist/security/chat-guardrail-types.js.map +1 -0
  161. package/dist/security/chat-guardrail-validation.d.ts +9 -0
  162. package/dist/security/chat-guardrail-validation.js +64 -0
  163. package/dist/security/chat-guardrail-validation.js.map +1 -0
  164. package/dist/security/chat-guardrails.d.ts +3 -0
  165. package/dist/security/chat-guardrails.js +136 -0
  166. package/dist/security/chat-guardrails.js.map +1 -0
  167. package/dist/security/content-classifier.d.ts +2 -0
  168. package/dist/security/content-classifier.js +179 -0
  169. package/dist/security/content-classifier.js.map +1 -0
  170. package/dist/security/operation-contract-types.d.ts +28 -0
  171. package/dist/security/operation-contract-types.js +2 -0
  172. package/dist/security/operation-contract-types.js.map +1 -0
  173. package/dist/security/operation-contract.d.ts +2 -0
  174. package/dist/security/operation-contract.js +169 -0
  175. package/dist/security/operation-contract.js.map +1 -0
  176. package/dist/security/payment-card-detection.d.ts +3 -0
  177. package/dist/security/payment-card-detection.js +48 -0
  178. package/dist/security/payment-card-detection.js.map +1 -0
  179. package/dist/security/policy-engine.d.ts +2 -0
  180. package/dist/security/policy-engine.js +142 -0
  181. package/dist/security/policy-engine.js.map +1 -0
  182. package/dist/security/policy-types.d.ts +79 -0
  183. package/dist/security/policy-types.js +7 -0
  184. package/dist/security/policy-types.js.map +1 -0
  185. package/dist/security/prompt-intake.d.ts +13 -0
  186. package/dist/security/prompt-intake.js +33 -0
  187. package/dist/security/prompt-intake.js.map +1 -0
  188. package/dist/security/provider-egress-policy.d.ts +27 -0
  189. package/dist/security/provider-egress-policy.js +72 -0
  190. package/dist/security/provider-egress-policy.js.map +1 -0
  191. package/dist/security/public-api-auth.d.ts +20 -0
  192. package/dist/security/public-api-auth.js +55 -0
  193. package/dist/security/public-api-auth.js.map +1 -0
  194. package/dist/security/public-api-policy.d.ts +8 -0
  195. package/dist/security/public-api-policy.js +40 -0
  196. package/dist/security/public-api-policy.js.map +1 -0
  197. package/dist/security/redaction.d.ts +3 -0
  198. package/dist/security/redaction.js +95 -0
  199. package/dist/security/redaction.js.map +1 -0
  200. package/dist/security/restricted-content-quarantine.d.ts +17 -0
  201. package/dist/security/restricted-content-quarantine.js +50 -0
  202. package/dist/security/restricted-content-quarantine.js.map +1 -0
  203. package/dist/security/restricted-data-classifier.d.ts +9 -0
  204. package/dist/security/restricted-data-classifier.js +254 -0
  205. package/dist/security/restricted-data-classifier.js.map +1 -0
  206. package/dist/security/sink-encoding.d.ts +6 -0
  207. package/dist/security/sink-encoding.js +40 -0
  208. package/dist/security/sink-encoding.js.map +1 -0
  209. package/dist/skills-render.js +7 -14
  210. package/dist/skills-render.js.map +1 -1
  211. package/dist/sprint-commands.js +33 -22
  212. package/dist/sprint-commands.js.map +1 -1
  213. package/dist/telemetry-redaction.d.ts +2 -0
  214. package/dist/telemetry-redaction.js +25 -2
  215. package/dist/telemetry-redaction.js.map +1 -1
  216. package/dist/transcription-failures.d.ts +2 -0
  217. package/dist/transcription-failures.js +4 -0
  218. package/dist/transcription-failures.js.map +1 -0
  219. package/dist/transcription-media-preflight.d.ts +9 -0
  220. package/dist/transcription-media-preflight.js +147 -0
  221. package/dist/transcription-media-preflight.js.map +1 -0
  222. package/dist/transcription-request.d.ts +13 -0
  223. package/dist/transcription-request.js +150 -0
  224. package/dist/transcription-request.js.map +1 -0
  225. package/dist/transcription-source-policy.d.ts +4 -0
  226. package/dist/transcription-source-policy.js +43 -0
  227. package/dist/transcription-source-policy.js.map +1 -0
  228. package/dist/transcription-types.d.ts +161 -0
  229. package/dist/transcription-types.js +2 -0
  230. package/dist/transcription-types.js.map +1 -0
  231. package/dist/types/chat.d.ts +203 -0
  232. package/dist/types/chat.js +10 -0
  233. package/dist/types/chat.js.map +1 -0
  234. package/dist/types/model-config.d.ts +4 -0
  235. package/dist/types/public-api.d.ts +75 -0
  236. package/dist/types/public-api.js +2 -0
  237. package/dist/types/public-api.js.map +1 -0
  238. package/dist/types/restricted-data.d.ts +69 -0
  239. package/dist/types/restricted-data.js +8 -0
  240. package/dist/types/restricted-data.js.map +1 -0
  241. package/dist/types/restricted-fragment.d.ts +82 -0
  242. package/dist/types/restricted-fragment.js +14 -0
  243. package/dist/types/restricted-fragment.js.map +1 -0
  244. package/dist/types/runtime.d.ts +159 -0
  245. package/dist/types.d.ts +9 -1
  246. package/dist/types.js +1 -0
  247. package/dist/types.js.map +1 -1
  248. package/dist/web-api.js +24 -0
  249. package/dist/web-api.js.map +1 -1
  250. package/dist/web-artifact-parsers.d.ts +6 -0
  251. package/dist/web-artifact-parsers.js +244 -0
  252. package/dist/web-artifact-parsers.js.map +1 -0
  253. package/dist/web-artifact-types.d.ts +76 -0
  254. package/dist/web-artifact-types.js +2 -0
  255. package/dist/web-artifact-types.js.map +1 -0
  256. package/dist/web-artifacts.d.ts +2 -43
  257. package/dist/web-artifacts.js +73 -58
  258. package/dist/web-artifacts.js.map +1 -1
  259. package/dist/web-chat-route-inputs.d.ts +11 -0
  260. package/dist/web-chat-route-inputs.js +156 -0
  261. package/dist/web-chat-route-inputs.js.map +1 -0
  262. package/dist/web-chat-routes.d.ts +7 -0
  263. package/dist/web-chat-routes.js +213 -0
  264. package/dist/web-chat-routes.js.map +1 -0
  265. package/dist/web-console/assets/index-CJup1cIA.css +1 -0
  266. package/dist/web-console/assets/index-CVDOfipu.js +11 -0
  267. package/dist/web-console/index.html +2 -2
  268. package/dist/web-evidence.d.ts +1 -1
  269. package/dist/web-evidence.js +9 -2
  270. package/dist/web-evidence.js.map +1 -1
  271. package/dist/web-public-route-inputs.d.ts +14 -0
  272. package/dist/web-public-route-inputs.js +136 -0
  273. package/dist/web-public-route-inputs.js.map +1 -0
  274. package/dist/web-public-routes.d.ts +6 -0
  275. package/dist/web-public-routes.js +194 -0
  276. package/dist/web-public-routes.js.map +1 -0
  277. package/dist/web-public-service.d.ts +16 -0
  278. package/dist/web-public-service.js +154 -0
  279. package/dist/web-public-service.js.map +1 -0
  280. package/dist/workflow-phase-planner.js +5 -3
  281. package/dist/workflow-phase-planner.js.map +1 -1
  282. package/dist/workflow-phases.js +5 -0
  283. package/dist/workflow-phases.js.map +1 -1
  284. package/dist/workflow-run-commands.js +89 -10
  285. package/dist/workflow-run-commands.js.map +1 -1
  286. package/dist/workflow-services.js +5 -0
  287. package/dist/workflow-services.js.map +1 -1
  288. package/dist/workspace-runtime-bootstrap.js +15 -4
  289. package/dist/workspace-runtime-bootstrap.js.map +1 -1
  290. package/docs/audio-video-transcription-skill.md +102 -70
  291. package/docs/chat-audit-retention.md +76 -0
  292. package/docs/chat-provider-provenance-ledger.md +75 -0
  293. package/docs/context-runtime-preprocessing.md +37 -0
  294. package/docs/orchestra-mvp.md +8 -2
  295. package/docs/public-api-contract.md +43 -0
  296. package/docs/release-test-matrix.md +14 -14
  297. package/docs/restricted-fragment-storage-contract.md +147 -0
  298. package/docs/runtime-adapters.md +47 -7
  299. package/docs/runtime-capacity.md +57 -0
  300. package/docs/security-saas-orchestrator.md +368 -0
  301. package/docs/site-manifest.json +128 -30
  302. package/package.json +5 -2
  303. package/site/dist/_headers +9 -0
  304. package/site/dist/_redirects +2 -0
  305. package/site/dist/architecture.mmd +61 -0
  306. package/site/dist/assets/index-Bi8l6tCE.js +10 -0
  307. package/site/dist/assets/index-BsCLqY__.css +1 -0
  308. package/site/dist/favicon.svg +19 -0
  309. package/site/dist/index.html +28 -0
  310. package/site/package.json +19 -0
  311. package/dist/web-console/assets/index-BHs7OIv8.css +0 -1
  312. package/dist/web-console/assets/index-BJuVTqfQ.js +0 -11
  313. package/dist/workspace-claude-settings.js.map +0 -1
@@ -0,0 +1,125 @@
1
+ import { assertMatchingScope, ChatStorageError, CHAT_SCHEMA_VERSION, } from "./chat-storage.js";
2
+ import { ChatApiError } from "./chat-api-errors.js";
3
+ import { evaluateChatGuardrail } from "./security/chat-guardrails.js";
4
+ import { actorId, exportPolicy, hashBody, idempotentMessageId, notFound, provenance, referencesFor, requestIdFor, requireText, retention, } from "./chat-api-records.js";
5
+ export async function persistChatMessage(input) {
6
+ const requestId = requestIdFor(input.message.requestId);
7
+ const idempotencyKey = requireText(input.message.idempotencyKey, "idempotencyKey", requestId);
8
+ const thread = await input.storage.getThread(input.message.scope, input.message.threadId);
9
+ if (!thread)
10
+ throw notFound("thread_not_found", requestId);
11
+ assertMatchingScope(input.message.scope, thread.scope, "thread.scope");
12
+ const text = requireText(input.message.text, "text", requestId);
13
+ const bodyHash = hashBody(text);
14
+ const messageId = idempotentMessageId(input.message.scope, input.message.threadId, input.action, idempotencyKey);
15
+ const guardrail = evaluateChatGuardrail({
16
+ requestId,
17
+ tenantId: input.message.scope.tenantId,
18
+ workspaceId: input.message.scope.workspaceId,
19
+ taskId: input.message.scope.taskId,
20
+ runId: input.message.scope.runId,
21
+ threadId: input.message.threadId,
22
+ messageId,
23
+ actor: {
24
+ id: actorId(input.message.actor),
25
+ actorType: input.message.actor.kind === "human" ? "human" : "runtime",
26
+ tenantId: input.message.scope.tenantId,
27
+ workspaceId: input.message.scope.workspaceId,
28
+ },
29
+ action: input.action,
30
+ sink: { kind: "json" },
31
+ resource: {
32
+ resourceType: "message",
33
+ summary: "chat message",
34
+ tenantId: input.message.scope.tenantId,
35
+ workspaceId: input.message.scope.workspaceId,
36
+ },
37
+ segments: [
38
+ {
39
+ id: `${requestId}:message`,
40
+ kind: "instruction",
41
+ provenance: input.message.actor.kind,
42
+ text,
43
+ sink: "json",
44
+ },
45
+ ],
46
+ });
47
+ if (!guardrail.canProceed) {
48
+ throw new ChatApiError("policy_blocked", guardrail.sanitizedReasons[0] ?? "chat message blocked by policy", 403, requestId);
49
+ }
50
+ const existing = await findMessage(input.storage, input.message.scope, input.message.threadId, messageId);
51
+ if (existing) {
52
+ if (existing.provenance.sourceId !== bodyHash) {
53
+ throw new ChatApiError("idempotency_conflict", "idempotency key was already used with a different payload", 409, requestId);
54
+ }
55
+ return replay(existing, requestId, idempotencyKey, guardrail.requestId);
56
+ }
57
+ const message = await buildMessage(input, messageId, bodyHash, guardrail);
58
+ try {
59
+ return {
60
+ message: await input.storage.appendMessage(input.message.scope, message),
61
+ meta: {
62
+ requestId,
63
+ idempotencyKey,
64
+ policyDecisionId: guardrail.requestId,
65
+ },
66
+ };
67
+ }
68
+ catch (error) {
69
+ if (error instanceof ChatStorageError &&
70
+ error.code === "duplicate_record") {
71
+ const duplicate = await findMessage(input.storage, input.message.scope, input.message.threadId, messageId);
72
+ if (duplicate && duplicate.provenance.sourceId === bodyHash) {
73
+ return replay(duplicate, requestId, idempotencyKey, guardrail.requestId);
74
+ }
75
+ }
76
+ throw error;
77
+ }
78
+ }
79
+ async function buildMessage(input, messageId, bodyHash, guardrail) {
80
+ const allMessages = await input.storage.listMessages(input.message.scope, input.message.threadId);
81
+ const now = input.now();
82
+ return {
83
+ schemaVersion: CHAT_SCHEMA_VERSION,
84
+ id: messageId,
85
+ threadId: input.message.threadId,
86
+ scope: input.message.scope,
87
+ actor: input.message.actor,
88
+ provenance: provenance("user_input", bodyHash, now, guardrail.requestId),
89
+ createdAt: now,
90
+ sequence: allMessages.messages.length + 1,
91
+ content: {
92
+ format: input.message.format ?? "plain_text",
93
+ text: guardrail.redactedSegments[0]?.text ?? input.message.text,
94
+ },
95
+ contentState: "redacted",
96
+ retention: retention(now),
97
+ redaction: {
98
+ policyId: "chat-api-redaction",
99
+ status: "applied",
100
+ redactedAt: now,
101
+ redactedByActorId: "chat-api",
102
+ markerCount: Math.max(0, guardrail.redactedSegments.length),
103
+ summary: "Chat guardrail redaction applied before persistence.",
104
+ },
105
+ export: exportPolicy(now),
106
+ delete: { status: "active", policyId: "chat-delete-logical" },
107
+ references: referencesFor(input.message.scope),
108
+ };
109
+ }
110
+ async function findMessage(storage, scope, threadId, messageId) {
111
+ const messages = await storage.listMessages(scope, threadId);
112
+ return messages.messages.find((message) => message.id === messageId);
113
+ }
114
+ function replay(message, requestId, idempotencyKey, policyDecisionId) {
115
+ return {
116
+ message,
117
+ meta: {
118
+ requestId,
119
+ idempotencyKey,
120
+ idempotentReplay: true,
121
+ policyDecisionId,
122
+ },
123
+ };
124
+ }
125
+ //# sourceMappingURL=chat-api-message-persistence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-api-message-persistence.js","sourceRoot":"","sources":["../src/chat-api-message-persistence.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import { ChatApiError } from "./chat-api-errors.js";
2
+ import type { ChatApiMeta } from "./chat-api-types.js";
3
+ import type { ChatActor, ChatThread, ChatProvenance, ChatReference, ChatScope } from "./types/chat.js";
4
+ export declare function requestIdFor(requestId: string | undefined): string;
5
+ export declare function requireText(value: string | undefined, field: string, requestId: string): string;
6
+ export declare function notFound(code: string, requestId: string): ChatApiError;
7
+ export declare function hashBody(text: string): string;
8
+ export declare function idempotentMessageId(scope: ChatScope, threadId: string, action: string, idempotencyKey: string): string;
9
+ export declare function provenance(sourceKind: "user_input", sourceId: string, createdAt: string, policyDecisionId?: string): ChatProvenance;
10
+ export declare function retention(decidedAt: string): {
11
+ policyId: string;
12
+ status: "redacted_only";
13
+ rawPersistence: "forbidden";
14
+ decidedAt: string;
15
+ };
16
+ export declare function exportPolicy(decidedAt: string): {
17
+ status: "redacted_only";
18
+ rawContentExportable: boolean;
19
+ policyId: string;
20
+ decidedAt: string;
21
+ };
22
+ export declare function referencesFor(scope: ChatScope): ChatReference[];
23
+ export declare function actorId(actor: ChatActor): string;
24
+ export declare function listOptions(limit?: number, cursor?: string): {
25
+ cursor?: string;
26
+ limit?: number;
27
+ };
28
+ export declare function apiMeta(requestId: string, options?: Omit<ChatApiMeta, "requestId">): ChatApiMeta;
29
+ export declare function buildChatThread(input: {
30
+ scope: ChatScope;
31
+ title: string;
32
+ actor: ChatActor;
33
+ requestId: string;
34
+ now: string;
35
+ }): ChatThread;
@@ -0,0 +1,94 @@
1
+ import { createHash, randomUUID } from "node:crypto";
2
+ import { ChatApiError } from "./chat-api-errors.js";
3
+ import { CHAT_SCHEMA_VERSION } from "./chat-storage.js";
4
+ export function requestIdFor(requestId) {
5
+ return requestId?.trim() || `chat-${randomUUID()}`;
6
+ }
7
+ export function requireText(value, field, requestId) {
8
+ if (!value?.trim()) {
9
+ throw new ChatApiError("invalid_request", `${field} is required`, 400, requestId);
10
+ }
11
+ return value.trim();
12
+ }
13
+ export function notFound(code, requestId) {
14
+ return new ChatApiError(code, "chat resource was not found", 404, requestId);
15
+ }
16
+ export function hashBody(text) {
17
+ return createHash("sha256").update(text).digest("base64url");
18
+ }
19
+ export function idempotentMessageId(scope, threadId, action, idempotencyKey) {
20
+ return `message-${createHash("sha256")
21
+ .update([
22
+ scope.tenantId,
23
+ scope.workspaceId,
24
+ scope.taskId,
25
+ scope.runId,
26
+ scope.phase,
27
+ scope.sessionId,
28
+ threadId,
29
+ action,
30
+ idempotencyKey,
31
+ ].join("\u001f"))
32
+ .digest("base64url")
33
+ .slice(0, 24)}`;
34
+ }
35
+ export function provenance(sourceKind, sourceId, createdAt, policyDecisionId) {
36
+ return {
37
+ sourceKind,
38
+ sourceId,
39
+ createdAt,
40
+ observedAt: createdAt,
41
+ ...(policyDecisionId ? { policyDecisionId } : {}),
42
+ };
43
+ }
44
+ export function retention(decidedAt) {
45
+ return {
46
+ policyId: "chat-api-retain-redacted",
47
+ status: "redacted_only",
48
+ rawPersistence: "forbidden",
49
+ decidedAt,
50
+ };
51
+ }
52
+ export function exportPolicy(decidedAt) {
53
+ return {
54
+ status: "redacted_only",
55
+ rawContentExportable: false,
56
+ policyId: "chat-api-export-redacted",
57
+ decidedAt,
58
+ };
59
+ }
60
+ export function referencesFor(scope) {
61
+ return [
62
+ { kind: "task", id: scope.taskId },
63
+ { kind: "workflow_run", id: scope.runId },
64
+ ];
65
+ }
66
+ export function actorId(actor) {
67
+ return actor.actorId;
68
+ }
69
+ export function listOptions(limit, cursor) {
70
+ return {
71
+ ...(limit !== undefined ? { limit } : {}),
72
+ ...(cursor !== undefined ? { cursor } : {}),
73
+ };
74
+ }
75
+ export function apiMeta(requestId, options = {}) {
76
+ return { requestId, ...options };
77
+ }
78
+ export function buildChatThread(input) {
79
+ return {
80
+ schemaVersion: CHAT_SCHEMA_VERSION,
81
+ id: `thread-${randomUUID()}`,
82
+ scope: input.scope,
83
+ title: requireText(input.title, "title", input.requestId),
84
+ createdAt: input.now,
85
+ updatedAt: input.now,
86
+ actor: input.actor,
87
+ provenance: provenance("user_input", input.requestId, input.now),
88
+ retention: retention(input.now),
89
+ export: exportPolicy(input.now),
90
+ delete: { status: "active", policyId: "chat-delete-logical" },
91
+ contentState: "redacted",
92
+ };
93
+ }
94
+ //# sourceMappingURL=chat-api-records.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-api-records.js","sourceRoot":"","sources":["../src/chat-api-records.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import type { ChatStorage } from "./chat-storage.js";
2
+ export { ChatApiError } from "./chat-api-errors.js";
3
+ import type { ChatStreamEvent, ChatApiSuccess, ChatMessageInput, ChatMessagesInput, ChatSendInput, ChatSendResult, ChatThreadInput, CreateChatThreadInput, ListChatInput } from "./chat-api-types.js";
4
+ import type { ChatMessage, ChatThread } from "./types/chat.js";
5
+ export interface ChatApiServiceOptions {
6
+ storage: ChatStorage;
7
+ root?: string;
8
+ now?: () => string;
9
+ }
10
+ export declare class ChatApiService {
11
+ private readonly storage;
12
+ private readonly root;
13
+ private readonly now;
14
+ constructor(options: ChatApiServiceOptions);
15
+ createThread(input: CreateChatThreadInput): Promise<ChatApiSuccess<ChatThread>>;
16
+ listThreads(input: ListChatInput): Promise<ChatApiSuccess<{
17
+ threads: ChatThread[];
18
+ }>>;
19
+ getThread(input: ChatThreadInput): Promise<ChatApiSuccess<{
20
+ thread: ChatThread;
21
+ }>>;
22
+ listMessages(input: ChatMessagesInput): Promise<ChatApiSuccess<{
23
+ messages: ChatMessage[];
24
+ }>>;
25
+ createMessage(input: ChatMessageInput): Promise<ChatApiSuccess<ChatMessage>>;
26
+ send(input: ChatSendInput): Promise<ChatApiSuccess<ChatSendResult>>;
27
+ stream(input: ChatMessagesInput): Promise<ChatApiSuccess<{
28
+ events: ChatStreamEvent[];
29
+ }>>;
30
+ private persistMessage;
31
+ private listAllStoredMessages;
32
+ }
@@ -0,0 +1,120 @@
1
+ export { ChatApiError } from "./chat-api-errors.js";
2
+ import { eventsForStoredMessage } from "./chat-event-stream.js";
3
+ import { listWorkflowTimelineMessages, mergeTimelineMessages, } from "./chat-workflow-timeline.js";
4
+ import { apiMeta, buildChatThread, listOptions, notFound, requestIdFor, } from "./chat-api-records.js";
5
+ import { safeCursorList } from "./chat-api-storage.js";
6
+ import { persistChatMessage } from "./chat-api-message-persistence.js";
7
+ export class ChatApiService {
8
+ storage;
9
+ root;
10
+ now;
11
+ constructor(options) {
12
+ this.storage = options.storage;
13
+ this.root = options.root ?? process.cwd();
14
+ this.now = options.now ?? (() => new Date().toISOString());
15
+ }
16
+ async createThread(input) {
17
+ const requestId = requestIdFor(input.requestId);
18
+ const now = this.now();
19
+ const thread = buildChatThread({
20
+ scope: input.scope,
21
+ title: input.title,
22
+ actor: input.actor,
23
+ requestId,
24
+ now,
25
+ });
26
+ return {
27
+ data: await this.storage.createThread(input.scope, thread),
28
+ meta: { requestId },
29
+ };
30
+ }
31
+ async listThreads(input) {
32
+ const requestId = requestIdFor(input.requestId);
33
+ const result = await safeCursorList(() => this.storage.listThreads(input.scope, {
34
+ ...listOptions(input.limit, input.cursor),
35
+ }), requestId);
36
+ return {
37
+ data: { threads: result.threads },
38
+ meta: apiMeta(requestId, {
39
+ ...(result.nextCursor ? { nextCursor: result.nextCursor } : {}),
40
+ }),
41
+ };
42
+ }
43
+ async getThread(input) {
44
+ const requestId = requestIdFor(input.requestId);
45
+ const thread = await this.storage.getThread(input.scope, input.threadId);
46
+ if (!thread)
47
+ throw notFound("thread_not_found", requestId);
48
+ return { data: { thread }, meta: { requestId } };
49
+ }
50
+ async listMessages(input) {
51
+ const requestId = requestIdFor(input.requestId);
52
+ const result = await safeCursorList(async () => {
53
+ const storedMessages = await this.listAllStoredMessages(input.scope, input.threadId);
54
+ const workflowMessages = await listWorkflowTimelineMessages({
55
+ root: this.root,
56
+ scope: input.scope,
57
+ threadId: input.threadId,
58
+ });
59
+ return mergeTimelineMessages({
60
+ storedMessages,
61
+ workflowMessages,
62
+ scope: input.scope,
63
+ threadId: input.threadId,
64
+ ...listOptions(input.limit, input.cursor),
65
+ });
66
+ }, requestId);
67
+ return {
68
+ data: { messages: result.messages },
69
+ meta: apiMeta(requestId, {
70
+ ...(result.nextCursor ? { nextCursor: result.nextCursor } : {}),
71
+ }),
72
+ };
73
+ }
74
+ async createMessage(input) {
75
+ const result = await this.persistMessage(input, "messagePersist");
76
+ return {
77
+ data: result.message,
78
+ meta: result.meta,
79
+ };
80
+ }
81
+ async send(input) {
82
+ const persisted = await this.persistMessage(input, "providerMessage");
83
+ return {
84
+ data: {
85
+ message: persisted.message,
86
+ events: eventsForStoredMessage(persisted.message),
87
+ },
88
+ meta: persisted.meta,
89
+ };
90
+ }
91
+ async stream(input) {
92
+ const messages = await this.listMessages(input);
93
+ return {
94
+ data: { events: messages.data.messages.flatMap(eventsForStoredMessage) },
95
+ meta: messages.meta,
96
+ };
97
+ }
98
+ async persistMessage(input, action) {
99
+ return persistChatMessage({
100
+ storage: this.storage,
101
+ now: this.now,
102
+ message: input,
103
+ action,
104
+ });
105
+ }
106
+ async listAllStoredMessages(scope, threadId) {
107
+ const messages = [];
108
+ let cursor;
109
+ do {
110
+ const page = await this.storage.listMessages(scope, threadId, {
111
+ ...(cursor ? { cursor } : {}),
112
+ limit: 100,
113
+ });
114
+ messages.push(...page.messages);
115
+ cursor = page.nextCursor;
116
+ } while (cursor);
117
+ return messages;
118
+ }
119
+ }
120
+ //# sourceMappingURL=chat-api-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-api-service.js","sourceRoot":"","sources":["../src/chat-api-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function safeCursorList<T>(operation: () => Promise<T>, requestId: string): Promise<T>;
@@ -0,0 +1,14 @@
1
+ import { ChatApiError } from "./chat-api-errors.js";
2
+ export async function safeCursorList(operation, requestId) {
3
+ try {
4
+ return await operation();
5
+ }
6
+ catch (error) {
7
+ if (error instanceof Error &&
8
+ error.message === "chat cursor is invalid for this scope") {
9
+ throw new ChatApiError("invalid_cursor", "chat cursor is invalid", 400, requestId);
10
+ }
11
+ throw error;
12
+ }
13
+ }
14
+ //# sourceMappingURL=chat-api-storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-api-storage.js","sourceRoot":"","sources":["../src/chat-api-storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,SAA2B,EAC3B,SAAiB;IAEjB,IAAI,CAAC;QACH,OAAO,MAAM,SAAS,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IACE,KAAK,YAAY,KAAK;YACtB,KAAK,CAAC,OAAO,KAAK,uCAAuC,EACzD,CAAC;YACD,MAAM,IAAI,YAAY,CACpB,gBAAgB,EAChB,wBAAwB,EACxB,GAAG,EACH,SAAS,CACV,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,81 @@
1
+ import type { ChatActor, ChatMessage, ChatScope, ChatThread, ChatWorkflowTimelineEvent } from "./types/chat.js";
2
+ export interface ChatApiMeta {
3
+ requestId: string;
4
+ idempotencyKey?: string;
5
+ idempotentReplay?: boolean;
6
+ nextCursor?: string;
7
+ policyDecisionId?: string;
8
+ }
9
+ export interface ChatApiSuccess<T> {
10
+ data: T;
11
+ meta: ChatApiMeta;
12
+ }
13
+ export interface ChatApiErrorBody {
14
+ error: {
15
+ code: string;
16
+ message: string;
17
+ requestId: string;
18
+ retryable: boolean;
19
+ };
20
+ }
21
+ export interface CreateChatThreadInput {
22
+ requestId?: string;
23
+ scope: ChatScope;
24
+ title: string;
25
+ actor: ChatActor;
26
+ }
27
+ export interface ListChatInput {
28
+ requestId?: string;
29
+ scope: ChatScope;
30
+ limit?: number;
31
+ cursor?: string;
32
+ }
33
+ export interface ChatThreadInput {
34
+ requestId?: string;
35
+ scope: ChatScope;
36
+ threadId: string;
37
+ }
38
+ export interface ChatMessagesInput extends ChatThreadInput {
39
+ limit?: number;
40
+ cursor?: string;
41
+ }
42
+ export interface ChatMessageInput extends ChatThreadInput {
43
+ idempotencyKey?: string;
44
+ actor: ChatActor;
45
+ text: string;
46
+ format?: "plain_text" | "markdown";
47
+ }
48
+ export interface ChatSendInput extends ChatMessageInput {
49
+ stream?: boolean;
50
+ }
51
+ export type ChatStreamEventType = "message.created" | "message.delta" | "workflow.event" | "runtime.lifecycle" | "policy.blocked" | "error" | "complete";
52
+ export interface ChatStreamEvent {
53
+ eventId: string;
54
+ threadId: string;
55
+ scope: ChatScope;
56
+ createdAt: string;
57
+ sequence: number;
58
+ type: ChatStreamEventType;
59
+ data: ChatStreamEventData;
60
+ }
61
+ export type ChatStreamEventData = {
62
+ message: ChatMessage;
63
+ } | {
64
+ text: string;
65
+ } | {
66
+ workflowEvent: ChatWorkflowTimelineEvent;
67
+ } | {
68
+ lifecycleStatus: string;
69
+ runtimeEvent?: ChatWorkflowTimelineEvent;
70
+ } | {
71
+ reasons: string[];
72
+ } | {
73
+ code: string;
74
+ message: string;
75
+ } | {
76
+ thread: ChatThread;
77
+ };
78
+ export interface ChatSendResult {
79
+ message?: ChatMessage;
80
+ events: ChatStreamEvent[];
81
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=chat-api-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-api-types.js","sourceRoot":"","sources":["../src/chat-api-types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,60 @@
1
+ import type { ChatStorage } from "./chat-storage.js";
2
+ import type { ChatExportRecord } from "./types/chat.js";
3
+ export type ChatComplianceSelection = {
4
+ kind: "thread";
5
+ tenantId: string;
6
+ workspaceId: string;
7
+ threadId: string;
8
+ } | {
9
+ kind: "task";
10
+ tenantId: string;
11
+ workspaceId: string;
12
+ taskId: string;
13
+ } | {
14
+ kind: "run";
15
+ tenantId: string;
16
+ workspaceId: string;
17
+ taskId: string;
18
+ runId: string;
19
+ };
20
+ export interface ChatComplianceActor {
21
+ actorId: string;
22
+ role: string;
23
+ }
24
+ export interface ChatComplianceExportResult {
25
+ selection: ChatComplianceSelection;
26
+ exportedAt: string;
27
+ records: ChatExportRecord[];
28
+ markdown: string;
29
+ auditEventId: string;
30
+ }
31
+ export interface ChatComplianceDeleteResult {
32
+ selection: ChatComplianceSelection;
33
+ deletedThreads: string[];
34
+ deletedMessages: string[];
35
+ auditEventId: string;
36
+ }
37
+ export interface ChatComplianceServiceOptions {
38
+ workspaceRoot: string;
39
+ storage?: ChatStorage;
40
+ now?: () => string;
41
+ }
42
+ export declare class ChatComplianceService {
43
+ private readonly workspaceRoot;
44
+ private readonly storage;
45
+ private readonly files;
46
+ private readonly now;
47
+ constructor(options: ChatComplianceServiceOptions);
48
+ exportEvidence(input: {
49
+ selection: ChatComplianceSelection;
50
+ actor: ChatComplianceActor;
51
+ includeTombstoned?: boolean;
52
+ }): Promise<ChatComplianceExportResult>;
53
+ deleteScope(input: {
54
+ selection: ChatComplianceSelection;
55
+ actor: ChatComplianceActor;
56
+ reasonCode: string;
57
+ }): Promise<ChatComplianceDeleteResult>;
58
+ private resolveSelection;
59
+ }
60
+ export declare function auditArtifactFileName(prefix: "export" | "delete"): string;