@monoes/monomindcli 1.11.14 → 1.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/generated/channel-intelligence-director.md +87 -0
- package/.claude/agents/generated/chief-growth-officer.md +88 -0
- package/.claude/agents/generated/content-seo-strategist.md +90 -0
- package/.claude/agents/generated/developer-community-strategist.md +91 -0
- package/.claude/agents/generated/outreach-partnership-strategist.md +90 -0
- package/.claude/agents/generated/social-media-strategist.md +91 -0
- package/.claude/agents/generated/video-visual-strategist.md +90 -0
- package/.claude/commands/mastermind/master.md +1 -1
- package/.claude/helpers/auto-memory-hook.mjs +13 -4
- package/.claude/helpers/control-start.cjs +5 -0
- package/.claude/helpers/event-logger.cjs +114 -0
- package/.claude/helpers/handlers/adr-draft-handler.cjs +19 -5
- package/.claude/helpers/handlers/agent-start-handler.cjs +13 -4
- package/.claude/helpers/handlers/compact-handler.cjs +2 -0
- package/.claude/helpers/handlers/edit-handler.cjs +1 -1
- package/.claude/helpers/handlers/gates-handler.cjs +3 -0
- package/.claude/helpers/handlers/graph-status-handler.cjs +14 -8
- package/.claude/helpers/handlers/loops-status-handler.cjs +5 -2
- package/.claude/helpers/handlers/route-handler.cjs +24 -10
- package/.claude/helpers/handlers/session-handler.cjs +11 -4
- package/.claude/helpers/handlers/session-restore-handler.cjs +35 -19
- package/.claude/helpers/handlers/task-handler.cjs +13 -5
- package/.claude/helpers/hook-handler.cjs +40 -0
- package/.claude/helpers/intelligence.cjs +130 -53
- package/.claude/helpers/loop-tracker.cjs +15 -3
- package/.claude/helpers/memory-palace.cjs +461 -0
- package/.claude/helpers/memory.cjs +138 -14
- package/.claude/helpers/metrics-db.mjs +87 -0
- package/.claude/helpers/router.cjs +300 -42
- package/.claude/helpers/session.cjs +89 -30
- package/.claude/helpers/statusline.cjs +148 -4
- package/.claude/helpers/toggle-statusline.cjs +73 -0
- package/.claude/helpers/token-tracker.cjs +934 -0
- package/.claude/helpers/utils/micro-agents.cjs +20 -4
- package/.claude/helpers/utils/monograph.cjs +39 -4
- package/.claude/helpers/utils/telemetry.cjs +3 -3
- package/.claude/skills/mastermind/_protocol.md +25 -15
- package/.claude/skills/mastermind/architect.md +3 -3
- package/.claude/skills/mastermind/autodev.md +4 -2
- package/.claude/skills/mastermind/idea.md +10 -0
- package/.claude/skills/mastermind/ops.md +3 -3
- package/.claude/skills/mastermind/runorg.md +153 -86
- package/dist/src/agents/registry-builder.d.ts.map +1 -1
- package/dist/src/agents/registry-builder.js +2 -0
- package/dist/src/agents/registry-builder.js.map +1 -1
- package/dist/src/autopilot-state.d.ts.map +1 -1
- package/dist/src/autopilot-state.js +10 -5
- package/dist/src/autopilot-state.js.map +1 -1
- package/dist/src/benchmarks/benchmark-runner.d.ts.map +1 -1
- package/dist/src/benchmarks/benchmark-runner.js +13 -0
- package/dist/src/benchmarks/benchmark-runner.js.map +1 -1
- package/dist/src/benchmarks/metric-evaluators.d.ts.map +1 -1
- package/dist/src/benchmarks/metric-evaluators.js +20 -9
- package/dist/src/benchmarks/metric-evaluators.js.map +1 -1
- package/dist/src/browser/actions.d.ts.map +1 -1
- package/dist/src/browser/actions.js +10 -3
- package/dist/src/browser/actions.js.map +1 -1
- package/dist/src/browser/browser.d.ts.map +1 -1
- package/dist/src/browser/browser.js +12 -2
- package/dist/src/browser/browser.js.map +1 -1
- package/dist/src/browser/cdp.d.ts.map +1 -1
- package/dist/src/browser/cdp.js +21 -3
- package/dist/src/browser/cdp.js.map +1 -1
- package/dist/src/browser/har.d.ts.map +1 -1
- package/dist/src/browser/har.js +27 -5
- package/dist/src/browser/har.js.map +1 -1
- package/dist/src/commands/agent.d.ts.map +1 -1
- package/dist/src/commands/agent.js +11 -8
- package/dist/src/commands/agent.js.map +1 -1
- package/dist/src/commands/analyze.d.ts.map +1 -1
- package/dist/src/commands/analyze.js +36 -21
- package/dist/src/commands/analyze.js.map +1 -1
- package/dist/src/commands/autopilot.d.ts.map +1 -1
- package/dist/src/commands/autopilot.js +12 -4
- package/dist/src/commands/autopilot.js.map +1 -1
- package/dist/src/commands/benchmark.d.ts.map +1 -1
- package/dist/src/commands/benchmark.js +51 -8
- package/dist/src/commands/benchmark.js.map +1 -1
- package/dist/src/commands/browse.d.ts.map +1 -1
- package/dist/src/commands/browse.js +5 -2
- package/dist/src/commands/browse.js.map +1 -1
- package/dist/src/commands/claims.d.ts.map +1 -1
- package/dist/src/commands/claims.js +29 -11
- package/dist/src/commands/claims.js.map +1 -1
- package/dist/src/commands/cleanup.d.ts.map +1 -1
- package/dist/src/commands/cleanup.js +25 -5
- package/dist/src/commands/cleanup.js.map +1 -1
- package/dist/src/commands/config.d.ts.map +1 -1
- package/dist/src/commands/config.js +15 -7
- package/dist/src/commands/config.js.map +1 -1
- package/dist/src/commands/daemon.d.ts.map +1 -1
- package/dist/src/commands/daemon.js +6 -0
- package/dist/src/commands/daemon.js.map +1 -1
- package/dist/src/commands/deployment.d.ts.map +1 -1
- package/dist/src/commands/deployment.js +34 -19
- package/dist/src/commands/deployment.js.map +1 -1
- package/dist/src/commands/doctor.d.ts.map +1 -1
- package/dist/src/commands/doctor.js +133 -15
- package/dist/src/commands/doctor.js.map +1 -1
- package/dist/src/commands/guidance.d.ts.map +1 -1
- package/dist/src/commands/guidance.js +15 -2
- package/dist/src/commands/guidance.js.map +1 -1
- package/dist/src/commands/hive-mind.d.ts.map +1 -1
- package/dist/src/commands/hive-mind.js +37 -14
- package/dist/src/commands/hive-mind.js.map +1 -1
- package/dist/src/commands/hooks.d.ts.map +1 -1
- package/dist/src/commands/hooks.js +42 -25
- package/dist/src/commands/hooks.js.map +1 -1
- package/dist/src/commands/init.d.ts.map +1 -1
- package/dist/src/commands/init.js +9 -4
- package/dist/src/commands/init.js.map +1 -1
- package/dist/src/commands/issues.d.ts.map +1 -1
- package/dist/src/commands/issues.js +29 -26
- package/dist/src/commands/issues.js.map +1 -1
- package/dist/src/commands/mcp.d.ts.map +1 -1
- package/dist/src/commands/mcp.js +11 -5
- package/dist/src/commands/mcp.js.map +1 -1
- package/dist/src/commands/memory.d.ts.map +1 -1
- package/dist/src/commands/memory.js +10 -0
- package/dist/src/commands/memory.js.map +1 -1
- package/dist/src/commands/migrate.js +5 -5
- package/dist/src/commands/migrate.js.map +1 -1
- package/dist/src/commands/monograph.d.ts.map +1 -1
- package/dist/src/commands/monograph.js +18 -5
- package/dist/src/commands/monograph.js.map +1 -1
- package/dist/src/commands/monovector/backup.d.ts.map +1 -1
- package/dist/src/commands/monovector/backup.js +8 -2
- package/dist/src/commands/monovector/backup.js.map +1 -1
- package/dist/src/commands/monovector/benchmark.d.ts.map +1 -1
- package/dist/src/commands/monovector/benchmark.js +20 -7
- package/dist/src/commands/monovector/benchmark.js.map +1 -1
- package/dist/src/commands/monovector/import.d.ts.map +1 -1
- package/dist/src/commands/monovector/import.js +15 -0
- package/dist/src/commands/monovector/import.js.map +1 -1
- package/dist/src/commands/monovector/migrate.d.ts.map +1 -1
- package/dist/src/commands/monovector/migrate.js +4 -1
- package/dist/src/commands/monovector/migrate.js.map +1 -1
- package/dist/src/commands/monovector/optimize.d.ts.map +1 -1
- package/dist/src/commands/monovector/optimize.js +11 -0
- package/dist/src/commands/monovector/optimize.js.map +1 -1
- package/dist/src/commands/monovector/setup.d.ts.map +1 -1
- package/dist/src/commands/monovector/setup.js +11 -1
- package/dist/src/commands/monovector/setup.js.map +1 -1
- package/dist/src/commands/neural.js +1 -1
- package/dist/src/commands/neural.js.map +1 -1
- package/dist/src/commands/performance.d.ts.map +1 -1
- package/dist/src/commands/performance.js +20 -7
- package/dist/src/commands/performance.js.map +1 -1
- package/dist/src/commands/platforms.d.ts.map +1 -1
- package/dist/src/commands/platforms.js +90 -8
- package/dist/src/commands/platforms.js.map +1 -1
- package/dist/src/commands/plugins.d.ts.map +1 -1
- package/dist/src/commands/plugins.js +12 -5
- package/dist/src/commands/plugins.js.map +1 -1
- package/dist/src/commands/process.d.ts.map +1 -1
- package/dist/src/commands/process.js +33 -10
- package/dist/src/commands/process.js.map +1 -1
- package/dist/src/commands/progress.d.ts.map +1 -1
- package/dist/src/commands/progress.js +5 -3
- package/dist/src/commands/progress.js.map +1 -1
- package/dist/src/commands/providers.js +5 -5
- package/dist/src/commands/providers.js.map +1 -1
- package/dist/src/commands/replay.d.ts.map +1 -1
- package/dist/src/commands/replay.js +8 -2
- package/dist/src/commands/replay.js.map +1 -1
- package/dist/src/commands/route.d.ts.map +1 -1
- package/dist/src/commands/route.js +27 -7
- package/dist/src/commands/route.js.map +1 -1
- package/dist/src/commands/security.d.ts.map +1 -1
- package/dist/src/commands/security.js +4 -0
- package/dist/src/commands/security.js.map +1 -1
- package/dist/src/commands/session.d.ts.map +1 -1
- package/dist/src/commands/session.js +12 -1
- package/dist/src/commands/session.js.map +1 -1
- package/dist/src/commands/start.d.ts.map +1 -1
- package/dist/src/commands/start.js +11 -4
- package/dist/src/commands/start.js.map +1 -1
- package/dist/src/commands/status.d.ts.map +1 -1
- package/dist/src/commands/status.js +7 -4
- package/dist/src/commands/status.js.map +1 -1
- package/dist/src/commands/swarm.d.ts.map +1 -1
- package/dist/src/commands/swarm.js +27 -13
- package/dist/src/commands/swarm.js.map +1 -1
- package/dist/src/commands/task.d.ts.map +1 -1
- package/dist/src/commands/task.js +26 -11
- package/dist/src/commands/task.js.map +1 -1
- package/dist/src/commands/tokens.d.ts.map +1 -1
- package/dist/src/commands/tokens.js +7 -2
- package/dist/src/commands/tokens.js.map +1 -1
- package/dist/src/commands/transfer-store.d.ts.map +1 -1
- package/dist/src/commands/transfer-store.js +36 -22
- package/dist/src/commands/transfer-store.js.map +1 -1
- package/dist/src/commands/update.d.ts.map +1 -1
- package/dist/src/commands/update.js +15 -3
- package/dist/src/commands/update.js.map +1 -1
- package/dist/src/commands/workflow.d.ts.map +1 -1
- package/dist/src/commands/workflow.js +39 -6
- package/dist/src/commands/workflow.js.map +1 -1
- package/dist/src/consensus/audit-writer.d.ts.map +1 -1
- package/dist/src/consensus/audit-writer.js +18 -7
- package/dist/src/consensus/audit-writer.js.map +1 -1
- package/dist/src/consensus/vote-signer.d.ts.map +1 -1
- package/dist/src/consensus/vote-signer.js +25 -8
- package/dist/src/consensus/vote-signer.js.map +1 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +7 -3
- package/dist/src/index.js.map +1 -1
- package/dist/src/init/executor.d.ts.map +1 -1
- package/dist/src/init/executor.js +14 -11
- package/dist/src/init/executor.js.map +1 -1
- package/dist/src/init/shared-instructions-generator.d.ts.map +1 -1
- package/dist/src/init/shared-instructions-generator.js +20 -4
- package/dist/src/init/shared-instructions-generator.js.map +1 -1
- package/dist/src/init/statusline-generator.d.ts.map +1 -1
- package/dist/src/init/statusline-generator.js +36 -15
- package/dist/src/init/statusline-generator.js.map +1 -1
- package/dist/src/mcp-tools/a2a-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/a2a-tools.js +98 -13
- package/dist/src/mcp-tools/a2a-tools.js.map +1 -1
- package/dist/src/mcp-tools/agent-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/agent-tools.js +16 -3
- package/dist/src/mcp-tools/agent-tools.js.map +1 -1
- package/dist/src/mcp-tools/analyze-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/analyze-tools.js +80 -17
- package/dist/src/mcp-tools/analyze-tools.js.map +1 -1
- package/dist/src/mcp-tools/browser-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/browser-tools.js +84 -22
- package/dist/src/mcp-tools/browser-tools.js.map +1 -1
- package/dist/src/mcp-tools/claims-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/claims-tools.js +35 -7
- package/dist/src/mcp-tools/claims-tools.js.map +1 -1
- package/dist/src/mcp-tools/config-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/config-tools.js +82 -17
- package/dist/src/mcp-tools/config-tools.js.map +1 -1
- package/dist/src/mcp-tools/coordination-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/coordination-tools.js +37 -4
- package/dist/src/mcp-tools/coordination-tools.js.map +1 -1
- package/dist/src/mcp-tools/daa-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/daa-tools.js +49 -7
- package/dist/src/mcp-tools/daa-tools.js.map +1 -1
- package/dist/src/mcp-tools/embeddings-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/embeddings-tools.js +45 -18
- package/dist/src/mcp-tools/embeddings-tools.js.map +1 -1
- package/dist/src/mcp-tools/github-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/github-tools.js +75 -25
- package/dist/src/mcp-tools/github-tools.js.map +1 -1
- package/dist/src/mcp-tools/guidance-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/guidance-tools.js +32 -10
- package/dist/src/mcp-tools/guidance-tools.js.map +1 -1
- package/dist/src/mcp-tools/hive-mind-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/hive-mind-tools.js +91 -20
- package/dist/src/mcp-tools/hive-mind-tools.js.map +1 -1
- package/dist/src/mcp-tools/hooks-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/hooks-tools.js +188 -29
- package/dist/src/mcp-tools/hooks-tools.js.map +1 -1
- package/dist/src/mcp-tools/memory-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/memory-tools.js +25 -7
- package/dist/src/mcp-tools/memory-tools.js.map +1 -1
- package/dist/src/mcp-tools/monograph-compat.d.ts.map +1 -1
- package/dist/src/mcp-tools/monograph-compat.js +11 -2
- package/dist/src/mcp-tools/monograph-compat.js.map +1 -1
- package/dist/src/mcp-tools/monograph-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/monograph-tools.js +476 -62
- package/dist/src/mcp-tools/monograph-tools.js.map +1 -1
- package/dist/src/mcp-tools/neural-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/neural-tools.js +44 -9
- package/dist/src/mcp-tools/neural-tools.js.map +1 -1
- package/dist/src/mcp-tools/performance-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/performance-tools.js +45 -10
- package/dist/src/mcp-tools/performance-tools.js.map +1 -1
- package/dist/src/mcp-tools/progress-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/progress-tools.js +7 -4
- package/dist/src/mcp-tools/progress-tools.js.map +1 -1
- package/dist/src/mcp-tools/request-tracker.d.ts.map +1 -1
- package/dist/src/mcp-tools/request-tracker.js +15 -1
- package/dist/src/mcp-tools/request-tracker.js.map +1 -1
- package/dist/src/mcp-tools/security-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/security-tools.js +61 -9
- package/dist/src/mcp-tools/security-tools.js.map +1 -1
- package/dist/src/mcp-tools/session-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/session-tools.js +45 -14
- package/dist/src/mcp-tools/session-tools.js.map +1 -1
- package/dist/src/mcp-tools/swarm-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/swarm-tools.js +15 -3
- package/dist/src/mcp-tools/swarm-tools.js.map +1 -1
- package/dist/src/mcp-tools/system-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/system-tools.js +14 -7
- package/dist/src/mcp-tools/system-tools.js.map +1 -1
- package/dist/src/mcp-tools/task-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/task-tools.js +52 -10
- package/dist/src/mcp-tools/task-tools.js.map +1 -1
- package/dist/src/mcp-tools/terminal-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/terminal-tools.js +40 -6
- package/dist/src/mcp-tools/terminal-tools.js.map +1 -1
- package/dist/src/mcp-tools/transfer-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/transfer-tools.js +37 -4
- package/dist/src/mcp-tools/transfer-tools.js.map +1 -1
- package/dist/src/mcp-tools/workflow-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/workflow-tools.js +29 -6
- package/dist/src/mcp-tools/workflow-tools.js.map +1 -1
- package/dist/src/memory/ewc-consolidation.d.ts.map +1 -1
- package/dist/src/memory/ewc-consolidation.js +26 -10
- package/dist/src/memory/ewc-consolidation.js.map +1 -1
- package/dist/src/memory/intelligence.d.ts.map +1 -1
- package/dist/src/memory/intelligence.js +80 -19
- package/dist/src/memory/intelligence.js.map +1 -1
- package/dist/src/memory/memory-bridge.d.ts.map +1 -1
- package/dist/src/memory/memory-bridge.js +21 -2
- package/dist/src/memory/memory-bridge.js.map +1 -1
- package/dist/src/memory/memory-initializer.d.ts.map +1 -1
- package/dist/src/memory/memory-initializer.js +67 -3
- package/dist/src/memory/memory-initializer.js.map +1 -1
- package/dist/src/memory/sona-optimizer.d.ts.map +1 -1
- package/dist/src/memory/sona-optimizer.js +14 -4
- package/dist/src/memory/sona-optimizer.js.map +1 -1
- package/dist/src/monovector/command-outcomes.d.ts.map +1 -1
- package/dist/src/monovector/command-outcomes.js +43 -7
- package/dist/src/monovector/command-outcomes.js.map +1 -1
- package/dist/src/monovector/coverage-router.d.ts.map +1 -1
- package/dist/src/monovector/coverage-router.js +8 -4
- package/dist/src/monovector/coverage-router.js.map +1 -1
- package/dist/src/monovector/coverage-tools.d.ts.map +1 -1
- package/dist/src/monovector/coverage-tools.js +6 -3
- package/dist/src/monovector/coverage-tools.js.map +1 -1
- package/dist/src/monovector/diff-classifier.d.ts.map +1 -1
- package/dist/src/monovector/diff-classifier.js +13 -0
- package/dist/src/monovector/diff-classifier.js.map +1 -1
- package/dist/src/monovector/route-outcomes.d.ts +2 -1
- package/dist/src/monovector/route-outcomes.d.ts.map +1 -1
- package/dist/src/monovector/route-outcomes.js +46 -4
- package/dist/src/monovector/route-outcomes.js.map +1 -1
- package/dist/src/plugins/manager.d.ts.map +1 -1
- package/dist/src/plugins/manager.js +8 -3
- package/dist/src/plugins/manager.js.map +1 -1
- package/dist/src/plugins/store/discovery.d.ts.map +1 -1
- package/dist/src/plugins/store/discovery.js +46 -2
- package/dist/src/plugins/store/discovery.js.map +1 -1
- package/dist/src/plugins/store/search.d.ts.map +1 -1
- package/dist/src/plugins/store/search.js +5 -4
- package/dist/src/plugins/store/search.js.map +1 -1
- package/dist/src/production/circuit-breaker.d.ts.map +1 -1
- package/dist/src/production/circuit-breaker.js +17 -3
- package/dist/src/production/circuit-breaker.js.map +1 -1
- package/dist/src/production/error-handler.d.ts.map +1 -1
- package/dist/src/production/error-handler.js +3 -0
- package/dist/src/production/error-handler.js.map +1 -1
- package/dist/src/production/monitoring.d.ts.map +1 -1
- package/dist/src/production/monitoring.js +20 -3
- package/dist/src/production/monitoring.js.map +1 -1
- package/dist/src/production/rate-limiter.d.ts.map +1 -1
- package/dist/src/production/rate-limiter.js +13 -4
- package/dist/src/production/rate-limiter.js.map +1 -1
- package/dist/src/production/retry.d.ts.map +1 -1
- package/dist/src/production/retry.js +17 -9
- package/dist/src/production/retry.js.map +1 -1
- package/dist/src/routing/embed-worker.js +6 -2
- package/dist/src/routing/embed-worker.js.map +1 -1
- package/dist/src/routing/embedder.d.ts.map +1 -1
- package/dist/src/routing/embedder.js +0 -0
- package/dist/src/routing/embedder.js.map +1 -1
- package/dist/src/routing/llm-caller.d.ts.map +1 -1
- package/dist/src/routing/llm-caller.js +13 -2
- package/dist/src/routing/llm-caller.js.map +1 -1
- package/dist/src/routing/route-layer-factory.d.ts.map +1 -1
- package/dist/src/routing/route-layer-factory.js +18 -3
- package/dist/src/routing/route-layer-factory.js.map +1 -1
- package/dist/src/services/claim-service.d.ts +1 -0
- package/dist/src/services/claim-service.d.ts.map +1 -1
- package/dist/src/services/claim-service.js +8 -0
- package/dist/src/services/claim-service.js.map +1 -1
- package/dist/src/services/config-file-manager.d.ts.map +1 -1
- package/dist/src/services/config-file-manager.js +14 -2
- package/dist/src/services/config-file-manager.js.map +1 -1
- package/dist/src/services/headless-worker-executor.d.ts.map +1 -1
- package/dist/src/services/headless-worker-executor.js +18 -2
- package/dist/src/services/headless-worker-executor.js.map +1 -1
- package/dist/src/services/worker-daemon.d.ts.map +1 -1
- package/dist/src/services/worker-daemon.js +348 -17
- package/dist/src/services/worker-daemon.js.map +1 -1
- package/dist/src/transfer/anonymization/index.d.ts +0 -3
- package/dist/src/transfer/anonymization/index.d.ts.map +1 -1
- package/dist/src/transfer/anonymization/index.js +16 -1
- package/dist/src/transfer/anonymization/index.js.map +1 -1
- package/dist/src/transfer/export.d.ts.map +1 -1
- package/dist/src/transfer/export.js +8 -0
- package/dist/src/transfer/export.js.map +1 -1
- package/dist/src/transfer/ipfs/upload.d.ts.map +1 -1
- package/dist/src/transfer/ipfs/upload.js +33 -3
- package/dist/src/transfer/ipfs/upload.js.map +1 -1
- package/dist/src/transfer/serialization/cfp.d.ts.map +1 -1
- package/dist/src/transfer/serialization/cfp.js +8 -2
- package/dist/src/transfer/serialization/cfp.js.map +1 -1
- package/dist/src/transfer/storage/gcs.d.ts.map +1 -1
- package/dist/src/transfer/storage/gcs.js +37 -3
- package/dist/src/transfer/storage/gcs.js.map +1 -1
- package/dist/src/transfer/store/discovery.d.ts.map +1 -1
- package/dist/src/transfer/store/discovery.js +45 -3
- package/dist/src/transfer/store/discovery.js.map +1 -1
- package/dist/src/transfer/store/download.d.ts.map +1 -1
- package/dist/src/transfer/store/download.js +5 -0
- package/dist/src/transfer/store/download.js.map +1 -1
- package/dist/src/transfer/store/publish.d.ts.map +1 -1
- package/dist/src/transfer/store/publish.js +13 -1
- package/dist/src/transfer/store/publish.js.map +1 -1
- package/dist/src/transfer/store/registry.d.ts +8 -0
- package/dist/src/transfer/store/registry.d.ts.map +1 -1
- package/dist/src/transfer/store/registry.js +30 -5
- package/dist/src/transfer/store/registry.js.map +1 -1
- package/dist/src/transfer/store/search.d.ts.map +1 -1
- package/dist/src/transfer/store/search.js +20 -5
- package/dist/src/transfer/store/search.js.map +1 -1
- package/dist/src/ui/collector.mjs +39 -5
- package/dist/src/ui/dashboard.html +1603 -1284
- package/dist/src/ui/orgs.html +722 -12
- package/dist/src/ui/server.mjs +717 -136
- package/dist/src/update/checker.d.ts.map +1 -1
- package/dist/src/update/checker.js +59 -7
- package/dist/src/update/checker.js.map +1 -1
- package/dist/src/update/executor.d.ts.map +1 -1
- package/dist/src/update/executor.js +50 -3
- package/dist/src/update/executor.js.map +1 -1
- package/dist/src/update/index.d.ts.map +1 -1
- package/dist/src/update/index.js +18 -1
- package/dist/src/update/index.js.map +1 -1
- package/dist/src/update/rate-limiter.d.ts +6 -0
- package/dist/src/update/rate-limiter.d.ts.map +1 -1
- package/dist/src/update/rate-limiter.js +79 -7
- package/dist/src/update/rate-limiter.js.map +1 -1
- package/dist/src/update/validator.d.ts.map +1 -1
- package/dist/src/update/validator.js +52 -1
- package/dist/src/update/validator.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -3
- package/dist/src/ui/data/mastermind-events.jsonl +0 -59
|
@@ -0,0 +1,461 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
/**
|
|
3
|
+
* memory-palace.cjs — MemPalace-inspired cross-session memory for Monomind
|
|
4
|
+
*
|
|
5
|
+
* Architecture (Wing → Room → Hall namespace hierarchy):
|
|
6
|
+
* Drawers verbatim 800-char chunks with 100-char overlap → drawers.jsonl
|
|
7
|
+
* Closets regex topic-pointer index (no AI calls) → closets.jsonl
|
|
8
|
+
* KG temporal knowledge graph (SQLite-free triples) → kg.json
|
|
9
|
+
*
|
|
10
|
+
* Memory stack:
|
|
11
|
+
* L0 identity identity.md — static, user-maintained
|
|
12
|
+
* L1 essential top-scored recent drawers → injected on session-restore
|
|
13
|
+
* L2 on-demand recall(wing, room) — explicit namespace pull
|
|
14
|
+
* L3 deep search search(query) — Okapi BM25 across all drawers
|
|
15
|
+
*
|
|
16
|
+
* Wire points in hook-handler.cjs:
|
|
17
|
+
* session-restore → wakeUp(CWD) injects L0 + L1 into session context
|
|
18
|
+
* post-task → storeVerbatim(...) files the verbatim task chunks
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
const fs = require('fs');
|
|
22
|
+
const path = require('path');
|
|
23
|
+
|
|
24
|
+
// ── constants ─────────────────────────────────────────────────────────────────
|
|
25
|
+
const DRAWER_SIZE = 800; // chars per verbatim chunk
|
|
26
|
+
const OVERLAP = 100; // overlap between consecutive chunks
|
|
27
|
+
const L1_LIMIT = 5; // max drawers surfaced in essential story
|
|
28
|
+
const L1_DAYS = 30; // look-back window for L1 drawers (days)
|
|
29
|
+
const BM25_K1 = 1.5; // term-frequency saturation
|
|
30
|
+
const BM25_B = 0.75; // length normalisation
|
|
31
|
+
|
|
32
|
+
// ── filesystem helpers ────────────────────────────────────────────────────────
|
|
33
|
+
function palaceDir(cwd) {
|
|
34
|
+
return path.join(cwd, '.monomind', 'palace');
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function ensureDir(dir) {
|
|
38
|
+
if (!fs.existsSync(dir)) {
|
|
39
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function readJsonl(filePath) {
|
|
44
|
+
if (!fs.existsSync(filePath)) return [];
|
|
45
|
+
try {
|
|
46
|
+
return fs.readFileSync(filePath, 'utf-8')
|
|
47
|
+
.split('\n')
|
|
48
|
+
.filter(Boolean)
|
|
49
|
+
.map(function(line) { return JSON.parse(line); });
|
|
50
|
+
} catch (e) {
|
|
51
|
+
return [];
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function appendJsonl(filePath, record) {
|
|
56
|
+
fs.appendFileSync(filePath, JSON.stringify(record) + '\n', 'utf-8');
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function readJson(filePath, fallback) {
|
|
60
|
+
if (!fs.existsSync(filePath)) return fallback;
|
|
61
|
+
try {
|
|
62
|
+
return JSON.parse(fs.readFileSync(filePath, 'utf-8'));
|
|
63
|
+
} catch (e) {
|
|
64
|
+
return fallback;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function writeJson(filePath, data) {
|
|
69
|
+
fs.writeFileSync(filePath, JSON.stringify(data, null, 2), 'utf-8');
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function uid() {
|
|
73
|
+
return Date.now().toString(36) + Math.random().toString(36).slice(2, 7);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// ── Okapi BM25 ────────────────────────────────────────────────────────────────
|
|
77
|
+
function tokenize(text) {
|
|
78
|
+
return (text || '').toLowerCase().replace(/[^a-z0-9\s]/g, ' ').split(/\s+/).filter(Boolean);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* bm25(query, docs) → [{ id, score }, …] sorted descending
|
|
83
|
+
* docs: array of { id, text }
|
|
84
|
+
*/
|
|
85
|
+
function bm25(query, docs) {
|
|
86
|
+
if (!docs || docs.length === 0) return [];
|
|
87
|
+
var qTerms = tokenize(query);
|
|
88
|
+
if (qTerms.length === 0) return docs.map(function(d) { return { id: d.id, score: 0 }; });
|
|
89
|
+
|
|
90
|
+
// Pre-tokenize every document
|
|
91
|
+
var tokenized = docs.map(function(d) {
|
|
92
|
+
return { id: d.id, tokens: tokenize(d.text || '') };
|
|
93
|
+
});
|
|
94
|
+
var N = tokenized.length;
|
|
95
|
+
var avgdl = tokenized.reduce(function(s, d) { return s + d.tokens.length; }, 0) / (N || 1);
|
|
96
|
+
|
|
97
|
+
// Document frequency per term
|
|
98
|
+
var df = {};
|
|
99
|
+
tokenized.forEach(function(d) {
|
|
100
|
+
var seen = {};
|
|
101
|
+
d.tokens.forEach(function(t) { seen[t] = true; });
|
|
102
|
+
Object.keys(seen).forEach(function(t) { df[t] = (df[t] || 0) + 1; });
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
// Score each document
|
|
106
|
+
return tokenized.map(function(d) {
|
|
107
|
+
var tf = {};
|
|
108
|
+
d.tokens.forEach(function(t) { tf[t] = (tf[t] || 0) + 1; });
|
|
109
|
+
var dl = d.tokens.length;
|
|
110
|
+
var score = 0;
|
|
111
|
+
qTerms.forEach(function(term) {
|
|
112
|
+
var f = tf[term] || 0;
|
|
113
|
+
if (f === 0) return;
|
|
114
|
+
var dfTerm = df[term] || 0;
|
|
115
|
+
var idf = Math.log((N - dfTerm + 0.5) / (dfTerm + 0.5) + 1);
|
|
116
|
+
score += idf * (f * (BM25_K1 + 1)) / (f + BM25_K1 * (1 - BM25_B + BM25_B * dl / avgdl));
|
|
117
|
+
});
|
|
118
|
+
return { id: d.id, score: score };
|
|
119
|
+
}).sort(function(a, b) { return b.score - a.score; });
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// ── closet extraction (no AI, regex only) ─────────────────────────────────────
|
|
123
|
+
/**
|
|
124
|
+
* buildClosets(content, drawerId) → [closet record, …]
|
|
125
|
+
* Extracts: section headers, action phrases, proper nouns, quoted passages.
|
|
126
|
+
*/
|
|
127
|
+
function buildClosets(content, drawerId) {
|
|
128
|
+
var results = [];
|
|
129
|
+
var ts = new Date().toISOString();
|
|
130
|
+
var m;
|
|
131
|
+
|
|
132
|
+
// Section headers (Markdown)
|
|
133
|
+
var headerRe = /^#{1,3}\s+(.+)$/gm;
|
|
134
|
+
while ((m = headerRe.exec(content)) !== null) {
|
|
135
|
+
results.push({ drawerId: drawerId, term: m[1].trim(), type: 'header', ts: ts });
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// Action phrases: "verb Object"
|
|
139
|
+
var actionRe = /\b(built|fixed|added|implemented|created|removed|updated|refactored|deployed|configured|enabled|disabled|migrated|merged|published|released|optimized|rewrote|designed|analyzed|reviewed)\s+([A-Za-z][A-Za-z0-9_/.-]{1,50})/g;
|
|
140
|
+
while ((m = actionRe.exec(content)) !== null) {
|
|
141
|
+
results.push({ drawerId: drawerId, term: m[1] + ' ' + m[2], type: 'action', ts: ts });
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// Proper nouns: consecutive Title Case words
|
|
145
|
+
var properRe = /\b([A-Z][a-z]+(?:\s+[A-Z][a-z]+)+)\b/g;
|
|
146
|
+
var properSeen = {};
|
|
147
|
+
while ((m = properRe.exec(content)) !== null) {
|
|
148
|
+
if (!properSeen[m[1]]) {
|
|
149
|
+
properSeen[m[1]] = true;
|
|
150
|
+
results.push({ drawerId: drawerId, term: m[1], type: 'proper', ts: ts });
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// Quoted passages (3–60 chars)
|
|
155
|
+
var quotedRe = /"([^"]{3,60})"|`([^`]{3,60})`/g;
|
|
156
|
+
while ((m = quotedRe.exec(content)) !== null) {
|
|
157
|
+
var phrase = (m[1] || m[2]).trim();
|
|
158
|
+
results.push({ drawerId: drawerId, term: phrase, type: 'quoted', ts: ts });
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
return results;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// ── storeVerbatim ─────────────────────────────────────────────────────────────
|
|
165
|
+
/**
|
|
166
|
+
* storeVerbatim(cwd, content, { wing, room, hall })
|
|
167
|
+
* Chunks content into DRAWER_SIZE-char segments (with OVERLAP), stores each
|
|
168
|
+
* as a drawer and extracts closet topics from each chunk.
|
|
169
|
+
*/
|
|
170
|
+
function storeVerbatim(cwd, content, meta) {
|
|
171
|
+
if (!content || typeof content !== 'string' || content.trim().length < 20) return;
|
|
172
|
+
var pDir = palaceDir(cwd);
|
|
173
|
+
ensureDir(pDir);
|
|
174
|
+
|
|
175
|
+
var wing = (meta && meta.wing) || 'general';
|
|
176
|
+
var room = (meta && meta.room) || 'default';
|
|
177
|
+
var hall = (meta && meta.hall) || '';
|
|
178
|
+
var ts = new Date().toISOString();
|
|
179
|
+
|
|
180
|
+
var drawersFile = path.join(pDir, 'drawers.jsonl');
|
|
181
|
+
var closetsFile = path.join(pDir, 'closets.jsonl');
|
|
182
|
+
|
|
183
|
+
var step = DRAWER_SIZE - OVERLAP;
|
|
184
|
+
var i = 0;
|
|
185
|
+
while (i < content.length) {
|
|
186
|
+
var chunk = content.slice(i, i + DRAWER_SIZE);
|
|
187
|
+
if (chunk.trim().length >= 20) {
|
|
188
|
+
var id = uid();
|
|
189
|
+
var drawer = { id: id, content: chunk, wing: wing, room: room, hall: hall, score: 1.0, ts: ts };
|
|
190
|
+
appendJsonl(drawersFile, drawer);
|
|
191
|
+
var closets = buildClosets(chunk, id);
|
|
192
|
+
closets.forEach(function(c) { appendJsonl(closetsFile, c); });
|
|
193
|
+
}
|
|
194
|
+
if (i + DRAWER_SIZE >= content.length) break;
|
|
195
|
+
i += step;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
// ── score persistence ─────────────────────────────────────────────────────────
|
|
200
|
+
/**
|
|
201
|
+
* _bumpScores(drawersFile, ids)
|
|
202
|
+
* Appends score bumps to a sidecar .score-diffs.jsonl instead of rewriting
|
|
203
|
+
* the full drawers.jsonl on every search. Compacts when sidecar reaches 100 entries.
|
|
204
|
+
* Called after search/recall so frequently-retrieved drawers rise to L1.
|
|
205
|
+
*/
|
|
206
|
+
function _bumpScores(drawersFile, ids) {
|
|
207
|
+
if (!ids || ids.length === 0) return;
|
|
208
|
+
var diffPath = drawersFile.replace('.jsonl', '-score-diffs.jsonl');
|
|
209
|
+
try {
|
|
210
|
+
var entry = JSON.stringify({ ts: Date.now(), bumpIds: ids, delta: 1 });
|
|
211
|
+
fs.appendFileSync(diffPath, entry + '\n', 'utf-8');
|
|
212
|
+
_maybeCompactScoreDiffs(drawersFile, diffPath);
|
|
213
|
+
} catch (e) { /* non-fatal */ }
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* _maybeCompactScoreDiffs(drawersFile, diffPath)
|
|
218
|
+
* When the sidecar accumulates >= 100 entries, apply all diffs to the drawers
|
|
219
|
+
* file atomically and delete the sidecar.
|
|
220
|
+
*/
|
|
221
|
+
function _maybeCompactScoreDiffs(drawersFile, diffPath) {
|
|
222
|
+
var lines;
|
|
223
|
+
try {
|
|
224
|
+
lines = fs.readFileSync(diffPath, 'utf-8').split('\n').filter(Boolean);
|
|
225
|
+
} catch { return; }
|
|
226
|
+
if (lines.length < 100) return;
|
|
227
|
+
_applyScoreDiffs(drawersFile, diffPath, lines);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* _applyScoreDiffs(drawersFile, diffPath, lines)
|
|
232
|
+
* Apply accumulated score diffs to drawers.jsonl atomically, then remove sidecar.
|
|
233
|
+
*/
|
|
234
|
+
function _applyScoreDiffs(drawersFile, diffPath, lines) {
|
|
235
|
+
try {
|
|
236
|
+
var drawers = readJsonl(drawersFile);
|
|
237
|
+
var diffs = (lines || fs.readFileSync(diffPath, 'utf-8').split('\n').filter(Boolean))
|
|
238
|
+
.map(function(l) { try { return JSON.parse(l); } catch { return null; } })
|
|
239
|
+
.filter(Boolean);
|
|
240
|
+
for (var i = 0; i < diffs.length; i++) {
|
|
241
|
+
var diff = diffs[i];
|
|
242
|
+
var delta = diff.delta || 1;
|
|
243
|
+
(diff.bumpIds || []).forEach(function(id) {
|
|
244
|
+
var d = drawers.find(function(x) { return x.id === id; });
|
|
245
|
+
if (d) d.score = (d.score || 1.0) + delta;
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
var tmpPath = drawersFile + '.tmp';
|
|
249
|
+
fs.writeFileSync(tmpPath, drawers.map(function(d) { return JSON.stringify(d); }).join('\n') + '\n', 'utf-8');
|
|
250
|
+
fs.renameSync(tmpPath, drawersFile);
|
|
251
|
+
try { fs.unlinkSync(diffPath); } catch {}
|
|
252
|
+
} catch (e) { /* non-fatal — leave sidecar intact for next attempt */ }
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
/**
|
|
256
|
+
* _getEffectiveDrawers(drawersFile)
|
|
257
|
+
* Read drawers.jsonl and apply any pending score diffs from the sidecar,
|
|
258
|
+
* returning the merged result without compacting. Used by wakeUp/recall/search
|
|
259
|
+
* to get accurate scores without triggering a full compact.
|
|
260
|
+
*/
|
|
261
|
+
function _getEffectiveDrawers(drawersFile) {
|
|
262
|
+
var drawers = readJsonl(drawersFile);
|
|
263
|
+
var diffPath = drawersFile.replace('.jsonl', '-score-diffs.jsonl');
|
|
264
|
+
try {
|
|
265
|
+
var lines = fs.readFileSync(diffPath, 'utf-8').split('\n').filter(Boolean);
|
|
266
|
+
var diffs = lines.map(function(l) { try { return JSON.parse(l); } catch { return null; } }).filter(Boolean);
|
|
267
|
+
// Build score bump totals per id
|
|
268
|
+
var bumps = {};
|
|
269
|
+
diffs.forEach(function(diff) {
|
|
270
|
+
(diff.bumpIds || []).forEach(function(id) {
|
|
271
|
+
bumps[id] = (bumps[id] || 0) + (diff.delta || 1);
|
|
272
|
+
});
|
|
273
|
+
});
|
|
274
|
+
drawers.forEach(function(d) {
|
|
275
|
+
if (bumps[d.id]) d.score = (d.score || 1.0) + bumps[d.id];
|
|
276
|
+
});
|
|
277
|
+
} catch { /* sidecar absent — use raw drawers */ }
|
|
278
|
+
return drawers;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
// ── search (L3 deep) ──────────────────────────────────────────────────────────
|
|
282
|
+
/**
|
|
283
|
+
* search(cwd, query, { wing, room, limit }) → drawer[]
|
|
284
|
+
* BM25 across all drawers + closet-topic boost, filtered by wing/room.
|
|
285
|
+
* Bumps score on retrieved drawers so L1 surfaces actually-used content.
|
|
286
|
+
*/
|
|
287
|
+
function search(cwd, query, opts) {
|
|
288
|
+
opts = opts || {};
|
|
289
|
+
var limit = opts.limit || 5;
|
|
290
|
+
var pDir = palaceDir(cwd);
|
|
291
|
+
var drawersFile = path.join(pDir, 'drawers.jsonl');
|
|
292
|
+
var drawers = _getEffectiveDrawers(drawersFile);
|
|
293
|
+
|
|
294
|
+
if (opts.wing) drawers = drawers.filter(function(d) { return d.wing === opts.wing; });
|
|
295
|
+
if (opts.room) drawers = drawers.filter(function(d) { return d.room === opts.room; });
|
|
296
|
+
if (drawers.length === 0) return [];
|
|
297
|
+
|
|
298
|
+
// BM25 baseline
|
|
299
|
+
var docs = drawers.map(function(d) { return { id: d.id, text: d.content }; });
|
|
300
|
+
var ranked = bm25(query, docs);
|
|
301
|
+
|
|
302
|
+
// Closet boost: drawers whose topic terms match query words get +0.5
|
|
303
|
+
try {
|
|
304
|
+
var closets = readJsonl(path.join(pDir, 'closets.jsonl'));
|
|
305
|
+
var qWords = tokenize(query);
|
|
306
|
+
var closetBoost = {};
|
|
307
|
+
closets.forEach(function(c) {
|
|
308
|
+
var termWords = tokenize(c.term);
|
|
309
|
+
var hit = termWords.some(function(w) { return qWords.indexOf(w) !== -1; });
|
|
310
|
+
if (hit) closetBoost[c.drawerId] = (closetBoost[c.drawerId] || 0) + 0.5;
|
|
311
|
+
});
|
|
312
|
+
if (Object.keys(closetBoost).length > 0) {
|
|
313
|
+
ranked.forEach(function(r) { r.score += (closetBoost[r.id] || 0); });
|
|
314
|
+
ranked.sort(function(a, b) { return b.score - a.score; });
|
|
315
|
+
}
|
|
316
|
+
} catch (e) { /* non-fatal */ }
|
|
317
|
+
|
|
318
|
+
var topIds = ranked.slice(0, limit).map(function(r) { return r.id; });
|
|
319
|
+
_bumpScores(drawersFile, topIds);
|
|
320
|
+
|
|
321
|
+
var drawerMap = {};
|
|
322
|
+
drawers.forEach(function(d) { drawerMap[d.id] = d; });
|
|
323
|
+
return topIds.map(function(id) { return drawerMap[id]; }).filter(Boolean);
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
// ── recall (L2 on-demand) ─────────────────────────────────────────────────────
|
|
327
|
+
/**
|
|
328
|
+
* recall(cwd, { wing, room, limit }) → drawer[]
|
|
329
|
+
* Returns drawers matching the namespace, sorted by score desc.
|
|
330
|
+
* Bumps score on returned drawers.
|
|
331
|
+
*/
|
|
332
|
+
function recall(cwd, opts) {
|
|
333
|
+
opts = opts || {};
|
|
334
|
+
var limit = opts.limit || 10;
|
|
335
|
+
var drawersFile = path.join(palaceDir(cwd), 'drawers.jsonl');
|
|
336
|
+
var drawers = _getEffectiveDrawers(drawersFile);
|
|
337
|
+
if (opts.wing) drawers = drawers.filter(function(d) { return d.wing === opts.wing; });
|
|
338
|
+
if (opts.room) drawers = drawers.filter(function(d) { return d.room === opts.room; });
|
|
339
|
+
var top = drawers
|
|
340
|
+
.sort(function(a, b) { return (b.score || 0) - (a.score || 0); })
|
|
341
|
+
.slice(0, limit);
|
|
342
|
+
_bumpScores(drawersFile, top.map(function(d) { return d.id; }));
|
|
343
|
+
return top;
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
// ── knowledge graph ───────────────────────────────────────────────────────────
|
|
347
|
+
/**
|
|
348
|
+
* kgAdd(cwd, subject, predicate, object, validFrom, confidence, sourceId)
|
|
349
|
+
* Appends a temporal triple. validFrom defaults to now; valid_to = null (open).
|
|
350
|
+
*/
|
|
351
|
+
function kgAdd(cwd, subject, predicate, object, validFrom, confidence, sourceId) {
|
|
352
|
+
var pDir = palaceDir(cwd);
|
|
353
|
+
ensureDir(pDir);
|
|
354
|
+
var kgFile = path.join(pDir, 'kg.json');
|
|
355
|
+
var kg = readJson(kgFile, []);
|
|
356
|
+
kg.push({
|
|
357
|
+
id: uid(),
|
|
358
|
+
subject: String(subject),
|
|
359
|
+
predicate: String(predicate),
|
|
360
|
+
object: String(object),
|
|
361
|
+
valid_from: validFrom || new Date().toISOString(),
|
|
362
|
+
valid_to: null,
|
|
363
|
+
confidence: typeof confidence === 'number' ? confidence : 1.0,
|
|
364
|
+
source_id: sourceId || null,
|
|
365
|
+
created_at: new Date().toISOString(),
|
|
366
|
+
});
|
|
367
|
+
writeJson(kgFile, kg);
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
/**
|
|
371
|
+
* kgQuery(cwd, entity, asOf) → triple[]
|
|
372
|
+
* Triples where subject = entity, valid at the given time (defaults to now).
|
|
373
|
+
*/
|
|
374
|
+
function kgQuery(cwd, entity, asOf) {
|
|
375
|
+
var kgFile = path.join(palaceDir(cwd), 'kg.json');
|
|
376
|
+
var kg = readJson(kgFile, []);
|
|
377
|
+
var t = asOf ? new Date(asOf).getTime() : Date.now();
|
|
378
|
+
return kg.filter(function(triple) {
|
|
379
|
+
if (triple.subject !== entity) return false;
|
|
380
|
+
var from = triple.valid_from ? new Date(triple.valid_from).getTime() : 0;
|
|
381
|
+
var to = triple.valid_to ? new Date(triple.valid_to).getTime() : Infinity;
|
|
382
|
+
return t >= from && t <= to;
|
|
383
|
+
});
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
/**
|
|
387
|
+
* kgTimeline(cwd, entity) → triple[] (chronological)
|
|
388
|
+
* Full history of facts about entity, sorted by valid_from.
|
|
389
|
+
*/
|
|
390
|
+
function kgTimeline(cwd, entity) {
|
|
391
|
+
var kgFile = path.join(palaceDir(cwd), 'kg.json');
|
|
392
|
+
var kg = readJson(kgFile, []);
|
|
393
|
+
return kg
|
|
394
|
+
.filter(function(t) { return t.subject === entity; })
|
|
395
|
+
.sort(function(a, b) {
|
|
396
|
+
return new Date(a.valid_from).getTime() - new Date(b.valid_from).getTime();
|
|
397
|
+
});
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
// ── wakeUp (L0 + L1 injection) ───────────────────────────────────────────────
|
|
401
|
+
/**
|
|
402
|
+
* wakeUp(cwd) → string
|
|
403
|
+
* Loads L0 identity context + generates L1 essential story from top-scored
|
|
404
|
+
* recent drawers. Returns a string for console.log injection into session.
|
|
405
|
+
*/
|
|
406
|
+
function wakeUp(cwd) {
|
|
407
|
+
var pDir = palaceDir(cwd);
|
|
408
|
+
var lines = [];
|
|
409
|
+
|
|
410
|
+
// L0 — identity.md (user-maintained, static)
|
|
411
|
+
var identityFile = path.join(pDir, 'identity.md');
|
|
412
|
+
if (fs.existsSync(identityFile)) {
|
|
413
|
+
try {
|
|
414
|
+
var identity = fs.readFileSync(identityFile, 'utf-8').trim();
|
|
415
|
+
if (identity) {
|
|
416
|
+
lines.push('[MEMORY_PALACE_L0] Identity:');
|
|
417
|
+
lines.push(identity);
|
|
418
|
+
}
|
|
419
|
+
} catch (e) { /* non-fatal */ }
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
// L1 — essential story: top-scored drawers from last L1_DAYS days
|
|
423
|
+
var drawersFile = path.join(pDir, 'drawers.jsonl');
|
|
424
|
+
if (fs.existsSync(drawersFile)) {
|
|
425
|
+
try {
|
|
426
|
+
var drawers = _getEffectiveDrawers(drawersFile);
|
|
427
|
+
var cutoff = Date.now() - L1_DAYS * 24 * 60 * 60 * 1000;
|
|
428
|
+
var recent = drawers.filter(function(d) {
|
|
429
|
+
return d.ts && new Date(d.ts).getTime() > cutoff;
|
|
430
|
+
});
|
|
431
|
+
var top = recent
|
|
432
|
+
.sort(function(a, b) { return (b.score || 0) - (a.score || 0); })
|
|
433
|
+
.slice(0, L1_LIMIT);
|
|
434
|
+
|
|
435
|
+
if (top.length > 0) {
|
|
436
|
+
lines.push('[MEMORY_PALACE_L1] Essential story (' + top.length + ' drawer' + (top.length !== 1 ? 's' : '') + '):');
|
|
437
|
+
top.forEach(function(d) {
|
|
438
|
+
var ns = (d.wing || '?') + '/' + (d.room || '?') + (d.hall ? '/' + d.hall : '');
|
|
439
|
+
var dateStr = d.ts ? d.ts.slice(0, 10) : '?';
|
|
440
|
+
var snippet = (d.content || '').slice(0, 300).replace(/\n/g, ' ');
|
|
441
|
+
lines.push('[' + ns + ' ' + dateStr + '] ' + snippet);
|
|
442
|
+
});
|
|
443
|
+
}
|
|
444
|
+
} catch (e) { /* non-fatal */ }
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
return lines.join('\n');
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
// ── exports ───────────────────────────────────────────────────────────────────
|
|
451
|
+
module.exports = {
|
|
452
|
+
wakeUp,
|
|
453
|
+
storeVerbatim,
|
|
454
|
+
buildClosets,
|
|
455
|
+
search,
|
|
456
|
+
recall,
|
|
457
|
+
bm25,
|
|
458
|
+
kgAdd,
|
|
459
|
+
kgQuery,
|
|
460
|
+
kgTimeline,
|
|
461
|
+
};
|
|
@@ -1,43 +1,153 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
/**
|
|
3
3
|
* Memory context bridge for hook-handler.cjs
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* Also usable as a CLI script: node memory.cjs [get|set|delete|clear|keys] [args...]
|
|
5
|
+
*
|
|
6
|
+
* CLI data path: $CLAUDE_PROJECT_DIR/.monomind/data/memory.json (or process.cwd())
|
|
7
|
+
* Module API: store(key, value, namespace), retrieve(query, namespace)
|
|
6
8
|
*/
|
|
7
9
|
|
|
8
10
|
const path = require('path');
|
|
9
11
|
const fs = require('fs');
|
|
10
12
|
|
|
11
13
|
const CWD = process.env.CLAUDE_PROJECT_DIR || process.cwd();
|
|
12
|
-
const MEMORY_DIR = path.join(CWD, '.monomind', 'memory');
|
|
13
|
-
const MEMORY_INDEX = path.join(MEMORY_DIR, 'hook-memory.json');
|
|
14
14
|
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
// ── CLI storage (flat JSON key→value map) ─────────────────────────────────────
|
|
16
|
+
|
|
17
|
+
const DATA_DIR = path.join(CWD, '.monomind', 'data');
|
|
18
|
+
const MEMORY_FILE = path.join(DATA_DIR, 'memory.json');
|
|
19
|
+
|
|
20
|
+
function ensureDataDir() {
|
|
21
|
+
try { fs.mkdirSync(DATA_DIR, { recursive: true }); } catch (_) {}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function loadMemory() {
|
|
25
|
+
try {
|
|
26
|
+
if (!fs.existsSync(MEMORY_FILE)) return {};
|
|
27
|
+
var st = fs.statSync(MEMORY_FILE);
|
|
28
|
+
if (st.size > 10 * 1024 * 1024) return {};
|
|
29
|
+
return JSON.parse(fs.readFileSync(MEMORY_FILE, 'utf-8'));
|
|
30
|
+
} catch (_) {
|
|
31
|
+
return {};
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function saveMemory(data) {
|
|
36
|
+
ensureDataDir();
|
|
37
|
+
try {
|
|
38
|
+
fs.writeFileSync(MEMORY_FILE, JSON.stringify(data, null, 2), 'utf-8');
|
|
39
|
+
} catch (_) {}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// ── CLI commands ──────────────────────────────────────────────────────────────
|
|
43
|
+
|
|
44
|
+
function cmdGet(key) {
|
|
45
|
+
var data = loadMemory();
|
|
46
|
+
if (!key) {
|
|
47
|
+
// Return all non-internal keys
|
|
48
|
+
var out = {};
|
|
49
|
+
for (var k in data) {
|
|
50
|
+
if (!k.startsWith('_')) out[k] = data[k];
|
|
51
|
+
}
|
|
52
|
+
process.stdout.write(JSON.stringify(out) + '\n');
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
if (Object.prototype.hasOwnProperty.call(data, key)) {
|
|
56
|
+
process.stdout.write(JSON.stringify(data[key]) + '\n');
|
|
57
|
+
} else {
|
|
58
|
+
process.stdout.write('undefined\n');
|
|
59
|
+
}
|
|
60
|
+
process.exit(0);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function cmdSet(key, value) {
|
|
64
|
+
if (!key) {
|
|
65
|
+
process.stderr.write('Key required\n');
|
|
66
|
+
process.exit(1);
|
|
67
|
+
}
|
|
68
|
+
var data = loadMemory();
|
|
69
|
+
data[key] = value;
|
|
70
|
+
data._updated = new Date().toISOString();
|
|
71
|
+
saveMemory(data);
|
|
72
|
+
process.stdout.write('Set: ' + key + '\n');
|
|
73
|
+
process.exit(0);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function cmdDelete(key) {
|
|
77
|
+
if (!key) {
|
|
78
|
+
process.stderr.write('Key required\n');
|
|
79
|
+
process.exit(1);
|
|
80
|
+
}
|
|
81
|
+
var data = loadMemory();
|
|
82
|
+
delete data[key];
|
|
83
|
+
data._updated = new Date().toISOString();
|
|
84
|
+
saveMemory(data);
|
|
85
|
+
process.stdout.write('Deleted: ' + key + '\n');
|
|
86
|
+
process.exit(0);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function cmdClear() {
|
|
90
|
+
saveMemory({});
|
|
91
|
+
process.stdout.write('Memory cleared\n');
|
|
92
|
+
process.exit(0);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function cmdKeys() {
|
|
96
|
+
var data = loadMemory();
|
|
97
|
+
var keys = Object.keys(data).filter(function(k) { return !k.startsWith('_'); });
|
|
98
|
+
if (keys.length > 0) {
|
|
99
|
+
process.stdout.write(keys.join('\n') + '\n');
|
|
100
|
+
} else {
|
|
101
|
+
process.stdout.write('');
|
|
102
|
+
}
|
|
103
|
+
process.exit(0);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
function cmdUsage() {
|
|
107
|
+
process.stdout.write(
|
|
108
|
+
'Usage: memory.cjs [get|set|delete|clear|keys] [key] [value...]\n' +
|
|
109
|
+
' get [key] — get a key or all keys\n' +
|
|
110
|
+
' set <key> <value> — set a key\n' +
|
|
111
|
+
' delete <key> — delete a key\n' +
|
|
112
|
+
' clear — clear all keys\n' +
|
|
113
|
+
' keys — list all user-defined keys\n'
|
|
114
|
+
);
|
|
115
|
+
process.exit(0);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// ── Module API (for hook-handler.cjs require()) ───────────────────────────────
|
|
119
|
+
|
|
120
|
+
const HOOK_MEMORY_DIR = path.join(CWD, '.monomind', 'memory');
|
|
121
|
+
const HOOK_MEMORY_INDEX = path.join(HOOK_MEMORY_DIR, 'hook-memory.json');
|
|
122
|
+
var MAX_INDEX_SIZE = 50 * 1024 * 1024;
|
|
123
|
+
|
|
124
|
+
function ensureHookDir() {
|
|
125
|
+
try { fs.mkdirSync(HOOK_MEMORY_DIR, { recursive: true }); } catch (_) {}
|
|
17
126
|
}
|
|
18
127
|
|
|
19
128
|
function loadIndex() {
|
|
20
129
|
try {
|
|
21
|
-
if (!fs.existsSync(
|
|
22
|
-
|
|
130
|
+
if (!fs.existsSync(HOOK_MEMORY_INDEX)) return [];
|
|
131
|
+
var st = fs.statSync(HOOK_MEMORY_INDEX);
|
|
132
|
+
if (st.size > MAX_INDEX_SIZE) return [];
|
|
133
|
+
return JSON.parse(fs.readFileSync(HOOK_MEMORY_INDEX, 'utf-8'));
|
|
23
134
|
} catch (_) {
|
|
24
135
|
return [];
|
|
25
136
|
}
|
|
26
137
|
}
|
|
27
138
|
|
|
28
139
|
function saveIndex(entries) {
|
|
29
|
-
|
|
140
|
+
ensureHookDir();
|
|
30
141
|
try {
|
|
31
|
-
// Keep most recent 500 entries
|
|
32
142
|
var trimmed = entries.slice(-500);
|
|
33
|
-
fs.writeFileSync(
|
|
143
|
+
fs.writeFileSync(HOOK_MEMORY_INDEX, JSON.stringify(trimmed, null, 2), 'utf-8');
|
|
34
144
|
} catch (_) {}
|
|
35
145
|
}
|
|
36
146
|
|
|
37
147
|
function store(key, value, namespace) {
|
|
38
148
|
var entries = loadIndex();
|
|
39
|
-
var ns = namespace || 'default';
|
|
40
|
-
|
|
149
|
+
var ns = String(namespace || 'default').slice(0, 128);
|
|
150
|
+
key = String(key || '').slice(0, 512);
|
|
41
151
|
entries = entries.filter(function(e) { return !(e.key === key && e.namespace === ns); });
|
|
42
152
|
entries.push({ key: key, value: value, namespace: ns, storedAt: new Date().toISOString() });
|
|
43
153
|
saveIndex(entries);
|
|
@@ -48,7 +158,6 @@ function retrieve(query, namespace) {
|
|
|
48
158
|
var ns = namespace || null;
|
|
49
159
|
if (ns) entries = entries.filter(function(e) { return e.namespace === ns; });
|
|
50
160
|
if (!query) return entries.slice(-10);
|
|
51
|
-
// Simple keyword search
|
|
52
161
|
var q = String(query).toLowerCase();
|
|
53
162
|
var scored = entries.map(function(e) {
|
|
54
163
|
var text = (e.key + ' ' + JSON.stringify(e.value || '')).toLowerCase();
|
|
@@ -66,4 +175,19 @@ function retrieve(query, namespace) {
|
|
|
66
175
|
.map(function(s) { return s.entry; });
|
|
67
176
|
}
|
|
68
177
|
|
|
178
|
+
// ── Entry point: run CLI when spawned directly ────────────────────────────────
|
|
179
|
+
|
|
180
|
+
if (require.main === module) {
|
|
181
|
+
var args = process.argv.slice(2);
|
|
182
|
+
var cmd = args[0];
|
|
183
|
+
switch (cmd) {
|
|
184
|
+
case 'get': cmdGet(args[1]); break;
|
|
185
|
+
case 'set': cmdSet(args[1], args.slice(2).join(' ')); break;
|
|
186
|
+
case 'delete': cmdDelete(args[1]); break;
|
|
187
|
+
case 'clear': cmdClear(); break;
|
|
188
|
+
case 'keys': cmdKeys(); break;
|
|
189
|
+
default: cmdUsage(); break;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
69
193
|
module.exports = { store, retrieve };
|