@remnic/core 10.0.96 → 10.0.98
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/dist/access-admin-ops-surface.js +29 -29
- package/dist/access-cli.js +29 -29
- package/dist/access-extraction-force-flush.js +29 -29
- package/dist/access-http-briefing.js +29 -29
- package/dist/access-http-query.js +29 -29
- package/dist/access-http-types.d.ts +2 -0
- package/dist/access-http-types.d.ts.map +1 -1
- package/dist/access-http.d.ts +1 -0
- package/dist/access-http.d.ts.map +1 -1
- package/dist/access-http.js +29 -29
- package/dist/access-identity-continuity-surface.js +29 -29
- package/dist/access-lcm-surface.js +29 -29
- package/dist/access-mcp.js +29 -29
- package/dist/access-observe-write-surface.js +29 -29
- package/dist/access-operations-batch.js +29 -29
- package/dist/access-operations.js +29 -29
- package/dist/access-recall-concurrency.js +29 -29
- package/dist/access-recall-response.js +29 -29
- package/dist/access-recall-surface.js +29 -29
- package/dist/access-service.js +29 -29
- package/dist/active-recall.js +2 -2
- package/dist/briefing.js +3 -3
- package/dist/causal-consolidation.js +4 -4
- package/dist/{chunk-XPCUKWLE.js → chunk-3DQZ2GAY.js} +2 -2
- package/dist/{chunk-4WKR4P7H.js → chunk-3WDFQKB4.js} +2 -2
- package/dist/{chunk-NTDHSV7N.js → chunk-4PXDXCNE.js} +2 -2
- package/dist/{chunk-TFMLRVMW.js → chunk-5DGK7E4W.js} +48 -26
- package/dist/chunk-5DGK7E4W.js.map +1 -0
- package/dist/{chunk-KE3JWIZK.js → chunk-6RW5TONS.js} +7 -7
- package/dist/{chunk-3VWU3KF3.js → chunk-6VAIFSDG.js} +2 -2
- package/dist/{chunk-NT772J7I.js → chunk-A2D5WZRO.js} +2 -2
- package/dist/{chunk-IBKGQ6EY.js → chunk-B2BMTXIF.js} +2 -2
- package/dist/{chunk-WVIWDMFB.js → chunk-BUOP3DOK.js} +6 -2
- package/dist/{chunk-WVIWDMFB.js.map → chunk-BUOP3DOK.js.map} +1 -1
- package/dist/{chunk-4HK7DYOL.js → chunk-CCQEANCY.js} +2 -2
- package/dist/{chunk-HA5DASDG.js → chunk-CH2N4XCJ.js} +2 -2
- package/dist/{chunk-4CXK3GT3.js → chunk-D6WJNWZG.js} +2 -2
- package/dist/{chunk-NX4XDDFQ.js → chunk-E3YHIAO3.js} +3 -3
- package/dist/{chunk-EJ23D4JG.js → chunk-ECC6AAEE.js} +3 -3
- package/dist/{chunk-DWWX3FU3.js → chunk-EHJ2RYR7.js} +3 -3
- package/dist/{chunk-5AJIGWY4.js → chunk-FHQ5SPMD.js} +2 -2
- package/dist/{chunk-53ZVHXVZ.js → chunk-FVPWQWIK.js} +2 -2
- package/dist/{chunk-B7L4ZYFY.js → chunk-KI7E3N6Q.js} +3 -3
- package/dist/{chunk-U6TC6Z5B.js → chunk-MXXTU4R2.js} +2 -2
- package/dist/{chunk-7E7J7QXB.js → chunk-OTSRGZRU.js} +2 -2
- package/dist/{chunk-GLDIMGOS.js → chunk-PWATRW3H.js} +2 -2
- package/dist/{chunk-R4JYSBZE.js → chunk-RXL67CV6.js} +2 -2
- package/dist/{chunk-JH5AV542.js → chunk-SFZEJJ6V.js} +2 -2
- package/dist/{chunk-2LCX6TAD.js → chunk-SW3WUUYA.js} +2 -2
- package/dist/{chunk-F4BUSX3D.js → chunk-TFI2Y5AR.js} +2 -2
- package/dist/{chunk-LRLQ2PRP.js → chunk-TZKK72BY.js} +3 -3
- package/dist/{chunk-RUQE5C32.js → chunk-UG54AEUG.js} +2 -2
- package/dist/{chunk-V7T45MI6.js → chunk-VRBTZDQ5.js} +2 -2
- package/dist/{chunk-KVHGCISP.js → chunk-XP5CKXFV.js} +7 -7
- package/dist/{chunk-ICHLN5L6.js → chunk-YCQMNW3F.js} +2 -2
- package/dist/cli.js +29 -29
- package/dist/coding/export-okf-codegraph.js +2 -2
- package/dist/compounding/engine.js +4 -4
- package/dist/config.js +2 -2
- package/dist/connectors/codex-materialize-runner.js +3 -3
- package/dist/connectors/index.js +3 -3
- package/dist/convergence-refresh.js +5 -5
- package/dist/corpus-watermark.js +5 -5
- package/dist/entity-retrieval.js +3 -3
- package/dist/explicit-capture.js +29 -29
- package/dist/extraction.js +3 -3
- package/dist/harmonic-retrieval.js +3 -3
- package/dist/index.js +29 -29
- package/dist/location/index.js +4 -4
- package/dist/maintenance/memory-governance.js +3 -3
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +3 -3
- package/dist/maintenance/rebuild-memory-projection-runner.js +5 -5
- package/dist/maintenance/rebuild-memory-projection.js +4 -4
- package/dist/namespaces/migrate.js +4 -4
- package/dist/namespaces/search.d.ts.map +1 -1
- package/dist/namespaces/search.js +1 -1
- package/dist/namespaces/storage.js +3 -3
- package/dist/operator-doctor-corpus.js +6 -6
- package/dist/operator-toolkit.js +9 -9
- package/dist/orchestration/backlog-scheduler.js +30 -30
- package/dist/orchestration/buffer-drain-runner.js +30 -30
- package/dist/orchestration/maintenance.js +11 -11
- package/dist/orchestration/orchestrator-init.d.ts +3 -0
- package/dist/orchestration/orchestrator-init.d.ts.map +1 -1
- package/dist/orchestrator.d.ts.map +1 -1
- package/dist/orchestrator.js +29 -29
- package/dist/recall-navigation.js +29 -29
- package/dist/resume-bundles.js +2 -2
- package/dist/semantic-consolidation.js +4 -4
- package/dist/semantic-rule-promotion.js +3 -3
- package/dist/semantic-rule-verifier.js +3 -3
- package/dist/source-agent-qualifier.js +3 -3
- package/dist/standup/build.js +3 -3
- package/dist/storage.js +2 -2
- package/dist/transfer/export-okf.js +3 -3
- package/dist/verified-recall.js +3 -3
- package/dist/who-knows-cli.js +4 -4
- package/dist/who-knows.js +3 -3
- package/package.json +2 -2
- package/src/access-http-cancellation.test.ts +45 -0
- package/src/access-http-types.ts +2 -0
- package/src/access-http.ts +13 -1
- package/src/namespaces/search.test.ts +35 -0
- package/src/namespaces/search.ts +7 -1
- package/src/orchestration/orchestrator-init.ts +25 -0
- package/src/orchestrator-init.test.ts +132 -1
- package/src/orchestrator.ts +3 -0
- package/dist/chunk-TFMLRVMW.js.map +0 -1
- /package/dist/{chunk-XPCUKWLE.js.map → chunk-3DQZ2GAY.js.map} +0 -0
- /package/dist/{chunk-4WKR4P7H.js.map → chunk-3WDFQKB4.js.map} +0 -0
- /package/dist/{chunk-NTDHSV7N.js.map → chunk-4PXDXCNE.js.map} +0 -0
- /package/dist/{chunk-KE3JWIZK.js.map → chunk-6RW5TONS.js.map} +0 -0
- /package/dist/{chunk-3VWU3KF3.js.map → chunk-6VAIFSDG.js.map} +0 -0
- /package/dist/{chunk-NT772J7I.js.map → chunk-A2D5WZRO.js.map} +0 -0
- /package/dist/{chunk-IBKGQ6EY.js.map → chunk-B2BMTXIF.js.map} +0 -0
- /package/dist/{chunk-4HK7DYOL.js.map → chunk-CCQEANCY.js.map} +0 -0
- /package/dist/{chunk-HA5DASDG.js.map → chunk-CH2N4XCJ.js.map} +0 -0
- /package/dist/{chunk-4CXK3GT3.js.map → chunk-D6WJNWZG.js.map} +0 -0
- /package/dist/{chunk-NX4XDDFQ.js.map → chunk-E3YHIAO3.js.map} +0 -0
- /package/dist/{chunk-EJ23D4JG.js.map → chunk-ECC6AAEE.js.map} +0 -0
- /package/dist/{chunk-DWWX3FU3.js.map → chunk-EHJ2RYR7.js.map} +0 -0
- /package/dist/{chunk-5AJIGWY4.js.map → chunk-FHQ5SPMD.js.map} +0 -0
- /package/dist/{chunk-53ZVHXVZ.js.map → chunk-FVPWQWIK.js.map} +0 -0
- /package/dist/{chunk-B7L4ZYFY.js.map → chunk-KI7E3N6Q.js.map} +0 -0
- /package/dist/{chunk-U6TC6Z5B.js.map → chunk-MXXTU4R2.js.map} +0 -0
- /package/dist/{chunk-7E7J7QXB.js.map → chunk-OTSRGZRU.js.map} +0 -0
- /package/dist/{chunk-GLDIMGOS.js.map → chunk-PWATRW3H.js.map} +0 -0
- /package/dist/{chunk-R4JYSBZE.js.map → chunk-RXL67CV6.js.map} +0 -0
- /package/dist/{chunk-JH5AV542.js.map → chunk-SFZEJJ6V.js.map} +0 -0
- /package/dist/{chunk-2LCX6TAD.js.map → chunk-SW3WUUYA.js.map} +0 -0
- /package/dist/{chunk-F4BUSX3D.js.map → chunk-TFI2Y5AR.js.map} +0 -0
- /package/dist/{chunk-LRLQ2PRP.js.map → chunk-TZKK72BY.js.map} +0 -0
- /package/dist/{chunk-RUQE5C32.js.map → chunk-UG54AEUG.js.map} +0 -0
- /package/dist/{chunk-V7T45MI6.js.map → chunk-VRBTZDQ5.js.map} +0 -0
- /package/dist/{chunk-KVHGCISP.js.map → chunk-XP5CKXFV.js.map} +0 -0
- /package/dist/{chunk-ICHLN5L6.js.map → chunk-YCQMNW3F.js.map} +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import assert from "node:assert/strict";
|
|
2
2
|
import { existsSync } from "node:fs";
|
|
3
|
-
import { mkdir, mkdtemp, readFile, rm, writeFile } from "node:fs/promises";
|
|
3
|
+
import { mkdir, mkdtemp, readdir, readFile, rm, writeFile } from "node:fs/promises";
|
|
4
4
|
import os from "node:os";
|
|
5
5
|
import path from "node:path";
|
|
6
6
|
import test from "node:test";
|
|
@@ -1595,3 +1595,134 @@ for (const namespace of ["default", "shared"]) {
|
|
|
1595
1595
|
}
|
|
1596
1596
|
});
|
|
1597
1597
|
}
|
|
1598
|
+
|
|
1599
|
+
test("daemon start builds the fact-hash index once in the background and a save right after start joins it", async () => {
|
|
1600
|
+
const memoryDir = await mkdtemp(path.join(os.tmpdir(), "remnic-warm-fact-hash-"));
|
|
1601
|
+
const orchestrator = new Orchestrator(
|
|
1602
|
+
parseConfig({
|
|
1603
|
+
memoryDir,
|
|
1604
|
+
workspaceDir: path.join(memoryDir, "workspace"),
|
|
1605
|
+
qmdEnabled: false,
|
|
1606
|
+
namespacesEnabled: true,
|
|
1607
|
+
namespaceCatalogEnabled: false,
|
|
1608
|
+
defaultNamespace: "default",
|
|
1609
|
+
sharedNamespace: "shared",
|
|
1610
|
+
namespacePolicies: [],
|
|
1611
|
+
embeddingFallbackEnabled: false,
|
|
1612
|
+
identityContinuityEnabled: false,
|
|
1613
|
+
transcriptEnabled: false,
|
|
1614
|
+
hourlySummariesEnabled: false,
|
|
1615
|
+
compoundingEnabled: false,
|
|
1616
|
+
knowledgeIndexEnabled: false,
|
|
1617
|
+
}),
|
|
1618
|
+
);
|
|
1619
|
+
let releaseCorpus: (() => void) | undefined;
|
|
1620
|
+
try {
|
|
1621
|
+
const storage = await orchestrator.getStorage("default");
|
|
1622
|
+
const realRead = storage.readAllMemories.bind(storage);
|
|
1623
|
+
let corpusReads = 0;
|
|
1624
|
+
let signalStarted!: () => void;
|
|
1625
|
+
const rebuildStarted = new Promise<void>((resolve) => { signalStarted = resolve; });
|
|
1626
|
+
const corpusHeld = new Promise<void>((resolve) => { releaseCorpus = resolve; });
|
|
1627
|
+
storage.readAllMemories = async () => {
|
|
1628
|
+
corpusReads += 1;
|
|
1629
|
+
signalStarted();
|
|
1630
|
+
await corpusHeld;
|
|
1631
|
+
return realRead();
|
|
1632
|
+
};
|
|
1633
|
+
|
|
1634
|
+
assert.notEqual(await withTestDeadline(orchestrator.initialize()), "deadline", "initialize must not wait on the held rebuild");
|
|
1635
|
+
// SAFETY: test reads the private deferredReady gate, as the neighbouring tests do.
|
|
1636
|
+
assert.notEqual(
|
|
1637
|
+
await withTestDeadline((orchestrator as any).deferredReady),
|
|
1638
|
+
"deadline",
|
|
1639
|
+
"deferredReady must not wait on the held rebuild",
|
|
1640
|
+
);
|
|
1641
|
+
let giveUp: NodeJS.Timeout | undefined;
|
|
1642
|
+
const outcome = await Promise.race([
|
|
1643
|
+
rebuildStarted.then(() => "started" as const),
|
|
1644
|
+
new Promise<"not-started">((resolve) => { giveUp = setTimeout(() => resolve("not-started"), 3_000); }),
|
|
1645
|
+
]);
|
|
1646
|
+
clearTimeout(giveUp);
|
|
1647
|
+
assert.equal(outcome, "started", "start must begin the fact-hash corpus rebuild before any save arrives");
|
|
1648
|
+
|
|
1649
|
+
// Two saves landing while the warm-up still runs: both wait on that one flight.
|
|
1650
|
+
const saves = Promise.all([storage.lookupContentHash("first save"), storage.lookupContentHash("second save")]);
|
|
1651
|
+
releaseCorpus?.();
|
|
1652
|
+
const results = await withTestDeadline(saves);
|
|
1653
|
+
if (results === "deadline") assert.fail("saves joining the warm-up never settled");
|
|
1654
|
+
assert.equal(corpusReads, 1, "the saves must not start a second corpus rebuild");
|
|
1655
|
+
assert.deepEqual(results.map((r) => r.authoritative), [true, true]);
|
|
1656
|
+
} finally {
|
|
1657
|
+
releaseCorpus?.();
|
|
1658
|
+
await orchestrator.destroy().catch(() => undefined);
|
|
1659
|
+
await rm(memoryDir, { recursive: true, force: true, maxRetries: 3, retryDelay: 50 });
|
|
1660
|
+
}
|
|
1661
|
+
});
|
|
1662
|
+
|
|
1663
|
+
test("destroy persists a buffered turn before it waits on a running fact-hash warm-up", async () => {
|
|
1664
|
+
const memoryDir = await mkdtemp(path.join(os.tmpdir(), "remnic-warm-destroy-flush-"));
|
|
1665
|
+
const marker = "w7p-buffered-turn-marker";
|
|
1666
|
+
const orchestrator = new Orchestrator(
|
|
1667
|
+
parseConfig({
|
|
1668
|
+
memoryDir,
|
|
1669
|
+
workspaceDir: path.join(memoryDir, "workspace"),
|
|
1670
|
+
qmdEnabled: false,
|
|
1671
|
+
namespacesEnabled: true,
|
|
1672
|
+
namespaceCatalogEnabled: false,
|
|
1673
|
+
defaultNamespace: "default",
|
|
1674
|
+
sharedNamespace: "shared",
|
|
1675
|
+
namespacePolicies: [],
|
|
1676
|
+
bufferSaveDebounceMs: 600_000,
|
|
1677
|
+
embeddingFallbackEnabled: false,
|
|
1678
|
+
identityContinuityEnabled: false,
|
|
1679
|
+
transcriptEnabled: false,
|
|
1680
|
+
hourlySummariesEnabled: false,
|
|
1681
|
+
compoundingEnabled: false,
|
|
1682
|
+
knowledgeIndexEnabled: false,
|
|
1683
|
+
}),
|
|
1684
|
+
);
|
|
1685
|
+
let releaseCorpus: (() => void) | undefined;
|
|
1686
|
+
try {
|
|
1687
|
+
const storage = await orchestrator.getStorage("default");
|
|
1688
|
+
const realRead = storage.readAllMemories.bind(storage);
|
|
1689
|
+
let signalStarted!: () => void;
|
|
1690
|
+
const rebuildStarted = new Promise<void>((resolve) => { signalStarted = resolve; });
|
|
1691
|
+
const corpusHeld = new Promise<void>((resolve) => { releaseCorpus = resolve; });
|
|
1692
|
+
storage.readAllMemories = async () => {
|
|
1693
|
+
signalStarted();
|
|
1694
|
+
await corpusHeld;
|
|
1695
|
+
return realRead();
|
|
1696
|
+
};
|
|
1697
|
+
assert.notEqual(await withTestDeadline(orchestrator.initialize()), "deadline", "initialize must not wait on the held rebuild");
|
|
1698
|
+
assert.notEqual(await withTestDeadline(rebuildStarted), "deadline", "the warm-up must start the rebuild");
|
|
1699
|
+
|
|
1700
|
+
await orchestrator.buffer.addTurn("warm-destroy-key", {
|
|
1701
|
+
role: "user",
|
|
1702
|
+
content: marker,
|
|
1703
|
+
timestamp: new Date().toISOString(),
|
|
1704
|
+
});
|
|
1705
|
+
const bufferOnDisk = async (): Promise<boolean> => {
|
|
1706
|
+
for (const name of await readdir(memoryDir, { recursive: true })) {
|
|
1707
|
+
if ((await readFile(path.join(memoryDir, name), "utf8").catch(() => "")).includes(marker)) return true;
|
|
1708
|
+
}
|
|
1709
|
+
return false;
|
|
1710
|
+
};
|
|
1711
|
+
assert.equal(await bufferOnDisk(), false, "precondition: the debounced save has not run");
|
|
1712
|
+
|
|
1713
|
+
const destroying = orchestrator.destroy();
|
|
1714
|
+
const startedAt = Date.now();
|
|
1715
|
+
let persisted = false;
|
|
1716
|
+
while (Date.now() - startedAt < 1_500 && !persisted) {
|
|
1717
|
+
persisted = await bufferOnDisk();
|
|
1718
|
+
if (!persisted) await new Promise((resolve) => setTimeout(resolve, 25));
|
|
1719
|
+
}
|
|
1720
|
+
assert.equal(persisted, true, "the buffered turn must reach disk within 1.5 s of destroy() while the corpus read is held");
|
|
1721
|
+
releaseCorpus?.();
|
|
1722
|
+
assert.notEqual(await withTestDeadline(destroying), "deadline", "destroy must finish once the rebuild is released");
|
|
1723
|
+
} finally {
|
|
1724
|
+
releaseCorpus?.();
|
|
1725
|
+
await orchestrator.destroy().catch(() => undefined);
|
|
1726
|
+
await rm(memoryDir, { recursive: true, force: true, maxRetries: 3, retryDelay: 50 });
|
|
1727
|
+
}
|
|
1728
|
+
});
|
package/src/orchestrator.ts
CHANGED
|
@@ -1025,6 +1025,9 @@ export class Orchestrator {
|
|
|
1025
1025
|
} catch (err) {
|
|
1026
1026
|
bufferFlushError = err;
|
|
1027
1027
|
}
|
|
1028
|
+
// After the buffer flush: a long fact-hash warm-up must never delay
|
|
1029
|
+
// persisting unsent turns (a kill during the wait would lose them).
|
|
1030
|
+
await this._orchestratorInitCoordinator?.drainStartupWarmups();
|
|
1028
1031
|
const extractionDrainError = await drainExtractionAndShutdownDependencyPropagation(
|
|
1029
1032
|
this.extractionQueueCoordinator,
|
|
1030
1033
|
this._dependencyPropagationDelivery,
|