@aiwg/cli 0.0.0-bootstrap.0 → 2026.7.18
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/LICENSE +21 -0
- package/README.md +22 -1
- package/bin/aiwg.mjs +349 -0
- package/dist/src/a2a/agent-card.js +145 -0
- package/dist/src/a2a/client.js +411 -0
- package/dist/src/a2a/hitl-cli.js +171 -0
- package/dist/src/a2a/hitl-driver.js +370 -0
- package/dist/src/a2a/hitl.js +181 -0
- package/dist/src/a2a/http.js +193 -0
- package/dist/src/a2a/jcs.js +128 -0
- package/dist/src/a2a/jws.js +187 -0
- package/dist/src/a2a/types.js +24 -0
- package/dist/src/a2a/webhook.js +240 -0
- package/dist/src/activity-log/cli.js +348 -0
- package/dist/src/activity-log/parser.js +81 -0
- package/dist/src/activity-log/types.js +50 -0
- package/dist/src/agents/agent-deployer.js +367 -0
- package/dist/src/agents/agent-packager.js +271 -0
- package/dist/src/agents/agent-validator.js +271 -0
- package/dist/src/agents/grounding/knowledge-base.js +161 -0
- package/dist/src/agents/grounding/types.js +12 -0
- package/dist/src/agents/index.js +10 -0
- package/dist/src/agents/packaged-agent-inventory.js +75 -0
- package/dist/src/agents/types.js +7 -0
- package/dist/src/api/index.d.ts +10 -0
- package/dist/src/api/index.js +10 -0
- package/dist/src/artifacts/address-parser.js +73 -0
- package/dist/src/artifacts/audit/cli.js +183 -0
- package/dist/src/artifacts/audit/drift.js +122 -0
- package/dist/src/artifacts/audit/types.js +12 -0
- package/dist/src/artifacts/backends/graphology-backend.js +160 -0
- package/dist/src/artifacts/backends/json-backend.js +129 -0
- package/dist/src/artifacts/backends/sqlite-backend.js +199 -0
- package/dist/src/artifacts/browser-export.js +622 -0
- package/dist/src/artifacts/capability-resolver.js +94 -0
- package/dist/src/artifacts/checksum-manifest.js +91 -0
- package/dist/src/artifacts/citation-parser.js +162 -0
- package/dist/src/artifacts/cli.js +1486 -0
- package/dist/src/artifacts/corpus-tools/citation-densify.js +311 -0
- package/dist/src/artifacts/corpus-tools/cli.js +393 -0
- package/dist/src/artifacts/corpus-tools/corpus-graph.js +225 -0
- package/dist/src/artifacts/corpus-tools/curator.js +186 -0
- package/dist/src/artifacts/corpus-tools/discovery-log.js +70 -0
- package/dist/src/artifacts/corpus-tools/funder-network.js +141 -0
- package/dist/src/artifacts/corpus-tools/induction-audit.js +233 -0
- package/dist/src/artifacts/corpus-tools/integrity-scan.js +202 -0
- package/dist/src/artifacts/corpus-tools/profile-communities.js +166 -0
- package/dist/src/artifacts/corpus-tools/profile-edges.js +72 -0
- package/dist/src/artifacts/corpus-tools/profile-embed.js +113 -0
- package/dist/src/artifacts/corpus-tools/profile-generate-fm.js +167 -0
- package/dist/src/artifacts/corpus-tools/profile-generate.js +181 -0
- package/dist/src/artifacts/corpus-tools/profile-metrics.js +98 -0
- package/dist/src/artifacts/corpus-tools/profile-status.js +86 -0
- package/dist/src/artifacts/corpus-tools/profile-temporal.js +139 -0
- package/dist/src/artifacts/corpus-tools/radar-init.js +93 -0
- package/dist/src/artifacts/corpus-tools/radar-report.js +118 -0
- package/dist/src/artifacts/corpus-tools/radar-shared.js +189 -0
- package/dist/src/artifacts/corpus-tools/radar-status.js +68 -0
- package/dist/src/artifacts/corpus-tools/sidecar-lint.js +233 -0
- package/dist/src/artifacts/corpus-tools/sidecar-repair.js +277 -0
- package/dist/src/artifacts/corpus-tools/snapshot.js +591 -0
- package/dist/src/artifacts/corpus-tools/source-types.js +164 -0
- package/dist/src/artifacts/corpus-tools/vision-extract.js +243 -0
- package/dist/src/artifacts/corpus-views/build.js +126 -0
- package/dist/src/artifacts/corpus-views/corpus-config.js +124 -0
- package/dist/src/artifacts/corpus-views/ref-parser.js +437 -0
- package/dist/src/artifacts/corpus-views/renderers.js +353 -0
- package/dist/src/artifacts/corpus-views/taxonomies.js +131 -0
- package/dist/src/artifacts/dep-graph.js +173 -0
- package/dist/src/artifacts/discover-facets.js +375 -0
- package/dist/src/artifacts/embedding-index.js +354 -0
- package/dist/src/artifacts/enrichment/cli.js +240 -0
- package/dist/src/artifacts/enrichment/prompt.js +47 -0
- package/dist/src/artifacts/enrichment/store.js +90 -0
- package/dist/src/artifacts/enrichment/types.js +12 -0
- package/dist/src/artifacts/fortemi-core-query-adapter.js +475 -0
- package/dist/src/artifacts/fortemi-core-sync.js +251 -0
- package/dist/src/artifacts/fortemi-shard-export.js +44 -0
- package/dist/src/artifacts/fulltext.js +108 -0
- package/dist/src/artifacts/graph-backend.js +51 -0
- package/dist/src/artifacts/graph-query.js +247 -0
- package/dist/src/artifacts/hybrid-query.js +225 -0
- package/dist/src/artifacts/index-builder.js +1089 -0
- package/dist/src/artifacts/index-reader.js +112 -0
- package/dist/src/artifacts/index-status.js +193 -0
- package/dist/src/artifacts/legacy-index-migration.js +169 -0
- package/dist/src/artifacts/move.js +154 -0
- package/dist/src/artifacts/operational-state.js +239 -0
- package/dist/src/artifacts/prebuilt-build-lock.js +49 -0
- package/dist/src/artifacts/query-engine.js +1955 -0
- package/dist/src/artifacts/source-graph.js +529 -0
- package/dist/src/artifacts/stats.js +169 -0
- package/dist/src/artifacts/types.js +606 -0
- package/dist/src/artifacts/views/cli.js +293 -0
- package/dist/src/artifacts/views/definition.js +170 -0
- package/dist/src/artifacts/views/store.js +149 -0
- package/dist/src/artifacts/views/types.js +8 -0
- package/dist/src/artifacts/watcher.js +255 -0
- package/dist/src/catalog/builtin-models.json +636 -0
- package/dist/src/catalog/cli.js +228 -0
- package/dist/src/catalog/cli.mjs +289 -0
- package/dist/src/catalog/index.js +15 -0
- package/dist/src/catalog/loader.js +217 -0
- package/dist/src/catalog/loader.mjs +251 -0
- package/dist/src/catalog/sources.json +41 -0
- package/dist/src/catalog/types.js +8 -0
- package/dist/src/channel/manager.mjs +504 -0
- package/dist/src/cli/agent-spawn.js +178 -0
- package/dist/src/cli/cli-extension-loader.js +245 -0
- package/dist/src/cli/command-log.js +275 -0
- package/dist/src/cli/config-loader.js +232 -0
- package/dist/src/cli/env.js +82 -0
- package/dist/src/cli/errors.js +150 -0
- package/dist/src/cli/find-package-root.js +40 -0
- package/dist/src/cli/git-hooks.js +250 -0
- package/dist/src/cli/handlers/agentcard.js +206 -0
- package/dist/src/cli/handlers/artifacts.js +76 -0
- package/dist/src/cli/handlers/best-practices-audit.js +280 -0
- package/dist/src/cli/handlers/cockpit.js +137 -0
- package/dist/src/cli/handlers/command-log.js +37 -0
- package/dist/src/cli/handlers/daemon.js +59 -0
- package/dist/src/cli/handlers/diagnose.js +300 -0
- package/dist/src/cli/handlers/execution-mode.js +105 -0
- package/dist/src/cli/handlers/feedback.js +341 -0
- package/dist/src/cli/handlers/help.js +147 -0
- package/dist/src/cli/handlers/index.js +302 -0
- package/dist/src/cli/handlers/init.js +179 -0
- package/dist/src/cli/handlers/install.js +129 -0
- package/dist/src/cli/handlers/issues.js +46 -0
- package/dist/src/cli/handlers/lint.js +42 -0
- package/dist/src/cli/handlers/local-executor.js +315 -0
- package/dist/src/cli/handlers/marketplace.js +168 -0
- package/dist/src/cli/handlers/mc.js +1010 -0
- package/dist/src/cli/handlers/models.js +352 -0
- package/dist/src/cli/handlers/packages.js +155 -0
- package/dist/src/cli/handlers/ralph-launcher.js +717 -0
- package/dist/src/cli/handlers/ralph.js +575 -0
- package/dist/src/cli/handlers/refresh.js +432 -0
- package/dist/src/cli/handlers/regenerate.js +336 -0
- package/dist/src/cli/handlers/repo-access.js +109 -0
- package/dist/src/cli/handlers/run.js +165 -0
- package/dist/src/cli/handlers/runtime-info.js +301 -0
- package/dist/src/cli/handlers/sandbox.js +197 -0
- package/dist/src/cli/handlers/scaffolding.js +149 -0
- package/dist/src/cli/handlers/script-runner.js +121 -0
- package/dist/src/cli/handlers/sdlc-accelerate.js +148 -0
- package/dist/src/cli/handlers/serve.js +1835 -0
- package/dist/src/cli/handlers/session.js +348 -0
- package/dist/src/cli/handlers/setup.js +440 -0
- package/dist/src/cli/handlers/skill-lint.js +367 -0
- package/dist/src/cli/handlers/skill-usage.js +74 -0
- package/dist/src/cli/handlers/steward.js +567 -0
- package/dist/src/cli/handlers/subcommands.js +1702 -0
- package/dist/src/cli/handlers/team.js +337 -0
- package/dist/src/cli/handlers/types.js +11 -0
- package/dist/src/cli/handlers/use.js +2772 -0
- package/dist/src/cli/handlers/utilities.js +703 -0
- package/dist/src/cli/handlers/version.js +134 -0
- package/dist/src/cli/handlers/workspace-context.js +93 -0
- package/dist/src/cli/handlers/workspace.js +126 -0
- package/dist/src/cli/help-generator.js +178 -0
- package/dist/src/cli/hooks/builtin/activity-log-hook.js +126 -0
- package/dist/src/cli/hooks/executor.js +96 -0
- package/dist/src/cli/hooks/index.js +15 -0
- package/dist/src/cli/hooks/registry.js +143 -0
- package/dist/src/cli/hooks/types.js +13 -0
- package/dist/src/cli/log.js +492 -0
- package/dist/src/cli/project-isolation/detect.js +70 -0
- package/dist/src/cli/project-isolation/index.js +7 -0
- package/dist/src/cli/project-isolation/signals.js +17 -0
- package/dist/src/cli/project-isolation/warning.js +102 -0
- package/dist/src/cli/prompt-utils.js +155 -0
- package/dist/src/cli/provider-deployment-plan.js +126 -0
- package/dist/src/cli/provider-resolution.js +119 -0
- package/dist/src/cli/router.js +305 -0
- package/dist/src/cli/scope-resolver.js +392 -0
- package/dist/src/cli/skill-usage.js +616 -0
- package/dist/src/cli/ui.js +224 -0
- package/dist/src/cli/watch-service.js +203 -0
- package/dist/src/cli/workflow-orchestrator.js +478 -0
- package/dist/src/cli/workspace-signals.js +321 -0
- package/dist/src/community/footer.js +14 -0
- package/dist/src/community/links.js +123 -0
- package/dist/src/community/milestones.js +46 -0
- package/dist/src/community/nudge-policy.js +93 -0
- package/dist/src/config/aiwg-config.js +883 -0
- package/dist/src/config/cli.js +703 -0
- package/dist/src/config/gitignore.js +156 -0
- package/dist/src/config/project-artifacts.js +76 -0
- package/dist/src/config/user-config.js +428 -0
- package/dist/src/config/user-registry.js +127 -0
- package/dist/src/config/workspace.js +276 -0
- package/dist/src/contributors/detect.js +39 -0
- package/dist/src/contributors/discover.js +172 -0
- package/dist/src/contributors/heuristic.js +186 -0
- package/dist/src/contributors/index.js +11 -0
- package/dist/src/contributors/types.js +13 -0
- package/dist/src/contributors/validation.js +116 -0
- package/dist/src/data/community.schema.json +43 -0
- package/dist/src/data/community.yaml +16 -0
- package/dist/src/extensions/capability-index.js +270 -0
- package/dist/src/extensions/claude-hooks-installer.js +268 -0
- package/dist/src/extensions/commands/definitions.js +3485 -0
- package/dist/src/extensions/deployment-registration.js +463 -0
- package/dist/src/extensions/index.js +22 -0
- package/dist/src/extensions/loader.js +132 -0
- package/dist/src/extensions/managed-marker.js +100 -0
- package/dist/src/extensions/manifest.js +196 -0
- package/dist/src/extensions/project-local-activity.js +114 -0
- package/dist/src/extensions/project-local-discovery.js +261 -0
- package/dist/src/extensions/project-local-doctor.js +281 -0
- package/dist/src/extensions/project-local-gitignore.js +176 -0
- package/dist/src/extensions/project-local-paths.js +121 -0
- package/dist/src/extensions/project-local-promote.js +218 -0
- package/dist/src/extensions/project-local-remove.js +373 -0
- package/dist/src/extensions/project-local-scaffold.js +252 -0
- package/dist/src/extensions/project-quickref.js +291 -0
- package/dist/src/extensions/registry.js +368 -0
- package/dist/src/extensions/shadow-resolver.js +271 -0
- package/dist/src/extensions/types.js +86 -0
- package/dist/src/extensions/upstream-registry.js +195 -0
- package/dist/src/extensions/validation.js +631 -0
- package/dist/src/features/catalog.js +88 -0
- package/dist/src/features/cli.js +197 -0
- package/dist/src/features/installer.js +57 -0
- package/dist/src/features/paths.js +14 -0
- package/dist/src/features/runtime.js +21 -0
- package/dist/src/features/status.js +134 -0
- package/dist/src/hooks/laziness-detection.js +532 -0
- package/dist/src/intake/git-history-analyzer.js +486 -0
- package/dist/src/intake/index.js +9 -0
- package/dist/src/issues/cli.js +327 -0
- package/dist/src/issues/index.js +5 -0
- package/dist/src/issues/live.js +154 -0
- package/dist/src/issues/local.js +666 -0
- package/dist/src/issues/sync.js +143 -0
- package/dist/src/issues/types.js +2 -0
- package/dist/src/issues/workflows.js +164 -0
- package/dist/src/kb/cli.js +173 -0
- package/dist/src/lint/cli.js +171 -0
- package/dist/src/lint/loader.js +225 -0
- package/dist/src/lint/reporters.js +141 -0
- package/dist/src/lint/runner.js +364 -0
- package/dist/src/lint/types.js +10 -0
- package/dist/src/marketplace/cache.js +110 -0
- package/dist/src/marketplace/identifier.js +63 -0
- package/dist/src/marketplace/registry.js +36 -0
- package/dist/src/marketplace/sources/clawhub.js +53 -0
- package/dist/src/marketplace/sources/git.js +45 -0
- package/dist/src/marketplace/types.js +9 -0
- package/dist/src/mcp/adapters/codex-runtime.js +224 -0
- package/dist/src/mcp/cli.mjs +1197 -0
- package/dist/src/mcp/elicitation.mjs +149 -0
- package/dist/src/mcp/helpers.mjs +287 -0
- package/dist/src/mcp/index.mjs +11 -0
- package/dist/src/mcp/profiles.js +263 -0
- package/dist/src/mcp/profiles.mjs +360 -0
- package/dist/src/mcp/registry.js +376 -0
- package/dist/src/mcp/registry.mjs +387 -0
- package/dist/src/mcp/server.mjs +633 -0
- package/dist/src/mcp/test-simple.mjs +271 -0
- package/dist/src/mcp/tools/command-run.mjs +101 -0
- package/dist/src/mcp/tools/discovery.mjs +291 -0
- package/dist/src/mcp/tools/interaction.mjs +87 -0
- package/dist/src/mcp/tools/orchestration.mjs +320 -0
- package/dist/src/mcp/tools/subsystems.mjs +640 -0
- package/dist/src/memory/cli.js +166 -0
- package/dist/src/memory/project-registry.js +282 -0
- package/dist/src/metrics/artifact-metrics.js +184 -0
- package/dist/src/metrics/context-budget.js +174 -0
- package/dist/src/metrics/token-counter.js +133 -0
- package/dist/src/models/config-loader.js +228 -0
- package/dist/src/models/index.js +22 -0
- package/dist/src/models/model-capabilities.v1.json +120 -0
- package/dist/src/models/model-catalog.v1.json +96 -0
- package/dist/src/models/model-discovery.js +521 -0
- package/dist/src/models/provider-models.js +73 -0
- package/dist/src/models/provider-policy.js +273 -0
- package/dist/src/models/resolver.js +245 -0
- package/dist/src/models/router.js +70 -0
- package/dist/src/models/types.js +8 -0
- package/dist/src/models/wrapper-deployment.js +178 -0
- package/dist/src/models/wrapper-route.js +54 -0
- package/dist/src/ops/cli.js +268 -0
- package/dist/src/ops/registry.js +623 -0
- package/dist/src/packages/adapters/clawhub.js +113 -0
- package/dist/src/packages/adapters/git.js +153 -0
- package/dist/src/packages/adapters/gitea.js +93 -0
- package/dist/src/packages/adapters/github.js +69 -0
- package/dist/src/packages/adapters/local-cache.js +89 -0
- package/dist/src/packages/package-registry.js +143 -0
- package/dist/src/packages/registry.js +238 -0
- package/dist/src/packages/types.js +11 -0
- package/dist/src/plugin/cross-framework-ops.js +475 -0
- package/dist/src/plugin/framework-config-loader.js +235 -0
- package/dist/src/plugin/framework-detector.js +186 -0
- package/dist/src/plugin/framework-isolator.js +341 -0
- package/dist/src/plugin/framework-migration.js +371 -0
- package/dist/src/plugin/metadata-validator.js +906 -0
- package/dist/src/plugin/plugin-installer.js +436 -0
- package/dist/src/plugin/plugin-status.js +369 -0
- package/dist/src/plugin/plugin-uninstaller.js +473 -0
- package/dist/src/plugin/registry-validator.js +344 -0
- package/dist/src/plugin/skill-command-translator.js +415 -0
- package/dist/src/plugin/workspace-creator.js +189 -0
- package/dist/src/plugin/workspace-migrator.js +821 -0
- package/dist/src/policy/authorization.js +390 -0
- package/dist/src/policy/repo-access.js +215 -0
- package/dist/src/provenance/cli.js +16 -0
- package/dist/src/providers/capability-matrix.js +300 -0
- package/dist/src/providers/capability-matrix.yaml +514 -0
- package/dist/src/providers/provider-definitions.js +977 -0
- package/dist/src/providers/provider-definitions.mjs +159 -0
- package/dist/src/providers/provider-inventory.js +169 -0
- package/dist/src/quality/feedback-ab.js +174 -0
- package/dist/src/quality/feedback-collector.js +176 -0
- package/dist/src/quality/feedback-tracker.js +123 -0
- package/dist/src/quality/patterns/adr.json +24 -0
- package/dist/src/quality/patterns/sad.json +24 -0
- package/dist/src/quality/patterns/test-plan.json +24 -0
- package/dist/src/quality/patterns/use-case.json +24 -0
- package/dist/src/quality/scoring.js +157 -0
- package/dist/src/reflections/cli.js +15 -0
- package/dist/src/release/plan.js +139 -0
- package/dist/src/research/cache/manager.js +227 -0
- package/dist/src/research/clients/arxiv.js +156 -0
- package/dist/src/research/clients/base.js +197 -0
- package/dist/src/research/clients/crossref.js +112 -0
- package/dist/src/research/clients/semantic-scholar.js +126 -0
- package/dist/src/research/clients/unpaywall.js +87 -0
- package/dist/src/research/index.js +14 -0
- package/dist/src/research/query-cli.js +336 -0
- package/dist/src/research/services/acquisition.js +313 -0
- package/dist/src/research/services/archival.js +225 -0
- package/dist/src/research/services/citation.js +279 -0
- package/dist/src/research/services/discovery.js +243 -0
- package/dist/src/research/services/documentation.js +269 -0
- package/dist/src/research/services/index.js +14 -0
- package/dist/src/research/services/provenance.js +279 -0
- package/dist/src/research/services/quality.js +370 -0
- package/dist/src/research/services/types.js +7 -0
- package/dist/src/research/storage-cli.js +20 -0
- package/dist/src/research/types.js +47 -0
- package/dist/src/resources/index.d.ts +2 -0
- package/dist/src/resources/index.js +2 -0
- package/dist/src/resources/web-release.d.ts +89 -0
- package/dist/src/resources/web-release.js +886 -0
- package/dist/src/rlm/cache/cli.js +162 -0
- package/dist/src/rlm/cache/hash.js +35 -0
- package/dist/src/rlm/cache/store.js +170 -0
- package/dist/src/rlm/cache/types.js +8 -0
- package/dist/src/rlm/cli.js +650 -0
- package/dist/src/serve/a2a-terminal-observer.js +120 -0
- package/dist/src/serve/agent-router.js +205 -0
- package/dist/src/serve/dispatch-router.js +171 -0
- package/dist/src/serve/executor-registry.js +715 -0
- package/dist/src/serve/mission-conductor.js +177 -0
- package/dist/src/serve/orchestrator-adapter.js +113 -0
- package/dist/src/serve/orchestrator-override.js +94 -0
- package/dist/src/serve/orchestrator-pty.js +133 -0
- package/dist/src/serve/pty-bridge.js +799 -0
- package/dist/src/serve/sandbox-registry.js +832 -0
- package/dist/src/serve/screen-reader.js +228 -0
- package/dist/src/serve/stack-adapters.js +68 -0
- package/dist/src/serve/telemetry.js +143 -0
- package/dist/src/skills/adapters/clawhub.js +250 -0
- package/dist/src/skills/adapters/local.js +335 -0
- package/dist/src/skills/adapters/openclaw.js +316 -0
- package/dist/src/skills/cli.js +334 -0
- package/dist/src/skills/registry.js +117 -0
- package/dist/src/skills/run.js +259 -0
- package/dist/src/skills/runtime.js +94 -0
- package/dist/src/skills/types.js +10 -0
- package/dist/src/smiths/agentsmith/demo.js +116 -0
- package/dist/src/smiths/agentsmith/examples.js +300 -0
- package/dist/src/smiths/agentsmith/generator.js +503 -0
- package/dist/src/smiths/agentsmith/index.js +11 -0
- package/dist/src/smiths/agentsmith/types.js +8 -0
- package/dist/src/smiths/commandsmith/example.js +220 -0
- package/dist/src/smiths/commandsmith/generator.js +288 -0
- package/dist/src/smiths/commandsmith/index.js +41 -0
- package/dist/src/smiths/commandsmith/templates.js +296 -0
- package/dist/src/smiths/commandsmith/types.js +7 -0
- package/dist/src/smiths/context-pipeline/aiwg-md.js +104 -0
- package/dist/src/smiths/context-pipeline/allowlist.js +195 -0
- package/dist/src/smiths/context-pipeline/claude-hook.js +127 -0
- package/dist/src/smiths/context-pipeline/discovery.js +187 -0
- package/dist/src/smiths/context-pipeline/external-links-section.js +49 -0
- package/dist/src/smiths/context-pipeline/finalization.js +147 -0
- package/dist/src/smiths/context-pipeline/generator.js +477 -0
- package/dist/src/smiths/context-pipeline/index.js +30 -0
- package/dist/src/smiths/context-pipeline/legacy-inject.js +103 -0
- package/dist/src/smiths/context-pipeline/managed-hook.js +95 -0
- package/dist/src/smiths/context-pipeline/overflow.js +212 -0
- package/dist/src/smiths/context-pipeline/parallelism-section.js +94 -0
- package/dist/src/smiths/context-pipeline/provider-policy.js +64 -0
- package/dist/src/smiths/context-pipeline/sanitizer.js +93 -0
- package/dist/src/smiths/context-pipeline/types.js +23 -0
- package/dist/src/smiths/context-pipeline/workspace-context.js +988 -0
- package/dist/src/smiths/hook-bridge/codex-translator.js +129 -0
- package/dist/src/smiths/hook-bridge/copilot-translator.js +64 -0
- package/dist/src/smiths/hook-bridge/factory-translator.js +43 -0
- package/dist/src/smiths/hook-bridge/hermes-translator.js +88 -0
- package/dist/src/smiths/hook-bridge/index.js +79 -0
- package/dist/src/smiths/hook-bridge/loader.js +116 -0
- package/dist/src/smiths/hook-bridge/shim.js +89 -0
- package/dist/src/smiths/hook-bridge/types.js +31 -0
- package/dist/src/smiths/index.js +39 -0
- package/dist/src/smiths/mcpsmith/analyzers/cli-analyzer.js +390 -0
- package/dist/src/smiths/mcpsmith/example.js +119 -0
- package/dist/src/smiths/mcpsmith/generator.js +236 -0
- package/dist/src/smiths/mcpsmith/index.js +17 -0
- package/dist/src/smiths/mcpsmith/types.js +10 -0
- package/dist/src/smiths/platform-paths.js +101 -0
- package/dist/src/smiths/skillsmith/codex-sidecar.js +85 -0
- package/dist/src/smiths/skillsmith/collision-detector.js +249 -0
- package/dist/src/smiths/skillsmith/demo.js +83 -0
- package/dist/src/smiths/skillsmith/examples.js +161 -0
- package/dist/src/smiths/skillsmith/generator.js +316 -0
- package/dist/src/smiths/skillsmith/index.js +12 -0
- package/dist/src/smiths/skillsmith/namespace-adapter.js +180 -0
- package/dist/src/smiths/skillsmith/platform-resolver.js +157 -0
- package/dist/src/smiths/skillsmith/types.js +9 -0
- package/dist/src/smiths/toolsmith/index.js +10 -0
- package/dist/src/smiths/toolsmith/runtime-discovery.mjs +710 -0
- package/dist/src/smiths/toolsmith/types.js +8 -0
- package/dist/src/storage/backends/fortemi.js +227 -0
- package/dist/src/storage/backends/fs.js +134 -0
- package/dist/src/storage/backends/logseq.js +309 -0
- package/dist/src/storage/backends/obsidian.js +233 -0
- package/dist/src/storage/cli.js +468 -0
- package/dist/src/storage/config.js +272 -0
- package/dist/src/storage/index.js +108 -0
- package/dist/src/storage/subsystem-cli.js +201 -0
- package/dist/src/storage/types.js +33 -0
- package/dist/src/testing/corpus/corpus-builder.js +383 -0
- package/dist/src/testing/corpus/ground-truth-manager.js +460 -0
- package/dist/src/testing/corpus/index.js +10 -0
- package/dist/src/testing/fixtures/index.js +9 -0
- package/dist/src/testing/fixtures/test-data-factory.js +472 -0
- package/dist/src/testing/generators/index.js +11 -0
- package/dist/src/testing/generators/test-case-generator.js +393 -0
- package/dist/src/testing/generators/test-code-generator.js +384 -0
- package/dist/src/testing/generators/use-case-parser.js +325 -0
- package/dist/src/testing/index.js +11 -0
- package/dist/src/tracker/capability-protocol.js +118 -0
- package/dist/src/update/checker.mjs +396 -0
- package/dist/src/update/notifier.mjs +235 -0
- package/dist/src/writing/content-diversifier.js +804 -0
- package/dist/src/writing/example-generator.js +959 -0
- package/dist/src/writing/example-templates.js +99 -0
- package/dist/src/writing/pattern-library.js +486 -0
- package/dist/src/writing/patterns/banned-phrases.json +4413 -0
- package/dist/src/writing/patterns/formulaic-structures.json +1300 -0
- package/dist/src/writing/patterns/generic-adjectives.json +1510 -0
- package/dist/src/writing/patterns/hedging-language.json +2096 -0
- package/dist/src/writing/patterns/transition-words.json +1285 -0
- package/dist/src/writing/patterns/weak-verbs.json +1112 -0
- package/dist/src/writing/prompt-optimizer.js +660 -0
- package/dist/src/writing/prompt-templates.js +583 -0
- package/dist/src/writing/scoring-config-loader.js +168 -0
- package/dist/src/writing/validation-engine.js +595 -0
- package/dist/src/writing/validation-rules.js +380 -0
- package/dist/src/writing/voice-analyzer.js +439 -0
- package/dist/src/writing/voice-calibration.js +661 -0
- package/dist/src/writing/voice-profiles.json +588 -0
- package/package.json +65 -9
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mission Conductor (#1546).
|
|
3
|
+
*
|
|
4
|
+
* A Mission is the cross-stack dynamic-orchestration primitive (naming per
|
|
5
|
+
* #1536): one durable, audited conductor fans worker cycles out across
|
|
6
|
+
* *heterogeneous* agentic stacks (Claude ↔ Codex ↔ …) and aggregates results.
|
|
7
|
+
* In-stack primitives (Claude's Workflow tool, Codex `/goal`) are the in-stack
|
|
8
|
+
* WORKERS a Mission dispatches to — not substitutes for the conductor.
|
|
9
|
+
*
|
|
10
|
+
* This builds on the proven substrate (no new transport):
|
|
11
|
+
* - `routeMission()` (agent-router.ts) selects an executor by `ExecutorFilter`.
|
|
12
|
+
* - executors advertise their stack via the `runtime:<name>` capability
|
|
13
|
+
* (slice-1 convention; see agent-router cross-stack test).
|
|
14
|
+
* - StackAdapter (stack-adapters.ts) maps a worker cycle onto a stack's
|
|
15
|
+
* native primitive and supplies the `runtime:<name>` token to filter on.
|
|
16
|
+
*
|
|
17
|
+
* RETAINED-OWNERSHIP INVARIANT (non-negotiable, #1537 ADR, cross-stack):
|
|
18
|
+
* the conductor owns the bookkeeping — activity log, best-output selection,
|
|
19
|
+
* cost tracking, crash-resilient checkpoint/resume — IDENTICALLY regardless of
|
|
20
|
+
* which stack each worker ran on. The native primitive drives worker mechanism
|
|
21
|
+
* only; it never owns gates, durability, or provenance.
|
|
22
|
+
*
|
|
23
|
+
* @implements #1546
|
|
24
|
+
*/
|
|
25
|
+
import { routeMission } from './agent-router.js';
|
|
26
|
+
import { StackAdapterRegistry } from './stack-adapters.js';
|
|
27
|
+
const defaultRunWorker = () => ({ output: undefined, cost: 0 });
|
|
28
|
+
const defaultScore = (r) => (r.output ? r.output.length : 0);
|
|
29
|
+
/**
|
|
30
|
+
* The cross-stack Mission conductor. Decomposes a Mission into worker cycles,
|
|
31
|
+
* dispatches each to an executor of the chosen runtime via `routeMission`, and
|
|
32
|
+
* retains all bookkeeping conductor-side regardless of stack.
|
|
33
|
+
*/
|
|
34
|
+
export class MissionConductor {
|
|
35
|
+
adapters;
|
|
36
|
+
runWorker;
|
|
37
|
+
scoreOutput;
|
|
38
|
+
constructor(opts = {}) {
|
|
39
|
+
this.adapters = opts.adapters ?? new StackAdapterRegistry();
|
|
40
|
+
this.runWorker = opts.runWorker ?? defaultRunWorker;
|
|
41
|
+
this.scoreOutput = opts.scoreOutput ?? defaultScore;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Conduct a Mission across the given executor pool. Returns the ledger.
|
|
45
|
+
* `resumeFrom` (if given) skips cycles already marked completed — the
|
|
46
|
+
* crash-resilient resume path; their prior results are carried forward.
|
|
47
|
+
*/
|
|
48
|
+
async conduct(plan, pool, resumeFrom) {
|
|
49
|
+
const carried = new Map();
|
|
50
|
+
if (resumeFrom) {
|
|
51
|
+
for (const c of resumeFrom.cycles) {
|
|
52
|
+
if (resumeFrom.checkpoint.completed.includes(c.cycleId))
|
|
53
|
+
carried.set(c.cycleId, c);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
const ledger = {
|
|
57
|
+
missionId: plan.missionId,
|
|
58
|
+
goal: plan.goal,
|
|
59
|
+
completionCriterion: plan.completionCriterion,
|
|
60
|
+
activityLog: [],
|
|
61
|
+
cycles: [],
|
|
62
|
+
totalCost: 0,
|
|
63
|
+
checkpoint: { completed: [], pending: [], failed: [] },
|
|
64
|
+
runtimesUsed: [],
|
|
65
|
+
};
|
|
66
|
+
ledger.activityLog.push(`mission ${plan.missionId} start — goal: ${plan.goal} — ${plan.cycles.length} cycle(s)` +
|
|
67
|
+
(resumeFrom ? ` (resume: ${carried.size} carried)` : ''));
|
|
68
|
+
for (const cycle of plan.cycles) {
|
|
69
|
+
// Resume: carry a previously-completed cycle forward, identical bookkeeping.
|
|
70
|
+
const prior = carried.get(cycle.id);
|
|
71
|
+
if (prior) {
|
|
72
|
+
ledger.cycles.push(prior);
|
|
73
|
+
ledger.checkpoint.completed.push(cycle.id);
|
|
74
|
+
ledger.totalCost += prior.cost;
|
|
75
|
+
if (prior.executorId)
|
|
76
|
+
ledger.activityLog.push(`cycle ${cycle.id} resumed (was complete on ${prior.runtime})`);
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
const adapter = this.adapters.get(cycle.runtime);
|
|
80
|
+
if (!adapter) {
|
|
81
|
+
// No silent drop — record the unroutable cycle (vague-discretion / anti-laziness).
|
|
82
|
+
const result = {
|
|
83
|
+
cycleId: cycle.id,
|
|
84
|
+
runtime: cycle.runtime,
|
|
85
|
+
primitive: '(none)',
|
|
86
|
+
routed: false,
|
|
87
|
+
reason: `no stack adapter registered for runtime '${cycle.runtime}'`,
|
|
88
|
+
cost: 0,
|
|
89
|
+
};
|
|
90
|
+
ledger.cycles.push(result);
|
|
91
|
+
ledger.checkpoint.failed.push(cycle.id);
|
|
92
|
+
ledger.activityLog.push(`cycle ${cycle.id} UNROUTABLE — ${result.reason}`);
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
const filter = {
|
|
96
|
+
capabilities: [adapter.runtimeCapability, ...(cycle.requiredCapabilities ?? [])],
|
|
97
|
+
};
|
|
98
|
+
const routing = routeMission(pool, filter, cycle.longRunning ?? false);
|
|
99
|
+
if (!routing.selected) {
|
|
100
|
+
const result = {
|
|
101
|
+
cycleId: cycle.id,
|
|
102
|
+
runtime: cycle.runtime,
|
|
103
|
+
primitive: adapter.primitive,
|
|
104
|
+
routed: false,
|
|
105
|
+
reason: `no connected executor advertises ${filter.capabilities.join(', ')}`,
|
|
106
|
+
cost: 0,
|
|
107
|
+
};
|
|
108
|
+
ledger.cycles.push(result);
|
|
109
|
+
ledger.checkpoint.failed.push(cycle.id);
|
|
110
|
+
ledger.activityLog.push(`cycle ${cycle.id} UNASSIGNED — ${result.reason}`);
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
const executor = routing.selected.executor;
|
|
114
|
+
const invocation = adapter.invoke(cycle.prompt);
|
|
115
|
+
ledger.activityLog.push(`cycle ${cycle.id} → executor ${executor.name} (${executor.executorId}) on ${cycle.runtime}: ${invocation.describe}`);
|
|
116
|
+
let output;
|
|
117
|
+
let cost = 0;
|
|
118
|
+
try {
|
|
119
|
+
const ran = await this.runWorker(cycle, executor, invocation);
|
|
120
|
+
output = ran.output;
|
|
121
|
+
cost = ran.cost ?? 0;
|
|
122
|
+
}
|
|
123
|
+
catch (err) {
|
|
124
|
+
const result = {
|
|
125
|
+
cycleId: cycle.id,
|
|
126
|
+
runtime: cycle.runtime,
|
|
127
|
+
primitive: adapter.primitive,
|
|
128
|
+
executorId: executor.executorId,
|
|
129
|
+
routed: true,
|
|
130
|
+
reason: `worker error: ${err instanceof Error ? err.message : String(err)}`,
|
|
131
|
+
cost: 0,
|
|
132
|
+
};
|
|
133
|
+
ledger.cycles.push(result);
|
|
134
|
+
ledger.checkpoint.failed.push(cycle.id);
|
|
135
|
+
ledger.activityLog.push(`cycle ${cycle.id} FAILED on ${cycle.runtime} — ${result.reason}`);
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
const result = {
|
|
139
|
+
cycleId: cycle.id,
|
|
140
|
+
runtime: cycle.runtime,
|
|
141
|
+
primitive: adapter.primitive,
|
|
142
|
+
executorId: executor.executorId,
|
|
143
|
+
routed: true,
|
|
144
|
+
reason: routing.selected.matchReason,
|
|
145
|
+
output,
|
|
146
|
+
cost,
|
|
147
|
+
};
|
|
148
|
+
ledger.cycles.push(result);
|
|
149
|
+
ledger.checkpoint.completed.push(cycle.id);
|
|
150
|
+
ledger.totalCost += cost;
|
|
151
|
+
ledger.activityLog.push(`cycle ${cycle.id} done on ${cycle.runtime} (cost ${cost})`);
|
|
152
|
+
}
|
|
153
|
+
// Pending = cycles neither completed nor failed (none, here — full pass).
|
|
154
|
+
const accounted = new Set([...ledger.checkpoint.completed, ...ledger.checkpoint.failed]);
|
|
155
|
+
ledger.checkpoint.pending = plan.cycles.map((c) => c.id).filter((id) => !accounted.has(id));
|
|
156
|
+
// Cross-stack aggregation: distinct runtimes that actually ran a worker.
|
|
157
|
+
ledger.runtimesUsed = [
|
|
158
|
+
...new Set(ledger.cycles.filter((c) => c.routed).map((c) => c.runtime)),
|
|
159
|
+
];
|
|
160
|
+
// Best-output selection (REF-015) — conductor-side, across stacks.
|
|
161
|
+
let best;
|
|
162
|
+
for (const c of ledger.cycles) {
|
|
163
|
+
if (!c.output)
|
|
164
|
+
continue;
|
|
165
|
+
const score = this.scoreOutput(c);
|
|
166
|
+
if (!best || score > best.score) {
|
|
167
|
+
best = { cycleId: c.cycleId, runtime: c.runtime, output: c.output, score };
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
ledger.bestOutput = best;
|
|
171
|
+
ledger.activityLog.push(`mission ${plan.missionId} end — completed ${ledger.checkpoint.completed.length}, ` +
|
|
172
|
+
`failed ${ledger.checkpoint.failed.length}, runtimes [${ledger.runtimesUsed.join(', ')}], ` +
|
|
173
|
+
`total cost ${ledger.totalCost}`);
|
|
174
|
+
return ledger;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=mission-conductor.js.map
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OrchestratorAdapter — wires ScreenReader + OrchestratorPTY to live PTY sessions
|
|
3
|
+
*
|
|
4
|
+
* Provides factory functions that connect the orchestrator assess loop to a
|
|
5
|
+
* real PTY session from the WebSocket bridge:
|
|
6
|
+
*
|
|
7
|
+
* createScreenReaderFromSession — attach ScreenReader to a PtySession's output
|
|
8
|
+
* createSessionAdapter — implement OrchestratorSession over PtyLike
|
|
9
|
+
* attachOrchestrator — full attach: reader + adapter + orchestrator
|
|
10
|
+
*
|
|
11
|
+
* @issue #756
|
|
12
|
+
* @see src/serve/screen-reader.ts — ScreenReader / ScreenState
|
|
13
|
+
* @see src/serve/orchestrator-pty.ts — OrchestratorPTY / OrchestratorSession
|
|
14
|
+
* @see src/serve/pty-bridge.ts — PtySession / PtyLike
|
|
15
|
+
*/
|
|
16
|
+
import { ScreenReader } from './screen-reader.js';
|
|
17
|
+
import { OrchestratorPTY } from './orchestrator-pty.js';
|
|
18
|
+
// ============================================================
|
|
19
|
+
// createScreenReaderFromSession
|
|
20
|
+
// ============================================================
|
|
21
|
+
/**
|
|
22
|
+
* Creates a ScreenReader that consumes data from a PtySession's output.
|
|
23
|
+
*
|
|
24
|
+
* - Replays session.outputBuffer immediately so the reader has current screen
|
|
25
|
+
* state from the moment it is constructed.
|
|
26
|
+
* - If the session's PTY is live, registers an onData listener so subsequent
|
|
27
|
+
* output continues to flow into the reader.
|
|
28
|
+
*
|
|
29
|
+
* Callers are responsible for calling reader.dispose() when done.
|
|
30
|
+
*/
|
|
31
|
+
export function createScreenReaderFromSession(session, opts) {
|
|
32
|
+
const reader = new ScreenReader({
|
|
33
|
+
rows: opts?.rows ?? 24,
|
|
34
|
+
cols: opts?.cols ?? 80,
|
|
35
|
+
});
|
|
36
|
+
// Replay any buffered output so the orchestrator starts with current state
|
|
37
|
+
if (session.outputBuffer) {
|
|
38
|
+
reader.write(session.outputBuffer);
|
|
39
|
+
}
|
|
40
|
+
// Attach to live PTY output when a PTY is running
|
|
41
|
+
if (session.pty) {
|
|
42
|
+
session.pty.onData((data) => {
|
|
43
|
+
reader.write(data);
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
return reader;
|
|
47
|
+
}
|
|
48
|
+
// ============================================================
|
|
49
|
+
// createSessionAdapter
|
|
50
|
+
// ============================================================
|
|
51
|
+
/**
|
|
52
|
+
* Creates an OrchestratorSession adapter that writes to a PtySession's PTY stdin.
|
|
53
|
+
*
|
|
54
|
+
* Translates orchestrator write() and signal() calls into direct PTY operations.
|
|
55
|
+
* Rejects if the session's PTY is null (not yet spawned or already cleaned up).
|
|
56
|
+
*/
|
|
57
|
+
export function createSessionAdapter(session) {
|
|
58
|
+
return {
|
|
59
|
+
async write(data) {
|
|
60
|
+
if (!session.pty) {
|
|
61
|
+
throw new Error('PTY session has no active pty — cannot write');
|
|
62
|
+
}
|
|
63
|
+
session.pty.write(data);
|
|
64
|
+
},
|
|
65
|
+
async signal(sig) {
|
|
66
|
+
if (!session.pty) {
|
|
67
|
+
throw new Error('PTY session has no active pty — cannot send signal');
|
|
68
|
+
}
|
|
69
|
+
session.pty.kill(sig);
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Attaches an orchestrator to a running PTY session.
|
|
75
|
+
*
|
|
76
|
+
* Creates a ScreenReader (with outputBuffer replay), creates a session adapter,
|
|
77
|
+
* and wires them together in an OrchestratorPTY instance ready to call run() on.
|
|
78
|
+
*
|
|
79
|
+
* The returned detach() function stops data flow and pauses the orchestrator
|
|
80
|
+
* without killing the PTY. Re-attaching is supported by calling attachOrchestrator
|
|
81
|
+
* again on the same session — it will replay the updated outputBuffer.
|
|
82
|
+
*/
|
|
83
|
+
export function attachOrchestrator(opts) {
|
|
84
|
+
const { session, llm, context, rows, cols } = opts;
|
|
85
|
+
// Track whether we have detached so the forwarding closure can skip writes
|
|
86
|
+
let detached = false;
|
|
87
|
+
// Build the ScreenReader with detach-aware live data forwarding.
|
|
88
|
+
// We inline the attachment here (rather than delegating to createScreenReaderFromSession)
|
|
89
|
+
// so that the onData callback is guarded by the detached flag from the start.
|
|
90
|
+
const guardedReader = new ScreenReader({ rows: rows ?? 24, cols: cols ?? 80 });
|
|
91
|
+
// Replay outputBuffer so the orchestrator starts with current screen state
|
|
92
|
+
if (session.outputBuffer) {
|
|
93
|
+
guardedReader.write(session.outputBuffer);
|
|
94
|
+
}
|
|
95
|
+
// Attach live data feed through a detach guard
|
|
96
|
+
if (session.pty) {
|
|
97
|
+
session.pty.onData((data) => {
|
|
98
|
+
if (!detached) {
|
|
99
|
+
guardedReader.write(data);
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
// Build the session adapter (write/signal → PTY)
|
|
104
|
+
const sessionAdapter = createSessionAdapter(session);
|
|
105
|
+
// Build the orchestrator
|
|
106
|
+
const orchestrator = new OrchestratorPTY(sessionAdapter, guardedReader, llm, context);
|
|
107
|
+
const detach = () => {
|
|
108
|
+
detached = true;
|
|
109
|
+
orchestrator.pause();
|
|
110
|
+
};
|
|
111
|
+
return { orchestrator, screenReader: guardedReader, detach };
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=orchestrator-adapter.js.map
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OrchestratorOverride — Operator HITL (Human-in-the-Loop) handoff
|
|
3
|
+
*
|
|
4
|
+
* Manages the override lifecycle for an orchestrator session. When a human
|
|
5
|
+
* operator needs to take direct control of a PTY session, they call override()
|
|
6
|
+
* to pause the orchestrator, interact with the PTY directly, then call release()
|
|
7
|
+
* to hand control back to the orchestrator.
|
|
8
|
+
*
|
|
9
|
+
* Flow:
|
|
10
|
+
* Orchestrator running → override() →
|
|
11
|
+
* orchestrator.pause() →
|
|
12
|
+
* PTY stdin routed to operator (caller manages routing) →
|
|
13
|
+
* operator interacts directly →
|
|
14
|
+
* release() →
|
|
15
|
+
* orchestrator.resume() with updated screen context
|
|
16
|
+
*
|
|
17
|
+
* Safety guarantees:
|
|
18
|
+
* - override() is idempotent — calling it when already overridden is a no-op
|
|
19
|
+
* - release() is idempotent — calling it when not overridden is a no-op
|
|
20
|
+
* - Both methods are no-ops when the orchestrator is in done state
|
|
21
|
+
* - All override events are recorded for audit trail
|
|
22
|
+
*
|
|
23
|
+
* Future enhancement: inject a 'wait' action with operator-override reasoning
|
|
24
|
+
* into the orchestrator's history once OrchestratorPTY exposes addHistory().
|
|
25
|
+
*
|
|
26
|
+
* @issue #758
|
|
27
|
+
* @see src/serve/orchestrator-pty.ts — OrchestratorPTY with pause()/resume()
|
|
28
|
+
*/
|
|
29
|
+
// ============================================================
|
|
30
|
+
// OrchestratorOverride
|
|
31
|
+
// ============================================================
|
|
32
|
+
export class OrchestratorOverride {
|
|
33
|
+
orchestrator;
|
|
34
|
+
_active = false;
|
|
35
|
+
_events = [];
|
|
36
|
+
_overrideCount = 0;
|
|
37
|
+
constructor(orchestrator) {
|
|
38
|
+
this.orchestrator = orchestrator;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Take manual control. Pauses the orchestrator and records an override-start
|
|
42
|
+
* event. The caller is responsible for routing PTY stdin to operator input
|
|
43
|
+
* while the override is active.
|
|
44
|
+
*
|
|
45
|
+
* No-op if already overridden or if the orchestrator is done.
|
|
46
|
+
*/
|
|
47
|
+
override() {
|
|
48
|
+
if (this.orchestrator.done)
|
|
49
|
+
return;
|
|
50
|
+
if (this._active)
|
|
51
|
+
return;
|
|
52
|
+
this.orchestrator.pause();
|
|
53
|
+
this._active = true;
|
|
54
|
+
this._events.push({
|
|
55
|
+
type: 'override-start',
|
|
56
|
+
timestamp: Date.now(),
|
|
57
|
+
source: 'operator',
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Release manual control. Resumes the orchestrator and records an
|
|
62
|
+
* override-end event. The orchestrator will read the current screen state
|
|
63
|
+
* on its next cycle and continue from there.
|
|
64
|
+
*
|
|
65
|
+
* No-op if no override is active or if the orchestrator is done.
|
|
66
|
+
*/
|
|
67
|
+
async release() {
|
|
68
|
+
if (this.orchestrator.done)
|
|
69
|
+
return;
|
|
70
|
+
if (!this._active)
|
|
71
|
+
return;
|
|
72
|
+
this._active = false;
|
|
73
|
+
this._overrideCount++;
|
|
74
|
+
this._events.push({
|
|
75
|
+
type: 'override-end',
|
|
76
|
+
timestamp: Date.now(),
|
|
77
|
+
source: 'operator',
|
|
78
|
+
});
|
|
79
|
+
await this.orchestrator.resume();
|
|
80
|
+
}
|
|
81
|
+
/** Whether an override is currently active */
|
|
82
|
+
get active() {
|
|
83
|
+
return this._active;
|
|
84
|
+
}
|
|
85
|
+
/** Get all override events (returns a copy for audit trail safety) */
|
|
86
|
+
getEvents() {
|
|
87
|
+
return [...this._events];
|
|
88
|
+
}
|
|
89
|
+
/** Number of override cycles that have completed (override + release pairs) */
|
|
90
|
+
get overrideCount() {
|
|
91
|
+
return this._overrideCount;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=orchestrator-override.js.map
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OrchestratorPTY — Assess loop for Orchestrator-over-PTY
|
|
3
|
+
*
|
|
4
|
+
* Drives a PTY session via an LLM assessor using a read→assess→plan→act→wait
|
|
5
|
+
* loop. The LLM observes the current screen state and decides whether to type,
|
|
6
|
+
* wait, send a signal, or declare the mission complete.
|
|
7
|
+
*
|
|
8
|
+
* The LLMAssessor interface is generic — no Anthropic SDK is imported here —
|
|
9
|
+
* which keeps this class fully testable with mock assessors.
|
|
10
|
+
*
|
|
11
|
+
* @issue #755
|
|
12
|
+
* @see src/serve/screen-reader.ts — ScreenReader / ScreenState
|
|
13
|
+
* @see src/serve/pty-bridge.ts — PtyLike and session interfaces
|
|
14
|
+
*/
|
|
15
|
+
// ============================================================
|
|
16
|
+
// OrchestratorPTY
|
|
17
|
+
// ============================================================
|
|
18
|
+
const DEFAULT_MAX_CYCLES = 100;
|
|
19
|
+
const HISTORY_WINDOW = 10;
|
|
20
|
+
const AWAIT_CHANGE_TIMEOUT_MS = 5000;
|
|
21
|
+
export class OrchestratorPTY {
|
|
22
|
+
session;
|
|
23
|
+
screenReader;
|
|
24
|
+
llm;
|
|
25
|
+
context;
|
|
26
|
+
maxCycles;
|
|
27
|
+
_history = [];
|
|
28
|
+
_done = false;
|
|
29
|
+
_paused = false;
|
|
30
|
+
constructor(session, screenReader, llm, context) {
|
|
31
|
+
this.session = session;
|
|
32
|
+
this.screenReader = screenReader;
|
|
33
|
+
this.llm = llm;
|
|
34
|
+
this.context = context;
|
|
35
|
+
this.maxCycles = context.maxCycles ?? DEFAULT_MAX_CYCLES;
|
|
36
|
+
// Seed history from context (advanced use-case; does not count against window)
|
|
37
|
+
if (context.recentActions.length > 0) {
|
|
38
|
+
this._history.push(...context.recentActions);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
// ----------------------------------------------------------
|
|
42
|
+
// Main loop
|
|
43
|
+
// ----------------------------------------------------------
|
|
44
|
+
/**
|
|
45
|
+
* Run the assess loop until:
|
|
46
|
+
* - the LLM returns `complete`
|
|
47
|
+
* - `maxCycles` iterations are exhausted
|
|
48
|
+
* - `pause()` is called
|
|
49
|
+
*/
|
|
50
|
+
async run() {
|
|
51
|
+
let cycleCount = 0;
|
|
52
|
+
while (!this._done && !this._paused && cycleCount < this.maxCycles) {
|
|
53
|
+
// ---- read ----
|
|
54
|
+
const screen = await this.screenReader.awaitChange({
|
|
55
|
+
timeout: AWAIT_CHANGE_TIMEOUT_MS,
|
|
56
|
+
});
|
|
57
|
+
// Check pause again after the potentially long await
|
|
58
|
+
if (this._paused)
|
|
59
|
+
break;
|
|
60
|
+
// ---- assess ----
|
|
61
|
+
const decision = await this.llm.assess({
|
|
62
|
+
screen_state: screen.summary,
|
|
63
|
+
prompt_detected: screen.prompt_detected,
|
|
64
|
+
prompt_text: screen.prompt_text,
|
|
65
|
+
context: this.context,
|
|
66
|
+
history: this._history.slice(-HISTORY_WINDOW),
|
|
67
|
+
});
|
|
68
|
+
// ---- act ----
|
|
69
|
+
await this._execute(decision);
|
|
70
|
+
cycleCount++;
|
|
71
|
+
}
|
|
72
|
+
// Auto-complete on cycle exhaustion
|
|
73
|
+
if (!this._done && !this._paused && cycleCount >= this.maxCycles) {
|
|
74
|
+
const capAction = {
|
|
75
|
+
action: 'complete',
|
|
76
|
+
reasoning: 'Max cycles reached',
|
|
77
|
+
};
|
|
78
|
+
this._history.push(capAction);
|
|
79
|
+
this._done = true;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
// ----------------------------------------------------------
|
|
83
|
+
// Pause / resume
|
|
84
|
+
// ----------------------------------------------------------
|
|
85
|
+
/** Pause the loop at the next iteration boundary. */
|
|
86
|
+
pause() {
|
|
87
|
+
this._paused = true;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Clear the pause flag and re-enter the assess loop.
|
|
91
|
+
* Resolves when the loop exits again (complete or paused again).
|
|
92
|
+
*/
|
|
93
|
+
async resume() {
|
|
94
|
+
this._paused = false;
|
|
95
|
+
await this.run();
|
|
96
|
+
}
|
|
97
|
+
// ----------------------------------------------------------
|
|
98
|
+
// Accessors
|
|
99
|
+
// ----------------------------------------------------------
|
|
100
|
+
/** Returns a copy of the full action history. */
|
|
101
|
+
getHistory() {
|
|
102
|
+
return [...this._history];
|
|
103
|
+
}
|
|
104
|
+
/** Whether the orchestrator has reached a terminal `complete` state. */
|
|
105
|
+
get done() {
|
|
106
|
+
return this._done;
|
|
107
|
+
}
|
|
108
|
+
/** Whether the orchestrator is currently paused. */
|
|
109
|
+
get paused() {
|
|
110
|
+
return this._paused;
|
|
111
|
+
}
|
|
112
|
+
// ----------------------------------------------------------
|
|
113
|
+
// Private helpers
|
|
114
|
+
// ----------------------------------------------------------
|
|
115
|
+
async _execute(action) {
|
|
116
|
+
this._history.push(action);
|
|
117
|
+
switch (action.action) {
|
|
118
|
+
case 'type':
|
|
119
|
+
await this.session.write((action.text ?? '') + '\n');
|
|
120
|
+
break;
|
|
121
|
+
case 'wait':
|
|
122
|
+
// No-op — loop will call awaitChange again next iteration
|
|
123
|
+
break;
|
|
124
|
+
case 'signal':
|
|
125
|
+
await this.session.signal(action.signal ?? '');
|
|
126
|
+
break;
|
|
127
|
+
case 'complete':
|
|
128
|
+
this._done = true;
|
|
129
|
+
break;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=orchestrator-pty.js.map
|