@jterrats/open-orchestra 1.0.16 → 1.0.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +44 -0
- package/CLAUDE.md +25 -2
- package/README.md +32 -9
- 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/benchmark.js +65 -27
- package/dist/benchmark.js.map +1 -1
- 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/metrics-commands.js +3 -0
- package/dist/metrics-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 +34 -11
- package/dist/runtime-bootstrap.js.map +1 -1
- package/dist/runtime-capacity-policy.d.ts +38 -0
- package/dist/runtime-capacity-policy.js +117 -0
- package/dist/runtime-capacity-policy.js.map +1 -0
- package/dist/runtime-capacity-scheduler-helpers.d.ts +40 -0
- package/dist/runtime-capacity-scheduler-helpers.js +111 -0
- package/dist/runtime-capacity-scheduler-helpers.js.map +1 -0
- package/dist/runtime-capacity-scheduler-state.d.ts +44 -0
- package/dist/runtime-capacity-scheduler-state.js +128 -0
- package/dist/runtime-capacity-scheduler-state.js.map +1 -0
- package/dist/runtime-capacity-scheduler.d.ts +34 -0
- package/dist/runtime-capacity-scheduler.js +193 -0
- package/dist/runtime-capacity-scheduler.js.map +1 -0
- package/dist/runtime-capacity-snapshot.d.ts +14 -0
- package/dist/runtime-capacity-snapshot.js +87 -0
- package/dist/runtime-capacity-snapshot.js.map +1 -0
- package/dist/runtime-child-prompt.d.ts +2 -1
- package/dist/runtime-child-prompt.js +12 -1
- package/dist/runtime-child-prompt.js.map +1 -1
- package/dist/runtime-claude-native-bridge.js +2 -1
- package/dist/runtime-claude-native-bridge.js.map +1 -1
- package/dist/runtime-commands.js +6 -0
- package/dist/runtime-commands.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-lifecycle-watch.d.ts +5 -2
- package/dist/runtime-lifecycle-watch.js +19 -3
- package/dist/runtime-lifecycle-watch.js.map +1 -1
- package/dist/runtime-load-balancer.d.ts +12 -0
- package/dist/runtime-load-balancer.js +106 -0
- package/dist/runtime-load-balancer.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 +24 -0
- package/dist/runtime-spawn-bridge.js.map +1 -1
- package/dist/runtime-spawn-guidance.js +15 -46
- package/dist/runtime-spawn-guidance.js.map +1 -1
- package/dist/runtime-worker-registry.d.ts +19 -0
- package/dist/runtime-worker-registry.js +84 -0
- package/dist/runtime-worker-registry.js.map +1 -0
- 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.d.ts +2 -0
- package/dist/security/content-classifier.js +179 -0
- package/dist/security/content-classifier.js.map +1 -0
- package/dist/security/operation-contract-types.d.ts +28 -0
- package/dist/security/operation-contract-types.js +2 -0
- package/dist/security/operation-contract-types.js.map +1 -0
- package/dist/security/operation-contract.d.ts +2 -0
- package/dist/security/operation-contract.js +169 -0
- package/dist/security/operation-contract.js.map +1 -0
- 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-engine.d.ts +2 -0
- package/dist/security/policy-engine.js +142 -0
- package/dist/security/policy-engine.js.map +1 -0
- package/dist/security/policy-types.d.ts +79 -0
- package/dist/security/policy-types.js +7 -0
- package/dist/security/policy-types.js.map +1 -0
- package/dist/security/prompt-intake.d.ts +13 -0
- package/dist/security/prompt-intake.js +33 -0
- package/dist/security/prompt-intake.js.map +1 -0
- 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.d.ts +3 -0
- package/dist/security/redaction.js +95 -0
- package/dist/security/redaction.js.map +1 -0
- 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/security/sink-encoding.d.ts +6 -0
- package/dist/security/sink-encoding.js +40 -0
- package/dist/security/sink-encoding.js.map +1 -0
- package/dist/skills-render.js +7 -14
- package/dist/skills-render.js.map +1 -1
- package/dist/sprint-commands.js +33 -22
- package/dist/sprint-commands.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/transcription-failures.d.ts +2 -0
- package/dist/transcription-failures.js +4 -0
- package/dist/transcription-failures.js.map +1 -0
- package/dist/transcription-media-preflight.d.ts +9 -0
- package/dist/transcription-media-preflight.js +147 -0
- package/dist/transcription-media-preflight.js.map +1 -0
- package/dist/transcription-request.d.ts +13 -0
- package/dist/transcription-request.js +150 -0
- package/dist/transcription-request.js.map +1 -0
- package/dist/transcription-source-policy.d.ts +4 -0
- package/dist/transcription-source-policy.js +43 -0
- package/dist/transcription-source-policy.js.map +1 -0
- package/dist/transcription-types.d.ts +161 -0
- package/dist/transcription-types.js +2 -0
- package/dist/transcription-types.js.map +1 -0
- 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 +159 -0
- package/dist/types.d.ts +9 -1
- package/dist/types.js +1 -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-phase-planner.js +5 -3
- package/dist/workflow-phase-planner.js.map +1 -1
- package/dist/workflow-phases.js +5 -0
- package/dist/workflow-phases.js.map +1 -1
- package/dist/workflow-run-commands.js +89 -10
- package/dist/workflow-run-commands.js.map +1 -1
- 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/audio-video-transcription-skill.md +102 -70
- 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 +47 -7
- package/docs/runtime-capacity.md +57 -0
- package/docs/security-saas-orchestrator.md +368 -0
- 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,125 @@
|
|
|
1
|
+
import { assertMatchingScope, ChatStorageError, CHAT_SCHEMA_VERSION, } from "./chat-storage.js";
|
|
2
|
+
import { ChatApiError } from "./chat-api-errors.js";
|
|
3
|
+
import { evaluateChatGuardrail } from "./security/chat-guardrails.js";
|
|
4
|
+
import { actorId, exportPolicy, hashBody, idempotentMessageId, notFound, provenance, referencesFor, requestIdFor, requireText, retention, } from "./chat-api-records.js";
|
|
5
|
+
export async function persistChatMessage(input) {
|
|
6
|
+
const requestId = requestIdFor(input.message.requestId);
|
|
7
|
+
const idempotencyKey = requireText(input.message.idempotencyKey, "idempotencyKey", requestId);
|
|
8
|
+
const thread = await input.storage.getThread(input.message.scope, input.message.threadId);
|
|
9
|
+
if (!thread)
|
|
10
|
+
throw notFound("thread_not_found", requestId);
|
|
11
|
+
assertMatchingScope(input.message.scope, thread.scope, "thread.scope");
|
|
12
|
+
const text = requireText(input.message.text, "text", requestId);
|
|
13
|
+
const bodyHash = hashBody(text);
|
|
14
|
+
const messageId = idempotentMessageId(input.message.scope, input.message.threadId, input.action, idempotencyKey);
|
|
15
|
+
const guardrail = evaluateChatGuardrail({
|
|
16
|
+
requestId,
|
|
17
|
+
tenantId: input.message.scope.tenantId,
|
|
18
|
+
workspaceId: input.message.scope.workspaceId,
|
|
19
|
+
taskId: input.message.scope.taskId,
|
|
20
|
+
runId: input.message.scope.runId,
|
|
21
|
+
threadId: input.message.threadId,
|
|
22
|
+
messageId,
|
|
23
|
+
actor: {
|
|
24
|
+
id: actorId(input.message.actor),
|
|
25
|
+
actorType: input.message.actor.kind === "human" ? "human" : "runtime",
|
|
26
|
+
tenantId: input.message.scope.tenantId,
|
|
27
|
+
workspaceId: input.message.scope.workspaceId,
|
|
28
|
+
},
|
|
29
|
+
action: input.action,
|
|
30
|
+
sink: { kind: "json" },
|
|
31
|
+
resource: {
|
|
32
|
+
resourceType: "message",
|
|
33
|
+
summary: "chat message",
|
|
34
|
+
tenantId: input.message.scope.tenantId,
|
|
35
|
+
workspaceId: input.message.scope.workspaceId,
|
|
36
|
+
},
|
|
37
|
+
segments: [
|
|
38
|
+
{
|
|
39
|
+
id: `${requestId}:message`,
|
|
40
|
+
kind: "instruction",
|
|
41
|
+
provenance: input.message.actor.kind,
|
|
42
|
+
text,
|
|
43
|
+
sink: "json",
|
|
44
|
+
},
|
|
45
|
+
],
|
|
46
|
+
});
|
|
47
|
+
if (!guardrail.canProceed) {
|
|
48
|
+
throw new ChatApiError("policy_blocked", guardrail.sanitizedReasons[0] ?? "chat message blocked by policy", 403, requestId);
|
|
49
|
+
}
|
|
50
|
+
const existing = await findMessage(input.storage, input.message.scope, input.message.threadId, messageId);
|
|
51
|
+
if (existing) {
|
|
52
|
+
if (existing.provenance.sourceId !== bodyHash) {
|
|
53
|
+
throw new ChatApiError("idempotency_conflict", "idempotency key was already used with a different payload", 409, requestId);
|
|
54
|
+
}
|
|
55
|
+
return replay(existing, requestId, idempotencyKey, guardrail.requestId);
|
|
56
|
+
}
|
|
57
|
+
const message = await buildMessage(input, messageId, bodyHash, guardrail);
|
|
58
|
+
try {
|
|
59
|
+
return {
|
|
60
|
+
message: await input.storage.appendMessage(input.message.scope, message),
|
|
61
|
+
meta: {
|
|
62
|
+
requestId,
|
|
63
|
+
idempotencyKey,
|
|
64
|
+
policyDecisionId: guardrail.requestId,
|
|
65
|
+
},
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
if (error instanceof ChatStorageError &&
|
|
70
|
+
error.code === "duplicate_record") {
|
|
71
|
+
const duplicate = await findMessage(input.storage, input.message.scope, input.message.threadId, messageId);
|
|
72
|
+
if (duplicate && duplicate.provenance.sourceId === bodyHash) {
|
|
73
|
+
return replay(duplicate, requestId, idempotencyKey, guardrail.requestId);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
throw error;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
async function buildMessage(input, messageId, bodyHash, guardrail) {
|
|
80
|
+
const allMessages = await input.storage.listMessages(input.message.scope, input.message.threadId);
|
|
81
|
+
const now = input.now();
|
|
82
|
+
return {
|
|
83
|
+
schemaVersion: CHAT_SCHEMA_VERSION,
|
|
84
|
+
id: messageId,
|
|
85
|
+
threadId: input.message.threadId,
|
|
86
|
+
scope: input.message.scope,
|
|
87
|
+
actor: input.message.actor,
|
|
88
|
+
provenance: provenance("user_input", bodyHash, now, guardrail.requestId),
|
|
89
|
+
createdAt: now,
|
|
90
|
+
sequence: allMessages.messages.length + 1,
|
|
91
|
+
content: {
|
|
92
|
+
format: input.message.format ?? "plain_text",
|
|
93
|
+
text: guardrail.redactedSegments[0]?.text ?? input.message.text,
|
|
94
|
+
},
|
|
95
|
+
contentState: "redacted",
|
|
96
|
+
retention: retention(now),
|
|
97
|
+
redaction: {
|
|
98
|
+
policyId: "chat-api-redaction",
|
|
99
|
+
status: "applied",
|
|
100
|
+
redactedAt: now,
|
|
101
|
+
redactedByActorId: "chat-api",
|
|
102
|
+
markerCount: Math.max(0, guardrail.redactedSegments.length),
|
|
103
|
+
summary: "Chat guardrail redaction applied before persistence.",
|
|
104
|
+
},
|
|
105
|
+
export: exportPolicy(now),
|
|
106
|
+
delete: { status: "active", policyId: "chat-delete-logical" },
|
|
107
|
+
references: referencesFor(input.message.scope),
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
async function findMessage(storage, scope, threadId, messageId) {
|
|
111
|
+
const messages = await storage.listMessages(scope, threadId);
|
|
112
|
+
return messages.messages.find((message) => message.id === messageId);
|
|
113
|
+
}
|
|
114
|
+
function replay(message, requestId, idempotencyKey, policyDecisionId) {
|
|
115
|
+
return {
|
|
116
|
+
message,
|
|
117
|
+
meta: {
|
|
118
|
+
requestId,
|
|
119
|
+
idempotencyKey,
|
|
120
|
+
idempotentReplay: true,
|
|
121
|
+
policyDecisionId,
|
|
122
|
+
},
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=chat-api-message-persistence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-api-message-persistence.js","sourceRoot":"","sources":["../src/chat-api-message-persistence.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EACL,OAAO,EACP,YAAY,EACZ,QAAQ,EACR,mBAAmB,EACnB,QAAQ,EACR,UAAU,EACV,aAAa,EACb,YAAY,EACZ,WAAW,EACX,SAAS,GACV,MAAM,uBAAuB,CAAC;AAI/B,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,KAKxC;IAIC,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACxD,MAAM,cAAc,GAAG,WAAW,CAChC,KAAK,CAAC,OAAO,CAAC,cAAc,EAC5B,gBAAgB,EAChB,SAAS,CACV,CAAC;IACF,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,SAAS,CAC1C,KAAK,CAAC,OAAO,CAAC,KAAK,EACnB,KAAK,CAAC,OAAO,CAAC,QAAQ,CACvB,CAAC;IACF,IAAI,CAAC,MAAM;QAAE,MAAM,QAAQ,CAAC,kBAAkB,EAAE,SAAS,CAAC,CAAC;IAC3D,mBAAmB,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;IAEvE,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IAChE,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,SAAS,GAAG,mBAAmB,CACnC,KAAK,CAAC,OAAO,CAAC,KAAK,EACnB,KAAK,CAAC,OAAO,CAAC,QAAQ,EACtB,KAAK,CAAC,MAAM,EACZ,cAAc,CACf,CAAC;IACF,MAAM,SAAS,GAAG,qBAAqB,CAAC;QACtC,SAAS;QACT,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ;QACtC,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW;QAC5C,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM;QAClC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK;QAChC,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,QAAQ;QAChC,SAAS;QACT,KAAK,EAAE;YACL,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YAChC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;YACrE,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ;YACtC,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW;SAC7C;QACD,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;QACtB,QAAQ,EAAE;YACR,YAAY,EAAE,SAAS;YACvB,OAAO,EAAE,cAAc;YACvB,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ;YACtC,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW;SAC7C;QACD,QAAQ,EAAE;YACR;gBACE,EAAE,EAAE,GAAG,SAAS,UAAU;gBAC1B,IAAI,EAAE,aAAa;gBACnB,UAAU,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI;gBACpC,IAAI;gBACJ,IAAI,EAAE,MAAM;aACb;SACF;KACF,CAAC,CAAC;IACH,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC;QAC1B,MAAM,IAAI,YAAY,CACpB,gBAAgB,EAChB,SAAS,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,gCAAgC,EACjE,GAAG,EACH,SAAS,CACV,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,WAAW,CAChC,KAAK,CAAC,OAAO,EACb,KAAK,CAAC,OAAO,CAAC,KAAK,EACnB,KAAK,CAAC,OAAO,CAAC,QAAQ,EACtB,SAAS,CACV,CAAC;IACF,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,QAAQ,CAAC,UAAU,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC9C,MAAM,IAAI,YAAY,CACpB,sBAAsB,EACtB,2DAA2D,EAC3D,GAAG,EACH,SAAS,CACV,CAAC;QACJ,CAAC;QACD,OAAO,MAAM,CAAC,QAAQ,EAAE,SAAS,EAAE,cAAc,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC1E,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC1E,IAAI,CAAC;QACH,OAAO;YACL,OAAO,EAAE,MAAM,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC;YACxE,IAAI,EAAE;gBACJ,SAAS;gBACT,cAAc;gBACd,gBAAgB,EAAE,SAAS,CAAC,SAAS;aACtC;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IACE,KAAK,YAAY,gBAAgB;YACjC,KAAK,CAAC,IAAI,KAAK,kBAAkB,EACjC,CAAC;YACD,MAAM,SAAS,GAAG,MAAM,WAAW,CACjC,KAAK,CAAC,OAAO,EACb,KAAK,CAAC,OAAO,CAAC,KAAK,EACnB,KAAK,CAAC,OAAO,CAAC,QAAQ,EACtB,SAAS,CACV,CAAC;YACF,IAAI,SAAS,IAAI,SAAS,CAAC,UAAU,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBAC5D,OAAO,MAAM,CACX,SAAS,EACT,SAAS,EACT,cAAc,EACd,SAAS,CAAC,SAAS,CACpB,CAAC;YACJ,CAAC;QACH,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,YAAY,CACzB,KAA+C,EAC/C,SAAiB,EACjB,QAAgB,EAChB,SAAsE;IAEtE,MAAM,WAAW,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,YAAY,CAClD,KAAK,CAAC,OAAO,CAAC,KAAK,EACnB,KAAK,CAAC,OAAO,CAAC,QAAQ,CACvB,CAAC;IACF,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;IACxB,OAAO;QACL,aAAa,EAAE,mBAAmB;QAClC,EAAE,EAAE,SAAS;QACb,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,QAAQ;QAChC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK;QAC1B,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK;QAC1B,UAAU,EAAE,UAAU,CAAC,YAAY,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,CAAC,SAAS,CAAC;QACxE,SAAS,EAAE,GAAG;QACd,QAAQ,EAAE,WAAW,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;QACzC,OAAO,EAAE;YACP,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,IAAI,YAAY;YAC5C,IAAI,EAAE,SAAS,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI;SAChE;QACD,YAAY,EAAE,UAAU;QACxB,SAAS,EAAE,SAAS,CAAC,GAAG,CAAC;QACzB,SAAS,EAAE;YACT,QAAQ,EAAE,oBAAoB;YAC9B,MAAM,EAAE,SAAS;YACjB,UAAU,EAAE,GAAG;YACf,iBAAiB,EAAE,UAAU;YAC7B,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,gBAAgB,CAAC,MAAM,CAAC;YAC3D,OAAO,EAAE,sDAAsD;SAChE;QACD,MAAM,EAAE,YAAY,CAAC,GAAG,CAAC;QACzB,MAAM,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,qBAAqB,EAAE;QAC7D,UAAU,EAAE,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;KAC/C,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,WAAW,CACxB,OAAoB,EACpB,KAAgB,EAChB,QAAgB,EAChB,SAAiB;IAEjB,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC7D,OAAO,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;AACvE,CAAC;AAED,SAAS,MAAM,CACb,OAAoB,EACpB,SAAiB,EACjB,cAAsB,EACtB,gBAAwB;IAExB,OAAO;QACL,OAAO;QACP,IAAI,EAAE;YACJ,SAAS;YACT,cAAc;YACd,gBAAgB,EAAE,IAAI;YACtB,gBAAgB;SACjB;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { ChatApiError } from "./chat-api-errors.js";
|
|
2
|
+
import type { ChatApiMeta } from "./chat-api-types.js";
|
|
3
|
+
import type { ChatActor, ChatThread, ChatProvenance, ChatReference, ChatScope } from "./types/chat.js";
|
|
4
|
+
export declare function requestIdFor(requestId: string | undefined): string;
|
|
5
|
+
export declare function requireText(value: string | undefined, field: string, requestId: string): string;
|
|
6
|
+
export declare function notFound(code: string, requestId: string): ChatApiError;
|
|
7
|
+
export declare function hashBody(text: string): string;
|
|
8
|
+
export declare function idempotentMessageId(scope: ChatScope, threadId: string, action: string, idempotencyKey: string): string;
|
|
9
|
+
export declare function provenance(sourceKind: "user_input", sourceId: string, createdAt: string, policyDecisionId?: string): ChatProvenance;
|
|
10
|
+
export declare function retention(decidedAt: string): {
|
|
11
|
+
policyId: string;
|
|
12
|
+
status: "redacted_only";
|
|
13
|
+
rawPersistence: "forbidden";
|
|
14
|
+
decidedAt: string;
|
|
15
|
+
};
|
|
16
|
+
export declare function exportPolicy(decidedAt: string): {
|
|
17
|
+
status: "redacted_only";
|
|
18
|
+
rawContentExportable: boolean;
|
|
19
|
+
policyId: string;
|
|
20
|
+
decidedAt: string;
|
|
21
|
+
};
|
|
22
|
+
export declare function referencesFor(scope: ChatScope): ChatReference[];
|
|
23
|
+
export declare function actorId(actor: ChatActor): string;
|
|
24
|
+
export declare function listOptions(limit?: number, cursor?: string): {
|
|
25
|
+
cursor?: string;
|
|
26
|
+
limit?: number;
|
|
27
|
+
};
|
|
28
|
+
export declare function apiMeta(requestId: string, options?: Omit<ChatApiMeta, "requestId">): ChatApiMeta;
|
|
29
|
+
export declare function buildChatThread(input: {
|
|
30
|
+
scope: ChatScope;
|
|
31
|
+
title: string;
|
|
32
|
+
actor: ChatActor;
|
|
33
|
+
requestId: string;
|
|
34
|
+
now: string;
|
|
35
|
+
}): ChatThread;
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
2
|
+
import { ChatApiError } from "./chat-api-errors.js";
|
|
3
|
+
import { CHAT_SCHEMA_VERSION } from "./chat-storage.js";
|
|
4
|
+
export function requestIdFor(requestId) {
|
|
5
|
+
return requestId?.trim() || `chat-${randomUUID()}`;
|
|
6
|
+
}
|
|
7
|
+
export function requireText(value, field, requestId) {
|
|
8
|
+
if (!value?.trim()) {
|
|
9
|
+
throw new ChatApiError("invalid_request", `${field} is required`, 400, requestId);
|
|
10
|
+
}
|
|
11
|
+
return value.trim();
|
|
12
|
+
}
|
|
13
|
+
export function notFound(code, requestId) {
|
|
14
|
+
return new ChatApiError(code, "chat resource was not found", 404, requestId);
|
|
15
|
+
}
|
|
16
|
+
export function hashBody(text) {
|
|
17
|
+
return createHash("sha256").update(text).digest("base64url");
|
|
18
|
+
}
|
|
19
|
+
export function idempotentMessageId(scope, threadId, action, idempotencyKey) {
|
|
20
|
+
return `message-${createHash("sha256")
|
|
21
|
+
.update([
|
|
22
|
+
scope.tenantId,
|
|
23
|
+
scope.workspaceId,
|
|
24
|
+
scope.taskId,
|
|
25
|
+
scope.runId,
|
|
26
|
+
scope.phase,
|
|
27
|
+
scope.sessionId,
|
|
28
|
+
threadId,
|
|
29
|
+
action,
|
|
30
|
+
idempotencyKey,
|
|
31
|
+
].join("\u001f"))
|
|
32
|
+
.digest("base64url")
|
|
33
|
+
.slice(0, 24)}`;
|
|
34
|
+
}
|
|
35
|
+
export function provenance(sourceKind, sourceId, createdAt, policyDecisionId) {
|
|
36
|
+
return {
|
|
37
|
+
sourceKind,
|
|
38
|
+
sourceId,
|
|
39
|
+
createdAt,
|
|
40
|
+
observedAt: createdAt,
|
|
41
|
+
...(policyDecisionId ? { policyDecisionId } : {}),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
export function retention(decidedAt) {
|
|
45
|
+
return {
|
|
46
|
+
policyId: "chat-api-retain-redacted",
|
|
47
|
+
status: "redacted_only",
|
|
48
|
+
rawPersistence: "forbidden",
|
|
49
|
+
decidedAt,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
export function exportPolicy(decidedAt) {
|
|
53
|
+
return {
|
|
54
|
+
status: "redacted_only",
|
|
55
|
+
rawContentExportable: false,
|
|
56
|
+
policyId: "chat-api-export-redacted",
|
|
57
|
+
decidedAt,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
export function referencesFor(scope) {
|
|
61
|
+
return [
|
|
62
|
+
{ kind: "task", id: scope.taskId },
|
|
63
|
+
{ kind: "workflow_run", id: scope.runId },
|
|
64
|
+
];
|
|
65
|
+
}
|
|
66
|
+
export function actorId(actor) {
|
|
67
|
+
return actor.actorId;
|
|
68
|
+
}
|
|
69
|
+
export function listOptions(limit, cursor) {
|
|
70
|
+
return {
|
|
71
|
+
...(limit !== undefined ? { limit } : {}),
|
|
72
|
+
...(cursor !== undefined ? { cursor } : {}),
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
export function apiMeta(requestId, options = {}) {
|
|
76
|
+
return { requestId, ...options };
|
|
77
|
+
}
|
|
78
|
+
export function buildChatThread(input) {
|
|
79
|
+
return {
|
|
80
|
+
schemaVersion: CHAT_SCHEMA_VERSION,
|
|
81
|
+
id: `thread-${randomUUID()}`,
|
|
82
|
+
scope: input.scope,
|
|
83
|
+
title: requireText(input.title, "title", input.requestId),
|
|
84
|
+
createdAt: input.now,
|
|
85
|
+
updatedAt: input.now,
|
|
86
|
+
actor: input.actor,
|
|
87
|
+
provenance: provenance("user_input", input.requestId, input.now),
|
|
88
|
+
retention: retention(input.now),
|
|
89
|
+
export: exportPolicy(input.now),
|
|
90
|
+
delete: { status: "active", policyId: "chat-delete-logical" },
|
|
91
|
+
contentState: "redacted",
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=chat-api-records.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-api-records.js","sourceRoot":"","sources":["../src/chat-api-records.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { ChatStorage } from "./chat-storage.js";
|
|
2
|
+
export { ChatApiError } from "./chat-api-errors.js";
|
|
3
|
+
import type { ChatStreamEvent, ChatApiSuccess, ChatMessageInput, ChatMessagesInput, ChatSendInput, ChatSendResult, ChatThreadInput, CreateChatThreadInput, ListChatInput } from "./chat-api-types.js";
|
|
4
|
+
import type { ChatMessage, ChatThread } from "./types/chat.js";
|
|
5
|
+
export interface ChatApiServiceOptions {
|
|
6
|
+
storage: ChatStorage;
|
|
7
|
+
root?: string;
|
|
8
|
+
now?: () => string;
|
|
9
|
+
}
|
|
10
|
+
export declare class ChatApiService {
|
|
11
|
+
private readonly storage;
|
|
12
|
+
private readonly root;
|
|
13
|
+
private readonly now;
|
|
14
|
+
constructor(options: ChatApiServiceOptions);
|
|
15
|
+
createThread(input: CreateChatThreadInput): Promise<ChatApiSuccess<ChatThread>>;
|
|
16
|
+
listThreads(input: ListChatInput): Promise<ChatApiSuccess<{
|
|
17
|
+
threads: ChatThread[];
|
|
18
|
+
}>>;
|
|
19
|
+
getThread(input: ChatThreadInput): Promise<ChatApiSuccess<{
|
|
20
|
+
thread: ChatThread;
|
|
21
|
+
}>>;
|
|
22
|
+
listMessages(input: ChatMessagesInput): Promise<ChatApiSuccess<{
|
|
23
|
+
messages: ChatMessage[];
|
|
24
|
+
}>>;
|
|
25
|
+
createMessage(input: ChatMessageInput): Promise<ChatApiSuccess<ChatMessage>>;
|
|
26
|
+
send(input: ChatSendInput): Promise<ChatApiSuccess<ChatSendResult>>;
|
|
27
|
+
stream(input: ChatMessagesInput): Promise<ChatApiSuccess<{
|
|
28
|
+
events: ChatStreamEvent[];
|
|
29
|
+
}>>;
|
|
30
|
+
private persistMessage;
|
|
31
|
+
private listAllStoredMessages;
|
|
32
|
+
}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
export { ChatApiError } from "./chat-api-errors.js";
|
|
2
|
+
import { eventsForStoredMessage } from "./chat-event-stream.js";
|
|
3
|
+
import { listWorkflowTimelineMessages, mergeTimelineMessages, } from "./chat-workflow-timeline.js";
|
|
4
|
+
import { apiMeta, buildChatThread, listOptions, notFound, requestIdFor, } from "./chat-api-records.js";
|
|
5
|
+
import { safeCursorList } from "./chat-api-storage.js";
|
|
6
|
+
import { persistChatMessage } from "./chat-api-message-persistence.js";
|
|
7
|
+
export class ChatApiService {
|
|
8
|
+
storage;
|
|
9
|
+
root;
|
|
10
|
+
now;
|
|
11
|
+
constructor(options) {
|
|
12
|
+
this.storage = options.storage;
|
|
13
|
+
this.root = options.root ?? process.cwd();
|
|
14
|
+
this.now = options.now ?? (() => new Date().toISOString());
|
|
15
|
+
}
|
|
16
|
+
async createThread(input) {
|
|
17
|
+
const requestId = requestIdFor(input.requestId);
|
|
18
|
+
const now = this.now();
|
|
19
|
+
const thread = buildChatThread({
|
|
20
|
+
scope: input.scope,
|
|
21
|
+
title: input.title,
|
|
22
|
+
actor: input.actor,
|
|
23
|
+
requestId,
|
|
24
|
+
now,
|
|
25
|
+
});
|
|
26
|
+
return {
|
|
27
|
+
data: await this.storage.createThread(input.scope, thread),
|
|
28
|
+
meta: { requestId },
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
async listThreads(input) {
|
|
32
|
+
const requestId = requestIdFor(input.requestId);
|
|
33
|
+
const result = await safeCursorList(() => this.storage.listThreads(input.scope, {
|
|
34
|
+
...listOptions(input.limit, input.cursor),
|
|
35
|
+
}), requestId);
|
|
36
|
+
return {
|
|
37
|
+
data: { threads: result.threads },
|
|
38
|
+
meta: apiMeta(requestId, {
|
|
39
|
+
...(result.nextCursor ? { nextCursor: result.nextCursor } : {}),
|
|
40
|
+
}),
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
async getThread(input) {
|
|
44
|
+
const requestId = requestIdFor(input.requestId);
|
|
45
|
+
const thread = await this.storage.getThread(input.scope, input.threadId);
|
|
46
|
+
if (!thread)
|
|
47
|
+
throw notFound("thread_not_found", requestId);
|
|
48
|
+
return { data: { thread }, meta: { requestId } };
|
|
49
|
+
}
|
|
50
|
+
async listMessages(input) {
|
|
51
|
+
const requestId = requestIdFor(input.requestId);
|
|
52
|
+
const result = await safeCursorList(async () => {
|
|
53
|
+
const storedMessages = await this.listAllStoredMessages(input.scope, input.threadId);
|
|
54
|
+
const workflowMessages = await listWorkflowTimelineMessages({
|
|
55
|
+
root: this.root,
|
|
56
|
+
scope: input.scope,
|
|
57
|
+
threadId: input.threadId,
|
|
58
|
+
});
|
|
59
|
+
return mergeTimelineMessages({
|
|
60
|
+
storedMessages,
|
|
61
|
+
workflowMessages,
|
|
62
|
+
scope: input.scope,
|
|
63
|
+
threadId: input.threadId,
|
|
64
|
+
...listOptions(input.limit, input.cursor),
|
|
65
|
+
});
|
|
66
|
+
}, requestId);
|
|
67
|
+
return {
|
|
68
|
+
data: { messages: result.messages },
|
|
69
|
+
meta: apiMeta(requestId, {
|
|
70
|
+
...(result.nextCursor ? { nextCursor: result.nextCursor } : {}),
|
|
71
|
+
}),
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
async createMessage(input) {
|
|
75
|
+
const result = await this.persistMessage(input, "messagePersist");
|
|
76
|
+
return {
|
|
77
|
+
data: result.message,
|
|
78
|
+
meta: result.meta,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
async send(input) {
|
|
82
|
+
const persisted = await this.persistMessage(input, "providerMessage");
|
|
83
|
+
return {
|
|
84
|
+
data: {
|
|
85
|
+
message: persisted.message,
|
|
86
|
+
events: eventsForStoredMessage(persisted.message),
|
|
87
|
+
},
|
|
88
|
+
meta: persisted.meta,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
async stream(input) {
|
|
92
|
+
const messages = await this.listMessages(input);
|
|
93
|
+
return {
|
|
94
|
+
data: { events: messages.data.messages.flatMap(eventsForStoredMessage) },
|
|
95
|
+
meta: messages.meta,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
async persistMessage(input, action) {
|
|
99
|
+
return persistChatMessage({
|
|
100
|
+
storage: this.storage,
|
|
101
|
+
now: this.now,
|
|
102
|
+
message: input,
|
|
103
|
+
action,
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
async listAllStoredMessages(scope, threadId) {
|
|
107
|
+
const messages = [];
|
|
108
|
+
let cursor;
|
|
109
|
+
do {
|
|
110
|
+
const page = await this.storage.listMessages(scope, threadId, {
|
|
111
|
+
...(cursor ? { cursor } : {}),
|
|
112
|
+
limit: 100,
|
|
113
|
+
});
|
|
114
|
+
messages.push(...page.messages);
|
|
115
|
+
cursor = page.nextCursor;
|
|
116
|
+
} while (cursor);
|
|
117
|
+
return messages;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=chat-api-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-api-service.js","sourceRoot":"","sources":["../src/chat-api-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function safeCursorList<T>(operation: () => Promise<T>, requestId: string): Promise<T>;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { ChatApiError } from "./chat-api-errors.js";
|
|
2
|
+
export async function safeCursorList(operation, requestId) {
|
|
3
|
+
try {
|
|
4
|
+
return await operation();
|
|
5
|
+
}
|
|
6
|
+
catch (error) {
|
|
7
|
+
if (error instanceof Error &&
|
|
8
|
+
error.message === "chat cursor is invalid for this scope") {
|
|
9
|
+
throw new ChatApiError("invalid_cursor", "chat cursor is invalid", 400, requestId);
|
|
10
|
+
}
|
|
11
|
+
throw error;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=chat-api-storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-api-storage.js","sourceRoot":"","sources":["../src/chat-api-storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,SAA2B,EAC3B,SAAiB;IAEjB,IAAI,CAAC;QACH,OAAO,MAAM,SAAS,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IACE,KAAK,YAAY,KAAK;YACtB,KAAK,CAAC,OAAO,KAAK,uCAAuC,EACzD,CAAC;YACD,MAAM,IAAI,YAAY,CACpB,gBAAgB,EAChB,wBAAwB,EACxB,GAAG,EACH,SAAS,CACV,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import type { ChatActor, ChatMessage, ChatScope, ChatThread, ChatWorkflowTimelineEvent } from "./types/chat.js";
|
|
2
|
+
export interface ChatApiMeta {
|
|
3
|
+
requestId: string;
|
|
4
|
+
idempotencyKey?: string;
|
|
5
|
+
idempotentReplay?: boolean;
|
|
6
|
+
nextCursor?: string;
|
|
7
|
+
policyDecisionId?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface ChatApiSuccess<T> {
|
|
10
|
+
data: T;
|
|
11
|
+
meta: ChatApiMeta;
|
|
12
|
+
}
|
|
13
|
+
export interface ChatApiErrorBody {
|
|
14
|
+
error: {
|
|
15
|
+
code: string;
|
|
16
|
+
message: string;
|
|
17
|
+
requestId: string;
|
|
18
|
+
retryable: boolean;
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
export interface CreateChatThreadInput {
|
|
22
|
+
requestId?: string;
|
|
23
|
+
scope: ChatScope;
|
|
24
|
+
title: string;
|
|
25
|
+
actor: ChatActor;
|
|
26
|
+
}
|
|
27
|
+
export interface ListChatInput {
|
|
28
|
+
requestId?: string;
|
|
29
|
+
scope: ChatScope;
|
|
30
|
+
limit?: number;
|
|
31
|
+
cursor?: string;
|
|
32
|
+
}
|
|
33
|
+
export interface ChatThreadInput {
|
|
34
|
+
requestId?: string;
|
|
35
|
+
scope: ChatScope;
|
|
36
|
+
threadId: string;
|
|
37
|
+
}
|
|
38
|
+
export interface ChatMessagesInput extends ChatThreadInput {
|
|
39
|
+
limit?: number;
|
|
40
|
+
cursor?: string;
|
|
41
|
+
}
|
|
42
|
+
export interface ChatMessageInput extends ChatThreadInput {
|
|
43
|
+
idempotencyKey?: string;
|
|
44
|
+
actor: ChatActor;
|
|
45
|
+
text: string;
|
|
46
|
+
format?: "plain_text" | "markdown";
|
|
47
|
+
}
|
|
48
|
+
export interface ChatSendInput extends ChatMessageInput {
|
|
49
|
+
stream?: boolean;
|
|
50
|
+
}
|
|
51
|
+
export type ChatStreamEventType = "message.created" | "message.delta" | "workflow.event" | "runtime.lifecycle" | "policy.blocked" | "error" | "complete";
|
|
52
|
+
export interface ChatStreamEvent {
|
|
53
|
+
eventId: string;
|
|
54
|
+
threadId: string;
|
|
55
|
+
scope: ChatScope;
|
|
56
|
+
createdAt: string;
|
|
57
|
+
sequence: number;
|
|
58
|
+
type: ChatStreamEventType;
|
|
59
|
+
data: ChatStreamEventData;
|
|
60
|
+
}
|
|
61
|
+
export type ChatStreamEventData = {
|
|
62
|
+
message: ChatMessage;
|
|
63
|
+
} | {
|
|
64
|
+
text: string;
|
|
65
|
+
} | {
|
|
66
|
+
workflowEvent: ChatWorkflowTimelineEvent;
|
|
67
|
+
} | {
|
|
68
|
+
lifecycleStatus: string;
|
|
69
|
+
runtimeEvent?: ChatWorkflowTimelineEvent;
|
|
70
|
+
} | {
|
|
71
|
+
reasons: string[];
|
|
72
|
+
} | {
|
|
73
|
+
code: string;
|
|
74
|
+
message: string;
|
|
75
|
+
} | {
|
|
76
|
+
thread: ChatThread;
|
|
77
|
+
};
|
|
78
|
+
export interface ChatSendResult {
|
|
79
|
+
message?: ChatMessage;
|
|
80
|
+
events: ChatStreamEvent[];
|
|
81
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-api-types.js","sourceRoot":"","sources":["../src/chat-api-types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { ChatStorage } from "./chat-storage.js";
|
|
2
|
+
import type { ChatExportRecord } from "./types/chat.js";
|
|
3
|
+
export type ChatComplianceSelection = {
|
|
4
|
+
kind: "thread";
|
|
5
|
+
tenantId: string;
|
|
6
|
+
workspaceId: string;
|
|
7
|
+
threadId: string;
|
|
8
|
+
} | {
|
|
9
|
+
kind: "task";
|
|
10
|
+
tenantId: string;
|
|
11
|
+
workspaceId: string;
|
|
12
|
+
taskId: string;
|
|
13
|
+
} | {
|
|
14
|
+
kind: "run";
|
|
15
|
+
tenantId: string;
|
|
16
|
+
workspaceId: string;
|
|
17
|
+
taskId: string;
|
|
18
|
+
runId: string;
|
|
19
|
+
};
|
|
20
|
+
export interface ChatComplianceActor {
|
|
21
|
+
actorId: string;
|
|
22
|
+
role: string;
|
|
23
|
+
}
|
|
24
|
+
export interface ChatComplianceExportResult {
|
|
25
|
+
selection: ChatComplianceSelection;
|
|
26
|
+
exportedAt: string;
|
|
27
|
+
records: ChatExportRecord[];
|
|
28
|
+
markdown: string;
|
|
29
|
+
auditEventId: string;
|
|
30
|
+
}
|
|
31
|
+
export interface ChatComplianceDeleteResult {
|
|
32
|
+
selection: ChatComplianceSelection;
|
|
33
|
+
deletedThreads: string[];
|
|
34
|
+
deletedMessages: string[];
|
|
35
|
+
auditEventId: string;
|
|
36
|
+
}
|
|
37
|
+
export interface ChatComplianceServiceOptions {
|
|
38
|
+
workspaceRoot: string;
|
|
39
|
+
storage?: ChatStorage;
|
|
40
|
+
now?: () => string;
|
|
41
|
+
}
|
|
42
|
+
export declare class ChatComplianceService {
|
|
43
|
+
private readonly workspaceRoot;
|
|
44
|
+
private readonly storage;
|
|
45
|
+
private readonly files;
|
|
46
|
+
private readonly now;
|
|
47
|
+
constructor(options: ChatComplianceServiceOptions);
|
|
48
|
+
exportEvidence(input: {
|
|
49
|
+
selection: ChatComplianceSelection;
|
|
50
|
+
actor: ChatComplianceActor;
|
|
51
|
+
includeTombstoned?: boolean;
|
|
52
|
+
}): Promise<ChatComplianceExportResult>;
|
|
53
|
+
deleteScope(input: {
|
|
54
|
+
selection: ChatComplianceSelection;
|
|
55
|
+
actor: ChatComplianceActor;
|
|
56
|
+
reasonCode: string;
|
|
57
|
+
}): Promise<ChatComplianceDeleteResult>;
|
|
58
|
+
private resolveSelection;
|
|
59
|
+
}
|
|
60
|
+
export declare function auditArtifactFileName(prefix: "export" | "delete"): string;
|