common-memory-core 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.sample +3 -0
- package/CHANGELOG.md +39 -0
- package/LICENSE +21 -0
- package/README.md +120 -0
- package/SECURITY.md +48 -0
- package/dist/cli/codex/transcript-0.153.4.d.ts +20 -0
- package/dist/cli/codex/transcript-0.153.4.d.ts.map +1 -0
- package/dist/cli/codex/transcript-0.153.4.js +78 -0
- package/dist/cli/codex/transcript-0.153.4.js.map +1 -0
- package/dist/cli/codex-config.d.ts +2 -0
- package/dist/cli/codex-config.d.ts.map +1 -0
- package/dist/cli/codex-config.js +5 -0
- package/dist/cli/codex-config.js.map +1 -0
- package/dist/cli/codex-hook.d.ts +18 -0
- package/dist/cli/codex-hook.d.ts.map +1 -0
- package/dist/cli/codex-hook.js +140 -0
- package/dist/cli/codex-hook.js.map +1 -0
- package/dist/cli/codex-session.d.ts +3 -0
- package/dist/cli/codex-session.d.ts.map +1 -0
- package/dist/cli/codex-session.js +3 -0
- package/dist/cli/codex-session.js.map +1 -0
- package/dist/cli/flush-command.d.ts +6 -0
- package/dist/cli/flush-command.d.ts.map +1 -0
- package/dist/cli/flush-command.js +30 -0
- package/dist/cli/flush-command.js.map +1 -0
- package/dist/cli/host-launch.d.ts +28 -0
- package/dist/cli/host-launch.d.ts.map +1 -0
- package/dist/cli/host-launch.js +16 -0
- package/dist/cli/host-launch.js.map +1 -0
- package/dist/cli/host-process.d.ts +3 -0
- package/dist/cli/host-process.d.ts.map +1 -0
- package/dist/cli/host-process.js +35 -0
- package/dist/cli/host-process.js.map +1 -0
- package/dist/cli/host-session.d.ts +22 -0
- package/dist/cli/host-session.d.ts.map +1 -0
- package/dist/cli/host-session.js +204 -0
- package/dist/cli/host-session.js.map +1 -0
- package/dist/cli/import-command.d.ts +20 -0
- package/dist/cli/import-command.d.ts.map +1 -0
- package/dist/cli/import-command.js +98 -0
- package/dist/cli/import-command.js.map +1 -0
- package/dist/cli/interactive-process.d.ts +3 -0
- package/dist/cli/interactive-process.d.ts.map +1 -0
- package/dist/cli/interactive-process.js +15 -0
- package/dist/cli/interactive-process.js.map +1 -0
- package/dist/cli/main.d.ts +3 -0
- package/dist/cli/main.d.ts.map +1 -0
- package/dist/cli/main.js +151 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/mcp-config.d.ts +16 -0
- package/dist/cli/mcp-config.d.ts.map +1 -0
- package/dist/cli/mcp-config.js +108 -0
- package/dist/cli/mcp-config.js.map +1 -0
- package/dist/cli/network-test.d.ts +4 -0
- package/dist/cli/network-test.d.ts.map +1 -0
- package/dist/cli/network-test.js +28 -0
- package/dist/cli/network-test.js.map +1 -0
- package/dist/cli/operations.d.ts +26 -0
- package/dist/cli/operations.d.ts.map +1 -0
- package/dist/cli/operations.js +55 -0
- package/dist/cli/operations.js.map +1 -0
- package/dist/cli/session-drain.d.ts +3 -0
- package/dist/cli/session-drain.d.ts.map +1 -0
- package/dist/cli/session-drain.js +34 -0
- package/dist/cli/session-drain.js.map +1 -0
- package/dist/cli/storage-paths.d.ts +4 -0
- package/dist/cli/storage-paths.d.ts.map +1 -0
- package/dist/cli/storage-paths.js +15 -0
- package/dist/cli/storage-paths.js.map +1 -0
- package/dist/cli/tui-integrations.d.ts +4 -0
- package/dist/cli/tui-integrations.d.ts.map +1 -0
- package/dist/cli/tui-integrations.js +143 -0
- package/dist/cli/tui-integrations.js.map +1 -0
- package/dist/cli/tui-prompts.d.ts +22 -0
- package/dist/cli/tui-prompts.d.ts.map +1 -0
- package/dist/cli/tui-prompts.js +64 -0
- package/dist/cli/tui-prompts.js.map +1 -0
- package/dist/cli/tui-settings.d.ts +21 -0
- package/dist/cli/tui-settings.d.ts.map +1 -0
- package/dist/cli/tui-settings.js +198 -0
- package/dist/cli/tui-settings.js.map +1 -0
- package/dist/cli/tui.d.ts +4 -0
- package/dist/cli/tui.d.ts.map +1 -0
- package/dist/cli/tui.js +292 -0
- package/dist/cli/tui.js.map +1 -0
- package/dist/cli/work-config.d.ts +24 -0
- package/dist/cli/work-config.d.ts.map +1 -0
- package/dist/cli/work-config.js +147 -0
- package/dist/cli/work-config.js.map +1 -0
- package/dist/config/config.d.ts +41 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/config.js +193 -0
- package/dist/config/config.js.map +1 -0
- package/dist/config/private-env.d.ts +8 -0
- package/dist/config/private-env.d.ts.map +1 -0
- package/dist/config/private-env.js +38 -0
- package/dist/config/private-env.js.map +1 -0
- package/dist/config/runtime.d.ts +32 -0
- package/dist/config/runtime.d.ts.map +1 -0
- package/dist/config/runtime.js +85 -0
- package/dist/config/runtime.js.map +1 -0
- package/dist/core/contracts/errors.d.ts +10 -0
- package/dist/core/contracts/errors.d.ts.map +1 -0
- package/dist/core/contracts/errors.js +23 -0
- package/dist/core/contracts/errors.js.map +1 -0
- package/dist/core/safety/external-preflight.d.ts +7 -0
- package/dist/core/safety/external-preflight.d.ts.map +1 -0
- package/dist/core/safety/external-preflight.js +47 -0
- package/dist/core/safety/external-preflight.js.map +1 -0
- package/dist/core/safety/redaction.d.ts +2 -0
- package/dist/core/safety/redaction.d.ts.map +1 -0
- package/dist/core/safety/redaction.js +4 -0
- package/dist/core/safety/redaction.js.map +1 -0
- package/dist/core/safety/rules.d.ts +6 -0
- package/dist/core/safety/rules.d.ts.map +1 -0
- package/dist/core/safety/rules.js +14 -0
- package/dist/core/safety/rules.js.map +1 -0
- package/dist/core/safety/scanner.d.ts +11 -0
- package/dist/core/safety/scanner.d.ts.map +1 -0
- package/dist/core/safety/scanner.js +18 -0
- package/dist/core/safety/scanner.js.map +1 -0
- package/dist/core/transaction/fsync.d.ts +6 -0
- package/dist/core/transaction/fsync.d.ts.map +1 -0
- package/dist/core/transaction/fsync.js +41 -0
- package/dist/core/transaction/fsync.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/ingress.d.ts +61 -0
- package/dist/mcp/ingress.d.ts.map +1 -0
- package/dist/mcp/ingress.js +134 -0
- package/dist/mcp/ingress.js.map +1 -0
- package/dist/mcp/server.d.ts +4 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +92 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/stdio.d.ts +5 -0
- package/dist/mcp/stdio.d.ts.map +1 -0
- package/dist/mcp/stdio.js +115 -0
- package/dist/mcp/stdio.js.map +1 -0
- package/dist/memory-manager/contracts/diagnostic.d.ts +14 -0
- package/dist/memory-manager/contracts/diagnostic.d.ts.map +1 -0
- package/dist/memory-manager/contracts/diagnostic.js +17 -0
- package/dist/memory-manager/contracts/diagnostic.js.map +1 -0
- package/dist/memory-manager/contracts/disclosure.d.ts +12 -0
- package/dist/memory-manager/contracts/disclosure.d.ts.map +1 -0
- package/dist/memory-manager/contracts/disclosure.js +8 -0
- package/dist/memory-manager/contracts/disclosure.js.map +1 -0
- package/dist/memory-manager/contracts/errors.d.ts +15 -0
- package/dist/memory-manager/contracts/errors.d.ts.map +1 -0
- package/dist/memory-manager/contracts/errors.js +25 -0
- package/dist/memory-manager/contracts/errors.js.map +1 -0
- package/dist/memory-manager/contracts/model-port.d.ts +38 -0
- package/dist/memory-manager/contracts/model-port.d.ts.map +1 -0
- package/dist/memory-manager/contracts/model-port.js +2 -0
- package/dist/memory-manager/contracts/model-port.js.map +1 -0
- package/dist/memory-manager/network/client.d.ts +13 -0
- package/dist/memory-manager/network/client.d.ts.map +1 -0
- package/dist/memory-manager/network/client.js +122 -0
- package/dist/memory-manager/network/client.js.map +1 -0
- package/dist/memory-manager/network/route.d.ts +31 -0
- package/dist/memory-manager/network/route.d.ts.map +1 -0
- package/dist/memory-manager/network/route.js +148 -0
- package/dist/memory-manager/network/route.js.map +1 -0
- package/dist/memory-manager/openai/abort.d.ts +4 -0
- package/dist/memory-manager/openai/abort.d.ts.map +1 -0
- package/dist/memory-manager/openai/abort.js +19 -0
- package/dist/memory-manager/openai/abort.js.map +1 -0
- package/dist/memory-manager/openai/bounded-body.d.ts +2 -0
- package/dist/memory-manager/openai/bounded-body.d.ts.map +1 -0
- package/dist/memory-manager/openai/bounded-body.js +49 -0
- package/dist/memory-manager/openai/bounded-body.js.map +1 -0
- package/dist/memory-manager/openai/openai-chat-adapter.d.ts +16 -0
- package/dist/memory-manager/openai/openai-chat-adapter.d.ts.map +1 -0
- package/dist/memory-manager/openai/openai-chat-adapter.js +51 -0
- package/dist/memory-manager/openai/openai-chat-adapter.js.map +1 -0
- package/dist/memory-manager/openai/openai-responses-adapter.d.ts +15 -0
- package/dist/memory-manager/openai/openai-responses-adapter.d.ts.map +1 -0
- package/dist/memory-manager/openai/openai-responses-adapter.js +14 -0
- package/dist/memory-manager/openai/openai-responses-adapter.js.map +1 -0
- package/dist/memory-manager/openai/options.d.ts +14 -0
- package/dist/memory-manager/openai/options.d.ts.map +1 -0
- package/dist/memory-manager/openai/options.js +29 -0
- package/dist/memory-manager/openai/options.js.map +1 -0
- package/dist/memory-manager/openai/remote-http.d.ts +33 -0
- package/dist/memory-manager/openai/remote-http.d.ts.map +1 -0
- package/dist/memory-manager/openai/remote-http.js +207 -0
- package/dist/memory-manager/openai/remote-http.js.map +1 -0
- package/dist/memory-manager/openai/response-decoder.d.ts +3 -0
- package/dist/memory-manager/openai/response-decoder.d.ts.map +1 -0
- package/dist/memory-manager/openai/response-decoder.js +57 -0
- package/dist/memory-manager/openai/response-decoder.js.map +1 -0
- package/dist/memory-manager/openai/retry.d.ts +8 -0
- package/dist/memory-manager/openai/retry.d.ts.map +1 -0
- package/dist/memory-manager/openai/retry.js +18 -0
- package/dist/memory-manager/openai/retry.js.map +1 -0
- package/dist/pi-extension/extraction-runtime.d.ts +51 -0
- package/dist/pi-extension/extraction-runtime.d.ts.map +1 -0
- package/dist/pi-extension/extraction-runtime.js +87 -0
- package/dist/pi-extension/extraction-runtime.js.map +1 -0
- package/dist/pi-extension/index.d.ts +19 -0
- package/dist/pi-extension/index.d.ts.map +1 -0
- package/dist/pi-extension/index.js +172 -0
- package/dist/pi-extension/index.js.map +1 -0
- package/dist/v2/canonical.d.ts +53 -0
- package/dist/v2/canonical.d.ts.map +1 -0
- package/dist/v2/canonical.js +321 -0
- package/dist/v2/canonical.js.map +1 -0
- package/dist/v2/contract.d.ts +34 -0
- package/dist/v2/contract.d.ts.map +1 -0
- package/dist/v2/contract.js +53 -0
- package/dist/v2/contract.js.map +1 -0
- package/dist/v2/document-import.d.ts +100 -0
- package/dist/v2/document-import.d.ts.map +1 -0
- package/dist/v2/document-import.js +259 -0
- package/dist/v2/document-import.js.map +1 -0
- package/dist/v2/errors.d.ts +6 -0
- package/dist/v2/errors.d.ts.map +1 -0
- package/dist/v2/errors.js +29 -0
- package/dist/v2/errors.js.map +1 -0
- package/dist/v2/import.d.ts +26 -0
- package/dist/v2/import.d.ts.map +1 -0
- package/dist/v2/import.js +48 -0
- package/dist/v2/import.js.map +1 -0
- package/dist/v2/lock.d.ts +3 -0
- package/dist/v2/lock.d.ts.map +1 -0
- package/dist/v2/lock.js +47 -0
- package/dist/v2/lock.js.map +1 -0
- package/dist/v2/memory-maintainer.md +38 -0
- package/dist/v2/read-guidance.d.ts +3 -0
- package/dist/v2/read-guidance.d.ts.map +1 -0
- package/dist/v2/read-guidance.js +3 -0
- package/dist/v2/read-guidance.js.map +1 -0
- package/dist/v2/reader.d.ts +25 -0
- package/dist/v2/reader.d.ts.map +1 -0
- package/dist/v2/reader.js +38 -0
- package/dist/v2/reader.js.map +1 -0
- package/dist/v2/registry.d.ts +14 -0
- package/dist/v2/registry.d.ts.map +1 -0
- package/dist/v2/registry.js +46 -0
- package/dist/v2/registry.js.map +1 -0
- package/dist/v2/runtime.d.ts +133 -0
- package/dist/v2/runtime.d.ts.map +1 -0
- package/dist/v2/runtime.js +326 -0
- package/dist/v2/runtime.js.map +1 -0
- package/dist/v2/session-drain.d.ts +14 -0
- package/dist/v2/session-drain.d.ts.map +1 -0
- package/dist/v2/session-drain.js +16 -0
- package/dist/v2/session-drain.js.map +1 -0
- package/dist/v2/session.d.ts +54 -0
- package/dist/v2/session.d.ts.map +1 -0
- package/dist/v2/session.js +158 -0
- package/dist/v2/session.js.map +1 -0
- package/dist/v2/writer.d.ts +40 -0
- package/dist/v2/writer.d.ts.map +1 -0
- package/dist/v2/writer.js +327 -0
- package/dist/v2/writer.js.map +1 -0
- package/docs/00-index.md +19 -0
- package/docs/03-target-architecture.md +49 -0
- package/docs/init-v0.1-closeout.md +152 -0
- package/docs/init-v0.1-design.md +237 -0
- package/docs/init-v0.1-verification.md +303 -0
- package/docs/outbound-network-design.md +100 -0
- package/docs/outbound-network-verification.json +300 -0
- package/docs/provider-verification.md +94 -0
- package/docs/releasing.md +138 -0
- package/docs/session-integration.md +134 -0
- package/docs/tui-workbench.md +173 -0
- package/docs/usage.md +815 -0
- package/docs/v2-ablation-results.json +12035 -0
- package/docs/v2-ablation.md +117 -0
- package/docs/v2-evaluation-repeat-results.json +7 -0
- package/docs/v2-evaluation-scripted-results.json +67 -0
- package/docs/v2-evaluation.md +35 -0
- package/docs/v2-optimization-plan.md +23 -0
- package/docs/v2-performance-baseline-runtime.js.txt +231 -0
- package/docs/v2-performance-baseline.json +338 -0
- package/docs/v2-performance-behavior-equivalence.json +17 -0
- package/docs/v2-performance-results.json +585 -0
- package/docs/v2-performance.md +88 -0
- package/docs/v2-replacement-test-map.md +14 -0
- package/docs/v2-verification.md +49 -0
- package/package.json +87 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reader.js","sourceRoot":"","sources":["../../src/v2/reader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAKzD,yFAAyF;AACzF,MAAM,UAAU,cAAc,CAAC,SAAiB;IAC9C,IAAI,SAAS,KAAK,QAAQ;QAAE,OAAO,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IAC9D,IAAI,gCAAgC,CAAC,IAAI,CAAC,SAAS,CAAC;QAAE,OAAO,CAAC,SAAS,CAAC,CAAC;IACzE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;AACzC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAA0D;IAC7F,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;IAC/D,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC1E,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC;QAClE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE,CAAC;IACpG,CAAC,CAAC,CAAC;IACH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;AAC3E,CAAC;AAED,yDAAyD;AACzD,SAAS,iBAAiB,CAAC,OAAe;IACxC,OAAO,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACrF,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,gBAAgB,CAAC,IAAgB;IAC/C,IAAI,IAAI,CAAC,KAAK;QAAE,OAAO,uDAAuD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,gDAAgD,CAAC;IACjK,+FAA+F;IAC/F,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,0BAA0B,GAAG,CAAC,MAAM,OAAO,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,UAAU,CAAC,uBAAuB,EAAE,qBAAqB,CAAC,oBAAoB,CAAC,CAAC;IACnN,OAAO,0KAA0K,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;AACxM,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface ProjectRegistration {
|
|
2
|
+
id: string;
|
|
3
|
+
name: string;
|
|
4
|
+
root: string;
|
|
5
|
+
}
|
|
6
|
+
export declare class ProjectRegistry {
|
|
7
|
+
#private;
|
|
8
|
+
constructor(dataRoot: string);
|
|
9
|
+
list(): ProjectRegistration[];
|
|
10
|
+
register(root: string, name: string): ProjectRegistration;
|
|
11
|
+
remove(id: string): boolean;
|
|
12
|
+
resolve(cwd: string): ProjectRegistration | undefined;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/v2/registry.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,mBAAmB;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE;AAC/E,qBAAa,eAAe;;gBAEd,QAAQ,EAAE,MAAM;IAC5B,IAAI,IAAI,mBAAmB,EAAE;IAU7B,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,mBAAmB;IAMzD,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAC3B,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,mBAAmB,GAAG,SAAS;CAItD"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { realpathSync, statSync } from 'node:fs';
|
|
3
|
+
import { join, relative, isAbsolute, resolve, sep } from 'node:path';
|
|
4
|
+
import { atomicWrite, readRegular } from './canonical.js';
|
|
5
|
+
export class ProjectRegistry {
|
|
6
|
+
#path;
|
|
7
|
+
constructor(dataRoot) { this.#path = join(resolve(dataRoot), 'runtime/projects.json'); }
|
|
8
|
+
list() {
|
|
9
|
+
const source = readRegular(this.#path, { createParents: false });
|
|
10
|
+
if (source === null)
|
|
11
|
+
return [];
|
|
12
|
+
const values = JSON.parse(source);
|
|
13
|
+
if (!Array.isArray(values))
|
|
14
|
+
throw new Error('Invalid project registry');
|
|
15
|
+
const ids = new Set();
|
|
16
|
+
const roots = new Set();
|
|
17
|
+
for (const value of values) {
|
|
18
|
+
if (!value || typeof value !== 'object' || !/^[A-Za-z0-9_-]{1,128}$/.test(value.id) || typeof value.name !== 'string' || !value.name.trim() || typeof value.root !== 'string' || !isAbsolute(value.root) || ids.has(value.id) || roots.has(value.root))
|
|
19
|
+
throw new Error('Invalid project registry');
|
|
20
|
+
ids.add(value.id);
|
|
21
|
+
roots.add(value.root);
|
|
22
|
+
}
|
|
23
|
+
return values;
|
|
24
|
+
}
|
|
25
|
+
register(root, name) {
|
|
26
|
+
if (!name.trim() || name.length > 256 || /[\r\n\0]/.test(name))
|
|
27
|
+
throw new Error('Invalid project name');
|
|
28
|
+
const canonical = realpathSync(root);
|
|
29
|
+
if (!statSync(canonical).isDirectory())
|
|
30
|
+
throw new Error('Project root must be a directory');
|
|
31
|
+
const projects = this.list();
|
|
32
|
+
if (projects.some(project => project.root === canonical))
|
|
33
|
+
throw new Error('Project root already registered');
|
|
34
|
+
const project = { id: randomUUID(), name: name.trim(), root: canonical };
|
|
35
|
+
projects.push(project);
|
|
36
|
+
atomicWrite(this.#path, JSON.stringify(projects) + '\n');
|
|
37
|
+
return project;
|
|
38
|
+
}
|
|
39
|
+
remove(id) { const projects = this.list(); const remaining = projects.filter(project => project.id !== id); if (remaining.length === projects.length)
|
|
40
|
+
return false; atomicWrite(this.#path, JSON.stringify(remaining) + '\n'); return true; }
|
|
41
|
+
resolve(cwd) {
|
|
42
|
+
const canonical = realpathSync(cwd);
|
|
43
|
+
return this.list().filter(project => { const child = relative(project.root, canonical); return child === '' || (!isAbsolute(child) && child !== '..' && !child.startsWith(`..${sep}`)); }).sort((a, b) => b.root.length - a.root.length)[0];
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/v2/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { type FailureDiagnostic } from '../memory-manager/contracts/diagnostic.js';
|
|
2
|
+
import { DatabaseSync } from "node:sqlite";
|
|
3
|
+
export interface ObservationInput {
|
|
4
|
+
sessionId: string;
|
|
5
|
+
entryId: string;
|
|
6
|
+
text: string;
|
|
7
|
+
scope: string;
|
|
8
|
+
observedAt: string;
|
|
9
|
+
source: string;
|
|
10
|
+
}
|
|
11
|
+
export interface Observation extends Omit<ObservationInput, "text"> {
|
|
12
|
+
id: number;
|
|
13
|
+
text: string | null;
|
|
14
|
+
state: string;
|
|
15
|
+
enqueuedAt: number;
|
|
16
|
+
}
|
|
17
|
+
export interface RuntimeJob {
|
|
18
|
+
id: string;
|
|
19
|
+
token: string;
|
|
20
|
+
generation: number;
|
|
21
|
+
observations: Observation[];
|
|
22
|
+
}
|
|
23
|
+
export interface RuntimeReceipt {
|
|
24
|
+
documents?: {
|
|
25
|
+
target: string;
|
|
26
|
+
after: string;
|
|
27
|
+
}[];
|
|
28
|
+
id?: string;
|
|
29
|
+
token?: string;
|
|
30
|
+
generation?: number;
|
|
31
|
+
requestId?: string;
|
|
32
|
+
jobId: string;
|
|
33
|
+
observationIds: number[];
|
|
34
|
+
associations?: {
|
|
35
|
+
target: string;
|
|
36
|
+
sourceIds: number[];
|
|
37
|
+
}[];
|
|
38
|
+
forgetSourceIds?: number[];
|
|
39
|
+
removeTargets?: string[];
|
|
40
|
+
}
|
|
41
|
+
export interface RuntimeOptions {
|
|
42
|
+
sqliteTimeoutMs?: number;
|
|
43
|
+
now?: () => number;
|
|
44
|
+
turnThreshold?: number;
|
|
45
|
+
byteThreshold?: number;
|
|
46
|
+
idleMs?: number;
|
|
47
|
+
maxWaitMs?: number;
|
|
48
|
+
leaseMs?: number;
|
|
49
|
+
maxAttempts?: number;
|
|
50
|
+
}
|
|
51
|
+
export interface JobStatus {
|
|
52
|
+
id: string;
|
|
53
|
+
state: string;
|
|
54
|
+
attempts: number;
|
|
55
|
+
issue: string | null;
|
|
56
|
+
diagnostic: FailureDiagnostic | null;
|
|
57
|
+
retryAt: number | null;
|
|
58
|
+
}
|
|
59
|
+
export interface ObservationOutcome {
|
|
60
|
+
state: string;
|
|
61
|
+
issue: string | null;
|
|
62
|
+
retainedIn: string[];
|
|
63
|
+
jobId: string | null;
|
|
64
|
+
jobState: string | null;
|
|
65
|
+
attempts: number;
|
|
66
|
+
retryAt: number | null;
|
|
67
|
+
diagnostic: FailureDiagnostic | null;
|
|
68
|
+
}
|
|
69
|
+
type Row = Record<string, string | number | null>;
|
|
70
|
+
/** Durable queue, not a reconstructible index. All mutating operations are synchronous. */
|
|
71
|
+
export declare class RuntimeStore {
|
|
72
|
+
#private;
|
|
73
|
+
readonly db: DatabaseSync;
|
|
74
|
+
constructor(dataRoot: string, options?: RuntimeOptions);
|
|
75
|
+
transaction<T>(fn: () => T): T;
|
|
76
|
+
enqueue(input: ObservationInput): Observation;
|
|
77
|
+
/** Exact lookup only; callers own namespace authorization. Never returns conversation bodies. */
|
|
78
|
+
observationStatus(sessionId: string, entryId: string): {
|
|
79
|
+
state: string;
|
|
80
|
+
} | null;
|
|
81
|
+
/** Outcome without bodies: which documents currently link Sections to this observation, plus the diagnostic code. */
|
|
82
|
+
observationOutcome(sessionId: string, entryId: string): ObservationOutcome | null;
|
|
83
|
+
hasReceipt(jobId: string): boolean;
|
|
84
|
+
/** Current incomplete work only. Retired jobs and historical quarantine do not block a flush. */
|
|
85
|
+
hasIncompleteWork(): boolean;
|
|
86
|
+
hasWork(): boolean;
|
|
87
|
+
pending(): Observation[];
|
|
88
|
+
context(observation: Observation): Observation[];
|
|
89
|
+
requestFlush(): void;
|
|
90
|
+
claim(options?: {
|
|
91
|
+
force?: boolean;
|
|
92
|
+
maxTurns?: number;
|
|
93
|
+
}): RuntimeJob | null;
|
|
94
|
+
assertLease(job: RuntimeJob): void;
|
|
95
|
+
trim(job: RuntimeJob, count: number): RuntimeJob;
|
|
96
|
+
renew(job: RuntimeJob): void;
|
|
97
|
+
finish(job: RuntimeJob, receipt?: RuntimeReceipt): void;
|
|
98
|
+
recoverReceipt(receipt: RuntimeReceipt): void;
|
|
99
|
+
documentVersion(target: string): string | null;
|
|
100
|
+
documentSourceKeys(target: string): string[];
|
|
101
|
+
sources(target: string): number[];
|
|
102
|
+
/** Source kinds of linked observations; bodies may be pruned but provenance stays. */
|
|
103
|
+
sourceKinds(ids: readonly number[]): string[];
|
|
104
|
+
fail(job: RuntimeJob, error: unknown, diagnostic?: FailureDiagnostic): void;
|
|
105
|
+
quarantine(job: RuntimeJob, observationId: number, issue: string): void;
|
|
106
|
+
retry(jobId: string): void;
|
|
107
|
+
pruneProcessed(retentionMs?: number): void;
|
|
108
|
+
cancelInputs(sessionId: string): void;
|
|
109
|
+
stageInput(input: {
|
|
110
|
+
sessionId: string;
|
|
111
|
+
text: string;
|
|
112
|
+
source: string;
|
|
113
|
+
scope: string;
|
|
114
|
+
streamingBehavior?: "steer" | "followUp";
|
|
115
|
+
parentEntryId?: string | null;
|
|
116
|
+
hasUnsupportedContent?: boolean;
|
|
117
|
+
}): string;
|
|
118
|
+
delivered(sessionId: string, text: string, timestamp: number, hasUnsupportedContent?: boolean): void;
|
|
119
|
+
bind(sessionId: string, entries: readonly {
|
|
120
|
+
id: string;
|
|
121
|
+
text: string;
|
|
122
|
+
timestamp: number;
|
|
123
|
+
}[], admit?: (input: ObservationInput) => void): void;
|
|
124
|
+
status(): {
|
|
125
|
+
observations: Row[];
|
|
126
|
+
jobs: JobStatus[];
|
|
127
|
+
unbound: number;
|
|
128
|
+
quarantinedDeliveries: number;
|
|
129
|
+
};
|
|
130
|
+
close(): void;
|
|
131
|
+
}
|
|
132
|
+
export {};
|
|
133
|
+
//# sourceMappingURL=runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/v2/runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
import { initializeSessions, sessionGroup } from './session.js';
|
|
2
|
+
import { sanitizeDiagnostic } from '../memory-manager/contracts/diagnostic.js';
|
|
3
|
+
import { failureDiagnostic, failureCode } from './errors.js';
|
|
4
|
+
import { DatabaseSync } from "node:sqlite";
|
|
5
|
+
import { lstatSync } from "node:fs";
|
|
6
|
+
import { join } from "node:path";
|
|
7
|
+
import { randomUUID, createHash } from "node:crypto";
|
|
8
|
+
import { safeDirectory } from "./lock.js";
|
|
9
|
+
import { provenanceOf } from "./import.js";
|
|
10
|
+
function enableWal(db, timeout = 5000) {
|
|
11
|
+
// A concurrent journal-mode upgrade can return SQLITE_BUSY without invoking
|
|
12
|
+
// SQLite's busy handler. Retry only that idempotent startup step, stopping
|
|
13
|
+
// retries after 5 s; each SQLite call also retains its existing 5 s busy limit.
|
|
14
|
+
const deadline = performance.now() + timeout;
|
|
15
|
+
const sleeper = new Int32Array(new SharedArrayBuffer(4));
|
|
16
|
+
for (;;) {
|
|
17
|
+
try {
|
|
18
|
+
db.exec('PRAGMA journal_mode=WAL');
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
const remaining = deadline - performance.now();
|
|
23
|
+
if (error.errcode !== 5 || remaining <= 0)
|
|
24
|
+
throw error;
|
|
25
|
+
Atomics.wait(sleeper, 0, 0, Math.min(10, remaining));
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/** Durable queue, not a reconstructible index. All mutating operations are synchronous. */
|
|
30
|
+
export class RuntimeStore {
|
|
31
|
+
db;
|
|
32
|
+
#now;
|
|
33
|
+
#options;
|
|
34
|
+
#depth = 0;
|
|
35
|
+
constructor(dataRoot, options = {}) {
|
|
36
|
+
safeDirectory(dataRoot);
|
|
37
|
+
const path = join(dataRoot, "runtime.sqlite");
|
|
38
|
+
for (const suffix of ["", "-journal", "-wal", "-shm"]) {
|
|
39
|
+
try {
|
|
40
|
+
const stat = lstatSync(path + suffix);
|
|
41
|
+
if (!stat.isFile() || stat.isSymbolicLink() || stat.nlink !== 1)
|
|
42
|
+
throw new Error("Unsafe runtime path");
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
if (error.code !== "ENOENT")
|
|
46
|
+
throw error;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
this.#now = options.now ?? Date.now;
|
|
50
|
+
this.#options = { turnThreshold: options.turnThreshold ?? 6, byteThreshold: options.byteThreshold ?? 16384, idleMs: options.idleMs ?? 120000, maxWaitMs: options.maxWaitMs ?? 600000, leaseMs: options.leaseMs ?? 120000, maxAttempts: options.maxAttempts ?? 5 };
|
|
51
|
+
for (const value of Object.values(this.#options))
|
|
52
|
+
if (!Number.isSafeInteger(value) || value <= 0)
|
|
53
|
+
throw new Error("Invalid runtime limit");
|
|
54
|
+
this.db = new DatabaseSync(path, { timeout: options.sqliteTimeoutMs ?? 5000 });
|
|
55
|
+
try {
|
|
56
|
+
enableWal(this.db, options.sqliteTimeoutMs);
|
|
57
|
+
this.db.exec(`PRAGMA synchronous=FULL;
|
|
58
|
+
CREATE TABLE IF NOT EXISTS observations(id INTEGER PRIMARY KEY AUTOINCREMENT, sessionId TEXT NOT NULL, entryId TEXT NOT NULL, text TEXT, digest TEXT NOT NULL, scope TEXT NOT NULL, observedAt TEXT NOT NULL, source TEXT NOT NULL, state TEXT NOT NULL, enqueuedAt INTEGER NOT NULL, processedAt INTEGER, jobId TEXT, issue TEXT, UNIQUE(sessionId,entryId));
|
|
59
|
+
CREATE TABLE IF NOT EXISTS jobs(id TEXT PRIMARY KEY, token TEXT NOT NULL, generation INTEGER NOT NULL, state TEXT NOT NULL, expires INTEGER NOT NULL, attempts INTEGER NOT NULL, available INTEGER NOT NULL, issue TEXT);
|
|
60
|
+
CREATE TABLE IF NOT EXISTS document_versions(target TEXT PRIMARY KEY, hash TEXT NOT NULL);
|
|
61
|
+
CREATE TABLE IF NOT EXISTS associations(target TEXT NOT NULL, sourceId INTEGER NOT NULL, PRIMARY KEY(target,sourceId));
|
|
62
|
+
CREATE TABLE IF NOT EXISTS receipts(id TEXT PRIMARY KEY);
|
|
63
|
+
CREATE TABLE IF NOT EXISTS inputs(id TEXT PRIMARY KEY, sessionId TEXT NOT NULL, text TEXT NOT NULL, source TEXT NOT NULL, scope TEXT NOT NULL, queueKind TEXT NOT NULL, parentEntryId TEXT, used INTEGER NOT NULL DEFAULT 0);
|
|
64
|
+
CREATE TABLE IF NOT EXISTS deliveries(id INTEGER PRIMARY KEY AUTOINCREMENT, sessionId TEXT NOT NULL, text TEXT NOT NULL, digest TEXT NOT NULL, timestamp INTEGER NOT NULL, scope TEXT NOT NULL, source TEXT NOT NULL, state TEXT NOT NULL, UNIQUE(sessionId,digest,timestamp));
|
|
65
|
+
CREATE TABLE IF NOT EXISTS settings(key TEXT PRIMARY KEY,value INTEGER NOT NULL);
|
|
66
|
+
CREATE INDEX IF NOT EXISTS observations_state_id ON observations(state,id);
|
|
67
|
+
CREATE INDEX IF NOT EXISTS observations_job_id ON observations(jobId,id) WHERE jobId IS NOT NULL;
|
|
68
|
+
CREATE INDEX IF NOT EXISTS observations_prunable ON observations(processedAt) WHERE state='processed' AND text IS NOT NULL;
|
|
69
|
+
CREATE INDEX IF NOT EXISTS jobs_active ON jobs(state) WHERE state IN ('running','retry');`);
|
|
70
|
+
initializeSessions(this);
|
|
71
|
+
// BEGIN IMMEDIATE serializes the introspection and ALTER across old/new concurrent opens.
|
|
72
|
+
this.transaction(() => {
|
|
73
|
+
if (!this.db.prepare('PRAGMA table_info(jobs)').all().some(row => row.name === 'diagnostic'))
|
|
74
|
+
this.db.exec('ALTER TABLE jobs ADD COLUMN diagnostic TEXT');
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
this.db.close();
|
|
79
|
+
throw error;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
transaction(fn) {
|
|
83
|
+
if (this.#depth > 0)
|
|
84
|
+
return fn();
|
|
85
|
+
this.db.exec("BEGIN IMMEDIATE");
|
|
86
|
+
this.#depth++;
|
|
87
|
+
try {
|
|
88
|
+
const result = fn();
|
|
89
|
+
if (result instanceof Promise)
|
|
90
|
+
throw new Error("Runtime transaction must be synchronous");
|
|
91
|
+
this.db.exec("COMMIT");
|
|
92
|
+
return result;
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
this.db.exec("ROLLBACK");
|
|
96
|
+
throw error;
|
|
97
|
+
}
|
|
98
|
+
finally {
|
|
99
|
+
this.#depth--;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
enqueue(input) {
|
|
103
|
+
const digest = createHash("sha256").update(input.text).digest("hex");
|
|
104
|
+
return this.transaction(() => {
|
|
105
|
+
const existing = this.db.prepare("SELECT * FROM observations WHERE sessionId=? AND entryId=?").get(input.sessionId, input.entryId);
|
|
106
|
+
if (existing) {
|
|
107
|
+
if (existing.digest !== digest || existing.scope !== input.scope || existing.source !== input.source)
|
|
108
|
+
throw new Error("Conflicting observation identity");
|
|
109
|
+
return existing;
|
|
110
|
+
}
|
|
111
|
+
const state = provenanceOf(input.source) !== null ? "pending" : "quarantined";
|
|
112
|
+
const result = this.db.prepare("INSERT INTO observations(sessionId,entryId,text,digest,scope,observedAt,source,state,enqueuedAt) VALUES(?,?,?,?,?,?,?,?,?)").run(input.sessionId, input.entryId, input.text, digest, input.scope, input.observedAt, input.source, state, this.#now());
|
|
113
|
+
return this.db.prepare("SELECT * FROM observations WHERE id=?").get(result.lastInsertRowid);
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
/** Exact lookup only; callers own namespace authorization. Never returns conversation bodies. */
|
|
117
|
+
observationStatus(sessionId, entryId) {
|
|
118
|
+
const row = this.db.prepare("SELECT state FROM observations WHERE sessionId=? AND entryId=?").get(sessionId, entryId);
|
|
119
|
+
return row ? { state: String(row.state) } : null;
|
|
120
|
+
}
|
|
121
|
+
/** Outcome without bodies: which documents currently link Sections to this observation, plus the diagnostic code. */
|
|
122
|
+
observationOutcome(sessionId, entryId) {
|
|
123
|
+
const row = this.db.prepare("SELECT o.id,o.state,o.issue,o.jobId,j.state AS jobState,j.attempts,j.available,j.issue AS jobIssue,j.diagnostic FROM observations o LEFT JOIN jobs j ON j.id=o.jobId WHERE o.sessionId=? AND o.entryId=?").get(sessionId, entryId);
|
|
124
|
+
if (!row)
|
|
125
|
+
return null;
|
|
126
|
+
const targets = this.db.prepare("SELECT DISTINCT target FROM associations WHERE sourceId=?").all(row.id).map(link => String(link.target).replace(/:[a-f0-9]{64}$/, ''));
|
|
127
|
+
const processed = row.state === 'processed';
|
|
128
|
+
return { state: String(row.state), issue: processed ? null : nullableString(row.issue ?? row.jobIssue), retainedIn: [...new Set(targets)].sort(), jobId: nullableString(row.jobId), jobState: nullableString(row.jobState), attempts: Number(row.attempts ?? 0), retryAt: row.jobState === 'retry' && !processed ? Number(row.available) : null, diagnostic: processed ? null : readDiagnostic(row.diagnostic) };
|
|
129
|
+
}
|
|
130
|
+
hasReceipt(jobId) { return Boolean(this.db.prepare('SELECT 1 FROM receipts WHERE id=?').get(jobId)); }
|
|
131
|
+
/** Current incomplete work only. Retired jobs and historical quarantine do not block a flush. */
|
|
132
|
+
hasIncompleteWork() {
|
|
133
|
+
return Boolean(this.db.prepare("SELECT 1 FROM observations WHERE state IN ('pending','claimed','dead') LIMIT 1").get());
|
|
134
|
+
}
|
|
135
|
+
hasWork() { return Boolean(this.db.prepare("SELECT 1 FROM observations WHERE state IN ('pending','claimed') LIMIT 1").get()); }
|
|
136
|
+
pending() { return this.db.prepare("SELECT * FROM observations WHERE state='pending' ORDER BY id").all(); }
|
|
137
|
+
context(observation) {
|
|
138
|
+
if (sessionGroup(this, observation))
|
|
139
|
+
return [];
|
|
140
|
+
return this.db.prepare("SELECT * FROM observations WHERE id<? AND sessionId=? AND scope=? AND state='processed' AND text IS NOT NULL ORDER BY id DESC LIMIT 2").all(observation.id, observation.sessionId, observation.scope).reverse();
|
|
141
|
+
}
|
|
142
|
+
requestFlush() { this.db.prepare("INSERT INTO settings VALUES('flush',1) ON CONFLICT(key) DO UPDATE SET value=1").run(); }
|
|
143
|
+
claim(options = {}) {
|
|
144
|
+
if (options.maxTurns !== undefined && (!Number.isSafeInteger(options.maxTurns) || options.maxTurns < 1))
|
|
145
|
+
throw new Error("Invalid batch size");
|
|
146
|
+
return this.transaction(() => {
|
|
147
|
+
const now = this.#now();
|
|
148
|
+
const active = this.db.prepare("SELECT * FROM jobs WHERE state IN ('running','retry') ORDER BY rowid LIMIT 1").get();
|
|
149
|
+
if (active) {
|
|
150
|
+
if (active.state === "running" && Number(active.expires) > now || Number(active.available) > now)
|
|
151
|
+
return null;
|
|
152
|
+
if (Number(active.attempts) >= this.#options.maxAttempts) {
|
|
153
|
+
this.db.prepare("UPDATE jobs SET state='dead' WHERE id=?").run(active.id);
|
|
154
|
+
this.db.prepare("UPDATE observations SET state='dead' WHERE jobId=?").run(active.id);
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
const token = randomUUID(), generation = Number(active.generation) + 1;
|
|
158
|
+
this.db.prepare("UPDATE jobs SET token=?,generation=?,state='running',expires=?,attempts=attempts+1 WHERE id=?").run(token, generation, now + this.#options.leaseMs, active.id);
|
|
159
|
+
return { id: String(active.id), token, generation, observations: this.db.prepare("SELECT * FROM observations WHERE jobId=? ORDER BY id").all(active.id) };
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
// Decode only a bounded queue head, not every pending conversation body.
|
|
163
|
+
let head = this.db.prepare("SELECT * FROM observations WHERE state='pending' ORDER BY id LIMIT ?")
|
|
164
|
+
.all(options.maxTurns ?? this.#options.turnThreshold);
|
|
165
|
+
// A sealed session must not wait behind an ineligible legacy queue head.
|
|
166
|
+
const sessionHead = this.db.prepare("SELECT o.* FROM observations o JOIN session_messages m ON m.observationId=o.id JOIN session_turns t ON t.id=m.turn WHERE o.state='pending' AND t.batchId IS NOT NULL ORDER BY o.id LIMIT 1").get();
|
|
167
|
+
if (sessionHead)
|
|
168
|
+
head = [sessionHead];
|
|
169
|
+
if (!head.length) {
|
|
170
|
+
this.db.prepare("DELETE FROM settings WHERE key='flush'").run();
|
|
171
|
+
return null;
|
|
172
|
+
}
|
|
173
|
+
const group = sessionGroup(this, head[0]);
|
|
174
|
+
if (group)
|
|
175
|
+
head = this.db.prepare("SELECT o.* FROM observations o JOIN session_messages m ON m.observationId=o.id JOIN session_turns t ON t.id=m.turn WHERE o.state='pending' AND t.batchId=? ORDER BY o.id").all(group.batch);
|
|
176
|
+
const flush = this.db.prepare("SELECT value FROM settings WHERE key='flush'").get();
|
|
177
|
+
if (!group && !options.force && !flush?.value) {
|
|
178
|
+
// Eligibility spans all scopes, independently of this batch's capacity.
|
|
179
|
+
const enoughTurns = head.length >= this.#options.turnThreshold || Boolean(this.db.prepare("SELECT 1 FROM observations WHERE state='pending' ORDER BY id LIMIT 1 OFFSET ?").get(this.#options.turnThreshold - 1));
|
|
180
|
+
if (!enoughTurns && now - head[0].enqueuedAt < this.#options.maxWaitMs) {
|
|
181
|
+
// Use enqueue order, not MAX(timestamp): the host clock can move backwards.
|
|
182
|
+
const latest = this.db.prepare("SELECT enqueuedAt FROM observations WHERE state='pending' ORDER BY id DESC LIMIT 1").get();
|
|
183
|
+
if (now - Number(latest.enqueuedAt) < this.#options.idleMs) {
|
|
184
|
+
// SQLite counts UTF-8 bytes including NULs without copying all bodies to JS.
|
|
185
|
+
const row = this.db.prepare("SELECT SUM(length(CAST(text AS BLOB))) AS bytes FROM observations WHERE state='pending'").get();
|
|
186
|
+
if (Number(row.bytes) < this.#options.byteThreshold)
|
|
187
|
+
return null;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
const observations = [];
|
|
192
|
+
for (const observation of head) {
|
|
193
|
+
// One batch shares a scope and a provenance class: imports never ride along with user turns,
|
|
194
|
+
// and agent summaries never share a batch with imported documents.
|
|
195
|
+
if (sessionGroup(this, observation)?.batch !== group?.batch || observation.scope !== head[0].scope || provenanceOf(observation.source) !== provenanceOf(head[0].source))
|
|
196
|
+
break;
|
|
197
|
+
observations.push(observation);
|
|
198
|
+
}
|
|
199
|
+
const id = randomUUID(), token = randomUUID();
|
|
200
|
+
this.db.prepare("INSERT INTO jobs(id,token,generation,state,expires,attempts,available,issue) VALUES(?,?,1,'running',?,1,0,NULL)").run(id, token, now + this.#options.leaseMs);
|
|
201
|
+
for (const o of observations)
|
|
202
|
+
this.db.prepare("UPDATE observations SET state='claimed',jobId=? WHERE id=?").run(id, o.id);
|
|
203
|
+
if (!this.db.prepare("SELECT 1 FROM observations WHERE state='pending' LIMIT 1").get())
|
|
204
|
+
this.db.prepare("DELETE FROM settings WHERE key='flush'").run();
|
|
205
|
+
return { id, token, generation: 1, observations };
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
assertLease(job) {
|
|
209
|
+
const row = this.db.prepare("SELECT * FROM jobs WHERE id=? AND token=? AND generation=? AND state='running' AND expires>?").get(job.id, job.token, job.generation, this.#now());
|
|
210
|
+
if (!row)
|
|
211
|
+
throw new Error("STALE_LEASE");
|
|
212
|
+
}
|
|
213
|
+
trim(job, count) {
|
|
214
|
+
return this.transaction(() => { this.assertLease(job); if (!Number.isSafeInteger(count) || count < 1 || count > job.observations.length)
|
|
215
|
+
throw new Error("Invalid batch size"); for (const o of job.observations.slice(count))
|
|
216
|
+
this.db.prepare("UPDATE observations SET state='pending',jobId=NULL WHERE id=? AND jobId=?").run(o.id, job.id); return { ...job, observations: job.observations.slice(0, count) }; });
|
|
217
|
+
}
|
|
218
|
+
renew(job) { this.transaction(() => { this.assertLease(job); this.db.prepare("UPDATE jobs SET expires=? WHERE id=?").run(this.#now() + this.#options.leaseMs, job.id); }); }
|
|
219
|
+
finish(job, receipt) { this.transaction(() => { this.assertLease(job); if (receipt) {
|
|
220
|
+
if (receipt.jobId !== job.id || JSON.stringify([...receipt.observationIds].sort()) !== JSON.stringify(job.observations.map(o => o.id).sort()))
|
|
221
|
+
throw new Error("Receipt batch mismatch");
|
|
222
|
+
this.recoverReceipt(receipt);
|
|
223
|
+
}
|
|
224
|
+
else
|
|
225
|
+
this.#consume(job.id); }); }
|
|
226
|
+
#consume(id) { this.db.prepare("UPDATE observations SET state='processed',processedAt=? WHERE jobId=?").run(this.#now(), id); this.db.prepare("UPDATE jobs SET state='done' WHERE id=?").run(id); }
|
|
227
|
+
recoverReceipt(receipt) {
|
|
228
|
+
this.transaction(() => {
|
|
229
|
+
if (this.db.prepare("SELECT id FROM receipts WHERE id=?").get(receipt.jobId))
|
|
230
|
+
return;
|
|
231
|
+
const actual = this.db.prepare("SELECT id FROM observations WHERE jobId=? ORDER BY id").all(receipt.jobId).map(row => Number(row.id));
|
|
232
|
+
if (!actual.length || JSON.stringify(actual) !== JSON.stringify([...receipt.observationIds].sort((a, b) => a - b)))
|
|
233
|
+
throw new Error("Receipt batch mismatch");
|
|
234
|
+
for (const link of receipt.associations ?? [])
|
|
235
|
+
for (const sourceId of link.sourceIds)
|
|
236
|
+
if (!this.db.prepare("SELECT id FROM observations WHERE id=?").get(sourceId))
|
|
237
|
+
throw new Error("Receipt source unknown");
|
|
238
|
+
for (const id of receipt.observationIds) {
|
|
239
|
+
const row = this.db.prepare("SELECT jobId FROM observations WHERE id=?").get(id);
|
|
240
|
+
if (!row || row.jobId !== receipt.jobId)
|
|
241
|
+
throw new Error("Receipt references unknown batch");
|
|
242
|
+
}
|
|
243
|
+
this.#consume(receipt.jobId);
|
|
244
|
+
for (const doc of receipt.documents ?? [])
|
|
245
|
+
this.db.prepare("INSERT INTO document_versions VALUES(?,?) ON CONFLICT(target) DO UPDATE SET hash=excluded.hash").run(doc.target, doc.after);
|
|
246
|
+
for (const target of receipt.removeTargets ?? [])
|
|
247
|
+
this.db.prepare("DELETE FROM associations WHERE target=?").run(target);
|
|
248
|
+
for (const link of receipt.associations ?? [])
|
|
249
|
+
for (const id of link.sourceIds)
|
|
250
|
+
this.db.prepare("INSERT OR IGNORE INTO associations VALUES(?,?)").run(link.target, id);
|
|
251
|
+
for (const id of receipt.forgetSourceIds ?? []) {
|
|
252
|
+
this.db.prepare("UPDATE observations SET text=NULL WHERE id=? AND state='processed'").run(id);
|
|
253
|
+
}
|
|
254
|
+
this.db.prepare("INSERT INTO receipts VALUES(?)").run(receipt.jobId);
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
documentVersion(target) { const row = this.db.prepare("SELECT hash FROM document_versions WHERE target=?").get(target); return row ? String(row.hash) : null; }
|
|
258
|
+
documentSourceKeys(target) { return this.db.prepare("SELECT DISTINCT target FROM associations WHERE substr(target,1,?)=?").all(target.length + 1, target + ':').map(row => String(row.target)); }
|
|
259
|
+
sources(target) { return this.db.prepare("SELECT sourceId FROM associations WHERE target=? ORDER BY sourceId").all(target).map(row => Number(row.sourceId)); }
|
|
260
|
+
/** Source kinds of linked observations; bodies may be pruned but provenance stays. */
|
|
261
|
+
sourceKinds(ids) { return ids.map(id => { const row = this.db.prepare("SELECT source FROM observations WHERE id=?").get(id); return row ? String(row.source) : 'unknown'; }); }
|
|
262
|
+
fail(job, error, diagnostic = failureDiagnostic(error)) { this.transaction(() => { this.assertLease(job); const row = this.db.prepare("SELECT attempts FROM jobs WHERE id=?").get(job.id); const dead = Number(row.attempts) >= this.#options.maxAttempts; this.db.prepare("UPDATE jobs SET state=?,available=?,issue=?,diagnostic=? WHERE id=?").run(dead ? "dead" : "retry", this.#now() + Math.min(600000, 1000 * 2 ** (Number(row.attempts) - 1)), failureCode(error), JSON.stringify(sanitizeDiagnostic(diagnostic)), job.id); if (dead)
|
|
263
|
+
this.db.prepare("UPDATE observations SET state='dead' WHERE jobId=?").run(job.id); }); }
|
|
264
|
+
quarantine(job, observationId, issue) { this.transaction(() => { this.assertLease(job); if (!job.observations.some(o => o.id === observationId))
|
|
265
|
+
throw new Error("Unknown observation"); const group = sessionGroup(this, job.observations.find(o => o.id === observationId)); if (group)
|
|
266
|
+
this.db.prepare("UPDATE observations SET state='quarantined',jobId=NULL,issue=? WHERE id IN (SELECT observationId FROM session_messages WHERE turn=?) AND state IN ('pending','claimed')").run(issue, group.turn);
|
|
267
|
+
else
|
|
268
|
+
this.db.prepare("UPDATE observations SET state='quarantined',jobId=NULL,issue=? WHERE id=?").run(issue, observationId); this.db.prepare("UPDATE observations SET state='pending',jobId=NULL WHERE jobId=?").run(job.id); this.db.prepare("UPDATE jobs SET state='done' WHERE id=?").run(job.id); }); }
|
|
269
|
+
retry(jobId) { this.transaction(() => { this.db.prepare("UPDATE observations SET state='pending',jobId=NULL WHERE jobId=? AND state='dead'").run(jobId); this.db.prepare("UPDATE jobs SET state='done' WHERE id=? AND state='dead'").run(jobId); }); }
|
|
270
|
+
pruneProcessed(retentionMs = 7 * 86400000) { this.db.prepare("UPDATE observations INDEXED BY observations_prunable SET text=NULL WHERE state='processed' AND text IS NOT NULL AND processedAt<?").run(this.#now() - retentionMs); }
|
|
271
|
+
cancelInputs(sessionId) { this.db.prepare("DELETE FROM inputs WHERE sessionId=?").run(sessionId); }
|
|
272
|
+
stageInput(input) {
|
|
273
|
+
return this.transaction(() => {
|
|
274
|
+
const id = randomUUID(), kind = input.streamingBehavior ?? "direct";
|
|
275
|
+
const prior = kind === "direct" ? this.db.prepare("SELECT text FROM inputs WHERE sessionId=? AND queueKind='direct'").get(input.sessionId) : undefined;
|
|
276
|
+
// Direct preflight may be cancelled; queued steer/followUp are legal FIFO lists.
|
|
277
|
+
if (kind === "direct")
|
|
278
|
+
this.db.prepare("DELETE FROM inputs WHERE sessionId=? AND queueKind='direct'").run(input.sessionId);
|
|
279
|
+
let source = input.hasUnsupportedContent ? "unsupported_content" : prior?.text === input.text ? "ambiguous" : input.source;
|
|
280
|
+
const competing = this.db.prepare("SELECT source,scope FROM inputs WHERE sessionId=?").all(input.sessionId);
|
|
281
|
+
if (competing.some(row => row.source !== source || row.scope !== input.scope)) {
|
|
282
|
+
source = "ambiguous";
|
|
283
|
+
this.db.prepare("UPDATE inputs SET source='ambiguous' WHERE sessionId=?").run(input.sessionId);
|
|
284
|
+
}
|
|
285
|
+
this.db.prepare("INSERT INTO inputs(id,sessionId,text,source,scope,queueKind,parentEntryId) VALUES(?,?,?,?,?,?,?)").run(id, input.sessionId, input.text, source, input.scope, kind, input.parentEntryId ?? null);
|
|
286
|
+
return id;
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
delivered(sessionId, text, timestamp, hasUnsupportedContent = false) {
|
|
290
|
+
const digest = createHash("sha256").update(text).digest("hex");
|
|
291
|
+
this.transaction(() => {
|
|
292
|
+
if (this.db.prepare("SELECT id FROM deliveries WHERE sessionId=? AND digest=? AND timestamp=?").get(sessionId, digest, timestamp))
|
|
293
|
+
return;
|
|
294
|
+
// Pi drains direct delivery, steering, then follow-up queues. Never search old
|
|
295
|
+
// inputs by text: a cancelled global input must not authenticate project text.
|
|
296
|
+
const expected = this.db.prepare("SELECT * FROM inputs WHERE sessionId=? ORDER BY CASE queueKind WHEN 'direct' THEN 0 WHEN 'steer' THEN 1 ELSE 2 END, rowid LIMIT 1").get(sessionId);
|
|
297
|
+
const matches = expected?.text === text;
|
|
298
|
+
const source = hasUnsupportedContent ? "unsupported_content" : matches ? String(expected.source) : "ambiguous";
|
|
299
|
+
this.db.prepare("INSERT OR IGNORE INTO deliveries(sessionId,text,digest,timestamp,scope,source,state) VALUES(?,?,?,?,?,?,'unbound')").run(sessionId, text, digest, timestamp, expected?.scope ?? "global", source);
|
|
300
|
+
if (expected)
|
|
301
|
+
this.db.prepare("DELETE FROM inputs WHERE id=?").run(expected.id);
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
bind(sessionId, entries, admit) { this.transaction(() => { const deliveries = this.db.prepare("SELECT * FROM deliveries WHERE sessionId=? AND state='unbound' ORDER BY id").all(sessionId); for (const delivery of deliveries) {
|
|
305
|
+
const matches = entries.filter(e => e.text === delivery.text && e.timestamp === delivery.timestamp);
|
|
306
|
+
if (matches.length > 1) {
|
|
307
|
+
this.db.prepare("UPDATE deliveries SET state='quarantined' WHERE id=?").run(delivery.id);
|
|
308
|
+
continue;
|
|
309
|
+
}
|
|
310
|
+
if (matches.length === 0)
|
|
311
|
+
continue;
|
|
312
|
+
this.db.prepare("UPDATE deliveries SET state='bound',text='' WHERE id=?").run(delivery.id);
|
|
313
|
+
(admit ?? ((input) => this.enqueue(input)))({ sessionId, entryId: matches[0].id, text: String(delivery.text), scope: String(delivery.scope), source: String(delivery.source), observedAt: new Date(Number(delivery.timestamp)).toISOString() });
|
|
314
|
+
} }); }
|
|
315
|
+
status() { return { observations: this.db.prepare("SELECT state,COUNT(*) AS count FROM observations GROUP BY state").all(), jobs: this.db.prepare("SELECT id,state,attempts,issue,diagnostic,available FROM jobs ORDER BY rowid").all().map(row => ({ id: String(row.id), state: String(row.state), attempts: Number(row.attempts), issue: nullableString(row.issue), diagnostic: readDiagnostic(row.diagnostic), retryAt: row.state === 'retry' ? Number(row.available) : null })), quarantinedDeliveries: Number(this.db.prepare("SELECT COUNT(*) AS n FROM deliveries WHERE state='quarantined'").get().n), unbound: Number(this.db.prepare("SELECT COUNT(*) AS n FROM deliveries WHERE state='unbound'").get().n) }; }
|
|
316
|
+
close() { this.db.close(); }
|
|
317
|
+
}
|
|
318
|
+
function nullableString(value) { return value === null || value === undefined ? null : String(value); }
|
|
319
|
+
function readDiagnostic(value) { if (typeof value !== 'string')
|
|
320
|
+
return null; try {
|
|
321
|
+
return sanitizeDiagnostic(JSON.parse(value));
|
|
322
|
+
}
|
|
323
|
+
catch {
|
|
324
|
+
return null;
|
|
325
|
+
} }
|
|
326
|
+
//# sourceMappingURL=runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/v2/runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { RuntimeStore } from './runtime.js';
|
|
2
|
+
export interface DrainWriter {
|
|
3
|
+
store: RuntimeStore;
|
|
4
|
+
run(options?: {
|
|
5
|
+
force?: boolean;
|
|
6
|
+
signal?: AbortSignal;
|
|
7
|
+
}): Promise<unknown>;
|
|
8
|
+
}
|
|
9
|
+
/** Waits through backoff and foreign leases. Dead/quarantined work is terminal, never success. */
|
|
10
|
+
export declare function drainSessions(writer: DrainWriter, options?: {
|
|
11
|
+
sessionId?: string;
|
|
12
|
+
signal?: AbortSignal;
|
|
13
|
+
}): Promise<boolean>;
|
|
14
|
+
//# sourceMappingURL=session-drain.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-drain.d.ts","sourceRoot":"","sources":["../../src/v2/session-drain.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,MAAM,WAAW,WAAW;IAAG,KAAK,EAAC,YAAY,CAAC;IAAC,GAAG,CAAC,OAAO,CAAC,EAAC;QAAC,KAAK,CAAC,EAAC,OAAO,CAAC;QAAA,MAAM,CAAC,EAAC,WAAW,CAAA;KAAC,GAAE,OAAO,CAAC,OAAO,CAAC,CAAA;CAAE;AACxH,kGAAkG;AAClG,wBAAsB,aAAa,CAAC,MAAM,EAAC,WAAW,EAAE,OAAO,GAAC;IAAC,SAAS,CAAC,EAAC,MAAM,CAAC;IAAA,MAAM,CAAC,EAAC,WAAW,CAAA;CAAI,GAAE,OAAO,CAAC,OAAO,CAAC,CAS3H"}
|