@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
|
@@ -1,24 +1,31 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Vault facade — knowledge management ops.
|
|
3
|
-
* search, CRUD,
|
|
3
|
+
* search, CRUD, capture, sharing scope.
|
|
4
4
|
* Archival and lifecycle ops are in archive-facade.ts.
|
|
5
5
|
* Sync ops (git, obsidian, packs) are in sync-facade.ts.
|
|
6
6
|
* Review ops are in review-facade.ts.
|
|
7
|
+
*
|
|
8
|
+
* Backward-compat stubs are appended at the end for ops that moved
|
|
9
|
+
* to new facades, so existing agents/CLAUDE.md files keep working.
|
|
7
10
|
*/
|
|
8
11
|
|
|
9
12
|
import { z } from 'zod';
|
|
10
13
|
import type { OpDefinition } from '../../facades/types.js';
|
|
11
14
|
import type { IntelligenceEntry } from '../../intelligence/types.js';
|
|
12
|
-
import type { VaultTier } from '../../vault/vault-types.js';
|
|
13
15
|
import type { AgentRuntime } from '../types.js';
|
|
14
16
|
import { createVaultExtraOps } from '../vault-extra-ops.js';
|
|
15
17
|
import { createCaptureOps } from '../capture-ops.js';
|
|
16
|
-
import { createIntakeOps } from '../intake-ops.js';
|
|
17
18
|
import { createVaultSharingOps } from '../vault-sharing-ops.js';
|
|
19
|
+
import { createArchiveOps } from '../archive-ops.js';
|
|
20
|
+
import { createSyncOps } from '../sync-ops.js';
|
|
21
|
+
import { createReviewOps } from '../review-ops.js';
|
|
18
22
|
import { createVaultLinkingOps } from '../vault-linking-ops.js';
|
|
23
|
+
import { createBranchingOps } from '../branching-ops.js';
|
|
24
|
+
import { createTierOps } from '../tier-ops.js';
|
|
25
|
+
import { deprecationWarning } from '../deprecation.js';
|
|
19
26
|
|
|
20
27
|
export function createVaultFacadeOps(runtime: AgentRuntime): OpDefinition[] {
|
|
21
|
-
const { vault, brain
|
|
28
|
+
const { vault, brain } = runtime;
|
|
22
29
|
|
|
23
30
|
return [
|
|
24
31
|
// ─── Search / Vault (inline from core-ops.ts) ───────────────
|
|
@@ -101,9 +108,21 @@ export function createVaultFacadeOps(runtime: AgentRuntime): OpDefinition[] {
|
|
|
101
108
|
return entries;
|
|
102
109
|
}
|
|
103
110
|
// Return lightweight summaries to reduce response size
|
|
104
|
-
return (
|
|
105
|
-
|
|
106
|
-
|
|
111
|
+
return (
|
|
112
|
+
entries as Array<{
|
|
113
|
+
id: string;
|
|
114
|
+
title: string;
|
|
115
|
+
type: string;
|
|
116
|
+
domain: string;
|
|
117
|
+
tags?: string[];
|
|
118
|
+
}>
|
|
119
|
+
).map((e) => ({
|
|
120
|
+
id: e.id,
|
|
121
|
+
title: e.title,
|
|
122
|
+
type: e.type,
|
|
123
|
+
domain: e.domain,
|
|
124
|
+
tags: e.tags ?? [],
|
|
125
|
+
}));
|
|
107
126
|
},
|
|
108
127
|
},
|
|
109
128
|
{
|
|
@@ -253,201 +272,38 @@ export function createVaultFacadeOps(runtime: AgentRuntime): OpDefinition[] {
|
|
|
253
272
|
},
|
|
254
273
|
},
|
|
255
274
|
|
|
256
|
-
// ─── Multi-vault ops ────────────────────────────────────────
|
|
257
|
-
{
|
|
258
|
-
name: 'vault_connect',
|
|
259
|
-
description:
|
|
260
|
-
'Connect an additional vault tier (project or team). Opens a separate SQLite database.',
|
|
261
|
-
auth: 'admin',
|
|
262
|
-
schema: z.object({
|
|
263
|
-
tier: z.enum(['project', 'team']).describe('Vault tier to connect'),
|
|
264
|
-
path: z.string().describe('Path to the SQLite database file'),
|
|
265
|
-
}),
|
|
266
|
-
handler: async (params) => {
|
|
267
|
-
const tier = params.tier as VaultTier;
|
|
268
|
-
const path = params.path as string;
|
|
269
|
-
vaultManager.open(tier, path);
|
|
270
|
-
return { connected: true, tier, path };
|
|
271
|
-
},
|
|
272
|
-
},
|
|
273
|
-
{
|
|
274
|
-
name: 'vault_disconnect',
|
|
275
|
-
description: 'Disconnect a vault tier. Cannot disconnect the agent tier.',
|
|
276
|
-
auth: 'admin',
|
|
277
|
-
schema: z.object({
|
|
278
|
-
tier: z.enum(['project', 'team']).describe('Vault tier to disconnect'),
|
|
279
|
-
}),
|
|
280
|
-
handler: async (params) => {
|
|
281
|
-
const tier = params.tier as VaultTier;
|
|
282
|
-
const removed = vaultManager.disconnect(tier);
|
|
283
|
-
return { disconnected: removed, tier };
|
|
284
|
-
},
|
|
285
|
-
},
|
|
286
|
-
{
|
|
287
|
-
name: 'vault_tiers',
|
|
288
|
-
description: 'List all vault tiers with connection status and entry counts.',
|
|
289
|
-
auth: 'read',
|
|
290
|
-
handler: async () => {
|
|
291
|
-
return { tiers: vaultManager.listTiers() };
|
|
292
|
-
},
|
|
293
|
-
},
|
|
294
|
-
{
|
|
295
|
-
name: 'vault_search_all',
|
|
296
|
-
description:
|
|
297
|
-
'Search across all connected vault tiers with priority-weighted cascading. Agent tier results ranked highest.',
|
|
298
|
-
auth: 'read',
|
|
299
|
-
schema: z.object({
|
|
300
|
-
query: z.string(),
|
|
301
|
-
limit: z.number().optional(),
|
|
302
|
-
}),
|
|
303
|
-
handler: async (params) => {
|
|
304
|
-
const results = vaultManager.search(params.query as string, (params.limit as number) ?? 20);
|
|
305
|
-
return { results, count: results.length };
|
|
306
|
-
},
|
|
307
|
-
},
|
|
308
|
-
|
|
309
|
-
// ─── Named vault connections ────────────────────────────────
|
|
310
|
-
{
|
|
311
|
-
name: 'vault_connect_source',
|
|
312
|
-
description:
|
|
313
|
-
'Connect a named vault source (e.g., shared team knowledge base) with a configurable search priority.',
|
|
314
|
-
auth: 'admin',
|
|
315
|
-
schema: z.object({
|
|
316
|
-
name: z.string().describe('Unique name for this vault connection'),
|
|
317
|
-
path: z.string().describe('Path to the SQLite database file'),
|
|
318
|
-
priority: z
|
|
319
|
-
.number()
|
|
320
|
-
.min(0)
|
|
321
|
-
.max(2)
|
|
322
|
-
.optional()
|
|
323
|
-
.describe('Search priority weight (default: 0.5)'),
|
|
324
|
-
}),
|
|
325
|
-
handler: async (params) => {
|
|
326
|
-
const name = params.name as string;
|
|
327
|
-
const path = params.path as string;
|
|
328
|
-
const priority = (params.priority as number) ?? 0.5;
|
|
329
|
-
vaultManager.connect(name, path, priority);
|
|
330
|
-
return { connected: true, name, path, priority };
|
|
331
|
-
},
|
|
332
|
-
},
|
|
333
|
-
{
|
|
334
|
-
name: 'vault_disconnect_source',
|
|
335
|
-
description: 'Disconnect a named vault source.',
|
|
336
|
-
auth: 'admin',
|
|
337
|
-
schema: z.object({
|
|
338
|
-
name: z.string().describe('Name of the vault connection to remove'),
|
|
339
|
-
}),
|
|
340
|
-
handler: async (params) => {
|
|
341
|
-
const name = params.name as string;
|
|
342
|
-
const removed = vaultManager.disconnectNamed(name);
|
|
343
|
-
return { disconnected: removed, name };
|
|
344
|
-
},
|
|
345
|
-
},
|
|
346
|
-
{
|
|
347
|
-
name: 'vault_list_sources',
|
|
348
|
-
description: 'List all dynamically connected vault sources with their priorities.',
|
|
349
|
-
auth: 'read',
|
|
350
|
-
handler: async () => {
|
|
351
|
-
return { sources: vaultManager.listConnected() };
|
|
352
|
-
},
|
|
353
|
-
},
|
|
354
|
-
|
|
355
|
-
// ─── Branching ─────────────────────────────────────────────
|
|
356
|
-
{
|
|
357
|
-
name: 'vault_branch',
|
|
358
|
-
description:
|
|
359
|
-
'Create a named vault branch for experimentation. Changes can be reviewed and merged later.',
|
|
360
|
-
auth: 'write',
|
|
361
|
-
schema: z.object({
|
|
362
|
-
name: z.string().describe('Unique branch name'),
|
|
363
|
-
}),
|
|
364
|
-
handler: async (params) => {
|
|
365
|
-
const { vaultBranching } = runtime;
|
|
366
|
-
try {
|
|
367
|
-
vaultBranching.branch(params.name as string);
|
|
368
|
-
return { created: true, name: params.name };
|
|
369
|
-
} catch (err) {
|
|
370
|
-
return { error: (err as Error).message };
|
|
371
|
-
}
|
|
372
|
-
},
|
|
373
|
-
},
|
|
374
|
-
{
|
|
375
|
-
name: 'vault_branch_add',
|
|
376
|
-
description: 'Add an operation (add/modify/remove) to a vault branch.',
|
|
377
|
-
auth: 'write',
|
|
378
|
-
schema: z.object({
|
|
379
|
-
branchName: z.string().describe('Branch to add the operation to'),
|
|
380
|
-
entryId: z.string().describe('Entry ID'),
|
|
381
|
-
action: z.enum(['add', 'modify', 'remove']).describe('Operation type'),
|
|
382
|
-
entryData: z
|
|
383
|
-
.record(z.unknown())
|
|
384
|
-
.optional()
|
|
385
|
-
.describe('Full entry data (required for add/modify)'),
|
|
386
|
-
}),
|
|
387
|
-
handler: async (params) => {
|
|
388
|
-
const { vaultBranching } = runtime;
|
|
389
|
-
try {
|
|
390
|
-
vaultBranching.addOperation(
|
|
391
|
-
params.branchName as string,
|
|
392
|
-
params.entryId as string,
|
|
393
|
-
params.action as 'add' | 'modify' | 'remove',
|
|
394
|
-
params.entryData as IntelligenceEntry | undefined,
|
|
395
|
-
);
|
|
396
|
-
return {
|
|
397
|
-
added: true,
|
|
398
|
-
branchName: params.branchName,
|
|
399
|
-
entryId: params.entryId,
|
|
400
|
-
action: params.action,
|
|
401
|
-
};
|
|
402
|
-
} catch (err) {
|
|
403
|
-
return { error: (err as Error).message };
|
|
404
|
-
}
|
|
405
|
-
},
|
|
406
|
-
},
|
|
407
|
-
{
|
|
408
|
-
name: 'vault_branch_list',
|
|
409
|
-
description: 'List all vault branches with entry counts and merge status.',
|
|
410
|
-
auth: 'read',
|
|
411
|
-
handler: async () => {
|
|
412
|
-
const { vaultBranching } = runtime;
|
|
413
|
-
return { branches: vaultBranching.listBranches() };
|
|
414
|
-
},
|
|
415
|
-
},
|
|
416
|
-
{
|
|
417
|
-
name: 'vault_merge_branch',
|
|
418
|
-
description: 'Merge a branch into the main vault. Branch entries win on conflict.',
|
|
419
|
-
auth: 'admin',
|
|
420
|
-
schema: z.object({
|
|
421
|
-
branchName: z.string().describe('Branch to merge'),
|
|
422
|
-
}),
|
|
423
|
-
handler: async (params) => {
|
|
424
|
-
const { vaultBranching } = runtime;
|
|
425
|
-
try {
|
|
426
|
-
return vaultBranching.merge(params.branchName as string);
|
|
427
|
-
} catch (err) {
|
|
428
|
-
return { error: (err as Error).message };
|
|
429
|
-
}
|
|
430
|
-
},
|
|
431
|
-
},
|
|
432
|
-
{
|
|
433
|
-
name: 'vault_delete_branch',
|
|
434
|
-
description: 'Delete a vault branch and all its operations.',
|
|
435
|
-
auth: 'admin',
|
|
436
|
-
schema: z.object({
|
|
437
|
-
branchName: z.string().describe('Branch to delete'),
|
|
438
|
-
}),
|
|
439
|
-
handler: async (params) => {
|
|
440
|
-
const { vaultBranching } = runtime;
|
|
441
|
-
const deleted = vaultBranching.deleteBranch(params.branchName as string);
|
|
442
|
-
return { deleted, branchName: params.branchName };
|
|
443
|
-
},
|
|
444
|
-
},
|
|
445
|
-
|
|
446
275
|
// ─── Satellite ops ───────────────────────────────────────────
|
|
447
276
|
...createVaultExtraOps(runtime),
|
|
448
277
|
...createCaptureOps(runtime),
|
|
449
|
-
...createIntakeOps(intakePipeline, textIngester),
|
|
450
278
|
...createVaultSharingOps(runtime),
|
|
451
|
-
|
|
279
|
+
|
|
280
|
+
// ─── Backward-compat stubs for ops that moved to new facades ─
|
|
281
|
+
...deprecateOps(createArchiveOps(runtime), 'archive'),
|
|
282
|
+
...deprecateOps(createSyncOps(runtime), 'sync'),
|
|
283
|
+
...deprecateOps(createReviewOps(runtime), 'review'),
|
|
284
|
+
...deprecateOps(createVaultLinkingOps(runtime), 'links'),
|
|
285
|
+
...deprecateOps(createBranchingOps(runtime), 'branching'),
|
|
286
|
+
...deprecateOps(createTierOps(runtime), 'tier'),
|
|
452
287
|
];
|
|
453
288
|
}
|
|
289
|
+
|
|
290
|
+
// ─── Deprecation wrapper ────────────────────────────────────────────
|
|
291
|
+
|
|
292
|
+
/**
|
|
293
|
+
* Wrap an array of ops with deprecation warnings.
|
|
294
|
+
* Each op's handler logs a one-time warning before forwarding to the real handler.
|
|
295
|
+
*/
|
|
296
|
+
export function deprecateOps(ops: OpDefinition[], newFacade: string): OpDefinition[] {
|
|
297
|
+
return ops.map((op) => ({
|
|
298
|
+
...op,
|
|
299
|
+
handler: async (params: Record<string, unknown>) => {
|
|
300
|
+
deprecationWarning({
|
|
301
|
+
name: op.name,
|
|
302
|
+
since: '0.5.0',
|
|
303
|
+
replacement: `${newFacade}.${op.name}`,
|
|
304
|
+
message: `Op "${op.name}" has moved to the ${newFacade} facade. Update your calls.`,
|
|
305
|
+
});
|
|
306
|
+
return op.handler(params);
|
|
307
|
+
},
|
|
308
|
+
}));
|
|
309
|
+
}
|
|
@@ -102,9 +102,13 @@ export async function getIssueDetails(
|
|
|
102
102
|
const { stdout } = await execFileAsync(
|
|
103
103
|
'gh',
|
|
104
104
|
[
|
|
105
|
-
'issue',
|
|
106
|
-
'
|
|
107
|
-
|
|
105
|
+
'issue',
|
|
106
|
+
'view',
|
|
107
|
+
String(issueNumber),
|
|
108
|
+
'--repo',
|
|
109
|
+
`${owner}/${repo}`,
|
|
110
|
+
'--json',
|
|
111
|
+
'title,body,labels',
|
|
108
112
|
],
|
|
109
113
|
{
|
|
110
114
|
timeout: 10_000,
|
|
@@ -148,11 +152,10 @@ export async function closeIssueWithComment(
|
|
|
148
152
|
['issue', 'comment', String(issueNumber), '--repo', repoSlug, '--body', comment],
|
|
149
153
|
{ timeout: 10_000, signal: AbortSignal.timeout(10_000) },
|
|
150
154
|
);
|
|
151
|
-
await execFileAsync(
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
);
|
|
155
|
+
await execFileAsync('gh', ['issue', 'close', String(issueNumber), '--repo', repoSlug], {
|
|
156
|
+
timeout: 10_000,
|
|
157
|
+
signal: AbortSignal.timeout(10_000),
|
|
158
|
+
});
|
|
156
159
|
} catch {
|
|
157
160
|
// Graceful degradation — gh not available or auth expired
|
|
158
161
|
}
|
|
@@ -11,9 +11,25 @@ function makeMockRuntime() {
|
|
|
11
11
|
score: 82,
|
|
12
12
|
iteration: 1,
|
|
13
13
|
gaps: [
|
|
14
|
-
{
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+
{
|
|
15
|
+
severity: 'major',
|
|
16
|
+
category: 'scope',
|
|
17
|
+
description: 'Missing scope',
|
|
18
|
+
recommendation: 'Add scope',
|
|
19
|
+
location: 'plan.scope',
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
severity: 'minor',
|
|
23
|
+
category: 'detail',
|
|
24
|
+
description: 'Low detail',
|
|
25
|
+
recommendation: 'Add detail',
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
severity: 'critical',
|
|
29
|
+
category: 'risk',
|
|
30
|
+
description: 'No risk analysis',
|
|
31
|
+
recommendation: 'Add risks',
|
|
32
|
+
},
|
|
17
33
|
],
|
|
18
34
|
}),
|
|
19
35
|
getCheckHistory: vi.fn().mockReturnValue([
|
|
@@ -77,7 +93,10 @@ describe('createGradingOps', () => {
|
|
|
77
93
|
it('returns count and checks array', async () => {
|
|
78
94
|
runtime = makeMockRuntime();
|
|
79
95
|
ops = createGradingOps(runtime);
|
|
80
|
-
const result = (await findOp('plan_check_history').handler({ planId: 'p1' })) as Record<
|
|
96
|
+
const result = (await findOp('plan_check_history').handler({ planId: 'p1' })) as Record<
|
|
97
|
+
string,
|
|
98
|
+
unknown
|
|
99
|
+
>;
|
|
81
100
|
expect(result.planId).toBe('p1');
|
|
82
101
|
expect(result.count).toBe(2);
|
|
83
102
|
expect(result.checks).toHaveLength(2);
|
|
@@ -96,7 +115,10 @@ describe('createGradingOps', () => {
|
|
|
96
115
|
runtime = makeMockRuntime();
|
|
97
116
|
(runtime.planner.getLatestCheck as ReturnType<typeof vi.fn>).mockReturnValue(null);
|
|
98
117
|
ops = createGradingOps(runtime);
|
|
99
|
-
const result = (await findOp('plan_latest_check').handler({ planId: 'p1' })) as Record<
|
|
118
|
+
const result = (await findOp('plan_latest_check').handler({ planId: 'p1' })) as Record<
|
|
119
|
+
string,
|
|
120
|
+
unknown
|
|
121
|
+
>;
|
|
100
122
|
expect(result.message).toBe('No checks found for this plan.');
|
|
101
123
|
});
|
|
102
124
|
});
|
|
@@ -115,7 +137,10 @@ describe('createGradingOps', () => {
|
|
|
115
137
|
it('sorts gaps by severity and groups them', async () => {
|
|
116
138
|
runtime = makeMockRuntime();
|
|
117
139
|
ops = createGradingOps(runtime);
|
|
118
|
-
const result = (await findOp('plan_auto_improve').handler({ planId: 'p1' })) as Record<
|
|
140
|
+
const result = (await findOp('plan_auto_improve').handler({ planId: 'p1' })) as Record<
|
|
141
|
+
string,
|
|
142
|
+
unknown
|
|
143
|
+
>;
|
|
119
144
|
expect(result.grade).toBe('B');
|
|
120
145
|
expect(result.score).toBe(82);
|
|
121
146
|
expect(result.totalGaps).toBe(3);
|
|
@@ -130,10 +155,16 @@ describe('createGradingOps', () => {
|
|
|
130
155
|
it('returns approve as nextAction when score >= 90', async () => {
|
|
131
156
|
runtime = makeMockRuntime();
|
|
132
157
|
(runtime.planner.grade as ReturnType<typeof vi.fn>).mockReturnValue({
|
|
133
|
-
grade: 'A',
|
|
158
|
+
grade: 'A',
|
|
159
|
+
score: 92,
|
|
160
|
+
iteration: 3,
|
|
161
|
+
gaps: [],
|
|
134
162
|
});
|
|
135
163
|
ops = createGradingOps(runtime);
|
|
136
|
-
const result = (await findOp('plan_auto_improve').handler({ planId: 'p1' })) as Record<
|
|
164
|
+
const result = (await findOp('plan_auto_improve').handler({ planId: 'p1' })) as Record<
|
|
165
|
+
string,
|
|
166
|
+
unknown
|
|
167
|
+
>;
|
|
137
168
|
expect(result.nextAction).toBe('approve');
|
|
138
169
|
expect(result.totalGaps).toBe(0);
|
|
139
170
|
});
|
|
@@ -51,14 +51,19 @@ describe('createIntakeOps', () => {
|
|
|
51
51
|
it('intake_ingest_book returns error', async () => {
|
|
52
52
|
const ops = createIntakeOps(null);
|
|
53
53
|
const result = (await findOp(ops, 'intake_ingest_book').handler({
|
|
54
|
-
pdfPath: '/test.pdf',
|
|
54
|
+
pdfPath: '/test.pdf',
|
|
55
|
+
title: 'T',
|
|
56
|
+
domain: 'd',
|
|
55
57
|
})) as Record<string, unknown>;
|
|
56
58
|
expect(result.error).toBe('Intake pipeline not configured');
|
|
57
59
|
});
|
|
58
60
|
|
|
59
61
|
it('intake_process returns error', async () => {
|
|
60
62
|
const ops = createIntakeOps(null);
|
|
61
|
-
const result = (await findOp(ops, 'intake_process').handler({ jobId: 'j1' })) as Record<
|
|
63
|
+
const result = (await findOp(ops, 'intake_process').handler({ jobId: 'j1' })) as Record<
|
|
64
|
+
string,
|
|
65
|
+
unknown
|
|
66
|
+
>;
|
|
62
67
|
expect(result.error).toBe('Intake pipeline not configured');
|
|
63
68
|
});
|
|
64
69
|
|
|
@@ -71,7 +76,11 @@ describe('createIntakeOps', () => {
|
|
|
71
76
|
it('intake_preview returns error', async () => {
|
|
72
77
|
const ops = createIntakeOps(null);
|
|
73
78
|
const result = (await findOp(ops, 'intake_preview').handler({
|
|
74
|
-
pdfPath: '/x.pdf',
|
|
79
|
+
pdfPath: '/x.pdf',
|
|
80
|
+
title: 'T',
|
|
81
|
+
domain: 'd',
|
|
82
|
+
pageStart: 1,
|
|
83
|
+
pageEnd: 5,
|
|
75
84
|
})) as Record<string, unknown>;
|
|
76
85
|
expect(result.error).toBe('Intake pipeline not configured');
|
|
77
86
|
});
|
|
@@ -80,14 +89,17 @@ describe('createIntakeOps', () => {
|
|
|
80
89
|
describe('when textIngester is null', () => {
|
|
81
90
|
it('ingest_url returns error', async () => {
|
|
82
91
|
const ops = createIntakeOps(makeMockPipeline() as never, null);
|
|
83
|
-
const result = (await findOp(ops, 'ingest_url').handler({
|
|
92
|
+
const result = (await findOp(ops, 'ingest_url').handler({
|
|
93
|
+
url: 'https://example.com',
|
|
94
|
+
})) as Record<string, unknown>;
|
|
84
95
|
expect(result.error).toContain('Text ingester not configured');
|
|
85
96
|
});
|
|
86
97
|
|
|
87
98
|
it('ingest_text returns error', async () => {
|
|
88
99
|
const ops = createIntakeOps(makeMockPipeline() as never, null);
|
|
89
100
|
const result = (await findOp(ops, 'ingest_text').handler({
|
|
90
|
-
text: 'hello',
|
|
101
|
+
text: 'hello',
|
|
102
|
+
title: 'T',
|
|
91
103
|
})) as Record<string, unknown>;
|
|
92
104
|
expect(result.error).toContain('Text ingester not configured');
|
|
93
105
|
});
|
|
@@ -106,10 +118,20 @@ describe('createIntakeOps', () => {
|
|
|
106
118
|
const pipeline = makeMockPipeline();
|
|
107
119
|
const ops = createIntakeOps(pipeline as never);
|
|
108
120
|
const result = await findOp(ops, 'intake_ingest_book').handler({
|
|
109
|
-
pdfPath: '/book.pdf',
|
|
121
|
+
pdfPath: '/book.pdf',
|
|
122
|
+
title: 'My Book',
|
|
123
|
+
domain: 'design',
|
|
124
|
+
author: 'Author',
|
|
125
|
+
chunkPageSize: 15,
|
|
126
|
+
tags: ['tag1'],
|
|
110
127
|
});
|
|
111
128
|
expect(pipeline.ingestBook).toHaveBeenCalledWith({
|
|
112
|
-
pdfPath: '/book.pdf',
|
|
129
|
+
pdfPath: '/book.pdf',
|
|
130
|
+
title: 'My Book',
|
|
131
|
+
domain: 'design',
|
|
132
|
+
author: 'Author',
|
|
133
|
+
chunkPageSize: 15,
|
|
134
|
+
tags: ['tag1'],
|
|
113
135
|
});
|
|
114
136
|
expect(result).toEqual({ jobId: 'j1', chunks: 5 });
|
|
115
137
|
});
|
|
@@ -128,7 +150,10 @@ describe('createIntakeOps', () => {
|
|
|
128
150
|
it('returns job and chunks when jobId provided', async () => {
|
|
129
151
|
const pipeline = makeMockPipeline();
|
|
130
152
|
const ops = createIntakeOps(pipeline as never);
|
|
131
|
-
const result = (await findOp(ops, 'intake_status').handler({ jobId: 'j1' })) as Record<
|
|
153
|
+
const result = (await findOp(ops, 'intake_status').handler({ jobId: 'j1' })) as Record<
|
|
154
|
+
string,
|
|
155
|
+
unknown
|
|
156
|
+
>;
|
|
132
157
|
expect(result.job).toEqual({ id: 'j1', status: 'active' });
|
|
133
158
|
expect(result.chunks).toHaveLength(2);
|
|
134
159
|
});
|
|
@@ -137,7 +162,10 @@ describe('createIntakeOps', () => {
|
|
|
137
162
|
const pipeline = makeMockPipeline();
|
|
138
163
|
pipeline.getJob.mockReturnValue(null);
|
|
139
164
|
const ops = createIntakeOps(pipeline as never);
|
|
140
|
-
const result = (await findOp(ops, 'intake_status').handler({ jobId: 'missing' })) as Record<
|
|
165
|
+
const result = (await findOp(ops, 'intake_status').handler({ jobId: 'missing' })) as Record<
|
|
166
|
+
string,
|
|
167
|
+
unknown
|
|
168
|
+
>;
|
|
141
169
|
expect(result.error).toContain('Job not found');
|
|
142
170
|
});
|
|
143
171
|
|
|
@@ -154,10 +182,16 @@ describe('createIntakeOps', () => {
|
|
|
154
182
|
const pipeline = makeMockPipeline();
|
|
155
183
|
const ops = createIntakeOps(pipeline as never);
|
|
156
184
|
await findOp(ops, 'intake_preview').handler({
|
|
157
|
-
pdfPath: '/x.pdf',
|
|
185
|
+
pdfPath: '/x.pdf',
|
|
186
|
+
title: 'T',
|
|
187
|
+
domain: 'd',
|
|
188
|
+
pageStart: 1,
|
|
189
|
+
pageEnd: 10,
|
|
158
190
|
});
|
|
159
191
|
expect(pipeline.preview).toHaveBeenCalledWith(
|
|
160
|
-
{ pdfPath: '/x.pdf', title: 'T', domain: 'd' },
|
|
192
|
+
{ pdfPath: '/x.pdf', title: 'T', domain: 'd' },
|
|
193
|
+
1,
|
|
194
|
+
10,
|
|
161
195
|
);
|
|
162
196
|
});
|
|
163
197
|
});
|
|
@@ -167,9 +201,14 @@ describe('createIntakeOps', () => {
|
|
|
167
201
|
const ingester = makeMockTextIngester();
|
|
168
202
|
const ops = createIntakeOps(makeMockPipeline() as never, ingester as never);
|
|
169
203
|
const result = await findOp(ops, 'ingest_url').handler({
|
|
170
|
-
url: 'https://example.com',
|
|
204
|
+
url: 'https://example.com',
|
|
205
|
+
domain: 'test',
|
|
206
|
+
tags: ['t1'],
|
|
207
|
+
});
|
|
208
|
+
expect(ingester.ingestUrl).toHaveBeenCalledWith('https://example.com', {
|
|
209
|
+
domain: 'test',
|
|
210
|
+
tags: ['t1'],
|
|
171
211
|
});
|
|
172
|
-
expect(ingester.ingestUrl).toHaveBeenCalledWith('https://example.com', { domain: 'test', tags: ['t1'] });
|
|
173
212
|
expect(result).toEqual({ ingested: 3, duplicates: 1 });
|
|
174
213
|
});
|
|
175
214
|
});
|
|
@@ -179,7 +218,13 @@ describe('createIntakeOps', () => {
|
|
|
179
218
|
const ingester = makeMockTextIngester();
|
|
180
219
|
const ops = createIntakeOps(makeMockPipeline() as never, ingester as never);
|
|
181
220
|
await findOp(ops, 'ingest_text').handler({
|
|
182
|
-
text: 'content',
|
|
221
|
+
text: 'content',
|
|
222
|
+
title: 'My Notes',
|
|
223
|
+
sourceType: 'transcript',
|
|
224
|
+
url: 'https://x.com',
|
|
225
|
+
author: 'A',
|
|
226
|
+
domain: 'd',
|
|
227
|
+
tags: ['t'],
|
|
183
228
|
});
|
|
184
229
|
expect(ingester.ingestText).toHaveBeenCalledWith(
|
|
185
230
|
'content',
|
|
@@ -200,8 +245,16 @@ describe('createIntakeOps', () => {
|
|
|
200
245
|
],
|
|
201
246
|
});
|
|
202
247
|
expect(ingester.ingestBatch).toHaveBeenCalledWith([
|
|
203
|
-
{
|
|
204
|
-
|
|
248
|
+
{
|
|
249
|
+
text: 'a',
|
|
250
|
+
source: { type: 'article', title: 'A', url: undefined, author: undefined },
|
|
251
|
+
opts: { domain: 'x', tags: undefined },
|
|
252
|
+
},
|
|
253
|
+
{
|
|
254
|
+
text: 'b',
|
|
255
|
+
source: { type: 'notes', title: 'B', url: undefined, author: undefined },
|
|
256
|
+
opts: { domain: undefined, tags: undefined },
|
|
257
|
+
},
|
|
205
258
|
]);
|
|
206
259
|
});
|
|
207
260
|
});
|
|
@@ -61,9 +61,15 @@ describe('createLoopOps', () => {
|
|
|
61
61
|
ops = createLoopOps(runtime);
|
|
62
62
|
const names = ops.map((o) => o.name);
|
|
63
63
|
expect(names).toEqual([
|
|
64
|
-
'loop_start',
|
|
65
|
-
'
|
|
66
|
-
'
|
|
64
|
+
'loop_start',
|
|
65
|
+
'loop_iterate',
|
|
66
|
+
'loop_iterate_gate',
|
|
67
|
+
'loop_status',
|
|
68
|
+
'loop_cancel',
|
|
69
|
+
'loop_history',
|
|
70
|
+
'loop_is_active',
|
|
71
|
+
'loop_complete',
|
|
72
|
+
'loop_anomaly_check',
|
|
67
73
|
]);
|
|
68
74
|
});
|
|
69
75
|
|
|
@@ -72,7 +78,8 @@ describe('createLoopOps', () => {
|
|
|
72
78
|
runtime = makeMockRuntime();
|
|
73
79
|
ops = createLoopOps(runtime);
|
|
74
80
|
const result = (await findOp('loop_start').handler({
|
|
75
|
-
mode: 'custom',
|
|
81
|
+
mode: 'custom',
|
|
82
|
+
prompt: 'fix the thing',
|
|
76
83
|
})) as Record<string, unknown>;
|
|
77
84
|
|
|
78
85
|
expect(runtime.loop.startLoop).toHaveBeenCalledWith(
|
|
@@ -108,7 +115,8 @@ describe('createLoopOps', () => {
|
|
|
108
115
|
runtime = makeMockRuntime();
|
|
109
116
|
ops = createLoopOps(runtime);
|
|
110
117
|
const result = (await findOp('loop_iterate').handler({
|
|
111
|
-
passed: false,
|
|
118
|
+
passed: false,
|
|
119
|
+
validationScore: 70,
|
|
112
120
|
})) as Record<string, unknown>;
|
|
113
121
|
|
|
114
122
|
expect(result.iteration).toBe(1);
|
|
@@ -232,7 +240,9 @@ describe('createLoopOps', () => {
|
|
|
232
240
|
const result = (await findOp('loop_anomaly_check').handler({})) as Record<string, unknown>;
|
|
233
241
|
expect(result.active).toBe(true);
|
|
234
242
|
expect(result.hasAnomalies).toBe(true);
|
|
235
|
-
expect((result.anomalies as string[]).some((a) => a.includes('consecutive failing'))).toBe(
|
|
243
|
+
expect((result.anomalies as string[]).some((a) => a.includes('consecutive failing'))).toBe(
|
|
244
|
+
true,
|
|
245
|
+
);
|
|
236
246
|
});
|
|
237
247
|
});
|
|
238
248
|
});
|