@soleri/core 2.1.0 → 2.5.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/dist/brain/brain.d.ts +10 -1
- package/dist/brain/brain.d.ts.map +1 -1
- package/dist/brain/brain.js +116 -13
- package/dist/brain/brain.js.map +1 -1
- package/dist/brain/intelligence.d.ts +36 -1
- package/dist/brain/intelligence.d.ts.map +1 -1
- package/dist/brain/intelligence.js +119 -14
- package/dist/brain/intelligence.js.map +1 -1
- package/dist/brain/types.d.ts +34 -2
- package/dist/brain/types.d.ts.map +1 -1
- package/dist/cognee/client.d.ts +3 -0
- package/dist/cognee/client.d.ts.map +1 -1
- package/dist/cognee/client.js +17 -0
- package/dist/cognee/client.js.map +1 -1
- package/dist/cognee/sync-manager.d.ts +94 -0
- package/dist/cognee/sync-manager.d.ts.map +1 -0
- package/dist/cognee/sync-manager.js +293 -0
- package/dist/cognee/sync-manager.js.map +1 -0
- package/dist/control/identity-manager.d.ts +22 -0
- package/dist/control/identity-manager.d.ts.map +1 -0
- package/dist/control/identity-manager.js +233 -0
- package/dist/control/identity-manager.js.map +1 -0
- package/dist/control/intent-router.d.ts +32 -0
- package/dist/control/intent-router.d.ts.map +1 -0
- package/dist/control/intent-router.js +242 -0
- package/dist/control/intent-router.js.map +1 -0
- package/dist/control/types.d.ts +68 -0
- package/dist/control/types.d.ts.map +1 -0
- package/dist/control/types.js +9 -0
- package/dist/control/types.js.map +1 -0
- package/dist/curator/curator.d.ts +37 -1
- package/dist/curator/curator.d.ts.map +1 -1
- package/dist/curator/curator.js +199 -1
- package/dist/curator/curator.js.map +1 -1
- package/dist/errors/classify.d.ts +13 -0
- package/dist/errors/classify.d.ts.map +1 -0
- package/dist/errors/classify.js +97 -0
- package/dist/errors/classify.js.map +1 -0
- package/dist/errors/index.d.ts +6 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +4 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/errors/retry.d.ts +40 -0
- package/dist/errors/retry.d.ts.map +1 -0
- package/dist/errors/retry.js +97 -0
- package/dist/errors/retry.js.map +1 -0
- package/dist/errors/types.d.ts +48 -0
- package/dist/errors/types.d.ts.map +1 -0
- package/dist/errors/types.js +59 -0
- package/dist/errors/types.js.map +1 -0
- package/dist/facades/types.d.ts +1 -1
- package/dist/governance/governance.d.ts +42 -0
- package/dist/governance/governance.d.ts.map +1 -0
- package/dist/governance/governance.js +488 -0
- package/dist/governance/governance.js.map +1 -0
- package/dist/governance/index.d.ts +3 -0
- package/dist/governance/index.d.ts.map +1 -0
- package/dist/governance/index.js +2 -0
- package/dist/governance/index.js.map +1 -0
- package/dist/governance/types.d.ts +102 -0
- package/dist/governance/types.d.ts.map +1 -0
- package/dist/governance/types.js +3 -0
- package/dist/governance/types.js.map +1 -0
- package/dist/index.d.ts +52 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +47 -1
- package/dist/index.js.map +1 -1
- package/dist/intake/content-classifier.d.ts +14 -0
- package/dist/intake/content-classifier.d.ts.map +1 -0
- package/dist/intake/content-classifier.js +125 -0
- package/dist/intake/content-classifier.js.map +1 -0
- package/dist/intake/dedup-gate.d.ts +17 -0
- package/dist/intake/dedup-gate.d.ts.map +1 -0
- package/dist/intake/dedup-gate.js +66 -0
- package/dist/intake/dedup-gate.js.map +1 -0
- package/dist/intake/intake-pipeline.d.ts +63 -0
- package/dist/intake/intake-pipeline.d.ts.map +1 -0
- package/dist/intake/intake-pipeline.js +373 -0
- package/dist/intake/intake-pipeline.js.map +1 -0
- package/dist/intake/types.d.ts +65 -0
- package/dist/intake/types.d.ts.map +1 -0
- package/dist/intake/types.js +3 -0
- package/dist/intake/types.js.map +1 -0
- package/dist/intelligence/loader.js +1 -1
- package/dist/intelligence/loader.js.map +1 -1
- package/dist/intelligence/types.d.ts +3 -1
- package/dist/intelligence/types.d.ts.map +1 -1
- package/dist/logging/logger.d.ts +37 -0
- package/dist/logging/logger.d.ts.map +1 -0
- package/dist/logging/logger.js +145 -0
- package/dist/logging/logger.js.map +1 -0
- package/dist/logging/types.d.ts +19 -0
- package/dist/logging/types.d.ts.map +1 -0
- package/dist/logging/types.js +2 -0
- package/dist/logging/types.js.map +1 -0
- package/dist/loop/loop-manager.d.ts +100 -0
- package/dist/loop/loop-manager.d.ts.map +1 -0
- package/dist/loop/loop-manager.js +379 -0
- package/dist/loop/loop-manager.js.map +1 -0
- package/dist/loop/types.d.ts +103 -0
- package/dist/loop/types.d.ts.map +1 -0
- package/dist/loop/types.js +11 -0
- package/dist/loop/types.js.map +1 -0
- package/dist/persistence/index.d.ts +3 -0
- package/dist/persistence/index.d.ts.map +1 -0
- package/dist/persistence/index.js +2 -0
- package/dist/persistence/index.js.map +1 -0
- package/dist/persistence/sqlite-provider.d.ts +25 -0
- package/dist/persistence/sqlite-provider.d.ts.map +1 -0
- package/dist/persistence/sqlite-provider.js +59 -0
- package/dist/persistence/sqlite-provider.js.map +1 -0
- package/dist/persistence/types.d.ts +36 -0
- package/dist/persistence/types.d.ts.map +1 -0
- package/dist/persistence/types.js +8 -0
- package/dist/persistence/types.js.map +1 -0
- package/dist/planning/gap-analysis.d.ts +72 -0
- package/dist/planning/gap-analysis.d.ts.map +1 -0
- package/dist/planning/gap-analysis.js +442 -0
- package/dist/planning/gap-analysis.js.map +1 -0
- package/dist/planning/gap-types.d.ts +29 -0
- package/dist/planning/gap-types.d.ts.map +1 -0
- package/dist/planning/gap-types.js +28 -0
- package/dist/planning/gap-types.js.map +1 -0
- package/dist/planning/planner.d.ts +421 -4
- package/dist/planning/planner.d.ts.map +1 -1
- package/dist/planning/planner.js +949 -21
- package/dist/planning/planner.js.map +1 -1
- package/dist/playbooks/generic/brainstorming.d.ts +9 -0
- package/dist/playbooks/generic/brainstorming.d.ts.map +1 -0
- package/dist/playbooks/generic/brainstorming.js +105 -0
- package/dist/playbooks/generic/brainstorming.js.map +1 -0
- package/dist/playbooks/generic/code-review.d.ts +11 -0
- package/dist/playbooks/generic/code-review.d.ts.map +1 -0
- package/dist/playbooks/generic/code-review.js +176 -0
- package/dist/playbooks/generic/code-review.js.map +1 -0
- package/dist/playbooks/generic/subagent-execution.d.ts +9 -0
- package/dist/playbooks/generic/subagent-execution.d.ts.map +1 -0
- package/dist/playbooks/generic/subagent-execution.js +68 -0
- package/dist/playbooks/generic/subagent-execution.js.map +1 -0
- package/dist/playbooks/generic/systematic-debugging.d.ts +9 -0
- package/dist/playbooks/generic/systematic-debugging.d.ts.map +1 -0
- package/dist/playbooks/generic/systematic-debugging.js +87 -0
- package/dist/playbooks/generic/systematic-debugging.js.map +1 -0
- package/dist/playbooks/generic/tdd.d.ts +9 -0
- package/dist/playbooks/generic/tdd.d.ts.map +1 -0
- package/dist/playbooks/generic/tdd.js +70 -0
- package/dist/playbooks/generic/tdd.js.map +1 -0
- package/dist/playbooks/generic/verification.d.ts +9 -0
- package/dist/playbooks/generic/verification.d.ts.map +1 -0
- package/dist/playbooks/generic/verification.js +74 -0
- package/dist/playbooks/generic/verification.js.map +1 -0
- package/dist/playbooks/index.d.ts +4 -0
- package/dist/playbooks/index.d.ts.map +1 -0
- package/dist/playbooks/index.js +5 -0
- package/dist/playbooks/index.js.map +1 -0
- package/dist/playbooks/playbook-registry.d.ts +42 -0
- package/dist/playbooks/playbook-registry.d.ts.map +1 -0
- package/dist/playbooks/playbook-registry.js +227 -0
- package/dist/playbooks/playbook-registry.js.map +1 -0
- package/dist/playbooks/playbook-seeder.d.ts +47 -0
- package/dist/playbooks/playbook-seeder.d.ts.map +1 -0
- package/dist/playbooks/playbook-seeder.js +104 -0
- package/dist/playbooks/playbook-seeder.js.map +1 -0
- package/dist/playbooks/playbook-types.d.ts +132 -0
- package/dist/playbooks/playbook-types.d.ts.map +1 -0
- package/dist/playbooks/playbook-types.js +12 -0
- package/dist/playbooks/playbook-types.js.map +1 -0
- package/dist/project/project-registry.d.ts +79 -0
- package/dist/project/project-registry.d.ts.map +1 -0
- package/dist/project/project-registry.js +274 -0
- package/dist/project/project-registry.js.map +1 -0
- package/dist/project/types.d.ts +28 -0
- package/dist/project/types.d.ts.map +1 -0
- package/dist/project/types.js +5 -0
- package/dist/project/types.js.map +1 -0
- package/dist/prompts/index.d.ts +4 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +3 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/parser.d.ts +17 -0
- package/dist/prompts/parser.d.ts.map +1 -0
- package/dist/prompts/parser.js +47 -0
- package/dist/prompts/parser.js.map +1 -0
- package/dist/prompts/template-manager.d.ts +25 -0
- package/dist/prompts/template-manager.d.ts.map +1 -0
- package/dist/prompts/template-manager.js +71 -0
- package/dist/prompts/template-manager.js.map +1 -0
- package/dist/prompts/types.d.ts +26 -0
- package/dist/prompts/types.d.ts.map +1 -0
- package/dist/prompts/types.js +5 -0
- package/dist/prompts/types.js.map +1 -0
- package/dist/runtime/admin-extra-ops.d.ts +15 -0
- package/dist/runtime/admin-extra-ops.d.ts.map +1 -0
- package/dist/runtime/admin-extra-ops.js +595 -0
- package/dist/runtime/admin-extra-ops.js.map +1 -0
- package/dist/runtime/admin-ops.d.ts +15 -0
- package/dist/runtime/admin-ops.d.ts.map +1 -0
- package/dist/runtime/admin-ops.js +329 -0
- package/dist/runtime/admin-ops.js.map +1 -0
- package/dist/runtime/capture-ops.d.ts +15 -0
- package/dist/runtime/capture-ops.d.ts.map +1 -0
- package/dist/runtime/capture-ops.js +363 -0
- package/dist/runtime/capture-ops.js.map +1 -0
- package/dist/runtime/cognee-sync-ops.d.ts +12 -0
- package/dist/runtime/cognee-sync-ops.d.ts.map +1 -0
- package/dist/runtime/cognee-sync-ops.js +55 -0
- package/dist/runtime/cognee-sync-ops.js.map +1 -0
- package/dist/runtime/core-ops.d.ts +9 -3
- package/dist/runtime/core-ops.d.ts.map +1 -1
- package/dist/runtime/core-ops.js +693 -10
- package/dist/runtime/core-ops.js.map +1 -1
- package/dist/runtime/curator-extra-ops.d.ts +9 -0
- package/dist/runtime/curator-extra-ops.d.ts.map +1 -0
- package/dist/runtime/curator-extra-ops.js +71 -0
- package/dist/runtime/curator-extra-ops.js.map +1 -0
- package/dist/runtime/domain-ops.d.ts.map +1 -1
- package/dist/runtime/domain-ops.js +61 -15
- package/dist/runtime/domain-ops.js.map +1 -1
- package/dist/runtime/grading-ops.d.ts +14 -0
- package/dist/runtime/grading-ops.d.ts.map +1 -0
- package/dist/runtime/grading-ops.js +105 -0
- package/dist/runtime/grading-ops.js.map +1 -0
- package/dist/runtime/intake-ops.d.ts +14 -0
- package/dist/runtime/intake-ops.d.ts.map +1 -0
- package/dist/runtime/intake-ops.js +110 -0
- package/dist/runtime/intake-ops.js.map +1 -0
- package/dist/runtime/loop-ops.d.ts +14 -0
- package/dist/runtime/loop-ops.d.ts.map +1 -0
- package/dist/runtime/loop-ops.js +251 -0
- package/dist/runtime/loop-ops.js.map +1 -0
- package/dist/runtime/memory-cross-project-ops.d.ts +12 -0
- package/dist/runtime/memory-cross-project-ops.d.ts.map +1 -0
- package/dist/runtime/memory-cross-project-ops.js +165 -0
- package/dist/runtime/memory-cross-project-ops.js.map +1 -0
- package/dist/runtime/memory-extra-ops.d.ts +13 -0
- package/dist/runtime/memory-extra-ops.d.ts.map +1 -0
- package/dist/runtime/memory-extra-ops.js +173 -0
- package/dist/runtime/memory-extra-ops.js.map +1 -0
- package/dist/runtime/orchestrate-ops.d.ts +17 -0
- package/dist/runtime/orchestrate-ops.d.ts.map +1 -0
- package/dist/runtime/orchestrate-ops.js +246 -0
- package/dist/runtime/orchestrate-ops.js.map +1 -0
- package/dist/runtime/planning-extra-ops.d.ts +25 -0
- package/dist/runtime/planning-extra-ops.d.ts.map +1 -0
- package/dist/runtime/planning-extra-ops.js +663 -0
- package/dist/runtime/planning-extra-ops.js.map +1 -0
- package/dist/runtime/playbook-ops.d.ts +14 -0
- package/dist/runtime/playbook-ops.d.ts.map +1 -0
- package/dist/runtime/playbook-ops.js +141 -0
- package/dist/runtime/playbook-ops.js.map +1 -0
- package/dist/runtime/project-ops.d.ts +15 -0
- package/dist/runtime/project-ops.d.ts.map +1 -0
- package/dist/runtime/project-ops.js +186 -0
- package/dist/runtime/project-ops.js.map +1 -0
- package/dist/runtime/runtime.d.ts.map +1 -1
- package/dist/runtime/runtime.js +65 -3
- package/dist/runtime/runtime.js.map +1 -1
- package/dist/runtime/types.d.ts +29 -0
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/runtime/vault-extra-ops.d.ts +10 -0
- package/dist/runtime/vault-extra-ops.d.ts.map +1 -0
- package/dist/runtime/vault-extra-ops.js +536 -0
- package/dist/runtime/vault-extra-ops.js.map +1 -0
- package/dist/telemetry/telemetry.d.ts +48 -0
- package/dist/telemetry/telemetry.d.ts.map +1 -0
- package/dist/telemetry/telemetry.js +87 -0
- package/dist/telemetry/telemetry.js.map +1 -0
- package/dist/vault/playbook.d.ts +34 -0
- package/dist/vault/playbook.d.ts.map +1 -0
- package/dist/vault/playbook.js +60 -0
- package/dist/vault/playbook.js.map +1 -0
- package/dist/vault/vault.d.ts +97 -4
- package/dist/vault/vault.d.ts.map +1 -1
- package/dist/vault/vault.js +424 -65
- package/dist/vault/vault.js.map +1 -1
- package/package.json +7 -3
- package/src/__tests__/admin-extra-ops.test.ts +467 -0
- package/src/__tests__/admin-ops.test.ts +271 -0
- package/src/__tests__/brain-intelligence.test.ts +205 -0
- package/src/__tests__/brain.test.ts +134 -3
- package/src/__tests__/capture-ops.test.ts +509 -0
- package/src/__tests__/cognee-integration.test.ts +80 -0
- package/src/__tests__/cognee-sync-manager.test.ts +103 -0
- package/src/__tests__/core-ops.test.ts +292 -2
- package/src/__tests__/curator-extra-ops.test.ts +381 -0
- package/src/__tests__/domain-ops.test.ts +66 -0
- package/src/__tests__/errors.test.ts +388 -0
- package/src/__tests__/governance.test.ts +522 -0
- package/src/__tests__/grading-ops.test.ts +361 -0
- package/src/__tests__/identity-manager.test.ts +243 -0
- package/src/__tests__/intake-pipeline.test.ts +162 -0
- package/src/__tests__/intent-router.test.ts +222 -0
- package/src/__tests__/logger.test.ts +200 -0
- package/src/__tests__/loop-ops.test.ts +469 -0
- package/src/__tests__/memory-cross-project-ops.test.ts +248 -0
- package/src/__tests__/memory-extra-ops.test.ts +352 -0
- package/src/__tests__/orchestrate-ops.test.ts +289 -0
- package/src/__tests__/persistence.test.ts +225 -0
- package/src/__tests__/planner.test.ts +416 -7
- package/src/__tests__/planning-extra-ops.test.ts +706 -0
- package/src/__tests__/playbook-registry.test.ts +326 -0
- package/src/__tests__/playbook-seeder.test.ts +163 -0
- package/src/__tests__/playbook.test.ts +389 -0
- package/src/__tests__/project-ops.test.ts +381 -0
- package/src/__tests__/template-manager.test.ts +222 -0
- package/src/__tests__/vault-extra-ops.test.ts +482 -0
- package/src/brain/brain.ts +185 -16
- package/src/brain/intelligence.ts +179 -10
- package/src/brain/types.ts +40 -2
- package/src/cognee/client.ts +18 -0
- package/src/cognee/sync-manager.ts +389 -0
- package/src/control/identity-manager.ts +354 -0
- package/src/control/intent-router.ts +326 -0
- package/src/control/types.ts +102 -0
- package/src/curator/curator.ts +295 -1
- package/src/errors/classify.ts +102 -0
- package/src/errors/index.ts +5 -0
- package/src/errors/retry.ts +132 -0
- package/src/errors/types.ts +81 -0
- package/src/governance/governance.ts +698 -0
- package/src/governance/index.ts +18 -0
- package/src/governance/types.ts +111 -0
- package/src/index.ts +213 -2
- package/src/intake/content-classifier.ts +146 -0
- package/src/intake/dedup-gate.ts +92 -0
- package/src/intake/intake-pipeline.ts +503 -0
- package/src/intake/types.ts +69 -0
- package/src/intelligence/loader.ts +1 -1
- package/src/intelligence/types.ts +3 -1
- package/src/logging/logger.ts +154 -0
- package/src/logging/types.ts +21 -0
- package/src/loop/loop-manager.ts +448 -0
- package/src/loop/types.ts +115 -0
- package/src/persistence/index.ts +7 -0
- package/src/persistence/sqlite-provider.ts +62 -0
- package/src/persistence/types.ts +44 -0
- package/src/planning/gap-analysis.ts +775 -0
- package/src/planning/gap-types.ts +61 -0
- package/src/planning/planner.ts +1273 -24
- package/src/playbooks/generic/brainstorming.ts +110 -0
- package/src/playbooks/generic/code-review.ts +181 -0
- package/src/playbooks/generic/subagent-execution.ts +74 -0
- package/src/playbooks/generic/systematic-debugging.ts +92 -0
- package/src/playbooks/generic/tdd.ts +75 -0
- package/src/playbooks/generic/verification.ts +79 -0
- package/src/playbooks/index.ts +27 -0
- package/src/playbooks/playbook-registry.ts +284 -0
- package/src/playbooks/playbook-seeder.ts +119 -0
- package/src/playbooks/playbook-types.ts +162 -0
- package/src/project/project-registry.ts +370 -0
- package/src/project/types.ts +31 -0
- package/src/prompts/index.ts +3 -0
- package/src/prompts/parser.ts +59 -0
- package/src/prompts/template-manager.ts +77 -0
- package/src/prompts/types.ts +28 -0
- package/src/runtime/admin-extra-ops.ts +652 -0
- package/src/runtime/admin-ops.ts +340 -0
- package/src/runtime/capture-ops.ts +404 -0
- package/src/runtime/cognee-sync-ops.ts +63 -0
- package/src/runtime/core-ops.ts +787 -9
- package/src/runtime/curator-extra-ops.ts +85 -0
- package/src/runtime/domain-ops.ts +67 -15
- package/src/runtime/grading-ops.ts +130 -0
- package/src/runtime/intake-ops.ts +126 -0
- package/src/runtime/loop-ops.ts +277 -0
- package/src/runtime/memory-cross-project-ops.ts +191 -0
- package/src/runtime/memory-extra-ops.ts +186 -0
- package/src/runtime/orchestrate-ops.ts +278 -0
- package/src/runtime/planning-extra-ops.ts +718 -0
- package/src/runtime/playbook-ops.ts +169 -0
- package/src/runtime/project-ops.ts +202 -0
- package/src/runtime/runtime.ts +77 -3
- package/src/runtime/types.ts +29 -0
- package/src/runtime/vault-extra-ops.ts +606 -0
- package/src/telemetry/telemetry.ts +118 -0
- package/src/vault/playbook.ts +87 -0
- package/src/vault/vault.ts +575 -98
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IntentRouter — Keyword-based intent classification and operational mode management.
|
|
3
|
+
*
|
|
4
|
+
* Follows the Curator/BrainIntelligence pattern: separate class, own SQLite
|
|
5
|
+
* tables, takes Vault as constructor dep. All methods synchronous (better-sqlite3).
|
|
6
|
+
*
|
|
7
|
+
* 10 default modes seeded on first use via INSERT OR IGNORE.
|
|
8
|
+
* Agents can register custom modes at runtime.
|
|
9
|
+
*/
|
|
10
|
+
// ─── Default Mode Definitions ───────────────────────────────────────
|
|
11
|
+
const DEFAULT_MODES = [
|
|
12
|
+
{
|
|
13
|
+
mode: 'BUILD-MODE',
|
|
14
|
+
intent: 'build',
|
|
15
|
+
description: 'Creating new components, features, or scaffolding',
|
|
16
|
+
behaviorRules: ['Focus on clean architecture', 'Follow existing patterns', 'Write tests'],
|
|
17
|
+
keywords: ['build', 'create', 'add', 'implement', 'scaffold', 'generate', 'new', 'feature'],
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
mode: 'FIX-MODE',
|
|
21
|
+
intent: 'fix',
|
|
22
|
+
description: 'Fixing bugs, errors, and broken behavior',
|
|
23
|
+
behaviorRules: ['Identify root cause first', 'Verify fix with tests', 'Check for regressions'],
|
|
24
|
+
keywords: ['fix', 'bug', 'broken', 'error', 'crash', 'issue', 'debug', 'repair', 'janky'],
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
mode: 'VALIDATE-MODE',
|
|
28
|
+
intent: 'validate',
|
|
29
|
+
description: 'Validating, checking, verifying, and testing code',
|
|
30
|
+
behaviorRules: ['Be thorough', 'Check edge cases', 'Report all findings'],
|
|
31
|
+
keywords: ['validate', 'check', 'verify', 'test', 'lint', 'audit'],
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
mode: 'DESIGN-MODE',
|
|
35
|
+
intent: 'design',
|
|
36
|
+
description: 'Visual design, styling, layout, and color decisions',
|
|
37
|
+
behaviorRules: ['Use semantic tokens', 'Check contrast ratios', 'Follow design system'],
|
|
38
|
+
keywords: ['design', 'style', 'layout', 'color', 'typography', 'spacing', 'visual', 'ui'],
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
mode: 'IMPROVE-MODE',
|
|
42
|
+
intent: 'improve',
|
|
43
|
+
description: 'Refactoring, optimization, and code enhancement',
|
|
44
|
+
behaviorRules: ['Measure before optimizing', 'Keep changes minimal', 'Preserve behavior'],
|
|
45
|
+
keywords: ['improve', 'refactor', 'optimize', 'clean', 'enhance', 'simplify', 'faster'],
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
mode: 'DELIVER-MODE',
|
|
49
|
+
intent: 'deliver',
|
|
50
|
+
description: 'Deploying, shipping, releasing, and publishing',
|
|
51
|
+
behaviorRules: ['Run all checks first', 'Update changelog', 'Tag releases properly'],
|
|
52
|
+
keywords: ['deploy', 'ship', 'release', 'publish', 'merge', 'pr', 'push', 'package'],
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
mode: 'EXPLORE-MODE',
|
|
56
|
+
intent: 'explore',
|
|
57
|
+
description: 'Exploring, searching, and understanding the codebase',
|
|
58
|
+
behaviorRules: ['Be thorough in search', 'Provide context', 'Map dependencies'],
|
|
59
|
+
keywords: ['explore', 'search', 'find', 'show', 'list', 'explain'],
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
mode: 'PLAN-MODE',
|
|
63
|
+
intent: 'plan',
|
|
64
|
+
description: 'Planning, architecting, and strategy development',
|
|
65
|
+
behaviorRules: ['Consider trade-offs', 'Break into steps', 'Identify risks'],
|
|
66
|
+
keywords: ['plan', 'architect', 'strategy', 'approach', 'roadmap'],
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
mode: 'REVIEW-MODE',
|
|
70
|
+
intent: 'review',
|
|
71
|
+
description: 'Code review, feedback, and quality assessment',
|
|
72
|
+
behaviorRules: ['Be constructive', 'Focus on high-impact issues', 'Suggest alternatives'],
|
|
73
|
+
keywords: ['review', 'feedback', 'critique', 'assess', 'evaluate', 'quality'],
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
mode: 'GENERAL-MODE',
|
|
77
|
+
intent: 'general',
|
|
78
|
+
description: 'General-purpose fallback mode',
|
|
79
|
+
behaviorRules: ['Be helpful', 'Ask clarifying questions when needed'],
|
|
80
|
+
keywords: [],
|
|
81
|
+
},
|
|
82
|
+
];
|
|
83
|
+
// ─── Class ──────────────────────────────────────────────────────────
|
|
84
|
+
export class IntentRouter {
|
|
85
|
+
vault;
|
|
86
|
+
currentMode = 'GENERAL-MODE';
|
|
87
|
+
constructor(vault) {
|
|
88
|
+
this.vault = vault;
|
|
89
|
+
this.initializeTables();
|
|
90
|
+
this.seedDefaultModes();
|
|
91
|
+
}
|
|
92
|
+
// ─── Table Initialization ───────────────────────────────────────────
|
|
93
|
+
initializeTables() {
|
|
94
|
+
const db = this.vault.getDb();
|
|
95
|
+
db.exec(`
|
|
96
|
+
CREATE TABLE IF NOT EXISTS agent_modes (
|
|
97
|
+
mode TEXT PRIMARY KEY,
|
|
98
|
+
intent TEXT NOT NULL,
|
|
99
|
+
description TEXT NOT NULL DEFAULT '',
|
|
100
|
+
behavior_rules TEXT NOT NULL DEFAULT '[]',
|
|
101
|
+
keywords TEXT NOT NULL DEFAULT '[]'
|
|
102
|
+
);
|
|
103
|
+
|
|
104
|
+
CREATE TABLE IF NOT EXISTS agent_routing_log (
|
|
105
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
106
|
+
prompt TEXT NOT NULL,
|
|
107
|
+
intent TEXT NOT NULL,
|
|
108
|
+
mode TEXT NOT NULL,
|
|
109
|
+
confidence REAL NOT NULL,
|
|
110
|
+
matched_keywords TEXT NOT NULL DEFAULT '[]',
|
|
111
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
112
|
+
);
|
|
113
|
+
`);
|
|
114
|
+
}
|
|
115
|
+
seedDefaultModes() {
|
|
116
|
+
const db = this.vault.getDb();
|
|
117
|
+
const insert = db.prepare(`INSERT OR IGNORE INTO agent_modes (mode, intent, description, behavior_rules, keywords)
|
|
118
|
+
VALUES (?, ?, ?, ?, ?)`);
|
|
119
|
+
for (const m of DEFAULT_MODES) {
|
|
120
|
+
insert.run(m.mode, m.intent, m.description, JSON.stringify(m.behaviorRules), JSON.stringify(m.keywords));
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
// ─── Intent Classification ──────────────────────────────────────────
|
|
124
|
+
routeIntent(prompt) {
|
|
125
|
+
const tokens = new Set(prompt.toLowerCase().split(/\s+/).filter(Boolean));
|
|
126
|
+
const modes = this.getModes();
|
|
127
|
+
let bestMode = null;
|
|
128
|
+
let bestMatchCount = 0;
|
|
129
|
+
let bestMatchedKeywords = [];
|
|
130
|
+
for (const mode of modes) {
|
|
131
|
+
if (mode.keywords.length === 0)
|
|
132
|
+
continue;
|
|
133
|
+
const matched = mode.keywords.filter((kw) => tokens.has(kw));
|
|
134
|
+
if (matched.length > bestMatchCount) {
|
|
135
|
+
bestMatchCount = matched.length;
|
|
136
|
+
bestMode = mode;
|
|
137
|
+
bestMatchedKeywords = matched;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
if (!bestMode || bestMatchCount === 0) {
|
|
141
|
+
const classification = {
|
|
142
|
+
intent: 'general',
|
|
143
|
+
mode: 'GENERAL-MODE',
|
|
144
|
+
confidence: 0,
|
|
145
|
+
method: 'keyword',
|
|
146
|
+
matchedKeywords: [],
|
|
147
|
+
};
|
|
148
|
+
this.logRouting(prompt, classification);
|
|
149
|
+
this.currentMode = 'GENERAL-MODE';
|
|
150
|
+
return classification;
|
|
151
|
+
}
|
|
152
|
+
const confidence = Math.min(bestMatchCount / bestMode.keywords.length, 1.0);
|
|
153
|
+
const classification = {
|
|
154
|
+
intent: bestMode.intent,
|
|
155
|
+
mode: bestMode.mode,
|
|
156
|
+
confidence,
|
|
157
|
+
method: 'keyword',
|
|
158
|
+
matchedKeywords: bestMatchedKeywords,
|
|
159
|
+
};
|
|
160
|
+
this.logRouting(prompt, classification);
|
|
161
|
+
this.currentMode = bestMode.mode;
|
|
162
|
+
return classification;
|
|
163
|
+
}
|
|
164
|
+
logRouting(prompt, classification) {
|
|
165
|
+
const db = this.vault.getDb();
|
|
166
|
+
db.prepare(`INSERT INTO agent_routing_log (prompt, intent, mode, confidence, matched_keywords)
|
|
167
|
+
VALUES (?, ?, ?, ?, ?)`).run(prompt, classification.intent, classification.mode, classification.confidence, JSON.stringify(classification.matchedKeywords));
|
|
168
|
+
}
|
|
169
|
+
// ─── Mode Management ───────────────────────────────────────────────
|
|
170
|
+
morph(mode) {
|
|
171
|
+
const db = this.vault.getDb();
|
|
172
|
+
const row = db.prepare('SELECT * FROM agent_modes WHERE mode = ?').get(mode);
|
|
173
|
+
if (!row) {
|
|
174
|
+
throw new Error(`Unknown mode: ${mode}`);
|
|
175
|
+
}
|
|
176
|
+
const previousMode = this.currentMode;
|
|
177
|
+
this.currentMode = mode;
|
|
178
|
+
const behaviorRules = JSON.parse(row.behavior_rules);
|
|
179
|
+
return { previousMode, currentMode: mode, behaviorRules };
|
|
180
|
+
}
|
|
181
|
+
getCurrentMode() {
|
|
182
|
+
return this.currentMode;
|
|
183
|
+
}
|
|
184
|
+
getBehaviorRules(mode) {
|
|
185
|
+
const db = this.vault.getDb();
|
|
186
|
+
const target = mode ?? this.currentMode;
|
|
187
|
+
const row = db.prepare('SELECT behavior_rules FROM agent_modes WHERE mode = ?').get(target);
|
|
188
|
+
if (!row)
|
|
189
|
+
return [];
|
|
190
|
+
return JSON.parse(row.behavior_rules);
|
|
191
|
+
}
|
|
192
|
+
getModes() {
|
|
193
|
+
const db = this.vault.getDb();
|
|
194
|
+
const rows = db.prepare('SELECT * FROM agent_modes ORDER BY mode').all();
|
|
195
|
+
return rows.map(rowToModeConfig);
|
|
196
|
+
}
|
|
197
|
+
registerMode(config) {
|
|
198
|
+
const db = this.vault.getDb();
|
|
199
|
+
db.prepare(`INSERT OR REPLACE INTO agent_modes (mode, intent, description, behavior_rules, keywords)
|
|
200
|
+
VALUES (?, ?, ?, ?, ?)`).run(config.mode, config.intent, config.description, JSON.stringify(config.behaviorRules), JSON.stringify(config.keywords));
|
|
201
|
+
}
|
|
202
|
+
updateModeRules(mode, rules) {
|
|
203
|
+
const db = this.vault.getDb();
|
|
204
|
+
const result = db
|
|
205
|
+
.prepare('UPDATE agent_modes SET behavior_rules = ? WHERE mode = ?')
|
|
206
|
+
.run(JSON.stringify(rules), mode);
|
|
207
|
+
if (result.changes === 0) {
|
|
208
|
+
throw new Error(`Unknown mode: ${mode}`);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
// ─── Analytics ──────────────────────────────────────────────────────
|
|
212
|
+
getRoutingStats() {
|
|
213
|
+
const db = this.vault.getDb();
|
|
214
|
+
const total = db.prepare('SELECT COUNT(*) as count FROM agent_routing_log').get().count;
|
|
215
|
+
const intentRows = db
|
|
216
|
+
.prepare('SELECT intent, COUNT(*) as count FROM agent_routing_log GROUP BY intent')
|
|
217
|
+
.all();
|
|
218
|
+
const byIntent = {};
|
|
219
|
+
for (const row of intentRows) {
|
|
220
|
+
byIntent[row.intent] = row.count;
|
|
221
|
+
}
|
|
222
|
+
const modeRows = db
|
|
223
|
+
.prepare('SELECT mode, COUNT(*) as count FROM agent_routing_log GROUP BY mode')
|
|
224
|
+
.all();
|
|
225
|
+
const byMode = {};
|
|
226
|
+
for (const row of modeRows) {
|
|
227
|
+
byMode[row.mode] = row.count;
|
|
228
|
+
}
|
|
229
|
+
return { totalRouted: total, byIntent, byMode };
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
// ─── Row Converters ─────────────────────────────────────────────────
|
|
233
|
+
function rowToModeConfig(row) {
|
|
234
|
+
return {
|
|
235
|
+
mode: row.mode,
|
|
236
|
+
intent: row.intent,
|
|
237
|
+
description: row.description,
|
|
238
|
+
behaviorRules: JSON.parse(row.behavior_rules),
|
|
239
|
+
keywords: JSON.parse(row.keywords),
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
//# sourceMappingURL=intent-router.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"intent-router.js","sourceRoot":"","sources":["../../src/control/intent-router.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Types for Identity Management and Intent Routing.
|
|
3
|
+
*
|
|
4
|
+
* Two separate concerns:
|
|
5
|
+
* - Identity: agent persona CRUD with versioning and guidelines
|
|
6
|
+
* - Intent Routing: keyword-based intent classification and operational modes
|
|
7
|
+
*/
|
|
8
|
+
export type GuidelineCategory = 'behavior' | 'preference' | 'restriction' | 'style';
|
|
9
|
+
export interface Guideline {
|
|
10
|
+
id: string;
|
|
11
|
+
category: GuidelineCategory;
|
|
12
|
+
text: string;
|
|
13
|
+
priority: number;
|
|
14
|
+
createdAt: string;
|
|
15
|
+
updatedAt: string;
|
|
16
|
+
}
|
|
17
|
+
export interface AgentIdentity {
|
|
18
|
+
agentId: string;
|
|
19
|
+
name: string;
|
|
20
|
+
role: string;
|
|
21
|
+
description: string;
|
|
22
|
+
personality: string[];
|
|
23
|
+
guidelines: Guideline[];
|
|
24
|
+
version: number;
|
|
25
|
+
updatedAt: string;
|
|
26
|
+
}
|
|
27
|
+
export interface IdentityVersion {
|
|
28
|
+
version: number;
|
|
29
|
+
snapshot: string;
|
|
30
|
+
changedBy: string;
|
|
31
|
+
changeReason: string;
|
|
32
|
+
createdAt: string;
|
|
33
|
+
}
|
|
34
|
+
export interface IdentityUpdateInput {
|
|
35
|
+
name?: string;
|
|
36
|
+
role?: string;
|
|
37
|
+
description?: string;
|
|
38
|
+
personality?: string[];
|
|
39
|
+
changedBy?: string;
|
|
40
|
+
changeReason?: string;
|
|
41
|
+
}
|
|
42
|
+
export interface GuidelineInput {
|
|
43
|
+
category: GuidelineCategory;
|
|
44
|
+
text: string;
|
|
45
|
+
priority?: number;
|
|
46
|
+
}
|
|
47
|
+
export type IntentType = 'build' | 'fix' | 'validate' | 'design' | 'improve' | 'deliver' | 'explore' | 'plan' | 'review' | 'general';
|
|
48
|
+
export type OperationalMode = 'BUILD-MODE' | 'FIX-MODE' | 'VALIDATE-MODE' | 'DESIGN-MODE' | 'IMPROVE-MODE' | 'DELIVER-MODE' | 'EXPLORE-MODE' | 'PLAN-MODE' | 'REVIEW-MODE' | 'GENERAL-MODE';
|
|
49
|
+
export interface IntentClassification {
|
|
50
|
+
intent: IntentType;
|
|
51
|
+
mode: OperationalMode;
|
|
52
|
+
confidence: number;
|
|
53
|
+
method: 'keyword';
|
|
54
|
+
matchedKeywords: string[];
|
|
55
|
+
}
|
|
56
|
+
export interface ModeConfig {
|
|
57
|
+
mode: OperationalMode;
|
|
58
|
+
intent: IntentType;
|
|
59
|
+
description: string;
|
|
60
|
+
behaviorRules: string[];
|
|
61
|
+
keywords: string[];
|
|
62
|
+
}
|
|
63
|
+
export interface MorphResult {
|
|
64
|
+
previousMode: OperationalMode;
|
|
65
|
+
currentMode: OperationalMode;
|
|
66
|
+
behaviorRules: string[];
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/control/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,MAAM,iBAAiB,GAAG,UAAU,GAAG,YAAY,GAAG,aAAa,GAAG,OAAO,CAAC;AAEpF,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAID,MAAM,MAAM,UAAU,GAClB,OAAO,GACP,KAAK,GACL,UAAU,GACV,QAAQ,GACR,SAAS,GACT,SAAS,GACT,SAAS,GACT,MAAM,GACN,QAAQ,GACR,SAAS,CAAC;AAEd,MAAM,MAAM,eAAe,GACvB,YAAY,GACZ,UAAU,GACV,eAAe,GACf,aAAa,GACb,cAAc,GACd,cAAc,GACd,cAAc,GACd,WAAW,GACX,aAAa,GACb,cAAc,CAAC;AAEnB,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,UAAU,CAAC;IACnB,IAAI,EAAE,eAAe,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,SAAS,CAAC;IAClB,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,eAAe,CAAC;IACtB,MAAM,EAAE,UAAU,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,eAAe,CAAC;IAC9B,WAAW,EAAE,eAAe,CAAC;IAC7B,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Types for Identity Management and Intent Routing.
|
|
3
|
+
*
|
|
4
|
+
* Two separate concerns:
|
|
5
|
+
* - Identity: agent persona CRUD with versioning and guidelines
|
|
6
|
+
* - Intent Routing: keyword-based intent classification and operational modes
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/control/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import type { Vault } from '../vault/vault.js';
|
|
2
|
+
import type { IntelligenceEntry } from '../intelligence/types.js';
|
|
3
|
+
import type { CogneeClient } from '../cognee/client.js';
|
|
2
4
|
import type { CuratorStatus, TagNormalizationResult, CanonicalTag, DuplicateDetectionResult, Contradiction, ContradictionStatus, GroomResult, GroomAllResult, ConsolidationOptions, ConsolidationResult, ChangelogEntry, HealthAuditResult } from './types.js';
|
|
3
5
|
export declare class Curator {
|
|
4
6
|
private vault;
|
|
5
|
-
|
|
7
|
+
private cognee;
|
|
8
|
+
constructor(vault: Vault, cognee?: CogneeClient);
|
|
6
9
|
private initializeTables;
|
|
7
10
|
private seedDefaultAliases;
|
|
8
11
|
getStatus(): CuratorStatus;
|
|
@@ -15,11 +18,44 @@ export declare class Curator {
|
|
|
15
18
|
detectContradictions(threshold?: number): Contradiction[];
|
|
16
19
|
getContradictions(status?: ContradictionStatus): Contradiction[];
|
|
17
20
|
resolveContradiction(id: number, resolution: 'resolved' | 'dismissed'): Contradiction | null;
|
|
21
|
+
detectContradictionsHybrid(threshold?: number): Promise<{
|
|
22
|
+
contradictions: Contradiction[];
|
|
23
|
+
cogneeAvailable: boolean;
|
|
24
|
+
method: 'hybrid' | 'tfidf-only';
|
|
25
|
+
}>;
|
|
18
26
|
groomEntry(entryId: string): GroomResult | null;
|
|
19
27
|
groomAll(): GroomAllResult;
|
|
20
28
|
consolidate(options?: ConsolidationOptions): ConsolidationResult;
|
|
21
29
|
getEntryHistory(entryId: string, limit?: number): ChangelogEntry[];
|
|
22
30
|
healthAudit(): HealthAuditResult;
|
|
31
|
+
recordSnapshot(entryId: string, changedBy?: string, changeReason?: string): {
|
|
32
|
+
recorded: boolean;
|
|
33
|
+
historyId: number;
|
|
34
|
+
};
|
|
35
|
+
getVersionHistory(entryId: string): Array<{
|
|
36
|
+
historyId: number;
|
|
37
|
+
entryId: string;
|
|
38
|
+
snapshot: IntelligenceEntry;
|
|
39
|
+
changedBy: string;
|
|
40
|
+
changeReason: string | null;
|
|
41
|
+
createdAt: number;
|
|
42
|
+
}>;
|
|
43
|
+
getQueueStats(): {
|
|
44
|
+
totalEntries: number;
|
|
45
|
+
groomedEntries: number;
|
|
46
|
+
ungroomedEntries: number;
|
|
47
|
+
staleEntries: number;
|
|
48
|
+
freshEntries: number;
|
|
49
|
+
avgDaysSinceGroom: number;
|
|
50
|
+
};
|
|
51
|
+
enrichMetadata(entryId: string): {
|
|
52
|
+
enriched: boolean;
|
|
53
|
+
changes: Array<{
|
|
54
|
+
field: string;
|
|
55
|
+
before: string;
|
|
56
|
+
after: string;
|
|
57
|
+
}>;
|
|
58
|
+
};
|
|
23
59
|
private buildVocabulary;
|
|
24
60
|
private logChange;
|
|
25
61
|
private rowToContradiction;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"curator.d.ts","sourceRoot":"","sources":["../../src/curator/curator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"curator.d.ts","sourceRoot":"","sources":["../../src/curator/curator.ts"],"names":[],"mappings":"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"}
|
package/dist/curator/curator.js
CHANGED
|
@@ -22,8 +22,10 @@ const DEFAULT_TAG_ALIASES = [
|
|
|
22
22
|
// ─── Curator Class ──────────────────────────────────────────────────
|
|
23
23
|
export class Curator {
|
|
24
24
|
vault;
|
|
25
|
-
|
|
25
|
+
cognee;
|
|
26
|
+
constructor(vault, cognee) {
|
|
26
27
|
this.vault = vault;
|
|
28
|
+
this.cognee = cognee;
|
|
27
29
|
this.initializeTables();
|
|
28
30
|
this.seedDefaultAliases();
|
|
29
31
|
}
|
|
@@ -63,6 +65,15 @@ export class Curator {
|
|
|
63
65
|
created_at INTEGER NOT NULL DEFAULT (unixepoch())
|
|
64
66
|
);
|
|
65
67
|
|
|
68
|
+
CREATE TABLE IF NOT EXISTS curator_entry_history (
|
|
69
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
70
|
+
entry_id TEXT NOT NULL,
|
|
71
|
+
snapshot TEXT NOT NULL,
|
|
72
|
+
changed_by TEXT DEFAULT 'system',
|
|
73
|
+
change_reason TEXT,
|
|
74
|
+
created_at INTEGER NOT NULL DEFAULT (unixepoch())
|
|
75
|
+
);
|
|
76
|
+
|
|
66
77
|
CREATE TABLE IF NOT EXISTS curator_contradictions (
|
|
67
78
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
68
79
|
pattern_id TEXT NOT NULL,
|
|
@@ -271,6 +282,67 @@ export class Curator {
|
|
|
271
282
|
const row = db.prepare('SELECT * FROM curator_contradictions WHERE id = ?').get(id);
|
|
272
283
|
return row ? this.rowToContradiction(row) : null;
|
|
273
284
|
}
|
|
285
|
+
async detectContradictionsHybrid(threshold) {
|
|
286
|
+
const effectiveThreshold = threshold ?? DEFAULT_CONTRADICTION_THRESHOLD;
|
|
287
|
+
const entries = this.vault.list({ limit: 100000 });
|
|
288
|
+
const antipatterns = entries.filter((e) => e.type === 'anti-pattern');
|
|
289
|
+
const patterns = entries.filter((e) => e.type === 'pattern');
|
|
290
|
+
if (antipatterns.length === 0 || patterns.length === 0) {
|
|
291
|
+
return { contradictions: [], cogneeAvailable: false, method: 'tfidf-only' };
|
|
292
|
+
}
|
|
293
|
+
const vocabulary = this.buildVocabulary(entries);
|
|
294
|
+
const db = this.vault.getDb();
|
|
295
|
+
const detected = [];
|
|
296
|
+
const insertStmt = db.prepare(`INSERT OR IGNORE INTO curator_contradictions (pattern_id, antipattern_id, similarity)
|
|
297
|
+
VALUES (?, ?, ?)`);
|
|
298
|
+
const cogneeAvailable = this.cognee?.isAvailable ?? false;
|
|
299
|
+
for (const ap of antipatterns) {
|
|
300
|
+
let candidates;
|
|
301
|
+
try {
|
|
302
|
+
const searchResults = this.vault.search(ap.title, { type: 'pattern', limit: 20 });
|
|
303
|
+
candidates = searchResults.length > 0 ? searchResults.map((r) => r.entry) : patterns;
|
|
304
|
+
}
|
|
305
|
+
catch {
|
|
306
|
+
candidates = patterns;
|
|
307
|
+
}
|
|
308
|
+
const apText = [ap.title, ap.description, ap.context ?? ''].join(' ');
|
|
309
|
+
const apVec = calculateTfIdf(tokenize(apText), vocabulary);
|
|
310
|
+
for (const pattern of candidates) {
|
|
311
|
+
const pText = [pattern.title, pattern.description, pattern.context ?? ''].join(' ');
|
|
312
|
+
const pVec = calculateTfIdf(tokenize(pText), vocabulary);
|
|
313
|
+
const tfidfScore = cosineSimilarity(apVec, pVec);
|
|
314
|
+
let finalScore = tfidfScore;
|
|
315
|
+
if (cogneeAvailable && this.cognee) {
|
|
316
|
+
try {
|
|
317
|
+
const cogneeResults = await this.cognee.search(`${ap.title} ${pattern.title}`, {
|
|
318
|
+
limit: 5,
|
|
319
|
+
});
|
|
320
|
+
const cogneeScore = cogneeResults.length > 0
|
|
321
|
+
? cogneeResults.reduce((sum, r) => sum + r.score, 0) / cogneeResults.length
|
|
322
|
+
: 0;
|
|
323
|
+
finalScore = 0.6 * tfidfScore + 0.4 * cogneeScore;
|
|
324
|
+
}
|
|
325
|
+
catch {
|
|
326
|
+
finalScore = tfidfScore;
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
if (finalScore >= effectiveThreshold) {
|
|
330
|
+
const result = insertStmt.run(pattern.id, ap.id, finalScore);
|
|
331
|
+
if (result.changes > 0) {
|
|
332
|
+
const row = db
|
|
333
|
+
.prepare('SELECT * FROM curator_contradictions WHERE pattern_id = ? AND antipattern_id = ?')
|
|
334
|
+
.get(pattern.id, ap.id);
|
|
335
|
+
detected.push(this.rowToContradiction(row));
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
return {
|
|
341
|
+
contradictions: detected,
|
|
342
|
+
cogneeAvailable,
|
|
343
|
+
method: cogneeAvailable ? 'hybrid' : 'tfidf-only',
|
|
344
|
+
};
|
|
345
|
+
}
|
|
274
346
|
// ─── Grooming ───────────────────────────────────────────────────
|
|
275
347
|
groomEntry(entryId) {
|
|
276
348
|
const entry = this.vault.get(entryId);
|
|
@@ -477,6 +549,132 @@ export class Curator {
|
|
|
477
549
|
recommendations,
|
|
478
550
|
};
|
|
479
551
|
}
|
|
552
|
+
// ─── Entry History (Version Snapshots) ─────────────────────────
|
|
553
|
+
recordSnapshot(entryId, changedBy, changeReason) {
|
|
554
|
+
const entry = this.vault.get(entryId);
|
|
555
|
+
if (!entry)
|
|
556
|
+
return { recorded: false, historyId: -1 };
|
|
557
|
+
const db = this.vault.getDb();
|
|
558
|
+
const result = db
|
|
559
|
+
.prepare('INSERT INTO curator_entry_history (entry_id, snapshot, changed_by, change_reason, created_at) VALUES (?, ?, ?, ?, unixepoch())')
|
|
560
|
+
.run(entryId, JSON.stringify(entry), changedBy ?? 'system', changeReason ?? null);
|
|
561
|
+
return { recorded: true, historyId: Number(result.lastInsertRowid) };
|
|
562
|
+
}
|
|
563
|
+
getVersionHistory(entryId) {
|
|
564
|
+
const db = this.vault.getDb();
|
|
565
|
+
const rows = db
|
|
566
|
+
.prepare('SELECT * FROM curator_entry_history WHERE entry_id = ? ORDER BY created_at ASC, id ASC')
|
|
567
|
+
.all(entryId);
|
|
568
|
+
return rows.map((row) => ({
|
|
569
|
+
historyId: row.id,
|
|
570
|
+
entryId: row.entry_id,
|
|
571
|
+
snapshot: JSON.parse(row.snapshot),
|
|
572
|
+
changedBy: row.changed_by,
|
|
573
|
+
changeReason: row.change_reason ?? null,
|
|
574
|
+
createdAt: row.created_at,
|
|
575
|
+
}));
|
|
576
|
+
}
|
|
577
|
+
// ─── Queue Stats ──────────────────────────────────────────────
|
|
578
|
+
getQueueStats() {
|
|
579
|
+
const db = this.vault.getDb();
|
|
580
|
+
const totalEntries = db.prepare('SELECT COUNT(*) as count FROM entries').get().count;
|
|
581
|
+
const groomedEntries = db
|
|
582
|
+
.prepare('SELECT COUNT(*) as count FROM curator_entry_state WHERE last_groomed_at IS NOT NULL')
|
|
583
|
+
.get().count;
|
|
584
|
+
const ungroomedEntries = totalEntries - groomedEntries;
|
|
585
|
+
const now = Math.floor(Date.now() / 1000);
|
|
586
|
+
const staleThreshold = now - 30 * 86400;
|
|
587
|
+
const freshThreshold = now - 7 * 86400;
|
|
588
|
+
const staleEntries = db
|
|
589
|
+
.prepare('SELECT COUNT(*) as count FROM curator_entry_state WHERE last_groomed_at IS NOT NULL AND last_groomed_at < ?')
|
|
590
|
+
.get(staleThreshold).count;
|
|
591
|
+
const freshEntries = db
|
|
592
|
+
.prepare('SELECT COUNT(*) as count FROM curator_entry_state WHERE last_groomed_at IS NOT NULL AND last_groomed_at >= ?')
|
|
593
|
+
.get(freshThreshold).count;
|
|
594
|
+
let avgDaysSinceGroom = 0;
|
|
595
|
+
if (groomedEntries > 0) {
|
|
596
|
+
const sumRow = db
|
|
597
|
+
.prepare('SELECT SUM(? - last_groomed_at) as total FROM curator_entry_state WHERE last_groomed_at IS NOT NULL')
|
|
598
|
+
.get(now);
|
|
599
|
+
const totalSeconds = sumRow.total ?? 0;
|
|
600
|
+
avgDaysSinceGroom = Math.round((totalSeconds / groomedEntries / 86400) * 100) / 100;
|
|
601
|
+
}
|
|
602
|
+
return {
|
|
603
|
+
totalEntries,
|
|
604
|
+
groomedEntries,
|
|
605
|
+
ungroomedEntries,
|
|
606
|
+
staleEntries,
|
|
607
|
+
freshEntries,
|
|
608
|
+
avgDaysSinceGroom,
|
|
609
|
+
};
|
|
610
|
+
}
|
|
611
|
+
// ─── Metadata Enrichment ──────────────────────────────────────
|
|
612
|
+
enrichMetadata(entryId) {
|
|
613
|
+
const entry = this.vault.get(entryId);
|
|
614
|
+
if (!entry)
|
|
615
|
+
return { enriched: false, changes: [] };
|
|
616
|
+
const changes = [];
|
|
617
|
+
const updates = {};
|
|
618
|
+
// Auto-capitalize title
|
|
619
|
+
if (entry.title.length > 0 && entry.title[0] !== entry.title[0].toUpperCase()) {
|
|
620
|
+
const capitalized = entry.title[0].toUpperCase() + entry.title.slice(1);
|
|
621
|
+
changes.push({ field: 'title', before: entry.title, after: capitalized });
|
|
622
|
+
updates.title = capitalized;
|
|
623
|
+
}
|
|
624
|
+
// Normalize tags: lowercase, trim, dedup
|
|
625
|
+
const normalizedTags = [...new Set(entry.tags.map((t) => t.toLowerCase().trim()))];
|
|
626
|
+
const tagsChanged = normalizedTags.length !== entry.tags.length ||
|
|
627
|
+
normalizedTags.some((t, i) => t !== entry.tags[i]);
|
|
628
|
+
if (tagsChanged) {
|
|
629
|
+
changes.push({
|
|
630
|
+
field: 'tags',
|
|
631
|
+
before: JSON.stringify(entry.tags),
|
|
632
|
+
after: JSON.stringify(normalizedTags),
|
|
633
|
+
});
|
|
634
|
+
updates.tags = normalizedTags;
|
|
635
|
+
}
|
|
636
|
+
// Infer severity from keywords if currently 'suggestion'
|
|
637
|
+
if (entry.severity === 'suggestion') {
|
|
638
|
+
const text = (entry.title + ' ' + entry.description).toLowerCase();
|
|
639
|
+
const criticalKeywords = ['never', 'must not', 'critical', 'security', 'vulnerability'];
|
|
640
|
+
const warningKeywords = ['avoid', 'should not', 'deprecated', 'careful', 'warning'];
|
|
641
|
+
if (criticalKeywords.some((k) => text.includes(k))) {
|
|
642
|
+
changes.push({ field: 'severity', before: entry.severity, after: 'critical' });
|
|
643
|
+
updates.severity = 'critical';
|
|
644
|
+
}
|
|
645
|
+
else if (warningKeywords.some((k) => text.includes(k))) {
|
|
646
|
+
changes.push({ field: 'severity', before: entry.severity, after: 'warning' });
|
|
647
|
+
updates.severity = 'warning';
|
|
648
|
+
}
|
|
649
|
+
}
|
|
650
|
+
// Infer type from title patterns
|
|
651
|
+
if (entry.type === 'pattern') {
|
|
652
|
+
const titleLower = entry.title.toLowerCase();
|
|
653
|
+
if (titleLower.startsWith('avoid') ||
|
|
654
|
+
titleLower.startsWith('never') ||
|
|
655
|
+
titleLower.startsWith("don't") ||
|
|
656
|
+
titleLower.startsWith('do not')) {
|
|
657
|
+
changes.push({ field: 'type', before: entry.type, after: 'anti-pattern' });
|
|
658
|
+
updates.type = 'anti-pattern';
|
|
659
|
+
}
|
|
660
|
+
}
|
|
661
|
+
// Trim whitespace from description
|
|
662
|
+
const trimmed = entry.description.trim();
|
|
663
|
+
if (trimmed !== entry.description) {
|
|
664
|
+
changes.push({ field: 'description', before: entry.description, after: trimmed });
|
|
665
|
+
updates.description = trimmed;
|
|
666
|
+
}
|
|
667
|
+
if (changes.length === 0) {
|
|
668
|
+
return { enriched: false, changes: [] };
|
|
669
|
+
}
|
|
670
|
+
// Apply updates
|
|
671
|
+
this.vault.update(entryId, updates);
|
|
672
|
+
// Record snapshot
|
|
673
|
+
this.recordSnapshot(entryId, 'curator', 'Metadata enrichment');
|
|
674
|
+
// Log change
|
|
675
|
+
this.logChange('enrich_metadata', entryId, JSON.stringify(changes.map((c) => c.field)), JSON.stringify(changes.map((c) => c.after)), 'Rule-based metadata enrichment');
|
|
676
|
+
return { enriched: true, changes };
|
|
677
|
+
}
|
|
480
678
|
// ─── Private Helpers ────────────────────────────────────────────
|
|
481
679
|
buildVocabulary(entries) {
|
|
482
680
|
const docCount = entries.length;
|