@jterrats/open-orchestra 1.0.17 → 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 (233) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/CLAUDE.md +1 -0
  3. package/dist/active-runtime-store.d.ts +18 -0
  4. package/dist/active-runtime-store.js +75 -0
  5. package/dist/active-runtime-store.js.map +1 -0
  6. package/dist/chat-api-errors.d.ts +7 -0
  7. package/dist/chat-api-errors.js +15 -0
  8. package/dist/chat-api-errors.js.map +1 -0
  9. package/dist/chat-api-message-persistence.d.ts +12 -0
  10. package/dist/chat-api-message-persistence.js +125 -0
  11. package/dist/chat-api-message-persistence.js.map +1 -0
  12. package/dist/chat-api-records.d.ts +35 -0
  13. package/dist/chat-api-records.js +94 -0
  14. package/dist/chat-api-records.js.map +1 -0
  15. package/dist/chat-api-service.d.ts +32 -0
  16. package/dist/chat-api-service.js +120 -0
  17. package/dist/chat-api-service.js.map +1 -0
  18. package/dist/chat-api-storage.d.ts +1 -0
  19. package/dist/chat-api-storage.js +14 -0
  20. package/dist/chat-api-storage.js.map +1 -0
  21. package/dist/chat-api-types.d.ts +81 -0
  22. package/dist/chat-api-types.js +2 -0
  23. package/dist/chat-api-types.js.map +1 -0
  24. package/dist/chat-compliance-service.d.ts +60 -0
  25. package/dist/chat-compliance-service.js +241 -0
  26. package/dist/chat-compliance-service.js.map +1 -0
  27. package/dist/chat-event-stream.d.ts +13 -0
  28. package/dist/chat-event-stream.js +124 -0
  29. package/dist/chat-event-stream.js.map +1 -0
  30. package/dist/chat-pagination.d.ts +6 -0
  31. package/dist/chat-pagination.js +64 -0
  32. package/dist/chat-pagination.js.map +1 -0
  33. package/dist/chat-storage-actor-validation.d.ts +4 -0
  34. package/dist/chat-storage-actor-validation.js +65 -0
  35. package/dist/chat-storage-actor-validation.js.map +1 -0
  36. package/dist/chat-storage-content-policy.d.ts +6 -0
  37. package/dist/chat-storage-content-policy.js +84 -0
  38. package/dist/chat-storage-content-policy.js.map +1 -0
  39. package/dist/chat-storage-errors.d.ts +20 -0
  40. package/dist/chat-storage-errors.js +17 -0
  41. package/dist/chat-storage-errors.js.map +1 -0
  42. package/dist/chat-storage-local-files.d.ts +17 -0
  43. package/dist/chat-storage-local-files.js +78 -0
  44. package/dist/chat-storage-local-files.js.map +1 -0
  45. package/dist/chat-storage-local-paths.d.ts +6 -0
  46. package/dist/chat-storage-local-paths.js +124 -0
  47. package/dist/chat-storage-local-paths.js.map +1 -0
  48. package/dist/chat-storage-local-projection.d.ts +10 -0
  49. package/dist/chat-storage-local-projection.js +55 -0
  50. package/dist/chat-storage-local-projection.js.map +1 -0
  51. package/dist/chat-storage-local-records.d.ts +13 -0
  52. package/dist/chat-storage-local-records.js +56 -0
  53. package/dist/chat-storage-local-records.js.map +1 -0
  54. package/dist/chat-storage-local.d.ts +6 -0
  55. package/dist/chat-storage-local.js +114 -0
  56. package/dist/chat-storage-local.js.map +1 -0
  57. package/dist/chat-storage-validation.d.ts +10 -0
  58. package/dist/chat-storage-validation.js +100 -0
  59. package/dist/chat-storage-validation.js.map +1 -0
  60. package/dist/chat-storage.d.ts +16 -0
  61. package/dist/chat-storage.js +4 -0
  62. package/dist/chat-storage.js.map +1 -0
  63. package/dist/chat-workflow-timeline.d.ts +17 -0
  64. package/dist/chat-workflow-timeline.js +210 -0
  65. package/dist/chat-workflow-timeline.js.map +1 -0
  66. package/dist/{workspace-claude-settings.d.ts → claude-settings.d.ts} +22 -3
  67. package/dist/{workspace-claude-settings.js → claude-settings.js} +28 -9
  68. package/dist/claude-settings.js.map +1 -0
  69. package/dist/command-init.d.ts +2 -0
  70. package/dist/command-init.js +150 -0
  71. package/dist/command-init.js.map +1 -0
  72. package/dist/command-manifest.js +1 -1
  73. package/dist/command-manifest.js.map +1 -1
  74. package/dist/commands.d.ts +1 -1
  75. package/dist/commands.js +1 -140
  76. package/dist/commands.js.map +1 -1
  77. package/dist/constants.d.ts +1 -0
  78. package/dist/constants.js +1 -0
  79. package/dist/constants.js.map +1 -1
  80. package/dist/context-runtime-preprocessor.d.ts +41 -0
  81. package/dist/context-runtime-preprocessor.js +199 -0
  82. package/dist/context-runtime-preprocessor.js.map +1 -0
  83. package/dist/cursor-settings.d.ts +25 -0
  84. package/dist/cursor-settings.js +72 -0
  85. package/dist/cursor-settings.js.map +1 -0
  86. package/dist/health-commands.js +43 -3
  87. package/dist/health-commands.js.map +1 -1
  88. package/dist/model-aliases.d.ts +5 -0
  89. package/dist/model-aliases.js +37 -0
  90. package/dist/model-aliases.js.map +1 -0
  91. package/dist/ollama-provider.js +25 -0
  92. package/dist/ollama-provider.js.map +1 -1
  93. package/dist/phase-playbooks.js +11 -0
  94. package/dist/phase-playbooks.js.map +1 -1
  95. package/dist/provider-agent-wrapper.js +14 -0
  96. package/dist/provider-agent-wrapper.js.map +1 -1
  97. package/dist/runtime-adapters.js +56 -0
  98. package/dist/runtime-adapters.js.map +1 -1
  99. package/dist/runtime-bootstrap.js +20 -22
  100. package/dist/runtime-bootstrap.js.map +1 -1
  101. package/dist/runtime-child-prompt.js +8 -0
  102. package/dist/runtime-child-prompt.js.map +1 -1
  103. package/dist/runtime-context-manifest.d.ts +4 -1
  104. package/dist/runtime-context-manifest.js +59 -3
  105. package/dist/runtime-context-manifest.js.map +1 -1
  106. package/dist/runtime-execution-adapters.js +19 -0
  107. package/dist/runtime-execution-adapters.js.map +1 -1
  108. package/dist/runtime-execution-renderer.js +4 -0
  109. package/dist/runtime-execution-renderer.js.map +1 -1
  110. package/dist/runtime-execution.js +13 -82
  111. package/dist/runtime-execution.js.map +1 -1
  112. package/dist/runtime-hooks.d.ts +46 -0
  113. package/dist/runtime-hooks.js +95 -0
  114. package/dist/runtime-hooks.js.map +1 -0
  115. package/dist/runtime-parent-actions.js +5 -0
  116. package/dist/runtime-parent-actions.js.map +1 -1
  117. package/dist/runtime-spawn-bridge.js +1 -0
  118. package/dist/runtime-spawn-bridge.js.map +1 -1
  119. package/dist/runtime-spawn-guidance.js +15 -61
  120. package/dist/runtime-spawn-guidance.js.map +1 -1
  121. package/dist/security/chat-guardrail-policy.d.ts +7 -0
  122. package/dist/security/chat-guardrail-policy.js +61 -0
  123. package/dist/security/chat-guardrail-policy.js.map +1 -0
  124. package/dist/security/chat-guardrail-types.d.ts +65 -0
  125. package/dist/security/chat-guardrail-types.js +2 -0
  126. package/dist/security/chat-guardrail-types.js.map +1 -0
  127. package/dist/security/chat-guardrail-validation.d.ts +9 -0
  128. package/dist/security/chat-guardrail-validation.js +64 -0
  129. package/dist/security/chat-guardrail-validation.js.map +1 -0
  130. package/dist/security/chat-guardrails.d.ts +3 -0
  131. package/dist/security/chat-guardrails.js +136 -0
  132. package/dist/security/chat-guardrails.js.map +1 -0
  133. package/dist/security/content-classifier.js +33 -1
  134. package/dist/security/content-classifier.js.map +1 -1
  135. package/dist/security/payment-card-detection.d.ts +3 -0
  136. package/dist/security/payment-card-detection.js +48 -0
  137. package/dist/security/payment-card-detection.js.map +1 -0
  138. package/dist/security/policy-types.d.ts +1 -1
  139. package/dist/security/provider-egress-policy.d.ts +27 -0
  140. package/dist/security/provider-egress-policy.js +72 -0
  141. package/dist/security/provider-egress-policy.js.map +1 -0
  142. package/dist/security/public-api-auth.d.ts +20 -0
  143. package/dist/security/public-api-auth.js +55 -0
  144. package/dist/security/public-api-auth.js.map +1 -0
  145. package/dist/security/public-api-policy.d.ts +8 -0
  146. package/dist/security/public-api-policy.js +40 -0
  147. package/dist/security/public-api-policy.js.map +1 -0
  148. package/dist/security/redaction.js +44 -13
  149. package/dist/security/redaction.js.map +1 -1
  150. package/dist/security/restricted-content-quarantine.d.ts +17 -0
  151. package/dist/security/restricted-content-quarantine.js +50 -0
  152. package/dist/security/restricted-content-quarantine.js.map +1 -0
  153. package/dist/security/restricted-data-classifier.d.ts +9 -0
  154. package/dist/security/restricted-data-classifier.js +254 -0
  155. package/dist/security/restricted-data-classifier.js.map +1 -0
  156. package/dist/skills-render.js +7 -14
  157. package/dist/skills-render.js.map +1 -1
  158. package/dist/telemetry-redaction.d.ts +2 -0
  159. package/dist/telemetry-redaction.js +25 -2
  160. package/dist/telemetry-redaction.js.map +1 -1
  161. package/dist/types/chat.d.ts +203 -0
  162. package/dist/types/chat.js +10 -0
  163. package/dist/types/chat.js.map +1 -0
  164. package/dist/types/model-config.d.ts +4 -0
  165. package/dist/types/public-api.d.ts +75 -0
  166. package/dist/types/public-api.js +2 -0
  167. package/dist/types/public-api.js.map +1 -0
  168. package/dist/types/restricted-data.d.ts +69 -0
  169. package/dist/types/restricted-data.js +8 -0
  170. package/dist/types/restricted-data.js.map +1 -0
  171. package/dist/types/restricted-fragment.d.ts +82 -0
  172. package/dist/types/restricted-fragment.js +14 -0
  173. package/dist/types/restricted-fragment.js.map +1 -0
  174. package/dist/types/runtime.d.ts +12 -0
  175. package/dist/types.d.ts +6 -0
  176. package/dist/types.js.map +1 -1
  177. package/dist/web-api.js +24 -0
  178. package/dist/web-api.js.map +1 -1
  179. package/dist/web-artifact-parsers.d.ts +6 -0
  180. package/dist/web-artifact-parsers.js +244 -0
  181. package/dist/web-artifact-parsers.js.map +1 -0
  182. package/dist/web-artifact-types.d.ts +76 -0
  183. package/dist/web-artifact-types.js +2 -0
  184. package/dist/web-artifact-types.js.map +1 -0
  185. package/dist/web-artifacts.d.ts +2 -43
  186. package/dist/web-artifacts.js +73 -58
  187. package/dist/web-artifacts.js.map +1 -1
  188. package/dist/web-chat-route-inputs.d.ts +11 -0
  189. package/dist/web-chat-route-inputs.js +156 -0
  190. package/dist/web-chat-route-inputs.js.map +1 -0
  191. package/dist/web-chat-routes.d.ts +7 -0
  192. package/dist/web-chat-routes.js +213 -0
  193. package/dist/web-chat-routes.js.map +1 -0
  194. package/dist/web-console/assets/index-CJup1cIA.css +1 -0
  195. package/dist/web-console/assets/index-CVDOfipu.js +11 -0
  196. package/dist/web-console/index.html +2 -2
  197. package/dist/web-evidence.d.ts +1 -1
  198. package/dist/web-evidence.js +9 -2
  199. package/dist/web-evidence.js.map +1 -1
  200. package/dist/web-public-route-inputs.d.ts +14 -0
  201. package/dist/web-public-route-inputs.js +136 -0
  202. package/dist/web-public-route-inputs.js.map +1 -0
  203. package/dist/web-public-routes.d.ts +6 -0
  204. package/dist/web-public-routes.js +194 -0
  205. package/dist/web-public-routes.js.map +1 -0
  206. package/dist/web-public-service.d.ts +16 -0
  207. package/dist/web-public-service.js +154 -0
  208. package/dist/web-public-service.js.map +1 -0
  209. package/dist/workflow-services.js +5 -0
  210. package/dist/workflow-services.js.map +1 -1
  211. package/dist/workspace-runtime-bootstrap.js +15 -4
  212. package/dist/workspace-runtime-bootstrap.js.map +1 -1
  213. package/docs/chat-audit-retention.md +76 -0
  214. package/docs/chat-provider-provenance-ledger.md +75 -0
  215. package/docs/context-runtime-preprocessing.md +37 -0
  216. package/docs/orchestra-mvp.md +8 -2
  217. package/docs/public-api-contract.md +43 -0
  218. package/docs/release-test-matrix.md +14 -14
  219. package/docs/restricted-fragment-storage-contract.md +147 -0
  220. package/docs/runtime-adapters.md +40 -7
  221. package/docs/site-manifest.json +128 -30
  222. package/package.json +5 -2
  223. package/site/dist/_headers +9 -0
  224. package/site/dist/_redirects +2 -0
  225. package/site/dist/architecture.mmd +61 -0
  226. package/site/dist/assets/index-Bi8l6tCE.js +10 -0
  227. package/site/dist/assets/index-BsCLqY__.css +1 -0
  228. package/site/dist/favicon.svg +19 -0
  229. package/site/dist/index.html +28 -0
  230. package/site/package.json +19 -0
  231. package/dist/web-console/assets/index-BHs7OIv8.css +0 -1
  232. package/dist/web-console/assets/index-BJuVTqfQ.js +0 -11
  233. package/dist/workspace-claude-settings.js.map +0 -1
