@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.
- package/CHANGELOG.md +44 -0
- package/CLAUDE.md +1 -0
- package/dist/active-runtime-store.d.ts +18 -0
- package/dist/active-runtime-store.js +75 -0
- package/dist/active-runtime-store.js.map +1 -0
- package/dist/chat-api-errors.d.ts +7 -0
- package/dist/chat-api-errors.js +15 -0
- package/dist/chat-api-errors.js.map +1 -0
- package/dist/chat-api-message-persistence.d.ts +12 -0
- package/dist/chat-api-message-persistence.js +125 -0
- package/dist/chat-api-message-persistence.js.map +1 -0
- package/dist/chat-api-records.d.ts +35 -0
- package/dist/chat-api-records.js +94 -0
- package/dist/chat-api-records.js.map +1 -0
- package/dist/chat-api-service.d.ts +32 -0
- package/dist/chat-api-service.js +120 -0
- package/dist/chat-api-service.js.map +1 -0
- package/dist/chat-api-storage.d.ts +1 -0
- package/dist/chat-api-storage.js +14 -0
- package/dist/chat-api-storage.js.map +1 -0
- package/dist/chat-api-types.d.ts +81 -0
- package/dist/chat-api-types.js +2 -0
- package/dist/chat-api-types.js.map +1 -0
- package/dist/chat-compliance-service.d.ts +60 -0
- package/dist/chat-compliance-service.js +241 -0
- package/dist/chat-compliance-service.js.map +1 -0
- package/dist/chat-event-stream.d.ts +13 -0
- package/dist/chat-event-stream.js +124 -0
- package/dist/chat-event-stream.js.map +1 -0
- package/dist/chat-pagination.d.ts +6 -0
- package/dist/chat-pagination.js +64 -0
- package/dist/chat-pagination.js.map +1 -0
- package/dist/chat-storage-actor-validation.d.ts +4 -0
- package/dist/chat-storage-actor-validation.js +65 -0
- package/dist/chat-storage-actor-validation.js.map +1 -0
- package/dist/chat-storage-content-policy.d.ts +6 -0
- package/dist/chat-storage-content-policy.js +84 -0
- package/dist/chat-storage-content-policy.js.map +1 -0
- package/dist/chat-storage-errors.d.ts +20 -0
- package/dist/chat-storage-errors.js +17 -0
- package/dist/chat-storage-errors.js.map +1 -0
- package/dist/chat-storage-local-files.d.ts +17 -0
- package/dist/chat-storage-local-files.js +78 -0
- package/dist/chat-storage-local-files.js.map +1 -0
- package/dist/chat-storage-local-paths.d.ts +6 -0
- package/dist/chat-storage-local-paths.js +124 -0
- package/dist/chat-storage-local-paths.js.map +1 -0
- package/dist/chat-storage-local-projection.d.ts +10 -0
- package/dist/chat-storage-local-projection.js +55 -0
- package/dist/chat-storage-local-projection.js.map +1 -0
- package/dist/chat-storage-local-records.d.ts +13 -0
- package/dist/chat-storage-local-records.js +56 -0
- package/dist/chat-storage-local-records.js.map +1 -0
- package/dist/chat-storage-local.d.ts +6 -0
- package/dist/chat-storage-local.js +114 -0
- package/dist/chat-storage-local.js.map +1 -0
- package/dist/chat-storage-validation.d.ts +10 -0
- package/dist/chat-storage-validation.js +100 -0
- package/dist/chat-storage-validation.js.map +1 -0
- package/dist/chat-storage.d.ts +16 -0
- package/dist/chat-storage.js +4 -0
- package/dist/chat-storage.js.map +1 -0
- package/dist/chat-workflow-timeline.d.ts +17 -0
- package/dist/chat-workflow-timeline.js +210 -0
- package/dist/chat-workflow-timeline.js.map +1 -0
- package/dist/{workspace-claude-settings.d.ts → claude-settings.d.ts} +22 -3
- package/dist/{workspace-claude-settings.js → claude-settings.js} +28 -9
- package/dist/claude-settings.js.map +1 -0
- package/dist/command-init.d.ts +2 -0
- package/dist/command-init.js +150 -0
- package/dist/command-init.js.map +1 -0
- package/dist/command-manifest.js +1 -1
- package/dist/command-manifest.js.map +1 -1
- package/dist/commands.d.ts +1 -1
- package/dist/commands.js +1 -140
- package/dist/commands.js.map +1 -1
- package/dist/constants.d.ts +1 -0
- package/dist/constants.js +1 -0
- package/dist/constants.js.map +1 -1
- package/dist/context-runtime-preprocessor.d.ts +41 -0
- package/dist/context-runtime-preprocessor.js +199 -0
- package/dist/context-runtime-preprocessor.js.map +1 -0
- package/dist/cursor-settings.d.ts +25 -0
- package/dist/cursor-settings.js +72 -0
- package/dist/cursor-settings.js.map +1 -0
- package/dist/health-commands.js +43 -3
- package/dist/health-commands.js.map +1 -1
- package/dist/model-aliases.d.ts +5 -0
- package/dist/model-aliases.js +37 -0
- package/dist/model-aliases.js.map +1 -0
- package/dist/ollama-provider.js +25 -0
- package/dist/ollama-provider.js.map +1 -1
- package/dist/phase-playbooks.js +11 -0
- package/dist/phase-playbooks.js.map +1 -1
- package/dist/provider-agent-wrapper.js +14 -0
- package/dist/provider-agent-wrapper.js.map +1 -1
- package/dist/runtime-adapters.js +56 -0
- package/dist/runtime-adapters.js.map +1 -1
- package/dist/runtime-bootstrap.js +20 -22
- package/dist/runtime-bootstrap.js.map +1 -1
- package/dist/runtime-child-prompt.js +8 -0
- package/dist/runtime-child-prompt.js.map +1 -1
- package/dist/runtime-context-manifest.d.ts +4 -1
- package/dist/runtime-context-manifest.js +59 -3
- package/dist/runtime-context-manifest.js.map +1 -1
- package/dist/runtime-execution-adapters.js +19 -0
- package/dist/runtime-execution-adapters.js.map +1 -1
- package/dist/runtime-execution-renderer.js +4 -0
- package/dist/runtime-execution-renderer.js.map +1 -1
- package/dist/runtime-execution.js +13 -82
- package/dist/runtime-execution.js.map +1 -1
- package/dist/runtime-hooks.d.ts +46 -0
- package/dist/runtime-hooks.js +95 -0
- package/dist/runtime-hooks.js.map +1 -0
- package/dist/runtime-parent-actions.js +5 -0
- package/dist/runtime-parent-actions.js.map +1 -1
- package/dist/runtime-spawn-bridge.js +1 -0
- package/dist/runtime-spawn-bridge.js.map +1 -1
- package/dist/runtime-spawn-guidance.js +15 -61
- package/dist/runtime-spawn-guidance.js.map +1 -1
- package/dist/security/chat-guardrail-policy.d.ts +7 -0
- package/dist/security/chat-guardrail-policy.js +61 -0
- package/dist/security/chat-guardrail-policy.js.map +1 -0
- package/dist/security/chat-guardrail-types.d.ts +65 -0
- package/dist/security/chat-guardrail-types.js +2 -0
- package/dist/security/chat-guardrail-types.js.map +1 -0
- package/dist/security/chat-guardrail-validation.d.ts +9 -0
- package/dist/security/chat-guardrail-validation.js +64 -0
- package/dist/security/chat-guardrail-validation.js.map +1 -0
- package/dist/security/chat-guardrails.d.ts +3 -0
- package/dist/security/chat-guardrails.js +136 -0
- package/dist/security/chat-guardrails.js.map +1 -0
- package/dist/security/content-classifier.js +33 -1
- package/dist/security/content-classifier.js.map +1 -1
- package/dist/security/payment-card-detection.d.ts +3 -0
- package/dist/security/payment-card-detection.js +48 -0
- package/dist/security/payment-card-detection.js.map +1 -0
- package/dist/security/policy-types.d.ts +1 -1
- package/dist/security/provider-egress-policy.d.ts +27 -0
- package/dist/security/provider-egress-policy.js +72 -0
- package/dist/security/provider-egress-policy.js.map +1 -0
- package/dist/security/public-api-auth.d.ts +20 -0
- package/dist/security/public-api-auth.js +55 -0
- package/dist/security/public-api-auth.js.map +1 -0
- package/dist/security/public-api-policy.d.ts +8 -0
- package/dist/security/public-api-policy.js +40 -0
- package/dist/security/public-api-policy.js.map +1 -0
- package/dist/security/redaction.js +44 -13
- package/dist/security/redaction.js.map +1 -1
- package/dist/security/restricted-content-quarantine.d.ts +17 -0
- package/dist/security/restricted-content-quarantine.js +50 -0
- package/dist/security/restricted-content-quarantine.js.map +1 -0
- package/dist/security/restricted-data-classifier.d.ts +9 -0
- package/dist/security/restricted-data-classifier.js +254 -0
- package/dist/security/restricted-data-classifier.js.map +1 -0
- package/dist/skills-render.js +7 -14
- package/dist/skills-render.js.map +1 -1
- package/dist/telemetry-redaction.d.ts +2 -0
- package/dist/telemetry-redaction.js +25 -2
- package/dist/telemetry-redaction.js.map +1 -1
- package/dist/types/chat.d.ts +203 -0
- package/dist/types/chat.js +10 -0
- package/dist/types/chat.js.map +1 -0
- package/dist/types/model-config.d.ts +4 -0
- package/dist/types/public-api.d.ts +75 -0
- package/dist/types/public-api.js +2 -0
- package/dist/types/public-api.js.map +1 -0
- package/dist/types/restricted-data.d.ts +69 -0
- package/dist/types/restricted-data.js +8 -0
- package/dist/types/restricted-data.js.map +1 -0
- package/dist/types/restricted-fragment.d.ts +82 -0
- package/dist/types/restricted-fragment.js +14 -0
- package/dist/types/restricted-fragment.js.map +1 -0
- package/dist/types/runtime.d.ts +12 -0
- package/dist/types.d.ts +6 -0
- package/dist/types.js.map +1 -1
- package/dist/web-api.js +24 -0
- package/dist/web-api.js.map +1 -1
- package/dist/web-artifact-parsers.d.ts +6 -0
- package/dist/web-artifact-parsers.js +244 -0
- package/dist/web-artifact-parsers.js.map +1 -0
- package/dist/web-artifact-types.d.ts +76 -0
- package/dist/web-artifact-types.js +2 -0
- package/dist/web-artifact-types.js.map +1 -0
- package/dist/web-artifacts.d.ts +2 -43
- package/dist/web-artifacts.js +73 -58
- package/dist/web-artifacts.js.map +1 -1
- package/dist/web-chat-route-inputs.d.ts +11 -0
- package/dist/web-chat-route-inputs.js +156 -0
- package/dist/web-chat-route-inputs.js.map +1 -0
- package/dist/web-chat-routes.d.ts +7 -0
- package/dist/web-chat-routes.js +213 -0
- package/dist/web-chat-routes.js.map +1 -0
- package/dist/web-console/assets/index-CJup1cIA.css +1 -0
- package/dist/web-console/assets/index-CVDOfipu.js +11 -0
- package/dist/web-console/index.html +2 -2
- package/dist/web-evidence.d.ts +1 -1
- package/dist/web-evidence.js +9 -2
- package/dist/web-evidence.js.map +1 -1
- package/dist/web-public-route-inputs.d.ts +14 -0
- package/dist/web-public-route-inputs.js +136 -0
- package/dist/web-public-route-inputs.js.map +1 -0
- package/dist/web-public-routes.d.ts +6 -0
- package/dist/web-public-routes.js +194 -0
- package/dist/web-public-routes.js.map +1 -0
- package/dist/web-public-service.d.ts +16 -0
- package/dist/web-public-service.js +154 -0
- package/dist/web-public-service.js.map +1 -0
- package/dist/workflow-services.js +5 -0
- package/dist/workflow-services.js.map +1 -1
- package/dist/workspace-runtime-bootstrap.js +15 -4
- package/dist/workspace-runtime-bootstrap.js.map +1 -1
- package/docs/chat-audit-retention.md +76 -0
- package/docs/chat-provider-provenance-ledger.md +75 -0
- package/docs/context-runtime-preprocessing.md +37 -0
- package/docs/orchestra-mvp.md +8 -2
- package/docs/public-api-contract.md +43 -0
- package/docs/release-test-matrix.md +14 -14
- package/docs/restricted-fragment-storage-contract.md +147 -0
- package/docs/runtime-adapters.md +40 -7
- package/docs/site-manifest.json +128 -30
- package/package.json +5 -2
- package/site/dist/_headers +9 -0
- package/site/dist/_redirects +2 -0
- package/site/dist/architecture.mmd +61 -0
- package/site/dist/assets/index-Bi8l6tCE.js +10 -0
- package/site/dist/assets/index-BsCLqY__.css +1 -0
- package/site/dist/favicon.svg +19 -0
- package/site/dist/index.html +28 -0
- package/site/package.json +19 -0
- package/dist/web-console/assets/index-BHs7OIv8.css +0 -1
- package/dist/web-console/assets/index-BJuVTqfQ.js +0 -11
- package/dist/workspace-claude-settings.js.map +0 -1
package/dist/web-artifacts.js
CHANGED
|
@@ -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
|
|
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
|
-
|
|
71
|
-
|
|
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
|
-
!
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
174
|
-
}
|
|
175
|
-
|
|
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":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;
|
|
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
|