@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,193 @@
|
|
|
1
|
+
// HTTP wrapper for A2A client + v1 fallback.
|
|
2
|
+
//
|
|
3
|
+
// Responsibilities:
|
|
4
|
+
// - Bearer auth header injection
|
|
5
|
+
// - A2A-Extensions header injection on every mutating call (#1254)
|
|
6
|
+
// - Echo-verification warning when expected extensions are missing
|
|
7
|
+
// - Idempotent-Replayed surfacing as a typed flag on the response
|
|
8
|
+
// - RFC 7807 problem+json error parsing → typed `A2AError`
|
|
9
|
+
// - Sunset / Deprecated / Link rel=successor-version header capture
|
|
10
|
+
// for #1259 (deprecation telemetry — uses callbacks so the Prometheus
|
|
11
|
+
// counter and structured logger plug in without coupling to the
|
|
12
|
+
// telemetry module)
|
|
13
|
+
// - Optional fail-on-deprecated mode (AIWG_FAIL_ON_DEPRECATED=true)
|
|
14
|
+
export class A2AError extends Error {
|
|
15
|
+
status;
|
|
16
|
+
problem;
|
|
17
|
+
path;
|
|
18
|
+
constructor(status, path, problem) {
|
|
19
|
+
super(`${status} ${problem.code ?? problem.title}: ${problem.detail ?? problem.title}`);
|
|
20
|
+
this.name = 'A2AError';
|
|
21
|
+
this.status = status;
|
|
22
|
+
this.problem = problem;
|
|
23
|
+
this.path = path;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
const MUTATING_METHODS = new Set(['POST', 'PUT', 'PATCH', 'DELETE']);
|
|
27
|
+
export class A2AHttpClient {
|
|
28
|
+
baseUrl;
|
|
29
|
+
bearer;
|
|
30
|
+
defaultExtensions;
|
|
31
|
+
failOnDeprecated;
|
|
32
|
+
fetchImpl;
|
|
33
|
+
onDeprecation;
|
|
34
|
+
onExtensionEchoMissing;
|
|
35
|
+
/** Per-process dedupe set: one log per (path, sunset_date). */
|
|
36
|
+
seenDeprecations = new Set();
|
|
37
|
+
constructor(opts) {
|
|
38
|
+
this.baseUrl = opts.baseUrl.replace(/\/+$/, '');
|
|
39
|
+
this.bearer = opts.bearer;
|
|
40
|
+
this.defaultExtensions = opts.defaultExtensions ?? [];
|
|
41
|
+
this.failOnDeprecated = opts.failOnDeprecated ?? false;
|
|
42
|
+
this.fetchImpl = opts.fetch ?? fetch;
|
|
43
|
+
this.onDeprecation = opts.onDeprecation;
|
|
44
|
+
this.onExtensionEchoMissing = opts.onExtensionEchoMissing;
|
|
45
|
+
}
|
|
46
|
+
async request(path, options = {}) {
|
|
47
|
+
const method = (options.method ?? 'GET').toUpperCase();
|
|
48
|
+
const url = path.startsWith('http') ? path : this.baseUrl + path;
|
|
49
|
+
const headers = {
|
|
50
|
+
authorization: `Bearer ${options.bearer ?? this.bearer}`,
|
|
51
|
+
accept: 'application/json',
|
|
52
|
+
};
|
|
53
|
+
if (options.body !== undefined && options.bodyRaw === undefined) {
|
|
54
|
+
headers['content-type'] = 'application/json';
|
|
55
|
+
}
|
|
56
|
+
// Inject A2A-Extensions on mutating calls. Caller can override with
|
|
57
|
+
// options.extensions (empty array clears injection).
|
|
58
|
+
if (MUTATING_METHODS.has(method)) {
|
|
59
|
+
const exts = options.extensions ?? this.defaultExtensions;
|
|
60
|
+
if (exts.length > 0) {
|
|
61
|
+
headers['a2a-extensions'] = exts.join(', ');
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// Caller overrides last so explicit headers win.
|
|
65
|
+
if (options.headers) {
|
|
66
|
+
for (const [k, v] of Object.entries(options.headers)) {
|
|
67
|
+
headers[k.toLowerCase()] = v;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
const init = { method, headers, signal: options.signal };
|
|
71
|
+
if (options.bodyRaw !== undefined) {
|
|
72
|
+
init.body = options.bodyRaw;
|
|
73
|
+
}
|
|
74
|
+
else if (options.body !== undefined) {
|
|
75
|
+
init.body = JSON.stringify(options.body);
|
|
76
|
+
}
|
|
77
|
+
const resp = await this.fetchImpl(url, init);
|
|
78
|
+
// Capture deprecation headers regardless of status.
|
|
79
|
+
const deprecation = captureDeprecation(path, resp.headers);
|
|
80
|
+
if (deprecation) {
|
|
81
|
+
const key = `${deprecation.path}|${deprecation.sunset ?? ''}`;
|
|
82
|
+
if (!this.seenDeprecations.has(key)) {
|
|
83
|
+
this.seenDeprecations.add(key);
|
|
84
|
+
if (this.onDeprecation)
|
|
85
|
+
this.onDeprecation(deprecation);
|
|
86
|
+
}
|
|
87
|
+
if (this.failOnDeprecated) {
|
|
88
|
+
throw new A2AError(resp.status, path, {
|
|
89
|
+
type: 'about:blank',
|
|
90
|
+
title: 'Deprecated endpoint',
|
|
91
|
+
detail: `AIWG_FAIL_ON_DEPRECATED is set; ${path} is deprecated (sunset=${deprecation.sunset ?? '?'})`,
|
|
92
|
+
code: 'aiwg.deprecation_strict',
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
const idempotentReplayed = (resp.headers.get('idempotent-replayed') ?? '')
|
|
97
|
+
.toLowerCase()
|
|
98
|
+
.includes('true');
|
|
99
|
+
const activatedExtensions = parseExtensionList(resp.headers.get('a2a-extensions'));
|
|
100
|
+
// Warn if mutating call requested extensions that weren't echoed.
|
|
101
|
+
if (MUTATING_METHODS.has(method)) {
|
|
102
|
+
const requested = options.extensions ?? this.defaultExtensions;
|
|
103
|
+
if (requested.length > 0) {
|
|
104
|
+
const missing = requested.filter((e) => !activatedExtensions.includes(e));
|
|
105
|
+
if (missing.length > 0 && this.onExtensionEchoMissing) {
|
|
106
|
+
this.onExtensionEchoMissing(requested, activatedExtensions, path);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
if (options.raw) {
|
|
111
|
+
return {
|
|
112
|
+
status: resp.status,
|
|
113
|
+
body: undefined,
|
|
114
|
+
headers: resp.headers,
|
|
115
|
+
idempotentReplayed,
|
|
116
|
+
activatedExtensions,
|
|
117
|
+
rawBody: resp.body,
|
|
118
|
+
...(deprecation ? { deprecation } : {}),
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
// Parse body (JSON, problem+json, or empty).
|
|
122
|
+
let body;
|
|
123
|
+
const ct = resp.headers.get('content-type') ?? '';
|
|
124
|
+
if (resp.status !== 204 && resp.status !== 205) {
|
|
125
|
+
const text = await resp.text();
|
|
126
|
+
if (text.length > 0) {
|
|
127
|
+
if (ct.includes('json')) {
|
|
128
|
+
try {
|
|
129
|
+
body = JSON.parse(text);
|
|
130
|
+
}
|
|
131
|
+
catch (err) {
|
|
132
|
+
throw new A2AError(resp.status, path, {
|
|
133
|
+
type: 'about:blank',
|
|
134
|
+
title: 'Invalid JSON',
|
|
135
|
+
detail: `Response was not parseable JSON: ${err.message}`,
|
|
136
|
+
code: 'aiwg.invalid_response',
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
body = text;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
if (resp.status >= 400) {
|
|
146
|
+
const problem = body ?? {
|
|
147
|
+
type: 'about:blank',
|
|
148
|
+
title: `HTTP ${resp.status}`,
|
|
149
|
+
};
|
|
150
|
+
throw new A2AError(resp.status, path, problem);
|
|
151
|
+
}
|
|
152
|
+
return {
|
|
153
|
+
status: resp.status,
|
|
154
|
+
body,
|
|
155
|
+
headers: resp.headers,
|
|
156
|
+
idempotentReplayed,
|
|
157
|
+
activatedExtensions,
|
|
158
|
+
...(deprecation ? { deprecation } : {}),
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
// ---------- header helpers ----------
|
|
163
|
+
function parseExtensionList(header) {
|
|
164
|
+
if (!header)
|
|
165
|
+
return [];
|
|
166
|
+
return header
|
|
167
|
+
.split(',')
|
|
168
|
+
.map((s) => s.trim())
|
|
169
|
+
.filter((s) => s.length > 0);
|
|
170
|
+
}
|
|
171
|
+
function captureDeprecation(path, headers) {
|
|
172
|
+
const sunset = headers.get('sunset') ?? undefined;
|
|
173
|
+
const deprecated = headers.get('deprecated') ?? undefined;
|
|
174
|
+
const link = headers.get('link') ?? undefined;
|
|
175
|
+
if (!sunset && !deprecated && !link)
|
|
176
|
+
return undefined;
|
|
177
|
+
let successor;
|
|
178
|
+
if (link) {
|
|
179
|
+
// Match the `successor-version` rel target — RFC 5988 Link entries are
|
|
180
|
+
// comma-separated; we look for `rel="successor-version"` or `rel=successor-version`.
|
|
181
|
+
const re = /<([^>]+)>\s*;\s*[^,]*rel\s*=\s*"?successor-version"?/i;
|
|
182
|
+
const m = re.exec(link);
|
|
183
|
+
if (m)
|
|
184
|
+
successor = m[1];
|
|
185
|
+
}
|
|
186
|
+
return {
|
|
187
|
+
path,
|
|
188
|
+
...(sunset ? { sunset } : {}),
|
|
189
|
+
...(deprecated ? { deprecated } : {}),
|
|
190
|
+
...(successor ? { successor } : {}),
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
//# sourceMappingURL=http.js.map
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
// JCS (RFC 8785) canonicalization — TypeScript port of the Go reference at
|
|
2
|
+
// agentic-sandbox-conformance/internal/spec/jcs.go.
|
|
3
|
+
//
|
|
4
|
+
// Sufficient for the AgentCard shape: objects, strings, integers, booleans,
|
|
5
|
+
// null, arrays, and JSON numbers without exponential form. Numbers are emitted
|
|
6
|
+
// in a form that matches serde_json output for integers and short decimals
|
|
7
|
+
// (the only forms `agent_card::sign_agent_card` produces today).
|
|
8
|
+
const encoder = new TextEncoder();
|
|
9
|
+
export function canonicalizeJsonBytes(input) {
|
|
10
|
+
const text = typeof input === 'string' ? input : new TextDecoder('utf-8').decode(input);
|
|
11
|
+
const value = JSON.parse(text);
|
|
12
|
+
return canonicalizeJson(value);
|
|
13
|
+
}
|
|
14
|
+
export function canonicalizeJson(value) {
|
|
15
|
+
const chunks = [];
|
|
16
|
+
writeCanonical(chunks, value);
|
|
17
|
+
return encoder.encode(chunks.join(''));
|
|
18
|
+
}
|
|
19
|
+
export function canonicalizeJsonString(value) {
|
|
20
|
+
const chunks = [];
|
|
21
|
+
writeCanonical(chunks, value);
|
|
22
|
+
return chunks.join('');
|
|
23
|
+
}
|
|
24
|
+
function writeCanonical(out, value) {
|
|
25
|
+
if (value === null) {
|
|
26
|
+
out.push('null');
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
if (typeof value === 'boolean') {
|
|
30
|
+
out.push(value ? 'true' : 'false');
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
if (typeof value === 'string') {
|
|
34
|
+
writeCanonicalString(out, value);
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
if (typeof value === 'number') {
|
|
38
|
+
if (!Number.isFinite(value)) {
|
|
39
|
+
throw new Error(`JCS: non-finite number ${value}`);
|
|
40
|
+
}
|
|
41
|
+
if (Number.isInteger(value)) {
|
|
42
|
+
out.push(value.toString(10));
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
// Shortest round-trip representation; matches Go strconv -1 precision
|
|
46
|
+
// for the common cases in the AgentCard shape (it has no exotic doubles).
|
|
47
|
+
out.push(String(value));
|
|
48
|
+
}
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
if (Array.isArray(value)) {
|
|
52
|
+
out.push('[');
|
|
53
|
+
for (let i = 0; i < value.length; i++) {
|
|
54
|
+
if (i > 0)
|
|
55
|
+
out.push(',');
|
|
56
|
+
writeCanonical(out, value[i]);
|
|
57
|
+
}
|
|
58
|
+
out.push(']');
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
if (typeof value === 'object') {
|
|
62
|
+
const keys = Object.keys(value).sort(compareUtf16);
|
|
63
|
+
out.push('{');
|
|
64
|
+
for (let i = 0; i < keys.length; i++) {
|
|
65
|
+
if (i > 0)
|
|
66
|
+
out.push(',');
|
|
67
|
+
const k = keys[i];
|
|
68
|
+
writeCanonicalString(out, k);
|
|
69
|
+
out.push(':');
|
|
70
|
+
writeCanonical(out, value[k]);
|
|
71
|
+
}
|
|
72
|
+
out.push('}');
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
throw new Error(`JCS: unsupported type ${typeof value}`);
|
|
76
|
+
}
|
|
77
|
+
// Strings per RFC 8785 §3.2.2.2 / RFC 8259. Escape " \ and control chars (\u00xx).
|
|
78
|
+
// Slash is NOT escaped. Non-ASCII characters are emitted as raw UTF-8.
|
|
79
|
+
function writeCanonicalString(out, s) {
|
|
80
|
+
out.push('"');
|
|
81
|
+
for (let i = 0; i < s.length; i++) {
|
|
82
|
+
const ch = s.charCodeAt(i);
|
|
83
|
+
switch (ch) {
|
|
84
|
+
case 0x22: // "
|
|
85
|
+
out.push('\\"');
|
|
86
|
+
break;
|
|
87
|
+
case 0x5c: // \
|
|
88
|
+
out.push('\\\\');
|
|
89
|
+
break;
|
|
90
|
+
case 0x08:
|
|
91
|
+
out.push('\\b');
|
|
92
|
+
break;
|
|
93
|
+
case 0x0c:
|
|
94
|
+
out.push('\\f');
|
|
95
|
+
break;
|
|
96
|
+
case 0x0a:
|
|
97
|
+
out.push('\\n');
|
|
98
|
+
break;
|
|
99
|
+
case 0x0d:
|
|
100
|
+
out.push('\\r');
|
|
101
|
+
break;
|
|
102
|
+
case 0x09:
|
|
103
|
+
out.push('\\t');
|
|
104
|
+
break;
|
|
105
|
+
default:
|
|
106
|
+
if (ch < 0x20) {
|
|
107
|
+
out.push('\\u' + ch.toString(16).padStart(4, '0'));
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
// Emit raw character; JS strings are already UTF-16 and TextEncoder
|
|
111
|
+
// will produce UTF-8 bytes on encode.
|
|
112
|
+
out.push(s[i]);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
out.push('"');
|
|
117
|
+
}
|
|
118
|
+
// Compare two strings by their UTF-16 code-unit sequences (RFC 8785 §3.2.3).
|
|
119
|
+
// JS string comparison is already lexicographic over UTF-16 code units, so a
|
|
120
|
+
// plain compare suffices.
|
|
121
|
+
function compareUtf16(a, b) {
|
|
122
|
+
if (a < b)
|
|
123
|
+
return -1;
|
|
124
|
+
if (a > b)
|
|
125
|
+
return 1;
|
|
126
|
+
return 0;
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=jcs.js.map
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
// JWS Compact (RFC 7515) verification with EdDSA / Ed25519 support.
|
|
2
|
+
// TypeScript port of agentic-sandbox-conformance/internal/spec/jws.go.
|
|
3
|
+
//
|
|
4
|
+
// The Rust signer (`agent_card::sign_agent_card` in agentic-sandbox) produces
|
|
5
|
+
// non-detached JWS: the middle segment IS the base64url-encoded canonical
|
|
6
|
+
// payload bytes. `verifyJwsCompact` cross-checks that against an
|
|
7
|
+
// independently-canonicalized `expectedPayload` when provided.
|
|
8
|
+
import { createHash, createPublicKey, verify as cryptoVerify } from 'node:crypto';
|
|
9
|
+
import { canonicalizeJson } from './jcs.js';
|
|
10
|
+
export function findJwkByKid(set, kid) {
|
|
11
|
+
if (!set)
|
|
12
|
+
return null;
|
|
13
|
+
for (const k of set.keys)
|
|
14
|
+
if (k.kid === kid)
|
|
15
|
+
return k;
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
// RFC 7638 thumbprint for OKP keys: SHA-256 over the canonical
|
|
19
|
+
// { crv, kty, x } object, base64url-encoded.
|
|
20
|
+
export function jwkThumbprint(jwk) {
|
|
21
|
+
if (jwk.kty !== 'OKP') {
|
|
22
|
+
throw new Error(`thumbprint: unsupported kty ${jwk.kty}`);
|
|
23
|
+
}
|
|
24
|
+
if (!jwk.crv || !jwk.x)
|
|
25
|
+
throw new Error('thumbprint: OKP key missing crv/x');
|
|
26
|
+
const canon = canonicalizeJson({ crv: jwk.crv, kty: jwk.kty, x: jwk.x });
|
|
27
|
+
const sum = createHash('sha256').update(canon).digest();
|
|
28
|
+
return base64UrlEncode(sum);
|
|
29
|
+
}
|
|
30
|
+
export function loadJwkSet(json) {
|
|
31
|
+
const parsed = JSON.parse(json);
|
|
32
|
+
if (!parsed ||
|
|
33
|
+
typeof parsed !== 'object' ||
|
|
34
|
+
!Array.isArray(parsed.keys)) {
|
|
35
|
+
throw new Error('JWKS: missing keys array');
|
|
36
|
+
}
|
|
37
|
+
const set = parsed;
|
|
38
|
+
if (set.keys.length === 0)
|
|
39
|
+
throw new Error('JWKS contains no keys');
|
|
40
|
+
return set;
|
|
41
|
+
}
|
|
42
|
+
// VerifyJwsCompact verifies a JWS Compact serialization.
|
|
43
|
+
//
|
|
44
|
+
// If `expectedPayload` is provided, the embedded payload bytes must match it
|
|
45
|
+
// (constant-time compare). This is how the AgentCard verifier guarantees that
|
|
46
|
+
// the JCS-canonicalized bytes the harness computed match what was signed.
|
|
47
|
+
//
|
|
48
|
+
// Throws on any verification failure with a descriptive message.
|
|
49
|
+
export function verifyJwsCompact(jws, expectedPayload, jwk) {
|
|
50
|
+
if (!jwk)
|
|
51
|
+
throw new Error('verifyJwsCompact: nil JWK');
|
|
52
|
+
const parts = jws.split('.');
|
|
53
|
+
if (parts.length !== 3) {
|
|
54
|
+
throw new Error(`verifyJwsCompact: expected 3 segments, got ${parts.length}`);
|
|
55
|
+
}
|
|
56
|
+
const [headerB64, payloadB64, sigB64] = parts;
|
|
57
|
+
let header;
|
|
58
|
+
try {
|
|
59
|
+
const headerRaw = base64UrlDecode(headerB64);
|
|
60
|
+
header = JSON.parse(new TextDecoder('utf-8').decode(headerRaw));
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
throw new Error(`verifyJwsCompact: parse header: ${err.message}`);
|
|
64
|
+
}
|
|
65
|
+
let payload;
|
|
66
|
+
let sig;
|
|
67
|
+
try {
|
|
68
|
+
payload = base64UrlDecode(payloadB64);
|
|
69
|
+
sig = base64UrlDecode(sigB64);
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
throw new Error(`verifyJwsCompact: decode segments: ${err.message}`);
|
|
73
|
+
}
|
|
74
|
+
if (expectedPayload !== null) {
|
|
75
|
+
if (!constantTimeEqual(payload, expectedPayload)) {
|
|
76
|
+
throw new Error(`JWS payload does not match expected canonical bytes (got ${payload.length} bytes, want ${expectedPayload.length})`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
const signingInput = new TextEncoder().encode(headerB64 + '.' + payloadB64);
|
|
80
|
+
if (header.alg !== 'EdDSA') {
|
|
81
|
+
throw new Error(`unsupported JWS alg ${header.alg} (only EdDSA supported)`);
|
|
82
|
+
}
|
|
83
|
+
if (jwk.kty !== 'OKP' || jwk.crv !== 'Ed25519') {
|
|
84
|
+
throw new Error(`EdDSA: JWK is not OKP/Ed25519 (kty=${jwk.kty} crv=${jwk.crv ?? '?'})`);
|
|
85
|
+
}
|
|
86
|
+
if (!jwk.x)
|
|
87
|
+
throw new Error('EdDSA: JWK missing x');
|
|
88
|
+
const pubRaw = base64UrlDecode(jwk.x);
|
|
89
|
+
if (pubRaw.length !== 32) {
|
|
90
|
+
throw new Error(`EdDSA: public key wrong length ${pubRaw.length} (want 32)`);
|
|
91
|
+
}
|
|
92
|
+
// Node's crypto requires SPKI-wrapped Ed25519 keys. Build one from the raw
|
|
93
|
+
// 32-byte X coordinate.
|
|
94
|
+
const spki = wrapEd25519Spki(pubRaw);
|
|
95
|
+
const key = createPublicKey({ key: spki, format: 'der', type: 'spki' });
|
|
96
|
+
const ok = cryptoVerify(null, signingInput, key, sig);
|
|
97
|
+
if (!ok)
|
|
98
|
+
throw new Error('EdDSA signature verification failed');
|
|
99
|
+
}
|
|
100
|
+
// VerifyAgentCardSignature is the high-level helper: extracts signatures[0],
|
|
101
|
+
// strips the `signatures` field from a deep clone, JCS-canonicalizes the rest,
|
|
102
|
+
// looks up the JWK by kid, and verifies via verifyJwsCompact.
|
|
103
|
+
//
|
|
104
|
+
// `cardJson` is the raw JSON bytes (or string) of the AgentCard as served.
|
|
105
|
+
export function verifyAgentCardSignature(cardJson, jwks) {
|
|
106
|
+
const text = typeof cardJson === 'string' ? cardJson : new TextDecoder('utf-8').decode(cardJson);
|
|
107
|
+
if (!text || text.length === 0) {
|
|
108
|
+
throw new Error('verifyAgentCardSignature: empty card body');
|
|
109
|
+
}
|
|
110
|
+
let card;
|
|
111
|
+
try {
|
|
112
|
+
card = JSON.parse(text);
|
|
113
|
+
}
|
|
114
|
+
catch (err) {
|
|
115
|
+
throw new Error(`parse card JSON: ${err.message}`);
|
|
116
|
+
}
|
|
117
|
+
const sigsRaw = card['signatures'];
|
|
118
|
+
if (sigsRaw === undefined)
|
|
119
|
+
throw new Error("agent card has no 'signatures' field");
|
|
120
|
+
if (!Array.isArray(sigsRaw) || sigsRaw.length === 0) {
|
|
121
|
+
throw new Error("agent card 'signatures' is empty or not an array");
|
|
122
|
+
}
|
|
123
|
+
const first = sigsRaw[0];
|
|
124
|
+
if (!first || typeof first !== 'object') {
|
|
125
|
+
throw new Error('signatures[0] is not an object');
|
|
126
|
+
}
|
|
127
|
+
const compact = first['signature'];
|
|
128
|
+
if (typeof compact !== 'string' || !compact) {
|
|
129
|
+
throw new Error('signatures[0].signature missing or not a string');
|
|
130
|
+
}
|
|
131
|
+
const hdr = first['header'];
|
|
132
|
+
if (!hdr || typeof hdr !== 'object' || Array.isArray(hdr)) {
|
|
133
|
+
throw new Error('signatures[0].header missing');
|
|
134
|
+
}
|
|
135
|
+
const kid = hdr['kid'];
|
|
136
|
+
if (typeof kid !== 'string' || !kid) {
|
|
137
|
+
throw new Error('signatures[0].header.kid missing');
|
|
138
|
+
}
|
|
139
|
+
const jwk = findJwkByKid(jwks, kid);
|
|
140
|
+
if (!jwk)
|
|
141
|
+
throw new Error(`no JWK matches kid=${kid}`);
|
|
142
|
+
// Build the unsigned form.
|
|
143
|
+
const unsigned = {};
|
|
144
|
+
for (const [k, v] of Object.entries(card)) {
|
|
145
|
+
if (k === 'signatures')
|
|
146
|
+
continue;
|
|
147
|
+
unsigned[k] = v;
|
|
148
|
+
}
|
|
149
|
+
const canonical = canonicalizeJson(unsigned);
|
|
150
|
+
verifyJwsCompact(compact, canonical, jwk);
|
|
151
|
+
}
|
|
152
|
+
// ---------- internal helpers ----------
|
|
153
|
+
function base64UrlDecode(input) {
|
|
154
|
+
// Convert base64url -> base64 and pad.
|
|
155
|
+
const b64 = input.replace(/-/g, '+').replace(/_/g, '/');
|
|
156
|
+
const pad = b64.length % 4 === 0 ? '' : '='.repeat(4 - (b64.length % 4));
|
|
157
|
+
return new Uint8Array(Buffer.from(b64 + pad, 'base64'));
|
|
158
|
+
}
|
|
159
|
+
function base64UrlEncode(bytes) {
|
|
160
|
+
return Buffer.from(bytes)
|
|
161
|
+
.toString('base64')
|
|
162
|
+
.replace(/\+/g, '-')
|
|
163
|
+
.replace(/\//g, '_')
|
|
164
|
+
.replace(/=+$/, '');
|
|
165
|
+
}
|
|
166
|
+
function constantTimeEqual(a, b) {
|
|
167
|
+
if (a.length !== b.length)
|
|
168
|
+
return false;
|
|
169
|
+
let diff = 0;
|
|
170
|
+
for (let i = 0; i < a.length; i++) {
|
|
171
|
+
diff |= a[i] ^ b[i];
|
|
172
|
+
}
|
|
173
|
+
return diff === 0;
|
|
174
|
+
}
|
|
175
|
+
// SPKI wrapper for raw 32-byte Ed25519 public keys.
|
|
176
|
+
// SubjectPublicKeyInfo ::= SEQUENCE {
|
|
177
|
+
// algorithm AlgorithmIdentifier (id-Ed25519 = 1.3.101.112),
|
|
178
|
+
// subjectPublicKey BIT STRING (raw 32 bytes),
|
|
179
|
+
// }
|
|
180
|
+
// Pre-computed prefix (12 bytes): 30 2a 30 05 06 03 2b 65 70 03 21 00
|
|
181
|
+
const ED25519_SPKI_PREFIX = Buffer.from('302a300506032b6570032100', 'hex');
|
|
182
|
+
function wrapEd25519Spki(raw) {
|
|
183
|
+
if (raw.length !== 32)
|
|
184
|
+
throw new Error('Ed25519 raw key must be 32 bytes');
|
|
185
|
+
return Buffer.concat([ED25519_SPKI_PREFIX, Buffer.from(raw)]);
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=jws.js.map
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// A2A protocol types — the subset AIWG needs to talk to an agentic-sandbox v2
|
|
2
|
+
// executor. Modelled from the executor's wire surface
|
|
3
|
+
// (`agentic-sandbox/management/agentic-sandbox-executor`):
|
|
4
|
+
//
|
|
5
|
+
// - send_message.rs — POST /agents/{id}/v1/messages:send
|
|
6
|
+
// - get_task.rs — GET /agents/{id}/v1/tasks/{tid}
|
|
7
|
+
// - cancel_task.rs — POST /agents/{id}/v1/tasks/{tid}/cancel
|
|
8
|
+
// - subscribe_task — GET /agents/{id}/v1/tasks/{tid}/subscribe (SSE)
|
|
9
|
+
// - push_delivery.rs — * /agents/{id}/v1/tasks/{tid}/pushNotificationConfigs/*
|
|
10
|
+
// - agent_card.rs — GET /agents/{id}/.well-known/agent-card.json
|
|
11
|
+
// GET /agents/{id}/v1/extendedAgentCard
|
|
12
|
+
//
|
|
13
|
+
// Types are intentionally permissive (extra fields allowed). We track only
|
|
14
|
+
// what the AIWG orchestrator inspects; the rest is forwarded opaquely.
|
|
15
|
+
export const TERMINAL_TASK_STATES = [
|
|
16
|
+
'completed',
|
|
17
|
+
'failed',
|
|
18
|
+
'canceled',
|
|
19
|
+
'rejected',
|
|
20
|
+
];
|
|
21
|
+
export function isTerminalTaskState(s) {
|
|
22
|
+
return TERMINAL_TASK_STATES.includes(s);
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=types.js.map
|