@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/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,50 @@
|
|
|
2
2
|
|
|
3
3
|
## Unreleased
|
|
4
4
|
|
|
5
|
+
## 1.0.18 - 2026-06-04
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
|
|
9
|
+
- Added a public model alias facade for the public API so `/api/v1/models`
|
|
10
|
+
exposes Orchestra-owned aliases while server-side routing can swap Ollama,
|
|
11
|
+
OpenAI, Anthropic, Gemini, or test providers without leaking provider
|
|
12
|
+
details. See [GH-506](https://github.com/jterratsdev/open-orchestra/issues/506).
|
|
13
|
+
|
|
14
|
+
### Changed
|
|
15
|
+
|
|
16
|
+
- Active parent runtime is now declared by each agent through its
|
|
17
|
+
`UserPromptSubmit` hook via `orchestra health --runtime <id> --json`, which
|
|
18
|
+
persists the runtime to `.agent-workflow/active-runtime.json` (24h TTL).
|
|
19
|
+
`orchestra init --target claude` and `--target cursor` configure the hook
|
|
20
|
+
automatically; manual-setup guidance for Codex/VS Code/Windsurf documents the
|
|
21
|
+
same pattern.
|
|
22
|
+
- `selectRuntimeExecutionAdapter` precedence: `--runtime` flag, `policy.byTask`,
|
|
23
|
+
`policy.byRole`, `policy.defaults.executor` (when not `generic-runtime`),
|
|
24
|
+
`.agent-workflow/active-runtime.json`, `OPEN_ORCHESTRA_ACTIVE_RUNTIME`,
|
|
25
|
+
`generic-runtime`.
|
|
26
|
+
|
|
27
|
+
### Removed
|
|
28
|
+
|
|
29
|
+
- File-based runtime inference (`runtimeExecutorFromInstructionFiles`). Files
|
|
30
|
+
like `AGENTS.md` and `CLAUDE.md` indicate which runtimes a project supports,
|
|
31
|
+
not which one is active right now; using their `target=` attribute as a
|
|
32
|
+
signal caused workflow phases to emit `codex-cli` parent actions inside
|
|
33
|
+
Claude sessions whenever Codex's universal `AGENTS.md` coexisted with
|
|
34
|
+
Claude's `CLAUDE.md`. See [GH-513](https://github.com/jterratsdev/open-orchestra/issues/513).
|
|
35
|
+
- Per-tool environment detection (`CLAUDECODE`, `CLAUDE_CODE`,
|
|
36
|
+
`CODEX_THREAD_ID`, `CODEX_SANDBOX`, `CURSOR_TRACE_ID`, `CURSOR_AGENT`). These
|
|
37
|
+
env vars can coexist in nested or inherited sessions and produced arbitrary
|
|
38
|
+
precedence. The hook-driven `active-runtime.json` is now the truthful signal.
|
|
39
|
+
|
|
40
|
+
### Migration
|
|
41
|
+
|
|
42
|
+
- Re-run `orchestra init --target <runtime>` to refresh the hook command to
|
|
43
|
+
include `--runtime <id>`.
|
|
44
|
+
- For CI or non-hook environments, export `OPEN_ORCHESTRA_ACTIVE_RUNTIME=<id>`
|
|
45
|
+
or set `runtimePolicy.defaults.executor` in `.agent-workflow/config.json`.
|
|
46
|
+
- Workflows where the active runtime cannot be determined fall back to
|
|
47
|
+
`generic-runtime` (parent-agent inline mode) instead of guessing from files.
|
|
48
|
+
|
|
5
49
|
## 1.0.15 - 2026-05-29
|
|
6
50
|
|
|
7
51
|
### Added
|
package/CLAUDE.md
CHANGED
|
@@ -162,6 +162,7 @@ Do NOT start implementation without a registered task and workflow run. Use `orc
|
|
|
162
162
|
- Ask for **Backlog Item ID** first. Use Conventional Commits with backlog scope: `type(ID): short description`.
|
|
163
163
|
- Mark breaking changes with `!` and a `BREAKING CHANGE:` footer.
|
|
164
164
|
- Keep PRs <400 lines. Review your own diff before requesting review.
|
|
165
|
+
- **Never run `git push` without explicit user instruction.** Completing a task, finishing QA, or closing a workflow run does not authorize a push. Wait for the user to say so.
|
|
165
166
|
|
|
166
167
|
## Interaction Preferences
|
|
167
168
|
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { RuntimeExecutionId } from "./types.js";
|
|
2
|
+
export declare const ACTIVE_RUNTIME_TTL_MS: number;
|
|
3
|
+
export interface ActiveRuntimeRecord {
|
|
4
|
+
runtime: RuntimeExecutionId;
|
|
5
|
+
updatedAt: string;
|
|
6
|
+
writer: "hook" | "cli" | string;
|
|
7
|
+
}
|
|
8
|
+
export interface ActiveRuntimeReadResult {
|
|
9
|
+
record?: ActiveRuntimeRecord;
|
|
10
|
+
status: "missing" | "stale" | "fresh" | "corrupted";
|
|
11
|
+
}
|
|
12
|
+
export declare function activeRuntimePath(root: string): string;
|
|
13
|
+
export declare function isActiveRuntimeFresh(record: ActiveRuntimeRecord, now?: number, ttlMs?: number): boolean;
|
|
14
|
+
export declare function readActiveRuntime(root: string, now?: number, ttlMs?: number): Promise<ActiveRuntimeReadResult>;
|
|
15
|
+
export declare function writeActiveRuntime(root: string, runtime: RuntimeExecutionId, options?: {
|
|
16
|
+
writer?: string;
|
|
17
|
+
now?: number;
|
|
18
|
+
}): Promise<ActiveRuntimeRecord>;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { ACTIVE_RUNTIME_FILE, WORKFLOW_DIR } from "./constants.js";
|
|
4
|
+
import { ensureDir, exists } from "./fs-utils.js";
|
|
5
|
+
import { parseRuntimeExecutionId } from "./runtime-adapters.js";
|
|
6
|
+
export const ACTIVE_RUNTIME_TTL_MS = 24 * 60 * 60 * 1000;
|
|
7
|
+
export function activeRuntimePath(root) {
|
|
8
|
+
return path.join(root, WORKFLOW_DIR, ACTIVE_RUNTIME_FILE);
|
|
9
|
+
}
|
|
10
|
+
export function isActiveRuntimeFresh(record, now = Date.now(), ttlMs = ACTIVE_RUNTIME_TTL_MS) {
|
|
11
|
+
const updatedAtMs = Date.parse(record.updatedAt);
|
|
12
|
+
if (Number.isNaN(updatedAtMs))
|
|
13
|
+
return false;
|
|
14
|
+
return now - updatedAtMs <= ttlMs;
|
|
15
|
+
}
|
|
16
|
+
export async function readActiveRuntime(root, now = Date.now(), ttlMs = ACTIVE_RUNTIME_TTL_MS) {
|
|
17
|
+
const filePath = activeRuntimePath(root);
|
|
18
|
+
if (!(await exists(filePath))) {
|
|
19
|
+
return { status: "missing" };
|
|
20
|
+
}
|
|
21
|
+
const raw = await readFile(filePath, "utf8").catch(() => "");
|
|
22
|
+
if (!raw.trim())
|
|
23
|
+
return { status: "missing" };
|
|
24
|
+
let parsed;
|
|
25
|
+
try {
|
|
26
|
+
parsed = JSON.parse(raw);
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return { status: "corrupted" };
|
|
30
|
+
}
|
|
31
|
+
if (!isActiveRuntimeRecordShape(parsed)) {
|
|
32
|
+
return { status: "corrupted" };
|
|
33
|
+
}
|
|
34
|
+
const record = {
|
|
35
|
+
runtime: parsed.runtime,
|
|
36
|
+
updatedAt: parsed.updatedAt,
|
|
37
|
+
writer: parsed.writer ?? "hook",
|
|
38
|
+
};
|
|
39
|
+
if (!isActiveRuntimeFresh(record, now, ttlMs)) {
|
|
40
|
+
return { record, status: "stale" };
|
|
41
|
+
}
|
|
42
|
+
return { record, status: "fresh" };
|
|
43
|
+
}
|
|
44
|
+
export async function writeActiveRuntime(root, runtime, options = {}) {
|
|
45
|
+
parseRuntimeExecutionId(runtime);
|
|
46
|
+
const record = {
|
|
47
|
+
runtime,
|
|
48
|
+
updatedAt: new Date(options.now ?? Date.now()).toISOString(),
|
|
49
|
+
writer: options.writer ?? "hook",
|
|
50
|
+
};
|
|
51
|
+
const filePath = activeRuntimePath(root);
|
|
52
|
+
await ensureDir(path.dirname(filePath));
|
|
53
|
+
await writeFile(filePath, `${JSON.stringify(record, null, 2)}\n`, "utf8");
|
|
54
|
+
return record;
|
|
55
|
+
}
|
|
56
|
+
function isActiveRuntimeRecordShape(value) {
|
|
57
|
+
if (!value || typeof value !== "object")
|
|
58
|
+
return false;
|
|
59
|
+
const candidate = value;
|
|
60
|
+
if (typeof candidate.runtime !== "string")
|
|
61
|
+
return false;
|
|
62
|
+
if (typeof candidate.updatedAt !== "string")
|
|
63
|
+
return false;
|
|
64
|
+
if (candidate.writer !== undefined && typeof candidate.writer !== "string") {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
try {
|
|
68
|
+
parseRuntimeExecutionId(candidate.runtime);
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=active-runtime-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"active-runtime-store.js","sourceRoot":"","sources":["../src/active-runtime-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare class ChatApiError extends Error {
|
|
2
|
+
readonly code: string;
|
|
3
|
+
readonly status: number;
|
|
4
|
+
readonly requestId: string;
|
|
5
|
+
readonly retryable: boolean;
|
|
6
|
+
constructor(code: string, message: string, status: number, requestId: string, retryable?: boolean);
|
|
7
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export class ChatApiError extends Error {
|
|
2
|
+
code;
|
|
3
|
+
status;
|
|
4
|
+
requestId;
|
|
5
|
+
retryable;
|
|
6
|
+
constructor(code, message, status, requestId, retryable = false) {
|
|
7
|
+
super(message);
|
|
8
|
+
this.name = "ChatApiError";
|
|
9
|
+
this.code = code;
|
|
10
|
+
this.status = status;
|
|
11
|
+
this.requestId = requestId;
|
|
12
|
+
this.retryable = retryable;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=chat-api-errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-api-errors.js","sourceRoot":"","sources":["../src/chat-api-errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,YAAa,SAAQ,KAAK;IAC5B,IAAI,CAAS;IACb,MAAM,CAAS;IACf,SAAS,CAAS;IAClB,SAAS,CAAU;IAE5B,YACE,IAAY,EACZ,OAAe,EACf,MAAc,EACd,SAAiB,EACjB,SAAS,GAAG,KAAK;QAEjB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;QAC3B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;CACF"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ChatStorage } from "./chat-storage.js";
|
|
2
|
+
import type { ChatApiSuccess, ChatMessageInput } from "./chat-api-types.js";
|
|
3
|
+
import type { ChatMessage } from "./types/chat.js";
|
|
4
|
+
export declare function persistChatMessage(input: {
|
|
5
|
+
storage: ChatStorage;
|
|
6
|
+
now: () => string;
|
|
7
|
+
message: ChatMessageInput;
|
|
8
|
+
action: "messagePersist" | "providerMessage";
|
|
9
|
+
}): Promise<{
|
|
10
|
+
message: ChatMessage;
|
|
11
|
+
meta: ChatApiSuccess<ChatMessage>["meta"];
|
|
12
|
+
}>;
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { assertMatchingScope, ChatStorageError, CHAT_SCHEMA_VERSION, } from "./chat-storage.js";
|
|
2
|
+
import { ChatApiError } from "./chat-api-errors.js";
|
|
3
|
+
import { evaluateChatGuardrail } from "./security/chat-guardrails.js";
|
|
4
|
+
import { actorId, exportPolicy, hashBody, idempotentMessageId, notFound, provenance, referencesFor, requestIdFor, requireText, retention, } from "./chat-api-records.js";
|
|
5
|
+
export async function persistChatMessage(input) {
|
|
6
|
+
const requestId = requestIdFor(input.message.requestId);
|
|
7
|
+
const idempotencyKey = requireText(input.message.idempotencyKey, "idempotencyKey", requestId);
|
|
8
|
+
const thread = await input.storage.getThread(input.message.scope, input.message.threadId);
|
|
9
|
+
if (!thread)
|
|
10
|
+
throw notFound("thread_not_found", requestId);
|
|
11
|
+
assertMatchingScope(input.message.scope, thread.scope, "thread.scope");
|
|
12
|
+
const text = requireText(input.message.text, "text", requestId);
|
|
13
|
+
const bodyHash = hashBody(text);
|
|
14
|
+
const messageId = idempotentMessageId(input.message.scope, input.message.threadId, input.action, idempotencyKey);
|
|
15
|
+
const guardrail = evaluateChatGuardrail({
|
|
16
|
+
requestId,
|
|
17
|
+
tenantId: input.message.scope.tenantId,
|
|
18
|
+
workspaceId: input.message.scope.workspaceId,
|
|
19
|
+
taskId: input.message.scope.taskId,
|
|
20
|
+
runId: input.message.scope.runId,
|
|
21
|
+
threadId: input.message.threadId,
|
|
22
|
+
messageId,
|
|
23
|
+
actor: {
|
|
24
|
+
id: actorId(input.message.actor),
|
|
25
|
+
actorType: input.message.actor.kind === "human" ? "human" : "runtime",
|
|
26
|
+
tenantId: input.message.scope.tenantId,
|
|
27
|
+
workspaceId: input.message.scope.workspaceId,
|
|
28
|
+
},
|
|
29
|
+
action: input.action,
|
|
30
|
+
sink: { kind: "json" },
|
|
31
|
+
resource: {
|
|
32
|
+
resourceType: "message",
|
|
33
|
+
summary: "chat message",
|
|
34
|
+
tenantId: input.message.scope.tenantId,
|
|
35
|
+
workspaceId: input.message.scope.workspaceId,
|
|
36
|
+
},
|
|
37
|
+
segments: [
|
|
38
|
+
{
|
|
39
|
+
id: `${requestId}:message`,
|
|
40
|
+
kind: "instruction",
|
|
41
|
+
provenance: input.message.actor.kind,
|
|
42
|
+
text,
|
|
43
|
+
sink: "json",
|
|
44
|
+
},
|
|
45
|
+
],
|
|
46
|
+
});
|
|
47
|
+
if (!guardrail.canProceed) {
|
|
48
|
+
throw new ChatApiError("policy_blocked", guardrail.sanitizedReasons[0] ?? "chat message blocked by policy", 403, requestId);
|
|
49
|
+
}
|
|
50
|
+
const existing = await findMessage(input.storage, input.message.scope, input.message.threadId, messageId);
|
|
51
|
+
if (existing) {
|
|
52
|
+
if (existing.provenance.sourceId !== bodyHash) {
|
|
53
|
+
throw new ChatApiError("idempotency_conflict", "idempotency key was already used with a different payload", 409, requestId);
|
|
54
|
+
}
|
|
55
|
+
return replay(existing, requestId, idempotencyKey, guardrail.requestId);
|
|
56
|
+
}
|
|
57
|
+
const message = await buildMessage(input, messageId, bodyHash, guardrail);
|
|
58
|
+
try {
|
|
59
|
+
return {
|
|
60
|
+
message: await input.storage.appendMessage(input.message.scope, message),
|
|
61
|
+
meta: {
|
|
62
|
+
requestId,
|
|
63
|
+
idempotencyKey,
|
|
64
|
+
policyDecisionId: guardrail.requestId,
|
|
65
|
+
},
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
if (error instanceof ChatStorageError &&
|
|
70
|
+
error.code === "duplicate_record") {
|
|
71
|
+
const duplicate = await findMessage(input.storage, input.message.scope, input.message.threadId, messageId);
|
|
72
|
+
if (duplicate && duplicate.provenance.sourceId === bodyHash) {
|
|
73
|
+
return replay(duplicate, requestId, idempotencyKey, guardrail.requestId);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
throw error;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
async function buildMessage(input, messageId, bodyHash, guardrail) {
|
|
80
|
+
const allMessages = await input.storage.listMessages(input.message.scope, input.message.threadId);
|
|
81
|
+
const now = input.now();
|
|
82
|
+
return {
|
|
83
|
+
schemaVersion: CHAT_SCHEMA_VERSION,
|
|
84
|
+
id: messageId,
|
|
85
|
+
threadId: input.message.threadId,
|
|
86
|
+
scope: input.message.scope,
|
|
87
|
+
actor: input.message.actor,
|
|
88
|
+
provenance: provenance("user_input", bodyHash, now, guardrail.requestId),
|
|
89
|
+
createdAt: now,
|
|
90
|
+
sequence: allMessages.messages.length + 1,
|
|
91
|
+
content: {
|
|
92
|
+
format: input.message.format ?? "plain_text",
|
|
93
|
+
text: guardrail.redactedSegments[0]?.text ?? input.message.text,
|
|
94
|
+
},
|
|
95
|
+
contentState: "redacted",
|
|
96
|
+
retention: retention(now),
|
|
97
|
+
redaction: {
|
|
98
|
+
policyId: "chat-api-redaction",
|
|
99
|
+
status: "applied",
|
|
100
|
+
redactedAt: now,
|
|
101
|
+
redactedByActorId: "chat-api",
|
|
102
|
+
markerCount: Math.max(0, guardrail.redactedSegments.length),
|
|
103
|
+
summary: "Chat guardrail redaction applied before persistence.",
|
|
104
|
+
},
|
|
105
|
+
export: exportPolicy(now),
|
|
106
|
+
delete: { status: "active", policyId: "chat-delete-logical" },
|
|
107
|
+
references: referencesFor(input.message.scope),
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
async function findMessage(storage, scope, threadId, messageId) {
|
|
111
|
+
const messages = await storage.listMessages(scope, threadId);
|
|
112
|
+
return messages.messages.find((message) => message.id === messageId);
|
|
113
|
+
}
|
|
114
|
+
function replay(message, requestId, idempotencyKey, policyDecisionId) {
|
|
115
|
+
return {
|
|
116
|
+
message,
|
|
117
|
+
meta: {
|
|
118
|
+
requestId,
|
|
119
|
+
idempotencyKey,
|
|
120
|
+
idempotentReplay: true,
|
|
121
|
+
policyDecisionId,
|
|
122
|
+
},
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=chat-api-message-persistence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-api-message-persistence.js","sourceRoot":"","sources":["../src/chat-api-message-persistence.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { ChatApiError } from "./chat-api-errors.js";
|
|
2
|
+
import type { ChatApiMeta } from "./chat-api-types.js";
|
|
3
|
+
import type { ChatActor, ChatThread, ChatProvenance, ChatReference, ChatScope } from "./types/chat.js";
|
|
4
|
+
export declare function requestIdFor(requestId: string | undefined): string;
|
|
5
|
+
export declare function requireText(value: string | undefined, field: string, requestId: string): string;
|
|
6
|
+
export declare function notFound(code: string, requestId: string): ChatApiError;
|
|
7
|
+
export declare function hashBody(text: string): string;
|
|
8
|
+
export declare function idempotentMessageId(scope: ChatScope, threadId: string, action: string, idempotencyKey: string): string;
|
|
9
|
+
export declare function provenance(sourceKind: "user_input", sourceId: string, createdAt: string, policyDecisionId?: string): ChatProvenance;
|
|
10
|
+
export declare function retention(decidedAt: string): {
|
|
11
|
+
policyId: string;
|
|
12
|
+
status: "redacted_only";
|
|
13
|
+
rawPersistence: "forbidden";
|
|
14
|
+
decidedAt: string;
|
|
15
|
+
};
|
|
16
|
+
export declare function exportPolicy(decidedAt: string): {
|
|
17
|
+
status: "redacted_only";
|
|
18
|
+
rawContentExportable: boolean;
|
|
19
|
+
policyId: string;
|
|
20
|
+
decidedAt: string;
|
|
21
|
+
};
|
|
22
|
+
export declare function referencesFor(scope: ChatScope): ChatReference[];
|
|
23
|
+
export declare function actorId(actor: ChatActor): string;
|
|
24
|
+
export declare function listOptions(limit?: number, cursor?: string): {
|
|
25
|
+
cursor?: string;
|
|
26
|
+
limit?: number;
|
|
27
|
+
};
|
|
28
|
+
export declare function apiMeta(requestId: string, options?: Omit<ChatApiMeta, "requestId">): ChatApiMeta;
|
|
29
|
+
export declare function buildChatThread(input: {
|
|
30
|
+
scope: ChatScope;
|
|
31
|
+
title: string;
|
|
32
|
+
actor: ChatActor;
|
|
33
|
+
requestId: string;
|
|
34
|
+
now: string;
|
|
35
|
+
}): ChatThread;
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
2
|
+
import { ChatApiError } from "./chat-api-errors.js";
|
|
3
|
+
import { CHAT_SCHEMA_VERSION } from "./chat-storage.js";
|
|
4
|
+
export function requestIdFor(requestId) {
|
|
5
|
+
return requestId?.trim() || `chat-${randomUUID()}`;
|
|
6
|
+
}
|
|
7
|
+
export function requireText(value, field, requestId) {
|
|
8
|
+
if (!value?.trim()) {
|
|
9
|
+
throw new ChatApiError("invalid_request", `${field} is required`, 400, requestId);
|
|
10
|
+
}
|
|
11
|
+
return value.trim();
|
|
12
|
+
}
|
|
13
|
+
export function notFound(code, requestId) {
|
|
14
|
+
return new ChatApiError(code, "chat resource was not found", 404, requestId);
|
|
15
|
+
}
|
|
16
|
+
export function hashBody(text) {
|
|
17
|
+
return createHash("sha256").update(text).digest("base64url");
|
|
18
|
+
}
|
|
19
|
+
export function idempotentMessageId(scope, threadId, action, idempotencyKey) {
|
|
20
|
+
return `message-${createHash("sha256")
|
|
21
|
+
.update([
|
|
22
|
+
scope.tenantId,
|
|
23
|
+
scope.workspaceId,
|
|
24
|
+
scope.taskId,
|
|
25
|
+
scope.runId,
|
|
26
|
+
scope.phase,
|
|
27
|
+
scope.sessionId,
|
|
28
|
+
threadId,
|
|
29
|
+
action,
|
|
30
|
+
idempotencyKey,
|
|
31
|
+
].join("\u001f"))
|
|
32
|
+
.digest("base64url")
|
|
33
|
+
.slice(0, 24)}`;
|
|
34
|
+
}
|
|
35
|
+
export function provenance(sourceKind, sourceId, createdAt, policyDecisionId) {
|
|
36
|
+
return {
|
|
37
|
+
sourceKind,
|
|
38
|
+
sourceId,
|
|
39
|
+
createdAt,
|
|
40
|
+
observedAt: createdAt,
|
|
41
|
+
...(policyDecisionId ? { policyDecisionId } : {}),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
export function retention(decidedAt) {
|
|
45
|
+
return {
|
|
46
|
+
policyId: "chat-api-retain-redacted",
|
|
47
|
+
status: "redacted_only",
|
|
48
|
+
rawPersistence: "forbidden",
|
|
49
|
+
decidedAt,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
export function exportPolicy(decidedAt) {
|
|
53
|
+
return {
|
|
54
|
+
status: "redacted_only",
|
|
55
|
+
rawContentExportable: false,
|
|
56
|
+
policyId: "chat-api-export-redacted",
|
|
57
|
+
decidedAt,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
export function referencesFor(scope) {
|
|
61
|
+
return [
|
|
62
|
+
{ kind: "task", id: scope.taskId },
|
|
63
|
+
{ kind: "workflow_run", id: scope.runId },
|
|
64
|
+
];
|
|
65
|
+
}
|
|
66
|
+
export function actorId(actor) {
|
|
67
|
+
return actor.actorId;
|
|
68
|
+
}
|
|
69
|
+
export function listOptions(limit, cursor) {
|
|
70
|
+
return {
|
|
71
|
+
...(limit !== undefined ? { limit } : {}),
|
|
72
|
+
...(cursor !== undefined ? { cursor } : {}),
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
export function apiMeta(requestId, options = {}) {
|
|
76
|
+
return { requestId, ...options };
|
|
77
|
+
}
|
|
78
|
+
export function buildChatThread(input) {
|
|
79
|
+
return {
|
|
80
|
+
schemaVersion: CHAT_SCHEMA_VERSION,
|
|
81
|
+
id: `thread-${randomUUID()}`,
|
|
82
|
+
scope: input.scope,
|
|
83
|
+
title: requireText(input.title, "title", input.requestId),
|
|
84
|
+
createdAt: input.now,
|
|
85
|
+
updatedAt: input.now,
|
|
86
|
+
actor: input.actor,
|
|
87
|
+
provenance: provenance("user_input", input.requestId, input.now),
|
|
88
|
+
retention: retention(input.now),
|
|
89
|
+
export: exportPolicy(input.now),
|
|
90
|
+
delete: { status: "active", policyId: "chat-delete-logical" },
|
|
91
|
+
contentState: "redacted",
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=chat-api-records.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-api-records.js","sourceRoot":"","sources":["../src/chat-api-records.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { ChatStorage } from "./chat-storage.js";
|
|
2
|
+
export { ChatApiError } from "./chat-api-errors.js";
|
|
3
|
+
import type { ChatStreamEvent, ChatApiSuccess, ChatMessageInput, ChatMessagesInput, ChatSendInput, ChatSendResult, ChatThreadInput, CreateChatThreadInput, ListChatInput } from "./chat-api-types.js";
|
|
4
|
+
import type { ChatMessage, ChatThread } from "./types/chat.js";
|
|
5
|
+
export interface ChatApiServiceOptions {
|
|
6
|
+
storage: ChatStorage;
|
|
7
|
+
root?: string;
|
|
8
|
+
now?: () => string;
|
|
9
|
+
}
|
|
10
|
+
export declare class ChatApiService {
|
|
11
|
+
private readonly storage;
|
|
12
|
+
private readonly root;
|
|
13
|
+
private readonly now;
|
|
14
|
+
constructor(options: ChatApiServiceOptions);
|
|
15
|
+
createThread(input: CreateChatThreadInput): Promise<ChatApiSuccess<ChatThread>>;
|
|
16
|
+
listThreads(input: ListChatInput): Promise<ChatApiSuccess<{
|
|
17
|
+
threads: ChatThread[];
|
|
18
|
+
}>>;
|
|
19
|
+
getThread(input: ChatThreadInput): Promise<ChatApiSuccess<{
|
|
20
|
+
thread: ChatThread;
|
|
21
|
+
}>>;
|
|
22
|
+
listMessages(input: ChatMessagesInput): Promise<ChatApiSuccess<{
|
|
23
|
+
messages: ChatMessage[];
|
|
24
|
+
}>>;
|
|
25
|
+
createMessage(input: ChatMessageInput): Promise<ChatApiSuccess<ChatMessage>>;
|
|
26
|
+
send(input: ChatSendInput): Promise<ChatApiSuccess<ChatSendResult>>;
|
|
27
|
+
stream(input: ChatMessagesInput): Promise<ChatApiSuccess<{
|
|
28
|
+
events: ChatStreamEvent[];
|
|
29
|
+
}>>;
|
|
30
|
+
private persistMessage;
|
|
31
|
+
private listAllStoredMessages;
|
|
32
|
+
}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
export { ChatApiError } from "./chat-api-errors.js";
|
|
2
|
+
import { eventsForStoredMessage } from "./chat-event-stream.js";
|
|
3
|
+
import { listWorkflowTimelineMessages, mergeTimelineMessages, } from "./chat-workflow-timeline.js";
|
|
4
|
+
import { apiMeta, buildChatThread, listOptions, notFound, requestIdFor, } from "./chat-api-records.js";
|
|
5
|
+
import { safeCursorList } from "./chat-api-storage.js";
|
|
6
|
+
import { persistChatMessage } from "./chat-api-message-persistence.js";
|
|
7
|
+
export class ChatApiService {
|
|
8
|
+
storage;
|
|
9
|
+
root;
|
|
10
|
+
now;
|
|
11
|
+
constructor(options) {
|
|
12
|
+
this.storage = options.storage;
|
|
13
|
+
this.root = options.root ?? process.cwd();
|
|
14
|
+
this.now = options.now ?? (() => new Date().toISOString());
|
|
15
|
+
}
|
|
16
|
+
async createThread(input) {
|
|
17
|
+
const requestId = requestIdFor(input.requestId);
|
|
18
|
+
const now = this.now();
|
|
19
|
+
const thread = buildChatThread({
|
|
20
|
+
scope: input.scope,
|
|
21
|
+
title: input.title,
|
|
22
|
+
actor: input.actor,
|
|
23
|
+
requestId,
|
|
24
|
+
now,
|
|
25
|
+
});
|
|
26
|
+
return {
|
|
27
|
+
data: await this.storage.createThread(input.scope, thread),
|
|
28
|
+
meta: { requestId },
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
async listThreads(input) {
|
|
32
|
+
const requestId = requestIdFor(input.requestId);
|
|
33
|
+
const result = await safeCursorList(() => this.storage.listThreads(input.scope, {
|
|
34
|
+
...listOptions(input.limit, input.cursor),
|
|
35
|
+
}), requestId);
|
|
36
|
+
return {
|
|
37
|
+
data: { threads: result.threads },
|
|
38
|
+
meta: apiMeta(requestId, {
|
|
39
|
+
...(result.nextCursor ? { nextCursor: result.nextCursor } : {}),
|
|
40
|
+
}),
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
async getThread(input) {
|
|
44
|
+
const requestId = requestIdFor(input.requestId);
|
|
45
|
+
const thread = await this.storage.getThread(input.scope, input.threadId);
|
|
46
|
+
if (!thread)
|
|
47
|
+
throw notFound("thread_not_found", requestId);
|
|
48
|
+
return { data: { thread }, meta: { requestId } };
|
|
49
|
+
}
|
|
50
|
+
async listMessages(input) {
|
|
51
|
+
const requestId = requestIdFor(input.requestId);
|
|
52
|
+
const result = await safeCursorList(async () => {
|
|
53
|
+
const storedMessages = await this.listAllStoredMessages(input.scope, input.threadId);
|
|
54
|
+
const workflowMessages = await listWorkflowTimelineMessages({
|
|
55
|
+
root: this.root,
|
|
56
|
+
scope: input.scope,
|
|
57
|
+
threadId: input.threadId,
|
|
58
|
+
});
|
|
59
|
+
return mergeTimelineMessages({
|
|
60
|
+
storedMessages,
|
|
61
|
+
workflowMessages,
|
|
62
|
+
scope: input.scope,
|
|
63
|
+
threadId: input.threadId,
|
|
64
|
+
...listOptions(input.limit, input.cursor),
|
|
65
|
+
});
|
|
66
|
+
}, requestId);
|
|
67
|
+
return {
|
|
68
|
+
data: { messages: result.messages },
|
|
69
|
+
meta: apiMeta(requestId, {
|
|
70
|
+
...(result.nextCursor ? { nextCursor: result.nextCursor } : {}),
|
|
71
|
+
}),
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
async createMessage(input) {
|
|
75
|
+
const result = await this.persistMessage(input, "messagePersist");
|
|
76
|
+
return {
|
|
77
|
+
data: result.message,
|
|
78
|
+
meta: result.meta,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
async send(input) {
|
|
82
|
+
const persisted = await this.persistMessage(input, "providerMessage");
|
|
83
|
+
return {
|
|
84
|
+
data: {
|
|
85
|
+
message: persisted.message,
|
|
86
|
+
events: eventsForStoredMessage(persisted.message),
|
|
87
|
+
},
|
|
88
|
+
meta: persisted.meta,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
async stream(input) {
|
|
92
|
+
const messages = await this.listMessages(input);
|
|
93
|
+
return {
|
|
94
|
+
data: { events: messages.data.messages.flatMap(eventsForStoredMessage) },
|
|
95
|
+
meta: messages.meta,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
async persistMessage(input, action) {
|
|
99
|
+
return persistChatMessage({
|
|
100
|
+
storage: this.storage,
|
|
101
|
+
now: this.now,
|
|
102
|
+
message: input,
|
|
103
|
+
action,
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
async listAllStoredMessages(scope, threadId) {
|
|
107
|
+
const messages = [];
|
|
108
|
+
let cursor;
|
|
109
|
+
do {
|
|
110
|
+
const page = await this.storage.listMessages(scope, threadId, {
|
|
111
|
+
...(cursor ? { cursor } : {}),
|
|
112
|
+
limit: 100,
|
|
113
|
+
});
|
|
114
|
+
messages.push(...page.messages);
|
|
115
|
+
cursor = page.nextCursor;
|
|
116
|
+
} while (cursor);
|
|
117
|
+
return messages;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=chat-api-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-api-service.js","sourceRoot":"","sources":["../src/chat-api-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function safeCursorList<T>(operation: () => Promise<T>, requestId: string): Promise<T>;
|