@remnic/core 9.3.629 → 9.3.631
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-cli.js +15 -13
- package/dist/access-cli.js.map +1 -1
- package/dist/access-http.d.ts +5 -4
- package/dist/access-http.js +7 -6
- package/dist/access-mcp.d.ts +5 -4
- package/dist/access-mcp.js +6 -5
- package/dist/{access-service-BdThkfIE.d.ts → access-service-C9_EpVHd.d.ts} +2 -2
- package/dist/access-service.d.ts +5 -4
- package/dist/access-service.js +5 -4
- package/dist/action-confidence.d.ts +1 -1
- package/dist/active-memory-bridge.d.ts +1 -1
- package/dist/active-recall.d.ts +1 -1
- package/dist/active-recall.js +1 -1
- package/dist/auto-sync-RFADEHIQ.js +75 -0
- package/dist/auto-sync-RFADEHIQ.js.map +1 -0
- package/dist/behavior-learner.d.ts +1 -1
- package/dist/behavior-signals.d.ts +1 -1
- package/dist/bootstrap.d.ts +4 -3
- package/dist/briefing.d.ts +1 -1
- package/dist/briefing.js +3 -2
- package/dist/buffer-surprise-report.d.ts +1 -1
- package/dist/buffer.d.ts +1 -1
- package/dist/calibration.d.ts +1 -1
- package/dist/causal-behavior.d.ts +1 -1
- package/dist/causal-consolidation.d.ts +1 -1
- package/dist/causal-consolidation.js +4 -3
- package/dist/causal-consolidation.js.map +1 -1
- package/dist/{chunk-532VCWYW.js → chunk-242XFZ36.js} +2 -2
- package/dist/{chunk-XXO5TI3B.js → chunk-32U3N7H5.js} +3 -3
- package/dist/{chunk-KB4MFBF5.js → chunk-3RDYU3JS.js} +3 -3
- package/dist/{chunk-57QXN2CS.js → chunk-4S3N6HFG.js} +2 -2
- package/dist/{chunk-OLNNOHBC.js → chunk-5PT5I6JQ.js} +20 -14
- package/dist/{chunk-OLNNOHBC.js.map → chunk-5PT5I6JQ.js.map} +1 -1
- package/dist/{chunk-GE7Q7KXP.js → chunk-7A2QKUUA.js} +2 -2
- package/dist/{chunk-KKTXCFD7.js → chunk-7H5WCPBS.js} +95 -11
- package/dist/{chunk-KKTXCFD7.js.map → chunk-7H5WCPBS.js.map} +1 -1
- package/dist/{chunk-3MNBW7R7.js → chunk-C4KKM62E.js} +2 -2
- package/dist/{chunk-NKCW223V.js → chunk-CMN5AWAZ.js} +2 -2
- package/dist/{chunk-JXHMAQYT.js → chunk-DOBJH4I6.js} +4 -4
- package/dist/{chunk-TZDSNIRO.js → chunk-IFVFQRZ2.js} +5 -5
- package/dist/{chunk-LQYTQCXM.js → chunk-JCLECECB.js} +2 -2
- package/dist/chunk-KVDUDYEN.js +1164 -0
- package/dist/chunk-KVDUDYEN.js.map +1 -0
- package/dist/{chunk-QDV6VAD4.js → chunk-LEG7XWS2.js} +2 -2
- package/dist/chunk-M7XQSUBB.js +280 -0
- package/dist/chunk-M7XQSUBB.js.map +1 -0
- package/dist/{chunk-N5RGXWLQ.js → chunk-PUEAEQSN.js} +2 -2
- package/dist/{chunk-UGHUNQ74.js → chunk-QYGIQ5NM.js} +212 -417
- package/dist/chunk-QYGIQ5NM.js.map +1 -0
- package/dist/{chunk-JKCDQBDW.js → chunk-UXFOGILU.js} +2 -2
- package/dist/{chunk-MVQN73GT.js → chunk-VTR3MNYF.js} +2 -2
- package/dist/{chunk-KVFYTRMV.js → chunk-W25I7G6U.js} +2 -2
- package/dist/{chunk-3GLCUPXP.js → chunk-WLZBVYC6.js} +192 -889
- package/dist/chunk-WLZBVYC6.js.map +1 -0
- package/dist/{chunk-3R2UZV3U.js → chunk-X7EJF46S.js} +2 -2
- package/dist/{chunk-54KDA6UK.js → chunk-XG4NAWAV.js} +3 -3
- package/dist/{chunk-P2D2MM47.js → chunk-YROCXMCK.js} +2 -2
- package/dist/{cli-DAsHklrf.d.ts → cli-CuVEQWKr.d.ts} +3 -3
- package/dist/cli.d.ts +6 -5
- package/dist/cli.js +18 -17
- package/dist/compounding/engine.d.ts +1 -1
- package/dist/compounding/engine.js +3 -2
- package/dist/compounding/preference-consolidator.d.ts +1 -1
- package/dist/compression-optimizer.d.ts +1 -1
- package/dist/config.d.ts +1 -1
- package/dist/config.js +1 -1
- package/dist/connectors/codex-materialize-runner.d.ts +1 -1
- package/dist/connectors/codex-materialize-runner.js +3 -2
- package/dist/connectors/codex-materialize.d.ts +1 -1
- package/dist/connectors/index.d.ts +1 -1
- package/dist/connectors/index.js +3 -2
- package/dist/consolidation-provenance-check.d.ts +1 -1
- package/dist/consolidation-undo.d.ts +1 -1
- package/dist/contradiction/index.d.ts +1 -1
- package/dist/contradiction/index.js +4 -4
- package/dist/conversation-index/backend.d.ts +1 -1
- package/dist/conversation-index/chunker.d.ts +1 -1
- package/dist/conversation-index/faiss-adapter.d.ts +1 -1
- package/dist/conversation-index/indexer.d.ts +1 -1
- package/dist/conversation-index/search.d.ts +1 -1
- package/dist/day-summary.d.ts +1 -1
- package/dist/delinearize.d.ts +1 -1
- package/dist/direct-answer-wiring.d.ts +1 -1
- package/dist/direct-answer.d.ts +1 -1
- package/dist/embedding-fallback.d.ts +1 -1
- package/dist/enrichment/index.d.ts +1 -1
- package/dist/entity-retrieval.d.ts +1 -1
- package/dist/entity-retrieval.js +3 -2
- package/dist/entity-schema.d.ts +1 -1
- package/dist/explicit-capture.d.ts +4 -3
- package/dist/extraction-judge-telemetry.d.ts +1 -1
- package/dist/extraction-judge-training.d.ts +1 -1
- package/dist/extraction-judge.d.ts +1 -1
- package/dist/extraction.d.ts +1 -1
- package/dist/fallback-llm.d.ts +1 -1
- package/dist/identity-continuity.d.ts +1 -1
- package/dist/importance.d.ts +1 -1
- package/dist/index.d.ts +8 -8
- package/dist/index.js +49 -45
- package/dist/index.js.map +1 -1
- package/dist/intent.d.ts +1 -1
- package/dist/lcm/engine.d.ts +1 -1
- package/dist/lcm/index.d.ts +1 -1
- package/dist/lcm/tools.d.ts +1 -1
- package/dist/lifecycle.d.ts +1 -1
- package/dist/live-connectors-runner.d.ts +1 -1
- package/dist/local-llm.d.ts +1 -1
- package/dist/maintenance/memory-governance.d.ts +1 -1
- package/dist/maintenance/memory-governance.js +3 -2
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +3 -2
- package/dist/maintenance/rebuild-memory-projection.js +4 -3
- package/dist/mcp-memory-inspector-app.d.ts +5 -4
- package/dist/memory-action-policy.d.ts +1 -1
- package/dist/memory-cache.d.ts +1 -1
- package/dist/memory-lifecycle-ledger-utils.d.ts +1 -1
- package/dist/memory-projection-store.d.ts +1 -1
- package/dist/memory-provenance.d.ts +1 -1
- package/dist/memory-worth-outcomes.d.ts +1 -1
- package/dist/models-json.d.ts +1 -1
- package/dist/namespaces/migrate.d.ts +1 -1
- package/dist/namespaces/migrate.js +4 -3
- package/dist/namespaces/principal.d.ts +1 -1
- package/dist/namespaces/search.d.ts +1 -1
- package/dist/namespaces/storage.d.ts +1 -1
- package/dist/namespaces/storage.js +3 -2
- package/dist/native-knowledge.d.ts +1 -1
- package/dist/operator-toolkit.d.ts +1 -1
- package/dist/operator-toolkit.js +7 -6
- package/dist/{orchestrator-BexeSJ2j.d.ts → orchestrator-CoqytbK_.d.ts} +102 -10
- package/dist/orchestrator.d.ts +4 -3
- package/dist/orchestrator.js +12 -10
- package/dist/patterns-cli.d.ts +1 -1
- package/dist/policy-runtime.d.ts +1 -1
- package/dist/qmd-recall-cache.d.ts +1 -1
- package/dist/qmd.d.ts +1 -1
- package/dist/recall-disclosure-escalation.d.ts +1 -1
- package/dist/recall-explain-renderer.d.ts +1 -1
- package/dist/recall-planner-llm.d.ts +1 -1
- package/dist/recall-state.d.ts +1 -1
- package/dist/recall-tag-filter.d.ts +1 -1
- package/dist/recall-xray-cli.d.ts +1 -1
- package/dist/recall-xray-renderer.d.ts +1 -1
- package/dist/recall-xray.d.ts +1 -1
- package/dist/resolve-auth-token.d.ts +1 -1
- package/dist/resume-bundles.js +2 -2
- package/dist/retrieval-agents.d.ts +1 -1
- package/dist/retrieval-tiers.d.ts +1 -1
- package/dist/routing/engine.d.ts +1 -1
- package/dist/routing/store.d.ts +1 -1
- package/dist/search/embed-helper.d.ts +1 -1
- package/dist/search/factory.d.ts +1 -1
- package/dist/search/index.d.ts +1 -1
- package/dist/search/lancedb-backend.d.ts +1 -1
- package/dist/search/meilisearch-backend.d.ts +1 -1
- package/dist/search/noop-backend.d.ts +1 -1
- package/dist/search/orama-backend.d.ts +1 -1
- package/dist/search/port.d.ts +1 -1
- package/dist/search/remote-backend.d.ts +1 -1
- package/dist/{semantic-consolidation-PwkzNfdK.d.ts → semantic-consolidation-BPs6BURk.d.ts} +1 -1
- package/dist/semantic-consolidation.d.ts +2 -2
- package/dist/semantic-consolidation.js +4 -3
- package/dist/semantic-rule-promotion.js +3 -2
- package/dist/semantic-rule-verifier.d.ts +1 -1
- package/dist/semantic-rule-verifier.js +3 -2
- package/dist/session-observer-bands.d.ts +1 -1
- package/dist/session-observer-state.d.ts +1 -1
- package/dist/shared-context/manager.d.ts +1 -1
- package/dist/signal.d.ts +1 -1
- package/dist/storage.d.ts +38 -2
- package/dist/storage.js +6 -3
- package/dist/summarizer.d.ts +1 -1
- package/dist/summary-snapshot.d.ts +1 -1
- package/dist/temporal-supersession.d.ts +1 -1
- package/dist/temporal-validity.d.ts +1 -1
- package/dist/threading.d.ts +1 -1
- package/dist/tier-migration.d.ts +1 -1
- package/dist/tier-routing.d.ts +1 -1
- package/dist/topics.d.ts +1 -1
- package/dist/transcript.d.ts +1 -1
- package/dist/{types-BCF2wqKa.d.ts → types-CpMPD8xl.d.ts} +59 -11
- package/dist/types.d.ts +1 -1
- package/dist/utility-runtime.d.ts +1 -1
- package/dist/verified-recall.js +3 -2
- package/package.json +1 -1
- package/src/orchestrator.ts +74 -0
- package/src/storage.ts +100 -0
- package/src/wearables/auto-sync.test.ts +181 -0
- package/src/wearables/auto-sync.ts +129 -0
- package/src/wearables/cli.ts +6 -0
- package/src/wearables/config.test.ts +90 -11
- package/src/wearables/config.ts +113 -11
- package/src/wearables/memory-gen.test.ts +416 -1
- package/src/wearables/memory-gen.ts +381 -23
- package/src/wearables/pipeline.test.ts +396 -5
- package/src/wearables/pipeline.ts +174 -22
- package/src/wearables/service.test.ts +172 -0
- package/src/wearables/service.ts +84 -3
- package/src/wearables/storage-io.test.ts +81 -0
- package/src/wearables/trust.test.ts +123 -0
- package/src/wearables/trust.ts +168 -0
- package/src/wearables/types.ts +57 -9
- package/dist/chunk-3GLCUPXP.js.map +0 -1
- package/dist/chunk-UGHUNQ74.js.map +0 -1
- /package/dist/{chunk-532VCWYW.js.map → chunk-242XFZ36.js.map} +0 -0
- /package/dist/{chunk-XXO5TI3B.js.map → chunk-32U3N7H5.js.map} +0 -0
- /package/dist/{chunk-KB4MFBF5.js.map → chunk-3RDYU3JS.js.map} +0 -0
- /package/dist/{chunk-57QXN2CS.js.map → chunk-4S3N6HFG.js.map} +0 -0
- /package/dist/{chunk-GE7Q7KXP.js.map → chunk-7A2QKUUA.js.map} +0 -0
- /package/dist/{chunk-3MNBW7R7.js.map → chunk-C4KKM62E.js.map} +0 -0
- /package/dist/{chunk-NKCW223V.js.map → chunk-CMN5AWAZ.js.map} +0 -0
- /package/dist/{chunk-JXHMAQYT.js.map → chunk-DOBJH4I6.js.map} +0 -0
- /package/dist/{chunk-TZDSNIRO.js.map → chunk-IFVFQRZ2.js.map} +0 -0
- /package/dist/{chunk-LQYTQCXM.js.map → chunk-JCLECECB.js.map} +0 -0
- /package/dist/{chunk-QDV6VAD4.js.map → chunk-LEG7XWS2.js.map} +0 -0
- /package/dist/{chunk-N5RGXWLQ.js.map → chunk-PUEAEQSN.js.map} +0 -0
- /package/dist/{chunk-JKCDQBDW.js.map → chunk-UXFOGILU.js.map} +0 -0
- /package/dist/{chunk-MVQN73GT.js.map → chunk-VTR3MNYF.js.map} +0 -0
- /package/dist/{chunk-KVFYTRMV.js.map → chunk-W25I7G6U.js.map} +0 -0
- /package/dist/{chunk-3R2UZV3U.js.map → chunk-X7EJF46S.js.map} +0 -0
- /package/dist/{chunk-54KDA6UK.js.map → chunk-XG4NAWAV.js.map} +0 -0
- /package/dist/{chunk-P2D2MM47.js.map → chunk-YROCXMCK.js.map} +0 -0
|
@@ -25,17 +25,20 @@ test("boolean-ish strings coerce; garbage booleans throw", () => {
|
|
|
25
25
|
assert.throws(() => parseWearablesConfig({ enabled: "fales" }), /wearables.enabled/);
|
|
26
26
|
});
|
|
27
27
|
|
|
28
|
-
test("source settings default to the
|
|
28
|
+
test("source settings default to the fully-automated smart pipeline", () => {
|
|
29
29
|
const parsed = parseWearablesConfig({
|
|
30
30
|
enabled: true,
|
|
31
31
|
sources: { limitless: { enabled: true } },
|
|
32
32
|
});
|
|
33
33
|
const source = parsed.sources.limitless;
|
|
34
|
-
assert.equal(source.memoryMode, "
|
|
34
|
+
assert.equal(source.memoryMode, "smart");
|
|
35
|
+
assert.equal(source.sourceTrust, 0.8);
|
|
36
|
+
assert.equal(source.autoApproveTrust, 0.7);
|
|
37
|
+
assert.equal(source.reviewTrust, 0.45);
|
|
35
38
|
assert.equal(source.minConfidence, 0.6);
|
|
36
39
|
assert.equal(source.minImportance, "low");
|
|
37
|
-
assert.equal(source.maxMemoriesPerDay,
|
|
38
|
-
assert.equal(source.importNativeMemories, "
|
|
40
|
+
assert.equal(source.maxMemoriesPerDay, 0, "uncapped by default");
|
|
41
|
+
assert.equal(source.importNativeMemories, "smart");
|
|
39
42
|
assert.deepEqual(source.cleanup, {
|
|
40
43
|
mergeSameSpeaker: true,
|
|
41
44
|
stripFillers: true,
|
|
@@ -44,6 +47,32 @@ test("source settings default to the least-privileged memory mode", () => {
|
|
|
44
47
|
});
|
|
45
48
|
});
|
|
46
49
|
|
|
50
|
+
test("top-level defaults are full-featured: digest and off-the-record on", () => {
|
|
51
|
+
const parsed = parseWearablesConfig({});
|
|
52
|
+
assert.equal(parsed.digestEnabled, true);
|
|
53
|
+
assert.equal(parsed.offTheRecordEnabled, true);
|
|
54
|
+
assert.equal(parsed.redactionEnabled, true);
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
test("trust knobs validate range and ordering", () => {
|
|
58
|
+
assert.throws(
|
|
59
|
+
() => parseWearablesConfig({ sources: { bee: { sourceTrust: 1.5 } } }),
|
|
60
|
+
/sourceTrust must be a number between 0 and 1/,
|
|
61
|
+
);
|
|
62
|
+
assert.throws(
|
|
63
|
+
() => parseWearablesConfig({ sources: { bee: { autoApproveTrust: -1 } } }),
|
|
64
|
+
/autoApproveTrust/,
|
|
65
|
+
);
|
|
66
|
+
assert.throws(
|
|
67
|
+
() => parseWearablesConfig({ sources: { bee: { reviewTrust: 0.9, autoApproveTrust: 0.7 } } }),
|
|
68
|
+
/reviewTrust .* must be below autoApproveTrust/,
|
|
69
|
+
);
|
|
70
|
+
const parsed = parseWearablesConfig({
|
|
71
|
+
sources: { bee: { sourceTrust: 0.5, autoApproveTrust: 0.8, reviewTrust: 0.3 } },
|
|
72
|
+
});
|
|
73
|
+
assert.equal(parsed.sources.bee.sourceTrust, 0.5);
|
|
74
|
+
});
|
|
75
|
+
|
|
47
76
|
test("invalid enum values list the valid options", () => {
|
|
48
77
|
assert.throws(
|
|
49
78
|
() =>
|
|
@@ -66,15 +95,15 @@ test("maxMemoriesPerDay honors the documented 0-disables value and bounds", () =
|
|
|
66
95
|
sources: { limitless: { maxMemoriesPerDay: 0 } },
|
|
67
96
|
});
|
|
68
97
|
assert.equal(parsed.sources.limitless.maxMemoriesPerDay, 0);
|
|
69
|
-
//
|
|
70
|
-
assert.throws(
|
|
71
|
-
() => parseWearablesConfig({ sources: { limitless: { maxMemoriesPerDay: 99999 } } }),
|
|
72
|
-
/maxMemoriesPerDay must be an integer between 0 and 500/,
|
|
73
|
-
);
|
|
98
|
+
// No ceiling: any non-negative integer cap is the operator's call.
|
|
74
99
|
assert.equal(
|
|
75
|
-
parseWearablesConfig({ sources: { limitless: { maxMemoriesPerDay:
|
|
100
|
+
parseWearablesConfig({ sources: { limitless: { maxMemoriesPerDay: 99999 } } })
|
|
76
101
|
.sources.limitless.maxMemoriesPerDay,
|
|
77
|
-
|
|
102
|
+
99999,
|
|
103
|
+
);
|
|
104
|
+
assert.throws(
|
|
105
|
+
() => parseWearablesConfig({ sources: { limitless: { maxMemoriesPerDay: -1 } } }),
|
|
106
|
+
/maxMemoriesPerDay must be a non-negative integer/,
|
|
78
107
|
);
|
|
79
108
|
assert.throws(
|
|
80
109
|
() => parseWearablesConfig({ sources: { limitless: { maxMemoriesPerDay: "lots" } } }),
|
|
@@ -141,3 +170,53 @@ test("minConfidence rejects out-of-range values instead of clamping", () => {
|
|
|
141
170
|
0.85,
|
|
142
171
|
);
|
|
143
172
|
});
|
|
173
|
+
|
|
174
|
+
test("auto-sync defaults to enabled with sane window settings", () => {
|
|
175
|
+
const parsed = parseWearablesConfig({});
|
|
176
|
+
assert.equal(parsed.autoSyncEnabled, true);
|
|
177
|
+
assert.equal(parsed.autoSyncIntervalMinutes, 15);
|
|
178
|
+
assert.equal(parsed.autoSyncDays, 2);
|
|
179
|
+
assert.equal(parsed.autoSyncDeepDays, 7);
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
test("auto-sync knobs parse, coerce, and loud-reject invalid values", () => {
|
|
183
|
+
const parsed = parseWearablesConfig({
|
|
184
|
+
autoSyncEnabled: "false",
|
|
185
|
+
autoSyncIntervalMinutes: "30",
|
|
186
|
+
autoSyncDays: 3,
|
|
187
|
+
autoSyncDeepDays: 14,
|
|
188
|
+
});
|
|
189
|
+
assert.equal(parsed.autoSyncEnabled, false, "boolean-ish strings coerce");
|
|
190
|
+
assert.equal(parsed.autoSyncIntervalMinutes, 30, "numeric strings coerce");
|
|
191
|
+
assert.equal(parsed.autoSyncDays, 3);
|
|
192
|
+
assert.equal(parsed.autoSyncDeepDays, 14);
|
|
193
|
+
|
|
194
|
+
assert.throws(
|
|
195
|
+
() => parseWearablesConfig({ autoSyncIntervalMinutes: 0 }),
|
|
196
|
+
/autoSyncIntervalMinutes must be an integer between 1 and 1440/,
|
|
197
|
+
);
|
|
198
|
+
assert.throws(
|
|
199
|
+
() => parseWearablesConfig({ autoSyncIntervalMinutes: 2.5 }),
|
|
200
|
+
/autoSyncIntervalMinutes/,
|
|
201
|
+
);
|
|
202
|
+
assert.throws(
|
|
203
|
+
() => parseWearablesConfig({ autoSyncDays: 0 }),
|
|
204
|
+
/autoSyncDays must be an integer between 1 and 90/,
|
|
205
|
+
);
|
|
206
|
+
assert.throws(
|
|
207
|
+
() => parseWearablesConfig({ autoSyncDeepDays: 91 }),
|
|
208
|
+
/autoSyncDeepDays must be an integer between 0 and 90/,
|
|
209
|
+
);
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
test("a deep window narrower than the tick window is rejected, 0 disables", () => {
|
|
213
|
+
assert.throws(
|
|
214
|
+
() => parseWearablesConfig({ autoSyncDays: 5, autoSyncDeepDays: 3 }),
|
|
215
|
+
/autoSyncDeepDays must be 0 \(disabled\) or >= wearables.autoSyncDays/,
|
|
216
|
+
);
|
|
217
|
+
assert.equal(parseWearablesConfig({ autoSyncDeepDays: 0 }).autoSyncDeepDays, 0);
|
|
218
|
+
assert.equal(
|
|
219
|
+
parseWearablesConfig({ autoSyncDays: 5, autoSyncDeepDays: 5 }).autoSyncDeepDays,
|
|
220
|
+
5,
|
|
221
|
+
);
|
|
222
|
+
});
|
package/src/wearables/config.ts
CHANGED
|
@@ -22,7 +22,7 @@ import type {
|
|
|
22
22
|
|
|
23
23
|
export const KNOWN_WEARABLE_SOURCE_IDS = ["limitless", "bee", "omi"] as const;
|
|
24
24
|
|
|
25
|
-
const MEMORY_MODES: WearableMemoryMode[] = ["off", "review", "auto"];
|
|
25
|
+
const MEMORY_MODES: WearableMemoryMode[] = ["off", "review", "auto", "smart"];
|
|
26
26
|
const IMPORTANCE_LEVELS: ImportanceLevel[] = [
|
|
27
27
|
"trivial",
|
|
28
28
|
"low",
|
|
@@ -30,12 +30,23 @@ const IMPORTANCE_LEVELS: ImportanceLevel[] = [
|
|
|
30
30
|
"high",
|
|
31
31
|
"critical",
|
|
32
32
|
];
|
|
33
|
-
const NATIVE_IMPORT_MODES = ["off", "review"] as const;
|
|
33
|
+
const NATIVE_IMPORT_MODES = ["off", "review", "smart"] as const;
|
|
34
34
|
|
|
35
35
|
const DEFAULT_MIN_CONFIDENCE = 0.6;
|
|
36
36
|
const DEFAULT_MIN_IMPORTANCE: ImportanceLevel = "low";
|
|
37
|
-
|
|
38
|
-
|
|
37
|
+
// Uncapped by default — wearables capture full days and the smart trust
|
|
38
|
+
// pipeline is the quality gate; a count cap would drop real memories on
|
|
39
|
+
// busy days. Operators who want a ceiling set any positive integer.
|
|
40
|
+
const DEFAULT_MAX_MEMORIES_PER_DAY = 0;
|
|
41
|
+
const DEFAULT_AUTO_SYNC_ENABLED = true;
|
|
42
|
+
const DEFAULT_AUTO_SYNC_INTERVAL_MINUTES = 15;
|
|
43
|
+
const MAX_AUTO_SYNC_INTERVAL_MINUTES = 1440;
|
|
44
|
+
const DEFAULT_AUTO_SYNC_DAYS = 2;
|
|
45
|
+
const DEFAULT_AUTO_SYNC_DEEP_DAYS = 7;
|
|
46
|
+
const MAX_AUTO_SYNC_WINDOW_DAYS = 90;
|
|
47
|
+
const DEFAULT_SOURCE_TRUST = 0.8;
|
|
48
|
+
const DEFAULT_AUTO_APPROVE_TRUST = 0.7;
|
|
49
|
+
const DEFAULT_REVIEW_TRUST = 0.45;
|
|
39
50
|
|
|
40
51
|
export function defaultWearableCleanupSettings(): WearableCleanupSettings {
|
|
41
52
|
return {
|
|
@@ -49,11 +60,14 @@ export function defaultWearableCleanupSettings(): WearableCleanupSettings {
|
|
|
49
60
|
export function defaultWearableSourceSettings(): WearableSourceSettings {
|
|
50
61
|
return {
|
|
51
62
|
enabled: false,
|
|
52
|
-
memoryMode: "
|
|
63
|
+
memoryMode: "smart",
|
|
64
|
+
sourceTrust: DEFAULT_SOURCE_TRUST,
|
|
65
|
+
autoApproveTrust: DEFAULT_AUTO_APPROVE_TRUST,
|
|
66
|
+
reviewTrust: DEFAULT_REVIEW_TRUST,
|
|
53
67
|
minConfidence: DEFAULT_MIN_CONFIDENCE,
|
|
54
68
|
minImportance: DEFAULT_MIN_IMPORTANCE,
|
|
55
69
|
maxMemoriesPerDay: DEFAULT_MAX_MEMORIES_PER_DAY,
|
|
56
|
-
importNativeMemories: "
|
|
70
|
+
importNativeMemories: "smart",
|
|
57
71
|
cleanup: defaultWearableCleanupSettings(),
|
|
58
72
|
};
|
|
59
73
|
}
|
|
@@ -63,8 +77,12 @@ export function defaultWearablesConfig(): WearablesConfig {
|
|
|
63
77
|
enabled: false,
|
|
64
78
|
redactionEnabled: true,
|
|
65
79
|
redactionPatterns: [],
|
|
66
|
-
offTheRecordEnabled:
|
|
67
|
-
digestEnabled:
|
|
80
|
+
offTheRecordEnabled: true,
|
|
81
|
+
digestEnabled: true,
|
|
82
|
+
autoSyncEnabled: DEFAULT_AUTO_SYNC_ENABLED,
|
|
83
|
+
autoSyncIntervalMinutes: DEFAULT_AUTO_SYNC_INTERVAL_MINUTES,
|
|
84
|
+
autoSyncDays: DEFAULT_AUTO_SYNC_DAYS,
|
|
85
|
+
autoSyncDeepDays: DEFAULT_AUTO_SYNC_DEEP_DAYS,
|
|
68
86
|
corrections: [],
|
|
69
87
|
sources: {},
|
|
70
88
|
};
|
|
@@ -192,17 +210,39 @@ function parseSourceSettings(
|
|
|
192
210
|
raw.maxMemoriesPerDay !== undefined &&
|
|
193
211
|
(maxPerDayRaw === undefined ||
|
|
194
212
|
!Number.isInteger(maxPerDayRaw) ||
|
|
195
|
-
maxPerDayRaw < 0
|
|
196
|
-
maxPerDayRaw > MAX_MEMORIES_PER_DAY_CEILING)
|
|
213
|
+
maxPerDayRaw < 0)
|
|
197
214
|
) {
|
|
198
215
|
throw new Error(
|
|
199
|
-
`${keyPath}.maxMemoriesPerDay must be
|
|
216
|
+
`${keyPath}.maxMemoriesPerDay must be a non-negative integer (0, the default, disables the cap); got ${JSON.stringify(raw.maxMemoriesPerDay)}`,
|
|
200
217
|
);
|
|
201
218
|
}
|
|
202
219
|
// 0 is the documented "disable the cap" value — honored here AND in
|
|
203
220
|
// the schema minimum (CLAUDE.md rule 45).
|
|
204
221
|
const maxMemoriesPerDay = maxPerDayRaw ?? defaults.maxMemoriesPerDay;
|
|
205
222
|
|
|
223
|
+
const parseUnitInterval = (value: unknown, name: string, fallback: number): number => {
|
|
224
|
+
if (value === undefined) return fallback;
|
|
225
|
+
const coerced = coerceNumber(value);
|
|
226
|
+
if (coerced === undefined || coerced < 0 || coerced > 1) {
|
|
227
|
+
throw new Error(
|
|
228
|
+
`${keyPath}.${name} must be a number between 0 and 1 (got ${JSON.stringify(value)})`,
|
|
229
|
+
);
|
|
230
|
+
}
|
|
231
|
+
return coerced;
|
|
232
|
+
};
|
|
233
|
+
const sourceTrust = parseUnitInterval(raw.sourceTrust, "sourceTrust", defaults.sourceTrust);
|
|
234
|
+
const autoApproveTrust = parseUnitInterval(
|
|
235
|
+
raw.autoApproveTrust,
|
|
236
|
+
"autoApproveTrust",
|
|
237
|
+
defaults.autoApproveTrust,
|
|
238
|
+
);
|
|
239
|
+
const reviewTrust = parseUnitInterval(raw.reviewTrust, "reviewTrust", defaults.reviewTrust);
|
|
240
|
+
if (reviewTrust >= autoApproveTrust) {
|
|
241
|
+
throw new Error(
|
|
242
|
+
`${keyPath}.reviewTrust (${reviewTrust}) must be below autoApproveTrust (${autoApproveTrust})`,
|
|
243
|
+
);
|
|
244
|
+
}
|
|
245
|
+
|
|
206
246
|
const rawCleanup =
|
|
207
247
|
raw.cleanup === undefined ? {} : requireObject(raw.cleanup, `${keyPath}.cleanup`);
|
|
208
248
|
const cleanup: WearableCleanupSettings = {
|
|
@@ -240,6 +280,9 @@ function parseSourceSettings(
|
|
|
240
280
|
MEMORY_MODES,
|
|
241
281
|
defaults.memoryMode,
|
|
242
282
|
),
|
|
283
|
+
sourceTrust,
|
|
284
|
+
autoApproveTrust,
|
|
285
|
+
reviewTrust,
|
|
243
286
|
minConfidence,
|
|
244
287
|
minImportance: parseEnum(
|
|
245
288
|
raw.minImportance,
|
|
@@ -291,6 +334,57 @@ export function parseWearablesConfig(value: unknown): WearablesConfig {
|
|
|
291
334
|
compileRedactionPatterns(redactionPatterns);
|
|
292
335
|
}
|
|
293
336
|
|
|
337
|
+
const parseBoundedInt = (
|
|
338
|
+
value: unknown,
|
|
339
|
+
name: string,
|
|
340
|
+
fallback: number,
|
|
341
|
+
min: number,
|
|
342
|
+
max: number,
|
|
343
|
+
): number => {
|
|
344
|
+
if (value === undefined) return fallback;
|
|
345
|
+
const coerced = coerceNumber(value);
|
|
346
|
+
if (
|
|
347
|
+
coerced === undefined ||
|
|
348
|
+
!Number.isInteger(coerced) ||
|
|
349
|
+
coerced < min ||
|
|
350
|
+
coerced > max
|
|
351
|
+
) {
|
|
352
|
+
throw new Error(
|
|
353
|
+
`${name} must be an integer between ${min} and ${max}; got ${JSON.stringify(value)}`,
|
|
354
|
+
);
|
|
355
|
+
}
|
|
356
|
+
return coerced;
|
|
357
|
+
};
|
|
358
|
+
const autoSyncIntervalMinutes = parseBoundedInt(
|
|
359
|
+
raw.autoSyncIntervalMinutes,
|
|
360
|
+
"wearables.autoSyncIntervalMinutes",
|
|
361
|
+
defaults.autoSyncIntervalMinutes,
|
|
362
|
+
1,
|
|
363
|
+
MAX_AUTO_SYNC_INTERVAL_MINUTES,
|
|
364
|
+
);
|
|
365
|
+
const autoSyncDays = parseBoundedInt(
|
|
366
|
+
raw.autoSyncDays,
|
|
367
|
+
"wearables.autoSyncDays",
|
|
368
|
+
defaults.autoSyncDays,
|
|
369
|
+
1,
|
|
370
|
+
MAX_AUTO_SYNC_WINDOW_DAYS,
|
|
371
|
+
);
|
|
372
|
+
const autoSyncDeepDays = parseBoundedInt(
|
|
373
|
+
raw.autoSyncDeepDays,
|
|
374
|
+
"wearables.autoSyncDeepDays",
|
|
375
|
+
defaults.autoSyncDeepDays,
|
|
376
|
+
0,
|
|
377
|
+
MAX_AUTO_SYNC_WINDOW_DAYS,
|
|
378
|
+
);
|
|
379
|
+
// A deep window narrower than the every-tick window would make the
|
|
380
|
+
// "deep" pass fetch LESS than a normal tick — reject the confusion
|
|
381
|
+
// instead of silently honoring it (0 disables the deep pass).
|
|
382
|
+
if (autoSyncDeepDays !== 0 && autoSyncDeepDays < autoSyncDays) {
|
|
383
|
+
throw new Error(
|
|
384
|
+
`wearables.autoSyncDeepDays must be 0 (disabled) or >= wearables.autoSyncDays (${autoSyncDays}); got ${autoSyncDeepDays}`,
|
|
385
|
+
);
|
|
386
|
+
}
|
|
387
|
+
|
|
294
388
|
const sources: Record<string, WearableSourceSettings> = {};
|
|
295
389
|
if (raw.sources !== undefined) {
|
|
296
390
|
const rawSources = requireObject(raw.sources, "wearables.sources");
|
|
@@ -326,6 +420,14 @@ export function parseWearablesConfig(value: unknown): WearablesConfig {
|
|
|
326
420
|
"wearables.digestEnabled",
|
|
327
421
|
defaults.digestEnabled,
|
|
328
422
|
),
|
|
423
|
+
autoSyncEnabled: parseBool(
|
|
424
|
+
raw.autoSyncEnabled,
|
|
425
|
+
"wearables.autoSyncEnabled",
|
|
426
|
+
defaults.autoSyncEnabled,
|
|
427
|
+
),
|
|
428
|
+
autoSyncIntervalMinutes,
|
|
429
|
+
autoSyncDays,
|
|
430
|
+
autoSyncDeepDays,
|
|
329
431
|
corrections: parseCorrectionRules(raw.corrections, "wearables.corrections"),
|
|
330
432
|
sources,
|
|
331
433
|
};
|