mister-wolf 2.11.0 → 2.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/dist/adapters/cli/cli-entry.d.ts +25 -0
- package/dist/adapters/cli/cli-entry.d.ts.map +1 -1
- package/dist/adapters/cli/cli-entry.js +393 -94
- package/dist/adapters/cli/cli-entry.js.map +1 -1
- package/dist/adapters/cli/commands/analytics.d.ts +30 -5
- package/dist/adapters/cli/commands/analytics.d.ts.map +1 -1
- package/dist/adapters/cli/commands/analytics.js +314 -2
- package/dist/adapters/cli/commands/analytics.js.map +1 -1
- package/dist/adapters/cli/commands/memory-add.d.ts +21 -1
- package/dist/adapters/cli/commands/memory-add.d.ts.map +1 -1
- package/dist/adapters/cli/commands/memory-add.js +42 -29
- package/dist/adapters/cli/commands/memory-add.js.map +1 -1
- package/dist/adapters/cli/commands/memory-archive.d.ts +3 -0
- package/dist/adapters/cli/commands/memory-archive.d.ts.map +1 -0
- package/dist/adapters/cli/commands/memory-archive.js +19 -0
- package/dist/adapters/cli/commands/memory-archive.js.map +1 -0
- package/dist/adapters/cli/commands/memory-brief.d.ts.map +1 -1
- package/dist/adapters/cli/commands/memory-brief.js +13 -3
- package/dist/adapters/cli/commands/memory-brief.js.map +1 -1
- package/dist/adapters/cli/commands/memory-call.d.ts.map +1 -1
- package/dist/adapters/cli/commands/memory-call.js +57 -3
- package/dist/adapters/cli/commands/memory-call.js.map +1 -1
- package/dist/adapters/cli/commands/memory-edit.d.ts +3 -0
- package/dist/adapters/cli/commands/memory-edit.d.ts.map +1 -0
- package/dist/adapters/cli/commands/memory-edit.js +67 -0
- package/dist/adapters/cli/commands/memory-edit.js.map +1 -0
- package/dist/adapters/cli/commands/memory-init.d.ts.map +1 -1
- package/dist/adapters/cli/commands/memory-init.js +46 -7
- package/dist/adapters/cli/commands/memory-init.js.map +1 -1
- package/dist/adapters/cli/commands/memory-list.d.ts +12 -0
- package/dist/adapters/cli/commands/memory-list.d.ts.map +1 -1
- package/dist/adapters/cli/commands/memory-list.js +34 -21
- package/dist/adapters/cli/commands/memory-list.js.map +1 -1
- package/dist/adapters/cli/commands/memory-migrate.d.ts.map +1 -1
- package/dist/adapters/cli/commands/memory-migrate.js +91 -0
- package/dist/adapters/cli/commands/memory-migrate.js.map +1 -1
- package/dist/adapters/cli/commands/memory-recap.d.ts.map +1 -1
- package/dist/adapters/cli/commands/memory-recap.js +16 -1
- package/dist/adapters/cli/commands/memory-recap.js.map +1 -1
- package/dist/adapters/cli/commands/memory-relation.d.ts +1 -1
- package/dist/adapters/cli/commands/memory-relation.d.ts.map +1 -1
- package/dist/adapters/cli/commands/memory-relation.js +57 -2
- package/dist/adapters/cli/commands/memory-relation.js.map +1 -1
- package/dist/adapters/cli/commands/memory-search.d.ts.map +1 -1
- package/dist/adapters/cli/commands/memory-search.js +21 -2
- package/dist/adapters/cli/commands/memory-search.js.map +1 -1
- package/dist/adapters/cli/commands/memory-session.d.ts.map +1 -1
- package/dist/adapters/cli/commands/memory-session.js +2 -12
- package/dist/adapters/cli/commands/memory-session.js.map +1 -1
- package/dist/adapters/cli/commands/memory-sync.d.ts.map +1 -1
- package/dist/adapters/cli/commands/memory-sync.js +2 -9
- package/dist/adapters/cli/commands/memory-sync.js.map +1 -1
- package/dist/adapters/cli/commands/memory-taxonomy.d.ts.map +1 -1
- package/dist/adapters/cli/commands/memory-taxonomy.js +4 -4
- package/dist/adapters/cli/commands/memory-taxonomy.js.map +1 -1
- package/dist/adapters/cli/commands/memory-tool.d.ts.map +1 -1
- package/dist/adapters/cli/commands/memory-tool.js +13 -5
- package/dist/adapters/cli/commands/memory-tool.js.map +1 -1
- package/dist/adapters/cli/commands/memory-validate.d.ts.map +1 -1
- package/dist/adapters/cli/commands/memory-validate.js +18 -4
- package/dist/adapters/cli/commands/memory-validate.js.map +1 -1
- package/dist/adapters/cli/removed-commands.d.ts +11 -0
- package/dist/adapters/cli/removed-commands.d.ts.map +1 -0
- package/dist/adapters/cli/removed-commands.js +36 -0
- package/dist/adapters/cli/removed-commands.js.map +1 -0
- package/dist/adapters/cli/type-command-generator.d.ts +5 -0
- package/dist/adapters/cli/type-command-generator.d.ts.map +1 -0
- package/dist/adapters/cli/type-command-generator.js +128 -0
- package/dist/adapters/cli/type-command-generator.js.map +1 -0
- package/dist/adapters/fs/config-file.d.ts +14 -1
- package/dist/adapters/fs/config-file.d.ts.map +1 -1
- package/dist/adapters/fs/config-file.js +168 -56
- package/dist/adapters/fs/config-file.js.map +1 -1
- package/dist/adapters/fs/doc-id-migration.d.ts +2 -0
- package/dist/adapters/fs/doc-id-migration.d.ts.map +1 -1
- package/dist/adapters/fs/doc-id-migration.js +8 -2
- package/dist/adapters/fs/doc-id-migration.js.map +1 -1
- package/dist/adapters/fs/effectiveness-snapshots.d.ts +1 -1
- package/dist/adapters/fs/effectiveness-snapshots.d.ts.map +1 -1
- package/dist/adapters/fs/jsonl-relation-log.d.ts.map +1 -1
- package/dist/adapters/fs/jsonl-relation-log.js +10 -2
- package/dist/adapters/fs/jsonl-relation-log.js.map +1 -1
- package/dist/adapters/fs/layout-migration.d.ts.map +1 -1
- package/dist/adapters/fs/layout-migration.js +21 -2
- package/dist/adapters/fs/layout-migration.js.map +1 -1
- package/dist/adapters/fs/markdown-memory-store.d.ts +9 -0
- package/dist/adapters/fs/markdown-memory-store.d.ts.map +1 -1
- package/dist/adapters/fs/markdown-memory-store.js +103 -21
- package/dist/adapters/fs/markdown-memory-store.js.map +1 -1
- package/dist/adapters/fs/project-paths.d.ts +1 -1
- package/dist/adapters/fs/project-paths.d.ts.map +1 -1
- package/dist/adapters/fs/project-paths.js +1 -1
- package/dist/adapters/fs/project-paths.js.map +1 -1
- package/dist/adapters/fs/projects-registry.d.ts +0 -2
- package/dist/adapters/fs/projects-registry.d.ts.map +1 -1
- package/dist/adapters/fs/projects-registry.js +0 -16
- package/dist/adapters/fs/projects-registry.js.map +1 -1
- package/dist/adapters/fs/scan-snapshot-cache.d.ts +23 -0
- package/dist/adapters/fs/scan-snapshot-cache.d.ts.map +1 -0
- package/dist/adapters/fs/scan-snapshot-cache.js +36 -0
- package/dist/adapters/fs/scan-snapshot-cache.js.map +1 -0
- package/dist/adapters/fs/session-delivery-registry.d.ts +31 -0
- package/dist/adapters/fs/session-delivery-registry.d.ts.map +1 -0
- package/dist/adapters/fs/session-delivery-registry.js +104 -0
- package/dist/adapters/fs/session-delivery-registry.js.map +1 -0
- package/dist/adapters/fs/session-metrics-log.d.ts +35 -109
- package/dist/adapters/fs/session-metrics-log.d.ts.map +1 -1
- package/dist/adapters/fs/session-metrics-log.js +227 -141
- package/dist/adapters/fs/session-metrics-log.js.map +1 -1
- package/dist/adapters/fs/taxonomy-migration.d.ts +38 -0
- package/dist/adapters/fs/taxonomy-migration.d.ts.map +1 -0
- package/dist/adapters/fs/taxonomy-migration.js +280 -0
- package/dist/adapters/fs/taxonomy-migration.js.map +1 -0
- package/dist/adapters/mcp/mcp-schemas.d.ts +0 -122
- package/dist/adapters/mcp/mcp-schemas.d.ts.map +1 -1
- package/dist/adapters/mcp/mcp-schemas.js +0 -102
- package/dist/adapters/mcp/mcp-schemas.js.map +1 -1
- package/dist/adapters/mcp/mcp-server.d.ts.map +1 -1
- package/dist/adapters/mcp/mcp-server.js +30 -1
- package/dist/adapters/mcp/mcp-server.js.map +1 -1
- package/dist/adapters/mcp/mcp-tools.d.ts +10 -0
- package/dist/adapters/mcp/mcp-tools.d.ts.map +1 -1
- package/dist/adapters/mcp/mcp-tools.js +51 -188
- package/dist/adapters/mcp/mcp-tools.js.map +1 -1
- package/dist/adapters/sqlite/sqlite-schema.d.ts +1 -1
- package/dist/adapters/sqlite/sqlite-schema.d.ts.map +1 -1
- package/dist/adapters/sqlite/sqlite-schema.js +4 -2
- package/dist/adapters/sqlite/sqlite-schema.js.map +1 -1
- package/dist/adapters/sqlite/sqlite-search-index.d.ts +13 -1
- package/dist/adapters/sqlite/sqlite-search-index.d.ts.map +1 -1
- package/dist/adapters/sqlite/sqlite-search-index.js +88 -34
- package/dist/adapters/sqlite/sqlite-search-index.js.map +1 -1
- package/dist/app/use-cases/add-memory-object.d.ts +4 -0
- package/dist/app/use-cases/add-memory-object.d.ts.map +1 -1
- package/dist/app/use-cases/add-memory-object.js +34 -4
- package/dist/app/use-cases/add-memory-object.js.map +1 -1
- package/dist/app/use-cases/bootstrap-project.d.ts.map +1 -1
- package/dist/app/use-cases/bootstrap-project.js +13 -9
- package/dist/app/use-cases/bootstrap-project.js.map +1 -1
- package/dist/app/use-cases/build-analytics.d.ts +160 -2
- package/dist/app/use-cases/build-analytics.d.ts.map +1 -1
- package/dist/app/use-cases/build-analytics.js +399 -6
- package/dist/app/use-cases/build-analytics.js.map +1 -1
- package/dist/app/use-cases/create-memory-repair-request.d.ts.map +1 -1
- package/dist/app/use-cases/create-memory-repair-request.js +5 -3
- package/dist/app/use-cases/create-memory-repair-request.js.map +1 -1
- package/dist/app/use-cases/diff-thread.d.ts.map +1 -1
- package/dist/app/use-cases/diff-thread.js +9 -6
- package/dist/app/use-cases/diff-thread.js.map +1 -1
- package/dist/app/use-cases/generate-agent-brief.d.ts.map +1 -1
- package/dist/app/use-cases/generate-agent-brief.js +18 -8
- package/dist/app/use-cases/generate-agent-brief.js.map +1 -1
- package/dist/app/use-cases/generate-recap.d.ts +14 -0
- package/dist/app/use-cases/generate-recap.d.ts.map +1 -1
- package/dist/app/use-cases/generate-recap.js +60 -7
- package/dist/app/use-cases/generate-recap.js.map +1 -1
- package/dist/app/use-cases/get-call-injections.d.ts +8 -0
- package/dist/app/use-cases/get-call-injections.d.ts.map +1 -1
- package/dist/app/use-cases/get-call-injections.js +43 -12
- package/dist/app/use-cases/get-call-injections.js.map +1 -1
- package/dist/app/use-cases/init-project.d.ts +2 -6
- package/dist/app/use-cases/init-project.d.ts.map +1 -1
- package/dist/app/use-cases/init-project.js +11 -13
- package/dist/app/use-cases/init-project.js.map +1 -1
- package/dist/app/use-cases/list-memory-objects.d.ts +2 -0
- package/dist/app/use-cases/list-memory-objects.d.ts.map +1 -1
- package/dist/app/use-cases/list-memory-objects.js.map +1 -1
- package/dist/app/use-cases/scaffold-agent.d.ts.map +1 -1
- package/dist/app/use-cases/scaffold-agent.js +58 -17
- package/dist/app/use-cases/scaffold-agent.js.map +1 -1
- package/dist/app/use-cases/scan-project.d.ts +26 -1
- package/dist/app/use-cases/scan-project.d.ts.map +1 -1
- package/dist/app/use-cases/scan-project.js +86 -51
- package/dist/app/use-cases/scan-project.js.map +1 -1
- package/dist/app/use-cases/seed-base-playbooks.d.ts +82 -3
- package/dist/app/use-cases/seed-base-playbooks.d.ts.map +1 -1
- package/dist/app/use-cases/seed-base-playbooks.js +13 -1
- package/dist/app/use-cases/seed-base-playbooks.js.map +1 -1
- package/dist/app/use-cases/should-summarize.d.ts.map +1 -1
- package/dist/app/use-cases/should-summarize.js +3 -1
- package/dist/app/use-cases/should-summarize.js.map +1 -1
- package/dist/app/use-cases/snapshot-delta.d.ts +1 -1
- package/dist/app/use-cases/snapshot-delta.d.ts.map +1 -1
- package/dist/app/use-cases/snapshot-delta.js.map +1 -1
- package/dist/app/use-cases/summarize-session.d.ts.map +1 -1
- package/dist/app/use-cases/summarize-session.js +11 -2
- package/dist/app/use-cases/summarize-session.js.map +1 -1
- package/dist/app/use-cases/thinking.d.ts +2 -2
- package/dist/app/use-cases/thinking.d.ts.map +1 -1
- package/dist/app/use-cases/thinking.js +20 -12
- package/dist/app/use-cases/thinking.js.map +1 -1
- package/dist/app/use-cases/tool-stats.js +1 -1
- package/dist/app/use-cases/tool-stats.js.map +1 -1
- package/dist/domain/facet-colors.d.ts +12 -0
- package/dist/domain/facet-colors.d.ts.map +1 -0
- package/dist/domain/facet-colors.js +33 -0
- package/dist/domain/facet-colors.js.map +1 -0
- package/dist/domain/governance.d.ts.map +1 -1
- package/dist/domain/governance.js +9 -2
- package/dist/domain/governance.js.map +1 -1
- package/dist/domain/memory-types.d.ts +67 -318
- package/dist/domain/memory-types.d.ts.map +1 -1
- package/dist/domain/memory-types.js +87 -223
- package/dist/domain/memory-types.js.map +1 -1
- package/dist/domain/policies/read-only-zones.d.ts.map +1 -1
- package/dist/domain/policies/read-only-zones.js +7 -11
- package/dist/domain/policies/read-only-zones.js.map +1 -1
- package/dist/domain/router-log.d.ts +8 -2
- package/dist/domain/router-log.d.ts.map +1 -1
- package/dist/domain/router-log.js +14 -2
- package/dist/domain/router-log.js.map +1 -1
- package/dist/domain/schemas/memory-event-schema.d.ts +1 -0
- package/dist/domain/schemas/memory-event-schema.d.ts.map +1 -1
- package/dist/domain/schemas/memory-event-schema.js +1 -0
- package/dist/domain/schemas/memory-event-schema.js.map +1 -1
- package/dist/domain/schemas/memory-object-schema.d.ts +2 -0
- package/dist/domain/schemas/memory-object-schema.d.ts.map +1 -1
- package/dist/domain/schemas/memory-object-schema.js +3 -0
- package/dist/domain/schemas/memory-object-schema.js.map +1 -1
- package/dist/domain/schemas/relation-schema.d.ts +5 -3
- package/dist/domain/schemas/relation-schema.d.ts.map +1 -1
- package/dist/domain/schemas/relation-schema.js +4 -0
- package/dist/domain/schemas/relation-schema.js.map +1 -1
- package/dist/domain/schemas/session-checkpoint-schema.d.ts +3 -1
- package/dist/domain/schemas/session-checkpoint-schema.d.ts.map +1 -1
- package/dist/domain/schemas/session-checkpoint-schema.js +3 -2
- package/dist/domain/schemas/session-checkpoint-schema.js.map +1 -1
- package/dist/domain/solve/scenarios.js +3 -3
- package/dist/domain/solve/scenarios.js.map +1 -1
- package/dist/domain/taxonomy.d.ts +15 -1
- package/dist/domain/taxonomy.d.ts.map +1 -1
- package/dist/domain/taxonomy.js +14 -1
- package/dist/domain/taxonomy.js.map +1 -1
- package/dist/domain/tool-economy.d.ts +1 -1
- package/dist/domain/tool-economy.js +1 -1
- package/dist/domain/type-schema-builder.d.ts +15 -2
- package/dist/domain/type-schema-builder.d.ts.map +1 -1
- package/dist/domain/type-schema-builder.js +7 -0
- package/dist/domain/type-schema-builder.js.map +1 -1
- package/dist/ports/memory-store.port.d.ts +2 -0
- package/dist/ports/memory-store.port.d.ts.map +1 -1
- package/dist/ports/search-index.port.d.ts +2 -0
- package/dist/ports/search-index.port.d.ts.map +1 -1
- package/package.json +2 -2
- package/templates/opencode/plugins/wolf-router.ts +88 -45
- package/templates/opencode/plugins/wolf-session-start.js +6 -3
- package/dist/adapters/cli/commands/coord.d.ts +0 -3
- package/dist/adapters/cli/commands/coord.d.ts.map +0 -1
- package/dist/adapters/cli/commands/coord.js +0 -36
- package/dist/adapters/cli/commands/coord.js.map +0 -1
- package/dist/adapters/cli/commands/dashboard.d.ts +0 -20
- package/dist/adapters/cli/commands/dashboard.d.ts.map +0 -1
- package/dist/adapters/cli/commands/dashboard.js +0 -231
- package/dist/adapters/cli/commands/dashboard.js.map +0 -1
- package/dist/adapters/cli/commands/memory-article.d.ts +0 -3
- package/dist/adapters/cli/commands/memory-article.d.ts.map +0 -1
- package/dist/adapters/cli/commands/memory-article.js +0 -47
- package/dist/adapters/cli/commands/memory-article.js.map +0 -1
- package/dist/adapters/cli/commands/memory-blocker.d.ts +0 -3
- package/dist/adapters/cli/commands/memory-blocker.d.ts.map +0 -1
- package/dist/adapters/cli/commands/memory-blocker.js +0 -52
- package/dist/adapters/cli/commands/memory-blocker.js.map +0 -1
- package/dist/adapters/cli/commands/memory-council.d.ts +0 -3
- package/dist/adapters/cli/commands/memory-council.d.ts.map +0 -1
- package/dist/adapters/cli/commands/memory-council.js +0 -42
- package/dist/adapters/cli/commands/memory-council.js.map +0 -1
- package/dist/adapters/cli/commands/memory-decision.d.ts +0 -3
- package/dist/adapters/cli/commands/memory-decision.d.ts.map +0 -1
- package/dist/adapters/cli/commands/memory-decision.js +0 -41
- package/dist/adapters/cli/commands/memory-decision.js.map +0 -1
- package/dist/adapters/cli/commands/memory-effectiveness.d.ts +0 -3
- package/dist/adapters/cli/commands/memory-effectiveness.d.ts.map +0 -1
- package/dist/adapters/cli/commands/memory-effectiveness.js +0 -127
- package/dist/adapters/cli/commands/memory-effectiveness.js.map +0 -1
- package/dist/adapters/cli/commands/memory-info-request.d.ts +0 -3
- package/dist/adapters/cli/commands/memory-info-request.d.ts.map +0 -1
- package/dist/adapters/cli/commands/memory-info-request.js +0 -47
- package/dist/adapters/cli/commands/memory-info-request.js.map +0 -1
- package/dist/adapters/cli/commands/memory-insights.d.ts +0 -3
- package/dist/adapters/cli/commands/memory-insights.d.ts.map +0 -1
- package/dist/adapters/cli/commands/memory-insights.js +0 -42
- package/dist/adapters/cli/commands/memory-insights.js.map +0 -1
- package/dist/adapters/cli/commands/memory-learn.d.ts +0 -3
- package/dist/adapters/cli/commands/memory-learn.d.ts.map +0 -1
- package/dist/adapters/cli/commands/memory-learn.js +0 -327
- package/dist/adapters/cli/commands/memory-learn.js.map +0 -1
- package/dist/adapters/cli/commands/memory-rule.d.ts +0 -3
- package/dist/adapters/cli/commands/memory-rule.d.ts.map +0 -1
- package/dist/adapters/cli/commands/memory-rule.js +0 -40
- package/dist/adapters/cli/commands/memory-rule.js.map +0 -1
- package/dist/adapters/cli/commands/memory-run.d.ts +0 -3
- package/dist/adapters/cli/commands/memory-run.d.ts.map +0 -1
- package/dist/adapters/cli/commands/memory-run.js +0 -154
- package/dist/adapters/cli/commands/memory-run.js.map +0 -1
- package/dist/adapters/cli/commands/memory-stage.d.ts +0 -3
- package/dist/adapters/cli/commands/memory-stage.d.ts.map +0 -1
- package/dist/adapters/cli/commands/memory-stage.js +0 -35
- package/dist/adapters/cli/commands/memory-stage.js.map +0 -1
- package/dist/adapters/cli/commands/memory-thread.d.ts +0 -3
- package/dist/adapters/cli/commands/memory-thread.d.ts.map +0 -1
- package/dist/adapters/cli/commands/memory-thread.js +0 -48
- package/dist/adapters/cli/commands/memory-thread.js.map +0 -1
- package/dist/adapters/cli/opencode-run-metrics.d.ts +0 -25
- package/dist/adapters/cli/opencode-run-metrics.d.ts.map +0 -1
- package/dist/adapters/cli/opencode-run-metrics.js +0 -64
- package/dist/adapters/cli/opencode-run-metrics.js.map +0 -1
- package/dist/app/use-cases/activate-draft.d.ts +0 -31
- package/dist/app/use-cases/activate-draft.d.ts.map +0 -1
- package/dist/app/use-cases/activate-draft.js +0 -74
- package/dist/app/use-cases/activate-draft.js.map +0 -1
- package/dist/app/use-cases/build-dashboard.d.ts +0 -43
- package/dist/app/use-cases/build-dashboard.d.ts.map +0 -1
- package/dist/app/use-cases/build-dashboard.js +0 -32
- package/dist/app/use-cases/build-dashboard.js.map +0 -1
- package/dist/app/use-cases/create-article.d.ts +0 -31
- package/dist/app/use-cases/create-article.d.ts.map +0 -1
- package/dist/app/use-cases/create-article.js +0 -62
- package/dist/app/use-cases/create-article.js.map +0 -1
- package/dist/app/use-cases/create-blocker.d.ts +0 -28
- package/dist/app/use-cases/create-blocker.d.ts.map +0 -1
- package/dist/app/use-cases/create-blocker.js +0 -51
- package/dist/app/use-cases/create-blocker.js.map +0 -1
- package/dist/app/use-cases/create-decision.d.ts +0 -28
- package/dist/app/use-cases/create-decision.d.ts.map +0 -1
- package/dist/app/use-cases/create-decision.js +0 -58
- package/dist/app/use-cases/create-decision.js.map +0 -1
- package/dist/app/use-cases/create-info-request.d.ts +0 -31
- package/dist/app/use-cases/create-info-request.d.ts.map +0 -1
- package/dist/app/use-cases/create-info-request.js +0 -58
- package/dist/app/use-cases/create-info-request.js.map +0 -1
- package/dist/app/use-cases/create-rule.d.ts +0 -27
- package/dist/app/use-cases/create-rule.d.ts.map +0 -1
- package/dist/app/use-cases/create-rule.js +0 -48
- package/dist/app/use-cases/create-rule.js.map +0 -1
- package/dist/app/use-cases/create-session-checkpoint.d.ts +0 -23
- package/dist/app/use-cases/create-session-checkpoint.d.ts.map +0 -1
- package/dist/app/use-cases/create-session-checkpoint.js +0 -61
- package/dist/app/use-cases/create-session-checkpoint.js.map +0 -1
- package/dist/app/use-cases/create-synthesis.d.ts +0 -25
- package/dist/app/use-cases/create-synthesis.d.ts.map +0 -1
- package/dist/app/use-cases/create-synthesis.js +0 -36
- package/dist/app/use-cases/create-synthesis.js.map +0 -1
- package/dist/app/use-cases/create-work-thread.d.ts +0 -26
- package/dist/app/use-cases/create-work-thread.d.ts.map +0 -1
- package/dist/app/use-cases/create-work-thread.js +0 -47
- package/dist/app/use-cases/create-work-thread.js.map +0 -1
- package/dist/app/use-cases/effectiveness.d.ts +0 -116
- package/dist/app/use-cases/effectiveness.d.ts.map +0 -1
- package/dist/app/use-cases/effectiveness.js +0 -198
- package/dist/app/use-cases/effectiveness.js.map +0 -1
- package/dist/app/use-cases/get-thread-brief.d.ts +0 -19
- package/dist/app/use-cases/get-thread-brief.d.ts.map +0 -1
- package/dist/app/use-cases/get-thread-brief.js +0 -72
- package/dist/app/use-cases/get-thread-brief.js.map +0 -1
- package/dist/app/use-cases/learn-decay.d.ts +0 -91
- package/dist/app/use-cases/learn-decay.d.ts.map +0 -1
- package/dist/app/use-cases/learn-decay.js +0 -274
- package/dist/app/use-cases/learn-decay.js.map +0 -1
- package/dist/app/use-cases/model-routing.d.ts +0 -30
- package/dist/app/use-cases/model-routing.d.ts.map +0 -1
- package/dist/app/use-cases/model-routing.js +0 -39
- package/dist/app/use-cases/model-routing.js.map +0 -1
- package/dist/app/use-cases/pattern-detection.d.ts +0 -44
- package/dist/app/use-cases/pattern-detection.d.ts.map +0 -1
- package/dist/app/use-cases/pattern-detection.js +0 -71
- package/dist/app/use-cases/pattern-detection.js.map +0 -1
- package/dist/app/use-cases/propose-draft.d.ts +0 -79
- package/dist/app/use-cases/propose-draft.d.ts.map +0 -1
- package/dist/app/use-cases/propose-draft.js +0 -140
- package/dist/app/use-cases/propose-draft.js.map +0 -1
- package/dist/app/use-cases/resolve-blocker.d.ts +0 -17
- package/dist/app/use-cases/resolve-blocker.d.ts.map +0 -1
- package/dist/app/use-cases/resolve-blocker.js +0 -31
- package/dist/app/use-cases/resolve-blocker.js.map +0 -1
- package/dist/app/use-cases/run-source.d.ts +0 -15
- package/dist/app/use-cases/run-source.d.ts.map +0 -1
- package/dist/app/use-cases/run-source.js +0 -26
- package/dist/app/use-cases/run-source.js.map +0 -1
- package/dist/app/use-cases/tally-council-votes.d.ts +0 -24
- package/dist/app/use-cases/tally-council-votes.d.ts.map +0 -1
- package/dist/app/use-cases/tally-council-votes.js +0 -30
- package/dist/app/use-cases/tally-council-votes.js.map +0 -1
- package/dist/app/use-cases/template-evolve.d.ts +0 -87
- package/dist/app/use-cases/template-evolve.d.ts.map +0 -1
- package/dist/app/use-cases/template-evolve.js +0 -164
- package/dist/app/use-cases/template-evolve.js.map +0 -1
- package/dist/app/use-cases/validate-draft.d.ts +0 -36
- package/dist/app/use-cases/validate-draft.d.ts.map +0 -1
- package/dist/app/use-cases/validate-draft.js +0 -75
- package/dist/app/use-cases/validate-draft.js.map +0 -1
- package/dist/domain/gates/stop-gate.d.ts +0 -43
- package/dist/domain/gates/stop-gate.d.ts.map +0 -1
- package/dist/domain/gates/stop-gate.js +0 -125
- package/dist/domain/gates/stop-gate.js.map +0 -1
- package/dist/domain/schemas/article-schema.d.ts +0 -79
- package/dist/domain/schemas/article-schema.d.ts.map +0 -1
- package/dist/domain/schemas/article-schema.js +0 -12
- package/dist/domain/schemas/article-schema.js.map +0 -1
- package/dist/domain/schemas/blocker-schema.d.ts +0 -77
- package/dist/domain/schemas/blocker-schema.d.ts.map +0 -1
- package/dist/domain/schemas/blocker-schema.js +0 -10
- package/dist/domain/schemas/blocker-schema.js.map +0 -1
- package/dist/domain/schemas/decision-schema.d.ts +0 -75
- package/dist/domain/schemas/decision-schema.d.ts.map +0 -1
- package/dist/domain/schemas/decision-schema.js +0 -8
- package/dist/domain/schemas/decision-schema.js.map +0 -1
- package/dist/domain/schemas/info-request-schema.d.ts +0 -80
- package/dist/domain/schemas/info-request-schema.d.ts.map +0 -1
- package/dist/domain/schemas/info-request-schema.js +0 -13
- package/dist/domain/schemas/info-request-schema.js.map +0 -1
- package/dist/domain/schemas/rule-schema.d.ts +0 -80
- package/dist/domain/schemas/rule-schema.d.ts.map +0 -1
- package/dist/domain/schemas/rule-schema.js +0 -10
- package/dist/domain/schemas/rule-schema.js.map +0 -1
- package/dist/domain/schemas/thread-schema.d.ts +0 -77
- package/dist/domain/schemas/thread-schema.d.ts.map +0 -1
- package/dist/domain/schemas/thread-schema.js +0 -10
- package/dist/domain/schemas/thread-schema.js.map +0 -1
- package/templates/base/playbooks/wolf-review-lenses.md +0 -50
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import { DEFAULT_PATTERN_THRESHOLD } from '../../adapters/fs/session-metrics-log.js';
|
|
1
|
+
import { DEFAULT_PATTERN_THRESHOLD, mergeRunEntries, silentRuleIds, } from '../../adapters/fs/session-metrics-log.js';
|
|
2
|
+
import { median } from '../../domain/tool-economy.js';
|
|
2
3
|
import { UNCATEGORIZED_ERROR_CLASS } from '../../domain/error-class.js';
|
|
3
4
|
import { runCostUsd } from '../../domain/pricing.js';
|
|
4
|
-
import { silentRuleIds } from './learn-decay.js';
|
|
5
|
-
import { mergeRunEntries } from './run-source.js';
|
|
6
5
|
import { mondayOf } from './generate-insights.js';
|
|
7
|
-
import {
|
|
6
|
+
import { toolStats } from './tool-stats.js';
|
|
8
7
|
export const DEFAULT_LIFECYCLE_THRESHOLDS = { newDays: 14, workhorseUses: 3 };
|
|
9
8
|
/** Override из config (analytics.thresholds) поверх дефолтов (D7). */
|
|
10
9
|
export function resolveLifecycleThresholds(override) {
|
|
@@ -491,6 +490,155 @@ function buildAcceptance(signals, routerLog, now, signalLogMalformedLines = 0) {
|
|
|
491
490
|
dataQuality: { malformedLines: signalLogMalformedLines },
|
|
492
491
|
};
|
|
493
492
|
}
|
|
493
|
+
/**
|
|
494
|
+
* P110: толерантный парсер .wolf/metrics/skill-invocations.jsonl (прецедент readJsonl):
|
|
495
|
+
* битая строка → malformedLines++, не бросает; agent отсутствует → null.
|
|
496
|
+
* Валидная строка = JSON-объект с непустой строкой в `skill`.
|
|
497
|
+
*/
|
|
498
|
+
export function parseSkillInvocations(text) {
|
|
499
|
+
const rows = [];
|
|
500
|
+
let malformedLines = 0;
|
|
501
|
+
for (const line of text.split('\n')) {
|
|
502
|
+
const trimmed = line.trim();
|
|
503
|
+
if (trimmed === '')
|
|
504
|
+
continue;
|
|
505
|
+
try {
|
|
506
|
+
const parsed = JSON.parse(trimmed);
|
|
507
|
+
const rec = typeof parsed === 'object' && parsed !== null ? parsed : null;
|
|
508
|
+
if (rec === null || typeof rec.skill !== 'string' || rec.skill === '') {
|
|
509
|
+
malformedLines += 1;
|
|
510
|
+
continue;
|
|
511
|
+
}
|
|
512
|
+
rows.push({
|
|
513
|
+
ts: typeof rec.ts === 'string' ? rec.ts : '',
|
|
514
|
+
skill: rec.skill,
|
|
515
|
+
agent: typeof rec.agent === 'string' && rec.agent !== '' ? rec.agent : null,
|
|
516
|
+
});
|
|
517
|
+
}
|
|
518
|
+
catch {
|
|
519
|
+
malformedLines += 1;
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
return { rows, malformedLines };
|
|
523
|
+
}
|
|
524
|
+
/** P110: панель доставки — чистая агрегация signals + router.log + skill-invocations.
|
|
525
|
+
* applied-join (только CLI-канал, session_id !== null): доставка (S, name N, ts T)
|
|
526
|
+
* считается applied, если в той же сессии S есть get(memory_id=N) или
|
|
527
|
+
* search(memory_ids ∋ N) с ts >= T. Пустые входы → пустые массивы/null-метрики. */
|
|
528
|
+
function buildDelivery(signals, routerLog, skillInvocations) {
|
|
529
|
+
// индекс get/search-вызовов по сессии (CLI-канал): tsMs + множество затронутых id
|
|
530
|
+
const callsBySession = new Map();
|
|
531
|
+
for (const s of signals) {
|
|
532
|
+
if (s.event !== 'mcp_call' || s.session_id === null)
|
|
533
|
+
continue;
|
|
534
|
+
if (s.tool_name !== 'get' && s.tool_name !== 'search')
|
|
535
|
+
continue;
|
|
536
|
+
let ids;
|
|
537
|
+
if (s.tool_name === 'get') {
|
|
538
|
+
const mid = s.detail?.memory_id;
|
|
539
|
+
if (typeof mid !== 'string' || mid === '')
|
|
540
|
+
continue;
|
|
541
|
+
ids = new Set([mid]);
|
|
542
|
+
}
|
|
543
|
+
else {
|
|
544
|
+
const mids = s.detail?.memory_ids;
|
|
545
|
+
ids = new Set((Array.isArray(mids) ? mids : []).filter((v) => typeof v === 'string' && v !== ''));
|
|
546
|
+
}
|
|
547
|
+
if (ids.size === 0)
|
|
548
|
+
continue;
|
|
549
|
+
const tsMs = Date.parse(s.ts);
|
|
550
|
+
if (Number.isNaN(tsMs))
|
|
551
|
+
continue;
|
|
552
|
+
const arr = callsBySession.get(s.session_id) ?? [];
|
|
553
|
+
arr.push({ tsMs, ids });
|
|
554
|
+
callsBySession.set(s.session_id, arr);
|
|
555
|
+
}
|
|
556
|
+
const byName = new Map();
|
|
557
|
+
let bytesSum = 0;
|
|
558
|
+
let bytesCount = 0;
|
|
559
|
+
for (const s of signals) {
|
|
560
|
+
if (s.event !== 'delivery')
|
|
561
|
+
continue;
|
|
562
|
+
const name = s.detail?.name;
|
|
563
|
+
if (typeof name !== 'string' || name === '')
|
|
564
|
+
continue;
|
|
565
|
+
const acc = byName.get(name) ?? { deliveries: 0, applied: 0 };
|
|
566
|
+
acc.deliveries += 1;
|
|
567
|
+
const b = finiteNumber(s.detail?.injection_bytes);
|
|
568
|
+
if (b !== null) {
|
|
569
|
+
bytesSum += b;
|
|
570
|
+
bytesCount += 1;
|
|
571
|
+
}
|
|
572
|
+
// ponytail: O(D×G) на логах ~10^4 — достаточно; индекс по id, если вырастет
|
|
573
|
+
if (s.session_id !== null) {
|
|
574
|
+
const tMs = Date.parse(s.ts);
|
|
575
|
+
const calls = callsBySession.get(s.session_id);
|
|
576
|
+
if (!Number.isNaN(tMs) && calls !== undefined) {
|
|
577
|
+
for (const c of calls) {
|
|
578
|
+
if (c.tsMs >= tMs && c.ids.has(name)) {
|
|
579
|
+
acc.applied += 1;
|
|
580
|
+
break;
|
|
581
|
+
}
|
|
582
|
+
}
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
byName.set(name, acc);
|
|
586
|
+
}
|
|
587
|
+
const topDelivered = [...byName.entries()]
|
|
588
|
+
.map(([name, a]) => ({
|
|
589
|
+
name,
|
|
590
|
+
deliveries: a.deliveries,
|
|
591
|
+
applied: a.applied,
|
|
592
|
+
appliedPct: a.deliveries > 0 ? (a.applied / a.deliveries) * 100 : null,
|
|
593
|
+
}))
|
|
594
|
+
.sort((a, b) => b.deliveries - a.deliveries || a.name.localeCompare(b.name));
|
|
595
|
+
const underApplied = topDelivered
|
|
596
|
+
.filter((r) => r.deliveries >= 10 && r.appliedPct !== null && r.appliedPct < 10)
|
|
597
|
+
.map((r) => r.name);
|
|
598
|
+
const routerAcc = new Map();
|
|
599
|
+
let routerBytesSum = 0;
|
|
600
|
+
let routerBytesCount = 0;
|
|
601
|
+
const msValues = [];
|
|
602
|
+
for (const row of routerLog?.rows ?? []) {
|
|
603
|
+
const acc = routerAcc.get(row.agentId) ?? { fallbacks: 0, total: 0 };
|
|
604
|
+
acc.total += 1;
|
|
605
|
+
if (row.variant === 'fallback')
|
|
606
|
+
acc.fallbacks += 1;
|
|
607
|
+
routerAcc.set(row.agentId, acc);
|
|
608
|
+
if (row.bytes !== null && row.bytes > 0) {
|
|
609
|
+
routerBytesSum += row.bytes;
|
|
610
|
+
routerBytesCount += 1;
|
|
611
|
+
}
|
|
612
|
+
if (row.ms !== null)
|
|
613
|
+
msValues.push(row.ms);
|
|
614
|
+
}
|
|
615
|
+
const missRateByAgent = [...routerAcc.entries()]
|
|
616
|
+
.map(([agent, a]) => ({
|
|
617
|
+
agent,
|
|
618
|
+
fallbacks: a.fallbacks,
|
|
619
|
+
total: a.total,
|
|
620
|
+
missRatePct: a.total > 0 ? (a.fallbacks / a.total) * 100 : null,
|
|
621
|
+
}))
|
|
622
|
+
.sort((a, b) => b.fallbacks - a.fallbacks || a.agent.localeCompare(b.agent));
|
|
623
|
+
const msSorted = msValues.sort((x, y) => x - y);
|
|
624
|
+
const skillsAcc = new Map();
|
|
625
|
+
for (const row of skillInvocations?.rows ?? []) {
|
|
626
|
+
skillsAcc.set(row.skill, (skillsAcc.get(row.skill) ?? 0) + 1);
|
|
627
|
+
}
|
|
628
|
+
return {
|
|
629
|
+
topDelivered,
|
|
630
|
+
underApplied,
|
|
631
|
+
missRateByAgent,
|
|
632
|
+
avgInjectionBytes: {
|
|
633
|
+
deliverySignals: bytesCount > 0 ? bytesSum / bytesCount : null,
|
|
634
|
+
routerLog: routerBytesCount > 0 ? routerBytesSum / routerBytesCount : null,
|
|
635
|
+
},
|
|
636
|
+
routerMs: { p50: percentileInterp(msSorted, 50), p90: percentileInterp(msSorted, 90), count: msSorted.length },
|
|
637
|
+
skills: [...skillsAcc.entries()]
|
|
638
|
+
.map(([skill, count]) => ({ skill, count }))
|
|
639
|
+
.sort((a, b) => b.count - a.count || a.skill.localeCompare(b.skill)),
|
|
640
|
+
};
|
|
641
|
+
}
|
|
494
642
|
/** Coverage D5: scored = task_evaluated (любой verdict), runs = run-сигналы. */
|
|
495
643
|
function buildCoverage(signals) {
|
|
496
644
|
const scored = signals.filter((s) => s.event === 'task_evaluated').length;
|
|
@@ -1069,17 +1217,26 @@ function buildReadiness(signals) {
|
|
|
1069
1217
|
// ---------------------------------------------------------------------------
|
|
1070
1218
|
// Use-case
|
|
1071
1219
|
// ---------------------------------------------------------------------------
|
|
1220
|
+
/** Парсер голоса мнения (поле vote → body `VOTE:` → TIMEOUT).
|
|
1221
|
+
* P203: перенесён из удалённого tally-use-case — чтение council-данных живое. */
|
|
1222
|
+
function extractVote(op) {
|
|
1223
|
+
const raw = op.vote;
|
|
1224
|
+
if (typeof raw === 'string' && raw.trim())
|
|
1225
|
+
return raw.trim();
|
|
1226
|
+
const m = op.body.match(/^VOTE:\s*(\S+)/m);
|
|
1227
|
+
return m ? m[1] : 'TIMEOUT';
|
|
1228
|
+
}
|
|
1072
1229
|
/** Консилиумы: вопросы/мнения/синтезы из councils-subdir + relations answers/based_on.
|
|
1073
1230
|
* Чистая агрегация по уже выгруженным объектам; ровно два вызова relations.list
|
|
1074
1231
|
* (predicate answers и based_on — без N+1 по вопросам). Голоса — extractVote
|
|
1075
|
-
*
|
|
1232
|
+
* выше (единственный парсер). */
|
|
1076
1233
|
async function buildCouncils(objects, relations, now, weeks) {
|
|
1077
1234
|
const byId = new Map(objects.map((o) => [o.id, o]));
|
|
1078
1235
|
const questions = objects.filter((o) => o.type === 'council-question');
|
|
1079
1236
|
const opinions = objects.filter((o) => o.type === 'council-opinion');
|
|
1080
1237
|
const syntheses = objects.filter((o) => o.type === 'synthesis');
|
|
1081
1238
|
// вопрос → id его мнений; субъект-реляция засчитывается только если это
|
|
1082
|
-
// существующее в store мнение (
|
|
1239
|
+
// существующее в store мнение (парсер council-голосов — локальный, ниже)
|
|
1083
1240
|
const answersByQuestion = new Map();
|
|
1084
1241
|
for (const r of await relations.list({ predicate: 'answers' })) {
|
|
1085
1242
|
const op = byId.get(r.subject);
|
|
@@ -1236,6 +1393,7 @@ export async function buildAnalyticsReport(deps, input) {
|
|
|
1236
1393
|
const councils = await buildCouncils(allObjects, deps.relations, now, weeks);
|
|
1237
1394
|
const coordination = buildCoordination(signals, events); // P2 D5
|
|
1238
1395
|
const campaign = buildCampaignView(signals); // P3 D2
|
|
1396
|
+
const delivery = buildDelivery(signals, input.routerLog, input.skillInvocations); // P110
|
|
1239
1397
|
const coverage = buildCoverage(signals);
|
|
1240
1398
|
// D6: unknown-model и pricing-coverage по дедуплицированным run-сигналам
|
|
1241
1399
|
const runSignals = signals.filter((s) => s.event === 'run');
|
|
@@ -1272,6 +1430,7 @@ export async function buildAnalyticsReport(deps, input) {
|
|
|
1272
1430
|
councils,
|
|
1273
1431
|
coordination,
|
|
1274
1432
|
campaign,
|
|
1433
|
+
delivery,
|
|
1275
1434
|
// acceptedByAgent (Map, не-JSON) остаётся внутренним — в отчёт идут публичные поля
|
|
1276
1435
|
acceptance: {
|
|
1277
1436
|
accepted: acceptance.accepted,
|
|
@@ -1288,6 +1447,234 @@ export async function buildAnalyticsReport(deps, input) {
|
|
|
1288
1447
|
dataQuality,
|
|
1289
1448
|
};
|
|
1290
1449
|
}
|
|
1450
|
+
// ---------------------------------------------------------------------------
|
|
1451
|
+
// Effectiveness (P221 §6.5: консолидация панели, ранее отдельный use-case-модуль)
|
|
1452
|
+
// ---------------------------------------------------------------------------
|
|
1453
|
+
/**
|
|
1454
|
+
* E1.2: панель эффективности памяти по пробегу (`analytics --view effectiveness`).
|
|
1455
|
+
* Только агрегация существующих данных (store, relations, event-log, signals,
|
|
1456
|
+
* run-log), без LLM и без выдуманных чисел: мало данных → null → панель печатает n/a.
|
|
1457
|
+
*
|
|
1458
|
+
* Методика шума: docs/planning/memory-audit-2026-08-29.md «пишется-но-не-читается» —
|
|
1459
|
+
* объект шум, если нет ни одной связи (relations) и ни одного события в event-log
|
|
1460
|
+
* кроме memory.added; memory.scan.updated = подтверждение актуальности сканом =
|
|
1461
|
+
* использование. Объекты document-ref — функциональный «индекс документов»
|
|
1462
|
+
* (использование = регистрация/обновление сканом), исключены из метрики шума
|
|
1463
|
+
* и показываются отдельной строкой documents (калибровка 2026-08-30).
|
|
1464
|
+
* Объекты со статусом archived исключены аналогично (из числителя и знаменателя):
|
|
1465
|
+
* архивация — легитимный способ снижения шума; показываются строкой archived.
|
|
1466
|
+
* Пороги статусов — config learning.effectiveness_thresholds.
|
|
1467
|
+
*/
|
|
1468
|
+
// Локальные копии из learn-decay.ts (P221: новый импорт оттуда запрещён — файл
|
|
1469
|
+
// умирает в параллельном потоке C; существующий импорт silentRuleIds остаётся)
|
|
1470
|
+
/** Окно молчания правила для rule_utilization-дрейфа [ВА] (§16). */
|
|
1471
|
+
const SILENT_RULE_WINDOW_SESSIONS = 30;
|
|
1472
|
+
/** Минимум delivery-событий в логе, чтобы судить об утилизации правил [ВА] (§16). */
|
|
1473
|
+
const SILENT_RULE_MIN_DELIVERIES = 20;
|
|
1474
|
+
/** Пробег = упорядоченные уникальные session_id из run-событий
|
|
1475
|
+
* (порядок первого появления в логе = хронология). */
|
|
1476
|
+
function countSessions(signals) {
|
|
1477
|
+
const seen = new Set();
|
|
1478
|
+
const out = [];
|
|
1479
|
+
for (const ev of signals) {
|
|
1480
|
+
if (ev.event !== 'run' || ev.session_id === null)
|
|
1481
|
+
continue;
|
|
1482
|
+
if (!seen.has(ev.session_id)) {
|
|
1483
|
+
seen.add(ev.session_id);
|
|
1484
|
+
out.push(ev.session_id);
|
|
1485
|
+
}
|
|
1486
|
+
}
|
|
1487
|
+
return out;
|
|
1488
|
+
}
|
|
1489
|
+
export const DEFAULT_EFFECTIVENESS_THRESHOLDS = {
|
|
1490
|
+
noiseOk: 20,
|
|
1491
|
+
noiseWarn: 40,
|
|
1492
|
+
silentOk: 30,
|
|
1493
|
+
};
|
|
1494
|
+
/** Шум: null → NO_DATA; <noiseOk → OK; <=noiseWarn → WARN; иначе BAD. */
|
|
1495
|
+
export function classifyNoise(share, t) {
|
|
1496
|
+
if (share === null)
|
|
1497
|
+
return 'NO_DATA';
|
|
1498
|
+
if (share < t.noiseOk)
|
|
1499
|
+
return 'OK';
|
|
1500
|
+
return share <= t.noiseWarn ? 'WARN' : 'BAD';
|
|
1501
|
+
}
|
|
1502
|
+
/** Молчащие правила: null → NO_DATA; <silentOk → OK; иначе BAD. */
|
|
1503
|
+
export function classifySilent(share, t) {
|
|
1504
|
+
if (share === null)
|
|
1505
|
+
return 'NO_DATA';
|
|
1506
|
+
return share < t.silentOk ? 'OK' : 'BAD';
|
|
1507
|
+
}
|
|
1508
|
+
/** Override из config поверх дефолтов (E1.2); битые/чужие поля отбрасываются схемой. */
|
|
1509
|
+
export function resolveThresholds(override) {
|
|
1510
|
+
return { ...DEFAULT_EFFECTIVENESS_THRESHOLDS, ...override };
|
|
1511
|
+
}
|
|
1512
|
+
/** M3: агрегация run-сигналов в блок абсолютов; пустые данные → нули/null, не выдумываем. */
|
|
1513
|
+
function buildTotals(signals, pricing) {
|
|
1514
|
+
const runs = signals.filter((s) => s.event === 'run');
|
|
1515
|
+
const processFailures = runs.filter((s) => s.outcome !== 'ok').length;
|
|
1516
|
+
const sumWeighted = runs.reduce((sum, s) => sum + (s.weighted ?? 0), 0);
|
|
1517
|
+
let sumTokens = null;
|
|
1518
|
+
const durations = [];
|
|
1519
|
+
let costUsd = null;
|
|
1520
|
+
const byModelMap = new Map();
|
|
1521
|
+
for (const s of runs) {
|
|
1522
|
+
if (typeof s.duration_ms === 'number' && Number.isFinite(s.duration_ms))
|
|
1523
|
+
durations.push(s.duration_ms);
|
|
1524
|
+
if (s.tokens !== undefined && s.tokens !== null) {
|
|
1525
|
+
if (sumTokens === null)
|
|
1526
|
+
sumTokens = { input: 0, output: 0, cache_read: 0 };
|
|
1527
|
+
sumTokens.input += s.tokens.input;
|
|
1528
|
+
sumTokens.output += s.tokens.output;
|
|
1529
|
+
sumTokens.cache_read += s.tokens.cache_read;
|
|
1530
|
+
}
|
|
1531
|
+
const c = runCostUsd(s.tokens, pricing, s.gen_ai.modelID);
|
|
1532
|
+
if (c !== null)
|
|
1533
|
+
costUsd = (costUsd ?? 0) + c;
|
|
1534
|
+
const model = s.gen_ai.modelID ?? 'unknown';
|
|
1535
|
+
const row = byModelMap.get(model) ?? { runs: 0, processFailures: 0, sumWeighted: 0, durations: [], costUsd: null };
|
|
1536
|
+
row.runs += 1;
|
|
1537
|
+
if (s.outcome !== 'ok')
|
|
1538
|
+
row.processFailures += 1;
|
|
1539
|
+
row.sumWeighted += s.weighted ?? 0;
|
|
1540
|
+
if (typeof s.duration_ms === 'number' && Number.isFinite(s.duration_ms))
|
|
1541
|
+
row.durations.push(s.duration_ms);
|
|
1542
|
+
if (c !== null)
|
|
1543
|
+
row.costUsd = (row.costUsd ?? 0) + c;
|
|
1544
|
+
byModelMap.set(model, row);
|
|
1545
|
+
}
|
|
1546
|
+
const avg = (xs) => (xs.length === 0 ? null : xs.reduce((a, b) => a + b, 0) / xs.length);
|
|
1547
|
+
const denom = sumTokens === null ? 0 : sumTokens.input + sumTokens.cache_read;
|
|
1548
|
+
const byModel = [...byModelMap.entries()]
|
|
1549
|
+
.map(([model, row]) => {
|
|
1550
|
+
const completedRuns = row.runs - row.processFailures;
|
|
1551
|
+
return {
|
|
1552
|
+
model,
|
|
1553
|
+
runs: row.runs,
|
|
1554
|
+
processFailures: row.processFailures,
|
|
1555
|
+
sumWeighted: row.sumWeighted,
|
|
1556
|
+
avgDurationMs: avg(row.durations),
|
|
1557
|
+
costUsd: row.costUsd,
|
|
1558
|
+
costPerCompletedRun: row.costUsd === null || completedRuns === 0 ? null : row.costUsd / completedRuns,
|
|
1559
|
+
};
|
|
1560
|
+
})
|
|
1561
|
+
.sort((a, b) => b.runs - a.runs || a.model.localeCompare(b.model));
|
|
1562
|
+
return {
|
|
1563
|
+
runs: runs.length,
|
|
1564
|
+
processFailures,
|
|
1565
|
+
sumWeighted,
|
|
1566
|
+
sumTokens,
|
|
1567
|
+
cacheHitRatio: sumTokens === null || denom === 0 ? null : (sumTokens.cache_read / denom) * 100,
|
|
1568
|
+
avgDurationMs: avg(durations),
|
|
1569
|
+
costUsd,
|
|
1570
|
+
byModel,
|
|
1571
|
+
};
|
|
1572
|
+
}
|
|
1573
|
+
/**
|
|
1574
|
+
* Пять блоков отчёта из одних портов: чистая агрегация, детерминированная.
|
|
1575
|
+
* Не падает на пустой памяти — все блоки возвращают нули/null.
|
|
1576
|
+
*/
|
|
1577
|
+
export async function buildEffectivenessReport(deps, input) {
|
|
1578
|
+
// Блок 1 «Правила»: активные + суммы holdout-полей Ф22 по rule/lesson (все статусы)
|
|
1579
|
+
const activeRuleObjects = await deps.store.list({ type: 'rule', status: 'active' });
|
|
1580
|
+
const activeRules = activeRuleObjects.length;
|
|
1581
|
+
let prevented = 0;
|
|
1582
|
+
let checked = 0;
|
|
1583
|
+
let hasHoldoutData = false;
|
|
1584
|
+
for (const type of ['rule', 'lesson']) {
|
|
1585
|
+
for (const o of await deps.store.list({ type })) {
|
|
1586
|
+
const rec = o;
|
|
1587
|
+
const p = finiteNumber(rec.holdout_prevented);
|
|
1588
|
+
const c = finiteNumber(rec.holdout_checked);
|
|
1589
|
+
if (p !== null || c !== null)
|
|
1590
|
+
hasHoldoutData = true;
|
|
1591
|
+
prevented += p ?? 0;
|
|
1592
|
+
checked += c ?? 0;
|
|
1593
|
+
}
|
|
1594
|
+
}
|
|
1595
|
+
// Блок 2 «Инструменты»: реестр + экономика (переиспользуем toolStats —
|
|
1596
|
+
// P1 D4: сигнальный источник + legacy run-log, insufficient от analyzeEconomy)
|
|
1597
|
+
const { tools: toolRows, economy } = await toolStats({ store: deps.store }, { signals: input.signals, runLogText: input.runLogText });
|
|
1598
|
+
// Блок 3 «Доставка→срабатывание»: сигнальный лог + окно молчания из learn-decay
|
|
1599
|
+
const deliveries = input.signals.filter((s) => s.event === 'delivery');
|
|
1600
|
+
const triggered = new Set();
|
|
1601
|
+
for (const ev of deliveries) {
|
|
1602
|
+
if (typeof ev.detail?.name === 'string')
|
|
1603
|
+
triggered.add(ev.detail.name);
|
|
1604
|
+
}
|
|
1605
|
+
const silent = silentRuleIds(input.signals);
|
|
1606
|
+
// то же пре-условие, что внутри silentRuleIds (ранний выход при малом пробеге):
|
|
1607
|
+
// count=0 в этом случае — «не знаем», а не «нет молчащих»
|
|
1608
|
+
const sessions = countSessions(input.signals).length;
|
|
1609
|
+
const enoughDeliveryData = deliveries.length >= SILENT_RULE_MIN_DELIVERIES && sessions > SILENT_RULE_WINDOW_SESSIONS;
|
|
1610
|
+
// silentRuleIds возвращает ВСЕ молчащие delivery-имена (любой тип — call-injection,
|
|
1611
|
+
// lesson и т.д.); делим только на правила и считаем только правила (прецедент:
|
|
1612
|
+
// runDecayPass фильтрует по active rules) — иначе доля могла бы превысить 100%
|
|
1613
|
+
const activeRuleIds = new Set(activeRuleObjects.map((o) => o.id));
|
|
1614
|
+
const silentRules = [...silent.ids].filter((id) => activeRuleIds.has(id)).length;
|
|
1615
|
+
const silentShare = enoughDeliveryData && activeRules > 0 ? (silentRules / activeRules) * 100 : null;
|
|
1616
|
+
// Блок 4 «Шум памяти»: нет связей И нет событий кроме memory.added (event-log).
|
|
1617
|
+
// document-ref — функциональный «индекс документов» (использование = регистрация/
|
|
1618
|
+
// обновление сканом), из метрики шума исключён и из числителя, и из знаменателя
|
|
1619
|
+
// (калибровка 2026-08-30); показывается отдельной строкой documents.
|
|
1620
|
+
// archived — вне метрики и из числителя, и из знаменателя: архивация —
|
|
1621
|
+
// легитимный способ снижения шума (иначе transition, помечающий объект
|
|
1622
|
+
// «использованным», почти не улучшал метрику); показывается строкой archived.
|
|
1623
|
+
// memory.scan.updated = подтверждение актуальности = использование: readIds-фильтр
|
|
1624
|
+
// («любое событие кроме memory.added») засчитывает scan-события автоматически.
|
|
1625
|
+
const allObjects = await deps.store.list();
|
|
1626
|
+
const documents = allObjects.filter((o) => o.type === 'document-ref').length;
|
|
1627
|
+
const archived = allObjects.filter((o) => o.status === 'archived').length;
|
|
1628
|
+
const noiseBase = allObjects.filter((o) => o.type !== 'document-ref' && o.status !== 'archived');
|
|
1629
|
+
const linked = new Set();
|
|
1630
|
+
for (const r of await deps.relations.list()) {
|
|
1631
|
+
linked.add(r.subject);
|
|
1632
|
+
linked.add(r.object);
|
|
1633
|
+
}
|
|
1634
|
+
const readIds = new Set();
|
|
1635
|
+
for (const ev of await deps.log.readAll()) {
|
|
1636
|
+
if (ev.type === 'memory.added')
|
|
1637
|
+
continue;
|
|
1638
|
+
const mid = ev.payload?.memory_id;
|
|
1639
|
+
if (typeof mid === 'string')
|
|
1640
|
+
readIds.add(mid);
|
|
1641
|
+
}
|
|
1642
|
+
const writeOnly = noiseBase.filter((o) => !linked.has(o.id) && !readIds.has(o.id)).length;
|
|
1643
|
+
const noiseShare = noiseBase.length > 0 ? (writeOnly / noiseBase.length) * 100 : null;
|
|
1644
|
+
// Блок 5 «Роутинг»: группировка run-метрик (P1 D4: сигнальный источник + legacy
|
|
1645
|
+
// run-log) по model, медиана weighted (медианы переиспользуем)
|
|
1646
|
+
const weightedByModel = new Map();
|
|
1647
|
+
for (const entry of mergeRunEntries(input.signals, input.runLogText)) {
|
|
1648
|
+
const w = finiteNumber(entry.weighted);
|
|
1649
|
+
if (w === null)
|
|
1650
|
+
continue;
|
|
1651
|
+
const model = typeof entry.model === 'string' && entry.model !== '' ? entry.model : 'unknown';
|
|
1652
|
+
const arr = weightedByModel.get(model) ?? [];
|
|
1653
|
+
arr.push(w);
|
|
1654
|
+
weightedByModel.set(model, arr);
|
|
1655
|
+
}
|
|
1656
|
+
const routing = [...weightedByModel.entries()]
|
|
1657
|
+
.map(([model, values]) => ({ model, tasks: values.length, medianWeighted: median(values) }))
|
|
1658
|
+
.sort((a, b) => b.tasks - a.tasks || a.model.localeCompare(b.model));
|
|
1659
|
+
const noise = { totalObjects: noiseBase.length, writeOnly, share: noiseShare, documents, archived };
|
|
1660
|
+
return {
|
|
1661
|
+
rules: { activeRules, prevented: hasHoldoutData ? prevented : null, checked: hasHoldoutData ? checked : null },
|
|
1662
|
+
tools: { toolCount: toolRows.length, totalUsage: toolRows.reduce((sum, r) => sum + r.usage_count, 0), economy },
|
|
1663
|
+
delivery: {
|
|
1664
|
+
deliveryEvents: deliveries.length,
|
|
1665
|
+
triggeredObjects: triggered.size,
|
|
1666
|
+
activeRules,
|
|
1667
|
+
silentRules,
|
|
1668
|
+
enoughDeliveryData,
|
|
1669
|
+
silentShare,
|
|
1670
|
+
},
|
|
1671
|
+
noise,
|
|
1672
|
+
noiseStatus: classifyNoise(noiseShare, input.thresholds),
|
|
1673
|
+
silentStatus: classifySilent(silentShare, input.thresholds),
|
|
1674
|
+
routing,
|
|
1675
|
+
totals: buildTotals(input.signals, input.pricing),
|
|
1676
|
+
};
|
|
1677
|
+
}
|
|
1291
1678
|
/** Срез отчёта по view-фильтру (§6.2); top ограничивает строки, дефолт 20. */
|
|
1292
1679
|
export function filterAnalytics(report, filter) {
|
|
1293
1680
|
const top = filter.top ?? 20;
|
|
@@ -1340,6 +1727,12 @@ export function filterAnalytics(report, filter) {
|
|
|
1340
1727
|
return { view: 'coordination', coordination: report.coordination };
|
|
1341
1728
|
case 'campaign':
|
|
1342
1729
|
return { view: 'campaign', campaign: report.campaign };
|
|
1730
|
+
case 'delivery':
|
|
1731
|
+
// P110: top-срез из фильтра, остальные блоки целиком (JSON-сериализуемые)
|
|
1732
|
+
return {
|
|
1733
|
+
view: 'delivery',
|
|
1734
|
+
delivery: { ...report.delivery, topDelivered: report.delivery.topDelivered.slice(0, top) },
|
|
1735
|
+
};
|
|
1343
1736
|
case 'acceptance':
|
|
1344
1737
|
// report.acceptance = AcceptanceStats & AcceptanceView — JSON несёт и D4-поля
|
|
1345
1738
|
return { view: 'acceptance', acceptance: report.acceptance };
|