@soleri/core 9.2.0 → 9.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/data/flows/build.flow.yaml +8 -9
- package/data/flows/deliver.flow.yaml +9 -10
- package/data/flows/design.flow.yaml +3 -4
- package/data/flows/enhance.flow.yaml +5 -6
- package/data/flows/explore.flow.yaml +3 -4
- package/data/flows/fix.flow.yaml +5 -6
- package/data/flows/plan.flow.yaml +4 -5
- package/data/flows/review.flow.yaml +3 -4
- package/dist/curator/curator.d.ts.map +1 -1
- package/dist/curator/curator.js +98 -22
- package/dist/curator/curator.js.map +1 -1
- package/dist/engine/bin/soleri-engine.js.map +1 -1
- package/dist/engine/module-manifest.d.ts +2 -0
- package/dist/engine/module-manifest.d.ts.map +1 -1
- package/dist/engine/module-manifest.js +136 -1
- package/dist/engine/module-manifest.js.map +1 -1
- package/dist/engine/register-engine.d.ts.map +1 -1
- package/dist/engine/register-engine.js +25 -1
- package/dist/engine/register-engine.js.map +1 -1
- package/dist/flows/gate-evaluator.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/operator/operator-profile.d.ts.map +1 -1
- package/dist/operator/operator-profile.js +11 -5
- package/dist/operator/operator-profile.js.map +1 -1
- package/dist/operator/operator-signals.d.ts.map +1 -1
- package/dist/operator/operator-signals.js.map +1 -1
- package/dist/planning/evidence-collector.js.map +1 -1
- package/dist/planning/gap-passes.d.ts.map +1 -1
- package/dist/planning/gap-passes.js +23 -6
- package/dist/planning/gap-passes.js.map +1 -1
- package/dist/planning/gap-patterns.d.ts.map +1 -1
- package/dist/planning/gap-patterns.js +57 -11
- package/dist/planning/gap-patterns.js.map +1 -1
- package/dist/planning/github-projection.d.ts.map +1 -1
- package/dist/planning/github-projection.js +39 -20
- package/dist/planning/github-projection.js.map +1 -1
- package/dist/planning/impact-analyzer.d.ts.map +1 -1
- package/dist/planning/impact-analyzer.js +20 -18
- package/dist/planning/impact-analyzer.js.map +1 -1
- package/dist/planning/plan-lifecycle.d.ts.map +1 -1
- package/dist/planning/plan-lifecycle.js +22 -9
- package/dist/planning/plan-lifecycle.js.map +1 -1
- package/dist/planning/planner.d.ts.map +1 -1
- package/dist/planning/planner.js +60 -17
- package/dist/planning/planner.js.map +1 -1
- package/dist/planning/rationalization-detector.d.ts.map +1 -1
- package/dist/planning/rationalization-detector.js.map +1 -1
- package/dist/planning/reconciliation-engine.d.ts.map +1 -1
- package/dist/planning/reconciliation-engine.js.map +1 -1
- package/dist/planning/task-complexity-assessor.d.ts +42 -0
- package/dist/planning/task-complexity-assessor.d.ts.map +1 -0
- package/dist/planning/task-complexity-assessor.js +132 -0
- package/dist/planning/task-complexity-assessor.js.map +1 -0
- package/dist/planning/task-verifier.d.ts.map +1 -1
- package/dist/planning/task-verifier.js +14 -6
- package/dist/planning/task-verifier.js.map +1 -1
- package/dist/runtime/admin-ops.d.ts.map +1 -1
- package/dist/runtime/admin-ops.js +18 -0
- package/dist/runtime/admin-ops.js.map +1 -1
- package/dist/runtime/admin-setup-ops.d.ts.map +1 -1
- package/dist/runtime/admin-setup-ops.js +2 -1
- package/dist/runtime/admin-setup-ops.js.map +1 -1
- package/dist/runtime/branching-ops.d.ts +12 -0
- package/dist/runtime/branching-ops.d.ts.map +1 -0
- package/dist/runtime/branching-ops.js +100 -0
- package/dist/runtime/branching-ops.js.map +1 -0
- package/dist/runtime/context-health.d.ts.map +1 -1
- package/dist/runtime/context-health.js.map +1 -1
- package/dist/runtime/facades/branching-facade.d.ts +7 -0
- package/dist/runtime/facades/branching-facade.d.ts.map +1 -0
- package/dist/runtime/facades/branching-facade.js +8 -0
- package/dist/runtime/facades/branching-facade.js.map +1 -0
- package/dist/runtime/facades/chat-service-ops.d.ts.map +1 -1
- package/dist/runtime/facades/chat-service-ops.js +3 -1
- package/dist/runtime/facades/chat-service-ops.js.map +1 -1
- package/dist/runtime/facades/chat-transport-ops.d.ts.map +1 -1
- package/dist/runtime/facades/chat-transport-ops.js.map +1 -1
- package/dist/runtime/facades/index.d.ts.map +1 -1
- package/dist/runtime/facades/index.js +42 -0
- package/dist/runtime/facades/index.js.map +1 -1
- package/dist/runtime/facades/intake-facade.d.ts +9 -0
- package/dist/runtime/facades/intake-facade.d.ts.map +1 -0
- package/dist/runtime/facades/intake-facade.js +11 -0
- package/dist/runtime/facades/intake-facade.js.map +1 -0
- package/dist/runtime/facades/links-facade.d.ts +9 -0
- package/dist/runtime/facades/links-facade.d.ts.map +1 -0
- package/dist/runtime/facades/links-facade.js +10 -0
- package/dist/runtime/facades/links-facade.js.map +1 -0
- package/dist/runtime/facades/operator-facade.d.ts.map +1 -1
- package/dist/runtime/facades/operator-facade.js.map +1 -1
- package/dist/runtime/facades/plan-facade.d.ts.map +1 -1
- package/dist/runtime/facades/plan-facade.js +4 -1
- package/dist/runtime/facades/plan-facade.js.map +1 -1
- package/dist/runtime/facades/tier-facade.d.ts +7 -0
- package/dist/runtime/facades/tier-facade.d.ts.map +1 -0
- package/dist/runtime/facades/tier-facade.js +8 -0
- package/dist/runtime/facades/tier-facade.js.map +1 -0
- package/dist/runtime/facades/vault-facade.d.ts +9 -1
- package/dist/runtime/facades/vault-facade.d.ts.map +1 -1
- package/dist/runtime/facades/vault-facade.js +44 -187
- package/dist/runtime/facades/vault-facade.js.map +1 -1
- package/dist/runtime/github-integration.d.ts.map +1 -1
- package/dist/runtime/github-integration.js +11 -4
- package/dist/runtime/github-integration.js.map +1 -1
- package/dist/runtime/orchestrate-ops.d.ts.map +1 -1
- package/dist/runtime/orchestrate-ops.js +75 -42
- package/dist/runtime/orchestrate-ops.js.map +1 -1
- package/dist/runtime/planning-extra-ops.d.ts.map +1 -1
- package/dist/runtime/planning-extra-ops.js.map +1 -1
- package/dist/runtime/runtime.d.ts.map +1 -1
- package/dist/runtime/runtime.js +3 -1
- package/dist/runtime/runtime.js.map +1 -1
- package/dist/runtime/session-briefing.d.ts.map +1 -1
- package/dist/runtime/session-briefing.js +5 -1
- package/dist/runtime/session-briefing.js.map +1 -1
- package/dist/runtime/tier-ops.d.ts +13 -0
- package/dist/runtime/tier-ops.d.ts.map +1 -0
- package/dist/runtime/tier-ops.js +110 -0
- package/dist/runtime/tier-ops.js.map +1 -0
- package/dist/skills/sync-skills.d.ts.map +1 -1
- package/dist/skills/sync-skills.js +1 -1
- package/dist/skills/sync-skills.js.map +1 -1
- package/dist/vault/linking.d.ts.map +1 -1
- package/dist/vault/linking.js +41 -5
- package/dist/vault/linking.js.map +1 -1
- package/dist/vault/vault-entries.d.ts.map +1 -1
- package/dist/vault/vault-entries.js +68 -26
- package/dist/vault/vault-entries.js.map +1 -1
- package/dist/vault/vault-maintenance.d.ts.map +1 -1
- package/dist/vault/vault-maintenance.js +6 -2
- package/dist/vault/vault-maintenance.js.map +1 -1
- package/dist/vault/vault-markdown-sync.d.ts.map +1 -1
- package/dist/vault/vault-markdown-sync.js.map +1 -1
- package/dist/vault/vault-memories.d.ts.map +1 -1
- package/dist/vault/vault-memories.js +3 -1
- package/dist/vault/vault-memories.js.map +1 -1
- package/dist/vault/vault-schema.js +36 -10
- package/dist/vault/vault-schema.js.map +1 -1
- package/dist/vault/vault.d.ts.map +1 -1
- package/dist/vault/vault.js +5 -1
- package/dist/vault/vault.js.map +1 -1
- package/package.json +7 -7
- package/src/agency/agency-manager.test.ts +60 -40
- package/src/agency/default-rules.test.ts +17 -9
- package/src/capabilities/registry.test.ts +2 -12
- package/src/chat/agent-loop.test.ts +33 -43
- package/src/chat/mcp-bridge.test.ts +7 -2
- package/src/claudemd/inject.test.ts +2 -12
- package/src/context/context-engine.test.ts +96 -51
- package/src/control/intent-router.test.ts +3 -3
- package/src/curator/classifier.test.ts +14 -8
- package/src/curator/contradiction-detector.test.ts +30 -5
- package/src/curator/curator.ts +278 -56
- package/src/curator/duplicate-detector.test.ts +77 -15
- package/src/curator/quality-gate.test.ts +71 -31
- package/src/curator/tag-manager.test.ts +12 -4
- package/src/domain-packs/knowledge-installer.test.ts +2 -10
- package/src/domain-packs/token-resolver.test.ts +1 -3
- package/src/domain-packs/types.test.ts +16 -2
- package/src/enforcement/registry.test.ts +2 -8
- package/src/engine/bin/soleri-engine.ts +3 -1
- package/src/engine/module-manifest.test.ts +48 -4
- package/src/engine/module-manifest.ts +138 -1
- package/src/engine/register-engine.test.ts +6 -1
- package/src/engine/register-engine.ts +26 -3
- package/src/errors/classify.test.ts +6 -2
- package/src/errors/retry.test.ts +1 -4
- package/src/facades/facade-factory.test.ts +110 -64
- package/src/flows/epilogue.test.ts +16 -10
- package/src/flows/gate-evaluator.test.ts +12 -6
- package/src/flows/gate-evaluator.ts +1 -3
- package/src/governance/governance.test.ts +137 -21
- package/src/health/health-registry.test.ts +8 -1
- package/src/index.ts +8 -0
- package/src/intake/content-classifier.test.ts +121 -51
- package/src/intake/dedup-gate.test.ts +38 -22
- package/src/intake/intake-pipeline.test.ts +5 -3
- package/src/intake/text-ingester.test.ts +26 -20
- package/src/llm/key-pool.test.ts +1 -3
- package/src/llm/llm-client.test.ts +1 -4
- package/src/llm/oauth-discovery.test.ts +16 -16
- package/src/llm/utils.test.ts +62 -18
- package/src/logging/logger.test.ts +4 -1
- package/src/loop/loop-manager.test.ts +2 -6
- package/src/migrations/migration-runner.edge-cases.test.ts +2 -7
- package/src/operator/operator-profile-extended.test.ts +15 -5
- package/src/operator/operator-profile.test.ts +26 -8
- package/src/operator/operator-profile.ts +38 -22
- package/src/operator/operator-signals-extended.test.ts +35 -23
- package/src/operator/operator-signals.test.ts +6 -10
- package/src/operator/operator-signals.ts +2 -1
- package/src/operator/prompts/hook-precompact-operator-dispatch.md +10 -6
- package/src/operator/prompts/subagent-soft-signal-extractor.md +5 -0
- package/src/operator/prompts/subagent-synthesis-cognition.md +19 -10
- package/src/operator/prompts/subagent-synthesis-communication.md +13 -7
- package/src/operator/prompts/subagent-synthesis-technical.md +19 -9
- package/src/operator/prompts/subagent-synthesis-trust.md +27 -21
- package/src/persona/defaults.test.ts +1 -5
- package/src/planning/evidence-collector.test.ts +147 -38
- package/src/planning/evidence-collector.ts +1 -4
- package/src/planning/gap-analysis-alternatives.test.ts +41 -11
- package/src/planning/gap-passes.test.ts +215 -33
- package/src/planning/gap-passes.ts +115 -46
- package/src/planning/gap-patterns.test.ts +87 -13
- package/src/planning/gap-patterns.ts +114 -31
- package/src/planning/github-projection.test.ts +6 -1
- package/src/planning/github-projection.ts +41 -20
- package/src/planning/impact-analyzer.test.ts +10 -23
- package/src/planning/impact-analyzer.ts +33 -46
- package/src/planning/plan-lifecycle.test.ts +103 -36
- package/src/planning/plan-lifecycle.ts +49 -18
- package/src/planning/planner.test.ts +12 -2
- package/src/planning/planner.ts +198 -58
- package/src/planning/rationalization-detector.test.ts +5 -20
- package/src/planning/rationalization-detector.ts +14 -16
- package/src/planning/reconciliation-engine.test.ts +20 -3
- package/src/planning/reconciliation-engine.ts +1 -2
- package/src/planning/task-complexity-assessor.test.ts +298 -0
- package/src/planning/task-complexity-assessor.ts +183 -0
- package/src/planning/task-verifier.test.ts +59 -27
- package/src/planning/task-verifier.ts +15 -9
- package/src/playbooks/playbook-executor.test.ts +1 -3
- package/src/plugins/plugin-loader.test.ts +19 -14
- package/src/plugins/plugin-registry.test.ts +45 -33
- package/src/project/project-registry.test.ts +23 -12
- package/src/prompts/template-manager.test.ts +4 -1
- package/src/queue/job-queue.test.ts +10 -14
- package/src/runtime/admin-extra-ops.test.ts +5 -19
- package/src/runtime/admin-ops.test.ts +22 -1
- package/src/runtime/admin-ops.ts +19 -0
- package/src/runtime/admin-setup-ops.test.ts +3 -4
- package/src/runtime/admin-setup-ops.ts +9 -2
- package/src/runtime/archive-ops.test.ts +4 -1
- package/src/runtime/branching-ops.test.ts +144 -0
- package/src/runtime/branching-ops.ts +107 -0
- package/src/runtime/capture-ops.test.ts +7 -21
- package/src/runtime/chain-ops.test.ts +16 -6
- package/src/runtime/claude-md-helpers.test.ts +1 -3
- package/src/runtime/context-health.test.ts +1 -3
- package/src/runtime/context-health.ts +1 -3
- package/src/runtime/curator-extra-ops.test.ts +3 -1
- package/src/runtime/domain-ops.test.ts +46 -36
- package/src/runtime/facades/admin-facade.test.ts +1 -4
- package/src/runtime/facades/archive-facade.test.ts +21 -7
- package/src/runtime/facades/brain-facade.test.ts +176 -72
- package/src/runtime/facades/branching-facade.test.ts +43 -0
- package/src/runtime/facades/branching-facade.ts +11 -0
- package/src/runtime/facades/chat-facade.test.ts +81 -28
- package/src/runtime/facades/chat-service-ops.test.ts +178 -73
- package/src/runtime/facades/chat-service-ops.ts +3 -1
- package/src/runtime/facades/chat-session-ops.test.ts +25 -10
- package/src/runtime/facades/chat-transport-ops.test.ts +101 -34
- package/src/runtime/facades/chat-transport-ops.ts +0 -1
- package/src/runtime/facades/context-facade.test.ts +19 -4
- package/src/runtime/facades/control-facade.test.ts +3 -3
- package/src/runtime/facades/index.ts +42 -0
- package/src/runtime/facades/intake-facade.test.ts +215 -0
- package/src/runtime/facades/intake-facade.ts +14 -0
- package/src/runtime/facades/links-facade.test.ts +203 -0
- package/src/runtime/facades/links-facade.ts +13 -0
- package/src/runtime/facades/loop-facade.test.ts +22 -5
- package/src/runtime/facades/memory-facade.test.ts +19 -5
- package/src/runtime/facades/operator-facade.test.ts +17 -4
- package/src/runtime/facades/operator-facade.ts +11 -3
- package/src/runtime/facades/orchestrate-facade.test.ts +7 -1
- package/src/runtime/facades/plan-facade.test.ts +29 -12
- package/src/runtime/facades/plan-facade.ts +7 -2
- package/src/runtime/facades/tier-facade.test.ts +47 -0
- package/src/runtime/facades/tier-facade.ts +11 -0
- package/src/runtime/facades/vault-facade.test.ts +174 -242
- package/src/runtime/facades/vault-facade.ts +55 -199
- package/src/runtime/github-integration.ts +11 -8
- package/src/runtime/grading-ops.test.ts +39 -8
- package/src/runtime/intake-ops.test.ts +69 -16
- package/src/runtime/loop-ops.test.ts +16 -6
- package/src/runtime/memory-cross-project-ops.test.ts +25 -14
- package/src/runtime/orchestrate-ops.test.ts +204 -0
- package/src/runtime/orchestrate-ops.ts +103 -65
- package/src/runtime/pack-ops.test.ts +23 -6
- package/src/runtime/planning-extra-ops.test.ts +17 -7
- package/src/runtime/planning-extra-ops.ts +3 -1
- package/src/runtime/playbook-ops.test.ts +26 -3
- package/src/runtime/plugin-ops.test.ts +83 -25
- package/src/runtime/project-ops.test.ts +26 -6
- package/src/runtime/runtime.ts +3 -1
- package/src/runtime/session-briefing.test.ts +183 -54
- package/src/runtime/session-briefing.ts +8 -2
- package/src/runtime/sync-ops.test.ts +3 -12
- package/src/runtime/telemetry-ops.test.ts +31 -6
- package/src/runtime/tier-ops.test.ts +159 -0
- package/src/runtime/tier-ops.ts +119 -0
- package/src/runtime/vault-extra-ops.test.ts +32 -8
- package/src/runtime/vault-sharing-ops.test.ts +1 -4
- package/src/skills/sync-skills.ts +2 -12
- package/src/transport/ws-server.test.ts +7 -4
- package/src/vault/__tests__/vault-characterization.test.ts +492 -81
- package/src/vault/linking.test.ts +50 -17
- package/src/vault/linking.ts +48 -7
- package/src/vault/obsidian-sync.test.ts +6 -3
- package/src/vault/scope-detector.test.ts +1 -3
- package/src/vault/vault-branching.test.ts +9 -7
- package/src/vault/vault-entries.ts +209 -65
- package/src/vault/vault-maintenance.ts +7 -12
- package/src/vault/vault-manager.test.ts +10 -10
- package/src/vault/vault-markdown-sync.ts +4 -1
- package/src/vault/vault-memories.ts +7 -7
- package/src/vault/vault-scaling.test.ts +5 -5
- package/src/vault/vault-schema.ts +72 -15
- package/src/vault/vault.ts +55 -9
- package/src/brain/strength-scorer.ts +0 -404
- package/src/engine/index.ts +0 -21
- package/src/persona/index.ts +0 -9
- package/src/vault/vault-interfaces.ts +0 -56
|
@@ -87,7 +87,9 @@ function createCoreTables(provider: PersistenceProvider): void {
|
|
|
87
87
|
);`);
|
|
88
88
|
|
|
89
89
|
// Add memory columns if missing
|
|
90
|
-
const memCols = provider
|
|
90
|
+
const memCols = provider
|
|
91
|
+
.all<{ name: string }>('PRAGMA table_info(memories)')
|
|
92
|
+
.map((r: { name: string }) => r.name);
|
|
91
93
|
if (!memCols.includes('intent')) {
|
|
92
94
|
provider.execSql(`
|
|
93
95
|
ALTER TABLE memories ADD COLUMN intent TEXT;
|
|
@@ -134,8 +136,12 @@ function migrateBrainSchema(provider: PersistenceProvider): void {
|
|
|
134
136
|
const hasSource = columns.some((c: { name: string }) => c.name === 'source');
|
|
135
137
|
if (!hasSource && columns.length > 0) {
|
|
136
138
|
provider.transaction(() => {
|
|
137
|
-
provider.run(
|
|
138
|
-
|
|
139
|
+
provider.run(
|
|
140
|
+
`CREATE TABLE brain_feedback_new (id INTEGER PRIMARY KEY AUTOINCREMENT, query TEXT NOT NULL, entry_id TEXT NOT NULL, action TEXT NOT NULL CHECK(action IN ('accepted', 'dismissed', 'modified', 'failed')), source TEXT NOT NULL DEFAULT 'search', confidence REAL NOT NULL DEFAULT 0.6, duration INTEGER, context TEXT NOT NULL DEFAULT '{}', reason TEXT, created_at INTEGER NOT NULL DEFAULT (unixepoch()))`,
|
|
141
|
+
);
|
|
142
|
+
provider.run(
|
|
143
|
+
`INSERT INTO brain_feedback_new (id, query, entry_id, action, created_at) SELECT id, query, entry_id, action, created_at FROM brain_feedback`,
|
|
144
|
+
);
|
|
139
145
|
provider.run('DROP TABLE brain_feedback');
|
|
140
146
|
provider.run('ALTER TABLE brain_feedback_new RENAME TO brain_feedback');
|
|
141
147
|
provider.run('CREATE INDEX IF NOT EXISTS idx_brain_feedback_query ON brain_feedback(query)');
|
|
@@ -143,39 +149,90 @@ function migrateBrainSchema(provider: PersistenceProvider): void {
|
|
|
143
149
|
}
|
|
144
150
|
try {
|
|
145
151
|
const sessionCols = provider.all<{ name: string }>('PRAGMA table_info(brain_sessions)');
|
|
146
|
-
if (
|
|
152
|
+
if (
|
|
153
|
+
sessionCols.length > 0 &&
|
|
154
|
+
!sessionCols.some((c: { name: string }) => c.name === 'extracted_at')
|
|
155
|
+
) {
|
|
147
156
|
provider.run('ALTER TABLE brain_sessions ADD COLUMN extracted_at TEXT');
|
|
148
157
|
}
|
|
149
|
-
} catch {
|
|
158
|
+
} catch {
|
|
159
|
+
/* brain_sessions doesn't exist yet */
|
|
160
|
+
}
|
|
150
161
|
}
|
|
151
162
|
|
|
152
163
|
function migrateTemporalSchema(provider: PersistenceProvider): void {
|
|
153
|
-
try {
|
|
154
|
-
|
|
164
|
+
try {
|
|
165
|
+
provider.run('ALTER TABLE entries ADD COLUMN valid_from INTEGER');
|
|
166
|
+
} catch {
|
|
167
|
+
/* exists */
|
|
168
|
+
}
|
|
169
|
+
try {
|
|
170
|
+
provider.run('ALTER TABLE entries ADD COLUMN valid_until INTEGER');
|
|
171
|
+
} catch {
|
|
172
|
+
/* exists */
|
|
173
|
+
}
|
|
155
174
|
}
|
|
156
175
|
|
|
157
176
|
function migrateOriginColumn(provider: PersistenceProvider): void {
|
|
158
|
-
try {
|
|
177
|
+
try {
|
|
178
|
+
provider.run(
|
|
179
|
+
"ALTER TABLE entries ADD COLUMN origin TEXT NOT NULL DEFAULT 'user' CHECK(origin IN ('agent', 'pack', 'user'))",
|
|
180
|
+
);
|
|
181
|
+
} catch {
|
|
182
|
+
/* exists */
|
|
183
|
+
}
|
|
159
184
|
provider.execSql('CREATE INDEX IF NOT EXISTS idx_entries_origin ON entries(origin)');
|
|
160
185
|
}
|
|
161
186
|
|
|
162
187
|
function migrateContentHash(provider: PersistenceProvider): void {
|
|
163
|
-
try {
|
|
164
|
-
|
|
165
|
-
|
|
188
|
+
try {
|
|
189
|
+
provider.run('ALTER TABLE entries ADD COLUMN content_hash TEXT');
|
|
190
|
+
} catch {
|
|
191
|
+
/* exists */
|
|
192
|
+
}
|
|
193
|
+
provider.execSql(
|
|
194
|
+
'CREATE INDEX IF NOT EXISTS idx_entries_content_hash ON entries(content_hash) WHERE content_hash IS NOT NULL',
|
|
195
|
+
);
|
|
196
|
+
const unhashed = provider.all<{
|
|
197
|
+
id: string;
|
|
198
|
+
type: string;
|
|
199
|
+
domain: string;
|
|
200
|
+
title: string;
|
|
201
|
+
description: string;
|
|
202
|
+
tags: string;
|
|
203
|
+
example: string | null;
|
|
204
|
+
counter_example: string | null;
|
|
205
|
+
}>(
|
|
166
206
|
'SELECT id, type, domain, title, description, tags, example, counter_example FROM entries WHERE content_hash IS NULL',
|
|
167
207
|
);
|
|
168
208
|
if (unhashed.length > 0) {
|
|
169
209
|
provider.transaction(() => {
|
|
170
210
|
for (const row of unhashed) {
|
|
171
|
-
const hash = computeContentHash({
|
|
172
|
-
|
|
211
|
+
const hash = computeContentHash({
|
|
212
|
+
type: row.type,
|
|
213
|
+
domain: row.domain,
|
|
214
|
+
title: row.title,
|
|
215
|
+
description: row.description,
|
|
216
|
+
tags: JSON.parse(row.tags),
|
|
217
|
+
example: row.example ?? undefined,
|
|
218
|
+
counterExample: row.counter_example ?? undefined,
|
|
219
|
+
});
|
|
220
|
+
provider.run('UPDATE entries SET content_hash = @hash WHERE id = @id', {
|
|
221
|
+
hash,
|
|
222
|
+
id: row.id,
|
|
223
|
+
});
|
|
173
224
|
}
|
|
174
225
|
});
|
|
175
226
|
}
|
|
176
227
|
}
|
|
177
228
|
|
|
178
229
|
function migrateTierColumn(provider: PersistenceProvider): void {
|
|
179
|
-
try {
|
|
180
|
-
|
|
230
|
+
try {
|
|
231
|
+
provider.run("ALTER TABLE entries ADD COLUMN tier TEXT DEFAULT 'agent'");
|
|
232
|
+
} catch {
|
|
233
|
+
/* exists */
|
|
234
|
+
}
|
|
235
|
+
provider.execSql(
|
|
236
|
+
'CREATE INDEX IF NOT EXISTS idx_entries_tier ON entries(tier) WHERE tier IS NOT NULL',
|
|
237
|
+
);
|
|
181
238
|
}
|
package/src/vault/vault.ts
CHANGED
|
@@ -80,7 +80,11 @@ export class Vault {
|
|
|
80
80
|
static readonly FORMAT_VERSION = VAULT_FORMAT_VERSION;
|
|
81
81
|
|
|
82
82
|
private getAutoLinkConfig(): AutoLinkConfig {
|
|
83
|
-
return {
|
|
83
|
+
return {
|
|
84
|
+
linkManager: this.linkManager,
|
|
85
|
+
enabled: this.autoLinkEnabled,
|
|
86
|
+
maxLinks: this.autoLinkMaxLinks,
|
|
87
|
+
};
|
|
84
88
|
}
|
|
85
89
|
|
|
86
90
|
setLinkManager(mgr: LinkManager, opts?: { enabled?: boolean; maxLinks?: number }): void {
|
|
@@ -105,16 +109,37 @@ export class Vault {
|
|
|
105
109
|
installPack(entryList: IntelligenceEntry[]): { installed: number; skipped: number } {
|
|
106
110
|
return entries.installPack(this.provider, entryList, this.getAutoLinkConfig());
|
|
107
111
|
}
|
|
108
|
-
seedDedup(
|
|
112
|
+
seedDedup(
|
|
113
|
+
entryList: IntelligenceEntry[],
|
|
114
|
+
): Array<{ id: string; action: 'inserted' | 'duplicate'; existingId?: string }> {
|
|
109
115
|
return entries.seedDedup(this.provider, entryList, this.getAutoLinkConfig());
|
|
110
116
|
}
|
|
111
|
-
search(
|
|
117
|
+
search(
|
|
118
|
+
query: string,
|
|
119
|
+
options?: {
|
|
120
|
+
domain?: string;
|
|
121
|
+
type?: string;
|
|
122
|
+
severity?: string;
|
|
123
|
+
origin?: 'agent' | 'pack' | 'user';
|
|
124
|
+
limit?: number;
|
|
125
|
+
includeExpired?: boolean;
|
|
126
|
+
},
|
|
127
|
+
): SearchResult[] {
|
|
112
128
|
return entries.search(this.provider, query, options);
|
|
113
129
|
}
|
|
114
130
|
get(id: string): IntelligenceEntry | null {
|
|
115
131
|
return entries.get(this.provider, id);
|
|
116
132
|
}
|
|
117
|
-
list(options?: {
|
|
133
|
+
list(options?: {
|
|
134
|
+
domain?: string;
|
|
135
|
+
type?: string;
|
|
136
|
+
severity?: string;
|
|
137
|
+
origin?: 'agent' | 'pack' | 'user';
|
|
138
|
+
tags?: string[];
|
|
139
|
+
limit?: number;
|
|
140
|
+
offset?: number;
|
|
141
|
+
includeExpired?: boolean;
|
|
142
|
+
}): IntelligenceEntry[] {
|
|
118
143
|
return entries.list(this.provider, options);
|
|
119
144
|
}
|
|
120
145
|
stats(): VaultStats {
|
|
@@ -162,7 +187,12 @@ export class Vault {
|
|
|
162
187
|
exportAll(): { entries: IntelligenceEntry[]; exportedAt: number; count: number } {
|
|
163
188
|
return maintenance.exportAll(this.provider);
|
|
164
189
|
}
|
|
165
|
-
getAgeReport(): {
|
|
190
|
+
getAgeReport(): {
|
|
191
|
+
total: number;
|
|
192
|
+
buckets: Array<{ label: string; count: number; minDays: number; maxDays: number }>;
|
|
193
|
+
oldestTimestamp: number | null;
|
|
194
|
+
newestTimestamp: number | null;
|
|
195
|
+
} {
|
|
166
196
|
return maintenance.getAgeReport(this.provider);
|
|
167
197
|
}
|
|
168
198
|
archive(options: { olderThanDays: number; reason?: string }): { archived: number } {
|
|
@@ -201,19 +231,35 @@ export class Vault {
|
|
|
201
231
|
deleteMemory(id: string): boolean {
|
|
202
232
|
return memories.deleteMemory(this.provider, id);
|
|
203
233
|
}
|
|
204
|
-
searchMemories(
|
|
234
|
+
searchMemories(
|
|
235
|
+
query: string,
|
|
236
|
+
options?: { type?: string; projectPath?: string; intent?: string; limit?: number },
|
|
237
|
+
): Memory[] {
|
|
205
238
|
return memories.searchMemories(this.provider, query, options);
|
|
206
239
|
}
|
|
207
|
-
listMemories(options?: {
|
|
240
|
+
listMemories(options?: {
|
|
241
|
+
type?: string;
|
|
242
|
+
projectPath?: string;
|
|
243
|
+
limit?: number;
|
|
244
|
+
offset?: number;
|
|
245
|
+
}): Memory[] {
|
|
208
246
|
return memories.listMemories(this.provider, options);
|
|
209
247
|
}
|
|
210
248
|
memoryStats(): MemoryStats {
|
|
211
249
|
return memories.memoryStats(this.provider);
|
|
212
250
|
}
|
|
213
|
-
memoryStatsDetailed(options?: {
|
|
251
|
+
memoryStatsDetailed(options?: {
|
|
252
|
+
projectPath?: string;
|
|
253
|
+
fromDate?: number;
|
|
254
|
+
toDate?: number;
|
|
255
|
+
}): MemoryStats & { oldest: number | null; newest: number | null; archivedCount: number } {
|
|
214
256
|
return memories.memoryStatsDetailed(this.provider, options);
|
|
215
257
|
}
|
|
216
|
-
exportMemories(options?: {
|
|
258
|
+
exportMemories(options?: {
|
|
259
|
+
projectPath?: string;
|
|
260
|
+
type?: string;
|
|
261
|
+
includeArchived?: boolean;
|
|
262
|
+
}): Memory[] {
|
|
217
263
|
return memories.exportMemories(this.provider, options);
|
|
218
264
|
}
|
|
219
265
|
importMemories(memoryList: Memory[]): { imported: number; skipped: number } {
|
|
@@ -1,404 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Strength Scorer — computes pattern strength scores from brain feedback data.
|
|
3
|
-
*
|
|
4
|
-
* Extracted from intelligence.ts (Phase 1, Wave 1A).
|
|
5
|
-
* Responsible for: computeStrengths, getStrengths, recommend, buildGlobalRegistry, buildDomainProfiles.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import type { Vault } from '../vault/vault.js';
|
|
9
|
-
import type { PersistenceProvider } from '../persistence/types.js';
|
|
10
|
-
import type { PatternStrength, StrengthsQuery, GlobalPattern, DomainProfile } from './types.js';
|
|
11
|
-
|
|
12
|
-
// ─── Constants ──────────────────────────────────────────────────────
|
|
13
|
-
|
|
14
|
-
const USAGE_MAX = 10;
|
|
15
|
-
const SPREAD_MAX = 5;
|
|
16
|
-
const RECENCY_DECAY_DAYS = 30;
|
|
17
|
-
|
|
18
|
-
// ─── Row Types ──────────────────────────────────────────────────────
|
|
19
|
-
|
|
20
|
-
interface FeedbackRow {
|
|
21
|
-
entry_id: string;
|
|
22
|
-
total: number;
|
|
23
|
-
accepted: number;
|
|
24
|
-
dismissed: number;
|
|
25
|
-
modified: number;
|
|
26
|
-
failed: number;
|
|
27
|
-
last_used: string;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
interface StrengthRow {
|
|
31
|
-
pattern: string;
|
|
32
|
-
domain: string;
|
|
33
|
-
strength: number;
|
|
34
|
-
usage_score: number;
|
|
35
|
-
spread_score: number;
|
|
36
|
-
success_score: number;
|
|
37
|
-
recency_score: number;
|
|
38
|
-
usage_count: number;
|
|
39
|
-
unique_contexts: number;
|
|
40
|
-
success_rate: number;
|
|
41
|
-
last_used: string;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
// ─── Helpers ────────────────────────────────────────────────────────
|
|
45
|
-
|
|
46
|
-
function computeUsageScore(total: number): number {
|
|
47
|
-
return Math.min(25, (total / USAGE_MAX) * 25);
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
function computeSpreadScore(uniqueDomainCount: number): number {
|
|
51
|
-
const capped = Math.min(uniqueDomainCount, 5);
|
|
52
|
-
return Math.min(25, (capped / SPREAD_MAX) * 25);
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
function computeSuccessRate(row: FeedbackRow): number {
|
|
56
|
-
const relevantTotal = row.total - row.failed;
|
|
57
|
-
if (relevantTotal <= 0) return 0;
|
|
58
|
-
return (row.accepted + row.modified * 0.5) / relevantTotal;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
function computeRecencyScore(lastUsed: string, now: number): number {
|
|
62
|
-
const lastUsedMs = new Date(lastUsed).getTime();
|
|
63
|
-
const daysSince = (now - lastUsedMs) / (1000 * 60 * 60 * 24);
|
|
64
|
-
return Math.max(0, 25 * (1 - daysSince / RECENCY_DECAY_DAYS));
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
function rowToStrength(r: StrengthRow): PatternStrength {
|
|
68
|
-
return {
|
|
69
|
-
pattern: r.pattern,
|
|
70
|
-
domain: r.domain,
|
|
71
|
-
strength: r.strength,
|
|
72
|
-
usageScore: r.usage_score,
|
|
73
|
-
spreadScore: r.spread_score,
|
|
74
|
-
successScore: r.success_score,
|
|
75
|
-
recencyScore: r.recency_score,
|
|
76
|
-
usageCount: r.usage_count,
|
|
77
|
-
uniqueContexts: r.unique_contexts,
|
|
78
|
-
successRate: r.success_rate,
|
|
79
|
-
lastUsed: r.last_used,
|
|
80
|
-
};
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
// ─── Class ──────────────────────────────────────────────────────────
|
|
84
|
-
|
|
85
|
-
export class StrengthScorer {
|
|
86
|
-
private vault: Vault;
|
|
87
|
-
private provider: PersistenceProvider;
|
|
88
|
-
|
|
89
|
-
constructor(vault: Vault) {
|
|
90
|
-
this.vault = vault;
|
|
91
|
-
this.provider = vault.getProvider();
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
computeStrengths(): PatternStrength[] {
|
|
95
|
-
const feedbackRows = this.provider.all<FeedbackRow>(
|
|
96
|
-
`SELECT entry_id,
|
|
97
|
-
COUNT(*) as total,
|
|
98
|
-
SUM(CASE WHEN action = 'accepted' THEN 1 ELSE 0 END) as accepted,
|
|
99
|
-
SUM(CASE WHEN action = 'dismissed' THEN 1 ELSE 0 END) as dismissed,
|
|
100
|
-
SUM(CASE WHEN action = 'modified' THEN 1 ELSE 0 END) as modified,
|
|
101
|
-
SUM(CASE WHEN action = 'failed' THEN 1 ELSE 0 END) as failed,
|
|
102
|
-
MAX(created_at) as last_used
|
|
103
|
-
FROM brain_feedback
|
|
104
|
-
GROUP BY entry_id`,
|
|
105
|
-
);
|
|
106
|
-
|
|
107
|
-
const sessionRows = this.provider.all<{ domain: string }>(
|
|
108
|
-
'SELECT DISTINCT domain FROM brain_sessions WHERE domain IS NOT NULL',
|
|
109
|
-
);
|
|
110
|
-
const uniqueDomainCount = new Set(sessionRows.map((r) => r.domain)).size;
|
|
111
|
-
|
|
112
|
-
const now = Date.now();
|
|
113
|
-
const strengths: PatternStrength[] = [];
|
|
114
|
-
|
|
115
|
-
for (const row of feedbackRows) {
|
|
116
|
-
const ps = this.scoreFromFeedback(row, uniqueDomainCount, now);
|
|
117
|
-
strengths.push(ps);
|
|
118
|
-
this.persistStrength(ps);
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
return strengths;
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
getStrengths(query?: StrengthsQuery): PatternStrength[] {
|
|
125
|
-
const conditions: string[] = [];
|
|
126
|
-
const values: unknown[] = [];
|
|
127
|
-
|
|
128
|
-
if (query?.domain) {
|
|
129
|
-
conditions.push('domain = ?');
|
|
130
|
-
values.push(query.domain);
|
|
131
|
-
}
|
|
132
|
-
if (query?.minStrength !== undefined && query.minStrength !== null) {
|
|
133
|
-
conditions.push('strength >= ?');
|
|
134
|
-
values.push(query.minStrength);
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
const where = conditions.length > 0 ? 'WHERE ' + conditions.join(' AND ') : '';
|
|
138
|
-
const limit = query?.limit ?? 50;
|
|
139
|
-
values.push(limit);
|
|
140
|
-
|
|
141
|
-
const rows = this.provider.all<StrengthRow>(
|
|
142
|
-
`SELECT * FROM brain_strengths ${where} ORDER BY strength DESC LIMIT ?`,
|
|
143
|
-
values,
|
|
144
|
-
);
|
|
145
|
-
|
|
146
|
-
return rows.map(rowToStrength);
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
recommend(context: {
|
|
150
|
-
domain?: string;
|
|
151
|
-
task?: string;
|
|
152
|
-
source?: string;
|
|
153
|
-
limit?: number;
|
|
154
|
-
}): PatternStrength[] {
|
|
155
|
-
const limit = context.limit ?? 5;
|
|
156
|
-
|
|
157
|
-
let strengths = this.getStrengths({
|
|
158
|
-
domain: context.domain,
|
|
159
|
-
minStrength: 20,
|
|
160
|
-
limit: limit * 3,
|
|
161
|
-
});
|
|
162
|
-
|
|
163
|
-
if (strengths.length < limit && context.domain) {
|
|
164
|
-
strengths = this.expandWithFallback(strengths, context.domain, limit);
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
if (context.task) {
|
|
168
|
-
this.boostByTaskContext(strengths, context.task);
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
if (context.source) {
|
|
172
|
-
this.boostBySource(strengths, context.source);
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
strengths.sort((a, b) => b.strength - a.strength);
|
|
176
|
-
return strengths.slice(0, limit);
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
buildGlobalRegistry(strengths: PatternStrength[]): number {
|
|
180
|
-
const patternMap = new Map<string, PatternStrength[]>();
|
|
181
|
-
for (const s of strengths) {
|
|
182
|
-
const list = patternMap.get(s.pattern) ?? [];
|
|
183
|
-
list.push(s);
|
|
184
|
-
patternMap.set(s.pattern, list);
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
this.provider.run('DELETE FROM brain_global_registry');
|
|
188
|
-
|
|
189
|
-
let count = 0;
|
|
190
|
-
for (const [pattern, entries] of patternMap) {
|
|
191
|
-
const domains = [...new Set(entries.map((e) => e.domain))];
|
|
192
|
-
const totalStrength = entries.reduce((sum, e) => sum + e.strength, 0);
|
|
193
|
-
const avgStrength = totalStrength / entries.length;
|
|
194
|
-
|
|
195
|
-
this.provider.run(
|
|
196
|
-
`INSERT INTO brain_global_registry
|
|
197
|
-
(pattern, domains, total_strength, avg_strength, domain_count, updated_at)
|
|
198
|
-
VALUES (?, ?, ?, ?, ?, datetime('now'))`,
|
|
199
|
-
[pattern, JSON.stringify(domains), totalStrength, avgStrength, domains.length],
|
|
200
|
-
);
|
|
201
|
-
count++;
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
return count;
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
buildDomainProfiles(strengths: PatternStrength[]): number {
|
|
208
|
-
const domainMap = new Map<string, PatternStrength[]>();
|
|
209
|
-
for (const s of strengths) {
|
|
210
|
-
const list = domainMap.get(s.domain) ?? [];
|
|
211
|
-
list.push(s);
|
|
212
|
-
domainMap.set(s.domain, list);
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
this.provider.run('DELETE FROM brain_domain_profiles');
|
|
216
|
-
|
|
217
|
-
let count = 0;
|
|
218
|
-
for (const [domain, entries] of domainMap) {
|
|
219
|
-
entries.sort((a, b) => b.strength - a.strength);
|
|
220
|
-
const topPatterns = entries.slice(0, 10).map((e) => ({
|
|
221
|
-
pattern: e.pattern,
|
|
222
|
-
strength: e.strength,
|
|
223
|
-
}));
|
|
224
|
-
|
|
225
|
-
const sessionCount = this.provider.get<{ c: number }>(
|
|
226
|
-
'SELECT COUNT(*) as c FROM brain_sessions WHERE domain = ?',
|
|
227
|
-
[domain],
|
|
228
|
-
)!.c;
|
|
229
|
-
|
|
230
|
-
const durationRow = this.provider.get<{ avg_min: number | null }>(
|
|
231
|
-
`SELECT AVG(
|
|
232
|
-
(julianday(ended_at) - julianday(started_at)) * 1440
|
|
233
|
-
) as avg_min
|
|
234
|
-
FROM brain_sessions
|
|
235
|
-
WHERE domain = ? AND ended_at IS NOT NULL`,
|
|
236
|
-
[domain],
|
|
237
|
-
)!;
|
|
238
|
-
|
|
239
|
-
const lastActivity = entries.reduce(
|
|
240
|
-
(latest, e) => (e.lastUsed > latest ? e.lastUsed : latest),
|
|
241
|
-
'',
|
|
242
|
-
);
|
|
243
|
-
|
|
244
|
-
this.provider.run(
|
|
245
|
-
`INSERT INTO brain_domain_profiles
|
|
246
|
-
(domain, top_patterns, session_count, avg_session_duration, last_activity, updated_at)
|
|
247
|
-
VALUES (?, ?, ?, ?, ?, datetime('now'))`,
|
|
248
|
-
[
|
|
249
|
-
domain,
|
|
250
|
-
JSON.stringify(topPatterns),
|
|
251
|
-
sessionCount,
|
|
252
|
-
durationRow.avg_min ?? 0,
|
|
253
|
-
lastActivity || new Date().toISOString(),
|
|
254
|
-
],
|
|
255
|
-
);
|
|
256
|
-
count++;
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
return count;
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
getGlobalPatterns(limit = 20): GlobalPattern[] {
|
|
263
|
-
const rows = this.provider.all<{
|
|
264
|
-
pattern: string;
|
|
265
|
-
domains: string;
|
|
266
|
-
total_strength: number;
|
|
267
|
-
avg_strength: number;
|
|
268
|
-
domain_count: number;
|
|
269
|
-
}>('SELECT * FROM brain_global_registry ORDER BY total_strength DESC LIMIT ?', [limit]);
|
|
270
|
-
|
|
271
|
-
return rows.map((r) => ({
|
|
272
|
-
pattern: r.pattern,
|
|
273
|
-
domains: JSON.parse(r.domains) as string[],
|
|
274
|
-
totalStrength: r.total_strength,
|
|
275
|
-
avgStrength: r.avg_strength,
|
|
276
|
-
domainCount: r.domain_count,
|
|
277
|
-
}));
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
getDomainProfile(domain: string): DomainProfile | null {
|
|
281
|
-
const row = this.provider.get<{
|
|
282
|
-
domain: string;
|
|
283
|
-
top_patterns: string;
|
|
284
|
-
session_count: number;
|
|
285
|
-
avg_session_duration: number;
|
|
286
|
-
last_activity: string;
|
|
287
|
-
}>('SELECT * FROM brain_domain_profiles WHERE domain = ?', [domain]);
|
|
288
|
-
|
|
289
|
-
if (!row) return null;
|
|
290
|
-
|
|
291
|
-
return {
|
|
292
|
-
domain: row.domain,
|
|
293
|
-
topPatterns: JSON.parse(row.top_patterns) as Array<{ pattern: string; strength: number }>,
|
|
294
|
-
sessionCount: row.session_count,
|
|
295
|
-
avgSessionDuration: row.avg_session_duration,
|
|
296
|
-
lastActivity: row.last_activity,
|
|
297
|
-
};
|
|
298
|
-
}
|
|
299
|
-
|
|
300
|
-
// ─── Private ────────────────────────────────────────────────────
|
|
301
|
-
|
|
302
|
-
private scoreFromFeedback(
|
|
303
|
-
row: FeedbackRow,
|
|
304
|
-
uniqueDomainCount: number,
|
|
305
|
-
now: number,
|
|
306
|
-
): PatternStrength {
|
|
307
|
-
const entry = this.vault.get(row.entry_id);
|
|
308
|
-
const domain = entry?.domain ?? 'unknown';
|
|
309
|
-
const pattern = entry?.title ?? row.entry_id;
|
|
310
|
-
|
|
311
|
-
const usageScore = computeUsageScore(row.total);
|
|
312
|
-
const spreadScore = computeSpreadScore(uniqueDomainCount);
|
|
313
|
-
const successRate = computeSuccessRate(row);
|
|
314
|
-
const successScore = 25 * successRate;
|
|
315
|
-
const recencyScore = computeRecencyScore(row.last_used, now);
|
|
316
|
-
const strength = usageScore + spreadScore + successScore + recencyScore;
|
|
317
|
-
|
|
318
|
-
return {
|
|
319
|
-
pattern,
|
|
320
|
-
domain,
|
|
321
|
-
strength,
|
|
322
|
-
usageScore,
|
|
323
|
-
spreadScore,
|
|
324
|
-
successScore,
|
|
325
|
-
recencyScore,
|
|
326
|
-
usageCount: row.total,
|
|
327
|
-
uniqueContexts: Math.min(uniqueDomainCount, 5),
|
|
328
|
-
successRate,
|
|
329
|
-
lastUsed: row.last_used,
|
|
330
|
-
};
|
|
331
|
-
}
|
|
332
|
-
|
|
333
|
-
private persistStrength(ps: PatternStrength): void {
|
|
334
|
-
this.provider.run(
|
|
335
|
-
`INSERT OR REPLACE INTO brain_strengths
|
|
336
|
-
(pattern, domain, strength, usage_score, spread_score, success_score, recency_score,
|
|
337
|
-
usage_count, unique_contexts, success_rate, last_used, updated_at)
|
|
338
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, datetime('now'))`,
|
|
339
|
-
[
|
|
340
|
-
ps.pattern,
|
|
341
|
-
ps.domain,
|
|
342
|
-
ps.strength,
|
|
343
|
-
ps.usageScore,
|
|
344
|
-
ps.spreadScore,
|
|
345
|
-
ps.successScore,
|
|
346
|
-
ps.recencyScore,
|
|
347
|
-
ps.usageCount,
|
|
348
|
-
ps.uniqueContexts,
|
|
349
|
-
ps.successRate,
|
|
350
|
-
ps.lastUsed,
|
|
351
|
-
],
|
|
352
|
-
);
|
|
353
|
-
}
|
|
354
|
-
|
|
355
|
-
private expandWithFallback(
|
|
356
|
-
strengths: PatternStrength[],
|
|
357
|
-
domain: string,
|
|
358
|
-
limit: number,
|
|
359
|
-
): PatternStrength[] {
|
|
360
|
-
const allStrengths = this.getStrengths({
|
|
361
|
-
minStrength: 20,
|
|
362
|
-
limit: limit * 5,
|
|
363
|
-
});
|
|
364
|
-
const additional = allStrengths.filter(
|
|
365
|
-
(s) =>
|
|
366
|
-
!strengths.some((existing) => existing.pattern === s.pattern) &&
|
|
367
|
-
(s.domain === domain || s.domain === 'unknown'),
|
|
368
|
-
);
|
|
369
|
-
return [...strengths, ...additional];
|
|
370
|
-
}
|
|
371
|
-
|
|
372
|
-
private boostByTaskContext(strengths: PatternStrength[], task: string): void {
|
|
373
|
-
const taskTerms = new Set(task.toLowerCase().split(/\W+/).filter(Boolean));
|
|
374
|
-
for (const s of strengths) {
|
|
375
|
-
const patternTerms = s.pattern.toLowerCase().split(/\W+/);
|
|
376
|
-
const overlap = patternTerms.filter((t) => taskTerms.has(t)).length;
|
|
377
|
-
if (overlap > 0) {
|
|
378
|
-
(s as { strength: number }).strength += overlap * 5;
|
|
379
|
-
}
|
|
380
|
-
}
|
|
381
|
-
}
|
|
382
|
-
|
|
383
|
-
private boostBySource(strengths: PatternStrength[], source: string): void {
|
|
384
|
-
for (const s of strengths) {
|
|
385
|
-
const row = this.provider.get<{
|
|
386
|
-
total: number;
|
|
387
|
-
accepted: number;
|
|
388
|
-
modified: number;
|
|
389
|
-
}>(
|
|
390
|
-
`SELECT COUNT(*) as total,
|
|
391
|
-
SUM(CASE WHEN action = 'accepted' THEN 1 ELSE 0 END) as accepted,
|
|
392
|
-
SUM(CASE WHEN action = 'modified' THEN 1 ELSE 0 END) as modified
|
|
393
|
-
FROM brain_feedback
|
|
394
|
-
WHERE entry_id = (SELECT id FROM entries WHERE title = ? LIMIT 1)
|
|
395
|
-
AND source = ?`,
|
|
396
|
-
[s.pattern, source],
|
|
397
|
-
) as { total: number; accepted: number; modified: number };
|
|
398
|
-
|
|
399
|
-
if (row.total < 3) continue;
|
|
400
|
-
const sourceRate = (row.accepted + row.modified * 0.5) / row.total;
|
|
401
|
-
(s as { strength: number }).strength += sourceRate * 10;
|
|
402
|
-
}
|
|
403
|
-
}
|
|
404
|
-
}
|
package/src/engine/index.ts
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Soleri Knowledge Engine — MCP Server Entry Point
|
|
3
|
-
*
|
|
4
|
-
* This is the standalone knowledge engine that file-tree agents connect to.
|
|
5
|
-
* It reads agent.yaml, initializes the runtime, and registers all tools.
|
|
6
|
-
*
|
|
7
|
-
* Usage:
|
|
8
|
-
* npx @soleri/engine --agent ./agent.yaml
|
|
9
|
-
*
|
|
10
|
-
* Or in .mcp.json:
|
|
11
|
-
* { "command": "npx", "args": ["@soleri/engine", "--agent", "./agent.yaml"] }
|
|
12
|
-
*
|
|
13
|
-
* Binary entry point: ./bin/soleri-engine.ts
|
|
14
|
-
*/
|
|
15
|
-
|
|
16
|
-
export { registerEngine } from './register-engine.js';
|
|
17
|
-
export type { EngineRegistrationOptions, EngineRegistrationResult } from './register-engine.js';
|
|
18
|
-
export { createCoreOps } from './core-ops.js';
|
|
19
|
-
export type { AgentIdentityConfig } from './core-ops.js';
|
|
20
|
-
export { ENGINE_MODULE_MANIFEST, CORE_KEY_OPS } from './module-manifest.js';
|
|
21
|
-
export type { ModuleManifestEntry } from './module-manifest.js';
|
package/src/persona/index.ts
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
export type {
|
|
2
|
-
PersonaConfig,
|
|
3
|
-
ArchivedPersona,
|
|
4
|
-
PersonaCreateInput,
|
|
5
|
-
PersonaSystemInstructions,
|
|
6
|
-
} from './types.js';
|
|
7
|
-
export { ITALIAN_CRAFTSPERSON, PERSONA_TEMPLATES, createDefaultPersona } from './defaults.js';
|
|
8
|
-
export { loadPersona } from './loader.js';
|
|
9
|
-
export { generatePersonaInstructions, getRandomSignoff } from './prompt-generator.js';
|