@kya-os/cli 1.8.1 → 1.8.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/agent.d.ts +35 -0
- package/dist/commands/agent.d.ts.map +1 -0
- package/dist/commands/agent.js +321 -0
- package/dist/commands/agent.js.map +1 -0
- package/dist/commands/build.js +2 -2
- package/dist/commands/build.js.map +1 -1
- package/dist/commands/check.js +3 -3
- package/dist/commands/check.js.map +1 -1
- package/dist/commands/checkpoint-init.d.ts +1 -1
- package/dist/commands/checkpoint-init.d.ts.map +1 -1
- package/dist/commands/checkpoint-init.js +8 -41
- package/dist/commands/checkpoint-init.js.map +1 -1
- package/dist/commands/claim.js +2 -2
- package/dist/commands/claim.js.map +1 -1
- package/dist/commands/dco.d.ts +59 -0
- package/dist/commands/dco.d.ts.map +1 -1
- package/dist/commands/dco.js +280 -5
- package/dist/commands/dco.js.map +1 -1
- package/dist/commands/dev.js +1 -1
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +18 -24
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/env.js +6 -6
- package/dist/commands/env.js.map +1 -1
- package/dist/commands/identity.js +3 -3
- package/dist/commands/identity.js.map +1 -1
- package/dist/commands/init-stages.d.ts +141 -0
- package/dist/commands/init-stages.d.ts.map +1 -0
- package/dist/commands/init-stages.js +684 -0
- package/dist/commands/init-stages.js.map +1 -0
- package/dist/commands/init.d.ts +46 -16
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +229 -279
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/orchestrator.d.ts +18 -0
- package/dist/commands/orchestrator.d.ts.map +1 -0
- package/dist/commands/orchestrator.js +251 -0
- package/dist/commands/orchestrator.js.map +1 -0
- package/dist/commands/register.d.ts +1 -1
- package/dist/commands/register.d.ts.map +1 -1
- package/dist/commands/register.js +35 -7
- package/dist/commands/register.js.map +1 -1
- package/dist/commands/review.d.ts +48 -0
- package/dist/commands/review.d.ts.map +1 -0
- package/dist/commands/review.js +220 -0
- package/dist/commands/review.js.map +1 -0
- package/dist/commands/rotate.js +4 -4
- package/dist/commands/rotate.js.map +1 -1
- package/dist/commands/score.d.ts +15 -0
- package/dist/commands/score.d.ts.map +1 -0
- package/dist/commands/score.js +471 -0
- package/dist/commands/score.js.map +1 -0
- package/dist/commands/start.js +3 -3
- package/dist/commands/start.js.map +1 -1
- package/dist/commands/status.js +1 -1
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/verify.js +6 -6
- package/dist/commands/verify.js.map +1 -1
- package/dist/dco.d.ts +4 -0
- package/dist/dco.d.ts.map +1 -0
- package/dist/dco.js +23 -0
- package/dist/dco.js.map +1 -0
- package/dist/index.js +52 -9
- package/dist/orchestrator/daemon.d.ts +137 -0
- package/dist/orchestrator/daemon.d.ts.map +1 -0
- package/dist/orchestrator/daemon.js +242 -0
- package/dist/orchestrator/daemon.js.map +1 -0
- package/dist/orchestrator/db/dispatches.d.ts +108 -0
- package/dist/orchestrator/db/dispatches.d.ts.map +1 -0
- package/dist/orchestrator/db/dispatches.js +122 -0
- package/dist/orchestrator/db/dispatches.js.map +1 -0
- package/dist/orchestrator/db/index.d.ts +50 -0
- package/dist/orchestrator/db/index.d.ts.map +1 -0
- package/dist/orchestrator/db/index.js +116 -0
- package/dist/orchestrator/db/index.js.map +1 -0
- package/dist/orchestrator/db/journal.d.ts +93 -0
- package/dist/orchestrator/db/journal.d.ts.map +1 -0
- package/dist/orchestrator/db/journal.js +91 -0
- package/dist/orchestrator/db/journal.js.map +1 -0
- package/dist/orchestrator/db/liveness.d.ts +97 -0
- package/dist/orchestrator/db/liveness.d.ts.map +1 -0
- package/dist/orchestrator/db/liveness.js +105 -0
- package/dist/orchestrator/db/liveness.js.map +1 -0
- package/dist/orchestrator/db/mission.d.ts +78 -0
- package/dist/orchestrator/db/mission.d.ts.map +1 -0
- package/dist/orchestrator/db/mission.js +99 -0
- package/dist/orchestrator/db/mission.js.map +1 -0
- package/dist/orchestrator/db/schema.d.ts +14 -0
- package/dist/orchestrator/db/schema.d.ts.map +1 -0
- package/dist/orchestrator/db/schema.js +169 -0
- package/dist/orchestrator/db/schema.js.map +1 -0
- package/dist/orchestrator/db/tickets.d.ts +147 -0
- package/dist/orchestrator/db/tickets.d.ts.map +1 -0
- package/dist/orchestrator/db/tickets.js +238 -0
- package/dist/orchestrator/db/tickets.js.map +1 -0
- package/dist/orchestrator/db/verdicts.d.ts +187 -0
- package/dist/orchestrator/db/verdicts.d.ts.map +1 -0
- package/dist/orchestrator/db/verdicts.js +197 -0
- package/dist/orchestrator/db/verdicts.js.map +1 -0
- package/dist/orchestrator/events.d.ts +69 -0
- package/dist/orchestrator/events.d.ts.map +1 -0
- package/dist/orchestrator/events.js +20 -0
- package/dist/orchestrator/events.js.map +1 -0
- package/dist/orchestrator/github-credential-anchor-sender.d.ts +159 -0
- package/dist/orchestrator/github-credential-anchor-sender.d.ts.map +1 -0
- package/dist/orchestrator/github-credential-anchor-sender.js +313 -0
- package/dist/orchestrator/github-credential-anchor-sender.js.map +1 -0
- package/dist/orchestrator/hub-dispatch.d.ts +120 -0
- package/dist/orchestrator/hub-dispatch.d.ts.map +1 -0
- package/dist/orchestrator/hub-dispatch.js +257 -0
- package/dist/orchestrator/hub-dispatch.js.map +1 -0
- package/dist/orchestrator/hub-observer.d.ts +201 -0
- package/dist/orchestrator/hub-observer.d.ts.map +1 -0
- package/dist/orchestrator/hub-observer.js +474 -0
- package/dist/orchestrator/hub-observer.js.map +1 -0
- package/dist/orchestrator/journal-writer.d.ts +80 -0
- package/dist/orchestrator/journal-writer.d.ts.map +1 -0
- package/dist/orchestrator/journal-writer.js +113 -0
- package/dist/orchestrator/journal-writer.js.map +1 -0
- package/dist/orchestrator/mcp/server.d.ts +136 -0
- package/dist/orchestrator/mcp/server.d.ts.map +1 -0
- package/dist/orchestrator/mcp/server.js +582 -0
- package/dist/orchestrator/mcp/server.js.map +1 -0
- package/dist/orchestrator/mcp/stdio.d.ts +22 -0
- package/dist/orchestrator/mcp/stdio.d.ts.map +1 -0
- package/dist/orchestrator/mcp/stdio.js +51 -0
- package/dist/orchestrator/mcp/stdio.js.map +1 -0
- package/dist/orchestrator/review.d.ts +131 -0
- package/dist/orchestrator/review.d.ts.map +1 -0
- package/dist/orchestrator/review.js +322 -0
- package/dist/orchestrator/review.js.map +1 -0
- package/dist/tui/app.d.ts +33 -0
- package/dist/tui/app.d.ts.map +1 -0
- package/dist/tui/app.js +71 -0
- package/dist/tui/app.js.map +1 -0
- package/dist/tui/components.d.ts +110 -0
- package/dist/tui/components.d.ts.map +1 -0
- package/dist/tui/components.js +118 -0
- package/dist/tui/components.js.map +1 -0
- package/dist/tui/index.d.ts +30 -0
- package/dist/tui/index.d.ts.map +1 -0
- package/dist/tui/index.js +95 -0
- package/dist/tui/index.js.map +1 -0
- package/dist/tui/keymap.d.ts +33 -0
- package/dist/tui/keymap.d.ts.map +1 -0
- package/dist/tui/keymap.js +49 -0
- package/dist/tui/keymap.js.map +1 -0
- package/dist/tui/nav.d.ts +29 -0
- package/dist/tui/nav.d.ts.map +1 -0
- package/dist/tui/nav.js +39 -0
- package/dist/tui/nav.js.map +1 -0
- package/dist/tui/sanitize.d.ts +25 -0
- package/dist/tui/sanitize.d.ts.map +1 -0
- package/dist/tui/sanitize.js +36 -0
- package/dist/tui/sanitize.js.map +1 -0
- package/dist/tui/theme.d.ts +32 -0
- package/dist/tui/theme.d.ts.map +1 -0
- package/dist/tui/theme.js +63 -0
- package/dist/tui/theme.js.map +1 -0
- package/dist/tui/views/agents.d.ts +67 -0
- package/dist/tui/views/agents.d.ts.map +1 -0
- package/dist/tui/views/agents.js +231 -0
- package/dist/tui/views/agents.js.map +1 -0
- package/dist/tui/views/index.d.ts +93 -0
- package/dist/tui/views/index.d.ts.map +1 -0
- package/dist/tui/views/index.js +150 -0
- package/dist/tui/views/index.js.map +1 -0
- package/dist/tui/views/registry.d.ts +22 -0
- package/dist/tui/views/registry.d.ts.map +1 -0
- package/dist/tui/views/registry.js +110 -0
- package/dist/tui/views/registry.js.map +1 -0
- package/dist/utils/agent/backoff.d.ts +31 -0
- package/dist/utils/agent/backoff.d.ts.map +1 -0
- package/dist/utils/agent/backoff.js +51 -0
- package/dist/utils/agent/backoff.js.map +1 -0
- package/dist/utils/agent/markers.d.ts +87 -0
- package/dist/utils/agent/markers.d.ts.map +1 -0
- package/dist/utils/agent/markers.js +147 -0
- package/dist/utils/agent/markers.js.map +1 -0
- package/dist/utils/agent/review.d.ts +67 -0
- package/dist/utils/agent/review.d.ts.map +1 -0
- package/dist/utils/agent/review.js +305 -0
- package/dist/utils/agent/review.js.map +1 -0
- package/dist/utils/agent/spawn-agent.d.ts +117 -0
- package/dist/utils/agent/spawn-agent.d.ts.map +1 -0
- package/dist/utils/agent/spawn-agent.js +177 -0
- package/dist/utils/agent/spawn-agent.js.map +1 -0
- package/dist/utils/agent/task.d.ts +101 -0
- package/dist/utils/agent/task.d.ts.map +1 -0
- package/dist/utils/agent/task.js +357 -0
- package/dist/utils/agent/task.js.map +1 -0
- package/dist/utils/agent/verify.d.ts +47 -0
- package/dist/utils/agent/verify.d.ts.map +1 -0
- package/dist/utils/agent/verify.js +144 -0
- package/dist/utils/agent/verify.js.map +1 -0
- package/dist/utils/agent-detector.d.ts +48 -0
- package/dist/utils/agent-detector.d.ts.map +1 -0
- package/dist/utils/agent-detector.js +74 -0
- package/dist/utils/agent-detector.js.map +1 -0
- package/dist/utils/agent-profile-stage.d.ts +70 -0
- package/dist/utils/agent-profile-stage.d.ts.map +1 -0
- package/dist/utils/agent-profile-stage.js +153 -0
- package/dist/utils/agent-profile-stage.js.map +1 -0
- package/dist/utils/agent-profiles.d.ts +27 -0
- package/dist/utils/agent-profiles.d.ts.map +1 -0
- package/dist/utils/agent-profiles.js +61 -0
- package/dist/utils/agent-profiles.js.map +1 -0
- package/dist/utils/checkpoint-api.d.ts +1 -1
- package/dist/utils/checkpoint-api.js +1 -1
- package/dist/utils/checkpoint-env.d.ts +1 -1
- package/dist/utils/checkpoint-env.js +2 -2
- package/dist/utils/checkpoint-env.js.map +1 -1
- package/dist/utils/checkpoint-scaffold.d.ts +1 -1
- package/dist/utils/checkpoint-scaffold.js +1 -1
- package/dist/utils/cli-kit/browser.d.ts +24 -0
- package/dist/utils/cli-kit/browser.d.ts.map +1 -0
- package/dist/utils/cli-kit/browser.js +58 -0
- package/dist/utils/cli-kit/browser.js.map +1 -0
- package/dist/utils/cli-kit/claim-polling.d.ts +18 -0
- package/dist/utils/cli-kit/claim-polling.d.ts.map +1 -0
- package/dist/utils/{claim-polling.js → cli-kit/claim-polling.js} +19 -26
- package/dist/utils/cli-kit/claim-polling.js.map +1 -0
- package/dist/utils/cli-kit/diagnostics.d.ts +9 -0
- package/dist/utils/cli-kit/diagnostics.d.ts.map +1 -0
- package/dist/utils/cli-kit/diagnostics.js +11 -0
- package/dist/utils/cli-kit/diagnostics.js.map +1 -0
- package/dist/utils/cli-kit/fs-safe.d.ts +14 -0
- package/dist/utils/cli-kit/fs-safe.d.ts.map +1 -0
- package/dist/utils/cli-kit/fs-safe.js +20 -0
- package/dist/utils/cli-kit/fs-safe.js.map +1 -0
- package/dist/utils/cli-kit/index.d.ts +15 -0
- package/dist/utils/cli-kit/index.d.ts.map +1 -0
- package/dist/utils/cli-kit/index.js +10 -0
- package/dist/utils/cli-kit/index.js.map +1 -0
- package/dist/utils/cli-kit/json-file.d.ts +21 -0
- package/dist/utils/cli-kit/json-file.d.ts.map +1 -0
- package/dist/utils/cli-kit/json-file.js +51 -0
- package/dist/utils/cli-kit/json-file.js.map +1 -0
- package/dist/utils/cli-kit/marker-block.d.ts +26 -0
- package/dist/utils/cli-kit/marker-block.d.ts.map +1 -0
- package/dist/utils/cli-kit/marker-block.js +61 -0
- package/dist/utils/cli-kit/marker-block.js.map +1 -0
- package/dist/utils/cli-kit/paths.d.ts +15 -0
- package/dist/utils/cli-kit/paths.d.ts.map +1 -0
- package/dist/utils/cli-kit/paths.js +21 -0
- package/dist/utils/cli-kit/paths.js.map +1 -0
- package/dist/utils/cli-kit/secure-storage.d.ts +14 -0
- package/dist/utils/cli-kit/secure-storage.d.ts.map +1 -0
- package/dist/utils/cli-kit/secure-storage.js +20 -0
- package/dist/utils/cli-kit/secure-storage.js.map +1 -0
- package/dist/utils/cli-kit/step-report.d.ts +16 -0
- package/dist/utils/cli-kit/step-report.d.ts.map +1 -0
- package/dist/utils/cli-kit/step-report.js +36 -0
- package/dist/utils/cli-kit/step-report.js.map +1 -0
- package/dist/utils/dco/agent-metadata.d.ts +1 -1
- package/dist/utils/dco/agent-metadata.js +1 -1
- package/dist/utils/dco/agent-metadata.js.map +1 -1
- package/dist/utils/dco/claude-config.d.ts +18 -14
- package/dist/utils/dco/claude-config.d.ts.map +1 -1
- package/dist/utils/dco/claude-config.js +31 -97
- package/dist/utils/dco/claude-config.js.map +1 -1
- package/dist/utils/dco/dispatch.d.ts +134 -0
- package/dist/utils/dco/dispatch.d.ts.map +1 -0
- package/dist/utils/dco/dispatch.js +399 -0
- package/dist/utils/dco/dispatch.js.map +1 -0
- package/dist/utils/dco/fix.d.ts +122 -0
- package/dist/utils/dco/fix.d.ts.map +1 -0
- package/dist/utils/dco/fix.js +560 -0
- package/dist/utils/dco/fix.js.map +1 -0
- package/dist/utils/dco/git-config.d.ts.map +1 -1
- package/dist/utils/dco/git-config.js +5 -3
- package/dist/utils/dco/git-config.js.map +1 -1
- package/dist/utils/dco/github.d.ts +101 -0
- package/dist/utils/dco/github.d.ts.map +1 -1
- package/dist/utils/dco/github.js +133 -0
- package/dist/utils/dco/github.js.map +1 -1
- package/dist/utils/dco/paths.d.ts +1 -8
- package/dist/utils/dco/paths.d.ts.map +1 -1
- package/dist/utils/dco/paths.js +3 -12
- package/dist/utils/dco/paths.js.map +1 -1
- package/dist/utils/dco/render.d.ts +1 -1
- package/dist/utils/dco/render.d.ts.map +1 -1
- package/dist/utils/dco/render.js +4 -21
- package/dist/utils/dco/render.js.map +1 -1
- package/dist/utils/dco/resolve-agent.d.ts +54 -0
- package/dist/utils/dco/resolve-agent.d.ts.map +1 -0
- package/dist/utils/dco/resolve-agent.js +164 -0
- package/dist/utils/dco/resolve-agent.js.map +1 -0
- package/dist/utils/dco/setup.d.ts +10 -7
- package/dist/utils/dco/setup.d.ts.map +1 -1
- package/dist/utils/dco/setup.js +264 -200
- package/dist/utils/dco/setup.js.map +1 -1
- package/dist/utils/dco/signing-key-writer.d.ts +40 -0
- package/dist/utils/dco/signing-key-writer.d.ts.map +1 -0
- package/dist/utils/dco/signing-key-writer.js +76 -0
- package/dist/utils/dco/signing-key-writer.js.map +1 -0
- package/dist/utils/dco/ssh-key.d.ts +50 -0
- package/dist/utils/dco/ssh-key.d.ts.map +1 -1
- package/dist/utils/dco/ssh-key.js +129 -8
- package/dist/utils/dco/ssh-key.js.map +1 -1
- package/dist/utils/dco/status.d.ts +1 -1
- package/dist/utils/dco/status.d.ts.map +1 -1
- package/dist/utils/dco/status.js +3 -3
- package/dist/utils/dco/status.js.map +1 -1
- package/dist/utils/dco/verify.d.ts +170 -0
- package/dist/utils/dco/verify.d.ts.map +1 -0
- package/dist/utils/dco/verify.js +550 -0
- package/dist/utils/dco/verify.js.map +1 -0
- package/dist/utils/dependency-installer.d.ts +37 -0
- package/dist/utils/dependency-installer.d.ts.map +1 -0
- package/dist/utils/dependency-installer.js +32 -0
- package/dist/utils/dependency-installer.js.map +1 -0
- package/dist/utils/github-credential-stage.d.ts +87 -0
- package/dist/utils/github-credential-stage.d.ts.map +1 -0
- package/dist/utils/github-credential-stage.js +168 -0
- package/dist/utils/github-credential-stage.js.map +1 -0
- package/dist/utils/github-credential.d.ts +160 -0
- package/dist/utils/github-credential.d.ts.map +1 -0
- package/dist/utils/github-credential.js +308 -0
- package/dist/utils/github-credential.js.map +1 -0
- package/dist/utils/gitignore.d.ts +17 -0
- package/dist/utils/gitignore.d.ts.map +1 -0
- package/dist/utils/gitignore.js +40 -0
- package/dist/utils/gitignore.js.map +1 -0
- package/dist/utils/hub-config.d.ts +21 -0
- package/dist/utils/hub-config.d.ts.map +1 -0
- package/dist/utils/hub-config.js +28 -0
- package/dist/utils/hub-config.js.map +1 -0
- package/dist/utils/identity-heal.d.ts +16 -0
- package/dist/utils/identity-heal.d.ts.map +1 -0
- package/dist/utils/identity-heal.js +37 -0
- package/dist/utils/identity-heal.js.map +1 -0
- package/dist/utils/init/pipeline.d.ts +74 -0
- package/dist/utils/init/pipeline.d.ts.map +1 -0
- package/dist/utils/init/pipeline.js +96 -0
- package/dist/utils/init/pipeline.js.map +1 -0
- package/dist/utils/poll.d.ts +15 -1
- package/dist/utils/poll.d.ts.map +1 -1
- package/dist/utils/poll.js +6 -3
- package/dist/utils/poll.js.map +1 -1
- package/dist/utils/register-agent-identity.d.ts +67 -0
- package/dist/utils/register-agent-identity.d.ts.map +1 -0
- package/dist/utils/register-agent-identity.js +34 -0
- package/dist/utils/register-agent-identity.js.map +1 -0
- package/dist/utils/review/did-web-key.d.ts +34 -0
- package/dist/utils/review/did-web-key.d.ts.map +1 -0
- package/dist/utils/review/did-web-key.js +104 -0
- package/dist/utils/review/did-web-key.js.map +1 -0
- package/dist/utils/review/load-registry.d.ts +33 -0
- package/dist/utils/review/load-registry.d.ts.map +1 -0
- package/dist/utils/review/load-registry.js +62 -0
- package/dist/utils/review/load-registry.js.map +1 -0
- package/dist/utils/review/verdict-verify.d.ts +43 -0
- package/dist/utils/review/verdict-verify.d.ts.map +1 -0
- package/dist/utils/review/verdict-verify.js +53 -0
- package/dist/utils/review/verdict-verify.js.map +1 -0
- package/dist/utils/review-registry-writer.d.ts +52 -0
- package/dist/utils/review-registry-writer.d.ts.map +1 -0
- package/dist/utils/review-registry-writer.js +79 -0
- package/dist/utils/review-registry-writer.js.map +1 -0
- package/dist/utils/should-install-dependency.d.ts +17 -0
- package/dist/utils/should-install-dependency.d.ts.map +1 -0
- package/dist/utils/should-install-dependency.js +25 -0
- package/dist/utils/should-install-dependency.js.map +1 -0
- package/dist/utils/tool-readiness.d.ts +57 -0
- package/dist/utils/tool-readiness.d.ts.map +1 -0
- package/dist/utils/tool-readiness.js +114 -0
- package/dist/utils/tool-readiness.js.map +1 -0
- package/dist/utils/which.d.ts +2 -0
- package/dist/utils/which.d.ts.map +1 -0
- package/dist/utils/which.js +22 -0
- package/dist/utils/which.js.map +1 -0
- package/dist/version.d.ts +15 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +29 -0
- package/dist/version.js.map +1 -0
- package/package.json +19 -6
- package/dist/utils/claim-polling.d.ts +0 -21
- package/dist/utils/claim-polling.d.ts.map +0 -1
- package/dist/utils/claim-polling.js.map +0 -1
- package/dist/utils/dco/fs-safe.d.ts +0 -14
- package/dist/utils/dco/fs-safe.d.ts.map +0 -1
- package/dist/utils/dco/fs-safe.js +0 -20
- package/dist/utils/dco/fs-safe.js.map +0 -1
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Anchoring a GitHub credential in the hub (review-loop P16, commit 3).
|
|
3
|
+
*
|
|
4
|
+
* Builds a signed `GithubCredentialAnchor` (see `@kya-os/contracts/handshake/
|
|
5
|
+
* github-credential-anchor.ts`) from a locally stored credential
|
|
6
|
+
* (`utils/github-credential.ts`) and delivers it to the configured hub over
|
|
7
|
+
* the SAME observer wire path `hub-observer.ts` speaks: `observe` hello,
|
|
8
|
+
* challenge, proof-of-possession -- see that file's module doc for why this
|
|
9
|
+
* package never imports `@kya-os/compute` and instead speaks the shared
|
|
10
|
+
* wire format directly. Unlike `HubObserver`, this is a ONE-SHOT
|
|
11
|
+
* connect/authenticate/submit/await-result/close, not a long-lived
|
|
12
|
+
* reconnecting subscription -- a different lifecycle for a different job,
|
|
13
|
+
* so it does not extend or wrap that class.
|
|
14
|
+
*
|
|
15
|
+
* The anchor is signed and the wire connection authenticated with the SAME
|
|
16
|
+
* key: the designated agent profile's signing key
|
|
17
|
+
* (`signingKeyPath(agentSlug)`, the exact file `dco setup`/`dco fix` already
|
|
18
|
+
* use -- see `ssh-key.ts`'s `parseEd25519SshPrivateKeyPem`). That is what
|
|
19
|
+
* lets the hub check "the anchor's proof verifies against the DID that
|
|
20
|
+
* authenticated this very connection" without a second key or a fresh
|
|
21
|
+
* resolution: the hub already knows this socket proved control of `did`
|
|
22
|
+
* before a single `credential_anchor` frame arrives.
|
|
23
|
+
*
|
|
24
|
+
* No hub configured, or the hub unreachable: the anchor is queued at
|
|
25
|
+
* `~/.mcpi/github/pending-anchor.json` (fingerprints and proof only -- by
|
|
26
|
+
* construction, since `GithubCredentialAnchorSchema` holds no secret) for a
|
|
27
|
+
* later `kya-os init` or P17's wrapper connection to deliver.
|
|
28
|
+
*
|
|
29
|
+
* @module cli/orchestrator/github-credential-anchor-sender
|
|
30
|
+
*/
|
|
31
|
+
import { existsSync, readFileSync, rmSync } from "node:fs";
|
|
32
|
+
import { join } from "node:path";
|
|
33
|
+
import WebSocket from "ws";
|
|
34
|
+
import { GithubCredentialAnchorMessageSchema, GithubCredentialAnchorResultSchema, GithubCredentialAnchorSchema, ObserverHelloSchema, getGithubCredentialAnchorSigningString, } from "@kya-os/contracts/handshake";
|
|
35
|
+
import { publicJwkFor, respondToObserverChallenge } from "./hub-observer.js";
|
|
36
|
+
import { parseEd25519SshPrivateKeyPem, signWithEd25519Seed } from "../utils/dco/ssh-key.js";
|
|
37
|
+
import { signingKeyPath } from "../utils/dco/paths.js";
|
|
38
|
+
import { ensureSecureDir, writeFileAtomicSafe } from "../utils/cli-kit/index.js";
|
|
39
|
+
import { credentialsDir } from "../utils/github-credential.js";
|
|
40
|
+
/**
|
|
41
|
+
* Derive the `ObserverIdentity` (did + raw Ed25519 seed) an agent profile
|
|
42
|
+
* signs and authenticates with, from its converted signing key file
|
|
43
|
+
* (`signingKeyPath(agentSlug)`, the same file `dco setup`/`dco fix` use).
|
|
44
|
+
* Shared by {@link buildGithubCredentialAnchor} (a fresh anchor's signer)
|
|
45
|
+
* and `github-credential-stage.ts` (re-authenticating to deliver a
|
|
46
|
+
* previously queued anchor, where no new anchor is being built) so both
|
|
47
|
+
* paths derive the SAME identity for the same profile from one place.
|
|
48
|
+
*/
|
|
49
|
+
export function identityForAgentProfile(agentDid, agentSlug, readSigningKeyPemImpl = (slug) => readFileSync(signingKeyPath(slug), "utf-8")) {
|
|
50
|
+
const pem = readSigningKeyPemImpl(agentSlug);
|
|
51
|
+
const { seed } = parseEd25519SshPrivateKeyPem(pem);
|
|
52
|
+
return { did: agentDid, privateKey: seed.toString("base64") };
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Build and sign a `GithubCredentialAnchor` for `credential`. Signing stays
|
|
56
|
+
* entirely inside this module -- callers never touch key material, only the
|
|
57
|
+
* finished anchor and the identity derived alongside it (matching how
|
|
58
|
+
* `dco fix.ts` keeps its Ed25519 seed scoped to one function, extended here
|
|
59
|
+
* to the one extra byproduct -- the wire identity -- that a second read of
|
|
60
|
+
* the same file would otherwise require).
|
|
61
|
+
*/
|
|
62
|
+
export function buildGithubCredentialAnchor(credential, fingerprints, params) {
|
|
63
|
+
const now = params.now ?? (() => new Date().toISOString());
|
|
64
|
+
const rest = {
|
|
65
|
+
githubLogin: credential.githubLogin,
|
|
66
|
+
tokenFingerprint: fingerprints.tokenFingerprint,
|
|
67
|
+
webhookSecretFingerprint: fingerprints.webhookSecretFingerprint,
|
|
68
|
+
scopes: credential.scopes,
|
|
69
|
+
agentDids: params.agentDids,
|
|
70
|
+
createdAt: now(),
|
|
71
|
+
...(params.supersedes ? { supersedes: params.supersedes } : {}),
|
|
72
|
+
};
|
|
73
|
+
const identity = params.readSigningKeyPemImpl
|
|
74
|
+
? identityForAgentProfile(params.agentDid, params.agentSlug, params.readSigningKeyPemImpl)
|
|
75
|
+
: identityForAgentProfile(params.agentDid, params.agentSlug);
|
|
76
|
+
const seed = Buffer.from(identity.privateKey, "base64");
|
|
77
|
+
const signingString = getGithubCredentialAnchorSigningString(rest);
|
|
78
|
+
const signature = signWithEd25519Seed(seed, Buffer.from(signingString, "utf8")).toString("base64url");
|
|
79
|
+
const anchor = GithubCredentialAnchorSchema.parse({
|
|
80
|
+
...rest,
|
|
81
|
+
proof: { alg: "Ed25519", signature },
|
|
82
|
+
});
|
|
83
|
+
return { anchor, identity };
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Connect to the hub as an authenticated observer, submit `anchor` once
|
|
87
|
+
* admitted, and resolve with whether the hub accepted it. Always settles
|
|
88
|
+
* (never hangs): a timeout, a socket error, or an early close all resolve
|
|
89
|
+
* `{ delivered: false, reason }` rather than rejecting -- the caller's
|
|
90
|
+
* fallback is "queue it locally," not "crash the init stage."
|
|
91
|
+
*/
|
|
92
|
+
export function sendGithubCredentialAnchor(anchor, options) {
|
|
93
|
+
return new Promise((resolve) => {
|
|
94
|
+
let settled = false;
|
|
95
|
+
let sentAnchor = false;
|
|
96
|
+
const wsFactory = options.wsFactory ?? ((endpoint) => new WebSocket(endpoint));
|
|
97
|
+
let ws;
|
|
98
|
+
try {
|
|
99
|
+
ws = wsFactory(options.endpoint);
|
|
100
|
+
}
|
|
101
|
+
catch (err) {
|
|
102
|
+
resolve({ delivered: false, reason: message(err) });
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
const finish = (result) => {
|
|
106
|
+
if (settled)
|
|
107
|
+
return;
|
|
108
|
+
settled = true;
|
|
109
|
+
clearTimeout(timer);
|
|
110
|
+
try {
|
|
111
|
+
ws.close();
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
/* already closing */
|
|
115
|
+
}
|
|
116
|
+
resolve(result);
|
|
117
|
+
};
|
|
118
|
+
const timer = setTimeout(() => {
|
|
119
|
+
finish({ delivered: false, reason: `hub at ${options.endpoint} did not respond in time` });
|
|
120
|
+
}, options.timeoutMs ?? 10000);
|
|
121
|
+
ws.on("open", () => {
|
|
122
|
+
try {
|
|
123
|
+
const hello = ObserverHelloSchema.parse({
|
|
124
|
+
type: "observe",
|
|
125
|
+
did: options.identity.did,
|
|
126
|
+
publicKey: publicJwkFor(options.identity),
|
|
127
|
+
});
|
|
128
|
+
ws.send(JSON.stringify(hello));
|
|
129
|
+
}
|
|
130
|
+
catch (err) {
|
|
131
|
+
finish({ delivered: false, reason: message(err) });
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
ws.on("error", (err) => finish({ delivered: false, reason: message(err) }));
|
|
135
|
+
ws.on("close", (code, reason) => {
|
|
136
|
+
finish({
|
|
137
|
+
delivered: false,
|
|
138
|
+
reason: `hub closed the connection (${code}${reason.length ? `: ${reason.toString()}` : ""})`,
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
ws.on("message", (raw) => {
|
|
142
|
+
void handleFrame(raw.toString());
|
|
143
|
+
});
|
|
144
|
+
async function handleFrame(text) {
|
|
145
|
+
if (settled)
|
|
146
|
+
return;
|
|
147
|
+
let msg;
|
|
148
|
+
try {
|
|
149
|
+
const parsed = JSON.parse(text);
|
|
150
|
+
if (typeof parsed !== "object" || parsed === null)
|
|
151
|
+
return;
|
|
152
|
+
msg = parsed;
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
return; // a frame we cannot parse is not a frame we can act on
|
|
156
|
+
}
|
|
157
|
+
if (msg["type"] === "challenge") {
|
|
158
|
+
try {
|
|
159
|
+
const frame = await respondToObserverChallenge(options.identity, msg);
|
|
160
|
+
if (frame)
|
|
161
|
+
ws.send(frame);
|
|
162
|
+
}
|
|
163
|
+
catch (err) {
|
|
164
|
+
finish({ delivered: false, reason: message(err) });
|
|
165
|
+
}
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
// "snapshot" is the observer-admission signal (see hub-observer.ts) --
|
|
169
|
+
// once it lands, this socket is authenticated and may submit.
|
|
170
|
+
if (msg["type"] === "snapshot" && !sentAnchor) {
|
|
171
|
+
sentAnchor = true;
|
|
172
|
+
try {
|
|
173
|
+
const anchorMessage = GithubCredentialAnchorMessageSchema.parse({
|
|
174
|
+
type: "credential_anchor",
|
|
175
|
+
anchor,
|
|
176
|
+
});
|
|
177
|
+
ws.send(JSON.stringify(anchorMessage));
|
|
178
|
+
}
|
|
179
|
+
catch (err) {
|
|
180
|
+
finish({ delivered: false, reason: message(err) });
|
|
181
|
+
}
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
if (msg["type"] === "credential_anchor_result") {
|
|
185
|
+
const result = GithubCredentialAnchorResultSchema.safeParse(msg);
|
|
186
|
+
if (!result.success) {
|
|
187
|
+
finish({ delivered: false, reason: "malformed credential_anchor_result frame from hub" });
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
finish(result.data.ok
|
|
191
|
+
? { delivered: true }
|
|
192
|
+
: { delivered: false, reason: result.data.error ?? "hub rejected the anchor" });
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
function message(err) {
|
|
198
|
+
return err instanceof Error ? err.message : String(err);
|
|
199
|
+
}
|
|
200
|
+
// ── Pending queue (offline path) ───────────────────────────────────────
|
|
201
|
+
/** ~/.mcpi/github/pending-anchor.json -- fingerprints and proof only; no secrets by construction. */
|
|
202
|
+
export function pendingAnchorPath() {
|
|
203
|
+
return join(credentialsDir(), "pending-anchor.json");
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Queue `anchor` (signed by `signerDid`) at {@link pendingAnchorPath}.
|
|
207
|
+
* Never throws: a real filesystem error here (permissions, ENOSPC)
|
|
208
|
+
* degrades to a reported failure rather than propagating, matching
|
|
209
|
+
* {@link deliverGithubCredentialAnchor}'s own "never throws" contract -- a
|
|
210
|
+
* queue write is itself part of that degrade-to-pending path, not a
|
|
211
|
+
* separate one that could still blow past it.
|
|
212
|
+
*/
|
|
213
|
+
function writePendingAnchor(anchor, signerDid) {
|
|
214
|
+
try {
|
|
215
|
+
ensureSecureDir(credentialsDir());
|
|
216
|
+
const record = { anchor, signerDid };
|
|
217
|
+
writeFileAtomicSafe(pendingAnchorPath(), JSON.stringify(record, null, 2) + "\n", 0o600);
|
|
218
|
+
return { ok: true };
|
|
219
|
+
}
|
|
220
|
+
catch (err) {
|
|
221
|
+
return { ok: false, reason: message(err) };
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
/** The queued anchor and its signer, or undefined if none is pending (or the file is unreadable/corrupt). */
|
|
225
|
+
export function readPendingAnchor() {
|
|
226
|
+
const path = pendingAnchorPath();
|
|
227
|
+
if (!existsSync(path))
|
|
228
|
+
return undefined;
|
|
229
|
+
try {
|
|
230
|
+
const parsed = JSON.parse(readFileSync(path, "utf-8"));
|
|
231
|
+
if (!parsed || typeof parsed !== "object")
|
|
232
|
+
return undefined;
|
|
233
|
+
const { anchor, signerDid } = parsed;
|
|
234
|
+
if (typeof signerDid !== "string" || signerDid.length === 0)
|
|
235
|
+
return undefined;
|
|
236
|
+
const result = GithubCredentialAnchorSchema.safeParse(anchor);
|
|
237
|
+
return result.success ? { anchor: result.data, signerDid } : undefined;
|
|
238
|
+
}
|
|
239
|
+
catch {
|
|
240
|
+
return undefined;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
export function clearPendingAnchor() {
|
|
244
|
+
rmSync(pendingAnchorPath(), { force: true });
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Deliver `anchor` to the hub if one is configured and reachable; otherwise
|
|
248
|
+
* queue it at {@link pendingAnchorPath} and exit cleanly. Never throws --
|
|
249
|
+
* every failure mode degrades to "pending," which is exactly the offline
|
|
250
|
+
* path the init stage needs to complete without a hub.
|
|
251
|
+
*/
|
|
252
|
+
export async function deliverGithubCredentialAnchor(anchor, identity, options = {}) {
|
|
253
|
+
const onNotice = options.onNotice ?? (() => { });
|
|
254
|
+
if (!options.hubEndpoint) {
|
|
255
|
+
const queued = writePendingAnchor(anchor, identity.did);
|
|
256
|
+
onNotice(queued.ok
|
|
257
|
+
? "No hub configured -- the GitHub credential anchor is pending and will be delivered on a later `kya-os init`."
|
|
258
|
+
: `No hub configured, and the anchor could not even be queued locally (${queued.reason}) -- the credential itself is still saved, but re-run \`kya-os init\` once this is fixed.`);
|
|
259
|
+
return { status: "pending", reason: "no hub configured" };
|
|
260
|
+
}
|
|
261
|
+
const sendImpl = options.sendImpl ?? sendGithubCredentialAnchor;
|
|
262
|
+
const result = await sendImpl(anchor, { endpoint: options.hubEndpoint, identity });
|
|
263
|
+
if (result.delivered) {
|
|
264
|
+
clearPendingAnchor();
|
|
265
|
+
return { status: "delivered" };
|
|
266
|
+
}
|
|
267
|
+
const queued = writePendingAnchor(anchor, identity.did);
|
|
268
|
+
onNotice(queued.ok
|
|
269
|
+
? `Could not deliver the GitHub credential anchor to the hub (${result.reason}) -- it is pending.`
|
|
270
|
+
: `Could not deliver the GitHub credential anchor to the hub (${result.reason}), and it could not even be queued locally (${queued.reason}) -- the credential itself is still saved, but re-run \`kya-os init\` once this is fixed.`);
|
|
271
|
+
return { status: "pending", reason: result.reason };
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Attempt delivery of a previously queued anchor (e.g. from a later
|
|
275
|
+
* `kya-os init`, or P17's wrapper connection). A no-op, reported distinctly,
|
|
276
|
+
* when nothing is queued.
|
|
277
|
+
*
|
|
278
|
+
* `resolveIdentity` maps the queued anchor's recorded `signerDid` to that
|
|
279
|
+
* profile's CURRENT identity -- never a caller-guessed one. `listProfiles()`
|
|
280
|
+
* has no defined order (`readdirSync`), so "the first profile on the
|
|
281
|
+
* machine" today is not reliably the profile that signed a PRIOR anchor;
|
|
282
|
+
* looking it up by the DID actually recorded at queue time is what makes
|
|
283
|
+
* this retry succeed instead of failing proof verification against the
|
|
284
|
+
* wrong key. Never throws, matching every other function in this module's
|
|
285
|
+
* "degrade to pending" contract: `resolveIdentity` typically ends up
|
|
286
|
+
* calling {@link identityForAgentProfile}, which reads a signing key file
|
|
287
|
+
* off disk and throws if it's missing or unreadable -- a real possibility
|
|
288
|
+
* (deleted, corrupted, permissions) that must fall through to "pending"
|
|
289
|
+
* exactly like a resolved-but-unusable identity, not crash the caller.
|
|
290
|
+
*/
|
|
291
|
+
export async function deliverPendingGithubCredentialAnchor(resolveIdentity, options = {}) {
|
|
292
|
+
const pending = readPendingAnchor();
|
|
293
|
+
if (!pending)
|
|
294
|
+
return { status: "none" };
|
|
295
|
+
let identity;
|
|
296
|
+
let resolveError;
|
|
297
|
+
try {
|
|
298
|
+
identity = resolveIdentity(pending.signerDid);
|
|
299
|
+
}
|
|
300
|
+
catch (err) {
|
|
301
|
+
resolveError = message(err);
|
|
302
|
+
}
|
|
303
|
+
if (!identity) {
|
|
304
|
+
const onNotice = options.onNotice ?? (() => { });
|
|
305
|
+
const reason = resolveError
|
|
306
|
+
? `the signing profile (${pending.signerDid}) could not be loaded (${resolveError})`
|
|
307
|
+
: `the signing profile (${pending.signerDid}) is no longer on this machine`;
|
|
308
|
+
onNotice(`Cannot retry delivering the queued GitHub credential anchor: ${reason}.`);
|
|
309
|
+
return { status: "pending", reason: `signer profile ${pending.signerDid} unresolvable: ${reason}` };
|
|
310
|
+
}
|
|
311
|
+
return deliverGithubCredentialAnchor(pending.anchor, identity, options);
|
|
312
|
+
}
|
|
313
|
+
//# sourceMappingURL=github-credential-anchor-sender.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-credential-anchor-sender.js","sourceRoot":"","sources":["../../src/orchestrator/github-credential-anchor-sender.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The TUI's one control-plane action (review-loop P18 commit 4): dispatch
|
|
3
|
+
* a task to a connected agent.
|
|
4
|
+
*
|
|
5
|
+
* Trust boundary: this opens a short-lived, authenticated observer
|
|
6
|
+
* connection -- the SAME wire pattern `hub-observer.ts`'s long-lived
|
|
7
|
+
* `HubObserver` uses (contracts `./handshake`'s hello/challenge/proof
|
|
8
|
+
* frames, the #686 precedent), reusing its exported helpers rather than
|
|
9
|
+
* re-deriving the handshake. It sends exactly one `fleet.dispatch` frame,
|
|
10
|
+
* waits for exactly one `fleet.dispatch.result`, and closes -- no
|
|
11
|
+
* reconnect, no history, no long-lived state, because a TUI keystroke is
|
|
12
|
+
* a single request, not a subscription.
|
|
13
|
+
*
|
|
14
|
+
* `fleet.dispatch` here is NOT `@kya-os/compute`'s HTTP `fleet-mcp`
|
|
15
|
+
* surface (`packages/compute/src/didcomm/fleet-mcp.ts`), which is bearer-
|
|
16
|
+
* token/org-scoped and has no notion of a per-agent signing key. It is
|
|
17
|
+
* the wire-level message `packages/compute/src/didcomm/hub.ts` already
|
|
18
|
+
* handles directly on an admitted OBSERVER socket
|
|
19
|
+
* (`ws.on("message", ...)` inside `transport.onObserver`): a JSON frame
|
|
20
|
+
* `{ type: "fleet.dispatch", taskId, toDid, description, context?,
|
|
21
|
+
* timeoutMs? }`, answered with `{ type: "fleet.dispatch.result", taskId,
|
|
22
|
+
* status, response?, error?, ... }`. Reusing this existing hub-side
|
|
23
|
+
* handler is why this file adds nothing to `@kya-os/contracts` or
|
|
24
|
+
* `@kya-os/compute` -- the wire shape already exists and this PR's
|
|
25
|
+
* `Package:` line is `@kya-os/cli` alone.
|
|
26
|
+
*
|
|
27
|
+
* The hub proposes, the target's on-disk command allowlist (P17, epic
|
|
28
|
+
* decision 10) disposes: a refusal comes back as an ordinary
|
|
29
|
+
* `fleet.dispatch.result` with a non-"completed" status, which the caller
|
|
30
|
+
* renders as a refusal, not an error (see `AgentsView`'s handling of
|
|
31
|
+
* `status === "refused"`).
|
|
32
|
+
*
|
|
33
|
+
* @module cli/orchestrator/hub-dispatch
|
|
34
|
+
*/
|
|
35
|
+
import WebSocket from "ws";
|
|
36
|
+
import { type ObserverIdentity } from "./hub-observer.js";
|
|
37
|
+
import type { AgentProfile } from "../utils/agent-profiles.js";
|
|
38
|
+
export interface DispatchWireResult {
|
|
39
|
+
taskId: string;
|
|
40
|
+
status: string;
|
|
41
|
+
response?: string;
|
|
42
|
+
error?: string;
|
|
43
|
+
ok: boolean;
|
|
44
|
+
}
|
|
45
|
+
export interface DispatchTaskConfig {
|
|
46
|
+
/** e.g. `ws://127.0.0.1:18821` or `wss://did-web-knowthat-ai-hub.fly.dev:4000`. */
|
|
47
|
+
endpoint: string;
|
|
48
|
+
/** Omit to connect anonymously, which only a loopback hub will accept. */
|
|
49
|
+
identity?: ObserverIdentity;
|
|
50
|
+
/** How long to wait for the observer handshake (hello/challenge/proof + snapshot). */
|
|
51
|
+
handshakeTimeoutMs?: number;
|
|
52
|
+
/** How long to wait for the fleet.dispatch.result frame once dispatched. */
|
|
53
|
+
dispatchTimeoutMs?: number;
|
|
54
|
+
/** Injectable transport seam for tests; defaults to the real `ws` client. */
|
|
55
|
+
wsFactory?: (endpoint: string) => WebSocket;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Opens one observer connection, authenticates if asked to, sends one
|
|
59
|
+
* `fleet.dispatch` frame for `targetDid`/`command`, and resolves with its
|
|
60
|
+
* `fleet.dispatch.result` -- or rejects on a connection/handshake/timeout
|
|
61
|
+
* failure. Always closes the socket before settling, on every path.
|
|
62
|
+
*/
|
|
63
|
+
export declare function dispatchTask(config: DispatchTaskConfig, targetDid: string, command: string): Promise<DispatchWireResult>;
|
|
64
|
+
/**
|
|
65
|
+
* Is this endpoint loopback-only? Mirrors `isPlaintextNonLoopback`'s host
|
|
66
|
+
* set but answers a different question: that function asks "is this
|
|
67
|
+
* unencrypted AND remote" (a warn-but-allow case); this asks "is this
|
|
68
|
+
* unreachable from anywhere but this machine" (the ONLY case where
|
|
69
|
+
* connecting with no identity at all -- `--anonymous`-equivalent -- is
|
|
70
|
+
* appropriate for a write action like dispatch).
|
|
71
|
+
*/
|
|
72
|
+
export declare function isLoopbackEndpoint(endpoint: string): boolean;
|
|
73
|
+
/**
|
|
74
|
+
* Builds the identity used to authenticate the dispatch connection, from
|
|
75
|
+
* the profile whose row is focused in the TUI. Every profile's key
|
|
76
|
+
* lives under `~/.mcpi/keys/<slug>` in the SSH-signing format
|
|
77
|
+
* `dco setup` writes (see `signing-key-writer.ts`); profiles never
|
|
78
|
+
* persist a raw seed on disk, so the seed is recovered from that SSH
|
|
79
|
+
* key via the same parser `dco fix` already uses to sign a fix
|
|
80
|
+
* attestation from the same file (`parseEd25519SshPrivateKeyPem`) rather
|
|
81
|
+
* than adding a second place that stores key material.
|
|
82
|
+
*
|
|
83
|
+
* Authenticating AS the profile being dispatched to -- rather than some
|
|
84
|
+
* separate "which of my identities is primary" concept, which does not
|
|
85
|
+
* exist anywhere else in this codebase -- is a deliberate scope
|
|
86
|
+
* decision: every profile under `~/.mcpi/keys/` belongs to the one
|
|
87
|
+
* operator running this TUI, so proving control of the row already in
|
|
88
|
+
* view is sufficient authorization and needs no new concept.
|
|
89
|
+
*
|
|
90
|
+
* Undefined if the key file is missing or not in the format this
|
|
91
|
+
* codebase writes -- the caller falls back to loopback-only anonymous
|
|
92
|
+
* dispatch in that case, matching `orchestrator daemon`'s own
|
|
93
|
+
* `--anonymous` precedent.
|
|
94
|
+
*/
|
|
95
|
+
export declare function resolveProfileIdentity(profile: AgentProfile): ObserverIdentity | undefined;
|
|
96
|
+
export interface DispatchOutcome {
|
|
97
|
+
ok: boolean;
|
|
98
|
+
status: string;
|
|
99
|
+
detail?: string;
|
|
100
|
+
/**
|
|
101
|
+
* Set when `hubConfig.endpoint` is plaintext `ws://` to a non-loopback
|
|
102
|
+
* host: the same condition `orchestrator daemon` (`commands/
|
|
103
|
+
* orchestrator.ts`) warns about before attaching with a real identity,
|
|
104
|
+
* via the same `isPlaintextNonLoopback` helper. Surfaced through the
|
|
105
|
+
* outcome rather than a raw `console.warn` because this call happens
|
|
106
|
+
* from inside an active Ink render -- an unmediated console write here
|
|
107
|
+
* would corrupt the TUI's own screen buffer instead of reaching the user.
|
|
108
|
+
*/
|
|
109
|
+
warning?: string;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* The TUI-facing entry point: resolve the hub and the dispatching
|
|
113
|
+
* identity, dispatch, and reduce every failure mode (no hub configured,
|
|
114
|
+
* no usable key on a non-loopback hub, a transport/handshake error) to
|
|
115
|
+
* the same `DispatchOutcome` shape the agents view renders -- so the UI
|
|
116
|
+
* never has to distinguish "the wire call threw" from "the wire call
|
|
117
|
+
* returned an unhappy status".
|
|
118
|
+
*/
|
|
119
|
+
export declare function dispatchToProfile(profile: AgentProfile, command: string, wsFactory?: DispatchTaskConfig["wsFactory"]): Promise<DispatchOutcome>;
|
|
120
|
+
//# sourceMappingURL=hub-dispatch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hub-dispatch.d.ts","sourceRoot":"","sources":["../../src/orchestrator/hub-dispatch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAIH,OAAO,SAAS,MAAM,IAAI,CAAC;AAE3B,OAAO,EAKL,KAAK,gBAAgB,EACtB,MAAM,mBAAmB,CAAC;AAI3B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE/D,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,OAAO,CAAC;CACb;AAED,MAAM,WAAW,kBAAkB;IACjC,mFAAmF;IACnF,QAAQ,EAAE,MAAM,CAAC;IACjB,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,sFAAsF;IACtF,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,4EAA4E;IAC5E,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,6EAA6E;IAC7E,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,SAAS,CAAC;CAC7C;AAKD;;;;;GAKG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,kBAAkB,EAC1B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,kBAAkB,CAAC,CA+H7B;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAM5D;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,YAAY,GAAG,gBAAgB,GAAG,SAAS,CAQ1F;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;;;;;OAQG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,YAAY,EACrB,OAAO,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,kBAAkB,CAAC,WAAW,CAAC,GAC1C,OAAO,CAAC,eAAe,CAAC,CAmC1B"}
|