@ornexus/neocortex 4.59.1
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/LICENSE +56 -0
- package/LICENSE-COMMERCIAL.md +70 -0
- package/README.md +58 -0
- package/dist/sbom.cdx.json +7067 -0
- package/docs/install/coderabbit-manual-setup.md +86 -0
- package/docs/install/installer-diagnostics.md +107 -0
- package/docs/install/linux-global-install.md +97 -0
- package/install.js +572 -0
- package/install.ps1 +2214 -0
- package/install.sh +2013 -0
- package/package.json +118 -0
- package/packages/client/dist/adapters/adapter-registry.d.ts +61 -0
- package/packages/client/dist/adapters/adapter-registry.js +1 -0
- package/packages/client/dist/adapters/antigravity-adapter.d.ts +18 -0
- package/packages/client/dist/adapters/antigravity-adapter.js +2 -0
- package/packages/client/dist/adapters/claude-code-adapter.d.ts +19 -0
- package/packages/client/dist/adapters/claude-code-adapter.js +3 -0
- package/packages/client/dist/adapters/codex-adapter.d.ts +19 -0
- package/packages/client/dist/adapters/codex-adapter.js +2 -0
- package/packages/client/dist/adapters/cursor-adapter.d.ts +19 -0
- package/packages/client/dist/adapters/cursor-adapter.js +4 -0
- package/packages/client/dist/adapters/gemini-adapter.d.ts +18 -0
- package/packages/client/dist/adapters/gemini-adapter.js +2 -0
- package/packages/client/dist/adapters/index.d.ts +19 -0
- package/packages/client/dist/adapters/index.js +1 -0
- package/packages/client/dist/adapters/platform-detector.d.ts +48 -0
- package/packages/client/dist/adapters/platform-detector.js +1 -0
- package/packages/client/dist/adapters/target-adapter.d.ts +70 -0
- package/packages/client/dist/adapters/target-adapter.js +0 -0
- package/packages/client/dist/adapters/vscode-adapter.d.ts +19 -0
- package/packages/client/dist/adapters/vscode-adapter.js +2 -0
- package/packages/client/dist/agent/refresh-stubs.d.ts +80 -0
- package/packages/client/dist/agent/refresh-stubs.js +2 -0
- package/packages/client/dist/agent/update-agent-yaml.d.ts +26 -0
- package/packages/client/dist/agent/update-agent-yaml.js +1 -0
- package/packages/client/dist/agent/update-description.d.ts +45 -0
- package/packages/client/dist/agent/update-description.js +1 -0
- package/packages/client/dist/cache/crypto-utils.d.ts +30 -0
- package/packages/client/dist/cache/crypto-utils.js +1 -0
- package/packages/client/dist/cache/encrypted-cache.d.ts +30 -0
- package/packages/client/dist/cache/encrypted-cache.js +1 -0
- package/packages/client/dist/cache/in-memory-asset-cache.d.ts +62 -0
- package/packages/client/dist/cache/in-memory-asset-cache.js +1 -0
- package/packages/client/dist/cache/index.d.ts +13 -0
- package/packages/client/dist/cache/index.js +1 -0
- package/packages/client/dist/cache/protected-pi-boundary.d.ts +19 -0
- package/packages/client/dist/cache/protected-pi-boundary.js +1 -0
- package/packages/client/dist/checkpoint/checkpoint-client-reader.d.ts +45 -0
- package/packages/client/dist/checkpoint/checkpoint-client-reader.js +2 -0
- package/packages/client/dist/checkpoint/index.d.ts +12 -0
- package/packages/client/dist/checkpoint/index.js +1 -0
- package/packages/client/dist/checkpoint/shared-checkpoint-types.d.ts +85 -0
- package/packages/client/dist/checkpoint/shared-checkpoint-types.js +1 -0
- package/packages/client/dist/cli.d.ts +14 -0
- package/packages/client/dist/cli.js +48 -0
- package/packages/client/dist/commands/activate.d.ts +55 -0
- package/packages/client/dist/commands/activate.js +8 -0
- package/packages/client/dist/commands/cache-status.d.ts +39 -0
- package/packages/client/dist/commands/cache-status.js +2 -0
- package/packages/client/dist/commands/invoke.d.ts +229 -0
- package/packages/client/dist/commands/invoke.js +63 -0
- package/packages/client/dist/commands/refresh-memory.d.ts +11 -0
- package/packages/client/dist/commands/refresh-memory.js +1 -0
- package/packages/client/dist/config/resolver-selection.d.ts +40 -0
- package/packages/client/dist/config/resolver-selection.js +1 -0
- package/packages/client/dist/config/secure-config.d.ts +78 -0
- package/packages/client/dist/config/secure-config.js +12 -0
- package/packages/client/dist/constants.d.ts +25 -0
- package/packages/client/dist/constants.js +1 -0
- package/packages/client/dist/context/context-collector.d.ts +28 -0
- package/packages/client/dist/context/context-collector.js +2 -0
- package/packages/client/dist/context/context-sanitizer.d.ts +28 -0
- package/packages/client/dist/context/context-sanitizer.js +1 -0
- package/packages/client/dist/continuity/continuity-client-state-store.d.ts +183 -0
- package/packages/client/dist/continuity/continuity-client-state-store.js +1 -0
- package/packages/client/dist/continuity/invoke-hooks.d.ts +18 -0
- package/packages/client/dist/continuity/invoke-hooks.js +1 -0
- package/packages/client/dist/continuity/migrations/001-initial-schema.d.ts +11 -0
- package/packages/client/dist/continuity/migrations/001-initial-schema.js +263 -0
- package/packages/client/dist/continuity/sqlite-store.d.ts +409 -0
- package/packages/client/dist/continuity/sqlite-store.js +226 -0
- package/packages/client/dist/errors/error-messages.d.ts +40 -0
- package/packages/client/dist/errors/error-messages.js +2 -0
- package/packages/client/dist/graph-retrieval/pre-command-hook.d.ts +31 -0
- package/packages/client/dist/graph-retrieval/pre-command-hook.js +1 -0
- package/packages/client/dist/graph-retrieval/shared-graph-retrieval-contract.d.ts +77 -0
- package/packages/client/dist/graph-retrieval/shared-graph-retrieval-contract.js +1 -0
- package/packages/client/dist/i18n/first-run.d.ts +23 -0
- package/packages/client/dist/i18n/first-run.js +2 -0
- package/packages/client/dist/index.d.ts +56 -0
- package/packages/client/dist/index.js +1 -0
- package/packages/client/dist/license/index.d.ts +5 -0
- package/packages/client/dist/license/index.js +1 -0
- package/packages/client/dist/license/license-client.d.ts +79 -0
- package/packages/client/dist/license/license-client.js +1 -0
- package/packages/client/dist/machine/fingerprint.d.ts +34 -0
- package/packages/client/dist/machine/fingerprint.js +2 -0
- package/packages/client/dist/machine/index.d.ts +5 -0
- package/packages/client/dist/machine/index.js +1 -0
- package/packages/client/dist/memory/project-memory-writer.d.ts +74 -0
- package/packages/client/dist/memory/project-memory-writer.js +36 -0
- package/packages/client/dist/memory/shared-project-memory-types.d.ts +370 -0
- package/packages/client/dist/memory/shared-project-memory-types.js +2 -0
- package/packages/client/dist/policy/architecture-policy.d.ts +40 -0
- package/packages/client/dist/policy/architecture-policy.js +2 -0
- package/packages/client/dist/policy/index.d.ts +8 -0
- package/packages/client/dist/policy/index.js +1 -0
- package/packages/client/dist/policy/shared-policy-types.d.ts +89 -0
- package/packages/client/dist/policy/shared-policy-types.js +0 -0
- package/packages/client/dist/resilience/circuit-breaker.d.ts +70 -0
- package/packages/client/dist/resilience/circuit-breaker.js +1 -0
- package/packages/client/dist/resilience/degradation-manager.d.ts +67 -0
- package/packages/client/dist/resilience/degradation-manager.js +1 -0
- package/packages/client/dist/resilience/freshness-indicator.d.ts +59 -0
- package/packages/client/dist/resilience/freshness-indicator.js +1 -0
- package/packages/client/dist/resilience/index.d.ts +8 -0
- package/packages/client/dist/resilience/index.js +1 -0
- package/packages/client/dist/resilience/recovery-detector.d.ts +59 -0
- package/packages/client/dist/resilience/recovery-detector.js +1 -0
- package/packages/client/dist/resolvers/asset-resolver.d.ts +79 -0
- package/packages/client/dist/resolvers/asset-resolver.js +0 -0
- package/packages/client/dist/resolvers/local-resolver.d.ts +26 -0
- package/packages/client/dist/resolvers/local-resolver.js +8 -0
- package/packages/client/dist/resolvers/remote-resolver.d.ts +91 -0
- package/packages/client/dist/resolvers/remote-resolver.js +1 -0
- package/packages/client/dist/runner/cli.d.ts +121 -0
- package/packages/client/dist/runner/cli.js +20 -0
- package/packages/client/dist/runner/scheduler.d.ts +116 -0
- package/packages/client/dist/runner/scheduler.js +6 -0
- package/packages/client/dist/runner-cli.d.ts +9 -0
- package/packages/client/dist/runner-cli.js +3 -0
- package/packages/client/dist/state/project-state-snapshot.d.ts +15 -0
- package/packages/client/dist/state/project-state-snapshot.js +1 -0
- package/packages/client/dist/state/state-json-repair.d.ts +17 -0
- package/packages/client/dist/state/state-json-repair.js +3 -0
- package/packages/client/dist/telemetry/index.d.ts +5 -0
- package/packages/client/dist/telemetry/index.js +1 -0
- package/packages/client/dist/telemetry/offline-queue.d.ts +57 -0
- package/packages/client/dist/telemetry/offline-queue.js +1 -0
- package/packages/client/dist/tier/index.d.ts +5 -0
- package/packages/client/dist/tier/index.js +1 -0
- package/packages/client/dist/tier/tier-aware-client.d.ts +105 -0
- package/packages/client/dist/tier/tier-aware-client.js +1 -0
- package/packages/client/dist/types/index.d.ts +140 -0
- package/packages/client/dist/types/index.js +1 -0
- package/packages/client/dist/yoloop/discovery-hook.d.ts +85 -0
- package/packages/client/dist/yoloop/discovery-hook.js +2 -0
- package/packages/client/dist/yoloop/index.d.ts +10 -0
- package/packages/client/dist/yoloop/index.js +1 -0
- package/packages/client/dist/yoloop/invoke-hooks.d.ts +125 -0
- package/packages/client/dist/yoloop/invoke-hooks.js +5 -0
- package/packages/client/dist/yoloop/shared-discover-epics.d.ts +289 -0
- package/packages/client/dist/yoloop/shared-discover-epics.js +1 -0
- package/packages/client/dist/yoloop/shared-yoloop-types.d.ts +172 -0
- package/packages/client/dist/yoloop/shared-yoloop-types.js +1 -0
- package/packages/client/dist/yoloop/yoloop-client-state-store.d.ts +124 -0
- package/packages/client/dist/yoloop/yoloop-client-state-store.js +1 -0
- package/postinstall.js +754 -0
- package/targets-stubs/antigravity/README.md +36 -0
- package/targets-stubs/antigravity/gemini.md +29 -0
- package/targets-stubs/antigravity/install-antigravity.sh +153 -0
- package/targets-stubs/antigravity/mcp-config.json +30 -0
- package/targets-stubs/antigravity/skill/SKILL.md +159 -0
- package/targets-stubs/claude-code/.mcp.json +32 -0
- package/targets-stubs/claude-code/README.md +20 -0
- package/targets-stubs/claude-code/neocortex-root.agent.yaml +42 -0
- package/targets-stubs/claude-code/neocortex-root.md +310 -0
- package/targets-stubs/claude-code/neocortex.agent.yaml +42 -0
- package/targets-stubs/claude-code/neocortex.md +378 -0
- package/targets-stubs/codex/AGENTS.md +244 -0
- package/targets-stubs/codex/README.md +47 -0
- package/targets-stubs/codex/config-mcp.toml +22 -0
- package/targets-stubs/codex/install-codex.sh +63 -0
- package/targets-stubs/codex/neocortex.toml +29 -0
- package/targets-stubs/cursor/README.md +33 -0
- package/targets-stubs/cursor/agent.md +204 -0
- package/targets-stubs/cursor/install-cursor.sh +50 -0
- package/targets-stubs/cursor/mcp.json +30 -0
- package/targets-stubs/gemini-cli/README.md +34 -0
- package/targets-stubs/gemini-cli/agent.md +234 -0
- package/targets-stubs/gemini-cli/agents/neocortex.md +54 -0
- package/targets-stubs/gemini-cli/gemini.md +46 -0
- package/targets-stubs/gemini-cli/install-gemini.sh +70 -0
- package/targets-stubs/gemini-cli/settings-mcp.json +30 -0
- package/targets-stubs/kimi/mcp.json +33 -0
- package/targets-stubs/kimi/neocortex.md +54 -0
- package/targets-stubs/lib/mcp-merge.js +189 -0
- package/targets-stubs/openclaw/README.md +12 -0
- package/targets-stubs/openclaw/SKILL.md +88 -0
- package/targets-stubs/opencode/neocortex-root.md +261 -0
- package/targets-stubs/opencode/neocortex.md +59 -0
- package/targets-stubs/opencode/opencode-mcp.json +35 -0
- package/targets-stubs/vscode/README.md +34 -0
- package/targets-stubs/vscode/copilot-instructions.md +47 -0
- package/targets-stubs/vscode/install-vscode.sh +72 -0
- package/targets-stubs/vscode/mcp.json +36 -0
- package/targets-stubs/vscode/neocortex.agent.md +245 -0
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license FSL-1.1
|
|
3
|
+
* Copyright (c) 2026 OrNexus AI
|
|
4
|
+
*
|
|
5
|
+
* P180.05 -- Thin-client continuity state snapshots and operation-log apply.
|
|
6
|
+
*/
|
|
7
|
+
import { type ContinuitySqliteAdapter, type ContinuitySqliteAdapterLoadResult, type ContinuitySqliteStore } from './sqlite-store.js';
|
|
8
|
+
export declare const CONTINUITY_CLIENT_SCHEMA_VERSION: 1;
|
|
9
|
+
export declare const CONTINUITY_CLIENT_CONTRACT_VERSION: "continuity-v1";
|
|
10
|
+
export declare const CONTINUITY_CLIENT_REASON_CODES: Readonly<{
|
|
11
|
+
readonly OK: "continuity-ok";
|
|
12
|
+
readonly INVALID_SCHEMA_VERSION: "invalid-schema-version";
|
|
13
|
+
readonly INVALID_CONTRACT_VERSION: "invalid-contract-version";
|
|
14
|
+
readonly UNKNOWN_OPERATION_REQUIRED: "unknown-operation-required";
|
|
15
|
+
readonly UNKNOWN_OPERATION_IGNORED: "unknown-operation-ignored";
|
|
16
|
+
readonly DUPLICATE_OPERATION_ID: "duplicate-operation-id";
|
|
17
|
+
readonly IDEMPOTENCY_REPLAY: "idempotency-replay";
|
|
18
|
+
readonly UNSAFE_FIELD_REJECTED: "unsafe-field-rejected";
|
|
19
|
+
readonly SQLITE_ADAPTER_UNAVAILABLE: "sqlite-adapter-unavailable";
|
|
20
|
+
readonly SQLITE_INTEGRITY_FAILED: "sqlite-integrity-failed";
|
|
21
|
+
readonly SQLITE_MUTATION_FAILED: "sqlite-mutation-failed";
|
|
22
|
+
}>;
|
|
23
|
+
export type ContinuityClientReasonCode = (typeof CONTINUITY_CLIENT_REASON_CODES)[keyof typeof CONTINUITY_CLIENT_REASON_CODES] | 'sqlite-migration-failed' | 'sqlite-migration-conflict' | 'sqlite-foreign-key-failed' | 'sqlite-public-safety-rejected' | 'sqlite-mutation-blocked';
|
|
24
|
+
export interface ContinuityRedactionEvidence {
|
|
25
|
+
readonly field: string;
|
|
26
|
+
readonly reason: 'unsafe_key' | 'raw_log' | 'prompt_body' | 'private_url' | 'secret' | 'protected_field' | 'unknown_required_operation';
|
|
27
|
+
readonly evidence: 'key-denied' | 'value-denied' | 'operation-denied';
|
|
28
|
+
readonly publicSafe: true;
|
|
29
|
+
}
|
|
30
|
+
export interface ContinuityApplyResult {
|
|
31
|
+
readonly ok: true;
|
|
32
|
+
readonly appliedOperationIds: readonly string[];
|
|
33
|
+
readonly ignoredOperationIds: readonly string[];
|
|
34
|
+
readonly reasonCodes: readonly ContinuityClientReasonCode[];
|
|
35
|
+
readonly redactions: readonly ContinuityRedactionEvidence[];
|
|
36
|
+
readonly publicSafe: true;
|
|
37
|
+
}
|
|
38
|
+
export interface ContinuitySnapshotJobSummary {
|
|
39
|
+
readonly jobId: string;
|
|
40
|
+
readonly kind: string;
|
|
41
|
+
readonly status: string;
|
|
42
|
+
readonly publicSummary: string;
|
|
43
|
+
readonly createdAt?: string;
|
|
44
|
+
readonly updatedAt: string;
|
|
45
|
+
readonly nextRunAt?: string;
|
|
46
|
+
readonly reasonCode?: string;
|
|
47
|
+
readonly counts?: Readonly<Record<string, number>>;
|
|
48
|
+
readonly publicSafe: true;
|
|
49
|
+
}
|
|
50
|
+
export interface ContinuitySnapshotStaleLeaseSummary {
|
|
51
|
+
readonly leaseId: string;
|
|
52
|
+
readonly jobId: string;
|
|
53
|
+
readonly runnerId: string;
|
|
54
|
+
readonly expiresAt: string;
|
|
55
|
+
readonly publicSafe: true;
|
|
56
|
+
}
|
|
57
|
+
export interface ContinuitySnapshotReceiptRef {
|
|
58
|
+
readonly receiptId: string;
|
|
59
|
+
readonly jobId: string;
|
|
60
|
+
readonly operationId?: string;
|
|
61
|
+
readonly status: string;
|
|
62
|
+
readonly reasonCode?: string;
|
|
63
|
+
readonly createdAt: string;
|
|
64
|
+
readonly publicSafe: true;
|
|
65
|
+
}
|
|
66
|
+
export interface ContinuitySnapshotEventRef {
|
|
67
|
+
readonly eventId: string;
|
|
68
|
+
readonly jobId: string;
|
|
69
|
+
readonly operationId?: string;
|
|
70
|
+
readonly type: string;
|
|
71
|
+
readonly publicSummary: string;
|
|
72
|
+
readonly reasonCode?: string;
|
|
73
|
+
readonly createdAt: string;
|
|
74
|
+
readonly publicSafe: true;
|
|
75
|
+
}
|
|
76
|
+
export interface ContinuitySnapshotCompactContextRef {
|
|
77
|
+
readonly snapshotId: string;
|
|
78
|
+
readonly jobId?: string;
|
|
79
|
+
readonly operationId?: string;
|
|
80
|
+
readonly capturedAt: string;
|
|
81
|
+
readonly publicSummary: string;
|
|
82
|
+
readonly summaryHash?: string;
|
|
83
|
+
readonly relativePath?: string;
|
|
84
|
+
readonly retainedRefs: readonly string[];
|
|
85
|
+
readonly artifactRefs: readonly unknown[];
|
|
86
|
+
readonly evidenceRefs: readonly unknown[];
|
|
87
|
+
readonly checkpoint?: Readonly<Record<string, unknown>>;
|
|
88
|
+
readonly reasonCode?: string;
|
|
89
|
+
readonly publicSafe: true;
|
|
90
|
+
}
|
|
91
|
+
export interface ContinuitySnapshotCompactContext {
|
|
92
|
+
readonly preferredSource: 'compact_summary' | 'recent_events';
|
|
93
|
+
readonly summaries: readonly ContinuitySnapshotCompactContextRef[];
|
|
94
|
+
readonly publicSafe: true;
|
|
95
|
+
}
|
|
96
|
+
export interface ContinuityClientSnapshot {
|
|
97
|
+
readonly schemaVersion: typeof CONTINUITY_CLIENT_SCHEMA_VERSION;
|
|
98
|
+
readonly contractVersion: typeof CONTINUITY_CLIENT_CONTRACT_VERSION;
|
|
99
|
+
readonly generatedAt: string;
|
|
100
|
+
readonly store: {
|
|
101
|
+
readonly schemaVersion: number;
|
|
102
|
+
readonly readable: true;
|
|
103
|
+
};
|
|
104
|
+
readonly jobs: readonly ContinuitySnapshotJobSummary[];
|
|
105
|
+
readonly counts: Readonly<Record<string, number>>;
|
|
106
|
+
readonly dueJobCount: number;
|
|
107
|
+
readonly dueJobs: readonly ContinuitySnapshotJobSummary[];
|
|
108
|
+
readonly staleLeases: readonly ContinuitySnapshotStaleLeaseSummary[];
|
|
109
|
+
readonly outbox: Readonly<Record<string, number>>;
|
|
110
|
+
readonly lastReceipts: readonly ContinuitySnapshotReceiptRef[];
|
|
111
|
+
readonly lastEvents: readonly ContinuitySnapshotEventRef[];
|
|
112
|
+
readonly compactContext: ContinuitySnapshotCompactContext;
|
|
113
|
+
readonly redactions: readonly ContinuityRedactionEvidence[];
|
|
114
|
+
readonly publicSafe: true;
|
|
115
|
+
}
|
|
116
|
+
export interface ContinuityHardStopSnapshot {
|
|
117
|
+
readonly schemaVersion: typeof CONTINUITY_CLIENT_SCHEMA_VERSION;
|
|
118
|
+
readonly contractVersion: typeof CONTINUITY_CLIENT_CONTRACT_VERSION;
|
|
119
|
+
readonly generatedAt: string;
|
|
120
|
+
readonly hardStop: true;
|
|
121
|
+
readonly reasonCodes: readonly ContinuityClientReasonCode[];
|
|
122
|
+
readonly publicSafe: true;
|
|
123
|
+
}
|
|
124
|
+
export type ContinuitySnapshotForInvoke = ContinuityClientSnapshot | ContinuityHardStopSnapshot;
|
|
125
|
+
export interface OpenContinuityClientStateStoreOptions {
|
|
126
|
+
readonly projectRoot: string;
|
|
127
|
+
readonly adapter?: ContinuitySqliteAdapter;
|
|
128
|
+
readonly adapterLoader?: () => Promise<ContinuitySqliteAdapterLoadResult>;
|
|
129
|
+
readonly now?: () => string;
|
|
130
|
+
}
|
|
131
|
+
export interface ContinuitySnapshotOptions {
|
|
132
|
+
readonly nowIso?: string;
|
|
133
|
+
readonly jobLimit?: number;
|
|
134
|
+
readonly dueJobLimit?: number;
|
|
135
|
+
readonly staleLeaseLimit?: number;
|
|
136
|
+
readonly receiptLimit?: number;
|
|
137
|
+
readonly eventLimit?: number;
|
|
138
|
+
readonly snapshotLimit?: number;
|
|
139
|
+
}
|
|
140
|
+
interface ContinuityOperationLogLike {
|
|
141
|
+
readonly schemaVersion?: unknown;
|
|
142
|
+
readonly contractVersion?: unknown;
|
|
143
|
+
readonly jobId?: unknown;
|
|
144
|
+
readonly operations?: unknown;
|
|
145
|
+
readonly metadata?: unknown;
|
|
146
|
+
readonly publicSafe?: unknown;
|
|
147
|
+
}
|
|
148
|
+
export declare class ContinuityClientStateStoreError extends Error {
|
|
149
|
+
readonly reasonCodes: readonly ContinuityClientReasonCode[];
|
|
150
|
+
readonly redactions: readonly ContinuityRedactionEvidence[];
|
|
151
|
+
readonly mutationBlocked: boolean;
|
|
152
|
+
constructor(message: string, reasonCodes: readonly ContinuityClientReasonCode[], options?: {
|
|
153
|
+
readonly redactions?: readonly ContinuityRedactionEvidence[];
|
|
154
|
+
readonly mutationBlocked?: boolean;
|
|
155
|
+
readonly cause?: unknown;
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
export declare function continuitySqliteExists(projectRoot: string): boolean;
|
|
159
|
+
export declare function createContinuityHardStopSnapshot(reasonCodes: readonly ContinuityClientReasonCode[], nowIso?: string): ContinuityHardStopSnapshot;
|
|
160
|
+
export declare function openContinuityClientStateStore(options: OpenContinuityClientStateStoreOptions): Promise<ContinuityClientStateStore>;
|
|
161
|
+
export declare class ContinuityClientStateStore {
|
|
162
|
+
private readonly store;
|
|
163
|
+
private readonly now;
|
|
164
|
+
constructor(store: ContinuitySqliteStore, now?: () => string);
|
|
165
|
+
close(): void;
|
|
166
|
+
collectSnapshot(options?: ContinuitySnapshotOptions): ContinuityClientSnapshot;
|
|
167
|
+
applyStateUpdate(update: unknown): ContinuityApplyResult;
|
|
168
|
+
applyOperationLog(log: ContinuityOperationLogLike): ContinuityApplyResult;
|
|
169
|
+
private applyKnownOperation;
|
|
170
|
+
private applyCompactContext;
|
|
171
|
+
private applyCreateJob;
|
|
172
|
+
private applyUpdateJobStatus;
|
|
173
|
+
private applyAppendEvent;
|
|
174
|
+
private applyAppendReceipt;
|
|
175
|
+
private applyUpsertGoalCampaign;
|
|
176
|
+
private applyUpsertGoalLedgerItem;
|
|
177
|
+
private applyUpsertVerifier;
|
|
178
|
+
private applyUpsertReviewGate;
|
|
179
|
+
private applyOutbox;
|
|
180
|
+
private recordAppliedAudit;
|
|
181
|
+
private recordIgnoredAuditIfPossible;
|
|
182
|
+
}
|
|
183
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{existsSync as X}from"node:fs";import{createHash as ee}from"node:crypto";import{ContinuitySqliteStoreError as te,continuitySqliteStorePath as ne,openContinuitySqliteStore as oe}from"./sqlite-store.js";const b=1,C="continuity-v1",p=Object.freeze({OK:"continuity-ok",INVALID_SCHEMA_VERSION:"invalid-schema-version",INVALID_CONTRACT_VERSION:"invalid-contract-version",UNKNOWN_OPERATION_REQUIRED:"unknown-operation-required",UNKNOWN_OPERATION_IGNORED:"unknown-operation-ignored",DUPLICATE_OPERATION_ID:"duplicate-operation-id",IDEMPOTENCY_REPLAY:"idempotency-replay",UNSAFE_FIELD_REJECTED:"unsafe-field-rejected",SQLITE_ADAPTER_UNAVAILABLE:"sqlite-adapter-unavailable",SQLITE_INTEGRITY_FAILED:"sqlite-integrity-failed",SQLITE_MUTATION_FAILED:"sqlite-mutation-failed"}),ae=new Set(["create_job","update_job_status","append_event","append_receipt","upsert_goal_campaign","upsert_goal_ledger_item","upsert_verifier","upsert_review_gate","schedule_next_tick","acquire_lease","release_lease","compact_context","enqueue_outbox","append_outbox"]),re=new Set(["schemaVersion","contractVersion","jobId","operationId","idempotencyKey","goalId","loopId","campaignId","itemId","ledgerItemIds","verifierId","verifierIds","gateId","reviewGateIds","runnerId","leaseId","status","reasonCode","reasonCodes","counts","hashes","relativePaths","artifactRefs","evidenceRefs","validationRefs","registryRefs","storyIds","epicIds","debtIds","iteration","durationMs","retryCount","nextTickAt","publicSummary","redactionEvidence"]),w=/(raw[_-]?logs?|prompt(?:[_-]?(?:body|text))?|private[_-]?urls?|secret|token|password|protected(?:[_-]?(?:field|body|internals))?|workflow(?:[_-]?body)?|step(?:[_-]?body)?|customer(?:[_-]?(?:pii|data))?|authorization|api[_-]?key|license[_-]?key)/i,K=/\bhttps?:\/\/\S+/i,M=/(ghp_[A-Za-z0-9_]+|sk-[A-Za-z0-9_-]+|-----BEGIN [A-Z ]*PRIVATE KEY-----|authorization\s*:|password\s*=|token\s*=|api[_-]?key\s*=|license[_-]?key\s*=)/i,q=/(raw[_-]?log|transcript|stack trace|stderr:|stdout:)/i,F=/(prompt[_-]?body|system prompt|workflow body|step body)/i,B=/(PROTECTED_|_PROTECTED_|PRIVATE_INTERNALS|CUSTOMER_PII|VENDOR_CORPUS|P180[_-]?SYNTHETIC[_-]?CONTINUITY)/i,L=240,z=2400,ie=40,se=20,ce=40,de=20,P=80;class f extends Error{reasonCodes;redactions;mutationBlocked;constructor(e,n,o={}){super(e),this.name="ContinuityClientStateStoreError",this.reasonCodes=E(n),this.redactions=o.redactions??[],this.mutationBlocked=o.mutationBlocked??!1,this.cause=o.cause}}function we(t){return X(ne(t))}function Pe(t,e=new Date().toISOString()){return{schemaVersion:b,contractVersion:C,generatedAt:e,hardStop:!0,reasonCodes:E(t),publicSafe:!0}}async function Ve(t){const e=await oe({projectRoot:t.projectRoot,adapter:t.adapter,adapterLoader:t.adapterLoader,now:t.now});return new ue(e,t.now??(()=>new Date().toISOString()))}class ue{store;now;constructor(e,n=()=>new Date().toISOString()){this.store=e,this.now=n}close(){this.store.close()}collectSnapshot(e={}){try{const n=e.nowIso??this.now(),o=this.store.collectSnapshotRows({nowIso:n,jobLimit:e.jobLimit??20,staleLeaseLimit:e.staleLeaseLimit??10,receiptLimit:e.receiptLimit??10,eventLimit:e.eventLimit??10,snapshotLimit:e.snapshotLimit??5}),a=this.store.listDueJobs({nowIso:n,limit:e.dueJobLimit??10}),s=be(o.receipts).slice(0,20);return{schemaVersion:b,contractVersion:C,generatedAt:n,store:{schemaVersion:o.schemaVersion,readable:!0},jobs:o.jobs.map(G),counts:o.counts,dueJobCount:o.counts.dueJobs??0,dueJobs:a.map(G),staleLeases:o.staleLeases.map(i=>({leaseId:d(i.lease_id,100),jobId:d(i.job_id,100),runnerId:d(i.runner_id,100),expiresAt:d(i.expires_at,80),publicSafe:!0})),outbox:{total:o.counts.outbox??0,pending:o.outboxCounts.pending??0,failed:o.outboxCounts.failed??0,deadLetter:o.outboxCounts.dead_letter??0,sent:o.outboxCounts.sent??0,acked:o.outboxCounts.acked??0},lastReceipts:o.receipts.map(i=>({receiptId:d(i.receipt_id,100),jobId:d(i.job_id,100),...i.operation_id?{operationId:d(i.operation_id,100)}:{},status:d(i.status,40),...i.reason_code?{reasonCode:d(i.reason_code,80)}:{},createdAt:d(i.created_at,80),publicSafe:!0})),lastEvents:o.events.map(i=>({eventId:d(i.event_id,100),jobId:d(i.job_id,100),operationId:d(i.operation_id,100),type:d(i.type,80),publicSummary:d(i.summary,L),...i.reason_code?{reasonCode:d(i.reason_code,80)}:{},createdAt:d(i.created_at,80),publicSafe:!0})),compactContext:me(o.stateSnapshots),redactions:s,publicSafe:!0}}catch(n){throw Z(n,"Failed to collect continuity snapshot.")}}applyStateUpdate(e){const n=ye(e),o=[],a=[],s=[],i=[];for(const u of n){const m=this.applyOperationLog(u);o.push(...m.appliedOperationIds),a.push(...m.ignoredOperationIds),s.push(...m.reasonCodes),i.push(...m.redactions)}return{ok:!0,appliedOperationIds:E(o),ignoredOperationIds:E(a),reasonCodes:E(s.length>0?s:[p.OK]),redactions:i,publicSafe:!0}}applyOperationLog(e){const n=_e(e),o=[],a=[...n.ignoredOperationIds],s=[...n.reasonCodes],i=[...n.redactions];try{this.store.runInTransaction(()=>{for(const u of n.operations){if(this.store.hasOperationRef(u.operationId,u.idempotencyKey)){a.push(u.operationId),s.push(p.IDEMPOTENCY_REPLAY);continue}this.applyKnownOperation(u,n.logMetadata),o.push(u.operationId),u.type!=="append_receipt"&&this.recordAppliedAudit(u)}for(const u of n.skippedOperations)this.recordIgnoredAuditIfPossible(u,p.UNKNOWN_OPERATION_IGNORED)})}catch(u){throw Z(u,"Failed to apply continuity operation log atomically.")}return{ok:!0,appliedOperationIds:E(o),ignoredOperationIds:E(a),reasonCodes:E(s.length>0?s:[p.OK]),redactions:i,publicSafe:!0}}applyKnownOperation(e,n){switch(e.type){case"create_job":this.applyCreateJob(e,n);return;case"update_job_status":this.applyUpdateJobStatus(e);return;case"append_event":this.applyAppendEvent(e);return;case"append_receipt":this.applyAppendReceipt(e);return;case"upsert_goal_campaign":this.applyUpsertGoalCampaign(e);return;case"schedule_next_tick":this.store.scheduleNextTick({jobId:e.jobId,scheduledAt:r(e,"scheduledAt"),updatedAt:e.createdAt,reasonCode:c(e,"reasonCode")});return;case"acquire_lease":this.store.acquireLease({leaseId:r(e,"leaseId"),jobId:e.jobId,runnerId:r(e,"runnerId"),acquiredAt:r(e,"acquiredAt"),expiresAt:r(e,"expiresAt"),operationId:e.operationId,idempotencyKey:e.idempotencyKey,metadata:h(e.metadata,"operation.metadata")});return;case"release_lease":this.store.releaseLease({leaseId:r(e,"leaseId"),releasedAt:r(e,"releasedAt"),reasonCode:c(e,"reasonCode")});return;case"compact_context":this.applyCompactContext(e);return;case"upsert_goal_ledger_item":this.applyUpsertGoalLedgerItem(e);return;case"upsert_verifier":this.applyUpsertVerifier(e);return;case"upsert_review_gate":this.applyUpsertReviewGate(e);return;case"enqueue_outbox":case"append_outbox":this.applyOutbox(e);return;default:throw new f(`Unknown continuity operation ${e.type}.`,[p.UNKNOWN_OPERATION_REQUIRED],{mutationBlocked:!0})}}applyCompactContext(e){const n=D(r(e,"summaryHash"),"compact_context.summaryHash"),o=W(e.retainedRefs,"compact_context.retainedRefs",ie),a=Se(c(e,"publicSummary")??`Context compacted with ${o.length} retained public refs.`),s=Re(e),i=Oe(e),u=W(e.decisionLogRefs,"compact_context.decisionLogRefs",de),m=Ne(e,o,s,i),l=E([...o,...u,...s.map(_=>_.relativePath),...i.map(_=>_.relativePath)]).slice(0,P),v=Te(a),O=c(e,"reasonCode")??"context-compacted",k={schemaVersion:b,contractVersion:C,jobId:e.jobId,operationId:e.operationId,reasonCode:O,publicSummary:a,counts:{retainedRefs:o.length,artifactRefs:s.length,evidenceRefs:i.length,decisionLogRefs:u.length,...T(e,"inputTokens")!==void 0?{inputContextUnits:T(e,"inputTokens")}:{},...T(e,"outputTokens")!==void 0?{outputContextUnits:T(e,"outputTokens")}:{},summaryChars:a.length},hashes:{summary:n,persistedSummary:v},relativePaths:l,artifactRefs:s,evidenceRefs:i,validationRefs:u,redactionEvidence:e.redactions??[],checkpoint:m};for(const[_,g]of s.entries())this.store.recordArtifact({artifactId:`artifact-${R(e.operationId)}-${_+1}`,jobId:e.jobId,kind:g.kind,relativePath:g.relativePath,sha256:g.sha256,summary:g.publicSummary,createdAt:e.createdAt,operationId:`${e.operationId}:artifact:${_+1}`,idempotencyKey:e.idempotencyKey?`${e.idempotencyKey}:artifact:${_+1}`:void 0,metadata:{schemaVersion:b,contractVersion:C,jobId:e.jobId,operationId:e.operationId,reasonCode:O,hashes:g.sha256?{artifact:g.sha256}:{},relativePaths:[g.relativePath],publicSummary:g.publicSummary}});this.store.recordStateSnapshot({snapshotId:`snapshot-${R(e.operationId)}`,jobId:e.jobId,kind:"context_compaction",relativePath:s.find(_=>_.kind==="context_summary")?.relativePath,sha256:n,summary:a,capturedAt:e.createdAt,operationId:e.operationId,idempotencyKey:e.idempotencyKey,metadata:k}),this.store.appendEvent({eventId:`event-${R(e.operationId)}-context-compacted`,jobId:e.jobId,operationId:`${e.operationId}:event`,idempotencyKey:e.idempotencyKey?`${e.idempotencyKey}:event`:void 0,sequence:e.sequence,type:"context_compacted",summary:`Context compaction checkpoint ${m.checkpointId} persisted with ${l.length} public refs.`,reasonCode:O,createdAt:e.createdAt,metadata:{schemaVersion:b,contractVersion:C,jobId:e.jobId,operationId:e.operationId,reasonCode:O,counts:k.counts,hashes:k.hashes,relativePaths:l,artifactRefs:s.map(_=>_.relativePath),evidenceRefs:i,publicSummary:a}})}applyCreateJob(e,n){const o=N(e,"job");this.store.recordJob({jobId:r(o,"jobId"),kind:r(o,"kind"),status:r(o,"status"),createdAt:r(o,"createdAt"),updatedAt:r(o,"updatedAt"),summary:c(o,"summary"),reasonCode:c(o,"reasonCode"),nextRunAt:c(o,"nextRunAt"),goalId:c(o,"goalId"),loopId:c(o,"loopId"),campaignId:c(o,"campaignId"),operationId:e.operationId,idempotencyKey:e.idempotencyKey,metadata:h(y(o,"metadata")??y(e,"metadata")??{...n},"job.metadata")})}applyUpdateJobStatus(e){this.store.updateJobStatus({jobId:e.jobId,status:r(e,"status"),updatedAt:e.createdAt,reasonCode:c(e,"reasonCode")})}applyAppendEvent(e){const n=N(e,"event");this.store.appendEvent({eventId:r(n,"eventId"),jobId:r(n,"jobId"),operationId:e.operationId,idempotencyKey:e.idempotencyKey,sequence:e.sequence,type:r(n,"type"),summary:r(n,"summary"),reasonCode:c(n,"reasonCode"),createdAt:r(n,"createdAt"),metadata:h(y(n,"metadata"),"event.metadata")})}applyAppendReceipt(e){const n=N(e,"receipt"),o=c(n,"operationId")??e.operationId;this.store.appendReceipt({receiptId:r(n,"receiptId"),jobId:r(n,"jobId"),operationId:o,idempotencyKey:e.idempotencyKey,status:r(n,"status"),reasonCode:c(n,"reasonCode"),appliedOperationIds:j(n.appliedOperationIds),ignoredOperationIds:j(n.ignoredOperationIds),createdAt:r(n,"createdAt"),metadata:h(y(n,"metadata"),"receipt.metadata")})}applyUpsertGoalCampaign(e){const n=N(e,"campaign");this.store.upsertGoalCampaign({campaignId:r(n,"campaignId"),jobId:r(n,"jobId"),status:r(n,"status"),title:c(n,"title"),publicSummary:c(n,"publicSummary"),reasonCode:c(n,"reasonCode"),createdAt:r(n,"createdAt"),updatedAt:r(n,"updatedAt"),operationId:e.operationId,idempotencyKey:e.idempotencyKey,metadata:h(y(n,"metadata"),"campaign.metadata")})}applyUpsertGoalLedgerItem(e){const n=N(e,"item");this.store.upsertGoalLedgerItem({itemId:r(n,"itemId"),campaignId:r(n,"campaignId"),jobId:r(n,"jobId"),itemType:r(n,"type"),status:r(n,"status"),summary:r(n,"publicSummary"),reasonCode:c(n,"reasonCode"),createdAt:e.createdAt,updatedAt:r(n,"updatedAt"),operationId:e.operationId,idempotencyKey:e.idempotencyKey,metadata:h(y(n,"metadata"),"item.metadata")})}applyUpsertVerifier(e){const n=N(e,"verifier");this.store.upsertGoalVerifier({verifierId:r(n,"verifierId"),campaignId:r(n,"campaignId"),jobId:r(n,"jobId"),kind:r(n,"kind"),status:r(n,"status"),summary:c(n,"publicSummary"),reasonCode:c(n,"reasonCode"),lastCheckedAt:c(n,"lastCheckedAt"),operationId:e.operationId,idempotencyKey:e.idempotencyKey,metadata:h(y(n,"metadata"),"verifier.metadata")})}applyUpsertReviewGate(e){const n=N(e,"reviewGate");this.store.upsertGoalReviewGate({gateId:r(n,"gateId"),campaignId:r(n,"campaignId"),jobId:r(n,"jobId"),status:r(n,"status"),summary:c(n,"publicSummary"),required:ge(n,"required")??!0,reasonCode:c(n,"reasonCode"),operationId:e.operationId,idempotencyKey:e.idempotencyKey,metadata:h(y(n,"metadata"),"reviewGate.metadata")})}applyOutbox(e){const n=y(e,"outbox")??e;this.store.enqueueOutbox({outboxId:c(n,"outboxId")??`outbox-${R(e.operationId)}`,jobId:c(n,"jobId")??e.jobId,operationId:e.operationId,idempotencyKey:e.idempotencyKey,type:c(n,"type")===e.type?"continuity_event":r(n,"type"),status:c(n,"status"),payload:h(y(n,"payload")??y(e,"metadata")??{},"outbox.payload"),retryCount:T(n,"retryCount"),nextAttemptAt:c(n,"nextAttemptAt"),lastErrorCode:c(n,"lastErrorCode"),createdAt:c(n,"createdAt")??e.createdAt,updatedAt:c(n,"updatedAt")??e.createdAt})}recordAppliedAudit(e){this.store.recordOperationAudit({receiptId:`receipt-${R(e.operationId)}`,jobId:e.jobId,operationId:e.operationId,idempotencyKey:`audit-${e.idempotencyKey??e.operationId}`,status:"applied",reasonCode:p.OK,appliedOperationIds:[e.operationId],createdAt:e.createdAt,metadata:{schemaVersion:b,contractVersion:C,jobId:e.jobId,operationId:e.operationId,status:"applied",reasonCode:p.OK}})}recordIgnoredAuditIfPossible(e,n){this.store.jobExists(e.jobId)&&this.store.recordOperationAudit({receiptId:`receipt-${R(e.operationId)}-ignored`,jobId:e.jobId,operationId:e.operationId,idempotencyKey:`audit-${e.idempotencyKey??e.operationId}-ignored`,status:"ignored",reasonCode:n,ignoredOperationIds:[e.operationId],createdAt:e.createdAt,metadata:{schemaVersion:b,contractVersion:C,jobId:e.jobId,operationId:e.operationId,status:"ignored",reasonCode:n}})}}function G(t){const e=pe(t.metadata_json,t.iteration);return S(e,"goalLedgerItems","goal_ledger_item_count"in t?t.goal_ledger_item_count:void 0),S(e,"blockedGoalLedgerItems","blocked_goal_ledger_item_count"in t?t.blocked_goal_ledger_item_count:void 0),S(e,"securityIssuesBlocked","security_issue_blocked_count"in t?t.security_issue_blocked_count:void 0),S(e,"goalVerifiers","goal_verifier_count"in t?t.goal_verifier_count:void 0),S(e,"failedVerifiers","failed_verifier_count"in t?t.failed_verifier_count:void 0),S(e,"unavailableVerifiers","unavailable_verifier_count"in t?t.unavailable_verifier_count:void 0),S(e,"goalReviewGates","goal_review_gate_count"in t?t.goal_review_gate_count:void 0),S(e,"failedRequiredReviewGates","failed_required_review_gate_count"in t?t.failed_required_review_gate_count:void 0),{jobId:d(t.job_id,80),kind:d(t.kind,40),status:d(t.status,40),publicSummary:d(t.summary??"No public summary recorded.",L),createdAt:d(t.created_at,80),updatedAt:d(t.updated_at,80),...t.next_run_at?{nextRunAt:d(t.next_run_at,80)}:{},...t.reason_code?{reasonCode:d(t.reason_code,80)}:{},...Object.keys(e).length>0?{counts:e}:{},publicSafe:!0}}function S(t,e,n){typeof n=="number"&&Number.isFinite(n)&&n>0&&(t[e]=Math.floor(n))}function pe(t,e){const n={};if(t)try{const o=JSON.parse(t),a=I(o)&&I(o.counts)?o.counts:void 0;if(a)for(const[s,i]of Object.entries(a))typeof i=="number"&&Number.isFinite(i)&&(n[s]=Math.max(0,Math.floor(i)))}catch{}return typeof e=="number"&&Number.isFinite(e)&&(n.iteration=Math.max(0,Math.floor(e))),n}function me(t){const e=t.map(le).filter(n=>!!n);return{preferredSource:e.length>0?"compact_summary":"recent_events",summaries:e,publicSafe:!0}}function le(t){const e=fe(t.metadata_json),n=I(e.hashes)?e.hashes:{},o=typeof n.summary=="string"?n.summary:t.sha256??void 0,a=typeof e.reasonCode=="string"?d(e.reasonCode,80):void 0;return{snapshotId:d(t.snapshot_id,120),...t.job_id?{jobId:d(t.job_id,100)}:{},...t.operation_id?{operationId:d(t.operation_id,120)}:{},capturedAt:d(t.captured_at,80),publicSummary:d(t.summary??"Context compacted with public-safe refs.",z),...o?{summaryHash:d(o,120)}:{},...t.relative_path?{relativePath:d(t.relative_path,240)}:{},retainedRefs:Ie(e.relativePaths),artifactRefs:H(e.artifactRefs),evidenceRefs:H(e.evidenceRefs),...I(e.checkpoint)?{checkpoint:J(e.checkpoint)}:{},...a?{reasonCode:a}:{},publicSafe:!0}}function fe(t){if(!t)return{};try{const e=JSON.parse(t);return I(e)?e:{}}catch{return{}}}function Ie(t){return Array.isArray(t)?t.filter(e=>typeof e=="string"&&e.length>0).map(e=>d(e,240)).slice(0,P):[]}function H(t){return Array.isArray(t)?t.map(V).filter(e=>e!==void 0).slice(0,P):[]}function J(t){const e={};for(const[n,o]of Object.entries(t).slice(0,20)){if(w.test(n))continue;const a=V(o);a!==void 0&&(e[d(n,80)]=a)}return e}function V(t){if(!x(t)){if(typeof t=="string")return d(t,240);if(typeof t=="number"&&Number.isFinite(t))return Math.floor(t);if(typeof t=="boolean"||t===null)return t;if(Array.isArray(t))return t.map(V).filter(n=>n!==void 0).slice(0,20);if(I(t))return J(t)}}function ye(t){return I(t)?Array.isArray(t.operationLogs)?t.operationLogs.filter(I):I(t.operationLog)?[t.operationLog]:Array.isArray(t.operations)?[t]:[]:[]}function _e(t){const e=[],n=[],o=[],a=[],s=[],i=new Map;if(t.schemaVersion!==b)throw new f("Invalid continuity operation log schema version.",[p.INVALID_SCHEMA_VERSION],{mutationBlocked:!0});if(t.contractVersion!==C)throw new f("Invalid continuity operation log contract version.",[p.INVALID_CONTRACT_VERSION],{mutationBlocked:!0});if(t.publicSafe!==!0)throw new f("Continuity operation log is not marked public-safe.",[p.UNSAFE_FIELD_REJECTED],{mutationBlocked:!0});const u=h(y(t,"metadata"),"log.metadata");if(!Array.isArray(t.operations))return{operations:[],skippedOperations:o,ignoredOperationIds:a,reasonCodes:e,redactions:n,logMetadata:u};for(const m of[...t.operations].filter(I).sort(Ce)){const l=he(m),v=U(l),O=i.get(l.operationId);if(O!==void 0){if(O===v){a.push(l.operationId),e.push(p.IDEMPOTENCY_REPLAY);continue}throw n.push({field:"operationId",reason:"unknown_required_operation",evidence:"operation-denied",publicSafe:!0}),new f("Duplicate continuity operation ID with conflicting payload.",[p.DUPLICATE_OPERATION_ID],{redactions:n,mutationBlocked:!0})}if(i.set(l.operationId,v),h(l.metadata,"operation.metadata"),!ae.has(l.type)){const k=m.required===!0;if(m.forwardCompatible===!0&&!k){o.push(l),a.push(l.operationId),e.push(p.UNKNOWN_OPERATION_IGNORED);continue}throw n.push({field:l.type,reason:"unknown_required_operation",evidence:"operation-denied",publicSafe:!0}),new f(`Unknown required continuity operation ${l.type}.`,[p.UNKNOWN_OPERATION_REQUIRED],{redactions:n,mutationBlocked:!0})}s.push(l)}return{operations:s,skippedOperations:o,ignoredOperationIds:a,reasonCodes:e,redactions:n,logMetadata:u}}function he(t){if(t.schemaVersion!==b)throw new f("Invalid continuity operation schema version.",[p.INVALID_SCHEMA_VERSION],{mutationBlocked:!0});if(t.contractVersion!==C)throw new f("Invalid continuity operation contract version.",[p.INVALID_CONTRACT_VERSION],{mutationBlocked:!0});if(t.publicSafe!==!0)throw new f("Continuity operation is not marked public-safe.",[p.UNSAFE_FIELD_REJECTED],{mutationBlocked:!0});const e=r(t,"type"),n=r(t,"operationId"),o=r(t,"jobId"),a=Ee(t,"sequence"),s=r(t,"createdAt");return{...t,type:e,operationId:n,jobId:o,schemaVersion:b,contractVersion:C,sequence:a,createdAt:s,idempotencyKey:c(t,"idempotencyKey"),metadata:y(t,"metadata"),publicSafe:!0}}function h(t,e){if(!t)return{};const n={},o=[];for(const[a,s]of Object.entries(t)){const i=Ae(a),u=x(s),m=i??u;if(m){o.push({field:`${e}.${a}`,reason:m,evidence:i?"key-denied":"value-denied",publicSafe:!0});continue}n[a]=s}if(o.length>0)throw new f(`Continuity metadata rejected unsafe public fields at ${e}.`,[p.UNSAFE_FIELD_REJECTED],{redactions:o,mutationBlocked:!0});return n}function Ae(t){return!re.has(t)||w.test(t)?"unsafe_key":null}function x(t){if(typeof t=="string")return K.test(t)?"private_url":M.test(t)?"secret":F.test(t)?"prompt_body":q.test(t)?"raw_log":B.test(t)?"protected_field":null;if(t===null||typeof t=="number"||typeof t=="boolean")return null;if(Array.isArray(t)){for(const e of t){const n=x(e);if(n)return n}return null}if(I(t)){for(const[e,n]of Object.entries(t)){if(w.test(e))return"unsafe_key";const o=x(n);if(o)return o}return null}return"unsafe_key"}function be(t){const e=[];for(const n of t)if(n.metadata_json)try{const a=JSON.parse(n.metadata_json).redactionEvidence;if(!Array.isArray(a))continue;for(const s of a)I(s)&&(typeof s.field!="string"||typeof s.reason!="string"||typeof s.evidence!="string"||e.push({field:d(s.field,120),reason:s.reason,evidence:s.evidence,publicSafe:!0}))}catch{}return e}function Ce(t,e){const n=typeof t.sequence=="number"?t.sequence:0,o=typeof e.sequence=="number"?e.sequence:0;if(n!==o)return n-o;const a=String(t.createdAt??"").localeCompare(String(e.createdAt??""));return a!==0?a:String(t.operationId??"").localeCompare(String(e.operationId??""))}function I(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function N(t,e){const n=t[e];if(!I(n))throw new f(`Continuity operation missing object field ${e}.`,[p.INVALID_SCHEMA_VERSION],{mutationBlocked:!0});return n}function y(t,e){const n=t[e];return I(n)?n:void 0}function r(t,e){const n=t[e];if(typeof n!="string"||n.length===0)throw new f(`Continuity operation missing string field ${e}.`,[p.INVALID_SCHEMA_VERSION],{mutationBlocked:!0});return n}function c(t,e){const n=t[e];return typeof n=="string"&&n.length>0?n:void 0}function Ee(t,e){const n=t[e];if(typeof n!="number"||!Number.isFinite(n))throw new f(`Continuity operation missing numeric field ${e}.`,[p.INVALID_SCHEMA_VERSION],{mutationBlocked:!0});return n}function T(t,e){const n=t[e];return typeof n=="number"&&Number.isFinite(n)?n:void 0}function ge(t,e){const n=t[e];return typeof n=="boolean"?n:void 0}function j(t){return Array.isArray(t)?t.filter(e=>typeof e=="string"&&e.length>0):[]}function Y(t){return Array.isArray(t)?t.filter(I):[]}function Se(t){return A(t,z,"compact_context.publicSummary")}function A(t,e,n){const o=t.trim();if(!o)throw new f(`Continuity compaction missing public text at ${n}.`,[p.INVALID_SCHEMA_VERSION],{mutationBlocked:!0});const a=x(o);if(a)throw new f(`Continuity compaction rejected unsafe public text at ${n}.`,[p.UNSAFE_FIELD_REJECTED],{redactions:[{field:n,reason:a,evidence:"value-denied",publicSafe:!0}],mutationBlocked:!0});return o.length<=e?o:`${o.slice(0,e)}\u2026[TRUNCATED:${o.length-e}]`}function D(t,e){return A(t,120,e)}function W(t,e,n){return E(j(t).map((o,a)=>$(o,`${e}[${a}]`))).slice(0,n)}function $(t,e){const n=A(t,240,e).replace(/\\/g,"/"),o=n.split("/").filter(Boolean),a=/^[A-Za-z]:\//.test(n);if(n.startsWith("/")||n.startsWith("~")||n.includes("://")||a||o.includes(".."))throw new f(`Continuity compaction rejected non-relative ref at ${e}.`,[p.UNSAFE_FIELD_REJECTED],{redactions:[{field:e,reason:"private_url",evidence:"value-denied",publicSafe:!0}],mutationBlocked:!0});return n}function Re(t){const e=[],n=y(t,"summaryRef");n&&e.push(Q(n,"compact_context.summaryRef","context_summary"));for(const[a,s]of Y(t.artifactRefs).entries())e.push(Q(s,`compact_context.artifactRefs[${a}]`));const o=new Set;return e.filter(a=>{const s=`${a.kind}:${a.relativePath}`;return o.has(s)?!1:(o.add(s),!0)}).slice(0,se)}function Q(t,e,n="context_summary"){const o=A(c(t,"kind")??n,60,`${e}.kind`),a=$(r(t,"relativePath"),`${e}.relativePath`),s=c(t,"sha256"),i=c(t,"publicSummary");return{kind:o,relativePath:a,...s?{sha256:D(s,`${e}.sha256`)}:{},...i?{publicSummary:A(i,L,`${e}.publicSummary`)}:{},publicSafe:!0}}function Oe(t){return Y(t.evidenceIndex).map((e,n)=>{const o=`compact_context.evidenceIndex[${n}]`,a=$(r(e,"relativePath"),`${o}.relativePath`),s=c(e,"refId")??`evidence-${R(a)}`,i=c(e,"reasonCode")??c(t,"reasonCode")??"context-compacted",u=c(e,"sha256"),m=c(e,"publicSummary");return{refId:A(s,120,`${o}.refId`),relativePath:a,reasonCode:A(i,80,`${o}.reasonCode`),...u?{sha256:D(u,`${o}.sha256`)}:{},...m?{publicSummary:A(m,L,`${o}.publicSummary`)}:{},publicSafe:!0}}).slice(0,ce)}function Ne(t,e,n,o){const a=y(t,"checkpoint")??{},s=c(a,"checkpointId")??`checkpoint-${R(t.operationId)}`,i=c(a,"capturedAt")??t.createdAt,u={checkpointId:A(s,120,"compact_context.checkpoint.checkpointId"),capturedAt:A(i,80,"compact_context.checkpoint.capturedAt"),retainedRefCount:e.length,artifactRefCount:n.length,evidenceRefCount:o.length,publicSafe:!0};for(const m of["eventCursor","receiptCursor"]){const l=c(a,m);l&&(u[m]=A(l,120,`compact_context.checkpoint.${m}`))}for(const m of["recentEventCount","recentReceiptCount"]){const l=T(a,m);l!==void 0&&(u[m]=Math.max(0,Math.floor(l)))}return u}function Te(t){return`sha256:${ee("sha256").update(t).digest("hex")}`}function E(t){return Array.from(new Set(t))}function R(t){return t.replace(/[^a-z0-9_.:-]+/gi,"-").slice(0,120)}function d(t,e){const n=ke(t);return n.length<=e?n:`${n.slice(0,e)}\u2026[TRUNCATED:${n.length-e}]`}function ke(t){return K.test(t)||M.test(t)||q.test(t)||F.test(t)||B.test(t)?"[REDACTED]":t}function U(t){return Array.isArray(t)?`[${t.map(U).join(",")}]`:I(t)?`{${Object.keys(t).sort().map(e=>`${JSON.stringify(e)}:${U(t[e])}`).join(",")}}`:JSON.stringify(t)}function Z(t,e){if(t instanceof f)return t;if(t instanceof te)return new f(t.message,[t.reasonCode],{mutationBlocked:t.mutationBlocked,cause:t});const n=t instanceof Error?t.message:String(t);return new f(`${e} ${n}`,[p.SQLITE_MUTATION_FAILED],{cause:t})}export{C as CONTINUITY_CLIENT_CONTRACT_VERSION,p as CONTINUITY_CLIENT_REASON_CODES,b as CONTINUITY_CLIENT_SCHEMA_VERSION,ue as ContinuityClientStateStore,f as ContinuityClientStateStoreError,we as continuitySqliteExists,Pe as createContinuityHardStopSnapshot,Ve as openContinuityClientStateStore};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license FSL-1.1
|
|
3
|
+
* Copyright (c) 2026 OrNexus AI
|
|
4
|
+
*
|
|
5
|
+
* P180.05 -- invoke.ts hooks for client-owned continuity SQLite state.
|
|
6
|
+
*/
|
|
7
|
+
import { type ContinuityClientReasonCode, type ContinuitySnapshotForInvoke } from './continuity-client-state-store.js';
|
|
8
|
+
export interface ContinuityPersistResult {
|
|
9
|
+
readonly ok: boolean;
|
|
10
|
+
readonly appliedOperationIds: readonly string[];
|
|
11
|
+
readonly ignoredOperationIds: readonly string[];
|
|
12
|
+
readonly reasonCodes: readonly ContinuityClientReasonCode[];
|
|
13
|
+
readonly publicSafe: true;
|
|
14
|
+
readonly error?: string;
|
|
15
|
+
}
|
|
16
|
+
export declare function isContinuityTrigger(args: string): boolean;
|
|
17
|
+
export declare function readContinuityForRequest(args: string, projectRoot: string, nowIso?: string): Promise<ContinuitySnapshotForInvoke | undefined>;
|
|
18
|
+
export declare function persistContinuityFromResponse(metadata: Record<string, unknown> | undefined, projectRoot: string): Promise<ContinuityPersistResult>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{CONTINUITY_CLIENT_REASON_CODES as i,ContinuityClientStateStoreError as l,continuitySqliteExists as s,createContinuityHardStopSnapshot as S,openContinuityClientStateStore as u}from"./continuity-client-state-store.js";const f=/^\s*\*?(goal|loop|jobs|runner)\b/i;function d(e){return f.test(e)}async function C(e,n,r){if(d(e)||s(n))try{const t=await u({projectRoot:n,now:()=>r??new Date().toISOString()});try{return t.collectSnapshot({nowIso:r})}finally{t.close()}}catch(t){const a=p(t);return d(e)||s(n)?S(a,r??new Date().toISOString()):void 0}}async function E(e,n){const r=e?.continuityStateUpdate;if(!r)return{ok:!0,appliedOperationIds:[],ignoredOperationIds:[],reasonCodes:[i.OK],publicSafe:!0};let o;try{o=await u({projectRoot:n});const t=o.applyStateUpdate(r);return{ok:!0,appliedOperationIds:t.appliedOperationIds,ignoredOperationIds:t.ignoredOperationIds,reasonCodes:t.reasonCodes,publicSafe:!0}}catch(t){const a=p(t),c=t instanceof Error?t.message:String(t);return{ok:!1,appliedOperationIds:[],ignoredOperationIds:[],reasonCodes:a,error:c,publicSafe:!0}}finally{o?.close()}}function p(e){if(e instanceof l)return e.reasonCodes;const n=e instanceof Error?e.message:String(e);return/sqlite-adapter-unavailable/i.test(n)?[i.SQLITE_ADAPTER_UNAVAILABLE]:/integrity|corrupt|malformed|not a database/i.test(n)?[i.SQLITE_INTEGRITY_FAILED]:[i.SQLITE_MUTATION_FAILED]}export{d as isContinuityTrigger,E as persistContinuityFromResponse,C as readContinuityForRequest};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license FSL-1.1
|
|
3
|
+
* Copyright (c) 2026 OrNexus AI
|
|
4
|
+
*
|
|
5
|
+
* P180.04 -- Initial public-safe Enterprise Continuity Plane SQLite schema.
|
|
6
|
+
*/
|
|
7
|
+
export declare const INITIAL_CONTINUITY_SQLITE_MIGRATION: Readonly<{
|
|
8
|
+
readonly version: 1;
|
|
9
|
+
readonly name: "initial-continuity-schema";
|
|
10
|
+
readonly sql: "\nCREATE TABLE IF NOT EXISTS jobs (\n job_id TEXT PRIMARY KEY,\n kind TEXT NOT NULL CHECK (kind IN ('goal', 'loop', 'runner', 'jobs')),\n status TEXT NOT NULL CHECK (status IN (\n 'draft', 'planned', 'active', 'running', 'waiting_external', 'waiting_human',\n 'backoff', 'paused', 'blocked', 'completed', 'aborted', 'cancelled'\n )),\n summary TEXT,\n reason_code TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n next_run_at TEXT,\n goal_id TEXT,\n loop_id TEXT,\n campaign_id TEXT,\n operation_id TEXT,\n idempotency_key TEXT,\n metadata_json TEXT CHECK (metadata_json IS NULL OR json_valid(metadata_json)),\n public_safe INTEGER NOT NULL DEFAULT 1 CHECK (public_safe = 1),\n UNIQUE (operation_id),\n UNIQUE (idempotency_key)\n);\n\nCREATE INDEX IF NOT EXISTS idx_jobs_status ON jobs(status);\nCREATE INDEX IF NOT EXISTS idx_jobs_next_run_at ON jobs(next_run_at);\nCREATE INDEX IF NOT EXISTS idx_jobs_goal_id ON jobs(goal_id);\nCREATE INDEX IF NOT EXISTS idx_jobs_loop_id ON jobs(loop_id);\n\nCREATE TABLE IF NOT EXISTS job_leases (\n lease_id TEXT PRIMARY KEY,\n job_id TEXT NOT NULL,\n runner_id TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'acquired' CHECK (status IN ('acquired', 'released', 'expired')),\n acquired_at TEXT NOT NULL,\n expires_at TEXT NOT NULL,\n released_at TEXT,\n operation_id TEXT,\n idempotency_key TEXT,\n metadata_json TEXT CHECK (metadata_json IS NULL OR json_valid(metadata_json)),\n public_safe INTEGER NOT NULL DEFAULT 1 CHECK (public_safe = 1),\n FOREIGN KEY (job_id) REFERENCES jobs(job_id) ON DELETE CASCADE,\n UNIQUE (operation_id),\n UNIQUE (idempotency_key)\n);\n\nCREATE INDEX IF NOT EXISTS idx_job_leases_job_id ON job_leases(job_id);\nCREATE INDEX IF NOT EXISTS idx_job_leases_expires_at ON job_leases(expires_at);\nCREATE UNIQUE INDEX IF NOT EXISTS idx_job_leases_active_job\n ON job_leases(job_id)\n WHERE released_at IS NULL;\n\nCREATE TABLE IF NOT EXISTS job_events (\n event_id TEXT PRIMARY KEY,\n job_id TEXT NOT NULL,\n operation_id TEXT NOT NULL,\n idempotency_key TEXT,\n event_sequence INTEGER,\n type TEXT NOT NULL,\n summary TEXT NOT NULL,\n reason_code TEXT,\n created_at TEXT NOT NULL,\n metadata_json TEXT CHECK (metadata_json IS NULL OR json_valid(metadata_json)),\n public_safe INTEGER NOT NULL DEFAULT 1 CHECK (public_safe = 1),\n FOREIGN KEY (job_id) REFERENCES jobs(job_id) ON DELETE CASCADE,\n UNIQUE (operation_id),\n UNIQUE (idempotency_key)\n);\n\nCREATE INDEX IF NOT EXISTS idx_job_events_job_id ON job_events(job_id);\nCREATE INDEX IF NOT EXISTS idx_job_events_created_at ON job_events(created_at);\n\nCREATE TABLE IF NOT EXISTS job_receipts (\n receipt_id TEXT PRIMARY KEY,\n job_id TEXT NOT NULL,\n operation_id TEXT,\n idempotency_key TEXT,\n status TEXT NOT NULL CHECK (status IN ('accepted', 'applied', 'ignored', 'failed', 'deferred')),\n reason_code TEXT,\n applied_operation_ids_json TEXT CHECK (applied_operation_ids_json IS NULL OR json_valid(applied_operation_ids_json)),\n ignored_operation_ids_json TEXT CHECK (ignored_operation_ids_json IS NULL OR json_valid(ignored_operation_ids_json)),\n created_at TEXT NOT NULL,\n metadata_json TEXT CHECK (metadata_json IS NULL OR json_valid(metadata_json)),\n public_safe INTEGER NOT NULL DEFAULT 1 CHECK (public_safe = 1),\n FOREIGN KEY (job_id) REFERENCES jobs(job_id) ON DELETE CASCADE,\n UNIQUE (operation_id),\n UNIQUE (idempotency_key)\n);\n\nCREATE INDEX IF NOT EXISTS idx_job_receipts_job_id ON job_receipts(job_id);\nCREATE INDEX IF NOT EXISTS idx_job_receipts_created_at ON job_receipts(created_at);\n\nCREATE TABLE IF NOT EXISTS goal_campaigns (\n campaign_id TEXT PRIMARY KEY,\n job_id TEXT NOT NULL UNIQUE,\n status TEXT NOT NULL,\n title TEXT,\n public_summary TEXT,\n reason_code TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n operation_id TEXT,\n idempotency_key TEXT,\n metadata_json TEXT CHECK (metadata_json IS NULL OR json_valid(metadata_json)),\n public_safe INTEGER NOT NULL DEFAULT 1 CHECK (public_safe = 1),\n FOREIGN KEY (job_id) REFERENCES jobs(job_id) ON DELETE CASCADE,\n UNIQUE (operation_id),\n UNIQUE (idempotency_key)\n);\n\nCREATE INDEX IF NOT EXISTS idx_goal_campaigns_status ON goal_campaigns(status);\n\nCREATE TABLE IF NOT EXISTS goal_ledger_items (\n item_id TEXT PRIMARY KEY,\n campaign_id TEXT NOT NULL,\n operation_id TEXT NOT NULL,\n idempotency_key TEXT,\n item_type TEXT NOT NULL,\n status TEXT NOT NULL,\n summary TEXT NOT NULL,\n reason_code TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n metadata_json TEXT CHECK (metadata_json IS NULL OR json_valid(metadata_json)),\n public_safe INTEGER NOT NULL DEFAULT 1 CHECK (public_safe = 1),\n FOREIGN KEY (campaign_id) REFERENCES goal_campaigns(campaign_id) ON DELETE CASCADE,\n UNIQUE (operation_id),\n UNIQUE (idempotency_key)\n);\n\nCREATE INDEX IF NOT EXISTS idx_goal_ledger_items_campaign_id ON goal_ledger_items(campaign_id);\n\nCREATE TABLE IF NOT EXISTS goal_verifiers (\n verifier_id TEXT PRIMARY KEY,\n campaign_id TEXT NOT NULL,\n kind TEXT NOT NULL,\n status TEXT NOT NULL,\n summary TEXT,\n reason_code TEXT,\n last_checked_at TEXT,\n operation_id TEXT,\n idempotency_key TEXT,\n metadata_json TEXT CHECK (metadata_json IS NULL OR json_valid(metadata_json)),\n public_safe INTEGER NOT NULL DEFAULT 1 CHECK (public_safe = 1),\n FOREIGN KEY (campaign_id) REFERENCES goal_campaigns(campaign_id) ON DELETE CASCADE,\n UNIQUE (operation_id),\n UNIQUE (idempotency_key)\n);\n\nCREATE INDEX IF NOT EXISTS idx_goal_verifiers_campaign_id ON goal_verifiers(campaign_id);\n\nCREATE TABLE IF NOT EXISTS goal_review_gates (\n gate_id TEXT PRIMARY KEY,\n campaign_id TEXT NOT NULL,\n status TEXT NOT NULL,\n summary TEXT,\n required INTEGER NOT NULL DEFAULT 1 CHECK (required IN (0, 1)),\n reason_code TEXT,\n operation_id TEXT,\n idempotency_key TEXT,\n metadata_json TEXT CHECK (metadata_json IS NULL OR json_valid(metadata_json)),\n public_safe INTEGER NOT NULL DEFAULT 1 CHECK (public_safe = 1),\n FOREIGN KEY (campaign_id) REFERENCES goal_campaigns(campaign_id) ON DELETE CASCADE,\n UNIQUE (operation_id),\n UNIQUE (idempotency_key)\n);\n\nCREATE INDEX IF NOT EXISTS idx_goal_review_gates_campaign_id ON goal_review_gates(campaign_id);\n\nCREATE TABLE IF NOT EXISTS loop_jobs (\n loop_id TEXT PRIMARY KEY,\n job_id TEXT NOT NULL UNIQUE,\n interval_seconds INTEGER NOT NULL CHECK (interval_seconds > 0),\n max_iterations INTEGER,\n max_duration_ms INTEGER,\n backoff_policy_json TEXT CHECK (backoff_policy_json IS NULL OR json_valid(backoff_policy_json)),\n overlap_policy TEXT NOT NULL,\n next_tick_at TEXT,\n iteration INTEGER NOT NULL DEFAULT 0 CHECK (iteration >= 0),\n operation_id TEXT,\n idempotency_key TEXT,\n metadata_json TEXT CHECK (metadata_json IS NULL OR json_valid(metadata_json)),\n public_safe INTEGER NOT NULL DEFAULT 1 CHECK (public_safe = 1),\n FOREIGN KEY (job_id) REFERENCES jobs(job_id) ON DELETE CASCADE,\n UNIQUE (operation_id),\n UNIQUE (idempotency_key)\n);\n\nCREATE INDEX IF NOT EXISTS idx_loop_jobs_next_tick_at ON loop_jobs(next_tick_at);\n\nCREATE TABLE IF NOT EXISTS artifacts (\n artifact_id TEXT PRIMARY KEY,\n job_id TEXT,\n kind TEXT NOT NULL,\n relative_path TEXT NOT NULL,\n sha256 TEXT,\n summary TEXT,\n operation_id TEXT,\n idempotency_key TEXT,\n created_at TEXT NOT NULL,\n metadata_json TEXT CHECK (metadata_json IS NULL OR json_valid(metadata_json)),\n public_safe INTEGER NOT NULL DEFAULT 1 CHECK (public_safe = 1),\n FOREIGN KEY (job_id) REFERENCES jobs(job_id) ON DELETE SET NULL,\n UNIQUE (operation_id),\n UNIQUE (idempotency_key)\n);\n\nCREATE INDEX IF NOT EXISTS idx_artifacts_job_id ON artifacts(job_id);\nCREATE INDEX IF NOT EXISTS idx_artifacts_relative_path ON artifacts(relative_path);\n\nCREATE TABLE IF NOT EXISTS state_snapshots (\n snapshot_id TEXT PRIMARY KEY,\n job_id TEXT,\n kind TEXT NOT NULL,\n relative_path TEXT,\n sha256 TEXT,\n summary TEXT,\n captured_at TEXT NOT NULL,\n operation_id TEXT,\n idempotency_key TEXT,\n metadata_json TEXT CHECK (metadata_json IS NULL OR json_valid(metadata_json)),\n public_safe INTEGER NOT NULL DEFAULT 1 CHECK (public_safe = 1),\n FOREIGN KEY (job_id) REFERENCES jobs(job_id) ON DELETE SET NULL,\n UNIQUE (operation_id),\n UNIQUE (idempotency_key)\n);\n\nCREATE INDEX IF NOT EXISTS idx_state_snapshots_job_id ON state_snapshots(job_id);\nCREATE INDEX IF NOT EXISTS idx_state_snapshots_captured_at ON state_snapshots(captured_at);\n\nCREATE TABLE IF NOT EXISTS runner_config (\n key TEXT PRIMARY KEY,\n value_json TEXT NOT NULL CHECK (json_valid(value_json)),\n updated_at TEXT NOT NULL,\n operation_id TEXT,\n idempotency_key TEXT,\n public_safe INTEGER NOT NULL DEFAULT 1 CHECK (public_safe = 1),\n UNIQUE (operation_id),\n UNIQUE (idempotency_key)\n);\n\nCREATE TABLE IF NOT EXISTS outbox (\n outbox_id TEXT PRIMARY KEY,\n job_id TEXT,\n operation_id TEXT NOT NULL,\n idempotency_key TEXT,\n type TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'pending' CHECK (status IN ('pending', 'sent', 'acked', 'failed', 'dead_letter')),\n payload_json TEXT NOT NULL CHECK (json_valid(payload_json)),\n retry_count INTEGER NOT NULL DEFAULT 0 CHECK (retry_count >= 0),\n next_attempt_at TEXT,\n last_error_code TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n public_safe INTEGER NOT NULL DEFAULT 1 CHECK (public_safe = 1),\n FOREIGN KEY (job_id) REFERENCES jobs(job_id) ON DELETE SET NULL,\n UNIQUE (operation_id),\n UNIQUE (idempotency_key)\n);\n\nCREATE INDEX IF NOT EXISTS idx_outbox_status_next_attempt ON outbox(status, next_attempt_at);\nCREATE INDEX IF NOT EXISTS idx_outbox_job_id ON outbox(job_id);\n";
|
|
11
|
+
}>;
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
const E=Object.freeze({version:1,name:"initial-continuity-schema",sql:`
|
|
2
|
+
CREATE TABLE IF NOT EXISTS jobs (
|
|
3
|
+
job_id TEXT PRIMARY KEY,
|
|
4
|
+
kind TEXT NOT NULL CHECK (kind IN ('goal', 'loop', 'runner', 'jobs')),
|
|
5
|
+
status TEXT NOT NULL CHECK (status IN (
|
|
6
|
+
'draft', 'planned', 'active', 'running', 'waiting_external', 'waiting_human',
|
|
7
|
+
'backoff', 'paused', 'blocked', 'completed', 'aborted', 'cancelled'
|
|
8
|
+
)),
|
|
9
|
+
summary TEXT,
|
|
10
|
+
reason_code TEXT,
|
|
11
|
+
created_at TEXT NOT NULL,
|
|
12
|
+
updated_at TEXT NOT NULL,
|
|
13
|
+
next_run_at TEXT,
|
|
14
|
+
goal_id TEXT,
|
|
15
|
+
loop_id TEXT,
|
|
16
|
+
campaign_id TEXT,
|
|
17
|
+
operation_id TEXT,
|
|
18
|
+
idempotency_key TEXT,
|
|
19
|
+
metadata_json TEXT CHECK (metadata_json IS NULL OR json_valid(metadata_json)),
|
|
20
|
+
public_safe INTEGER NOT NULL DEFAULT 1 CHECK (public_safe = 1),
|
|
21
|
+
UNIQUE (operation_id),
|
|
22
|
+
UNIQUE (idempotency_key)
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
CREATE INDEX IF NOT EXISTS idx_jobs_status ON jobs(status);
|
|
26
|
+
CREATE INDEX IF NOT EXISTS idx_jobs_next_run_at ON jobs(next_run_at);
|
|
27
|
+
CREATE INDEX IF NOT EXISTS idx_jobs_goal_id ON jobs(goal_id);
|
|
28
|
+
CREATE INDEX IF NOT EXISTS idx_jobs_loop_id ON jobs(loop_id);
|
|
29
|
+
|
|
30
|
+
CREATE TABLE IF NOT EXISTS job_leases (
|
|
31
|
+
lease_id TEXT PRIMARY KEY,
|
|
32
|
+
job_id TEXT NOT NULL,
|
|
33
|
+
runner_id TEXT NOT NULL,
|
|
34
|
+
status TEXT NOT NULL DEFAULT 'acquired' CHECK (status IN ('acquired', 'released', 'expired')),
|
|
35
|
+
acquired_at TEXT NOT NULL,
|
|
36
|
+
expires_at TEXT NOT NULL,
|
|
37
|
+
released_at TEXT,
|
|
38
|
+
operation_id TEXT,
|
|
39
|
+
idempotency_key TEXT,
|
|
40
|
+
metadata_json TEXT CHECK (metadata_json IS NULL OR json_valid(metadata_json)),
|
|
41
|
+
public_safe INTEGER NOT NULL DEFAULT 1 CHECK (public_safe = 1),
|
|
42
|
+
FOREIGN KEY (job_id) REFERENCES jobs(job_id) ON DELETE CASCADE,
|
|
43
|
+
UNIQUE (operation_id),
|
|
44
|
+
UNIQUE (idempotency_key)
|
|
45
|
+
);
|
|
46
|
+
|
|
47
|
+
CREATE INDEX IF NOT EXISTS idx_job_leases_job_id ON job_leases(job_id);
|
|
48
|
+
CREATE INDEX IF NOT EXISTS idx_job_leases_expires_at ON job_leases(expires_at);
|
|
49
|
+
CREATE UNIQUE INDEX IF NOT EXISTS idx_job_leases_active_job
|
|
50
|
+
ON job_leases(job_id)
|
|
51
|
+
WHERE released_at IS NULL;
|
|
52
|
+
|
|
53
|
+
CREATE TABLE IF NOT EXISTS job_events (
|
|
54
|
+
event_id TEXT PRIMARY KEY,
|
|
55
|
+
job_id TEXT NOT NULL,
|
|
56
|
+
operation_id TEXT NOT NULL,
|
|
57
|
+
idempotency_key TEXT,
|
|
58
|
+
event_sequence INTEGER,
|
|
59
|
+
type TEXT NOT NULL,
|
|
60
|
+
summary TEXT NOT NULL,
|
|
61
|
+
reason_code TEXT,
|
|
62
|
+
created_at TEXT NOT NULL,
|
|
63
|
+
metadata_json TEXT CHECK (metadata_json IS NULL OR json_valid(metadata_json)),
|
|
64
|
+
public_safe INTEGER NOT NULL DEFAULT 1 CHECK (public_safe = 1),
|
|
65
|
+
FOREIGN KEY (job_id) REFERENCES jobs(job_id) ON DELETE CASCADE,
|
|
66
|
+
UNIQUE (operation_id),
|
|
67
|
+
UNIQUE (idempotency_key)
|
|
68
|
+
);
|
|
69
|
+
|
|
70
|
+
CREATE INDEX IF NOT EXISTS idx_job_events_job_id ON job_events(job_id);
|
|
71
|
+
CREATE INDEX IF NOT EXISTS idx_job_events_created_at ON job_events(created_at);
|
|
72
|
+
|
|
73
|
+
CREATE TABLE IF NOT EXISTS job_receipts (
|
|
74
|
+
receipt_id TEXT PRIMARY KEY,
|
|
75
|
+
job_id TEXT NOT NULL,
|
|
76
|
+
operation_id TEXT,
|
|
77
|
+
idempotency_key TEXT,
|
|
78
|
+
status TEXT NOT NULL CHECK (status IN ('accepted', 'applied', 'ignored', 'failed', 'deferred')),
|
|
79
|
+
reason_code TEXT,
|
|
80
|
+
applied_operation_ids_json TEXT CHECK (applied_operation_ids_json IS NULL OR json_valid(applied_operation_ids_json)),
|
|
81
|
+
ignored_operation_ids_json TEXT CHECK (ignored_operation_ids_json IS NULL OR json_valid(ignored_operation_ids_json)),
|
|
82
|
+
created_at TEXT NOT NULL,
|
|
83
|
+
metadata_json TEXT CHECK (metadata_json IS NULL OR json_valid(metadata_json)),
|
|
84
|
+
public_safe INTEGER NOT NULL DEFAULT 1 CHECK (public_safe = 1),
|
|
85
|
+
FOREIGN KEY (job_id) REFERENCES jobs(job_id) ON DELETE CASCADE,
|
|
86
|
+
UNIQUE (operation_id),
|
|
87
|
+
UNIQUE (idempotency_key)
|
|
88
|
+
);
|
|
89
|
+
|
|
90
|
+
CREATE INDEX IF NOT EXISTS idx_job_receipts_job_id ON job_receipts(job_id);
|
|
91
|
+
CREATE INDEX IF NOT EXISTS idx_job_receipts_created_at ON job_receipts(created_at);
|
|
92
|
+
|
|
93
|
+
CREATE TABLE IF NOT EXISTS goal_campaigns (
|
|
94
|
+
campaign_id TEXT PRIMARY KEY,
|
|
95
|
+
job_id TEXT NOT NULL UNIQUE,
|
|
96
|
+
status TEXT NOT NULL,
|
|
97
|
+
title TEXT,
|
|
98
|
+
public_summary TEXT,
|
|
99
|
+
reason_code TEXT,
|
|
100
|
+
created_at TEXT NOT NULL,
|
|
101
|
+
updated_at TEXT NOT NULL,
|
|
102
|
+
operation_id TEXT,
|
|
103
|
+
idempotency_key TEXT,
|
|
104
|
+
metadata_json TEXT CHECK (metadata_json IS NULL OR json_valid(metadata_json)),
|
|
105
|
+
public_safe INTEGER NOT NULL DEFAULT 1 CHECK (public_safe = 1),
|
|
106
|
+
FOREIGN KEY (job_id) REFERENCES jobs(job_id) ON DELETE CASCADE,
|
|
107
|
+
UNIQUE (operation_id),
|
|
108
|
+
UNIQUE (idempotency_key)
|
|
109
|
+
);
|
|
110
|
+
|
|
111
|
+
CREATE INDEX IF NOT EXISTS idx_goal_campaigns_status ON goal_campaigns(status);
|
|
112
|
+
|
|
113
|
+
CREATE TABLE IF NOT EXISTS goal_ledger_items (
|
|
114
|
+
item_id TEXT PRIMARY KEY,
|
|
115
|
+
campaign_id TEXT NOT NULL,
|
|
116
|
+
operation_id TEXT NOT NULL,
|
|
117
|
+
idempotency_key TEXT,
|
|
118
|
+
item_type TEXT NOT NULL,
|
|
119
|
+
status TEXT NOT NULL,
|
|
120
|
+
summary TEXT NOT NULL,
|
|
121
|
+
reason_code TEXT,
|
|
122
|
+
created_at TEXT NOT NULL,
|
|
123
|
+
updated_at TEXT NOT NULL,
|
|
124
|
+
metadata_json TEXT CHECK (metadata_json IS NULL OR json_valid(metadata_json)),
|
|
125
|
+
public_safe INTEGER NOT NULL DEFAULT 1 CHECK (public_safe = 1),
|
|
126
|
+
FOREIGN KEY (campaign_id) REFERENCES goal_campaigns(campaign_id) ON DELETE CASCADE,
|
|
127
|
+
UNIQUE (operation_id),
|
|
128
|
+
UNIQUE (idempotency_key)
|
|
129
|
+
);
|
|
130
|
+
|
|
131
|
+
CREATE INDEX IF NOT EXISTS idx_goal_ledger_items_campaign_id ON goal_ledger_items(campaign_id);
|
|
132
|
+
|
|
133
|
+
CREATE TABLE IF NOT EXISTS goal_verifiers (
|
|
134
|
+
verifier_id TEXT PRIMARY KEY,
|
|
135
|
+
campaign_id TEXT NOT NULL,
|
|
136
|
+
kind TEXT NOT NULL,
|
|
137
|
+
status TEXT NOT NULL,
|
|
138
|
+
summary TEXT,
|
|
139
|
+
reason_code TEXT,
|
|
140
|
+
last_checked_at TEXT,
|
|
141
|
+
operation_id TEXT,
|
|
142
|
+
idempotency_key TEXT,
|
|
143
|
+
metadata_json TEXT CHECK (metadata_json IS NULL OR json_valid(metadata_json)),
|
|
144
|
+
public_safe INTEGER NOT NULL DEFAULT 1 CHECK (public_safe = 1),
|
|
145
|
+
FOREIGN KEY (campaign_id) REFERENCES goal_campaigns(campaign_id) ON DELETE CASCADE,
|
|
146
|
+
UNIQUE (operation_id),
|
|
147
|
+
UNIQUE (idempotency_key)
|
|
148
|
+
);
|
|
149
|
+
|
|
150
|
+
CREATE INDEX IF NOT EXISTS idx_goal_verifiers_campaign_id ON goal_verifiers(campaign_id);
|
|
151
|
+
|
|
152
|
+
CREATE TABLE IF NOT EXISTS goal_review_gates (
|
|
153
|
+
gate_id TEXT PRIMARY KEY,
|
|
154
|
+
campaign_id TEXT NOT NULL,
|
|
155
|
+
status TEXT NOT NULL,
|
|
156
|
+
summary TEXT,
|
|
157
|
+
required INTEGER NOT NULL DEFAULT 1 CHECK (required IN (0, 1)),
|
|
158
|
+
reason_code TEXT,
|
|
159
|
+
operation_id TEXT,
|
|
160
|
+
idempotency_key TEXT,
|
|
161
|
+
metadata_json TEXT CHECK (metadata_json IS NULL OR json_valid(metadata_json)),
|
|
162
|
+
public_safe INTEGER NOT NULL DEFAULT 1 CHECK (public_safe = 1),
|
|
163
|
+
FOREIGN KEY (campaign_id) REFERENCES goal_campaigns(campaign_id) ON DELETE CASCADE,
|
|
164
|
+
UNIQUE (operation_id),
|
|
165
|
+
UNIQUE (idempotency_key)
|
|
166
|
+
);
|
|
167
|
+
|
|
168
|
+
CREATE INDEX IF NOT EXISTS idx_goal_review_gates_campaign_id ON goal_review_gates(campaign_id);
|
|
169
|
+
|
|
170
|
+
CREATE TABLE IF NOT EXISTS loop_jobs (
|
|
171
|
+
loop_id TEXT PRIMARY KEY,
|
|
172
|
+
job_id TEXT NOT NULL UNIQUE,
|
|
173
|
+
interval_seconds INTEGER NOT NULL CHECK (interval_seconds > 0),
|
|
174
|
+
max_iterations INTEGER,
|
|
175
|
+
max_duration_ms INTEGER,
|
|
176
|
+
backoff_policy_json TEXT CHECK (backoff_policy_json IS NULL OR json_valid(backoff_policy_json)),
|
|
177
|
+
overlap_policy TEXT NOT NULL,
|
|
178
|
+
next_tick_at TEXT,
|
|
179
|
+
iteration INTEGER NOT NULL DEFAULT 0 CHECK (iteration >= 0),
|
|
180
|
+
operation_id TEXT,
|
|
181
|
+
idempotency_key TEXT,
|
|
182
|
+
metadata_json TEXT CHECK (metadata_json IS NULL OR json_valid(metadata_json)),
|
|
183
|
+
public_safe INTEGER NOT NULL DEFAULT 1 CHECK (public_safe = 1),
|
|
184
|
+
FOREIGN KEY (job_id) REFERENCES jobs(job_id) ON DELETE CASCADE,
|
|
185
|
+
UNIQUE (operation_id),
|
|
186
|
+
UNIQUE (idempotency_key)
|
|
187
|
+
);
|
|
188
|
+
|
|
189
|
+
CREATE INDEX IF NOT EXISTS idx_loop_jobs_next_tick_at ON loop_jobs(next_tick_at);
|
|
190
|
+
|
|
191
|
+
CREATE TABLE IF NOT EXISTS artifacts (
|
|
192
|
+
artifact_id TEXT PRIMARY KEY,
|
|
193
|
+
job_id TEXT,
|
|
194
|
+
kind TEXT NOT NULL,
|
|
195
|
+
relative_path TEXT NOT NULL,
|
|
196
|
+
sha256 TEXT,
|
|
197
|
+
summary TEXT,
|
|
198
|
+
operation_id TEXT,
|
|
199
|
+
idempotency_key TEXT,
|
|
200
|
+
created_at TEXT NOT NULL,
|
|
201
|
+
metadata_json TEXT CHECK (metadata_json IS NULL OR json_valid(metadata_json)),
|
|
202
|
+
public_safe INTEGER NOT NULL DEFAULT 1 CHECK (public_safe = 1),
|
|
203
|
+
FOREIGN KEY (job_id) REFERENCES jobs(job_id) ON DELETE SET NULL,
|
|
204
|
+
UNIQUE (operation_id),
|
|
205
|
+
UNIQUE (idempotency_key)
|
|
206
|
+
);
|
|
207
|
+
|
|
208
|
+
CREATE INDEX IF NOT EXISTS idx_artifacts_job_id ON artifacts(job_id);
|
|
209
|
+
CREATE INDEX IF NOT EXISTS idx_artifacts_relative_path ON artifacts(relative_path);
|
|
210
|
+
|
|
211
|
+
CREATE TABLE IF NOT EXISTS state_snapshots (
|
|
212
|
+
snapshot_id TEXT PRIMARY KEY,
|
|
213
|
+
job_id TEXT,
|
|
214
|
+
kind TEXT NOT NULL,
|
|
215
|
+
relative_path TEXT,
|
|
216
|
+
sha256 TEXT,
|
|
217
|
+
summary TEXT,
|
|
218
|
+
captured_at TEXT NOT NULL,
|
|
219
|
+
operation_id TEXT,
|
|
220
|
+
idempotency_key TEXT,
|
|
221
|
+
metadata_json TEXT CHECK (metadata_json IS NULL OR json_valid(metadata_json)),
|
|
222
|
+
public_safe INTEGER NOT NULL DEFAULT 1 CHECK (public_safe = 1),
|
|
223
|
+
FOREIGN KEY (job_id) REFERENCES jobs(job_id) ON DELETE SET NULL,
|
|
224
|
+
UNIQUE (operation_id),
|
|
225
|
+
UNIQUE (idempotency_key)
|
|
226
|
+
);
|
|
227
|
+
|
|
228
|
+
CREATE INDEX IF NOT EXISTS idx_state_snapshots_job_id ON state_snapshots(job_id);
|
|
229
|
+
CREATE INDEX IF NOT EXISTS idx_state_snapshots_captured_at ON state_snapshots(captured_at);
|
|
230
|
+
|
|
231
|
+
CREATE TABLE IF NOT EXISTS runner_config (
|
|
232
|
+
key TEXT PRIMARY KEY,
|
|
233
|
+
value_json TEXT NOT NULL CHECK (json_valid(value_json)),
|
|
234
|
+
updated_at TEXT NOT NULL,
|
|
235
|
+
operation_id TEXT,
|
|
236
|
+
idempotency_key TEXT,
|
|
237
|
+
public_safe INTEGER NOT NULL DEFAULT 1 CHECK (public_safe = 1),
|
|
238
|
+
UNIQUE (operation_id),
|
|
239
|
+
UNIQUE (idempotency_key)
|
|
240
|
+
);
|
|
241
|
+
|
|
242
|
+
CREATE TABLE IF NOT EXISTS outbox (
|
|
243
|
+
outbox_id TEXT PRIMARY KEY,
|
|
244
|
+
job_id TEXT,
|
|
245
|
+
operation_id TEXT NOT NULL,
|
|
246
|
+
idempotency_key TEXT,
|
|
247
|
+
type TEXT NOT NULL,
|
|
248
|
+
status TEXT NOT NULL DEFAULT 'pending' CHECK (status IN ('pending', 'sent', 'acked', 'failed', 'dead_letter')),
|
|
249
|
+
payload_json TEXT NOT NULL CHECK (json_valid(payload_json)),
|
|
250
|
+
retry_count INTEGER NOT NULL DEFAULT 0 CHECK (retry_count >= 0),
|
|
251
|
+
next_attempt_at TEXT,
|
|
252
|
+
last_error_code TEXT,
|
|
253
|
+
created_at TEXT NOT NULL,
|
|
254
|
+
updated_at TEXT NOT NULL,
|
|
255
|
+
public_safe INTEGER NOT NULL DEFAULT 1 CHECK (public_safe = 1),
|
|
256
|
+
FOREIGN KEY (job_id) REFERENCES jobs(job_id) ON DELETE SET NULL,
|
|
257
|
+
UNIQUE (operation_id),
|
|
258
|
+
UNIQUE (idempotency_key)
|
|
259
|
+
);
|
|
260
|
+
|
|
261
|
+
CREATE INDEX IF NOT EXISTS idx_outbox_status_next_attempt ON outbox(status, next_attempt_at);
|
|
262
|
+
CREATE INDEX IF NOT EXISTS idx_outbox_job_id ON outbox(job_id);
|
|
263
|
+
`});export{E as INITIAL_CONTINUITY_SQLITE_MIGRATION};
|