@@ -4,10 +4,11 @@ import { exists } from "./fs-utils.js";
4
4
  import { removeUndefined } from "./command-utils.js";
5
5
  import { addEvidence } from "./workflow-services.js";
6
6
  import { resolveWorkspaceLocalPath } from "./web-evidence.js";
7
+ import { parseJsonErd, parseMarkdownErd, parseMermaidErd, parseTsxCanvasContract, validateMermaidSource, } from "./web-artifact-parsers.js";
7
8
  const ARTIFACT_ROOTS = [".agent-workflow", "docs", "reports", "e2e"];
8
9
  const TEXT_LIMIT_BYTES = 128 * 1024;
9
10
  const MAX_ARTIFACTS = 300;
10
- const SUPPORTED_EXTENSIONS = new Set([
11
+ const DISCOVERABLE_EXTENSIONS = new Set([
11
12
  ".md",
12
13
  ".mmd",
13
14
  ".mermaid",
@@ -17,6 +18,12 @@ const SUPPORTED_EXTENSIONS = new Set([
17
18
  ".txt",
18
19
  ".log",
19
20
  ".tsx",
21
+ ".drawio",
22
+ ".xml",
23
+ ".pdf",
24
+ ".zip",
25
+ ".bin",
26
+ ".csv",
20
27
  ]);
21
28
  const EVIDENCE_TYPES = new Set([
22
29
  "command",
@@ -48,10 +55,13 @@ export async function previewWebArtifact(root, artifactPath) {
48
55
  if (!details.isFile()) {
49
56
  throw new Error(`artifact is not a file: ${artifactPath}`);
50
57
  }
51
- const summary = summarizeArtifact(artifactPath, details);
58
+ const summary = summarizeArtifact(root, artifactPath, details);
52
59
  if (summary.type === "png") {
53
60
  return summary;
54
61
  }
62
+ if (summary.type === "unsupported") {
63
+ return summary;
64
+ }
55
65
  if (details.size > TEXT_LIMIT_BYTES) {
56
66
  return {
57
67
  ...summary,
@@ -65,20 +75,43 @@ export async function previewWebArtifact(root, artifactPath) {
65
75
  ? { ...summary, type: "tsx-canvas", content, canvas, renderable: true }
66
76
  : { ...summary, content };
67
77
  }
78
+ if (summary.type === "drawio") {
79
+ return {
80
+ ...summary,
81
+ content,
82
+ unsupportedReason: "draw.io source is available, but interactive draw.io rendering is not supported in the safe web console viewer yet.",
83
+ };
84
+ }
68
85
  if (summary.type === "mermaid") {
69
86
  const parseError = validateMermaidSource(content);
70
- return parseError
71
- ? { ...summary, content, parseError }
87
+ const erd = parseMermaidErd(content);
88
+ if (parseError) {
89
+ return erd
90
+ ? { ...summary, content, parseError, erd }
91
+ : { ...summary, content, parseError };
92
+ }
93
+ return erd
94
+ ? { ...summary, type: "erd", content, erd }
72
95
  : { ...summary, content };
73
96
  }
74
- if (summary.type === "json") {
97
+ if (summary.type === "json" || summary.type === "erd") {
75
98
  try {
76
- JSON.parse(content);
99
+ const parsed = JSON.parse(content);
100
+ const erd = parseJsonErd(parsed);
101
+ return erd
102
+ ? { ...summary, type: "erd", content, erd, renderable: true }
103
+ : { ...summary, content };
77
104
  }
78
105
  catch (error) {
79
106
  return { ...summary, content, parseError: errorMessage(error) };
80
107
  }
81
108
  }
109
+ if (summary.type === "markdown") {
110
+ const erd = parseMarkdownErd(content);
111
+ return erd
112
+ ? { ...summary, type: "erd", content, erd, renderable: true }
113
+ : { ...summary, content };
114
+ }
82
115
  return { ...summary, content };
83
116
  }
84
117
  export async function attachArtifactEvidence(root, input) {
@@ -122,25 +155,39 @@ async function collectArtifacts(root, directory, artifacts) {
122
155
  continue;
123
156
  }
124
157
  if (!entry.isFile() ||
125
- !SUPPORTED_EXTENSIONS.has(path.extname(entry.name))) {
158
+ !DISCOVERABLE_EXTENSIONS.has(path.extname(entry.name).toLowerCase())) {
126
159
  continue;
127
160
  }
128
161
  const details = await stat(absolutePath);
129
- artifacts.push(summarizeArtifact(relativePath(root, absolutePath), details));
162
+ artifacts.push(summarizeArtifact(root, relativePath(root, absolutePath), details));
130
163
  }
131
164
  }
132
- function summarizeArtifact(artifactPath, details) {
165
+ function summarizeArtifact(root, artifactPath, details) {
133
166
  const type = artifactType(artifactPath);
134
- return {
167
+ const metadata = artifactMetadata(artifactPath);
168
+ const workspace = path.basename(path.resolve(root)) || "workspace";
169
+ const group = {
170
+ workspace,
171
+ taskId: metadata.taskId ?? "unassigned",
172
+ runId: metadata.runId ?? "no-run",
173
+ type,
174
+ };
175
+ return removeUndefined({
135
176
  path: artifactPath,
136
177
  type,
137
- ...artifactMetadata(artifactPath),
178
+ workspace,
179
+ group,
180
+ ...metadata,
138
181
  sizeBytes: details.size,
139
182
  updatedAt: details.mtime.toISOString(),
140
- renderable: type !== "tsx-source",
183
+ renderable: type !== "tsx-source" && type !== "drawio" && type !== "unsupported",
141
184
  safePreview: true,
185
+ sourceAvailable: true,
186
+ unsupportedReason: type === "unsupported"
187
+ ? "This file type is tracked for download but is not safe for inline preview."
188
+ : undefined,
142
189
  url: `/api/artifacts?path=${encodeURIComponent(artifactPath)}`,
143
- };
190
+ });
144
191
  }
145
192
  function artifactType(artifactPath) {
146
193
  const extension = path.extname(artifactPath).toLowerCase();
@@ -152,11 +199,20 @@ function artifactType(artifactPath) {
152
199
  return "svg";
153
200
  if (extension === ".png")
154
201
  return "png";
202
+ if (/(^|[-_.])erd([-_.]|$)/i.test(path.basename(artifactPath))) {
203
+ return "erd";
204
+ }
155
205
  if (extension === ".json")
156
206
  return "json";
207
+ if (extension === ".log")
208
+ return "log";
209
+ if (extension === ".drawio" || extension === ".xml")
210
+ return "drawio";
157
211
  if (extension === ".tsx")
158
212
  return "tsx-source";
159
- return "text";
213
+ if (extension === ".txt" || extension === ".csv")
214
+ return "text";
215
+ return "unsupported";
160
216
  }
161
217
  function artifactMetadata(artifactPath) {
162
218
  const parts = artifactPath.split("/");
@@ -170,50 +226,9 @@ function artifactMetadata(artifactPath) {
170
226
  }
171
227
  const fileName = path.basename(artifactPath);
172
228
  const taskMatch = fileName.match(/^(GH-\d+|[A-Z][A-Z0-9_-]+)/);
173
- return taskMatch ? removeUndefined({ taskId: taskMatch[1] }) : {};
174
- }
175
- function parseTsxCanvasContract(content) {
176
- const canvasMarker = "orchestra-canvas";
177
- const markerIndex = content.indexOf(canvasMarker);
178
- if (markerIndex === -1)
179
- return undefined;
180
- const commentStart = content.lastIndexOf("/*", markerIndex);
181
- const commentEnd = content.indexOf("*/", markerIndex);
182
- if (commentStart === -1 || commentEnd === -1)
183
- return undefined;
184
- try {
185
- const parsed = JSON.parse(content.slice(markerIndex + canvasMarker.length, commentEnd).trim());
186
- validateCanvasContract(parsed);
187
- return parsed;
188
- }
189
- catch {
190
- return undefined;
191
- }
192
- }
193
- function validateCanvasContract(contract) {
194
- if (contract.version !== 1)
195
- throw new Error("unsupported canvas version");
196
- if (!Number.isFinite(contract.width) || !Number.isFinite(contract.height)) {
197
- throw new Error("canvas width and height are required");
198
- }
199
- if (!Array.isArray(contract.nodes))
200
- throw new Error("canvas nodes are required");
201
- for (const node of contract.nodes) {
202
- if (!node.id || !node.label)
203
- throw new Error("canvas nodes require id and label");
204
- if (!Number.isFinite(node.x) || !Number.isFinite(node.y)) {
205
- throw new Error("canvas nodes require x and y");
206
- }
207
- }
208
- }
209
- function validateMermaidSource(content) {
210
- const trimmed = content.trim();
211
- if (trimmed.length === 0)
212
- return "diagram is empty";
213
- if (!/^(flowchart|graph|sequenceDiagram|classDiagram|stateDiagram|erDiagram|journey|gantt|pie|mindmap|timeline)\b/.test(trimmed)) {
214
- return "line 1: unsupported or missing Mermaid diagram declaration";
215
- }
216
- return undefined;
229
+ return taskMatch
230
+ ? removeUndefined({ taskId: taskMatch[1]?.replace(/[-_.]+$/, "") })
231
+ : {};
217
232
  }
218
233
  function relativePath(root, absolutePath) {
219
234
  return path
@@ -1 +1 @@
1
- {"version":3,"file":"web-artifacts.js","sourceRoot":"","sources":["../src/web-artifacts.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"web-artifacts.js","sourceRoot":"","sources":["../src/web-artifacts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type http from "node:http";
2
+ import { ChatApiError } from "./chat-api-errors.js";
3
+ import type { ChatMessagesInput, ChatSendInput, ChatThreadInput, CreateChatThreadInput, ListChatInput } from "./chat-api-types.js";
4
+ export declare function listInput(url: URL): ListChatInput;
5
+ export declare function threadInput(url: URL, threadId: string): ChatThreadInput;
6
+ export declare function messagesInput(url: URL, threadId: string): ChatMessagesInput;
7
+ export declare function createThreadInput(body: unknown, requestIdValue: string): CreateChatThreadInput;
8
+ export declare function messageInput(body: unknown, headerKey: string | string[] | undefined, threadId: string, requestIdValue: string): ChatSendInput;
9
+ export declare function safeJsonBody(request: http.IncomingMessage): Promise<unknown>;
10
+ export declare function requestId(url: URL): string;
11
+ export declare function apiError(code: string, message: string, status: number): ChatApiError;
@@ -0,0 +1,156 @@
1
+ import { ChatApiError } from "./chat-api-errors.js";
2
+ export function listInput(url) {
3
+ return {
4
+ requestId: requestId(url),
5
+ scope: scopeFromQuery(url),
6
+ ...optionalPaging(url),
7
+ };
8
+ }
9
+ export function threadInput(url, threadId) {
10
+ return { requestId: requestId(url), scope: scopeFromQuery(url), threadId };
11
+ }
12
+ export function messagesInput(url, threadId) {
13
+ return {
14
+ ...threadInput(url, threadId),
15
+ ...optionalPaging(url),
16
+ };
17
+ }
18
+ export function createThreadInput(body, requestIdValue) {
19
+ const input = objectBody(body, requestIdValue);
20
+ return {
21
+ requestId: requestIdValue,
22
+ scope: scopeFromBody(input, requestIdValue),
23
+ title: stringField(input, "title", requestIdValue),
24
+ actor: actorFromBody(input, requestIdValue),
25
+ };
26
+ }
27
+ export function messageInput(body, headerKey, threadId, requestIdValue) {
28
+ const input = objectBody(body, requestIdValue);
29
+ const idempotencyKey = headerString(headerKey) ?? stringValue(input.idempotencyKey);
30
+ return {
31
+ requestId: requestIdValue,
32
+ scope: scopeFromBody(input, requestIdValue),
33
+ threadId,
34
+ ...(idempotencyKey ? { idempotencyKey } : {}),
35
+ actor: actorFromBody(input, requestIdValue),
36
+ text: stringField(input, "text", requestIdValue),
37
+ format: stringValue(input.format) === "markdown" ? "markdown" : "plain_text",
38
+ };
39
+ }
40
+ export async function safeJsonBody(request) {
41
+ const chunks = [];
42
+ let size = 0;
43
+ try {
44
+ for await (const chunk of request) {
45
+ const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
46
+ size += buffer.length;
47
+ if (size > CHAT_JSON_BODY_LIMIT_BYTES) {
48
+ throw apiError("payload_too_large", "chat payload is too large", 413);
49
+ }
50
+ chunks.push(buffer);
51
+ }
52
+ const content = Buffer.concat(chunks).toString("utf8");
53
+ return content.trim() === "" ? {} : JSON.parse(content);
54
+ }
55
+ catch (error) {
56
+ if (error instanceof ChatApiError)
57
+ throw error;
58
+ throw apiError("invalid_json", "request body must be valid JSON", 400);
59
+ }
60
+ }
61
+ const CHAT_JSON_BODY_LIMIT_BYTES = 64 * 1024;
62
+ export function requestId(url) {
63
+ return stringParam(url, "requestId") ?? "chat-request";
64
+ }
65
+ export function apiError(code, message, status) {
66
+ return new ChatApiError(code, message, status, "chat-request");
67
+ }
68
+ function scopeFromQuery(url) {
69
+ return {
70
+ tenantId: requiredQuery(url, "tenantId"),
71
+ workspaceId: requiredQuery(url, "workspaceId"),
72
+ taskId: requiredQuery(url, "taskId"),
73
+ runId: requiredQuery(url, "runId"),
74
+ phase: requiredQuery(url, "phase"),
75
+ sessionId: requiredQuery(url, "sessionId"),
76
+ };
77
+ }
78
+ function scopeFromBody(body, requestIdValue) {
79
+ const scope = objectValue(body.scope);
80
+ if (!scope) {
81
+ throw new ChatApiError("invalid_request", "scope is required", 400, requestIdValue);
82
+ }
83
+ return {
84
+ tenantId: stringField(scope, "tenantId", requestIdValue),
85
+ workspaceId: stringField(scope, "workspaceId", requestIdValue),
86
+ taskId: stringField(scope, "taskId", requestIdValue),
87
+ runId: stringField(scope, "runId", requestIdValue),
88
+ phase: stringField(scope, "phase", requestIdValue),
89
+ sessionId: stringField(scope, "sessionId", requestIdValue),
90
+ };
91
+ }
92
+ function actorFromBody(body, requestIdValue) {
93
+ const actor = objectValue(body.actor);
94
+ if (!actor) {
95
+ throw new ChatApiError("invalid_request", "actor is required", 400, requestIdValue);
96
+ }
97
+ if (stringField(actor, "kind", requestIdValue) !== "human") {
98
+ throw new ChatApiError("invalid_request", "only human chat actors are supported by this API slice", 400, requestIdValue);
99
+ }
100
+ return {
101
+ kind: "human",
102
+ actorId: stringField(actor, "actorId", requestIdValue),
103
+ displayName: stringField(actor, "displayName", requestIdValue),
104
+ source: "web_console",
105
+ sessionId: stringField(actor, "sessionId", requestIdValue),
106
+ };
107
+ }
108
+ function objectBody(body, requestIdValue) {
109
+ const value = objectValue(body);
110
+ if (!value) {
111
+ throw new ChatApiError("invalid_request", "JSON object body is required", 400, requestIdValue);
112
+ }
113
+ return value;
114
+ }
115
+ function objectValue(value) {
116
+ return typeof value === "object" && value !== null && !Array.isArray(value)
117
+ ? value
118
+ : undefined;
119
+ }
120
+ function stringField(source, field, requestIdValue) {
121
+ const value = stringValue(source[field]);
122
+ if (!value) {
123
+ throw new ChatApiError("invalid_request", `${field} is required`, 400, requestIdValue);
124
+ }
125
+ return value;
126
+ }
127
+ function stringValue(value) {
128
+ return typeof value === "string" && value.trim() ? value.trim() : undefined;
129
+ }
130
+ function requiredQuery(url, field) {
131
+ const value = url.searchParams.get(field)?.trim();
132
+ if (!value)
133
+ throw apiError("invalid_request", `${field} is required`, 400);
134
+ return value;
135
+ }
136
+ function stringParam(url, field) {
137
+ return url.searchParams.get(field)?.trim() || undefined;
138
+ }
139
+ function numberParam(url, field) {
140
+ const value = url.searchParams.get(field);
141
+ return value ? Number(value) : undefined;
142
+ }
143
+ function optionalPaging(url) {
144
+ const limit = numberParam(url, "limit");
145
+ const cursor = stringParam(url, "cursor");
146
+ return {
147
+ ...(limit !== undefined ? { limit } : {}),
148
+ ...(cursor !== undefined ? { cursor } : {}),
149
+ };
150
+ }
151
+ function headerString(value) {
152
+ if (Array.isArray(value))
153
+ return value[0]?.trim();
154
+ return value?.trim();
155
+ }
156
+ //# sourceMappingURL=web-chat-route-inputs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-chat-route-inputs.js","sourceRoot":"","sources":["../src/web-chat-route-inputs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type http from "node:http";
2
+ export interface WebChatRouteResult {
3
+ status: number;
4
+ body: unknown;
5
+ contentType: "application/json" | "text/event-stream";
6
+ }
7
+ export declare function handleWebChatRoute(request: http.IncomingMessage, root: string, url: URL): Promise<WebChatRouteResult | null>;
@@ -0,0 +1,213 @@
1
+ import { createLocalChatStorage } from "./chat-storage-local.js";
2
+ import { ChatApiService } from "./chat-api-service.js";
3
+ import { ChatApiError } from "./chat-api-errors.js";
4
+ import { ChatComplianceService } from "./chat-compliance-service.js";
5
+ import { enforceRestrictedIngressQuarantine } from "./security/restricted-content-quarantine.js";
6
+ import { errorStreamEvents, renderServerSentEvents, } from "./chat-event-stream.js";
7
+ import { apiError, createThreadInput, listInput, messageInput, messagesInput, requestId, safeJsonBody, threadInput, } from "./web-chat-route-inputs.js";
8
+ export async function handleWebChatRoute(request, root, url) {
9
+ if (!url.pathname.startsWith("/api/chat"))
10
+ return null;
11
+ const storage = createLocalChatStorage({ workspaceRoot: root });
12
+ const service = new ChatApiService({
13
+ storage,
14
+ root,
15
+ });
16
+ const compliance = new ChatComplianceService({
17
+ workspaceRoot: root,
18
+ storage,
19
+ });
20
+ try {
21
+ return await dispatchChatRoute(request, url, service, compliance, root);
22
+ }
23
+ catch (error) {
24
+ return errorResult(error);
25
+ }
26
+ }
27
+ async function dispatchChatRoute(request, url, service, compliance, root) {
28
+ const parts = url.pathname.split("/").filter(Boolean);
29
+ if (request.method === "GET" && url.pathname === "/api/chat/threads") {
30
+ return json(200, await service.listThreads(listInput(url)));
31
+ }
32
+ if (request.method === "POST" && url.pathname === "/api/chat/threads") {
33
+ const input = createThreadInput(await safeJsonBody(request), requestId(url));
34
+ await quarantineChatThreadInput(root, input);
35
+ return json(200, await service.createThread(input));
36
+ }
37
+ if (request.method === "POST" && url.pathname === "/api/chat/export") {
38
+ return json(200, await compliance.exportEvidence(complianceInput(await safeJsonBody(request))));
39
+ }
40
+ if (request.method === "POST" && url.pathname === "/api/chat/delete") {
41
+ return json(200, await compliance.deleteScope(deleteInput(await safeJsonBody(request))));
42
+ }
43
+ if (parts.length >= 4 && parts[0] === "api" && parts[1] === "chat") {
44
+ const threadId = parts[3];
45
+ if (!threadId)
46
+ throw apiError("invalid_request", "threadId is required", 400);
47
+ return dispatchThreadRoute(request, url, service, parts, threadId, root);
48
+ }
49
+ throw apiError("not_found", "unknown chat endpoint", 404);
50
+ }
51
+ async function dispatchThreadRoute(request, url, service, parts, threadId, root) {
52
+ if (request.method === "GET" && parts.length === 4) {
53
+ return json(200, await service.getThread(threadInput(url, threadId)));
54
+ }
55
+ if (request.method === "GET" && parts[4] === "messages") {
56
+ return json(200, await service.listMessages(messagesInput(url, threadId)));
57
+ }
58
+ if (request.method === "POST" && parts[4] === "messages") {
59
+ const input = messageInput(await safeJsonBody(request), request.headers["idempotency-key"], threadId, requestId(url));
60
+ await quarantineChatMessageInput(root, input);
61
+ return json(200, await service.createMessage(input));
62
+ }
63
+ if (request.method === "POST" && parts[4] === "send") {
64
+ const input = messageInput(await safeJsonBody(request), request.headers["idempotency-key"], threadId, requestId(url));
65
+ await quarantineChatMessageInput(root, input);
66
+ return json(200, await service.send(input));
67
+ }
68
+ if (request.method === "GET" && parts[4] === "stream") {
69
+ return streamResult(service, url, threadId);
70
+ }
71
+ throw apiError("not_found", "unknown chat endpoint", 404);
72
+ }
73
+ async function streamResult(service, url, threadId) {
74
+ const input = messagesInput(url, threadId);
75
+ try {
76
+ const stream = await service.stream(input);
77
+ return sse(200, stream.data.events);
78
+ }
79
+ catch (error) {
80
+ if (error instanceof ChatApiError) {
81
+ return sse(error.status, errorStreamEvents({
82
+ requestId: error.requestId,
83
+ threadId,
84
+ scope: input.scope,
85
+ code: error.code,
86
+ message: error.message,
87
+ retryable: error.retryable,
88
+ }));
89
+ }
90
+ throw error;
91
+ }
92
+ }
93
+ function errorResult(error) {
94
+ const requestId = error instanceof ChatApiError ? error.requestId : "chat-request";
95
+ const body = {
96
+ error: {
97
+ code: error instanceof ChatApiError ? error.code : "internal_error",
98
+ message: error instanceof ChatApiError
99
+ ? safeErrorMessage(error.message)
100
+ : "chat request failed",
101
+ requestId,
102
+ retryable: error instanceof ChatApiError ? error.retryable : false,
103
+ },
104
+ };
105
+ return json(error instanceof ChatApiError ? error.status : 500, body);
106
+ }
107
+ function json(status, body) {
108
+ return { status, body, contentType: "application/json" };
109
+ }
110
+ function sse(status, events) {
111
+ return {
112
+ status,
113
+ body: renderServerSentEvents(events),
114
+ contentType: "text/event-stream",
115
+ };
116
+ }
117
+ async function quarantineChatThreadInput(root, input) {
118
+ await enforceRestrictedIngressQuarantine({
119
+ root,
120
+ requestId: input.requestId ?? "chat-request",
121
+ boundary: "chat_ingress",
122
+ fields: [{ name: "title", text: input.title }],
123
+ actorId: actorId(input.actor),
124
+ tenantId: input.scope.tenantId,
125
+ workspaceId: input.scope.workspaceId,
126
+ taskId: input.scope.taskId,
127
+ });
128
+ }
129
+ async function quarantineChatMessageInput(root, input) {
130
+ await enforceRestrictedIngressQuarantine({
131
+ root,
132
+ requestId: input.requestId ?? "chat-request",
133
+ boundary: "chat_ingress",
134
+ fields: [{ name: "text", text: input.text }],
135
+ actorId: actorId(input.actor),
136
+ tenantId: input.scope.tenantId,
137
+ workspaceId: input.scope.workspaceId,
138
+ taskId: input.scope.taskId,
139
+ threadId: input.threadId,
140
+ });
141
+ }
142
+ function actorId(input) {
143
+ return input.actorId;
144
+ }
145
+ function safeErrorMessage(message) {
146
+ return message.replace(/\/Users\/[^ ]+/gu, "[path]").slice(0, 240);
147
+ }
148
+ function complianceInput(body) {
149
+ const input = objectBody(body);
150
+ return {
151
+ selection: selectionInput(input.selection),
152
+ actor: actorInput(input.actor),
153
+ includeTombstoned: input.includeTombstoned === true,
154
+ };
155
+ }
156
+ function deleteInput(body) {
157
+ const input = objectBody(body);
158
+ return {
159
+ selection: selectionInput(input.selection),
160
+ actor: actorInput(input.actor),
161
+ reasonCode: requiredString(input.reasonCode, "reasonCode"),
162
+ };
163
+ }
164
+ function selectionInput(value) {
165
+ const selection = objectBody(value);
166
+ const kind = requiredString(selection.kind, "selection.kind");
167
+ if (kind === "thread") {
168
+ return {
169
+ kind,
170
+ tenantId: requiredString(selection.tenantId, "selection.tenantId"),
171
+ workspaceId: requiredString(selection.workspaceId, "selection.workspaceId"),
172
+ threadId: requiredString(selection.threadId, "selection.threadId"),
173
+ };
174
+ }
175
+ if (kind === "task") {
176
+ return {
177
+ kind,
178
+ tenantId: requiredString(selection.tenantId, "selection.tenantId"),
179
+ workspaceId: requiredString(selection.workspaceId, "selection.workspaceId"),
180
+ taskId: requiredString(selection.taskId, "selection.taskId"),
181
+ };
182
+ }
183
+ if (kind === "run") {
184
+ return {
185
+ kind,
186
+ tenantId: requiredString(selection.tenantId, "selection.tenantId"),
187
+ workspaceId: requiredString(selection.workspaceId, "selection.workspaceId"),
188
+ taskId: requiredString(selection.taskId, "selection.taskId"),
189
+ runId: requiredString(selection.runId, "selection.runId"),
190
+ };
191
+ }
192
+ throw apiError("invalid_request", "selection.kind is invalid", 400);
193
+ }
194
+ function actorInput(value) {
195
+ const actor = objectBody(value);
196
+ return {
197
+ actorId: requiredString(actor.actorId, "actor.actorId"),
198
+ role: requiredString(actor.role, "actor.role"),
199
+ };
200
+ }
201
+ function objectBody(value) {
202
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
203
+ throw apiError("invalid_request", "JSON object body is required", 400);
204
+ }
205
+ return value;
206
+ }
207
+ function requiredString(value, field) {
208
+ if (typeof value !== "string" || value.trim() === "") {
209
+ throw apiError("invalid_request", `${field} is required`, 400);
210
+ }
211
+ return value.trim();
212
+ }
213
+ //# sourceMappingURL=web-chat-routes.js.map