@jterrats/open-orchestra 1.0.17 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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/qa-e2e-artifacts.js +71 -3
- package/dist/qa-e2e-artifacts.js.map +1 -1
- package/dist/runtime-adapters.js +56 -0
- package/dist/runtime-adapters.js.map +1 -1
- package/dist/runtime-bootstrap.js +32 -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 +358 -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 +266 -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 +106 -57
- 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
|
@@ -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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-chat-routes.js","sourceRoot":"","sources":["../src/web-chat-routes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
:root{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--bg:#f6f7f9;--panel:#fff;--ink:#17202a;--muted:#5f6b7a;--line:#d8dee6;--accent:#146c94;--ok:#137a44;--warn:#a35f00;--focus:#146c9440}@media (prefers-color-scheme:dark){:root{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--bg:#111418;--panel:#1a2027;--ink:#edf1f5;--muted:#aab5c2;--line:#313b46;--accent:#6fb6d8;--ok:#68d391;--warn:#f0b45b;--focus:#6fb6d852}}*{box-sizing:border-box}html,body{max-width:100%;overflow-x:hidden}body{background:var(--bg);min-width:320px;color:var(--ink);margin:0;font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;line-height:1.45}a,code,pre,span,strong{overflow-wrap:anywhere}button,input,select,textarea{font:inherit}button:focus-visible,input:focus-visible,select:focus-visible,textarea:focus-visible,a:focus-visible{outline:3px solid var(--focus);outline-offset:-2px}.app-shell{grid-template-rows:auto 1fr;min-height:100vh;display:grid}.topbar{border-bottom:1px solid var(--line);background:var(--panel)}.topbar-inner,main{width:min(1180px,100%);margin:0 auto;padding:16px}.brand-row{justify-content:space-between;align-items:center;gap:12px;display:flex}.brand h1{letter-spacing:0;margin:0;font-size:1.15rem;font-weight:750}.brand p,.guide-card p,.empty-state p{color:var(--muted);margin:2px 0 0;font-size:.92rem}.refresh-button,.text-button{border:1px solid var(--accent);background:var(--accent);color:#fff;cursor:pointer;border-radius:6px;min-height:38px;padding:0 12px}.text-button.secondary{border-color:var(--line);background:var(--panel);color:var(--ink)}.text-button:disabled{cursor:not-allowed;opacity:.55}main{gap:16px;display:grid}.section-nav{z-index:5;background:color-mix(in srgb, var(--bg) 94%, transparent);gap:8px;padding:8px 0;display:flex;position:sticky;top:0;overflow-x:auto}.section-tab{border:1px solid var(--line);background:var(--panel);min-width:0;color:var(--ink);text-align:left;cursor:pointer;border-radius:8px;flex:0 0 170px;gap:2px;padding:10px 12px;display:grid}.section-tab.active{border-color:color-mix(in srgb, var(--accent) 56%, var(--line));background:color-mix(in srgb, var(--accent) 8%, var(--panel))}.section-tab strong{font-size:.9rem}.section-tab span,.section-heading p,.muted-copy{color:var(--muted);font-size:.84rem}.console-section,.overview-layout,.overview-column,.operations-layout,.section-column,.settings-layout,.tasks-layout{gap:12px;display:grid}.section-column{align-content:start}.section-column>*{align-self:start;width:100%}.section-heading{gap:2px;display:grid}.section-heading h2,.section-heading p{margin:0}.section-heading h2{font-size:1.08rem}.status-line{color:var(--muted);flex-wrap:wrap;align-items:center;gap:8px;font-size:.92rem;display:flex}.pill,.tag{border:1px solid var(--line);color:var(--muted);border-radius:999px;align-items:center;display:inline-flex}.pill{background:var(--panel);min-height:28px;padding:0 10px}.tag{padding:2px 8px;font-size:.78rem}.pill.ok,.tag.ok{color:var(--ok);border-color:#137a4459}.pill.warn,.tag.warn{color:var(--warn);border-color:#a35f0059}.pill.accent,.tag.accent{border-color:color-mix(in srgb, var(--accent) 35%, var(--line));color:var(--accent)}.grid,.guide-grid{grid-template-columns:1fr;align-items:start;gap:12px;display:grid}.grid>*,.guide-grid>*,.control-row>*,.metric-grid>*,.chart-grid>*{min-width:0}.panel,.guide-card,.subpanel{border:1px solid var(--line);background:var(--panel);border-radius:8px;min-width:0;padding:14px}.panel h2,.guide-card h2,.subpanel h3{letter-spacing:0;margin:0 0 10px;font-size:1rem}.subpanel{margin-top:12px}.warning-panel{border-color:color-mix(in srgb, var(--warn) 45%, var(--line));margin-bottom:12px}.compact-list{gap:8px;margin:0;padding:0;list-style:none;display:grid}.compact-list li{gap:3px;display:grid}.compact-list span{color:var(--muted);overflow-wrap:anywhere}.metric-grid,.chart-grid,.control-row{grid-template-columns:1fr;gap:10px;display:grid}.control-row.compact{grid-template-columns:minmax(140px,1fr) auto;align-items:end;margin-top:8px}.chart-grid{margin-top:12px}.cost-detail-grid{grid-template-columns:1fr;gap:10px;display:grid}.compact-subpanel{min-height:0;margin-top:12px}.compact-chart-grid .chart-card{min-height:0}.compact-chart-grid .chart-frame{min-height:90px}.compact-chart-grid .chart-frame canvas{height:90px}.settings-layout #cost-view .metric strong{overflow-wrap:anywhere;font-size:1.2rem}.chart-card,.metric,.list-item{border:1px solid var(--line);border-radius:6px;padding:10px}.chart-card{min-height:180px}.chart-card h3{letter-spacing:0;margin:0 0 8px;font-size:.9rem}.chart-frame{min-height:130px;position:relative}.chart-frame canvas{width:100%;height:130px}.metric{min-height:76px}.metric strong{font-size:1.45rem;line-height:1.1;display:block}.metric span,.list-item span{color:var(--muted);margin-top:4px;font-size:.85rem;display:block}.step-list,.command-list,.list,.detail-grid,.delivery-grid,.release-check-list,.release-detail-grid{gap:8px;display:grid}.step-list,.release-check-list,.list{margin:0;padding:0;list-style:none}.step-list{margin-top:12px}.step-list li{grid-template-columns:28px 1fr;align-items:start;gap:8px;display:grid}.step-list b{background:color-mix(in srgb, var(--accent) 18%, var(--panel));width:28px;height:28px;color:var(--accent);border-radius:999px;justify-content:center;align-items:center;font-size:.84rem;display:inline-flex}.command-chip{border:1px solid var(--line);background:color-mix(in srgb, var(--panel) 82%, var(--bg));color:var(--ink);white-space:normal;word-break:break-word;border-radius:6px;padding:9px 10px;font:.84rem/1.4 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;display:block}.command-disclosure{margin-top:10px}.command-disclosure summary{cursor:pointer;color:var(--accent);font-size:.9rem;font-weight:650}.command-disclosure .command-list{margin-top:8px}.detail-disclosure summary{cursor:pointer;color:var(--ink);font-weight:700}.detail-disclosure>.list,.detail-disclosure>.preview,.detail-disclosure>.markdown-summary,.detail-disclosure>.text-button{margin-top:10px}.markdown-summary{border:1px solid var(--line);background:#fff;border-radius:8px;gap:8px;max-height:320px;padding:12px;display:grid;overflow:auto}.markdown-summary h4,.markdown-summary p,.markdown-summary ul{margin:0}.markdown-summary h4{font-size:.95rem}.markdown-summary ul{padding-left:18px}.markdown-summary code{overflow-wrap:anywhere;border:1px solid var(--line);background:color-mix(in srgb, var(--panel) 82%, var(--bg));border-radius:6px;padding:8px;display:block}.preview{border:1px solid var(--line);background:color-mix(in srgb, var(--panel) 82%, var(--bg));max-height:220px;color:var(--ink);white-space:pre-wrap;border-radius:6px;padding:10px;font:.82rem/1.45 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;overflow:auto}.field{gap:4px;display:grid}.field span{color:var(--muted);font-size:.82rem}.field-label{align-items:center;gap:6px;display:inline-flex}.help-tooltip{border:1px solid var(--line);width:18px;height:18px;color:var(--ink);cursor:help;background:#fff;border-radius:50%;place-items:center;font-size:.72rem;font-weight:700;line-height:1;display:inline-grid;position:relative}.tooltip-bubble{z-index:20;color:#f8fafc;text-align:left;white-space:normal;background:#0f172a;border:1px solid #0f172a;border-radius:8px;width:min(260px,72vw);padding:8px 10px;font-size:.78rem;font-weight:500;line-height:1.4;display:none;position:absolute;bottom:calc(100% + 8px);left:50%;transform:translate(-50%);box-shadow:0 14px 36px #0f172a52}.field .tooltip-bubble{color:#f8fafc;font-size:.78rem}.tooltip-bubble:after{content:"";background:#0f172a;border-bottom:1px solid #0f172a;border-right:1px solid #0f172a;width:10px;height:10px;position:absolute;top:100%;left:50%;transform:translate(-50%,-5px)rotate(45deg)}.help-tooltip:hover .tooltip-bubble,.help-tooltip:focus .tooltip-bubble,.help-tooltip:focus-within .tooltip-bubble{display:block}.field input,.field select,.field textarea{border:1px solid var(--line);background:var(--panel);width:100%;min-width:0;color:var(--ink);border-radius:6px}.field input,.field select{min-height:38px;padding:0 10px}.field textarea{resize:vertical;min-height:120px;padding:10px}.workspace-selector{gap:10px;margin-bottom:12px;display:grid}.workspace-selector-actions{flex-wrap:wrap;gap:8px;display:flex}.inline-error{color:var(--warn);margin:8px 0 0;font-size:.85rem}.inline-status,.muted-copy{color:var(--muted);margin:8px 0 0;font-size:.85rem}.tag-row{flex-wrap:wrap;gap:6px;margin-top:8px;display:flex}.repair-row{flex-wrap:wrap;align-items:center;gap:8px;margin-top:8px;display:flex}.check-field{color:var(--muted);align-items:center;gap:6px;font-size:.85rem;display:inline-flex}.task-filters{grid-template-columns:1fr;gap:8px;display:grid}.task-filters>*{min-width:0}.task-internals-toggle{margin-top:10px}.artifact-list{color:var(--muted);margin:8px 0 0;padding-left:18px;font-size:.84rem}.review-copy{color:var(--muted);margin:8px 0 0;font-size:.86rem}.phase-timeline{gap:6px;margin:10px 0 0;padding:0;list-style:none;display:grid}.gate-history{border-top:1px solid var(--line);gap:6px;margin-top:10px;padding-top:8px;font-size:.84rem;display:grid}.gate-history>strong{font-size:.86rem}.gate-history ul{gap:6px;margin:0;padding:0;list-style:none;display:grid}.gate-history li{color:var(--muted);grid-template-columns:minmax(80px,1fr) minmax(72px,.7fr) minmax(88px,.8fr) minmax(120px,1.4fr);gap:8px;display:grid}.phase-timeline li{border-top:1px solid var(--line);grid-template-columns:minmax(56px,.7fr) minmax(110px,1fr) minmax(88px,.8fr) minmax(72px,.8fr);align-items:center;gap:8px;padding-top:6px;font-size:.83rem;display:grid}.phase-timeline span,.phase-timeline time{color:var(--muted)}.detail-block{border-top:1px solid var(--line);padding-top:10px}.detail-block h3{letter-spacing:0;margin:0 0 6px;font-size:.9rem}.detail-block ul{color:var(--muted);margin:0;padding-left:18px}.empty-state{border:1px dashed var(--line);background:color-mix(in srgb, var(--panel) 85%, var(--bg));border-radius:8px;padding:18px}.empty-state strong{margin-bottom:4px;display:block}.artifact-canvas{margin:18px 0}.chat-layout{gap:12px;display:grid}.chat-controls-panel,.chat-thread-panel,.chat-timeline-panel{align-content:start}.chat-scope-copy,.chat-composer-actions{flex-wrap:wrap;gap:8px;display:flex}.chat-thread-list,.chat-message-list{gap:10px;margin:0;padding:0;list-style:none;display:grid}.chat-thread-list{max-height:560px;overflow:auto}.chat-thread-button{border:1px solid var(--line);background:var(--panel);width:100%;min-height:72px;color:var(--ink);text-align:left;border-radius:6px;gap:4px;padding:10px;display:grid}.chat-thread-button.selected{border-color:color-mix(in srgb, var(--accent) 55%, var(--line));background:color-mix(in srgb, var(--accent) 8%, var(--panel))}.chat-thread-button span,.chat-thread-button small{color:var(--muted)}.chat-message-card{border:1px solid var(--line);background:color-mix(in srgb, var(--panel) 88%, var(--bg));border-radius:6px;gap:10px;padding:12px;display:grid}.chat-message-card.tone-ok{border-color:#137a4459}.chat-message-card.tone-warn{border-color:#a35f0059}.chat-message-card.tone-accent{border-color:color-mix(in srgb, var(--accent) 40%, var(--line))}.chat-message-header{flex-wrap:wrap;justify-content:space-between;align-items:start;gap:10px;display:flex}.chat-message-heading{gap:6px;display:grid}.chat-message-content{gap:8px;display:grid}.chat-message-content h3,.chat-message-content p,.chat-message-content ul,.chat-message-content pre{margin:0}.chat-message-content ul{padding-left:18px}.chat-message-content pre{border:1px solid var(--line);background:color-mix(in srgb, var(--panel) 80%, var(--bg));white-space:pre-wrap;border-radius:6px;padding:10px;font:.82rem/1.45 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;overflow:auto}.chat-event-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;margin:0;display:grid}.chat-event-grid div{min-width:0}.chat-event-grid dt{color:var(--muted);font-size:.8rem}.chat-event-grid dd{margin:2px 0 0}.chat-event-wide{grid-column:1/-1}.chat-composer{border-top:1px solid var(--line);gap:10px;margin-top:12px;padding-top:12px;display:grid}.panel-heading{justify-content:space-between;align-items:flex-start;gap:16px;display:flex}.compact-heading{align-items:center;margin-bottom:12px}.compact-heading h2{margin-bottom:0}.event-list-panel .list{gap:12px}.release-events-grid{align-items:stretch}.release-events-grid .event-list-panel{grid-template-rows:auto 1fr auto;display:grid}.release-events-grid .event-list-panel .list{align-content:start}.workflow-control-row{align-items:end}.workflow-rationale-row{grid-template-columns:1fr}.workflow-rationale-row .field{width:100%}.event-list-panel .list-item{padding:12px}.event-list-panel .list-item strong{line-height:1.3}.event-list-panel .list-item span{margin-top:6px;line-height:1.45}.list-count{color:var(--muted);white-space:nowrap;font-size:.82rem}.pagination-controls{color:var(--muted);grid-template-columns:minmax(92px,auto) 1fr minmax(72px,auto);align-items:center;gap:8px;margin-top:12px;font-size:.85rem;display:grid}.pagination-controls span{text-align:center}.release-check-list{gap:6px;margin-top:12px}.release-summary-card{align-content:start}.release-summary-metrics{grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;margin-top:8px;display:grid}.release-summary-metrics .metric{min-height:58px;padding:8px}.release-summary-metrics .metric strong{font-size:1.1rem}.release-check-row{border:1px solid var(--line);border-radius:6px;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:10px;padding:8px 10px;display:grid}.release-check-row strong,.release-check-row span{display:block}.release-check-row strong{line-height:1.25}.release-check-row div>span{color:var(--muted);margin-top:2px;font-size:.82rem}.compact-role-list{max-height:320px;margin-top:10px;overflow:auto}.playwright-plan-list,#qa-automation-planner .subpanel{margin-top:14px}.artifact-layout{gap:16px;min-height:420px;display:grid}.artifact-actions{flex-wrap:wrap;justify-content:flex-start;gap:8px;display:flex}.artifact-actions .disabled{pointer-events:none;opacity:.55}.artifact-index{align-content:start;gap:8px;max-height:520px;display:grid;overflow:auto}.artifact-group{gap:6px;display:grid}.artifact-group header{border:1px solid var(--line);background:color-mix(in srgb, var(--panel) 84%, var(--bg));border-radius:6px;flex-wrap:wrap;align-items:center;gap:6px;padding:6px 8px;font-size:.8rem;display:flex}.artifact-group header span{color:var(--muted)}.artifact-group ul{gap:8px;margin:0;padding:0;list-style:none;display:grid}.artifact-index button{text-align:left;border:1px solid var(--line);width:100%;min-height:58px;color:var(--text);background:#fff;gap:4px;display:grid}.artifact-index button.selected{border-color:var(--accent);background:color-mix(in srgb, var(--accent) 10%, #fff)}.artifact-index span,.artifact-preview pre{overflow-wrap:anywhere}.artifact-preview{border:1px solid var(--line);background:#fff;border-radius:8px;min-height:420px;overflow:hidden}.artifact-preview.error,.artifact-preview.source,.artifact-preview.state,.artifact-preview.unsupported{padding:16px;overflow:auto}.artifact-preview.unsupported{border-color:color-mix(in srgb, var(--warn) 48%, var(--line))}.artifact-preview pre{white-space:pre-wrap;margin:0}.artifact-preview.media{place-items:center;padding:12px;display:grid}.artifact-preview img{max-width:100%;max-height:520px}.canvas-toolbar{border-bottom:1px solid var(--line);flex-wrap:wrap;gap:8px;padding:10px;display:flex}.canvas-frame{cursor:grab;height:460px;overflow:hidden}.canvas-frame svg{background:#f8fafc;width:100%;height:100%}.canvas-frame line{stroke:#64748b;stroke-width:2px}.canvas-frame marker path{fill:#64748b}.canvas-node{cursor:move}.canvas-node rect{stroke:#334155;stroke-width:1.4px}.canvas-node text{fill:#111827;pointer-events:none;font-size:13px}.erd-preview{padding:14px;overflow:auto}.erd-heading{flex-wrap:wrap;justify-content:space-between;gap:8px;margin-bottom:12px;display:flex}.erd-heading span,.erd-table span,.erd-table small,.erd-relationships small{color:var(--muted)}.erd-layout,.erd-tables{gap:12px;display:grid}.erd-table{border:1px solid var(--line);border-radius:6px;overflow:hidden}.erd-table h3,.erd-relationships h3{background:color-mix(in srgb, var(--accent) 8%, var(--panel));margin:0;padding:8px 10px;font-size:.9rem}.erd-table ul,.erd-relationships ul{gap:0;margin:0;padding:0;list-style:none;display:grid}.erd-table li,.erd-relationships li{border-top:1px solid var(--line);grid-template-columns:minmax(120px,1fr) minmax(80px,.7fr) auto;align-items:center;gap:8px;padding:8px 10px;font-size:.84rem;display:grid}.erd-table em{border:1px solid var(--line);color:var(--accent);border-radius:999px;justify-self:start;padding:1px 7px;font-size:.74rem;font-style:normal}.erd-relationships{border:1px solid var(--line);border-radius:6px;overflow:hidden}.erd-relationships li{grid-template-columns:minmax(120px,1fr) auto minmax(120px,1fr)}.inline-success{color:#166534;font-weight:600}@media (width>=760px){.topbar-inner,main{padding:20px 24px}.grid{grid-template-columns:minmax(0,1.5fr) minmax(300px,.9fr)}.section-nav{grid-template-columns:repeat(8,minmax(0,1fr));display:grid;overflow-x:visible}.section-tab{flex-basis:auto}.guide-grid,.overview-layout,.operations-layout,.settings-layout{grid-template-columns:minmax(0,1.2fr) minmax(280px,.8fr)}.tasks-layout{grid-template-columns:minmax(0,1.2fr) minmax(320px,.8fr)}.chat-layout{grid-template-columns:minmax(260px,.8fr) minmax(280px,.9fr) minmax(0,1.4fr);align-items:start}.tasks-layout .panel:first-child{grid-row:span 2}.workflow-rationale-row .field{grid-column:1/-1;max-width:none}.cost-detail-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.metric-grid{grid-template-columns:repeat(4,minmax(0,1fr))}.chart-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.control-row{grid-template-columns:repeat(4,minmax(0,1fr));align-items:end}.task-filters{grid-template-columns:minmax(220px,1fr) minmax(140px,.45fr) minmax(140px,.45fr);align-items:end}.artifact-layout{grid-template-columns:minmax(220px,320px) 1fr}.erd-layout{grid-template-columns:minmax(0,1.2fr) minmax(260px,.8fr)}}
|