moflo 4.11.7 → 4.11.9
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/.claude/guidance/shipped/moflo-cli-reference.md +7 -7
- package/.claude/guidance/shipped/moflo-guidance-rules.md +2 -2
- package/.claude/helpers/statusline.cjs +4 -1
- package/.claude/skills/fl/phases.md +8 -0
- package/.claude/skills/fl/ticket.md +33 -11
- package/README.md +2 -2
- package/dist/src/cli/aidefence/domain/services/threat-learning-service.js +2 -2
- package/dist/src/cli/aidefence/index.js +1 -1
- package/dist/src/cli/commands/agent.js +1 -13
- package/dist/src/cli/commands/embeddings.js +4 -4
- package/dist/src/cli/commands/epic.js +41 -6
- package/dist/src/cli/commands/hooks.js +7 -35
- package/dist/src/cli/commands/init.js +1 -1
- package/dist/src/cli/commands/memory.js +3 -4
- package/dist/src/cli/commands/neural.js +2 -2
- package/dist/src/cli/commands/performance.js +7 -7
- package/dist/src/cli/commands/status.js +3 -15
- package/dist/src/cli/commands/swarm.js +6 -6
- package/dist/src/cli/epic/detection.js +56 -1
- package/dist/src/cli/epic/index.js +1 -1
- package/dist/src/cli/hooks/reasoningbank/guidance-provider.js +4 -4
- package/dist/src/cli/hooks/reasoningbank/index.js +2 -2
- package/dist/src/cli/hooks/statusline/index.js +7 -9
- package/dist/src/cli/index.js +2 -2
- package/dist/src/cli/init/executor.js +7 -7
- package/dist/src/cli/mcp-tools/aidefence-moflodb-store.js +1 -1
- package/dist/src/cli/mcp-tools/hooks-tools.js +5 -6
- package/dist/src/cli/mcp-tools/memory-tools.js +1 -1
- package/dist/src/cli/memory/entries-read.js +2 -2
- package/dist/src/cli/memory/hnsw-index.js +1 -1
- package/dist/src/cli/memory/hnsw-singleton.js +2 -2
- package/dist/src/cli/memory/index.js +1 -1
- package/dist/src/cli/memory/moflo-db-adapter.js +2 -2
- package/dist/src/cli/memory/types.js +1 -1
- package/dist/src/cli/movector/vector-db.js +1 -1
- package/dist/src/cli/neural/reasoning-bank.js +1 -1
- package/dist/src/cli/swarm/attention-coordinator.js +2 -17
- package/dist/src/cli/swarm/coordination/agent-registry.js +2 -2
- package/dist/src/cli/swarm/coordination/swarm-hub.js +8 -8
- package/dist/src/cli/version.js +1 -1
- package/package.json +2 -2
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
| `init` | 4 | Project initialization with wizard, presets, skills, hooks |
|
|
14
14
|
| `agent` | 8 | Agent lifecycle (spawn, list, status, stop, metrics, pool, health, logs) |
|
|
15
15
|
| `swarm` | 6 | Multi-agent swarm coordination and orchestration |
|
|
16
|
-
| `memory` | 11 | node:sqlite + HNSW vector search
|
|
16
|
+
| `memory` | 11 | node:sqlite + HNSW approximate-nearest-neighbor vector search |
|
|
17
17
|
| `mcp` | 9 | MCP server management and tool execution |
|
|
18
18
|
| `task` | 6 | Task creation, assignment, and lifecycle |
|
|
19
19
|
| `session` | 7 | Session state management and persistence |
|
|
@@ -174,12 +174,12 @@ a real findings UI, not a default-on background task.
|
|
|
174
174
|
|
|
175
175
|
## RuVector Integration (HNSW Vector Search)
|
|
176
176
|
|
|
177
|
-
| Feature |
|
|
178
|
-
|
|
179
|
-
| **HNSW Index** |
|
|
180
|
-
| **MicroLoRA** |
|
|
181
|
-
| **FlashAttention** |
|
|
182
|
-
| **Int8 Quantization** |
|
|
177
|
+
| Feature | Description |
|
|
178
|
+
|---------|-------------|
|
|
179
|
+
| **HNSW Index** | Hierarchical Navigable Small World approximate-nearest-neighbor search — scales sub-linearly as the index grows, vs. a brute-force linear scan |
|
|
180
|
+
| **MicroLoRA** | Lightweight rank-2 weight adaptation from successful patterns, without full retraining |
|
|
181
|
+
| **FlashAttention** | Memory-efficient attention computation |
|
|
182
|
+
| **Int8 Quantization** | Compressed 8-bit weight storage to reduce memory footprint |
|
|
183
183
|
|
|
184
184
|
---
|
|
185
185
|
|
|
@@ -14,8 +14,8 @@ Claude processes guidance as part of a large context window alongside code, tool
|
|
|
14
14
|
|
|
15
15
|
```markdown
|
|
16
16
|
## Good
|
|
17
|
-
**Always search memory before Glob/Grep.**
|
|
18
|
-
|
|
17
|
+
**Always search memory before Glob/Grep.** It returns domain-aware semantic matches
|
|
18
|
+
from a prebuilt index that Glob cannot — one lookup, not a fresh filesystem scan.
|
|
19
19
|
|
|
20
20
|
## Bad
|
|
21
21
|
Memory search uses HNSW indexing with domain-aware embeddings that provide much better
|
|
@@ -773,6 +773,10 @@ function generateStatusline() {
|
|
|
773
773
|
function generateDashboard() {
|
|
774
774
|
const git = getGitInfo();
|
|
775
775
|
const session = getSessionStats();
|
|
776
|
+
// Hoisted to function scope: the embeddings block below also reads `system`,
|
|
777
|
+
// so it must not be scoped inside the show_swarm branch (fixed a ReferenceError
|
|
778
|
+
// when the swarm line was toggled off / the block ordering changed).
|
|
779
|
+
const system = getSystemMetrics();
|
|
776
780
|
const lines = [];
|
|
777
781
|
|
|
778
782
|
// Header: branding + dir + git
|
|
@@ -808,7 +812,6 @@ function generateDashboard() {
|
|
|
808
812
|
// Swarm line (if enabled)
|
|
809
813
|
if (SL_CONFIG.show_swarm) {
|
|
810
814
|
const swarm = getSwarmStatus();
|
|
811
|
-
const system = getSystemMetrics();
|
|
812
815
|
const swarmInd = swarm.coordinationActive ? `${c.brightGreen}\u25C9${c.reset}` : `${c.dim}\u25CB${c.reset}`;
|
|
813
816
|
const agentsColor = swarm.activeAgents > 0 ? c.brightGreen : c.red;
|
|
814
817
|
lines.push(
|
|
@@ -224,6 +224,14 @@ gh issue edit <issue-number> --remove-label "in-progress" --add-label "ready-for
|
|
|
224
224
|
gh issue comment <issue-number> --body "PR created: <pr-url>"
|
|
225
225
|
```
|
|
226
226
|
|
|
227
|
+
If the story body carries an `Epic: #<n>` back-reference (decomposition writes it — `./ticket.md`) **and** `--epic-branch` is not set, sync the parent epic — check this story's box off and close the epic if it was the last:
|
|
228
|
+
|
|
229
|
+
```bash
|
|
230
|
+
flo epic checkoff <epic-number> <story-number>
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
Idempotent and safe to skip when there is no back-reference. `--epic-branch` runs skip it — the epic orchestrator owns checklist state there. The box flips when the work is delivered (PR opened), matching the orchestrator; if a PR is later rejected, reopen the epic manually.
|
|
234
|
+
|
|
227
235
|
### 5.5 Finalize run record (Flo Runs dashboard)
|
|
228
236
|
|
|
229
237
|
Update the tasklist row written in Phase 0 with the terminal status. Same `runId`, `upsert: true`. On success:
|
|
@@ -35,25 +35,47 @@ When promoting to epic:
|
|
|
35
35
|
2. Each story should be completable in a single PR.
|
|
36
36
|
3. Stories should have clear boundaries (one concern per story).
|
|
37
37
|
4. Order stories by dependency (independent ones first).
|
|
38
|
-
5.
|
|
39
|
-
6.
|
|
38
|
+
5. Establish the epic issue **first** so its number exists before the stories do (either the promoted parent issue or a freshly created epic).
|
|
39
|
+
6. Create each story as a GitHub issue with its own Description, Acceptance Criteria, Test Cases, **and an `Epic: #<epic-number>` back-reference line at the top of the body**.
|
|
40
|
+
7. Fill in the epic's `## Stories` checklist with a `- [ ] #<story-number>` line for every story.
|
|
41
|
+
|
|
42
|
+
The **back-reference is load-bearing**, not decoration: a story is usually worked on later via a standalone `/flo <story>` run, not through `flo epic run`. That standalone run reads the `Epic: #<n>` line to find its parent, check its box off, and close the epic when it is the last story. Without the back-reference the epic silently drifts out of sync — the exact miss this step exists to prevent. See `./phases.md` Phase 5.6.
|
|
40
43
|
|
|
41
44
|
## Epic decomposition (score >= 7)
|
|
42
45
|
|
|
46
|
+
The order matters: the epic must exist before the stories so each story can carry the `Epic: #<n>` back-reference, and the epic's checklist is filled in last.
|
|
47
|
+
|
|
48
|
+
Pass multi-line bodies as a single literal `--body "..."` string (portable — no `printf`/heredoc, which are not guaranteed on every consumer OS; Rule #1). For very large bodies write the text to a file with the Write tool and use `--body-file <path>`.
|
|
49
|
+
|
|
43
50
|
```bash
|
|
44
|
-
# Step 1:
|
|
45
|
-
|
|
46
|
-
|
|
51
|
+
# Step 1: establish the epic issue and capture its number (EPIC).
|
|
52
|
+
# Promoting an existing issue — it *is* the epic; add the label now:
|
|
53
|
+
gh issue edit <parent-number> --add-label "epic" # EPIC = <parent-number>
|
|
54
|
+
# Or create a fresh epic with an empty Stories section:
|
|
55
|
+
gh issue create --title "Epic: <title>" --label "epic" --body "<## Overview + empty ## Stories section>"
|
|
56
|
+
# capture EPIC = the epic issue number from whichever path above
|
|
57
|
+
|
|
58
|
+
# Step 2: create each story WITH the Epic back-reference as the first line; capture each number.
|
|
59
|
+
# (repeat for all stories, typically 2–6)
|
|
60
|
+
gh issue create --title "Story: <story-title>" --label "story" --body "<Epic: #<EPIC> + ## Description + ## Acceptance Criteria + ## Suggested Test Cases>"
|
|
61
|
+
|
|
62
|
+
# Step 3: fill the epic's ## Stories checklist with a - [ ] #<story> line per story.
|
|
63
|
+
gh issue edit <EPIC> --body "<epic body with the ## Stories checklist filled in>"
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
**Story body format** — the first line is the back-reference; the standalone `/flo <story>` run (`./phases.md` Phase 5.6) parses `Epic: #<n>` from it:
|
|
47
67
|
|
|
48
|
-
|
|
68
|
+
```markdown
|
|
69
|
+
Epic: #<epic-number>
|
|
49
70
|
|
|
50
|
-
|
|
71
|
+
## Description
|
|
72
|
+
<what and why>
|
|
51
73
|
|
|
52
|
-
|
|
53
|
-
|
|
74
|
+
## Acceptance Criteria
|
|
75
|
+
- [ ] ...
|
|
54
76
|
|
|
55
|
-
|
|
56
|
-
|
|
77
|
+
## Suggested Test Cases
|
|
78
|
+
- ...
|
|
57
79
|
```
|
|
58
80
|
|
|
59
81
|
**Epic body format** — the `## Stories` checklist with `- [ ] #<number>` is what enables epic detection, story extraction, and progress tracking:
|
package/README.md
CHANGED
|
@@ -49,7 +49,7 @@ MoFlo makes deliberate choices so you don't have to:
|
|
|
49
49
|
- **Neural embeddings by default** — 384-dimensional embeddings using `all-MiniLM-L6-v2`. No hash fallback, no peer-optional setup, no install prompts — real semantic search works out of the box. A `postinstall` step trims the embedding runtime to your platform and strips GPU-only libraries the runtime never loads, reclaiming roughly 340 MB on Linux and 150 MB on Windows from a fresh install. Set `MOFLO_NO_PRUNE=1` to skip the trim, or `ONNXRUNTIME_NODE_INSTALL_CUDA=true` to keep CUDA GPU support.
|
|
50
50
|
- **Full learning stack wired up OOTB** — All configured and functional from `flo init`, no manual setup:
|
|
51
51
|
- **SONA** (Self-Optimizing Neural Architecture) — learns from task trajectories
|
|
52
|
-
- **MicroLoRA** — fast rank-2 weight adaptations
|
|
52
|
+
- **MicroLoRA** — fast rank-2 weight adaptations from successful patterns
|
|
53
53
|
- **EWC++** (Elastic Weight Consolidation) — prevents catastrophic forgetting across sessions
|
|
54
54
|
- **HNSW Vector Search** — fast nearest-neighbor search over your knowledge base
|
|
55
55
|
- **Semantic Routing** — maps tasks to the right agent via learned patterns (ReasoningBank)
|
|
@@ -751,7 +751,7 @@ These are the backend systems that hooks and commands interact with.
|
|
|
751
751
|
| **Semantic Routing** | Matches task descriptions to agent types using vector similarity against 12 built-in patterns | Routes work to the right specialist (security-architect, tester, coder, etc.) automatically | Yes |
|
|
752
752
|
| **Learned Routing** | Records task outcomes (agent type + success/failure) and feeds them back into routing | Routing gets smarter over time — successful patterns are weighted higher in future recommendations | Yes |
|
|
753
753
|
| **SONA Learning** | Self-Optimizing Neural Architecture that learns from task trajectories | Adapts routing weights based on actual outcomes, not just keyword matching | Yes |
|
|
754
|
-
| **MicroLoRA Adaptation** | Rank-2 LoRA weight updates from successful patterns
|
|
754
|
+
| **MicroLoRA Adaptation** | Rank-2 LoRA weight updates from successful patterns | Fine-grained model adaptation without full retraining | Yes |
|
|
755
755
|
| **EWC++ Consolidation** | Elastic Weight Consolidation that prevents catastrophic forgetting | New learning doesn't overwrite patterns from earlier sessions | Yes |
|
|
756
756
|
| **Session Persistence** | Stop hook exports session metrics; SessionStart hook restores prior state | Patterns learned on Monday are available on Friday | Yes |
|
|
757
757
|
| **Auto-Meditate** | Recognizes durable lessons in the live session and distills them into the `learnings` namespace in a background pass at the next session start | The high-signal lessons from each session are kept automatically — no need to remember to run `/meditate` | Yes |
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* and ReasoningBank-style pattern storage.
|
|
6
6
|
*
|
|
7
7
|
* Features:
|
|
8
|
-
* - HNSW-indexed threat pattern search (
|
|
8
|
+
* - HNSW-indexed threat pattern search (approximate-nearest-neighbor)
|
|
9
9
|
* - Pattern learning from successful detections
|
|
10
10
|
* - Effectiveness tracking for adaptive mitigation
|
|
11
11
|
* - Integration with agentic-flow attention mechanisms
|
|
@@ -73,7 +73,7 @@ export class ThreatLearningService {
|
|
|
73
73
|
}
|
|
74
74
|
/**
|
|
75
75
|
* Search for similar threat patterns using HNSW
|
|
76
|
-
* When connected to AgentDB,
|
|
76
|
+
* When connected to AgentDB, uses HNSW approximate-nearest-neighbor (ANN) search
|
|
77
77
|
*/
|
|
78
78
|
async searchSimilarThreats(query, options = {}) {
|
|
79
79
|
const results = await this.vectorStore.search({
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Features:
|
|
5
5
|
* - 50+ prompt injection patterns
|
|
6
|
-
* - HNSW-indexed threat pattern search (
|
|
6
|
+
* - HNSW-indexed threat pattern search (approximate-nearest-neighbor with MofloDb)
|
|
7
7
|
* - ReasoningBank-style pattern learning
|
|
8
8
|
* - Adaptive mitigation with effectiveness tracking
|
|
9
9
|
*
|
|
@@ -452,12 +452,7 @@ const metricsCommand = {
|
|
|
452
452
|
{ type: 'coder', count: 2, tasks: 45, successRate: '97%' },
|
|
453
453
|
{ type: 'researcher', count: 1, tasks: 32, successRate: '95%' },
|
|
454
454
|
{ type: 'tester', count: 1, tasks: 50, successRate: '98%' }
|
|
455
|
-
]
|
|
456
|
-
performance: {
|
|
457
|
-
flashAttention: '2.8x speedup',
|
|
458
|
-
memoryReduction: '52%',
|
|
459
|
-
searchImprovement: '150x faster'
|
|
460
|
-
}
|
|
455
|
+
]
|
|
461
456
|
};
|
|
462
457
|
if (ctx.flags.format === 'json') {
|
|
463
458
|
output.printJson(metrics);
|
|
@@ -491,13 +486,6 @@ const metricsCommand = {
|
|
|
491
486
|
],
|
|
492
487
|
data: metrics.byType
|
|
493
488
|
});
|
|
494
|
-
output.writeln();
|
|
495
|
-
output.writeln(output.bold('V3 Performance Gains'));
|
|
496
|
-
output.printList([
|
|
497
|
-
`Flash Attention: ${output.success(metrics.performance.flashAttention)}`,
|
|
498
|
-
`Memory Reduction: ${output.success(metrics.performance.memoryReduction)}`,
|
|
499
|
-
`Search: ${output.success(metrics.performance.searchImprovement)}`
|
|
500
|
-
]);
|
|
501
489
|
return { success: true, data: metrics };
|
|
502
490
|
}
|
|
503
491
|
};
|
|
@@ -726,7 +726,7 @@ const providersCommand = {
|
|
|
726
726
|
],
|
|
727
727
|
});
|
|
728
728
|
output.writeln();
|
|
729
|
-
output.writeln(output.dim('Agentic Flow provider uses WASM SIMD for
|
|
729
|
+
output.writeln(output.dim('Agentic Flow provider uses WASM SIMD for lightweight pure-TS inference'));
|
|
730
730
|
return { success: true };
|
|
731
731
|
},
|
|
732
732
|
};
|
|
@@ -1035,7 +1035,7 @@ const neuralCommand = {
|
|
|
1035
1035
|
},
|
|
1036
1036
|
{
|
|
1037
1037
|
component: 'Flash Attention',
|
|
1038
|
-
description: '
|
|
1038
|
+
description: 'memory-efficient attention',
|
|
1039
1039
|
status: neural.flashAttention ? output.success('Enabled') : output.dim('Disabled')
|
|
1040
1040
|
},
|
|
1041
1041
|
{
|
|
@@ -1547,8 +1547,8 @@ export const embeddingsCommand = {
|
|
|
1547
1547
|
output.writeln();
|
|
1548
1548
|
output.writeln('Performance:');
|
|
1549
1549
|
output.printList([
|
|
1550
|
-
'HNSW indexing:
|
|
1551
|
-
'Agentic Flow:
|
|
1550
|
+
'HNSW indexing: approximate-nearest-neighbor (ANN) search',
|
|
1551
|
+
'Agentic Flow: lightweight pure-TS inference',
|
|
1552
1552
|
'Persistent cache: SQLite-backed, survives restarts',
|
|
1553
1553
|
'Hyperbolic: Better hierarchical representation',
|
|
1554
1554
|
]);
|
|
@@ -12,11 +12,12 @@
|
|
|
12
12
|
* flo epic run 42 --verbose Echo each step's stdout/stderr after it completes
|
|
13
13
|
* flo epic status <epic-number> Check progress via memory
|
|
14
14
|
* flo epic reset <epic-number> Clear epic memory state
|
|
15
|
+
* flo epic checkoff <epic> <story> Check a story off; close the epic if it was the last
|
|
15
16
|
*/
|
|
16
17
|
import { readFileSync } from 'node:fs';
|
|
17
18
|
import { execSync } from 'node:child_process';
|
|
18
19
|
import { join } from 'node:path';
|
|
19
|
-
import { isEpicIssue, fetchEpicIssue, extractStories, enrichStoryNames, } from '../epic/index.js';
|
|
20
|
+
import { isEpicIssue, fetchEpicIssue, extractStories, enrichStoryNames, checkOffStoryInEpic, } from '../epic/index.js';
|
|
20
21
|
import { runEpicSpell, } from '../epic/runner-adapter.js';
|
|
21
22
|
import { locateMofloModulePath } from '../services/moflo-require.js';
|
|
22
23
|
import { select } from '../prompt.js';
|
|
@@ -362,6 +363,36 @@ async function resetEpic(epicNumber) {
|
|
|
362
363
|
return { success: true };
|
|
363
364
|
}
|
|
364
365
|
// ============================================================================
|
|
366
|
+
// Subcommand: checkoff
|
|
367
|
+
// ============================================================================
|
|
368
|
+
async function checkOffStory(epicArg, storyArg) {
|
|
369
|
+
const epic = parseInt(epicArg, 10);
|
|
370
|
+
const story = parseInt(storyArg, 10);
|
|
371
|
+
if (isNaN(epic) || isNaN(story)) {
|
|
372
|
+
return { success: false, message: 'Usage: flo epic checkoff <epic-number> <story-number>' };
|
|
373
|
+
}
|
|
374
|
+
try {
|
|
375
|
+
const { checked, epicClosed, alreadyClosed } = await checkOffStoryInEpic(epic, story);
|
|
376
|
+
const parts = [];
|
|
377
|
+
parts.push(checked
|
|
378
|
+
? `Checked off story #${story} in epic #${epic}.`
|
|
379
|
+
: `Story #${story} was already checked (or not listed) in epic #${epic}.`);
|
|
380
|
+
if (epicClosed)
|
|
381
|
+
parts.push(`All stories complete — closed epic #${epic}.`);
|
|
382
|
+
else if (alreadyClosed)
|
|
383
|
+
parts.push(`Epic #${epic} was already closed.`);
|
|
384
|
+
const message = parts.join(' ');
|
|
385
|
+
console.log(`[epic] ${message}`);
|
|
386
|
+
return { success: true, message };
|
|
387
|
+
}
|
|
388
|
+
catch (err) {
|
|
389
|
+
return {
|
|
390
|
+
success: false,
|
|
391
|
+
message: buildFailureSummary(err.message, { stepId: 'checkoff' }),
|
|
392
|
+
};
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
// ============================================================================
|
|
365
396
|
// Preflight warning interactive resolver
|
|
366
397
|
// ============================================================================
|
|
367
398
|
function isInteractive() {
|
|
@@ -461,6 +492,7 @@ const epicCommand = {
|
|
|
461
492
|
{ command: 'flo epic run 42', description: 'Explicit run subcommand (same as above)' },
|
|
462
493
|
{ command: 'flo epic status 42', description: 'Check epic progress' },
|
|
463
494
|
{ command: 'flo epic reset 42', description: 'Reset epic state for re-run' },
|
|
495
|
+
{ command: 'flo epic checkoff 42 43', description: 'Check story #43 off in epic #42; close #42 if it was the last story' },
|
|
464
496
|
],
|
|
465
497
|
action: async (ctx) => {
|
|
466
498
|
const subcommand = ctx.args?.[0];
|
|
@@ -469,10 +501,11 @@ const epicCommand = {
|
|
|
469
501
|
console.log(' flo epic <command> [args] [flags]');
|
|
470
502
|
console.log('');
|
|
471
503
|
console.log('Commands:');
|
|
472
|
-
console.log(' <issue-number>
|
|
473
|
-
console.log(' run <issue-number>
|
|
474
|
-
console.log(' status <epic-number>
|
|
475
|
-
console.log(' reset <epic-number>
|
|
504
|
+
console.log(' <issue-number> Execute epic (shorthand for "run")');
|
|
505
|
+
console.log(' run <issue-number> Execute a GitHub epic via spell engine');
|
|
506
|
+
console.log(' status <epic-number> Check epic progress');
|
|
507
|
+
console.log(' reset <epic-number> Reset epic state for re-run');
|
|
508
|
+
console.log(' checkoff <epic> <story> Check a story off in its epic; close the epic if it was the last');
|
|
476
509
|
console.log('');
|
|
477
510
|
console.log('Flags:');
|
|
478
511
|
console.log(' --strategy <name> single-branch (default) or auto-merge');
|
|
@@ -518,8 +551,10 @@ const epicCommand = {
|
|
|
518
551
|
return showStatus(commandArgs[0] || '');
|
|
519
552
|
case 'reset':
|
|
520
553
|
return resetEpic(commandArgs[0] || '');
|
|
554
|
+
case 'checkoff':
|
|
555
|
+
return checkOffStory(commandArgs[0] || '', commandArgs[1] || '');
|
|
521
556
|
default:
|
|
522
|
-
return { success: false, message: `Unknown subcommand: ${subcommand}. Available: run, status, reset` };
|
|
557
|
+
return { success: false, message: `Unknown subcommand: ${subcommand}. Available: run, status, reset, checkoff` };
|
|
523
558
|
}
|
|
524
559
|
},
|
|
525
560
|
};
|
|
@@ -826,17 +826,6 @@ const metricsCommand = {
|
|
|
826
826
|
{ metric: 'Avg Risk Score', value: result.commands.avgRiskScore.toFixed(2) }
|
|
827
827
|
]
|
|
828
828
|
});
|
|
829
|
-
if (v3Dashboard && result.performance) {
|
|
830
|
-
const p = result.performance;
|
|
831
|
-
output.writeln();
|
|
832
|
-
output.writeln(output.bold('🚀 V3 Performance Gains'));
|
|
833
|
-
output.printList([
|
|
834
|
-
`Flash Attention: ${output.success(p.flashAttention ?? 'N/A')}`,
|
|
835
|
-
`Memory Reduction: ${output.success(p.memoryReduction ?? 'N/A')}`,
|
|
836
|
-
`Search Improvement: ${output.success(p.searchImprovement ?? 'N/A')}`,
|
|
837
|
-
`Token Reduction: ${output.success(p.tokenReduction ?? 'N/A')}`
|
|
838
|
-
]);
|
|
839
|
-
}
|
|
840
829
|
return { success: true, data: result };
|
|
841
830
|
}
|
|
842
831
|
catch (error) {
|
|
@@ -1412,7 +1401,7 @@ const sessionRestoreCommand = {
|
|
|
1412
1401
|
// Intelligence subcommand (SONA, MoE, HNSW)
|
|
1413
1402
|
const intelligenceCommand = {
|
|
1414
1403
|
name: 'intelligence',
|
|
1415
|
-
description: 'MoVector intelligence system (SONA, MoE, HNSW
|
|
1404
|
+
description: 'MoVector intelligence system (SONA, MoE, HNSW ANN search)',
|
|
1416
1405
|
options: [
|
|
1417
1406
|
{
|
|
1418
1407
|
name: 'mode',
|
|
@@ -1436,7 +1425,7 @@ const intelligenceCommand = {
|
|
|
1436
1425
|
},
|
|
1437
1426
|
{
|
|
1438
1427
|
name: 'enable-hnsw',
|
|
1439
|
-
description: 'Enable HNSW
|
|
1428
|
+
description: 'Enable HNSW approximate-nearest-neighbor (ANN) search',
|
|
1440
1429
|
type: 'boolean',
|
|
1441
1430
|
default: true
|
|
1442
1431
|
},
|
|
@@ -1584,7 +1573,7 @@ const intelligenceCommand = {
|
|
|
1584
1573
|
}
|
|
1585
1574
|
// HNSW Component
|
|
1586
1575
|
output.writeln();
|
|
1587
|
-
output.writeln(output.bold('🔍 HNSW (
|
|
1576
|
+
output.writeln(output.bold('🔍 HNSW (ANN Search)'));
|
|
1588
1577
|
const hnsw = result.components?.hnsw;
|
|
1589
1578
|
if (hnsw?.enabled) {
|
|
1590
1579
|
output.printTable({
|
|
@@ -1625,19 +1614,6 @@ const intelligenceCommand = {
|
|
|
1625
1614
|
else {
|
|
1626
1615
|
output.writeln(output.dim(' Not initialized'));
|
|
1627
1616
|
}
|
|
1628
|
-
// V3 Performance
|
|
1629
|
-
const perf = result.performance;
|
|
1630
|
-
if (perf) {
|
|
1631
|
-
output.writeln();
|
|
1632
|
-
output.writeln(output.bold('🚀 V3 Performance Gains'));
|
|
1633
|
-
output.printList([
|
|
1634
|
-
`Flash Attention: ${output.success(perf.flashAttention ?? 'N/A')}`,
|
|
1635
|
-
`Memory Reduction: ${output.success(perf.memoryReduction ?? 'N/A')}`,
|
|
1636
|
-
`Search Improvement: ${output.success(perf.searchImprovement ?? 'N/A')}`,
|
|
1637
|
-
`Token Reduction: ${output.success(perf.tokenReduction ?? 'N/A')}`,
|
|
1638
|
-
`SWE-Bench Score: ${output.success(perf.sweBenchScore ?? 'N/A')}`
|
|
1639
|
-
]);
|
|
1640
|
-
}
|
|
1641
1617
|
return { success: true, data: result };
|
|
1642
1618
|
}
|
|
1643
1619
|
catch (error) {
|
|
@@ -2888,10 +2864,9 @@ const statuslineCommand = {
|
|
|
2888
2864
|
}
|
|
2889
2865
|
const domainsColor = progress.domainsCompleted >= 3 ? c.brightGreen : progress.domainsCompleted > 0 ? c.yellow : c.red;
|
|
2890
2866
|
// Dynamic perf indicator based on patterns/HNSW
|
|
2891
|
-
let perfIndicator = `${c.dim}⚡
|
|
2867
|
+
let perfIndicator = `${c.dim}⚡ HNSW${c.reset}`;
|
|
2892
2868
|
if (agentdbStats.hasHnsw && agentdbStats.vectorCount > 0) {
|
|
2893
|
-
|
|
2894
|
-
perfIndicator = `${c.brightGreen}⚡ HNSW ${speedup}${c.reset}`;
|
|
2869
|
+
perfIndicator = `${c.brightGreen}⚡ HNSW (ANN)${c.reset}`;
|
|
2895
2870
|
}
|
|
2896
2871
|
else if (progress.patternsLearned > 0) {
|
|
2897
2872
|
const patternsK = progress.patternsLearned >= 1000 ? `${(progress.patternsLearned / 1000).toFixed(1)}k` : String(progress.patternsLearned);
|
|
@@ -3742,11 +3717,8 @@ export const hooksCommand = {
|
|
|
3742
3717
|
output.writeln(output.bold('V3 Features:'));
|
|
3743
3718
|
output.printList([
|
|
3744
3719
|
'🧠 ReasoningBank adaptive learning',
|
|
3745
|
-
'⚡ Flash Attention (
|
|
3746
|
-
'🔍 AgentDB integration (
|
|
3747
|
-
'📊 84.8% SWE-Bench solve rate',
|
|
3748
|
-
'🎯 32.3% token reduction',
|
|
3749
|
-
'🚀 2.8-4.4x speed improvement',
|
|
3720
|
+
'⚡ Flash Attention (memory-efficient attention)',
|
|
3721
|
+
'🔍 AgentDB integration (HNSW ANN search)',
|
|
3750
3722
|
'👥 Agent Teams integration (auto task assignment)'
|
|
3751
3723
|
]);
|
|
3752
3724
|
return { success: true };
|
|
@@ -426,7 +426,7 @@ const wizardCommand = {
|
|
|
426
426
|
message: 'Select memory backend:',
|
|
427
427
|
options: [
|
|
428
428
|
{ value: 'hybrid', label: 'Hybrid', hint: 'SQLite + AgentDB (recommended)' },
|
|
429
|
-
{ value: 'agentdb', label: 'AgentDB', hint: '
|
|
429
|
+
{ value: 'agentdb', label: 'AgentDB', hint: 'HNSW approximate-nearest-neighbor (ANN) vector search' },
|
|
430
430
|
{ value: 'sqlite', label: 'SQLite', hint: 'Standard SQL storage' },
|
|
431
431
|
{ value: 'memory', label: 'In-Memory', hint: 'Fast but non-persistent' },
|
|
432
432
|
],
|
|
@@ -15,7 +15,7 @@ import { resolveBridgeDbPath } from '../memory/bridge-core.js';
|
|
|
15
15
|
import { findProjectRoot } from '../services/project-root.js';
|
|
16
16
|
// Memory backends
|
|
17
17
|
const BACKENDS = [
|
|
18
|
-
{ value: 'agentdb', label: 'AgentDB', hint: 'Vector database with HNSW
|
|
18
|
+
{ value: 'agentdb', label: 'AgentDB', hint: 'Vector database with HNSW approximate-nearest-neighbor (ANN) indexing' },
|
|
19
19
|
{ value: 'sqlite', label: 'SQLite', hint: 'Lightweight local storage' },
|
|
20
20
|
{ value: 'hybrid', label: 'Hybrid', hint: 'SQLite + AgentDB (recommended)' },
|
|
21
21
|
{ value: 'memory', label: 'In-Memory', hint: 'Fast but non-persistent' }
|
|
@@ -257,7 +257,7 @@ const searchCommand = {
|
|
|
257
257
|
},
|
|
258
258
|
{
|
|
259
259
|
name: 'build-hnsw',
|
|
260
|
-
description: 'Build/rebuild HNSW index before searching (enables
|
|
260
|
+
description: 'Build/rebuild HNSW index before searching (enables approximate-nearest-neighbor search)',
|
|
261
261
|
type: 'boolean',
|
|
262
262
|
default: false
|
|
263
263
|
}
|
|
@@ -291,7 +291,6 @@ const searchCommand = {
|
|
|
291
291
|
const status = getHNSWStatus();
|
|
292
292
|
output.printSuccess(`HNSW index built (${status.entryCount} vectors, ${buildTime}ms)`);
|
|
293
293
|
output.writeln(output.dim(` Dimensions: ${status.dimensions}, Metric: cosine`));
|
|
294
|
-
output.writeln(output.dim(` Search speedup: ${status.entryCount > 10000 ? '12,500x' : status.entryCount > 1000 ? '150x' : '10x'}`));
|
|
295
294
|
}
|
|
296
295
|
else {
|
|
297
296
|
output.printWarning('HNSW index not available (will be initialized on first use)');
|
|
@@ -583,7 +582,7 @@ const statsCommand = {
|
|
|
583
582
|
]
|
|
584
583
|
});
|
|
585
584
|
output.writeln();
|
|
586
|
-
output.printInfo('V3 Performance:
|
|
585
|
+
output.printInfo('V3 Performance: HNSW approximate-nearest-neighbor (ANN) search');
|
|
587
586
|
return { success: true, data: stats };
|
|
588
587
|
}
|
|
589
588
|
catch (error) {
|
|
@@ -21,7 +21,7 @@ const trainCommand = {
|
|
|
21
21
|
{ name: 'batch-size', short: 'b', type: 'number', description: 'Batch size', default: '32' },
|
|
22
22
|
{ name: 'dim', type: 'number', description: 'Embedding dimension (max 256)', default: '256' },
|
|
23
23
|
{ name: 'wasm', short: 'w', type: 'boolean', description: 'Use MoVector WASM acceleration', default: 'true' },
|
|
24
|
-
{ name: 'flash', type: 'boolean', description: 'Enable Flash Attention (
|
|
24
|
+
{ name: 'flash', type: 'boolean', description: 'Enable Flash Attention (memory-efficient attention)', default: 'true' },
|
|
25
25
|
{ name: 'moe', type: 'boolean', description: 'Enable Mixture of Experts routing', default: 'false' },
|
|
26
26
|
{ name: 'hyperbolic', type: 'boolean', description: 'Enable hyperbolic attention for hierarchical patterns', default: 'false' },
|
|
27
27
|
{ name: 'contrastive', type: 'boolean', description: 'Use contrastive learning (InfoNCE)', default: 'true' },
|
|
@@ -722,7 +722,7 @@ const optimizeCommand = {
|
|
|
722
722
|
{ metric: 'Pattern Count', before: String(patterns.length), after: String(patterns.length) },
|
|
723
723
|
{ metric: 'Storage Size', before: `${(beforeSize / 1024).toFixed(1)} KB`, after: `${(afterSize / 1024).toFixed(1)} KB` },
|
|
724
724
|
{ metric: 'Embedding Memory', before: `${((memoryReduction * 4) / 1024).toFixed(1)} KB`, after: `${(memoryReduction / 1024).toFixed(1)} KB` },
|
|
725
|
-
{ metric: 'Memory Reduction', before: '-', after:
|
|
725
|
+
{ metric: 'Memory Reduction', before: '-', after: 'compressed 8-bit storage' },
|
|
726
726
|
{ metric: 'Precision', before: 'Float32', after: 'Int8 (±0.5%)' },
|
|
727
727
|
],
|
|
728
728
|
});
|
|
@@ -118,7 +118,7 @@ const benchmarkCommand = {
|
|
|
118
118
|
}
|
|
119
119
|
const mean = searchTimes.reduce((a, b) => a + b, 0) / searchTimes.length;
|
|
120
120
|
// Brute force baseline: ~0.5μs per vector comparison, 1000 vectors = 0.5ms
|
|
121
|
-
// HNSW
|
|
121
|
+
// HNSW is O(log n) approximate-nearest-neighbor (ANN) search
|
|
122
122
|
const baselineBruteForce = hnswStatus.entryCount * 0.0005;
|
|
123
123
|
const speedup = baselineBruteForce / (mean / 1000);
|
|
124
124
|
results.push({
|
|
@@ -492,9 +492,9 @@ const optimizeCommand = {
|
|
|
492
492
|
{ key: 'impact', header: 'Impact', width: 15 },
|
|
493
493
|
],
|
|
494
494
|
data: [
|
|
495
|
-
{ priority: output.error('P0'), area: 'Memory', recommendation: 'Enable HNSW index quantization', impact: '
|
|
495
|
+
{ priority: output.error('P0'), area: 'Memory', recommendation: 'Enable HNSW index quantization', impact: 'Int8 quantized' },
|
|
496
496
|
{ priority: output.warning('P1'), area: 'CPU', recommendation: 'Enable WASM SIMD acceleration', impact: '+4x speedup' },
|
|
497
|
-
{ priority: output.warning('P1'), area: 'Latency', recommendation: 'Enable Flash Attention', impact: '
|
|
497
|
+
{ priority: output.warning('P1'), area: 'Latency', recommendation: 'Enable Flash Attention', impact: 'memory-efficient' },
|
|
498
498
|
{ priority: output.info('P2'), area: 'Cache', recommendation: 'Increase pattern cache size', impact: '+15% hit rate' },
|
|
499
499
|
{ priority: output.info('P2'), area: 'Network', recommendation: 'Enable request batching', impact: '-30% latency' },
|
|
500
500
|
],
|
|
@@ -564,11 +564,11 @@ export const performanceCommand = {
|
|
|
564
564
|
'bottleneck - Identify performance bottlenecks',
|
|
565
565
|
]);
|
|
566
566
|
output.writeln();
|
|
567
|
-
output.writeln('
|
|
567
|
+
output.writeln('Capabilities:');
|
|
568
568
|
output.printList([
|
|
569
|
-
'HNSW Search:
|
|
570
|
-
'Flash Attention:
|
|
571
|
-
'Memory:
|
|
569
|
+
'HNSW Search: approximate-nearest-neighbor (ANN), scales sub-linearly as the index grows',
|
|
570
|
+
'Flash Attention: memory-efficient attention',
|
|
571
|
+
'Memory: Int8 quantized weight storage',
|
|
572
572
|
]);
|
|
573
573
|
output.writeln();
|
|
574
574
|
output.writeln(output.dim('Created with ❤️ by motailz.com'));
|
|
@@ -110,9 +110,7 @@ async function getSystemStatus() {
|
|
|
110
110
|
tasks: taskStatus,
|
|
111
111
|
performance: {
|
|
112
112
|
cpuUsage: getProcessCpuUsage(),
|
|
113
|
-
memoryUsage: getProcessMemoryUsage()
|
|
114
|
-
flashAttention: '2.8x speedup',
|
|
115
|
-
searchSpeed: '150x faster'
|
|
113
|
+
memoryUsage: getProcessMemoryUsage()
|
|
116
114
|
}
|
|
117
115
|
};
|
|
118
116
|
}
|
|
@@ -138,9 +136,7 @@ async function getSystemStatus() {
|
|
|
138
136
|
tasks: { total: 0, pending: 0, running: 0, completed: 0, failed: 0 },
|
|
139
137
|
performance: {
|
|
140
138
|
cpuUsage: 0,
|
|
141
|
-
memoryUsage: 0
|
|
142
|
-
flashAttention: 'N/A',
|
|
143
|
-
searchSpeed: 'N/A'
|
|
139
|
+
memoryUsage: 0
|
|
144
140
|
}
|
|
145
141
|
};
|
|
146
142
|
}
|
|
@@ -231,10 +227,8 @@ function displayStatus(status) {
|
|
|
231
227
|
output.writeln();
|
|
232
228
|
// Performance section
|
|
233
229
|
if (status.running) {
|
|
234
|
-
output.writeln(output.bold('
|
|
230
|
+
output.writeln(output.bold('Performance'));
|
|
235
231
|
output.printList([
|
|
236
|
-
`Flash Attention: ${output.success(status.performance.flashAttention)}`,
|
|
237
|
-
`Vector Search: ${output.success(status.performance.searchSpeed)}`,
|
|
238
232
|
`CPU Usage: ${status.performance.cpuUsage.toFixed(1)}%`,
|
|
239
233
|
`Memory Usage: ${status.performance.memoryUsage.toFixed(1)}%`
|
|
240
234
|
]);
|
|
@@ -522,12 +516,6 @@ const memoryCommand = {
|
|
|
522
516
|
{ metric: 'Cache Hit Rate', value: `${(result.performance.cacheHitRate * 100).toFixed(1)}%` }
|
|
523
517
|
]
|
|
524
518
|
});
|
|
525
|
-
output.writeln();
|
|
526
|
-
output.writeln(output.bold('V3 Performance Gains'));
|
|
527
|
-
output.printList([
|
|
528
|
-
`Search Speed: ${output.success(result.v3Gains.searchImprovement)}`,
|
|
529
|
-
`Memory Usage: ${output.success(result.v3Gains.memoryReduction)}`
|
|
530
|
-
]);
|
|
531
519
|
return { success: true, data: result };
|
|
532
520
|
}
|
|
533
521
|
catch (error) {
|
|
@@ -224,8 +224,8 @@ const initCommand = {
|
|
|
224
224
|
output.writeln(output.dim(' Initializing memory namespace...'));
|
|
225
225
|
output.writeln(output.dim(' Setting up communication channels...'));
|
|
226
226
|
if (v3Mode) {
|
|
227
|
-
output.writeln(output.dim(' Enabling Flash Attention (
|
|
228
|
-
output.writeln(output.dim(' Configuring AgentDB integration (
|
|
227
|
+
output.writeln(output.dim(' Enabling Flash Attention (memory-efficient attention)...'));
|
|
228
|
+
output.writeln(output.dim(' Configuring AgentDB integration (HNSW ANN search)...'));
|
|
229
229
|
output.writeln(output.dim(' Initializing SONA learning system...'));
|
|
230
230
|
}
|
|
231
231
|
output.writeln();
|
|
@@ -617,11 +617,11 @@ const coordinateCommand = {
|
|
|
617
617
|
data: v3Agents
|
|
618
618
|
});
|
|
619
619
|
output.writeln();
|
|
620
|
-
output.printInfo('
|
|
620
|
+
output.printInfo('Capabilities:');
|
|
621
621
|
output.printList([
|
|
622
|
-
`Flash Attention: ${output.success('
|
|
623
|
-
`AgentDB Search: ${output.success('
|
|
624
|
-
`Memory
|
|
622
|
+
`Flash Attention: ${output.success('memory-efficient attention')}`,
|
|
623
|
+
`AgentDB Search: ${output.success('HNSW (ANN)')}`,
|
|
624
|
+
`Memory: ${output.success('Int8 quantized')}`,
|
|
625
625
|
`Code Reduction: ${output.success('<5,000 lines')}`
|
|
626
626
|
]);
|
|
627
627
|
return { success: true, data: { agents: v3Agents, count: agentCount } };
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*
|
|
7
7
|
* Story #195: Shared epic detection & extraction module.
|
|
8
8
|
*/
|
|
9
|
-
import { exec } from 'node:child_process';
|
|
9
|
+
import { exec, spawnSync } from 'node:child_process';
|
|
10
10
|
import { promisify } from 'node:util';
|
|
11
11
|
const execAsync = promisify(exec);
|
|
12
12
|
// ============================================================================
|
|
@@ -138,4 +138,59 @@ export async function findPrForIssue(issueNumber) {
|
|
|
138
138
|
return null;
|
|
139
139
|
}
|
|
140
140
|
}
|
|
141
|
+
// ============================================================================
|
|
142
|
+
// Story checkoff (standalone `/flo <story>` runs)
|
|
143
|
+
// ============================================================================
|
|
144
|
+
/**
|
|
145
|
+
* Pure core of the story-checkoff operation — no I/O, unit-testable.
|
|
146
|
+
*
|
|
147
|
+
* Flips a story's `- [ ] #<n>` checkbox to `- [x] #<n>` in an epic body and
|
|
148
|
+
* reports whether the epic is now complete (it has story checkboxes and none
|
|
149
|
+
* remain unchecked). Word-boundary guarded so #12 never matches inside #123.
|
|
150
|
+
*/
|
|
151
|
+
export function computeEpicCheckoff(body, storyNumber) {
|
|
152
|
+
const pattern = new RegExp(`- \\[ \\] #${storyNumber}(?!\\d)`);
|
|
153
|
+
const updated = body.replace(pattern, `- [x] #${storyNumber}`);
|
|
154
|
+
const checked = updated !== body;
|
|
155
|
+
const hasStoryCheckboxes = /- \[[ x]\] #\d+/.test(updated);
|
|
156
|
+
const hasUnchecked = /- \[ \] #\d+/.test(updated);
|
|
157
|
+
const allComplete = hasStoryCheckboxes && !hasUnchecked;
|
|
158
|
+
return { updated, checked, allComplete };
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Check a story off in its parent epic's checklist, and close the epic when no
|
|
162
|
+
* unchecked stories remain. Used by standalone `/flo <story>` runs via
|
|
163
|
+
* `flo epic checkoff`; the orchestrated `flo epic run` path does its own
|
|
164
|
+
* checkoff inside the spell (epic-single-branch.yaml).
|
|
165
|
+
*
|
|
166
|
+
* Cross-platform (Rule #1): drives `gh` through `spawnSync` arg arrays (no
|
|
167
|
+
* shell string to escape) and pipes the rewritten body over stdin
|
|
168
|
+
* (`--body-file -`), the same pattern proven on Windows CI in the spell.
|
|
169
|
+
*/
|
|
170
|
+
export async function checkOffStoryInEpic(epicNumber, storyNumber) {
|
|
171
|
+
const issue = await fetchEpicIssue(epicNumber);
|
|
172
|
+
const { updated, checked, allComplete } = computeEpicCheckoff(issue.body || '', storyNumber);
|
|
173
|
+
if (checked) {
|
|
174
|
+
const edit = spawnSync('gh', ['issue', 'edit', String(epicNumber), '--body-file', '-'], {
|
|
175
|
+
input: updated,
|
|
176
|
+
encoding: 'utf8',
|
|
177
|
+
});
|
|
178
|
+
if (edit.status !== 0) {
|
|
179
|
+
throw new Error(`gh issue edit failed: ${(edit.stderr || edit.error?.message || 'unknown').toString().trim()}`);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
const alreadyClosed = issue.state.toUpperCase() === 'CLOSED';
|
|
183
|
+
const epicClosed = allComplete && !alreadyClosed;
|
|
184
|
+
if (epicClosed) {
|
|
185
|
+
const close = spawnSync('gh', [
|
|
186
|
+
'issue', 'close', String(epicNumber),
|
|
187
|
+
'--reason', 'completed',
|
|
188
|
+
'--comment', `All stories complete — closed automatically after story #${storyNumber}.`,
|
|
189
|
+
], { encoding: 'utf8' });
|
|
190
|
+
if (close.status !== 0) {
|
|
191
|
+
throw new Error(`gh issue close failed: ${(close.stderr || close.error?.message || 'unknown').toString().trim()}`);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
return { checked, epicClosed, alreadyClosed };
|
|
195
|
+
}
|
|
141
196
|
//# sourceMappingURL=detection.js.map
|
|
@@ -3,5 +3,5 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Story #195: Shared epic detection & extraction module.
|
|
5
5
|
*/
|
|
6
|
-
export { isEpicIssue, extractStories, extractUncheckedStories, fetchEpicIssue, enrichStoryNames, findPrForIssue, } from './detection.js';
|
|
6
|
+
export { isEpicIssue, extractStories, extractUncheckedStories, fetchEpicIssue, enrichStoryNames, findPrForIssue, computeEpicCheckoff, checkOffStoryInEpic, } from './detection.js';
|
|
7
7
|
//# sourceMappingURL=index.js.map
|
|
@@ -55,10 +55,10 @@ export class GuidanceProvider {
|
|
|
55
55
|
'**Architecture**: Domain-Driven Design across moflo modules',
|
|
56
56
|
'**Priority**: Security-first (CVE-1, CVE-2, CVE-3 remediation)',
|
|
57
57
|
'',
|
|
58
|
-
'**Performance
|
|
59
|
-
'- HNSW search:
|
|
60
|
-
'- Flash Attention:
|
|
61
|
-
'- Memory:
|
|
58
|
+
'**Performance Characteristics**:',
|
|
59
|
+
'- HNSW approximate-nearest-neighbor (ANN) search: scales sub-linearly as the index grows',
|
|
60
|
+
'- Flash Attention: memory-efficient attention',
|
|
61
|
+
'- Memory: Int8 quantized weight storage',
|
|
62
62
|
'',
|
|
63
63
|
'**Active Patterns**:',
|
|
64
64
|
'- Use TDD London School (mock-first)',
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* No JSON - all patterns stored as vectors in memory.db
|
|
6
6
|
*
|
|
7
7
|
* Features:
|
|
8
|
-
* - Real HNSW indexing (M=16, efConstruction=200) for
|
|
8
|
+
* - Real HNSW indexing (M=16, efConstruction=200) for approximate-nearest-neighbor (ANN) search
|
|
9
9
|
* - ONNX embeddings via cli/src/embeddings (MiniLM-L6 384-dim)
|
|
10
10
|
* - MofloDb backend for persistence
|
|
11
11
|
* - Pattern promotion from short-term to long-term memory
|
|
@@ -275,7 +275,7 @@ export class ReasoningBank extends EventEmitter {
|
|
|
275
275
|
? await this.embeddingService.embed(query)
|
|
276
276
|
: query;
|
|
277
277
|
let results = [];
|
|
278
|
-
// Try HNSW search first (
|
|
278
|
+
// Try HNSW search first (approximate-nearest-neighbor)
|
|
279
279
|
if (this.hnswIndex && this.useRealBackend) {
|
|
280
280
|
const hnswStart = performance.now();
|
|
281
281
|
try {
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* Format matches the working .claude/statusline.sh output:
|
|
8
8
|
* ▊ MoFlo ● <user> │ ⎇ <branch> │ Opus 4.8
|
|
9
9
|
* ─────────────────────────────────────────────────────
|
|
10
|
-
* 🏗️ DDD Domains [●●●●●] 5/5
|
|
10
|
+
* 🏗️ DDD Domains [●●●●●] 5/5
|
|
11
11
|
* 🤖 Swarm ◉ [58/15] 👥 0 🟢 CVE 3/3 💾 22282MB 📂 47% 🧠 10%
|
|
12
12
|
* 🔧 Architecture DDD ● 98% │ Security ●CLEAN │ Memory ●AgentDB │ Integration ●
|
|
13
13
|
*/
|
|
@@ -113,9 +113,8 @@ export class StatuslineGenerator {
|
|
|
113
113
|
const progressBar = this.generateProgressBar(data.v3Progress.domainsCompleted, data.v3Progress.totalDomains);
|
|
114
114
|
const domainsColor = data.v3Progress.domainsCompleted >= 3 ? c.brightGreen :
|
|
115
115
|
data.v3Progress.domainsCompleted > 0 ? c.yellow : c.red;
|
|
116
|
-
const speedup = `${c.brightYellow}⚡ 1.0x${c.reset} ${c.dim}→${c.reset} ${c.brightYellow}${data.performance.flashAttentionTarget}${c.reset}`;
|
|
117
116
|
lines.push(`${c.brightCyan}🏗️ DDD Domains${c.reset} ${progressBar} ` +
|
|
118
|
-
`${domainsColor}${data.v3Progress.domainsCompleted}${c.reset}/${c.brightWhite}${data.v3Progress.totalDomains}${c.reset}
|
|
117
|
+
`${domainsColor}${data.v3Progress.domainsCompleted}${c.reset}/${c.brightWhite}${data.v3Progress.totalDomains}${c.reset}`);
|
|
119
118
|
// Line 2: Swarm + CVE + Memory + Context + Intelligence
|
|
120
119
|
const swarmIndicator = data.swarm.coordinationActive ? `${c.brightGreen}◉${c.reset}` : `${c.dim}○${c.reset}`;
|
|
121
120
|
const agentsColor = data.swarm.activeAgents > 0 ? c.brightGreen : c.red;
|
|
@@ -237,9 +236,8 @@ export class StatuslineGenerator {
|
|
|
237
236
|
const progressBar = this.generateProgressBar(data.v3Progress.domainsCompleted, data.v3Progress.totalDomains);
|
|
238
237
|
const domainsColor = data.v3Progress.domainsCompleted >= 3 ? c.brightGreen :
|
|
239
238
|
data.v3Progress.domainsCompleted > 0 ? c.yellow : c.red;
|
|
240
|
-
const speedup = `${c.brightYellow}⚡ 1.0x${c.reset} ${c.dim}→${c.reset} ${c.brightYellow}${data.performance.flashAttentionTarget}${c.reset}`;
|
|
241
239
|
lines.push(`${c.brightCyan}🏗️ DDD Domains${c.reset} ${progressBar} ` +
|
|
242
|
-
`${domainsColor}${data.v3Progress.domainsCompleted}${c.reset}/${c.brightWhite}${data.v3Progress.totalDomains}${c.reset}
|
|
240
|
+
`${domainsColor}${data.v3Progress.domainsCompleted}${c.reset}/${c.brightWhite}${data.v3Progress.totalDomains}${c.reset}`);
|
|
243
241
|
// Line 4: COLLISION ZONE LINE - restructure to avoid cols 15-25
|
|
244
242
|
// We add padding after the emoji to push content past the collision zone
|
|
245
243
|
const swarmIndicator = data.swarm.coordinationActive ? `${c.brightGreen}◉${c.reset}` : `${c.dim}○${c.reset}`;
|
|
@@ -425,9 +423,9 @@ export class StatuslineGenerator {
|
|
|
425
423
|
return this.dataSources.getPerformanceTargets();
|
|
426
424
|
}
|
|
427
425
|
return {
|
|
428
|
-
flashAttentionTarget: '
|
|
429
|
-
searchImprovement: '
|
|
430
|
-
memoryReduction: '
|
|
426
|
+
flashAttentionTarget: 'flash',
|
|
427
|
+
searchImprovement: 'HNSW (ANN)',
|
|
428
|
+
memoryReduction: 'int8',
|
|
431
429
|
};
|
|
432
430
|
}
|
|
433
431
|
/**
|
|
@@ -588,7 +586,7 @@ export function parseStatuslineData(json) {
|
|
|
588
586
|
security: data.security ?? { status: 'PENDING', cvesFixed: 0, totalCves: 3 },
|
|
589
587
|
swarm: data.swarm ?? { activeAgents: 0, maxAgents: 15, coordinationActive: false },
|
|
590
588
|
hooks: data.hooks ?? { status: 'INACTIVE', patternsLearned: 0, routingAccuracy: 0, totalOperations: 0 },
|
|
591
|
-
performance: data.performance ?? { flashAttentionTarget: '
|
|
589
|
+
performance: data.performance ?? { flashAttentionTarget: 'flash', searchImprovement: 'HNSW (ANN)', memoryReduction: 'int8' },
|
|
592
590
|
lastUpdated: data.lastUpdated ? new Date(data.lastUpdated) : new Date(),
|
|
593
591
|
};
|
|
594
592
|
}
|
package/dist/src/cli/index.js
CHANGED
|
@@ -362,8 +362,8 @@ export class CLI {
|
|
|
362
362
|
this.output.writeln(this.output.bold('V3 FEATURES:'));
|
|
363
363
|
this.output.printList([
|
|
364
364
|
'15-agent hierarchical mesh coordination',
|
|
365
|
-
'AgentDB with HNSW
|
|
366
|
-
'Flash Attention (
|
|
365
|
+
'AgentDB with HNSW approximate-nearest-neighbor (ANN) indexing',
|
|
366
|
+
'Flash Attention (memory-efficient attention)',
|
|
367
367
|
'Unified SwarmCoordinator engine',
|
|
368
368
|
'Event-sourced state management',
|
|
369
369
|
'Domain-Driven Design architecture'
|
|
@@ -1472,7 +1472,7 @@ async function writeCapabilitiesDoc(targetDir, options, result) {
|
|
|
1472
1472
|
MoFlo V4 is a domain-driven design architecture for multi-agent AI coordination with:
|
|
1473
1473
|
|
|
1474
1474
|
- **15-Agent Swarm Coordination** with hierarchical and mesh topologies
|
|
1475
|
-
- **HNSW Vector Search** -
|
|
1475
|
+
- **HNSW Vector Search** - approximate-nearest-neighbor (ANN) pattern retrieval
|
|
1476
1476
|
- **SONA Neural Learning** - Self-optimizing with <0.05ms adaptation
|
|
1477
1477
|
- **Byzantine Fault Tolerance** - Queen-led consensus mechanisms
|
|
1478
1478
|
- **MCP Server Integration** - Model Context Protocol support
|
|
@@ -1662,10 +1662,10 @@ npx moflo doctor --fix
|
|
|
1662
1662
|
### MoVector Intelligence System
|
|
1663
1663
|
- **SONA**: Self-Optimizing Neural Architecture (<0.05ms)
|
|
1664
1664
|
- **MoE**: Mixture of Experts routing
|
|
1665
|
-
- **HNSW**:
|
|
1665
|
+
- **HNSW**: approximate-nearest-neighbor (ANN) search
|
|
1666
1666
|
- **EWC++**: Prevents catastrophic forgetting
|
|
1667
|
-
- **Flash Attention**:
|
|
1668
|
-
- **Int8 Quantization**:
|
|
1667
|
+
- **Flash Attention**: memory-efficient attention
|
|
1668
|
+
- **Int8 Quantization**: compressed 8-bit weight storage
|
|
1669
1669
|
|
|
1670
1670
|
### 4-Step Intelligence Pipeline
|
|
1671
1671
|
1. **RETRIEVE** - HNSW pattern search
|
|
@@ -1751,10 +1751,10 @@ npx moflo hive-mind consensus --propose "task"
|
|
|
1751
1751
|
|
|
1752
1752
|
| Metric | Target | Status |
|
|
1753
1753
|
|--------|--------|--------|
|
|
1754
|
-
| HNSW Search |
|
|
1755
|
-
| Memory Reduction |
|
|
1754
|
+
| HNSW Search | ANN (sub-linear scaling) | ✅ Implemented |
|
|
1755
|
+
| Memory Reduction | Int8 quantized | ✅ Implemented |
|
|
1756
1756
|
| SONA Integration | Pattern learning | ✅ Implemented |
|
|
1757
|
-
| Flash Attention |
|
|
1757
|
+
| Flash Attention | memory-efficient | 🔄 In Progress |
|
|
1758
1758
|
| MCP Response | <100ms | ✅ Achieved |
|
|
1759
1759
|
| CLI Startup | <500ms | ✅ Achieved |
|
|
1760
1760
|
| SONA Adaptation | <0.05ms | 🔄 In Progress |
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Wraps the CLI memory-bridge (MofloDb v3 + HNSW + embeddings) so the
|
|
5
5
|
* 6 aidefence_* MCP tools persist learned threat patterns and mitigation
|
|
6
|
-
* strategies across process restarts with
|
|
6
|
+
* strategies across process restarts with HNSW approximate-nearest-neighbor (ANN) search.
|
|
7
7
|
*
|
|
8
8
|
* The aidefence facade itself stays pure-lib (no MofloDb import); this
|
|
9
9
|
* adapter is the seam where the bridge is plugged in. Arbitrary values are
|
|
@@ -830,10 +830,9 @@ export const hooksMetrics = {
|
|
|
830
830
|
avgRiskScore: 0.15,
|
|
831
831
|
},
|
|
832
832
|
performance: {
|
|
833
|
-
flashAttention: '
|
|
834
|
-
memoryReduction: '
|
|
835
|
-
searchImprovement: '
|
|
836
|
-
tokenReduction: '32.3% fewer tokens',
|
|
833
|
+
flashAttention: 'flash',
|
|
834
|
+
memoryReduction: 'int8',
|
|
835
|
+
searchImprovement: 'HNSW (ANN)',
|
|
837
836
|
},
|
|
838
837
|
status: 'healthy',
|
|
839
838
|
lastUpdated: new Date().toISOString(),
|
|
@@ -2039,13 +2038,13 @@ export const hooksIntelligence = {
|
|
|
2039
2038
|
implemented: true,
|
|
2040
2039
|
indexSize: realStats.memory.indexSize,
|
|
2041
2040
|
memorySizeBytes: realStats.memory.memorySizeBytes,
|
|
2042
|
-
note: 'HNSW vector indexing
|
|
2041
|
+
note: 'HNSW approximate-nearest-neighbor (ANN) vector indexing',
|
|
2043
2042
|
},
|
|
2044
2043
|
flashAttention: {
|
|
2045
2044
|
enabled: true,
|
|
2046
2045
|
status: flashAvailable ? 'active' : 'loading',
|
|
2047
2046
|
implemented: true, // NOW IMPLEMENTED in alpha.102
|
|
2048
|
-
note: flashAvailable ? 'Flash Attention with O(N) memory
|
|
2047
|
+
note: flashAvailable ? 'Flash Attention with O(N) memory-efficient attention' : 'Flash Attention loading...',
|
|
2049
2048
|
},
|
|
2050
2049
|
ewc: {
|
|
2051
2050
|
enabled: true,
|
|
@@ -339,7 +339,7 @@ export const memoryTools = [
|
|
|
339
339
|
},
|
|
340
340
|
{
|
|
341
341
|
name: 'memory_search',
|
|
342
|
-
description: 'Semantic vector search using HNSW
|
|
342
|
+
description: 'Semantic vector search using HNSW approximate-nearest-neighbor (ANN) index. On chunk hits (non-null `navigation`) you MUST get adjacent context via chunk traversal, never a full-doc `Read`: prefer `expand: "neighbors"` in THIS call (cheapest — inlines prev/next), else `memory_get_neighbors`. Bulk `memory_retrieve` per hit is a protocol violation. See `.claude/guidance/moflo-memory-protocol.md`.',
|
|
343
343
|
category: 'memory',
|
|
344
344
|
inputSchema: {
|
|
345
345
|
type: 'object',
|
|
@@ -21,7 +21,7 @@ import { searchCandidateCap } from './bridge-core.js';
|
|
|
21
21
|
import { cosineSim, logRoutingFault } from './entries-shared.js';
|
|
22
22
|
/**
|
|
23
23
|
* Search entries via node:sqlite with vector similarity.
|
|
24
|
-
* Uses HNSW index for
|
|
24
|
+
* Uses HNSW approximate-nearest-neighbor (ANN) index for search when available.
|
|
25
25
|
*/
|
|
26
26
|
export async function searchEntries(options) {
|
|
27
27
|
// #1058 — read-side routing preamble. When a daemon is reachable AND we're
|
|
@@ -76,7 +76,7 @@ export async function searchEntries(options) {
|
|
|
76
76
|
// Generate query embedding
|
|
77
77
|
const queryEmb = await generateEmbedding(query);
|
|
78
78
|
const queryEmbedding = queryEmb.embedding;
|
|
79
|
-
// Try HNSW search first (
|
|
79
|
+
// Try HNSW search first (approximate-nearest-neighbor)
|
|
80
80
|
const hnswResults = await searchHNSWIndex(queryEmbedding, { k: limit, namespace });
|
|
81
81
|
if (hnswResults && hnswResults.length > 0) {
|
|
82
82
|
// Filter by threshold
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* V3 HNSW Vector Index
|
|
3
3
|
*
|
|
4
4
|
* High-performance Hierarchical Navigable Small World (HNSW) index for
|
|
5
|
-
*
|
|
5
|
+
* Approximate-nearest-neighbor (ANN) vector similarity search that scales sub-linearly vs. a brute-force linear scan.
|
|
6
6
|
*
|
|
7
7
|
* OPTIMIZATIONS:
|
|
8
8
|
* - BinaryMinHeap/BinaryMaxHeap for O(log n) operations (vs O(n log n) Array.sort)
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Process-wide HNSW vector-index singleton (
|
|
2
|
+
* Process-wide HNSW vector-index singleton (approximate-nearest-neighbor search).
|
|
3
3
|
*
|
|
4
4
|
* Extracted from `memory-initializer.ts` (#1203 decomposition). Owns the
|
|
5
5
|
* lazy HNSW index built from the SQLite `embedding` column (or a binary
|
|
@@ -162,7 +162,7 @@ export async function addToHNSWIndex(id, embedding, entry) {
|
|
|
162
162
|
}
|
|
163
163
|
}
|
|
164
164
|
/**
|
|
165
|
-
* Search HNSW index (
|
|
165
|
+
* Search HNSW index (approximate-nearest-neighbor; scales sub-linearly vs. brute-force)
|
|
166
166
|
* Returns results sorted by similarity (highest first)
|
|
167
167
|
*/
|
|
168
168
|
export async function searchHNSWIndex(queryEmbedding, options) {
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* moflo/cli/memory - V3 Unified Memory System
|
|
3
3
|
*
|
|
4
4
|
* Provides a unified memory interface backed by MofloDb with HNSW indexing
|
|
5
|
-
* for
|
|
5
|
+
* for HNSW approximate-nearest-neighbor (ANN) vector search that scales sub-linearly as the index grows.
|
|
6
6
|
*
|
|
7
7
|
* @module moflo/cli/memory
|
|
8
8
|
*
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* MofloDb Adapter
|
|
3
3
|
*
|
|
4
|
-
* Moflo-owned in-memory backend with HNSW
|
|
4
|
+
* Moflo-owned in-memory backend with HNSW approximate-nearest-neighbor (ANN)
|
|
5
5
|
* vector search. Implements IMemoryBackend interface. Backed by Map + HNSW
|
|
6
6
|
* with optional sql.js persistence; has no external agentdb dependency.
|
|
7
7
|
*
|
|
@@ -29,7 +29,7 @@ const DEFAULT_CONFIG = {
|
|
|
29
29
|
* MofloDb Memory Backend Adapter
|
|
30
30
|
*
|
|
31
31
|
* Provides unified memory storage with:
|
|
32
|
-
* - HNSW-based
|
|
32
|
+
* - HNSW-based approximate-nearest-neighbor (ANN) vector search
|
|
33
33
|
* - LRU caching with TTL support
|
|
34
34
|
* - Namespace-based organization
|
|
35
35
|
* - Full-text and metadata filtering
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* V3 Unified Memory Types
|
|
3
3
|
*
|
|
4
4
|
* Type definitions for the unified memory system based on sql.js with HNSW indexing.
|
|
5
|
-
* Supports
|
|
5
|
+
* Supports HNSW approximate-nearest-neighbor (ANN) vector search that scales sub-linearly as the index grows.
|
|
6
6
|
*
|
|
7
7
|
* @module v3/memory/types
|
|
8
8
|
*/
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Provides optional WASM-accelerated vector operations for:
|
|
5
5
|
* - Semantic similarity search
|
|
6
|
-
* - HNSW indexing (
|
|
6
|
+
* - HNSW indexing (approximate-nearest-neighbor)
|
|
7
7
|
* - Embedding generation
|
|
8
8
|
*
|
|
9
9
|
* Gracefully degrades when native backend is not available.
|
|
@@ -105,7 +105,7 @@ export class ReasoningBank {
|
|
|
105
105
|
/**
|
|
106
106
|
* Retrieve relevant memories using Maximal Marginal Relevance (MMR)
|
|
107
107
|
*
|
|
108
|
-
* Uses MofloDb HNSW index for
|
|
108
|
+
* Uses MofloDb HNSW approximate-nearest-neighbor (ANN) index for retrieval when available.
|
|
109
109
|
*
|
|
110
110
|
* @param queryEmbedding - Query vector for similarity search
|
|
111
111
|
* @param k - Number of results to return (default: config.retrievalK)
|
|
@@ -3,17 +3,12 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Implements attention-based coordination mechanisms from agentic-flow@alpha:
|
|
5
5
|
* - multi-head: Standard multi-head attention
|
|
6
|
-
* - flash:
|
|
6
|
+
* - flash: memory-efficient attention (Int8 quantized weight storage)
|
|
7
7
|
* - linear: For long sequences
|
|
8
8
|
* - hyperbolic: Hierarchical data
|
|
9
9
|
* - moe: Mixture of Experts routing
|
|
10
10
|
* - graph-rope: Graph-aware positional embeddings
|
|
11
11
|
*
|
|
12
|
-
* Performance Targets:
|
|
13
|
-
* - Flash Attention: 2.49x-7.47x speedup
|
|
14
|
-
* - Memory Reduction: 50-75%
|
|
15
|
-
* - MoE Routing: <5ms
|
|
16
|
-
*
|
|
17
12
|
* @module v3/swarm/attention-coordinator
|
|
18
13
|
*/
|
|
19
14
|
import { EventEmitter } from 'events';
|
|
@@ -55,8 +50,6 @@ export class AttentionCoordinator extends EventEmitter {
|
|
|
55
50
|
performanceStats = {
|
|
56
51
|
totalCoordinations: 0,
|
|
57
52
|
totalLatency: 0,
|
|
58
|
-
flashSpeedup: 0,
|
|
59
|
-
memoryReduction: 0,
|
|
60
53
|
};
|
|
61
54
|
constructor(embeddingProvider, config = {}) {
|
|
62
55
|
super();
|
|
@@ -197,7 +190,7 @@ export class AttentionCoordinator extends EventEmitter {
|
|
|
197
190
|
// Attention Mechanism Implementations
|
|
198
191
|
// ===========================================================================
|
|
199
192
|
/**
|
|
200
|
-
* Flash Attention -
|
|
193
|
+
* Flash Attention - memory-efficient attention
|
|
201
194
|
*/
|
|
202
195
|
async flashAttentionCoordination(agentOutputs) {
|
|
203
196
|
await this.ensureEmbeddings(agentOutputs);
|
|
@@ -235,8 +228,6 @@ export class AttentionCoordinator extends EventEmitter {
|
|
|
235
228
|
memoryUsed,
|
|
236
229
|
participatingAgents: agentOutputs.map(o => o.agentId),
|
|
237
230
|
metadata: {
|
|
238
|
-
speedup: '2.49x-7.47x',
|
|
239
|
-
memoryReduction: '75%',
|
|
240
231
|
blockSize,
|
|
241
232
|
},
|
|
242
233
|
};
|
|
@@ -669,12 +660,6 @@ export class AttentionCoordinator extends EventEmitter {
|
|
|
669
660
|
updateStats(latency, mechanism, result) {
|
|
670
661
|
this.performanceStats.totalCoordinations++;
|
|
671
662
|
this.performanceStats.totalLatency += latency;
|
|
672
|
-
if (mechanism === 'flash') {
|
|
673
|
-
// Track Flash Attention performance
|
|
674
|
-
// In production, compare against baseline
|
|
675
|
-
this.performanceStats.flashSpeedup = 2.49 + Math.random() * 4.98; // 2.49x-7.47x
|
|
676
|
-
this.performanceStats.memoryReduction = 0.75;
|
|
677
|
-
}
|
|
678
663
|
}
|
|
679
664
|
// ===========================================================================
|
|
680
665
|
// Public Getters
|
|
@@ -293,7 +293,7 @@ export class AgentRegistry {
|
|
|
293
293
|
id: 'agent-7',
|
|
294
294
|
role: 'memory-specialist',
|
|
295
295
|
domain: 'core',
|
|
296
|
-
description: 'Memory system unification with AgentDB (
|
|
296
|
+
description: 'Memory system unification with AgentDB (HNSW ANN search)',
|
|
297
297
|
capabilities: [
|
|
298
298
|
{ name: 'memory-optimization', description: 'Optimize memory systems', supportedTaskTypes: ['memory-optimization', 'implementation'] }
|
|
299
299
|
],
|
|
@@ -370,7 +370,7 @@ export class AgentRegistry {
|
|
|
370
370
|
id: 'agent-14',
|
|
371
371
|
role: 'performance-engineer',
|
|
372
372
|
domain: 'performance',
|
|
373
|
-
description: 'Benchmarking and performance optimization
|
|
373
|
+
description: 'Benchmarking and performance optimization',
|
|
374
374
|
capabilities: [
|
|
375
375
|
{ name: 'benchmarking', description: 'Run performance benchmarks', supportedTaskTypes: ['benchmark'] }
|
|
376
376
|
],
|
|
@@ -406,7 +406,7 @@ export class SwarmHub {
|
|
|
406
406
|
activeAgents: ['agent-1', 'agent-5', 'agent-6', 'agent-7', 'agent-8', 'agent-9', 'agent-13'],
|
|
407
407
|
goals: [
|
|
408
408
|
'Complete core module implementation',
|
|
409
|
-
'Unify memory system with AgentDB (
|
|
409
|
+
'Unify memory system with AgentDB (HNSW ANN search)',
|
|
410
410
|
'Merge 4 coordination systems into single SwarmCoordinator',
|
|
411
411
|
'Optimize MCP server',
|
|
412
412
|
'Implement TDD London School tests'
|
|
@@ -439,8 +439,8 @@ export class SwarmHub {
|
|
|
439
439
|
'agent-13', 'agent-14', 'agent-15'
|
|
440
440
|
],
|
|
441
441
|
goals: [
|
|
442
|
-
'
|
|
443
|
-
'Verify
|
|
442
|
+
'Enable Flash Attention (memory-efficient attention)',
|
|
443
|
+
'Verify AgentDB HNSW (ANN) search',
|
|
444
444
|
'Complete deployment pipeline',
|
|
445
445
|
'Final test coverage push (>90%)',
|
|
446
446
|
'Release v3.0.0'
|
|
@@ -479,10 +479,10 @@ export class SwarmHub {
|
|
|
479
479
|
{
|
|
480
480
|
id: 'ms-memory-unification',
|
|
481
481
|
name: 'Memory Unification Complete',
|
|
482
|
-
description: 'Single memory service with AgentDB
|
|
482
|
+
description: 'Single memory service with AgentDB HNSW (ANN) backend',
|
|
483
483
|
criteria: [
|
|
484
484
|
{ description: 'AgentDB integrated', met: false, evidence: null },
|
|
485
|
-
{ description: '
|
|
485
|
+
{ description: 'HNSW (ANN) search verified', met: false, evidence: null },
|
|
486
486
|
{ description: 'Hybrid backend working', met: false, evidence: null }
|
|
487
487
|
],
|
|
488
488
|
status: 'pending',
|
|
@@ -517,9 +517,9 @@ export class SwarmHub {
|
|
|
517
517
|
name: 'Performance Targets Met',
|
|
518
518
|
description: 'All performance targets achieved and verified',
|
|
519
519
|
criteria: [
|
|
520
|
-
{ description: '
|
|
521
|
-
{ description: '
|
|
522
|
-
{ description: '
|
|
520
|
+
{ description: 'Flash Attention (memory-efficient attention)', met: false, evidence: null },
|
|
521
|
+
{ description: 'AgentDB HNSW (ANN) search', met: false, evidence: null },
|
|
522
|
+
{ description: 'Int8 quantized memory', met: false, evidence: null },
|
|
523
523
|
{ description: '<500ms startup time', met: false, evidence: null }
|
|
524
524
|
],
|
|
525
525
|
status: 'pending',
|
package/dist/src/cli/version.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "moflo",
|
|
3
|
-
"version": "4.11.
|
|
3
|
+
"version": "4.11.9",
|
|
4
4
|
"description": "MoFlo — AI agent orchestration for Claude Code. A standalone, opinionated toolkit with semantic memory, learned routing, gates, spells, and the /flo issue-execution skill.",
|
|
5
5
|
"main": "dist/src/cli/index.js",
|
|
6
6
|
"type": "module",
|
|
@@ -94,7 +94,7 @@
|
|
|
94
94
|
"@typescript-eslint/eslint-plugin": "^7.18.0",
|
|
95
95
|
"@typescript-eslint/parser": "^7.18.0",
|
|
96
96
|
"eslint": "^8.0.0",
|
|
97
|
-
"moflo": "^4.11.
|
|
97
|
+
"moflo": "^4.11.8",
|
|
98
98
|
"tsx": "^4.21.0",
|
|
99
99
|
"typescript": "^5.9.3",
|
|
100
100
|
"vitest": "^4.0.0"
|