@hongmaple0820/scale-engine 0.48.0 → 0.50.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +2 -2
- package/README.md +2 -2
- package/dist/agents/evidenceDiscipline.d.ts +7 -0
- package/dist/agents/evidenceDiscipline.js +21 -0
- package/dist/agents/evidenceDiscipline.js.map +1 -0
- package/dist/agents/profiles.js +8 -1
- package/dist/agents/profiles.js.map +1 -1
- package/dist/agents/types.d.ts +1 -0
- package/dist/api/DashboardHttpConfig.d.ts +28 -0
- package/dist/api/DashboardHttpConfig.js +110 -0
- package/dist/api/DashboardHttpConfig.js.map +1 -0
- package/dist/api/cli.js +102 -11
- package/dist/api/cli.js.map +1 -1
- package/dist/api/http.d.ts +1 -0
- package/dist/api/http.js +50 -0
- package/dist/api/http.js.map +1 -0
- package/dist/artifact/types.d.ts +64 -0
- package/dist/artifact/types.js.map +1 -1
- package/dist/bootstrap/DependencyBootstrap.d.ts +1 -0
- package/dist/bootstrap/DependencyBootstrap.js +14 -3
- package/dist/bootstrap/DependencyBootstrap.js.map +1 -1
- package/dist/cli/cortexApplyCommand.d.ts +26 -0
- package/dist/cli/cortexApplyCommand.js +74 -0
- package/dist/cli/cortexApplyCommand.js.map +1 -0
- package/dist/cli/cortexCandidateCommands.d.ts +42 -0
- package/dist/cli/cortexCandidateCommands.js +119 -0
- package/dist/cli/cortexCandidateCommands.js.map +1 -0
- package/dist/cli/cortexCommands.d.ts +51 -0
- package/dist/cli/cortexCommands.js +127 -13
- package/dist/cli/cortexCommands.js.map +1 -1
- package/dist/cli/engineBootstrap.d.ts +1 -1
- package/dist/cli/engineBootstrap.js +2 -0
- package/dist/cli/engineBootstrap.js.map +1 -1
- package/dist/cli/evalCommands.js +13 -1
- package/dist/cli/evalCommands.js.map +1 -1
- package/dist/cli/phaseCommands.d.ts +81 -1
- package/dist/cli/phaseCommands.js +465 -31
- package/dist/cli/phaseCommands.js.map +1 -1
- package/dist/cli/runtimeSkillCommands.js +12 -2
- package/dist/cli/runtimeSkillCommands.js.map +1 -1
- package/dist/cli/shieldCommands.d.ts +1 -0
- package/dist/cli/shieldCommands.js +20 -7
- package/dist/cli/shieldCommands.js.map +1 -1
- package/dist/cli/workflowEvidenceCommands.d.ts +120 -0
- package/dist/cli/workflowEvidenceCommands.js +228 -2
- package/dist/cli/workflowEvidenceCommands.js.map +1 -1
- package/dist/cortex/AutoFixEventObservations.d.ts +11 -0
- package/dist/cortex/AutoFixEventObservations.js +72 -0
- package/dist/cortex/AutoFixEventObservations.js.map +1 -0
- package/dist/cortex/GateEvidenceObservations.d.ts +22 -0
- package/dist/cortex/GateEvidenceObservations.js +179 -0
- package/dist/cortex/GateEvidenceObservations.js.map +1 -0
- package/dist/cortex/GovernanceMetrics.d.ts +2 -0
- package/dist/cortex/GovernanceMetrics.js +112 -22
- package/dist/cortex/GovernanceMetrics.js.map +1 -1
- package/dist/cortex/InstinctApplicationRecorder.d.ts +28 -0
- package/dist/cortex/InstinctApplicationRecorder.js +145 -0
- package/dist/cortex/InstinctApplicationRecorder.js.map +1 -0
- package/dist/cortex/InstinctCandidateAudit.d.ts +3 -0
- package/dist/cortex/InstinctCandidateAudit.js +39 -0
- package/dist/cortex/InstinctCandidateAudit.js.map +1 -0
- package/dist/cortex/InstinctCandidateReview.d.ts +32 -0
- package/dist/cortex/InstinctCandidateReview.js +125 -0
- package/dist/cortex/InstinctCandidateReview.js.map +1 -0
- package/dist/cortex/InstinctExtractor.d.ts +1 -0
- package/dist/cortex/InstinctExtractor.js +24 -17
- package/dist/cortex/InstinctExtractor.js.map +1 -1
- package/dist/cortex/InstinctRuntimeEvidence.d.ts +14 -0
- package/dist/cortex/InstinctRuntimeEvidence.js +120 -0
- package/dist/cortex/InstinctRuntimeEvidence.js.map +1 -0
- package/dist/cortex/InstinctStore.d.ts +50 -4
- package/dist/cortex/InstinctStore.js +262 -48
- package/dist/cortex/InstinctStore.js.map +1 -1
- package/dist/cortex/InstinctValidation.d.ts +9 -0
- package/dist/cortex/InstinctValidation.js +55 -0
- package/dist/cortex/InstinctValidation.js.map +1 -0
- package/dist/cortex/SessionInjector.d.ts +1 -0
- package/dist/cortex/SessionInjector.js +28 -8
- package/dist/cortex/SessionInjector.js.map +1 -1
- package/dist/dashboard/DashboardServer.d.ts +79 -0
- package/dist/dashboard/DashboardServer.js +330 -6
- package/dist/dashboard/DashboardServer.js.map +1 -1
- package/dist/dashboard/spa/app.js +515 -0
- package/dist/dashboard/spa/components/DataTable.js +53 -0
- package/dist/dashboard/spa/components/EventStream.js +66 -0
- package/dist/dashboard/spa/components/LoadingState.js +39 -0
- package/dist/dashboard/spa/components/MetricCard.js +30 -0
- package/dist/dashboard/spa/components/Panel.js +27 -0
- package/dist/dashboard/spa/components/StatusBadge.js +51 -0
- package/dist/dashboard/spa/i18n.js +767 -0
- package/dist/dashboard/spa/index.html +463 -0
- package/dist/dashboard/spa/pages/costs.js +522 -0
- package/dist/dashboard/spa/pages/documents.js +540 -0
- package/dist/dashboard/spa/pages/knowledge.js +457 -0
- package/dist/dashboard/spa/pages/monitoring.js +361 -0
- package/dist/dashboard/spa/pages/overview.js +301 -0
- package/dist/dashboard/spa/pages/topology-renderers.js +251 -0
- package/dist/dashboard/spa/pages/topology.js +370 -0
- package/dist/dashboard/spa/pages/workflow-renderers.js +239 -0
- package/dist/dashboard/spa/pages/workflow.js +217 -0
- package/dist/env/EnvironmentDoctor.js +12 -7
- package/dist/env/EnvironmentDoctor.js.map +1 -1
- package/dist/eval/BenchmarkPublisher.d.ts +2 -0
- package/dist/eval/BenchmarkPublisher.js +43 -0
- package/dist/eval/BenchmarkPublisher.js.map +1 -1
- package/dist/eval/WorkflowEval.d.ts +9 -0
- package/dist/eval/WorkflowEval.js +348 -2
- package/dist/eval/WorkflowEval.js.map +1 -1
- package/dist/guardrails/ast/confirmers.d.ts +18 -0
- package/dist/guardrails/ast/confirmers.js +69 -0
- package/dist/guardrails/ast/confirmers.js.map +1 -0
- package/dist/guardrails/ast/parse.d.ts +20 -0
- package/dist/guardrails/ast/parse.js +51 -0
- package/dist/guardrails/ast/parse.js.map +1 -0
- package/dist/memory/MemoryBrain.d.ts +13 -0
- package/dist/memory/MemoryBrain.js +47 -0
- package/dist/memory/MemoryBrain.js.map +1 -1
- package/dist/memory/MemoryFabric.d.ts +1 -0
- package/dist/memory/MemoryFabric.js +12 -8
- package/dist/memory/MemoryFabric.js.map +1 -1
- package/dist/memory/MemoryLearning.d.ts +1 -0
- package/dist/memory/MemoryLearning.js +6 -3
- package/dist/memory/MemoryLearning.js.map +1 -1
- package/dist/memory/MemoryProviders.d.ts +8 -1
- package/dist/memory/MemoryProviders.js +143 -29
- package/dist/memory/MemoryProviders.js.map +1 -1
- package/dist/output/HTMLDocumentRenderer.d.ts +9 -0
- package/dist/output/HTMLDocumentRenderer.js +19 -0
- package/dist/output/HTMLDocumentRenderer.js.map +1 -1
- package/dist/review/FreshContextVerifier.d.ts +35 -0
- package/dist/review/FreshContextVerifier.js +120 -0
- package/dist/review/FreshContextVerifier.js.map +1 -0
- package/dist/review/JsonLlmClient.d.ts +37 -0
- package/dist/review/JsonLlmClient.js +94 -0
- package/dist/review/JsonLlmClient.js.map +1 -0
- package/dist/review/LlmJudge.d.ts +61 -0
- package/dist/review/LlmJudge.js +167 -0
- package/dist/review/LlmJudge.js.map +1 -0
- package/dist/runtime/AiOsRuntime.d.ts +14 -1
- package/dist/runtime/AiOsRuntime.js +59 -3
- package/dist/runtime/AiOsRuntime.js.map +1 -1
- package/dist/runtime/RuntimeDoctor.js +3 -1
- package/dist/runtime/RuntimeDoctor.js.map +1 -1
- package/dist/runtime/RuntimeEvidenceLedger.d.ts +6 -0
- package/dist/runtime/RuntimeEvidenceLedger.js +52 -1
- package/dist/runtime/RuntimeEvidenceLedger.js.map +1 -1
- package/dist/runtime/SessionLedger.d.ts +2 -0
- package/dist/runtime/SessionLedger.js +4 -0
- package/dist/runtime/SessionLedger.js.map +1 -1
- package/dist/setup/SetupVerification.js +53 -5
- package/dist/setup/SetupVerification.js.map +1 -1
- package/dist/shield/PolicyCompiler.js +73 -12
- package/dist/shield/PolicyCompiler.js.map +1 -1
- package/dist/shield/ProtectedPaths.js +4 -2
- package/dist/shield/ProtectedPaths.js.map +1 -1
- package/dist/skills/SkillCatalog.d.ts +2 -0
- package/dist/skills/SkillCatalog.js +8 -0
- package/dist/skills/SkillCatalog.js.map +1 -1
- package/dist/skills/SkillDoctor.d.ts +19 -2
- package/dist/skills/SkillDoctor.js +163 -13
- package/dist/skills/SkillDoctor.js.map +1 -1
- package/dist/tools/SafeCommandRunner.d.ts +1 -0
- package/dist/tools/SafeCommandRunner.js +1 -0
- package/dist/tools/SafeCommandRunner.js.map +1 -1
- package/dist/tools/ToolCapabilityRegistry.js +25 -3
- package/dist/tools/ToolCapabilityRegistry.js.map +1 -1
- package/dist/tools/ToolOrchestrator.js +21 -0
- package/dist/tools/ToolOrchestrator.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/workflow/AgentLoopReadiness.d.ts +103 -0
- package/dist/workflow/AgentLoopReadiness.js +371 -0
- package/dist/workflow/AgentLoopReadiness.js.map +1 -0
- package/dist/workflow/BoundaryEnforcement.d.ts +60 -0
- package/dist/workflow/BoundaryEnforcement.js +182 -0
- package/dist/workflow/BoundaryEnforcement.js.map +1 -0
- package/dist/workflow/EcosystemReadinessGate.d.ts +46 -0
- package/dist/workflow/EcosystemReadinessGate.js +126 -0
- package/dist/workflow/EcosystemReadinessGate.js.map +1 -0
- package/dist/workflow/EngineeringStandards.js +67 -12
- package/dist/workflow/EngineeringStandards.js.map +1 -1
- package/dist/workflow/GateCatalog.js +21 -2
- package/dist/workflow/GateCatalog.js.map +1 -1
- package/dist/workflow/GovernanceTemplatePacks.js +2 -26
- package/dist/workflow/GovernanceTemplatePacks.js.map +1 -1
- package/dist/workflow/GovernanceTemplates.js +8 -1
- package/dist/workflow/GovernanceTemplates.js.map +1 -1
- package/dist/workflow/ProfileEnforcement.d.ts +7 -0
- package/dist/workflow/ProfileEnforcement.js +12 -0
- package/dist/workflow/ProfileEnforcement.js.map +1 -0
- package/dist/workflow/ReleaseDeploymentLedger.d.ts +63 -0
- package/dist/workflow/ReleaseDeploymentLedger.js +154 -0
- package/dist/workflow/ReleaseDeploymentLedger.js.map +1 -0
- package/dist/workflow/ReviewAnalyzer.js +50 -3
- package/dist/workflow/ReviewAnalyzer.js.map +1 -1
- package/dist/workflow/ReviewStore.d.ts +10 -0
- package/dist/workflow/ReviewStore.js.map +1 -1
- package/dist/workflow/SessionPreamble.d.ts +7 -0
- package/dist/workflow/SessionPreamble.js +48 -9
- package/dist/workflow/SessionPreamble.js.map +1 -1
- package/dist/workflow/SurfaceCoverage.d.ts +19 -0
- package/dist/workflow/SurfaceCoverage.js +57 -0
- package/dist/workflow/SurfaceCoverage.js.map +1 -0
- package/dist/workflow/VerificationCommands.d.ts +1 -0
- package/dist/workflow/VerificationCommands.js.map +1 -1
- package/dist/workflow/VerificationProfile.d.ts +5 -0
- package/dist/workflow/VerificationProfile.js +26 -0
- package/dist/workflow/VerificationProfile.js.map +1 -1
- package/dist/workflow/VerificationSchema.d.ts +3 -0
- package/dist/workflow/VerificationSchema.js +6 -0
- package/dist/workflow/VerificationSchema.js.map +1 -1
- package/dist/workflow/WorkflowEffectiveness.d.ts +97 -0
- package/dist/workflow/WorkflowEffectiveness.js +302 -0
- package/dist/workflow/WorkflowEffectiveness.js.map +1 -0
- package/dist/workflow/WorkflowEffectivenessRenderer.d.ts +2 -0
- package/dist/workflow/WorkflowEffectivenessRenderer.js +67 -0
- package/dist/workflow/WorkflowEffectivenessRenderer.js.map +1 -0
- package/dist/workflow/WorkflowEffectivenessScoring.d.ts +6 -0
- package/dist/workflow/WorkflowEffectivenessScoring.js +243 -0
- package/dist/workflow/WorkflowEffectivenessScoring.js.map +1 -0
- package/dist/workflow/gates/EnhancedGates.js +2 -0
- package/dist/workflow/gates/EnhancedGates.js.map +1 -1
- package/dist/workflow/gates/GateSystem.d.ts +16 -0
- package/dist/workflow/gates/GateSystem.js +208 -41
- package/dist/workflow/gates/GateSystem.js.map +1 -1
- package/dist/workflow/gates/MetaGovernanceGates.js +269 -8
- package/dist/workflow/gates/MetaGovernanceGates.js.map +1 -1
- package/dist/workflow/gates/TestIntegrityGate.d.ts +51 -0
- package/dist/workflow/gates/TestIntegrityGate.js +175 -0
- package/dist/workflow/gates/TestIntegrityGate.js.map +1 -0
- package/dist/workflow/types.d.ts +1 -1
- package/docs/guides/DEVELOPMENT_WORKFLOW.md +28 -0
- package/docs/reference/cli.md +2 -1
- package/docs/start/agent-governance-demo.md +1 -1
- package/docs/workflow/E2E_EXAMPLE.md +133 -0
- package/docs/workflow/README.md +7 -1
- package/docs/workflow/TEMPLATE_GUIDE.md +162 -0
- package/docs/workflow/templates/github-actions-scale-preflight.yml +4 -1
- package/docs/workflow/templates/plan.md +26 -0
- package/docs/workflow/templates/spec.md +28 -0
- package/package.json +7 -3
- package/scripts/workflow/run-vitest.mjs +123 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionInjector.js","sourceRoot":"","sources":["../../src/cortex/SessionInjector.ts"],"names":[],"mappings":"AAAA,kCAAkC;AAClC,8DAA8D;AAC9D,6EAA6E;AAC7E,kFAAkF;
|
|
1
|
+
{"version":3,"file":"SessionInjector.js","sourceRoot":"","sources":["../../src/cortex/SessionInjector.ts"],"names":[],"mappings":"AAAA,kCAAkC;AAClC,8DAA8D;AAC9D,6EAA6E;AAC7E,kFAAkF;AAGlF,OAAO,EAAE,0BAA0B,EAAE,kCAAkC,EAAE,MAAM,iCAAiC,CAAA;AA2BhH,8EAA8E;AAC9E,kBAAkB;AAClB,8EAA8E;AAE9E,MAAM,yBAAyB,GAAG,gEAAgE,CAAA;AAClG,MAAM,uBAAuB,GAAG,iCAAiC,CAAA;AACjE,MAAM,2BAA2B,GAAG,GAAG,CAAA;AAEvC,MAAM,OAAO,eAAe;IAG1B,YAAY,aAA4B;QACtC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAA;IACpC,CAAC;IAED;;OAEG;IACH,KAAK,CACH,SAAkB,EAClB,gBAAqC,EAAE;QAEvC,MAAM,SAAS,GAAG,IAAI,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAA;QAEvD,MAAM,QAAQ,GAAa,EAAE,CAAA;QAE7B,gFAAgF;QAChF,gFAAgF;QAChF,QAAQ,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAA;QACzC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAEjB,qEAAqE;QACrE,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,EAAE,CAAA;QACpC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,QAAQ,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAA;YAC1C,QAAQ,CAAC,IAAI,CAAC,kFAAkF,CAAC,CAAA;YACjG,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACrB,CAAC;QACH,CAAC;QAED,8CAA8C;QAC9C,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,GAAG,2BAA2B,CAAC,CAAA;YAC/F,QAAQ,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAA;YACtD,QAAQ,CAAC,IAAI,CAAC,uGAAuG,CAAC,CAAA;YACtH,IAAI,QAAQ,EAAE,CAAC;gBACb,QAAQ,CAAC,IAAI,CAAC,iJAAiJ,CAAC,CAAA;YAClK,CAAC;YACD,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;gBACjC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAA;YACnD,CAAC;QACH,CAAC;QAED,4DAA4D;QAC5D,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,QAAQ,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAA;YAC5C,QAAQ,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAA;YACxC,QAAQ,CAAC,IAAI,CAAC,uFAAuF,CAAC,CAAA;YACtG,KAAK,MAAM,OAAO,IAAI,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;gBAChD,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAA;YACjD,CAAC;YACD,QAAQ,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAA;QACxC,CAAC;QAED,uBAAuB;QACvB,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACpB,QAAQ,CAAC,IAAI,CAAC,yEAAyE,CAAC,CAAA;QAExF,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACnC,MAAM,WAAW,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QAE5C,OAAO;YACL,OAAO;YACP,aAAa,EAAE,SAAS,CAAC,MAAM;YAC/B,QAAQ,EAAE;gBACR,SAAS;gBACT,gBAAgB,EAAE,WAAW;aAC9B;SACF,CAAA;IACH,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,SAAkB;QAC7B,MAAM,SAAS,GAAG,IAAI,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAA;QAEvD,iFAAiF;QACjF,wEAAwE;QACxE,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO;gBACL,OAAO,EAAE,kCAAkC;gBAC3C,aAAa,EAAE,CAAC;gBAChB,QAAQ,EAAE,EAAE,SAAS,EAAE,gBAAgB,EAAE,EAAE,EAAE;aAC9C,CAAA;QACH,CAAC;QAED,mDAAmD;QACnD,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAC9B,WAAW,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CACzG,CAAA;QAED,OAAO;YACL,OAAO,EAAE,GAAG,kCAAkC,+BAA+B,SAAS,CAAC,MAAM,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YACtH,aAAa,EAAE,SAAS,CAAC,MAAM;YAC/B,QAAQ,EAAE,EAAE,SAAS,EAAE,gBAAgB,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE;SACpE,CAAA;IACH,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,aAAqB,OAAO,CAAC,GAAG,EAAE;QAK9C,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;QACpC,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;QAEhC,IAAI,WAAW,GAAG,SAAS,CAAA;QAC3B,IAAI,cAAc,GAAG,MAAM,CAAA;QAE3B,IAAI,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC;YACjD,WAAW,GAAG,MAAM,CAAA;YACpB,IAAI,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;gBAAE,cAAc,GAAG,MAAM,CAAA;iBACtE,IAAI,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;gBAAE,cAAc,GAAG,MAAM,CAAA;;gBACtE,cAAc,GAAG,KAAK,CAAA;QAC7B,CAAC;aAAM,IAAI,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC;YAClD,WAAW,GAAG,IAAI,CAAA;YAClB,cAAc,GAAG,YAAY,CAAA;QAC/B,CAAC;aAAM,IAAI,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC,EAAE,CAAC;YAC1D,WAAW,GAAG,QAAQ,CAAA;YACtB,cAAc,GAAG,YAAY,CAAA;QAC/B,CAAC;aAAM,IAAI,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC;YACtD,WAAW,GAAG,MAAM,CAAA;YACpB,cAAc,GAAG,OAAO,CAAA;QAC1B,CAAC;QAED,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAA;QAEnD,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,EAAE,CAAA;IAChD,CAAC;IAED,0EAA0E;IAC1E,WAAW;IACX,0EAA0E;IAElE,eAAe,CAAC,QAAQ,GAAG,cAAc,EAAE,QAAQ,GAAG,CAAC,EAAE,eAAe,GAAG,EAAE;QACnF,IAAI,CAAC;YACH,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;YAC/D,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;YAChC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;gBAAE,OAAO,EAAE,CAAA;YACpC,MAAM,KAAK,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;YACnF,MAAM,MAAM,GAAa,EAAE,CAAA;YAC3B,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC;gBAC5C,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAA;gBAC3D,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;gBACjC,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBAC5D,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,eAAe,CAAC,CAAC,CAAC,UAAU,KAAK,CAAC,MAAM,GAAG,eAAe,cAAc,CAAC,CAAC,CAAC,EAAE,CAAA;gBAC3G,MAAM,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,SAAS,GAAG,MAAM,EAAE,CAAC,CAAA;YAC9E,CAAC;YACD,IAAI,KAAK,CAAC,MAAM,GAAG,QAAQ,EAAE,CAAC;gBAC5B,MAAM,CAAC,IAAI,CAAC,WAAW,KAAK,CAAC,MAAM,GAAG,QAAQ,kBAAkB,QAAQ,GAAG,CAAC,CAAA;YAC9E,CAAC;YACD,OAAO,MAAM,CAAA;QACf,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAA;QACX,CAAC;IACH,CAAC;IAEO,mBAAmB,CAAC,QAAkB;QAC5C,MAAM,eAAe,GAAG,QAAQ,CAAC,UAAU,IAAI,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;YACnE,QAAQ,CAAC,UAAU,IAAI,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;gBACvC,QAAQ,CAAC,UAAU,IAAI,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,CAAA;QAEvD,OAAO;YACL,QAAQ,eAAe,KAAK,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,EAAE,EAAE;YAC5D,mBAAmB,CAAC,QAAQ,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,qBAAqB,QAAQ,CAAC,YAAY,0BAA0B,CAAC,QAAQ,CAAC,OAAO,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;YACnK,EAAE;YACF,QAAQ,CAAC,MAAM;YACf,EAAE;SACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACd,CAAC;IAEO,kBAAkB,CAAC,OAA0B;QACnD,OAAO;YACL,OAAO,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,OAAO,CAAC,OAAO,EAAE;YAC7D,YAAY,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;YACxG,YAAY,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,YAAY,OAAO,CAAC,aAAa,EAAE;SACrF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACd,CAAC;IAEO,qBAAqB,CAAC,SAAkB;QAC9C,OAAO,IAAI,CAAC,aAAa,CAAC,qBAAqB,CAAC,SAAS,EAAE;YACzD,qBAAqB,EAAE,IAAI;YAC3B,qBAAqB,EAAE,GAAG;YAC1B,uBAAuB,EAAE,CAAC;YAC1B,aAAa,EAAE,CAAC;SACjB,CAAC,CAAA;IACJ,CAAC;CACF"}
|
|
@@ -8,6 +8,8 @@ import type { IArtifactStore } from '../artifact/store.js';
|
|
|
8
8
|
import type { IFSM } from '../artifact/fsm.js';
|
|
9
9
|
import type { IEvolutionEvaluator, EvolutionMetrics } from '../evolution/EvolutionEvaluator.js';
|
|
10
10
|
import type { DetectorStatisticsTracker } from '../guardrails/DetectorEnhanced.js';
|
|
11
|
+
import { type MemoryNode } from '../memory/MemoryBrain.js';
|
|
12
|
+
import { type MemoryProviderRecallReport, type MemoryProviderStatusReport } from '../memory/MemoryProviders.js';
|
|
11
13
|
import { type TopologyGraph } from '../codegraph/CodeIntelligence.js';
|
|
12
14
|
export interface DashboardState {
|
|
13
15
|
artifacts: ArtifactTreeNode[];
|
|
@@ -58,6 +60,69 @@ export interface RecentEvent {
|
|
|
58
60
|
artifactId?: string;
|
|
59
61
|
data?: Record<string, unknown>;
|
|
60
62
|
}
|
|
63
|
+
export interface DashboardProjectSummary {
|
|
64
|
+
id: string;
|
|
65
|
+
name: string;
|
|
66
|
+
projectDir: string;
|
|
67
|
+
scaleDir: string;
|
|
68
|
+
url?: string;
|
|
69
|
+
current?: boolean;
|
|
70
|
+
}
|
|
71
|
+
export interface DashboardKnowledgeReport {
|
|
72
|
+
project: DashboardProjectSummary;
|
|
73
|
+
local: {
|
|
74
|
+
available: boolean;
|
|
75
|
+
total: number;
|
|
76
|
+
byStatus: Record<string, number>;
|
|
77
|
+
nodes: MemoryNode[];
|
|
78
|
+
};
|
|
79
|
+
providers?: MemoryProviderStatusReport;
|
|
80
|
+
recall?: MemoryProviderRecallReport;
|
|
81
|
+
warnings: string[];
|
|
82
|
+
}
|
|
83
|
+
export interface DashboardProjectsSummaryReport {
|
|
84
|
+
generatedAt: number;
|
|
85
|
+
sinceDays: number;
|
|
86
|
+
currentProjectId: string;
|
|
87
|
+
totals: {
|
|
88
|
+
projects: number;
|
|
89
|
+
readyProjects: number;
|
|
90
|
+
warningProjects: number;
|
|
91
|
+
missingProjects: number;
|
|
92
|
+
documents: number;
|
|
93
|
+
localMemoryNodes: number;
|
|
94
|
+
activeMemoryNodes: number;
|
|
95
|
+
commandRuns: number;
|
|
96
|
+
failedCommandRuns: number;
|
|
97
|
+
gateFailures: number;
|
|
98
|
+
};
|
|
99
|
+
projects: DashboardProjectOverview[];
|
|
100
|
+
warnings: string[];
|
|
101
|
+
}
|
|
102
|
+
export interface DashboardProjectOverview {
|
|
103
|
+
project: DashboardProjectSummary;
|
|
104
|
+
health: 'ready' | 'warning' | 'missing';
|
|
105
|
+
scaleDirExists: boolean;
|
|
106
|
+
documents: {
|
|
107
|
+
total: number;
|
|
108
|
+
byType: Record<string, number>;
|
|
109
|
+
};
|
|
110
|
+
knowledge: {
|
|
111
|
+
available: boolean;
|
|
112
|
+
total: number;
|
|
113
|
+
active: number;
|
|
114
|
+
};
|
|
115
|
+
metrics: {
|
|
116
|
+
available: boolean;
|
|
117
|
+
commandRuns: number;
|
|
118
|
+
failedCommandRuns: number;
|
|
119
|
+
commandPassRate: number;
|
|
120
|
+
gateFailures: number;
|
|
121
|
+
recentTasks: number;
|
|
122
|
+
recentFirstPassRate: number;
|
|
123
|
+
};
|
|
124
|
+
warnings: string[];
|
|
125
|
+
}
|
|
61
126
|
export interface DashboardOptions {
|
|
62
127
|
port?: number;
|
|
63
128
|
host?: string;
|
|
@@ -68,6 +133,10 @@ export interface DashboardOptions {
|
|
|
68
133
|
bus?: EventBus;
|
|
69
134
|
projectDir?: string;
|
|
70
135
|
scaleDir?: string;
|
|
136
|
+
projectName?: string;
|
|
137
|
+
projectUrl?: string;
|
|
138
|
+
currentProjectId?: string;
|
|
139
|
+
projects?: DashboardProjectSummary[];
|
|
71
140
|
}
|
|
72
141
|
export declare class DashboardServer {
|
|
73
142
|
private app;
|
|
@@ -80,6 +149,8 @@ export declare class DashboardServer {
|
|
|
80
149
|
private host;
|
|
81
150
|
private projectDir;
|
|
82
151
|
private scaleDir;
|
|
152
|
+
private currentProject;
|
|
153
|
+
private projects;
|
|
83
154
|
private server;
|
|
84
155
|
constructor(options?: DashboardOptions);
|
|
85
156
|
private setupMiddleware;
|
|
@@ -87,6 +158,7 @@ export declare class DashboardServer {
|
|
|
87
158
|
private setupAPI;
|
|
88
159
|
private setupSSE;
|
|
89
160
|
private setupWriteOps;
|
|
161
|
+
private recordMemoryReviewEvidence;
|
|
90
162
|
getDashboardState(): Promise<DashboardState>;
|
|
91
163
|
getArtifactTree(): Promise<ArtifactTreeNode[]>;
|
|
92
164
|
getEvolutionMetrics(): Promise<EvolutionMetrics | null>;
|
|
@@ -94,8 +166,15 @@ export declare class DashboardServer {
|
|
|
94
166
|
getAutoDefectStats(): Promise<AutoDefectSummary | null>;
|
|
95
167
|
getRecentEvents(limit: number): Promise<RecentEvent[]>;
|
|
96
168
|
getTopology(): TopologyGraph;
|
|
169
|
+
private getProjectsSummary;
|
|
170
|
+
private getProjectOverview;
|
|
171
|
+
private getGovernanceMetricSummary;
|
|
172
|
+
private getLocalKnowledgeSummary;
|
|
97
173
|
private listDocuments;
|
|
174
|
+
private listDocumentsFor;
|
|
98
175
|
private serveDocument;
|
|
176
|
+
private getKnowledgeReport;
|
|
177
|
+
private getLocalKnowledge;
|
|
99
178
|
start(): Promise<void>;
|
|
100
179
|
stop(): void;
|
|
101
180
|
/** Get the underlying Hono app (for testing or embedding) */
|
|
@@ -6,15 +6,19 @@ import { Hono } from 'hono';
|
|
|
6
6
|
import { cors } from 'hono/cors';
|
|
7
7
|
import { streamSSE } from 'hono/streaming';
|
|
8
8
|
import { readFileSync, existsSync, readdirSync, statSync } from 'node:fs';
|
|
9
|
-
import { join, dirname, extname } from 'node:path';
|
|
9
|
+
import { basename, join, dirname, extname, resolve } from 'node:path';
|
|
10
10
|
import { fileURLToPath } from 'node:url';
|
|
11
|
+
import { MemoryBrain } from '../memory/MemoryBrain.js';
|
|
12
|
+
import { inspectMemoryProviders, recallMemoryProviders, } from '../memory/MemoryProviders.js';
|
|
11
13
|
import { dumpCodeGraphData } from '../codegraph/CodeIntelligence.js';
|
|
12
14
|
import { classifyLayers } from '../topology/LayerClassifier.js';
|
|
13
15
|
import { mapDomains } from '../topology/DomainMapper.js';
|
|
14
16
|
import { generateTour } from '../topology/TourGenerator.js';
|
|
15
17
|
import { aggregateGovernanceMetrics } from './MetricsAggregator.js';
|
|
16
18
|
import { logger } from '../core/logger.js';
|
|
19
|
+
import { RuntimeEvidenceLedger } from '../runtime/RuntimeEvidenceLedger.js';
|
|
17
20
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
21
|
+
const MEMORY_REVIEW_ACTIONS = ['approve', 'reject', 'stale', 'restore'];
|
|
18
22
|
// ── Dashboard Server ─────────────────────────────────────────────────────
|
|
19
23
|
export class DashboardServer {
|
|
20
24
|
constructor(options = {}) {
|
|
@@ -27,8 +31,17 @@ export class DashboardServer {
|
|
|
27
31
|
this.detectorTracker = options.detectorTracker ?? null;
|
|
28
32
|
this.port = options.port ?? 3210;
|
|
29
33
|
this.host = options.host ?? '0.0.0.0';
|
|
30
|
-
this.projectDir = options.projectDir ?? process.cwd();
|
|
31
|
-
this.scaleDir = options.scaleDir ?? join(this.projectDir, '.scale');
|
|
34
|
+
this.projectDir = resolve(options.projectDir ?? process.cwd());
|
|
35
|
+
this.scaleDir = resolve(options.scaleDir ?? join(this.projectDir, '.scale'));
|
|
36
|
+
this.currentProject = normalizeProjectSummary({
|
|
37
|
+
id: options.currentProjectId,
|
|
38
|
+
name: options.projectName,
|
|
39
|
+
projectDir: this.projectDir,
|
|
40
|
+
scaleDir: this.scaleDir,
|
|
41
|
+
url: options.projectUrl,
|
|
42
|
+
current: true,
|
|
43
|
+
});
|
|
44
|
+
this.projects = normalizeProjectList(options.projects, this.currentProject);
|
|
32
45
|
this.setupMiddleware();
|
|
33
46
|
this.setupSPA();
|
|
34
47
|
this.setupAPI();
|
|
@@ -70,6 +83,10 @@ export class DashboardServer {
|
|
|
70
83
|
});
|
|
71
84
|
// Root redirect to SPA
|
|
72
85
|
this.app.get('/', (c) => c.redirect('/spa/'));
|
|
86
|
+
this.app.get('/favicon.ico', () => new Response(null, {
|
|
87
|
+
status: 204,
|
|
88
|
+
headers: { 'Cache-Control': 'public, max-age=86400' },
|
|
89
|
+
}));
|
|
73
90
|
// Legacy views (backward compat)
|
|
74
91
|
const distViews = join(__dirname, 'views');
|
|
75
92
|
const srcViews = join(__dirname, '..', '..', 'src', 'dashboard', 'views');
|
|
@@ -100,6 +117,14 @@ export class DashboardServer {
|
|
|
100
117
|
}
|
|
101
118
|
// ── API Routes ───────────────────────────────────────────────────────
|
|
102
119
|
setupAPI() {
|
|
120
|
+
// Project metadata for multi-project dashboard launchers
|
|
121
|
+
this.app.get('/api/project', (c) => c.json(this.currentProject));
|
|
122
|
+
this.app.get('/api/projects', (c) => c.json(this.projects));
|
|
123
|
+
this.app.get('/api/projects/summary', (c) => {
|
|
124
|
+
const sinceDays = parsePositiveInt(c.req.query('days'), 7);
|
|
125
|
+
const limit = parsePositiveInt(c.req.query('limit'), 100);
|
|
126
|
+
return c.json(this.getProjectsSummary(sinceDays, limit));
|
|
127
|
+
});
|
|
103
128
|
// Full dashboard state
|
|
104
129
|
this.app.get('/api/state', async (c) => c.json(await this.getDashboardState()));
|
|
105
130
|
// Artifact tree
|
|
@@ -147,6 +172,15 @@ export class DashboardServer {
|
|
|
147
172
|
const docPath = c.req.path.replace('/api/documents/', '');
|
|
148
173
|
return this.serveDocument(docPath, c);
|
|
149
174
|
});
|
|
175
|
+
// Memory/knowledge view. Provider recall is explicit to keep page load cheap.
|
|
176
|
+
this.app.get('/api/knowledge', async (c) => {
|
|
177
|
+
const query = (c.req.query('query') ?? '').trim();
|
|
178
|
+
const limit = parsePositiveInt(c.req.query('limit'), 20);
|
|
179
|
+
const includeProviders = c.req.query('providers') !== 'false';
|
|
180
|
+
const runRecall = c.req.query('recall') === '1' || c.req.query('recall') === 'true';
|
|
181
|
+
const provider = c.req.query('provider')?.trim() || undefined;
|
|
182
|
+
return c.json(await this.getKnowledgeReport({ query, limit, includeProviders, runRecall, provider }));
|
|
183
|
+
});
|
|
150
184
|
// Available FSM actions for artifact
|
|
151
185
|
this.app.get('/api/artifacts/:id/actions', async (c) => {
|
|
152
186
|
if (!this.fsm)
|
|
@@ -294,8 +328,79 @@ export class DashboardServer {
|
|
|
294
328
|
return c.json({ error: e instanceof Error ? e.message : String(e) }, 500);
|
|
295
329
|
}
|
|
296
330
|
});
|
|
331
|
+
this.app.post('/api/knowledge/local/:id/review', async (c) => {
|
|
332
|
+
const id = c.req.param('id');
|
|
333
|
+
const body = await c.req.json().catch(() => ({}));
|
|
334
|
+
const action = normalizeMemoryReviewAction(body.action);
|
|
335
|
+
if (!action) {
|
|
336
|
+
return c.json({
|
|
337
|
+
error: 'Invalid memory review action',
|
|
338
|
+
allowedActions: MEMORY_REVIEW_ACTIONS,
|
|
339
|
+
}, 400);
|
|
340
|
+
}
|
|
341
|
+
let brain = null;
|
|
342
|
+
try {
|
|
343
|
+
brain = new MemoryBrain({ projectDir: this.projectDir, scaleDir: this.scaleDir });
|
|
344
|
+
const report = brain.review(id, action, {
|
|
345
|
+
reason: body.reason ?? `Dashboard memory review: ${action}`,
|
|
346
|
+
actor: 'dashboard',
|
|
347
|
+
});
|
|
348
|
+
if (!report.ok || !report.node) {
|
|
349
|
+
return c.json({
|
|
350
|
+
error: report.warnings[0] ?? 'Memory review transition blocked',
|
|
351
|
+
warnings: report.warnings,
|
|
352
|
+
action,
|
|
353
|
+
previousStatus: report.previousStatus,
|
|
354
|
+
node: report.node,
|
|
355
|
+
}, report.node ? 422 : 404);
|
|
356
|
+
}
|
|
357
|
+
const evidence = this.recordMemoryReviewEvidence({
|
|
358
|
+
action,
|
|
359
|
+
node: report.node,
|
|
360
|
+
previousStatus: report.previousStatus,
|
|
361
|
+
reason: body.reason,
|
|
362
|
+
});
|
|
363
|
+
return c.json({
|
|
364
|
+
success: true,
|
|
365
|
+
action,
|
|
366
|
+
previousStatus: report.previousStatus,
|
|
367
|
+
node: report.node,
|
|
368
|
+
warnings: report.warnings,
|
|
369
|
+
evidence,
|
|
370
|
+
});
|
|
371
|
+
}
|
|
372
|
+
catch (e) {
|
|
373
|
+
return c.json({ error: e instanceof Error ? e.message : String(e) }, 500);
|
|
374
|
+
}
|
|
375
|
+
finally {
|
|
376
|
+
brain?.close();
|
|
377
|
+
}
|
|
378
|
+
});
|
|
297
379
|
}
|
|
298
380
|
// ── Data Collection ──────────────────────────────────────────────────
|
|
381
|
+
recordMemoryReviewEvidence(input) {
|
|
382
|
+
const ledger = new RuntimeEvidenceLedger({
|
|
383
|
+
projectDir: this.projectDir,
|
|
384
|
+
scaleDir: this.scaleDir,
|
|
385
|
+
});
|
|
386
|
+
return ledger.record({
|
|
387
|
+
taskId: 'dashboard-memory-review',
|
|
388
|
+
kind: 'manual',
|
|
389
|
+
status: 'passed',
|
|
390
|
+
title: `Dashboard memory review: ${input.action} ${input.node.id}`,
|
|
391
|
+
summary: `Memory node ${input.node.id} transitioned from ${input.previousStatus ?? 'unknown'} to ${input.node.status}.`,
|
|
392
|
+
artifacts: ['.scale/memory/brain.sqlite', ...input.node.evidencePaths],
|
|
393
|
+
metadata: {
|
|
394
|
+
action: input.action,
|
|
395
|
+
nodeId: input.node.id,
|
|
396
|
+
previousStatus: input.previousStatus,
|
|
397
|
+
nextStatus: input.node.status,
|
|
398
|
+
reason: input.reason,
|
|
399
|
+
source: 'dashboard',
|
|
400
|
+
resolutionKey: `memory-review:${input.node.id}`,
|
|
401
|
+
},
|
|
402
|
+
});
|
|
403
|
+
}
|
|
299
404
|
async getDashboardState() {
|
|
300
405
|
const [artifacts, evolutionMetrics, detectorStats, autoDefectStats, recentEvents] = await Promise.all([
|
|
301
406
|
this.getArtifactTree(),
|
|
@@ -382,7 +487,112 @@ export class DashboardServer {
|
|
|
382
487
|
const raw = dumpCodeGraphData({ projectDir: this.projectDir });
|
|
383
488
|
return classifyLayers(raw);
|
|
384
489
|
}
|
|
490
|
+
getProjectsSummary(sinceDays, limit) {
|
|
491
|
+
const projects = this.projects.slice(0, limit).map(project => this.getProjectOverview(project, sinceDays));
|
|
492
|
+
const warnings = projects.flatMap(project => project.warnings.map(warning => `${project.project.name}: ${warning}`));
|
|
493
|
+
return {
|
|
494
|
+
generatedAt: Date.now(),
|
|
495
|
+
sinceDays,
|
|
496
|
+
currentProjectId: this.currentProject.id,
|
|
497
|
+
totals: {
|
|
498
|
+
projects: projects.length,
|
|
499
|
+
readyProjects: projects.filter(project => project.health === 'ready').length,
|
|
500
|
+
warningProjects: projects.filter(project => project.health === 'warning').length,
|
|
501
|
+
missingProjects: projects.filter(project => project.health === 'missing').length,
|
|
502
|
+
documents: sum(projects, project => project.documents.total),
|
|
503
|
+
localMemoryNodes: sum(projects, project => project.knowledge.total),
|
|
504
|
+
activeMemoryNodes: sum(projects, project => project.knowledge.active),
|
|
505
|
+
commandRuns: sum(projects, project => project.metrics.commandRuns),
|
|
506
|
+
failedCommandRuns: sum(projects, project => project.metrics.failedCommandRuns),
|
|
507
|
+
gateFailures: sum(projects, project => project.metrics.gateFailures),
|
|
508
|
+
},
|
|
509
|
+
projects,
|
|
510
|
+
warnings,
|
|
511
|
+
};
|
|
512
|
+
}
|
|
513
|
+
getProjectOverview(project, sinceDays) {
|
|
514
|
+
const warnings = [];
|
|
515
|
+
const scaleDirExists = existsSync(project.scaleDir);
|
|
516
|
+
if (!scaleDirExists)
|
|
517
|
+
warnings.push('.scale directory is missing');
|
|
518
|
+
const documents = this.listDocumentsFor(project.projectDir, project.scaleDir);
|
|
519
|
+
const knowledge = this.getLocalKnowledgeSummary(project, warnings);
|
|
520
|
+
const metrics = this.getGovernanceMetricSummary(project, sinceDays, warnings);
|
|
521
|
+
const health = !scaleDirExists
|
|
522
|
+
? 'missing'
|
|
523
|
+
: warnings.length > 0
|
|
524
|
+
? 'warning'
|
|
525
|
+
: 'ready';
|
|
526
|
+
return {
|
|
527
|
+
project,
|
|
528
|
+
health,
|
|
529
|
+
scaleDirExists,
|
|
530
|
+
documents: {
|
|
531
|
+
total: documents.length,
|
|
532
|
+
byType: countBy(documents, document => document.type),
|
|
533
|
+
},
|
|
534
|
+
knowledge,
|
|
535
|
+
metrics,
|
|
536
|
+
warnings,
|
|
537
|
+
};
|
|
538
|
+
}
|
|
539
|
+
getGovernanceMetricSummary(project, sinceDays, warnings) {
|
|
540
|
+
try {
|
|
541
|
+
const metrics = aggregateGovernanceMetrics({
|
|
542
|
+
projectDir: project.projectDir,
|
|
543
|
+
scaleDir: project.scaleDir,
|
|
544
|
+
sinceDays,
|
|
545
|
+
});
|
|
546
|
+
const commandRuns = metrics.commandRuns.total;
|
|
547
|
+
return {
|
|
548
|
+
available: true,
|
|
549
|
+
commandRuns,
|
|
550
|
+
failedCommandRuns: metrics.commandRuns.failed,
|
|
551
|
+
commandPassRate: commandRuns > 0 ? metrics.commandRuns.passed / commandRuns : 0,
|
|
552
|
+
gateFailures: metrics.gateFailures.failed,
|
|
553
|
+
recentTasks: metrics.taskMetrics.recentTasks,
|
|
554
|
+
recentFirstPassRate: metrics.taskMetrics.recentFirstPassRate,
|
|
555
|
+
};
|
|
556
|
+
}
|
|
557
|
+
catch (error) {
|
|
558
|
+
warnings.push(`governance metrics failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
559
|
+
return {
|
|
560
|
+
available: false,
|
|
561
|
+
commandRuns: 0,
|
|
562
|
+
failedCommandRuns: 0,
|
|
563
|
+
commandPassRate: 0,
|
|
564
|
+
gateFailures: 0,
|
|
565
|
+
recentTasks: 0,
|
|
566
|
+
recentFirstPassRate: 0,
|
|
567
|
+
};
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
getLocalKnowledgeSummary(project, warnings) {
|
|
571
|
+
const dbPath = join(project.scaleDir, 'memory', 'brain.sqlite');
|
|
572
|
+
if (!existsSync(dbPath))
|
|
573
|
+
return { available: false, total: 0, active: 0 };
|
|
574
|
+
let brain = null;
|
|
575
|
+
try {
|
|
576
|
+
brain = new MemoryBrain({ projectDir: project.projectDir, scaleDir: project.scaleDir });
|
|
577
|
+
const nodes = brain.list();
|
|
578
|
+
return {
|
|
579
|
+
available: true,
|
|
580
|
+
total: nodes.length,
|
|
581
|
+
active: nodes.filter(node => node.status === 'active').length,
|
|
582
|
+
};
|
|
583
|
+
}
|
|
584
|
+
catch (error) {
|
|
585
|
+
warnings.push(`local memory brain failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
586
|
+
return { available: false, total: 0, active: 0 };
|
|
587
|
+
}
|
|
588
|
+
finally {
|
|
589
|
+
brain?.close();
|
|
590
|
+
}
|
|
591
|
+
}
|
|
385
592
|
listDocuments() {
|
|
593
|
+
return this.listDocumentsFor(this.projectDir, this.scaleDir);
|
|
594
|
+
}
|
|
595
|
+
listDocumentsFor(projectDir, scaleDir) {
|
|
386
596
|
const docs = [];
|
|
387
597
|
const scanDir = (dir, prefix) => {
|
|
388
598
|
if (!existsSync(dir))
|
|
@@ -400,9 +610,9 @@ export class DashboardServer {
|
|
|
400
610
|
}
|
|
401
611
|
};
|
|
402
612
|
// Scan common doc locations
|
|
403
|
-
scanDir(join(
|
|
404
|
-
scanDir(join(
|
|
405
|
-
scanDir(join(
|
|
613
|
+
scanDir(join(scaleDir, 'docs'), '.scale/docs');
|
|
614
|
+
scanDir(join(scaleDir, 'artifacts'), '.scale/artifacts');
|
|
615
|
+
scanDir(join(projectDir, 'docs'), 'docs');
|
|
406
616
|
return docs;
|
|
407
617
|
}
|
|
408
618
|
serveDocument(docPath, c) {
|
|
@@ -422,6 +632,62 @@ export class DashboardServer {
|
|
|
422
632
|
}
|
|
423
633
|
return c.json({ error: 'Document not found' }, 404);
|
|
424
634
|
}
|
|
635
|
+
async getKnowledgeReport(options) {
|
|
636
|
+
const warnings = [];
|
|
637
|
+
const local = this.getLocalKnowledge(options.query, options.limit, warnings);
|
|
638
|
+
let providers;
|
|
639
|
+
let recall;
|
|
640
|
+
if (options.includeProviders) {
|
|
641
|
+
try {
|
|
642
|
+
providers = inspectMemoryProviders({ projectDir: this.projectDir, scaleDir: this.scaleDir });
|
|
643
|
+
}
|
|
644
|
+
catch (error) {
|
|
645
|
+
warnings.push(`memory provider status failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
646
|
+
}
|
|
647
|
+
}
|
|
648
|
+
if (options.runRecall && options.query.length > 0) {
|
|
649
|
+
try {
|
|
650
|
+
recall = await recallMemoryProviders({
|
|
651
|
+
projectDir: this.projectDir,
|
|
652
|
+
scaleDir: this.scaleDir,
|
|
653
|
+
query: options.query,
|
|
654
|
+
limit: options.limit,
|
|
655
|
+
includeCandidates: true,
|
|
656
|
+
provider: options.provider,
|
|
657
|
+
});
|
|
658
|
+
}
|
|
659
|
+
catch (error) {
|
|
660
|
+
warnings.push(`memory provider recall failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
661
|
+
}
|
|
662
|
+
}
|
|
663
|
+
return { project: this.currentProject, local, providers, recall, warnings };
|
|
664
|
+
}
|
|
665
|
+
getLocalKnowledge(query, limit, warnings) {
|
|
666
|
+
const dbPath = join(this.scaleDir, 'memory', 'brain.sqlite');
|
|
667
|
+
if (!existsSync(dbPath))
|
|
668
|
+
return { available: false, total: 0, byStatus: {}, nodes: [] };
|
|
669
|
+
let brain = null;
|
|
670
|
+
try {
|
|
671
|
+
brain = new MemoryBrain({ projectDir: this.projectDir, scaleDir: this.scaleDir });
|
|
672
|
+
const allNodes = brain.list();
|
|
673
|
+
const nodes = query
|
|
674
|
+
? brain.query(query, { limit }).nodes
|
|
675
|
+
: allNodes.slice(0, limit);
|
|
676
|
+
return {
|
|
677
|
+
available: true,
|
|
678
|
+
total: allNodes.length,
|
|
679
|
+
byStatus: countBy(allNodes, node => node.status),
|
|
680
|
+
nodes,
|
|
681
|
+
};
|
|
682
|
+
}
|
|
683
|
+
catch (error) {
|
|
684
|
+
warnings.push(`local memory brain failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
685
|
+
return { available: false, total: 0, byStatus: {}, nodes: [] };
|
|
686
|
+
}
|
|
687
|
+
finally {
|
|
688
|
+
brain?.close();
|
|
689
|
+
}
|
|
690
|
+
}
|
|
425
691
|
// ── Lifecycle ────────────────────────────────────────────────────────
|
|
426
692
|
async start() {
|
|
427
693
|
try {
|
|
@@ -456,4 +722,62 @@ export class DashboardServer {
|
|
|
456
722
|
return this.app;
|
|
457
723
|
}
|
|
458
724
|
}
|
|
725
|
+
function normalizeProjectSummary(input) {
|
|
726
|
+
const projectDir = resolve(input.projectDir);
|
|
727
|
+
const scaleDir = resolve(input.scaleDir);
|
|
728
|
+
const name = input.name?.trim() || basename(projectDir) || 'project';
|
|
729
|
+
return {
|
|
730
|
+
id: input.id?.trim() || safeProjectId(name),
|
|
731
|
+
name,
|
|
732
|
+
projectDir,
|
|
733
|
+
scaleDir,
|
|
734
|
+
url: input.url,
|
|
735
|
+
current: input.current,
|
|
736
|
+
};
|
|
737
|
+
}
|
|
738
|
+
function normalizeProjectList(projects, currentProject) {
|
|
739
|
+
const input = projects && projects.length > 0 ? projects : [currentProject];
|
|
740
|
+
const seen = new Set();
|
|
741
|
+
const normalized = [];
|
|
742
|
+
for (const project of input) {
|
|
743
|
+
const item = normalizeProjectSummary({
|
|
744
|
+
...project,
|
|
745
|
+
current: project.id === currentProject.id || project.projectDir === currentProject.projectDir,
|
|
746
|
+
});
|
|
747
|
+
let id = item.id;
|
|
748
|
+
let suffix = 2;
|
|
749
|
+
while (seen.has(id))
|
|
750
|
+
id = `${item.id}-${suffix++}`;
|
|
751
|
+
seen.add(id);
|
|
752
|
+
normalized.push({ ...item, id });
|
|
753
|
+
}
|
|
754
|
+
if (!normalized.some(project => project.current)) {
|
|
755
|
+
normalized.unshift(currentProject);
|
|
756
|
+
}
|
|
757
|
+
return normalized.map(project => ({ ...project, current: project.projectDir === currentProject.projectDir }));
|
|
758
|
+
}
|
|
759
|
+
function safeProjectId(name) {
|
|
760
|
+
const id = name.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '');
|
|
761
|
+
return id || 'project';
|
|
762
|
+
}
|
|
763
|
+
function parsePositiveInt(value, fallback) {
|
|
764
|
+
const parsed = Number(value);
|
|
765
|
+
return Number.isInteger(parsed) && parsed > 0 ? parsed : fallback;
|
|
766
|
+
}
|
|
767
|
+
function normalizeMemoryReviewAction(value) {
|
|
768
|
+
if (!value)
|
|
769
|
+
return null;
|
|
770
|
+
return MEMORY_REVIEW_ACTIONS.includes(value) ? value : null;
|
|
771
|
+
}
|
|
772
|
+
function countBy(items, selector) {
|
|
773
|
+
const counts = {};
|
|
774
|
+
for (const item of items) {
|
|
775
|
+
const key = selector(item);
|
|
776
|
+
counts[key] = (counts[key] ?? 0) + 1;
|
|
777
|
+
}
|
|
778
|
+
return counts;
|
|
779
|
+
}
|
|
780
|
+
function sum(items, selector) {
|
|
781
|
+
return items.reduce((total, item) => total + selector(item), 0);
|
|
782
|
+
}
|
|
459
783
|
//# sourceMappingURL=DashboardServer.js.map
|