@wjarka/cezarion 0.16.0 → 0.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -0
- package/README.md +594 -207
- package/dist/agent-config/account-identity.d.ts +3 -19
- package/dist/agent-config/account-identity.js +8 -5
- package/dist/agent-config/account-identity.js.map +1 -1
- package/dist/agent-config/catalog.d.ts +3 -14
- package/dist/agent-config/catalog.js.map +1 -1
- package/dist/agent-config/files.d.ts +2 -6
- package/dist/agent-config/files.js +2 -6
- package/dist/agent-config/files.js.map +1 -1
- package/dist/agent-config/model-settings/types.d.ts +1 -1
- package/dist/agent-config/seed.d.ts +11 -3
- package/dist/agent-config/seed.js +52 -48
- package/dist/agent-config/seed.js.map +1 -1
- package/dist/agent-config/service.js +3 -2
- package/dist/agent-config/service.js.map +1 -1
- package/dist/agent-config/validate.d.ts +1 -4
- package/dist/agent-config/validate.js.map +1 -1
- package/dist/application-update/helper.d.ts +2 -2
- package/dist/application-update/helper.js +7 -12
- package/dist/application-update/helper.js.map +1 -1
- package/dist/application-update/launcher.d.ts +4 -0
- package/dist/application-update/launcher.js +18 -12
- package/dist/application-update/launcher.js.map +1 -1
- package/dist/application-update/service.d.ts +3 -3
- package/dist/application-update/service.js +1 -1
- package/dist/application-update/service.js.map +1 -1
- package/dist/archive-on-merge-setting.d.ts +15 -0
- package/dist/archive-on-merge-setting.js +14 -0
- package/dist/archive-on-merge-setting.js.map +1 -0
- package/dist/artifacts/cli.d.ts +8 -0
- package/dist/artifacts/cli.js +21 -2
- package/dist/artifacts/cli.js.map +1 -1
- package/dist/artifacts/resolve.js +2 -1
- package/dist/artifacts/resolve.js.map +1 -1
- package/dist/artifacts/store.js.map +1 -1
- package/dist/automations/automation-cli.d.ts +59 -0
- package/dist/automations/automation-cli.js +509 -0
- package/dist/automations/automation-cli.js.map +1 -0
- package/dist/automations/builtin-skill.d.ts +7 -0
- package/dist/automations/builtin-skill.js +14 -0
- package/dist/automations/builtin-skill.js.map +1 -0
- package/dist/automations/github-baseline.d.ts +3 -0
- package/dist/automations/github-baseline.js +17 -0
- package/dist/automations/github-baseline.js.map +1 -0
- package/dist/automations/github-poller.d.ts +23 -4
- package/dist/automations/github-poller.js +157 -88
- package/dist/automations/github-poller.js.map +1 -1
- package/dist/automations/prompts.d.ts +12 -0
- package/dist/automations/prompts.js +160 -0
- package/dist/automations/prompts.js.map +1 -0
- package/dist/automations/schedule-runner.d.ts +43 -24
- package/dist/automations/schedule-runner.js +207 -20
- package/dist/automations/schedule-runner.js.map +1 -1
- package/dist/automations/scheduler.d.ts +10 -2
- package/dist/automations/scheduler.js +200 -54
- package/dist/automations/scheduler.js.map +1 -1
- package/dist/automations/service.d.ts +777 -0
- package/dist/automations/service.js +444 -0
- package/dist/automations/service.js.map +1 -0
- package/dist/automations/store.d.ts +17 -7
- package/dist/automations/store.js +88 -17
- package/dist/automations/store.js.map +1 -1
- package/dist/automations/task-template.d.ts +7 -2
- package/dist/automations/task-template.js +93 -44
- package/dist/automations/task-template.js.map +1 -1
- package/dist/automations/tool-adapter.d.ts +6 -0
- package/dist/automations/tool-adapter.js +108 -0
- package/dist/automations/tool-adapter.js.map +1 -0
- package/dist/automations/types.d.ts +1 -405
- package/dist/automations/types.js +1 -218
- package/dist/automations/types.js.map +1 -1
- package/dist/autosave-cleanup.d.ts +26 -0
- package/dist/autosave-cleanup.js +87 -0
- package/dist/autosave-cleanup.js.map +1 -0
- package/dist/autosave-git.d.ts +3 -0
- package/dist/autosave-git.js +67 -35
- package/dist/autosave-git.js.map +1 -1
- package/dist/autosave-group.d.ts +8 -0
- package/dist/autosave-group.js +61 -0
- package/dist/autosave-group.js.map +1 -0
- package/dist/autosave-holders.d.ts +31 -4
- package/dist/autosave-holders.js +92 -7
- package/dist/autosave-holders.js.map +1 -1
- package/dist/autosave-windows.d.ts +14 -0
- package/dist/autosave-windows.js +36 -2
- package/dist/autosave-windows.js.map +1 -1
- package/dist/ci-wait/client.d.ts +20 -3
- package/dist/ci-wait/client.js +40 -44
- package/dist/ci-wait/client.js.map +1 -1
- package/dist/ci-wait/controller.d.ts +622 -36
- package/dist/ci-wait/controller.js +152 -20
- package/dist/ci-wait/controller.js.map +1 -1
- package/dist/ci-wait/errors.d.ts +19 -0
- package/dist/ci-wait/errors.js +180 -2
- package/dist/ci-wait/errors.js.map +1 -1
- package/dist/ci-wait/github.d.ts +25 -1
- package/dist/ci-wait/github.js +76 -9
- package/dist/ci-wait/github.js.map +1 -1
- package/dist/ci-wait/mcp.d.ts +0 -1
- package/dist/ci-wait/mcp.js +0 -2
- package/dist/ci-wait/mcp.js.map +1 -1
- package/dist/ci-wait/supervisor.d.ts +7 -0
- package/dist/ci-wait/supervisor.js +113 -17
- package/dist/ci-wait/supervisor.js.map +1 -1
- package/dist/ci-wait/tools.d.ts +536 -16
- package/dist/ci-wait/tools.js +165 -20
- package/dist/ci-wait/tools.js.map +1 -1
- package/dist/config.d.ts +3 -17
- package/dist/config.js +4 -60
- package/dist/config.js.map +1 -1
- package/dist/contract/active-provider.d.ts +12 -0
- package/dist/contract/agent-profiles.d.ts +2 -10
- package/dist/contract/ask-schema.d.ts +22 -4
- package/dist/contract/ask.d.ts +6 -4
- package/dist/contract/attachments.d.ts +35 -0
- package/dist/contract/attention.d.ts +46 -37
- package/dist/contract/automation-requests.d.ts +308 -0
- package/dist/contract/automation-schedule.d.ts +40 -11
- package/dist/contract/automation-storage.d.ts +512 -0
- package/dist/contract/automations.d.ts +421 -40
- package/dist/contract/ci-wait.d.ts +41 -4
- package/dist/contract/config-requests.d.ts +36 -0
- package/dist/contract/conversations.d.ts +24 -10
- package/dist/contract/defined.d.ts +8 -0
- package/dist/contract/delegation.d.ts +312 -8
- package/dist/contract/events.d.ts +24 -3
- package/dist/contract/github-requests.d.ts +26 -0
- package/dist/contract/github.d.ts +60 -27
- package/dist/contract/handoff.d.ts +43 -0
- package/dist/contract/health.d.ts +2 -2
- package/dist/contract/image-path.d.ts +6 -0
- package/dist/contract/index.d.ts +31 -0
- package/dist/contract/index.js +3756 -1525
- package/dist/contract/live-coordination.d.ts +158 -0
- package/dist/contract/live-limits.d.ts +8 -0
- package/dist/contract/live.d.ts +123 -0
- package/dist/contract/pending-ask.d.ts +58 -0
- package/dist/contract/permissions.d.ts +54 -0
- package/dist/contract/preview.d.ts +33 -0
- package/dist/contract/project-limits.d.ts +33 -0
- package/dist/contract/projects.d.ts +486 -20
- package/dist/contract/provider-requests.d.ts +77 -0
- package/dist/contract/query-requests.d.ts +52 -0
- package/dist/contract/repo-requests.d.ts +12 -0
- package/dist/contract/run-labels.d.ts +8 -0
- package/dist/contract/run-limits.d.ts +8 -0
- package/dist/contract/run-predicates.d.ts +32 -0
- package/dist/contract/run-requests.d.ts +33 -0
- package/dist/contract/run-search.d.ts +193 -0
- package/dist/contract/runs.d.ts +2232 -1894
- package/dist/contract/scheduled-tasks.d.ts +187 -0
- package/dist/contract/skills.d.ts +22 -772
- package/dist/contract/team-skill-ref.d.ts +10 -0
- package/dist/{core → contract}/tool-display.d.ts +4 -10
- package/dist/contract/ui-state-requests.d.ts +60 -0
- package/dist/contract/version.d.ts +3 -0
- package/dist/contract/voice.d.ts +213 -0
- package/dist/contract/waits.d.ts +1204 -0
- package/dist/contract/workflow-file.d.ts +37 -0
- package/dist/contract/workflow-requests.d.ts +7 -0
- package/dist/contract/workflows.d.ts +1 -2
- package/dist/contract/workspace.d.ts +34 -82
- package/dist/contract/zoned-time.d.ts +2 -11
- package/dist/core/agent-env.d.ts +4 -16
- package/dist/core/agent-env.js +14 -16
- package/dist/core/agent-env.js.map +1 -1
- package/dist/core/agent-profiles.d.ts +28 -40
- package/dist/core/agent-profiles.js +56 -51
- package/dist/core/agent-profiles.js.map +1 -1
- package/dist/core/agent-runner.d.ts +88 -44
- package/dist/core/agent-runner.js +17 -18
- package/dist/core/agent-runner.js.map +1 -1
- package/dist/core/ask.d.ts +3 -0
- package/dist/core/ask.js +12 -0
- package/dist/core/ask.js.map +1 -1
- package/dist/core/backend-detect.js +16 -2
- package/dist/core/backend-detect.js.map +1 -1
- package/dist/core/claude-cli-runner.d.ts +23 -4
- package/dist/core/claude-cli-runner.js +280 -76
- package/dist/core/claude-cli-runner.js.map +1 -1
- package/dist/core/claude-model-catalog.d.ts +2 -10
- package/dist/core/claude-model-catalog.js +2 -10
- package/dist/core/claude-model-catalog.js.map +1 -1
- package/dist/core/claude-ui-mapper.d.ts +2 -2
- package/dist/core/claude-ui-mapper.js +94 -2
- package/dist/core/claude-ui-mapper.js.map +1 -1
- package/dist/core/codex-app-server-runner.d.ts +3 -4
- package/dist/core/codex-app-server-runner.js +146 -51
- package/dist/core/codex-app-server-runner.js.map +1 -1
- package/dist/core/codex-app-server-transport.d.ts +4 -3
- package/dist/core/codex-app-server-transport.js +11 -7
- package/dist/core/codex-app-server-transport.js.map +1 -1
- package/dist/core/codex-approvals.d.ts +12 -0
- package/dist/core/codex-approvals.js +161 -0
- package/dist/core/codex-approvals.js.map +1 -0
- package/dist/core/codex-permissions.d.ts +1 -1
- package/dist/core/codex-ui-mapper.js +45 -1
- package/dist/core/codex-ui-mapper.js.map +1 -1
- package/dist/core/cursor-acp-runner.d.ts +1 -1
- package/dist/core/cursor-acp-runner.js +39 -15
- package/dist/core/cursor-acp-runner.js.map +1 -1
- package/dist/core/cursor-cli-flags.d.ts +19 -0
- package/dist/core/cursor-cli-flags.js +47 -0
- package/dist/core/cursor-cli-flags.js.map +1 -0
- package/dist/core/cursor-model-catalog.d.ts +22 -0
- package/dist/core/cursor-model-catalog.js +53 -24
- package/dist/core/cursor-model-catalog.js.map +1 -1
- package/dist/core/cursor-print-capabilities.d.ts +16 -0
- package/dist/core/cursor-print-capabilities.js +141 -0
- package/dist/core/cursor-print-capabilities.js.map +1 -0
- package/dist/core/cursor-print-process.d.ts +31 -0
- package/dist/core/cursor-print-process.js +117 -0
- package/dist/core/cursor-print-process.js.map +1 -0
- package/dist/core/cursor-print-runner.d.ts +31 -0
- package/dist/core/cursor-print-runner.js +555 -0
- package/dist/core/cursor-print-runner.js.map +1 -0
- package/dist/core/cursor-print-tool-catalog.d.ts +10 -0
- package/dist/core/cursor-print-tool-catalog.js +91 -0
- package/dist/core/cursor-print-tool-catalog.js.map +1 -0
- package/dist/core/cursor-print-ui-mapper.d.ts +47 -0
- package/dist/core/cursor-print-ui-mapper.js +553 -0
- package/dist/core/cursor-print-ui-mapper.js.map +1 -0
- package/dist/core/cursor-runner.d.ts +24 -0
- package/dist/core/cursor-runner.js +149 -0
- package/dist/core/cursor-runner.js.map +1 -0
- package/dist/core/cursor-ui-mapper.js +5 -2
- package/dist/core/cursor-ui-mapper.js.map +1 -1
- package/dist/core/defined.d.ts +1 -0
- package/dist/core/defined.js +2 -0
- package/dist/core/defined.js.map +1 -0
- package/dist/core/hook-items.d.ts +14 -0
- package/dist/core/hook-items.js +13 -0
- package/dist/core/hook-items.js.map +1 -0
- package/dist/core/host-model-catalog.d.ts +2 -9
- package/dist/core/host-model-catalog.js +2 -9
- package/dist/core/host-model-catalog.js.map +1 -1
- package/dist/core/managed-session.js +15 -3
- package/dist/core/managed-session.js.map +1 -1
- package/dist/core/model-identity.d.ts +4 -21
- package/dist/core/model-identity.js.map +1 -1
- package/dist/core/model-presets.d.ts +2 -13
- package/dist/core/model-presets.js +2 -13
- package/dist/core/model-presets.js.map +1 -1
- package/dist/core/omp-model-catalog.js.map +1 -1
- package/dist/core/omp-runner.d.ts +6 -7
- package/dist/core/omp-runner.js +92 -33
- package/dist/core/omp-runner.js.map +1 -1
- package/dist/core/omp-ui-mapper.js +1 -1
- package/dist/core/omp-ui-mapper.js.map +1 -1
- package/dist/core/opencode-model-catalog.js.map +1 -1
- package/dist/core/opencode-permissions.d.ts +52 -0
- package/dist/core/opencode-permissions.js +101 -0
- package/dist/core/opencode-permissions.js.map +1 -0
- package/dist/core/opencode-server-runner.d.ts +10 -9
- package/dist/core/opencode-server-runner.js +286 -28
- package/dist/core/opencode-server-runner.js.map +1 -1
- package/dist/core/opencode-session-error.d.ts +15 -7
- package/dist/core/opencode-session-error.js +25 -9
- package/dist/core/opencode-session-error.js.map +1 -1
- package/dist/core/opencode-ui-mapper.js +2 -2
- package/dist/core/opencode-ui-mapper.js.map +1 -1
- package/dist/core/pi-model-catalog.js.map +1 -1
- package/dist/core/pi-runner.d.ts +12 -4
- package/dist/core/pi-runner.js +171 -63
- package/dist/core/pi-runner.js.map +1 -1
- package/dist/core/pi-ui-mapper.js +1 -1
- package/dist/core/pi-ui-mapper.js.map +1 -1
- package/dist/core/process-usage.d.ts +5 -0
- package/dist/core/process-usage.js +24 -4
- package/dist/core/process-usage.js.map +1 -1
- package/dist/core/provider-auth.d.ts +16 -107
- package/dist/core/provider-auth.js +16 -132
- package/dist/core/provider-auth.js.map +1 -1
- package/dist/core/runner-factory.d.ts +4 -1
- package/dist/core/runner-factory.js +3 -3
- package/dist/core/runner-factory.js.map +1 -1
- package/dist/core/runner-runtime.d.ts +22 -0
- package/dist/core/runner-runtime.js +66 -5
- package/dist/core/runner-runtime.js.map +1 -1
- package/dist/core/runner-tool-grants.d.ts +21 -0
- package/dist/core/runner-tool-grants.js +64 -0
- package/dist/core/runner-tool-grants.js.map +1 -0
- package/dist/core/secret-redaction.d.ts +3 -20
- package/dist/core/secret-redaction.js +3 -20
- package/dist/core/secret-redaction.js.map +1 -1
- package/dist/core/session-process.d.ts +22 -2
- package/dist/core/session-process.js +170 -12
- package/dist/core/session-process.js.map +1 -1
- package/dist/core/shell-env.d.ts +2 -15
- package/dist/core/shell-env.js +2 -15
- package/dist/core/shell-env.js.map +1 -1
- package/dist/core/ui-events.d.ts +60 -47
- package/dist/core/ui-events.js +0 -23
- package/dist/core/ui-events.js.map +1 -1
- package/dist/core/usage-limit.js.map +1 -1
- package/dist/data-gitignore.js +3 -1
- package/dist/data-gitignore.js.map +1 -1
- package/dist/delegation/capacity.d.ts +4 -8
- package/dist/delegation/capacity.js +4 -8
- package/dist/delegation/capacity.js.map +1 -1
- package/dist/delegation/cli.js +123 -21
- package/dist/delegation/cli.js.map +1 -1
- package/dist/delegation/context.d.ts +19 -3
- package/dist/delegation/context.js +217 -22
- package/dist/delegation/context.js.map +1 -1
- package/dist/delegation/conversations.d.ts +4 -3
- package/dist/delegation/conversations.js +7 -5
- package/dist/delegation/conversations.js.map +1 -1
- package/dist/delegation/destroy-observation.d.ts +1 -1
- package/dist/delegation/destroy-observation.js.map +1 -1
- package/dist/delegation/effort.js.map +1 -1
- package/dist/delegation/execution-identity.d.ts +1 -1
- package/dist/delegation/execution-identity.js +41 -7
- package/dist/delegation/execution-identity.js.map +1 -1
- package/dist/delegation/idle-test-app.d.ts +4 -0
- package/dist/delegation/idle-test-app.js +174 -0
- package/dist/delegation/idle-test-app.js.map +1 -0
- package/dist/delegation/input.js.map +1 -1
- package/dist/delegation/park-notice.d.ts +42 -0
- package/dist/delegation/park-notice.js +71 -0
- package/dist/delegation/park-notice.js.map +1 -0
- package/dist/delegation/policy.d.ts +2 -0
- package/dist/delegation/policy.js +9 -1
- package/dist/delegation/policy.js.map +1 -1
- package/dist/delegation/process-liveness.d.ts +10 -15
- package/dist/delegation/process-liveness.js +11 -35
- package/dist/delegation/process-liveness.js.map +1 -1
- package/dist/delegation/provision.js +21 -19
- package/dist/delegation/provision.js.map +1 -1
- package/dist/delegation/questions.d.ts +3 -1
- package/dist/delegation/questions.js +10 -5
- package/dist/delegation/questions.js.map +1 -1
- package/dist/delegation/readiness.d.ts +2 -2
- package/dist/delegation/results.d.ts +4 -1
- package/dist/delegation/results.js +49 -18
- package/dist/delegation/results.js.map +1 -1
- package/dist/delegation/retry-backoff.d.ts +8 -0
- package/dist/delegation/retry-backoff.js +8 -0
- package/dist/delegation/retry-backoff.js.map +1 -1
- package/dist/delegation/routes.d.ts +114 -30
- package/dist/delegation/routes.js +4 -1
- package/dist/delegation/routes.js.map +1 -1
- package/dist/delegation/scratch-cleanup.d.ts +4 -5
- package/dist/delegation/scratch-cleanup.js +10 -8
- package/dist/delegation/scratch-cleanup.js.map +1 -1
- package/dist/delegation/service.d.ts +12 -4
- package/dist/delegation/service.js +76 -28
- package/dist/delegation/service.js.map +1 -1
- package/dist/delegation/transport.d.ts +154 -70
- package/dist/delegation/wait.d.ts +11 -0
- package/dist/delegation/wait.js +24 -0
- package/dist/delegation/wait.js.map +1 -1
- package/dist/delegation/windows-test-app.d.ts +5 -0
- package/dist/delegation/windows-test-app.js +63 -0
- package/dist/delegation/windows-test-app.js.map +1 -0
- package/dist/delegation/windows-workspace-identity.d.ts +3 -0
- package/dist/delegation/windows-workspace-identity.js +22 -0
- package/dist/delegation/windows-workspace-identity.js.map +1 -0
- package/dist/delegation/workspace.d.ts +5 -10
- package/dist/delegation/workspace.js +136 -75
- package/dist/delegation/workspace.js.map +1 -1
- package/dist/detached-process.d.ts +103 -0
- package/dist/detached-process.js +301 -0
- package/dist/detached-process.js.map +1 -0
- package/dist/discovery/catalog.d.ts +2 -1
- package/dist/discovery/catalog.js.map +1 -1
- package/dist/discovery/cli.js +3 -1
- package/dist/discovery/cli.js.map +1 -1
- package/dist/git-diff-base.d.ts +6 -61
- package/dist/git-diff-base.js +6 -70
- package/dist/git-diff-base.js.map +1 -1
- package/dist/git-index-copy.d.ts +4 -0
- package/dist/git-index-copy.js +10 -0
- package/dist/git-index-copy.js.map +1 -0
- package/dist/git-worktree-lock.d.ts +2 -4
- package/dist/git-worktree-lock.js +2 -4
- package/dist/git-worktree-lock.js.map +1 -1
- package/dist/git-worktree-release.d.ts +2 -2
- package/dist/git-worktree-release.js.map +1 -1
- package/dist/git-worktree.d.ts +47 -76
- package/dist/git-worktree.js +240 -94
- package/dist/git-worktree.js.map +1 -1
- package/dist/handoff.d.ts +51 -41
- package/dist/handoff.js +130 -78
- package/dist/handoff.js.map +1 -1
- package/dist/index.js +60 -39
- package/dist/index.js.map +1 -1
- package/dist/merge-observations.d.ts +13 -0
- package/dist/merge-observations.js +55 -0
- package/dist/merge-observations.js.map +1 -0
- package/dist/open-url.js +4 -14
- package/dist/open-url.js.map +1 -1
- package/dist/paths.d.ts +10 -13
- package/dist/paths.js +36 -17
- package/dist/paths.js.map +1 -1
- package/dist/planner.d.ts +2 -1
- package/dist/planner.js +9 -6
- package/dist/planner.js.map +1 -1
- package/dist/preview/agent-address.d.ts +34 -0
- package/dist/preview/agent-address.js +51 -0
- package/dist/preview/agent-address.js.map +1 -0
- package/dist/preview/agent-marker.d.ts +17 -0
- package/dist/preview/agent-marker.js +71 -0
- package/dist/preview/agent-marker.js.map +1 -0
- package/dist/preview/cdp-proxy.d.ts +54 -0
- package/dist/preview/cdp-proxy.js +151 -0
- package/dist/preview/cdp-proxy.js.map +1 -0
- package/dist/preview/cdp.d.ts +39 -3
- package/dist/preview/cdp.js +155 -57
- package/dist/preview/cdp.js.map +1 -1
- package/dist/preview/chromium.d.ts +18 -6
- package/dist/preview/chromium.js +112 -25
- package/dist/preview/chromium.js.map +1 -1
- package/dist/preview/dev-server.d.ts +1 -1
- package/dist/preview/dev-server.js +20 -44
- package/dist/preview/dev-server.js.map +1 -1
- package/dist/preview/host.d.ts +70 -3
- package/dist/preview/host.js +314 -28
- package/dist/preview/host.js.map +1 -1
- package/dist/preview/registration.d.ts +10 -5
- package/dist/preview/registration.js +2 -0
- package/dist/preview/registration.js.map +1 -1
- package/dist/preview/session.d.ts +2 -0
- package/dist/preview/session.js +10 -0
- package/dist/preview/session.js.map +1 -1
- package/dist/process-wait/exit-file.d.ts +29 -0
- package/dist/process-wait/exit-file.js +67 -0
- package/dist/process-wait/exit-file.js.map +1 -0
- package/dist/process-wait/supervisor.d.ts +30 -0
- package/dist/process-wait/supervisor.js +71 -0
- package/dist/process-wait/supervisor.js.map +1 -0
- package/dist/release/snapshot.d.ts +6 -6
- package/dist/runs/agent-tmpdir.d.ts +51 -36
- package/dist/runs/agent-tmpdir.js +389 -132
- package/dist/runs/agent-tmpdir.js.map +1 -1
- package/dist/runs/auto-name.d.ts +6 -6
- package/dist/runs/auto-name.js +1 -1
- package/dist/runs/auto-name.js.map +1 -1
- package/dist/runs/client-request.d.ts +3 -3
- package/dist/runs/client-request.js +3 -3
- package/dist/runs/client-request.js.map +1 -1
- package/dist/runs/delegation-state.d.ts +11 -2
- package/dist/runs/delegation-state.js.map +1 -1
- package/dist/runs/event-history-agent-context.d.ts +14 -0
- package/dist/runs/event-history-agent-context.js +105 -0
- package/dist/runs/event-history-agent-context.js.map +1 -0
- package/dist/runs/event-history-context.d.ts +15 -0
- package/dist/runs/event-history-context.js +109 -0
- package/dist/runs/event-history-context.js.map +1 -0
- package/dist/runs/event-history.d.ts +4 -1
- package/dist/runs/event-history.js +29 -130
- package/dist/runs/event-history.js.map +1 -1
- package/dist/runs/history-stream.d.ts +2 -0
- package/dist/runs/history-stream.js +62 -0
- package/dist/runs/history-stream.js.map +1 -0
- package/dist/runs/legacy-index.d.ts +6 -19
- package/dist/runs/legacy-index.js +6 -19
- package/dist/runs/legacy-index.js.map +1 -1
- package/dist/runs/live-item-snapshots.d.ts +13 -0
- package/dist/runs/live-item-snapshots.js +79 -0
- package/dist/runs/live-item-snapshots.js.map +1 -0
- package/dist/runs/loaded-run-healing.d.ts +3 -0
- package/dist/runs/loaded-run-healing.js +17 -0
- package/dist/runs/loaded-run-healing.js.map +1 -0
- package/dist/runs/outcome-commit.d.ts +98 -0
- package/dist/runs/outcome-commit.js +132 -0
- package/dist/runs/outcome-commit.js.map +1 -0
- package/dist/runs/pull-requests.d.ts +14 -0
- package/dist/runs/pull-requests.js +96 -0
- package/dist/runs/pull-requests.js.map +1 -0
- package/dist/runs/raw-record.d.ts +3 -15
- package/dist/runs/raw-record.js +3 -15
- package/dist/runs/raw-record.js.map +1 -1
- package/dist/runs/retention.d.ts +2 -2
- package/dist/runs/retention.js +7 -0
- package/dist/runs/retention.js.map +1 -1
- package/dist/runs/review-gate.d.ts +1 -1
- package/dist/runs/review-gate.js.map +1 -1
- package/dist/runs/run-claims.d.ts +2 -9
- package/dist/runs/run-claims.js.map +1 -1
- package/dist/runs/run-database.d.ts +29 -34
- package/dist/runs/run-database.js +124 -46
- package/dist/runs/run-database.js.map +1 -1
- package/dist/runs/run-index.d.ts +6 -25
- package/dist/runs/run-index.js +25 -38
- package/dist/runs/run-index.js.map +1 -1
- package/dist/runs/run-row.d.ts +5 -34
- package/dist/runs/run-row.js +13 -38
- package/dist/runs/run-row.js.map +1 -1
- package/dist/runs/store.d.ts +1597 -744
- package/dist/runs/store.js +1231 -739
- package/dist/runs/store.js.map +1 -1
- package/dist/runs/task-markers.d.ts +1 -0
- package/dist/runs/task-markers.js +5 -1
- package/dist/runs/task-markers.js.map +1 -1
- package/dist/runs/task-refs.d.ts +3 -3
- package/dist/runs/transcript-facts-fold.d.ts +64 -0
- package/dist/runs/transcript-facts-fold.js +109 -0
- package/dist/runs/transcript-facts-fold.js.map +1 -0
- package/dist/runs/transcript-facts-load.d.ts +11 -0
- package/dist/runs/transcript-facts-load.js +66 -0
- package/dist/runs/transcript-facts-load.js.map +1 -0
- package/dist/runs/transcript-facts-queue.d.ts +30 -0
- package/dist/runs/transcript-facts-queue.js +227 -0
- package/dist/runs/transcript-facts-queue.js.map +1 -0
- package/dist/runs/transcript-facts-worker.d.ts +15 -0
- package/dist/runs/transcript-facts-worker.js +26 -0
- package/dist/runs/transcript-facts-worker.js.map +1 -0
- package/dist/runs/transcript-facts.d.ts +13 -51
- package/dist/runs/transcript-facts.js +86 -202
- package/dist/runs/transcript-facts.js.map +1 -1
- package/dist/runs/ui-event-sink.d.ts +5 -30
- package/dist/runs/ui-event-sink.js +8 -30
- package/dist/runs/ui-event-sink.js.map +1 -1
- package/dist/runs/webhook.d.ts +104 -38
- package/dist/runs/webhook.js +180 -77
- package/dist/runs/webhook.js.map +1 -1
- package/dist/server/app-type.d.ts +2 -17
- package/dist/server/archive-on-merge.d.ts +35 -0
- package/dist/server/archive-on-merge.js +202 -0
- package/dist/server/archive-on-merge.js.map +1 -0
- package/dist/server/capabilities.d.ts +3 -15
- package/dist/server/capabilities.js +6 -19
- package/dist/server/capabilities.js.map +1 -1
- package/dist/server/checkout-progress.d.ts +10 -0
- package/dist/server/checkout-progress.js +27 -0
- package/dist/server/checkout-progress.js.map +1 -0
- package/dist/server/checkout.d.ts +10 -19
- package/dist/server/checkout.js +15 -45
- package/dist/server/checkout.js.map +1 -1
- package/dist/server/cockpit-ownership.d.ts +2 -0
- package/dist/server/cockpit-ownership.js +9 -0
- package/dist/server/cockpit-ownership.js.map +1 -1
- package/dist/server/cold-repo-handles.d.ts +2 -7
- package/dist/server/cold-repo-handles.js +2 -7
- package/dist/server/cold-repo-handles.js.map +1 -1
- package/dist/server/completion-actions.d.ts +30 -0
- package/dist/server/completion-actions.js +204 -0
- package/dist/server/completion-actions.js.map +1 -0
- package/dist/server/create-project.d.ts +71 -0
- package/dist/server/create-project.js +448 -0
- package/dist/server/create-project.js.map +1 -0
- package/dist/server/forge/github-filters.d.ts +7 -1
- package/dist/server/forge/github-filters.js +66 -51
- package/dist/server/forge/github-filters.js.map +1 -1
- package/dist/server/forge/github-merge-requirements.d.ts +18 -0
- package/dist/server/forge/github-merge-requirements.js +137 -0
- package/dist/server/forge/github-merge-requirements.js.map +1 -0
- package/dist/server/forge/github.d.ts +98 -111
- package/dist/server/forge/github.js +625 -306
- package/dist/server/forge/github.js.map +1 -1
- package/dist/server/forge/types.d.ts +25 -22
- package/dist/server/fs-browse.d.ts +3 -28
- package/dist/server/fs-browse.js.map +1 -1
- package/dist/server/git-changes.d.ts +5 -15
- package/dist/server/git-changes.js +3 -50
- package/dist/server/git-changes.js.map +1 -1
- package/dist/server/git.d.ts +3 -1
- package/dist/server/git.js +12 -0
- package/dist/server/git.js.map +1 -1
- package/dist/server/github.d.ts +1 -1
- package/dist/server/github.js +1 -1
- package/dist/server/github.js.map +1 -1
- package/dist/server/launch-key.d.ts +2 -4
- package/dist/server/launch-key.js +2 -4
- package/dist/server/launch-key.js.map +1 -1
- package/dist/server/live-routes.d.ts +68 -0
- package/dist/server/live-routes.js +147 -0
- package/dist/server/live-routes.js.map +1 -0
- package/dist/server/open-in-app.d.ts +4 -13
- package/dist/server/open-in-app.js +5 -41
- package/dist/server/open-in-app.js.map +1 -1
- package/dist/server/open-in-targets.d.ts +42 -0
- package/dist/server/open-in-targets.js +110 -0
- package/dist/server/open-in-targets.js.map +1 -0
- package/dist/server/open-in-terminal.d.ts +3 -0
- package/dist/server/open-in-terminal.js +6 -26
- package/dist/server/open-in-terminal.js.map +1 -1
- package/dist/server/preview-cdp-socket.d.ts +21 -0
- package/dist/server/preview-cdp-socket.js +112 -0
- package/dist/server/preview-cdp-socket.js.map +1 -0
- package/dist/server/preview-socket.d.ts +11 -11
- package/dist/server/preview-socket.js +22 -22
- package/dist/server/preview-socket.js.map +1 -1
- package/dist/server/preview-sockets.d.ts +14 -0
- package/dist/server/preview-sockets.js +18 -0
- package/dist/server/preview-sockets.js.map +1 -0
- package/dist/server/project-context.d.ts +54 -18
- package/dist/server/project-context.js +178 -5
- package/dist/server/project-context.js.map +1 -1
- package/dist/server/provider-action-gate.d.ts +0 -2
- package/dist/server/provider-action-gate.js +0 -21
- package/dist/server/provider-action-gate.js.map +1 -1
- package/dist/server/provider-auth-runtime.d.ts +3 -18
- package/dist/server/provider-auth-runtime.js +3 -18
- package/dist/server/provider-auth-runtime.js.map +1 -1
- package/dist/server/repo-branches.d.ts +3 -9
- package/dist/server/repo-branches.js +6 -22
- package/dist/server/repo-branches.js.map +1 -1
- package/dist/server/run-event-feed.d.ts +20 -0
- package/dist/server/run-event-feed.js +190 -0
- package/dist/server/run-event-feed.js.map +1 -0
- package/dist/server/server-deps.d.ts +37 -0
- package/dist/server/server-deps.js +114 -0
- package/dist/server/server-deps.js.map +1 -0
- package/dist/server/server.d.ts +14082 -11998
- package/dist/server/server.js +785 -1647
- package/dist/server/server.js.map +1 -1
- package/dist/server/start-run-options.d.ts +82 -0
- package/dist/server/start-run-options.js +111 -0
- package/dist/server/start-run-options.js.map +1 -0
- package/dist/server/validators.d.ts +3 -29
- package/dist/server/validators.js +1 -2
- package/dist/server/validators.js.map +1 -1
- package/dist/server/ws.d.ts +3 -23
- package/dist/server/ws.js +3 -23
- package/dist/server/ws.js.map +1 -1
- package/dist/server-install/engine.d.ts +6 -9
- package/dist/server-install/engine.js +2 -9
- package/dist/server-install/engine.js.map +1 -1
- package/dist/server-install/platforms/ubuntu-vps.d.ts +1 -1
- package/dist/server-install/state.d.ts +2 -4
- package/dist/server-install/state.js +2 -4
- package/dist/server-install/state.js.map +1 -1
- package/dist/server-install/steps.d.ts +2 -5
- package/dist/server-install/steps.js +3 -6
- package/dist/server-install/steps.js.map +1 -1
- package/dist/server-install/types.d.ts +3 -6
- package/dist/server-install/types.js +2 -5
- package/dist/server-install/types.js.map +1 -1
- package/dist/server-install/ui.d.ts +2 -8
- package/dist/server-install/ui.js +3 -3
- package/dist/server-install/ui.js.map +1 -1
- package/dist/session-context.d.ts +64 -0
- package/dist/session-context.js +264 -0
- package/dist/session-context.js.map +1 -0
- package/dist/skills-provision.d.ts +62 -0
- package/dist/skills-provision.js +325 -0
- package/dist/skills-provision.js.map +1 -0
- package/dist/skills-remote.d.ts +29 -27
- package/dist/skills-remote.js +236 -100
- package/dist/skills-remote.js.map +1 -1
- package/dist/skills.d.ts +25 -36
- package/dist/skills.js +43 -54
- package/dist/skills.js.map +1 -1
- package/dist/subcommands.d.ts +11 -0
- package/dist/subcommands.js +24 -0
- package/dist/subcommands.js.map +1 -0
- package/dist/task-cli/cli.js +78 -25
- package/dist/task-cli/cli.js.map +1 -1
- package/dist/task-cli/discovery.d.ts +4 -2
- package/dist/task-cli/discovery.js +14 -13
- package/dist/task-cli/discovery.js.map +1 -1
- package/dist/task-cli/hint.d.ts +20 -0
- package/dist/task-cli/hint.js +14 -0
- package/dist/task-cli/hint.js.map +1 -0
- package/dist/task-cli/http.d.ts +1 -0
- package/dist/task-cli/http.js +3 -1
- package/dist/task-cli/http.js.map +1 -1
- package/dist/task-cli/projections.d.ts +14 -11
- package/dist/task-cli/projections.js +15 -11
- package/dist/task-cli/projections.js.map +1 -1
- package/dist/task-cli/watch.d.ts +18 -10
- package/dist/task-cli/watch.js +128 -20
- package/dist/task-cli/watch.js.map +1 -1
- package/dist/ui-state.d.ts +17 -3
- package/dist/ui-state.js +56 -9
- package/dist/ui-state.js.map +1 -1
- package/dist/update-check.d.ts +0 -10
- package/dist/update-check.js +1 -16
- package/dist/update-check.js.map +1 -1
- package/dist/voice/decide.d.ts +32 -0
- package/dist/voice/decide.js +297 -0
- package/dist/voice/decide.js.map +1 -0
- package/dist/voice/decision-log.d.ts +52 -0
- package/dist/voice/decision-log.js +107 -0
- package/dist/voice/decision-log.js.map +1 -0
- package/dist/voice/engine.d.ts +119 -0
- package/dist/voice/engine.js +60 -0
- package/dist/voice/engine.js.map +1 -0
- package/dist/voice/fake-engine.d.ts +10 -0
- package/dist/voice/fake-engine.js +192 -0
- package/dist/voice/fake-engine.js.map +1 -0
- package/dist/voice/jev-engine.d.ts +17 -0
- package/dist/voice/jev-engine.js +110 -0
- package/dist/voice/jev-engine.js.map +1 -0
- package/dist/voice/pending-ask.d.ts +17 -0
- package/dist/voice/pending-ask.js +50 -0
- package/dist/voice/pending-ask.js.map +1 -0
- package/dist/voice/routes.d.ts +115 -0
- package/dist/voice/routes.js +91 -0
- package/dist/voice/routes.js.map +1 -0
- package/dist/voice/sentence.d.ts +21 -0
- package/dist/voice/sentence.js +61 -0
- package/dist/voice/sentence.js.map +1 -0
- package/dist/voice/thresholds.d.ts +28 -0
- package/dist/voice/thresholds.js +29 -0
- package/dist/voice/thresholds.js.map +1 -0
- package/dist/webhooks/cli.d.ts +18 -0
- package/dist/webhooks/cli.js +145 -0
- package/dist/webhooks/cli.js.map +1 -0
- package/dist/webhooks/prompt.d.ts +5 -0
- package/dist/webhooks/prompt.js +26 -0
- package/dist/webhooks/prompt.js.map +1 -0
- package/dist/workflows/active-run.d.ts +167 -0
- package/dist/workflows/active-run.js +21 -0
- package/dist/workflows/active-run.js.map +1 -0
- package/dist/workflows/continuation-admission.d.ts +913 -0
- package/dist/workflows/continuation-admission.js +265 -0
- package/dist/workflows/continuation-admission.js.map +1 -0
- package/dist/workflows/execution-account.d.ts +13 -0
- package/dist/workflows/execution-account.js +18 -0
- package/dist/workflows/execution-account.js.map +1 -0
- package/dist/workflows/input-acknowledgement.d.ts +152 -0
- package/dist/workflows/input-acknowledgement.js +38 -0
- package/dist/workflows/input-acknowledgement.js.map +1 -0
- package/dist/workflows/line-order.d.ts +5 -0
- package/dist/workflows/line-order.js +25 -0
- package/dist/workflows/line-order.js.map +1 -0
- package/dist/workflows/outcome-batches.d.ts +20 -0
- package/dist/workflows/outcome-batches.js +25 -0
- package/dist/workflows/outcome-batches.js.map +1 -0
- package/dist/workflows/question-routing.d.ts +8 -0
- package/dist/workflows/question-routing.js +18 -0
- package/dist/workflows/question-routing.js.map +1 -0
- package/dist/workflows/run-scheduling.d.ts +35 -0
- package/dist/workflows/run-scheduling.js +61 -0
- package/dist/workflows/run-scheduling.js.map +1 -0
- package/dist/workflows/run-states.d.ts +190 -0
- package/dist/workflows/run-states.js +295 -0
- package/dist/workflows/run-states.js.map +1 -0
- package/dist/workflows/run.d.ts +1296 -278
- package/dist/workflows/run.js +5730 -3265
- package/dist/workflows/run.js.map +1 -1
- package/dist/workflows/turn-end.d.ts +116 -0
- package/dist/workflows/turn-end.js +68 -0
- package/dist/workflows/turn-end.js.map +1 -0
- package/dist/workflows/types.d.ts +35 -130
- package/dist/workflows/types.js +47 -100
- package/dist/workflows/types.js.map +1 -1
- package/dist/workflows/waits.d.ts +74 -0
- package/dist/workflows/waits.js +197 -0
- package/dist/workflows/waits.js.map +1 -0
- package/dist/workspace/agent-accounts.d.ts +5 -38
- package/dist/workspace/agent-accounts.js +14 -40
- package/dist/workspace/agent-accounts.js.map +1 -1
- package/dist/workspace/agent-profiles.d.ts +40 -16
- package/dist/workspace/agent-profiles.js +77 -17
- package/dist/workspace/agent-profiles.js.map +1 -1
- package/dist/workspace/config.d.ts +48 -49
- package/dist/workspace/config.js +68 -72
- package/dist/workspace/config.js.map +1 -1
- package/dist/workspace/migrations.d.ts +3 -13
- package/dist/workspace/migrations.js.map +1 -1
- package/dist/workspace/projects-cli.d.ts +1 -1
- package/dist/workspace/projects-cli.js.map +1 -1
- package/dist/workspace/projects.d.ts +15 -18
- package/dist/workspace/projects.js +20 -16
- package/dist/workspace/projects.js.map +1 -1
- package/dist/workspace/semaphore.d.ts +11 -45
- package/dist/workspace/semaphore.js +6 -18
- package/dist/workspace/semaphore.js.map +1 -1
- package/dist/workspace/ui-state.d.ts +6 -4
- package/dist/workspace/ui-state.js +6 -4
- package/dist/workspace/ui-state.js.map +1 -1
- package/dist/workspace/webhooks.d.ts +40 -0
- package/dist/workspace/webhooks.js +146 -0
- package/dist/workspace/webhooks.js.map +1 -0
- package/dist/worktree-manifest.d.ts +165 -0
- package/dist/worktree-manifest.js +530 -0
- package/dist/worktree-manifest.js.map +1 -0
- package/dist/worktree-setup.js.map +1 -1
- package/package.json +6 -5
- package/scripts/benchmark-run-store-fixture.ts +7 -3
- package/scripts/check-pack.mjs +3 -1
- package/scripts/inline-contract.mjs +80 -27
- package/scripts/install-as-command.mjs +3 -1
- package/scripts/measure-transcript-facts-health.mjs +87 -0
- package/scripts/measure-transcript-facts-lag.mjs +68 -0
- package/scripts/mock-ci-tool.mjs +49 -6
- package/scripts/mock-claude-model-refusal.mjs +42 -0
- package/scripts/mock-claude.mjs +833 -591
- package/scripts/mock-codex-app-server.mjs +785 -418
- package/scripts/mock-cursor-acp.mjs +296 -125
- package/scripts/mock-cursor-print.mjs +256 -0
- package/scripts/mock-deferred-turn-start.mjs +16 -0
- package/scripts/mock-delivery-control.d.mts +23 -0
- package/scripts/mock-delivery-control.mjs +80 -0
- package/scripts/mock-env-record.mjs +11 -0
- package/scripts/mock-failure-control.d.mts +13 -0
- package/scripts/mock-failure-control.mjs +68 -0
- package/scripts/mock-multi-pr.mjs +7 -0
- package/scripts/mock-nudge.mjs +45 -0
- package/scripts/mock-omp-rpc.mjs +429 -255
- package/scripts/mock-opencode-serve.mjs +972 -557
- package/scripts/mock-pi-rpc.mjs +558 -331
- package/scripts/mock-runner-crash.mjs +18 -2
- package/scripts/mock-session-context.d.mts +5 -0
- package/scripts/mock-session-context.mjs +56 -0
- package/scripts/mock-silent-tail.mjs +10 -3
- package/scripts/pi-default-tools.mjs +22 -0
- package/scripts/pi-project-skills.mjs +59 -0
- package/scripts/probe-cursor-print.mjs +627 -0
- package/scripts/transcript-facts-fixture.mjs +53 -0
- package/scripts/voice-replay.ts +50 -0
- package/scripts/windows-workspace-identity.cs +208 -0
- package/scripts/windows-workspace-identity.ps1 +10 -0
- package/web/dist/assets/alert-dialog-DfctKUMw.js +1 -0
- package/web/dist/assets/button-CeupvoKG.js +41 -0
- package/web/dist/assets/centered-state-hDsyXrnH.js +1 -0
- package/web/dist/assets/cez-idle-D3aj_9lp.js +1 -0
- package/web/dist/assets/diff-BnIXZK3i2.js +3 -0
- package/web/dist/assets/diff-controls-GewpW9aF.js +1 -0
- package/web/dist/assets/diff-view-Byo7gpvW.js +11 -0
- package/web/dist/assets/dropdown-menu-COj_J5wd.js +6 -0
- package/web/dist/assets/eye-B8okNWXU.js +1 -0
- package/web/dist/assets/git-toolbar-DY0z0n4S.js +1 -0
- package/web/dist/assets/github-DwU6ALRK.js +1 -0
- package/web/dist/assets/{image-preview-FOEfqpZP.js → image-preview-C_t9q45f.js} +1 -1
- package/web/dist/assets/index-BOfE8pyD.js +34 -0
- package/web/dist/assets/index-D9HpsmdW.css +1 -0
- package/web/dist/assets/live-protocol-Uce2NwEX.js +64 -0
- package/web/dist/assets/live-worker-BizfZSoh.ts +33 -0
- package/web/dist/assets/markdown-BBDDg-4t.js +1 -0
- package/web/dist/assets/nav-row-styles-AoIhhIwf.js +1 -0
- package/web/dist/assets/popover-D56fhiXj.js +1 -0
- package/web/dist/assets/preview-pane-connected-BmVqfSU5.js +3 -0
- package/web/dist/assets/reference-chip-gQNk-4jc.js +1 -0
- package/web/dist/assets/repo-git-B5ECDUuv.js +1 -0
- package/web/dist/assets/{repo-git-CoKp-g9K.css → repo-git-DVXNOJDT.css} +1 -1
- package/web/dist/assets/run-header-C0Y1NvEM.js +2 -0
- package/web/dist/assets/run-header-CC7VUTg9.css +1 -0
- package/web/dist/assets/skills-DUeTkZ9z.js +1 -0
- package/web/dist/assets/status-dot-1PR0i69P.js +1 -0
- package/web/dist/assets/tab-link-DmWk4l5O.js +1 -0
- package/web/dist/assets/task-changes-DKZXuW89.js +1 -0
- package/web/dist/assets/task-commits-BZ6KxWdF.js +1 -0
- package/web/dist/assets/task-files-DlF7Apcn.js +2 -0
- package/web/dist/assets/task-github-item-CVPo3geZ.js +1 -0
- package/web/dist/assets/task-thread-DtQ6uGfQ.css +1 -0
- package/web/dist/assets/task-thread-mm4-ECyo.js +9 -0
- package/web/dist/assets/thread-state-CIw2BlhT.js +4 -0
- package/web/dist/assets/use-hand-to-agent-state-BCDjzHnG.js +1 -0
- package/web/dist/assets/use-hand-to-agent-state-C7esPJ-N.css +1 -0
- package/web/dist/assets/workflows-D8vYD-ql.js +7 -0
- package/web/dist/assets/zoomable-image-CxQSsfcn.js +1 -0
- package/web/dist/index.html +13 -17
- package/web/dist/live-worker.js +4 -0
- package/dist/core/tool-display.js +0 -179
- package/dist/core/tool-display.js.map +0 -1
- package/dist/runs/human-ask-summary.d.ts +0 -9
- package/dist/runs/human-ask-summary.js +0 -39
- package/dist/runs/human-ask-summary.js.map +0 -1
- package/dist/runs/run-search.d.ts +0 -29
- package/dist/runs/run-search.js +0 -63
- package/dist/runs/run-search.js.map +0 -1
- package/dist/skills-banner.d.ts +0 -22
- package/dist/skills-banner.js +0 -41
- package/dist/skills-banner.js.map +0 -1
- package/dist/skills-update.d.ts +0 -88
- package/dist/skills-update.js +0 -392
- package/dist/skills-update.js.map +0 -1
- package/dist/todos.d.ts +0 -48
- package/dist/todos.js +0 -201
- package/dist/todos.js.map +0 -1
- package/web/dist/assets/agent-accounts-CFOBMVHc.js +0 -1
- package/web/dist/assets/alert-dialog-BrpNUwMt.js +0 -1
- package/web/dist/assets/button-C_rd7CPp.js +0 -43
- package/web/dist/assets/compare-variants-D6WXhvXA.js +0 -1
- package/web/dist/assets/diff-DrEARXTV.js +0 -3
- package/web/dist/assets/diff-controls-B1-j7nFg.js +0 -1
- package/web/dist/assets/diff-view-DvGLjdTk.js +0 -6
- package/web/dist/assets/dropdown-menu-BegOZFrj.js +0 -1
- package/web/dist/assets/format-DpNe3S0A.js +0 -1
- package/web/dist/assets/git-toolbar-Cw4ljmhB.js +0 -1
- package/web/dist/assets/github-CfV5sqL0.js +0 -1
- package/web/dist/assets/index-DgWWlOLy.js +0 -13
- package/web/dist/assets/index-fBFnuvxu.css +0 -1
- package/web/dist/assets/nav-row-styles-vp2JbhuJ.js +0 -1
- package/web/dist/assets/popover-BohP6WTx.js +0 -1
- package/web/dist/assets/preview-pane-connected-qTA5KNoJ.js +0 -3
- package/web/dist/assets/preview-state-vuMviq6q.js +0 -1
- package/web/dist/assets/prompt-templates-Cubdut_C.js +0 -15
- package/web/dist/assets/repo-git-Cf4t5PD0.js +0 -1
- package/web/dist/assets/run-diff-BpkUW37Z.js +0 -3
- package/web/dist/assets/run-header-68WHf9wV.js +0 -1
- package/web/dist/assets/run-header-8GObNx6F.css +0 -1
- package/web/dist/assets/search-x-I9Q8pgUa.js +0 -1
- package/web/dist/assets/skills-DFBiAuJG.js +0 -1
- package/web/dist/assets/skills-DiVIgKeU.js +0 -1
- package/web/dist/assets/square-terminal-B6RYYieR.js +0 -1
- package/web/dist/assets/status-dot-CqTJHSP9.js +0 -1
- package/web/dist/assets/tab-link-B07Hu4QX.js +0 -1
- package/web/dist/assets/task-changes--lQF6EYf.js +0 -1
- package/web/dist/assets/task-commits-Cx0qy4DN.js +0 -1
- package/web/dist/assets/task-files-D50s-gKW.js +0 -2
- package/web/dist/assets/task-github-item-DaqmSwYT.js +0 -1
- package/web/dist/assets/task-thread-BPQ64lui.js +0 -7
- package/web/dist/assets/task-thread-zNE2Q9E-.css +0 -1
- package/web/dist/assets/textarea-D20O4Pw0.js +0 -1
- package/web/dist/assets/thread-state-DWcFMrvb.js +0 -4
- package/web/dist/assets/use-hand-to-agent-state-BLIGmwbd.css +0 -1
- package/web/dist/assets/use-hand-to-agent-state-Cy9eyyfL.js +0 -1
- package/web/dist/assets/utils-JsL3ZsJf.js +0 -64
- package/web/dist/assets/workflows-jwG7uxqi.js +0 -11
- package/web/dist/assets/zoomable-image-BJJ64KGc.js +0 -1
|
@@ -0,0 +1,448 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { mkdir, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { join, resolve } from 'node:path';
|
|
4
|
+
import { PROJECT_NAME_PATTERN } from '../contract/index.js';
|
|
5
|
+
import { GH_CREDENTIAL_HELPER_CONFIG, cleanupCheckout, isValidCheckoutName, parseRepoRef } from './checkout.js';
|
|
6
|
+
/**
|
|
7
|
+
* Create a local Git project, optionally with an explicitly requested private GitHub repository
|
|
8
|
+
* or template. Share checkout target and cleanup rules. After remote creation, preserve useful
|
|
9
|
+
* local work and return recovery warnings.
|
|
10
|
+
*/
|
|
11
|
+
const COMMAND_TIMEOUT_MS = 10 * 60_000;
|
|
12
|
+
const ERROR_TAIL_LINES = 6;
|
|
13
|
+
/** How long to wait for GitHub to generate a repo from a template before
|
|
14
|
+
* cloning anyway. Generation is asynchronous and usually takes a few seconds. */
|
|
15
|
+
const TEMPLATE_WAIT_ATTEMPTS = 15;
|
|
16
|
+
const TEMPLATE_WAIT_MS = 2_000;
|
|
17
|
+
/** The one initial branch name for a new local repo. */
|
|
18
|
+
const INITIAL_BRANCH = 'main';
|
|
19
|
+
const GH_MISSING = 'gh CLI not found — install it and run `gh auth login`';
|
|
20
|
+
const CANCELLED = 'project creation cancelled';
|
|
21
|
+
export const spawnCommandRunner = (cmd, args, opts) => new Promise((resolvePromise) => {
|
|
22
|
+
const child = spawn(cmd, args, {
|
|
23
|
+
cwd: opts.cwd,
|
|
24
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
25
|
+
timeout: COMMAND_TIMEOUT_MS,
|
|
26
|
+
// Non-interactive on purpose: a prompt nobody can see would pin the request. GH_HOST is
|
|
27
|
+
// pinned because every URL, remote and command this flow names is github.com — an ambient
|
|
28
|
+
// GH_HOST (GitHub Enterprise) would list owners on, and create the repository on, another server.
|
|
29
|
+
env: { ...process.env, GH_PROMPT_DISABLED: '1', GIT_TERMINAL_PROMPT: '0', ...(cmd === 'gh' ? { GH_HOST: 'github.com' } : {}) },
|
|
30
|
+
});
|
|
31
|
+
const tail = [];
|
|
32
|
+
let stdout = '';
|
|
33
|
+
let settled = false;
|
|
34
|
+
const finish = (result) => {
|
|
35
|
+
if (settled)
|
|
36
|
+
return;
|
|
37
|
+
settled = true;
|
|
38
|
+
resolvePromise(result);
|
|
39
|
+
};
|
|
40
|
+
const onAbort = () => {
|
|
41
|
+
child.kill('SIGTERM');
|
|
42
|
+
finish({ ok: false, error: CANCELLED });
|
|
43
|
+
};
|
|
44
|
+
if (opts.signal?.aborted)
|
|
45
|
+
onAbort();
|
|
46
|
+
opts.signal?.addEventListener('abort', onAbort, { once: true });
|
|
47
|
+
// git's progress is carriage-return-separated (see `ghCloneRunner`).
|
|
48
|
+
let pending = '';
|
|
49
|
+
child.stderr?.setEncoding('utf8');
|
|
50
|
+
child.stderr?.on('data', (chunk) => {
|
|
51
|
+
pending += chunk;
|
|
52
|
+
const parts = pending.split(/\r\n|\r|\n/);
|
|
53
|
+
pending = parts.pop() ?? '';
|
|
54
|
+
for (const part of parts) {
|
|
55
|
+
const line = part.trim();
|
|
56
|
+
if (line === '')
|
|
57
|
+
continue;
|
|
58
|
+
tail.push(line);
|
|
59
|
+
if (tail.length > ERROR_TAIL_LINES)
|
|
60
|
+
tail.shift();
|
|
61
|
+
opts.onLine?.(line);
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
child.stdout?.setEncoding('utf8');
|
|
65
|
+
child.stdout?.on('data', (chunk) => {
|
|
66
|
+
stdout += chunk;
|
|
67
|
+
});
|
|
68
|
+
child.on('error', (err) => {
|
|
69
|
+
opts.signal?.removeEventListener('abort', onAbort);
|
|
70
|
+
finish({ ok: false, error: err.message, notFound: err.code === 'ENOENT' });
|
|
71
|
+
});
|
|
72
|
+
child.on('close', (code) => {
|
|
73
|
+
opts.signal?.removeEventListener('abort', onAbort);
|
|
74
|
+
if (code === 0)
|
|
75
|
+
return finish({ ok: true, stdout });
|
|
76
|
+
const detail = [...tail, pending.trim(), stdout.trim()].filter((s) => s !== '').slice(-ERROR_TAIL_LINES).join('\n');
|
|
77
|
+
finish({ ok: false, error: detail === '' ? `${cmd} ${args[0] ?? ''} exited with code ${code}` : detail });
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
/** An identity (and no signing) lent to one `git commit`, so a dry run never
|
|
81
|
+
* depends on the host's git config. */
|
|
82
|
+
const LENT_IDENTITY = ['-c', 'user.name=cezar dry run', '-c', 'user.email=dry-run@cezar.invalid', '-c', 'commit.gpgsign=false'];
|
|
83
|
+
/**
|
|
84
|
+
* `CEZ_DRY_RUN=1` — real `git` (it is local and required anyway), fake `gh`
|
|
85
|
+
* and a fake `git push`. Answers the pre-checks as a signed-in account whose
|
|
86
|
+
* name is free and whose template is valid. The fake template clone writes
|
|
87
|
+
* only inside the directory the caller created, as a real repo with one commit,
|
|
88
|
+
* so the registered project can host task worktrees like a real one.
|
|
89
|
+
*/
|
|
90
|
+
export const dryRunCommandRunner = async (cmd, args, opts) => {
|
|
91
|
+
if (cmd === 'git' && args[0] === 'push') {
|
|
92
|
+
opts.onLine?.(`(CEZ_DRY_RUN=1) git ${args.join(' ')}`);
|
|
93
|
+
return { ok: true, stdout: '' };
|
|
94
|
+
}
|
|
95
|
+
if (cmd === 'git')
|
|
96
|
+
return spawnCommandRunner(cmd, args[0] === 'commit' ? [...LENT_IDENTITY, ...args] : args, opts);
|
|
97
|
+
opts.onLine?.(`(CEZ_DRY_RUN=1) gh ${args.join(' ')}`);
|
|
98
|
+
if (args[0] === 'api') {
|
|
99
|
+
const path = args[1] ?? '';
|
|
100
|
+
if (path === 'user')
|
|
101
|
+
return { ok: true, stdout: 'dry-run-user\n' };
|
|
102
|
+
if (path.endsWith('/commits?per_page=1'))
|
|
103
|
+
return { ok: true, stdout: '1\n' };
|
|
104
|
+
if (args.includes(TEMPLATE_JQ))
|
|
105
|
+
return { ok: true, stdout: '[true,false]\n' };
|
|
106
|
+
return { ok: false, error: 'gh: Not Found (HTTP 404)' };
|
|
107
|
+
}
|
|
108
|
+
if (args[0] === 'repo' && args[1] === 'clone') {
|
|
109
|
+
const dir = args[3] ?? opts.cwd;
|
|
110
|
+
const local = { ...opts, cwd: dir };
|
|
111
|
+
const init = await spawnCommandRunner('git', ['init', '-b', INITIAL_BRANCH], local);
|
|
112
|
+
if (!init.ok)
|
|
113
|
+
return init;
|
|
114
|
+
await writeFile(join(dir, 'README.md'), `# ${args[2] ?? 'repo'}\n\n(CEZ_DRY_RUN=1 fake template clone)\n`, 'utf8');
|
|
115
|
+
const add = await spawnCommandRunner('git', ['add', 'README.md'], local);
|
|
116
|
+
if (!add.ok)
|
|
117
|
+
return add;
|
|
118
|
+
return spawnCommandRunner('git', [...LENT_IDENTITY, 'commit', '-m', 'Initial commit'], local);
|
|
119
|
+
}
|
|
120
|
+
return { ok: true, stdout: '' };
|
|
121
|
+
};
|
|
122
|
+
const OWNER_SEGMENT = /^[A-Za-z0-9][A-Za-z0-9-]*$/;
|
|
123
|
+
const TEMPLATE_JQ = '[.is_template, .archived] | @json';
|
|
124
|
+
export async function createProject(opts) {
|
|
125
|
+
const name = opts.name.trim();
|
|
126
|
+
// GitHub's repository-name rules, even for a local-only project: the name is
|
|
127
|
+
// the folder AND (now or later) the repo, and GitHub would silently rewrite
|
|
128
|
+
// anything else — `my project` becomes `my-project` there but not on disk.
|
|
129
|
+
if (!PROJECT_NAME_PATTERN.test(name) || !isValidCheckoutName(name)) {
|
|
130
|
+
return {
|
|
131
|
+
ok: false,
|
|
132
|
+
status: 400,
|
|
133
|
+
error: `not a valid project name: ${name.slice(0, 200)} — use letters, digits, ".", "-" and "_" only, no spaces`,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
let slug;
|
|
137
|
+
let template;
|
|
138
|
+
if (opts.github) {
|
|
139
|
+
const owner = opts.github.owner.trim();
|
|
140
|
+
if (owner.length > 64 || !OWNER_SEGMENT.test(owner)) {
|
|
141
|
+
return { ok: false, status: 400, error: `not a valid GitHub owner: ${owner.slice(0, 200)}` };
|
|
142
|
+
}
|
|
143
|
+
slug = `${owner}/${name}`;
|
|
144
|
+
const rawTemplate = opts.github.template?.trim() ?? '';
|
|
145
|
+
if (rawTemplate !== '') {
|
|
146
|
+
const ref = parseRepoRef(rawTemplate);
|
|
147
|
+
if (!ref)
|
|
148
|
+
return { ok: false, status: 400, error: `not a GitHub template repository: ${rawTemplate.slice(0, 200)}` };
|
|
149
|
+
template = ref.slug;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
if (!opts.projectsDir.startsWith('/')) {
|
|
153
|
+
return { ok: false, status: 500, error: `checkout root is not an absolute path: ${opts.projectsDir}` };
|
|
154
|
+
}
|
|
155
|
+
const root = resolve(opts.projectsDir);
|
|
156
|
+
const target = join(root, name);
|
|
157
|
+
const emit = (event) => opts.onProgress({ ...event, name, ...(opts.checkoutId ? { checkoutId: opts.checkoutId } : {}) });
|
|
158
|
+
const say = (line) => emit({ phase: 'cloning', line });
|
|
159
|
+
const refuse = (failure) => {
|
|
160
|
+
emit({ phase: 'error', error: failure.error });
|
|
161
|
+
return failure;
|
|
162
|
+
};
|
|
163
|
+
const run = opts.run ?? (process.env.CEZ_DRY_RUN === '1' ? dryRunCommandRunner : spawnCommandRunner);
|
|
164
|
+
/** `cancellable` is false from `gh repo create` on: those steps always run to the end. */
|
|
165
|
+
const exec = async (cmd, args, cancellable, cwd = target) => {
|
|
166
|
+
try {
|
|
167
|
+
return await run(cmd, args, { cwd, onLine: say, signal: cancellable ? opts.signal : undefined });
|
|
168
|
+
}
|
|
169
|
+
catch (err) {
|
|
170
|
+
return { ok: false, error: errText(err) };
|
|
171
|
+
}
|
|
172
|
+
};
|
|
173
|
+
if (slug) {
|
|
174
|
+
say('Checking GitHub…');
|
|
175
|
+
const blocked = await githubPreflight(slug, template, (cmd, args) => exec(cmd, args, true, process.cwd()));
|
|
176
|
+
if (blocked)
|
|
177
|
+
return refuse(blocked);
|
|
178
|
+
}
|
|
179
|
+
try {
|
|
180
|
+
await mkdir(root, { recursive: true });
|
|
181
|
+
}
|
|
182
|
+
catch (err) {
|
|
183
|
+
return refuse({ ok: false, status: 500, error: `checkout root is not writable: ${errText(err)}` });
|
|
184
|
+
}
|
|
185
|
+
// The ownership token, exactly as in checkout.ts: non-recursive, so it
|
|
186
|
+
// succeeds only when WE created the directory — which is what licenses the
|
|
187
|
+
// cleanup below.
|
|
188
|
+
try {
|
|
189
|
+
await mkdir(target);
|
|
190
|
+
}
|
|
191
|
+
catch (err) {
|
|
192
|
+
if (err.code === 'EEXIST') {
|
|
193
|
+
return refuse({ ok: false, status: 409, error: `folder already exists: ${target}` });
|
|
194
|
+
}
|
|
195
|
+
return refuse({ ok: false, status: 500, error: `could not create ${target}: ${errText(err)}` });
|
|
196
|
+
}
|
|
197
|
+
/** Remove the local folder and answer with a failure. */
|
|
198
|
+
const fail = async (status, error) => {
|
|
199
|
+
await cleanupCheckout(root, target);
|
|
200
|
+
return refuse({ ok: false, status, error: opts.signal?.aborted ? CANCELLED : error });
|
|
201
|
+
};
|
|
202
|
+
/** Run the steps after `gh repo create`; the first failure stops them and becomes a warning
|
|
203
|
+
* naming every command still to run. The local repo is kept either way. */
|
|
204
|
+
const finishAfterCreate = async (steps) => {
|
|
205
|
+
for (const [i, step] of steps.entries()) {
|
|
206
|
+
const result = await step.run();
|
|
207
|
+
if (result.ok)
|
|
208
|
+
continue;
|
|
209
|
+
const remaining = steps.slice(i).map((s) => s.command).join(' && ');
|
|
210
|
+
return `The private repository ${webUrl(slug)} was created, but ${step.label} failed: ${firstLine(result.error)}. Finish in ${target} with: ${remaining}`;
|
|
211
|
+
}
|
|
212
|
+
return undefined;
|
|
213
|
+
};
|
|
214
|
+
const credentialStep = {
|
|
215
|
+
label: 'configuring GitHub credentials',
|
|
216
|
+
// Both operations, as run: a helper inherited from the global config must be cleared too.
|
|
217
|
+
command: GH_CREDENTIAL_HELPER_CONFIG.map((args) => ['git', 'config', '--local', ...args].map(shellQuote).join(' ')).join(' && '),
|
|
218
|
+
run: async () => {
|
|
219
|
+
// PR #968: route this repo's github.com HTTPS credentials through `gh`, as `checkout.ts` does.
|
|
220
|
+
for (const args of GH_CREDENTIAL_HELPER_CONFIG) {
|
|
221
|
+
const result = await exec('git', ['config', '--local', ...args], false);
|
|
222
|
+
if (!result.ok)
|
|
223
|
+
return result;
|
|
224
|
+
}
|
|
225
|
+
return { ok: true, stdout: '' };
|
|
226
|
+
},
|
|
227
|
+
};
|
|
228
|
+
/** `gh repo create` failed — which does not prove GitHub did nothing. Check the name again and
|
|
229
|
+
* say what the user finds there; never adopt (or delete) a repository cezar cannot prove it made. */
|
|
230
|
+
const createFailed = async (error) => {
|
|
231
|
+
const recheck = await exec('gh', ['api', `repos/${slug}`, '--jq', '.full_name'], false, process.cwd());
|
|
232
|
+
if (recheck.ok) {
|
|
233
|
+
const recovery = template
|
|
234
|
+
? `If this attempt created it, add it with Add project → Clone from GitHub (${slug}).`
|
|
235
|
+
: 'If this attempt created it, it is empty — delete it on GitHub and create the project again, or choose another name.';
|
|
236
|
+
return fail(500, `${error}\nThe private repository ${webUrl(slug)} exists on GitHub now. ${recovery}`);
|
|
237
|
+
}
|
|
238
|
+
if (isNotFound(recheck.error))
|
|
239
|
+
return fail(500, error);
|
|
240
|
+
return fail(500, `${error}\nCould not check whether ${webUrl(slug)} was created — look on GitHub before trying again.`);
|
|
241
|
+
};
|
|
242
|
+
const done = (kind, warning) => {
|
|
243
|
+
emit({ phase: 'done', ...(warning ? { warning } : {}) });
|
|
244
|
+
return { ok: true, target, name, ...(slug ? { slug } : {}), kind, ...(warning ? { warning } : {}) };
|
|
245
|
+
};
|
|
246
|
+
if (slug && template) {
|
|
247
|
+
if (opts.signal?.aborted)
|
|
248
|
+
return fail(500, CANCELLED);
|
|
249
|
+
say(`Creating private repository ${slug} from ${template}…`);
|
|
250
|
+
const created = await exec('gh', ['repo', 'create', slug, '--private', '--template', template], false);
|
|
251
|
+
if (!created.ok)
|
|
252
|
+
return createFailed(created.error);
|
|
253
|
+
// Template generation is asynchronous on GitHub: an immediate clone can
|
|
254
|
+
// land an empty repo. Wait until the first commit is visible — and since
|
|
255
|
+
// the wait gives up eventually, the clone is checked for a commit below.
|
|
256
|
+
const sleep = opts.sleep ?? ((ms) => new Promise((r) => setTimeout(r, ms)));
|
|
257
|
+
for (let attempt = 0; attempt < TEMPLATE_WAIT_ATTEMPTS; attempt++) {
|
|
258
|
+
const probe = await exec('gh', ['api', `repos/${slug}/commits?per_page=1`, '--jq', 'length'], false);
|
|
259
|
+
if (probe.ok && Number.parseInt(probe.stdout.trim(), 10) > 0)
|
|
260
|
+
break;
|
|
261
|
+
if (attempt === 0)
|
|
262
|
+
say('Waiting for GitHub to generate the repository…');
|
|
263
|
+
await sleep(TEMPLATE_WAIT_MS);
|
|
264
|
+
}
|
|
265
|
+
const cloned = await exec('gh', ['repo', 'clone', cloneUrl(slug), target, '--', '--progress'], false);
|
|
266
|
+
if (!cloned.ok) {
|
|
267
|
+
// Nothing local is worth keeping (the folder holds at most a partial
|
|
268
|
+
// clone), so this is the one post-create failure that cleans up — and
|
|
269
|
+
// says how to finish from the repository that now exists.
|
|
270
|
+
await cleanupCheckout(root, target);
|
|
271
|
+
return refuse({
|
|
272
|
+
ok: false,
|
|
273
|
+
status: 500,
|
|
274
|
+
error: `${cloned.error}\nThe private repository ${webUrl(slug)} was created on GitHub — add it with Add project → Clone from GitHub (${slug}).`,
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
// git clones an empty remote without complaint, and a project with no
|
|
278
|
+
// commit cannot host a task: that is a failed clone, not a success.
|
|
279
|
+
const head = await exec('git', ['rev-parse', '--verify', '--quiet', 'HEAD'], false);
|
|
280
|
+
if (!head.ok) {
|
|
281
|
+
await cleanupCheckout(root, target);
|
|
282
|
+
return refuse({
|
|
283
|
+
ok: false,
|
|
284
|
+
status: 500,
|
|
285
|
+
error: `GitHub had not finished generating ${slug} from ${template}, so the clone has no commit. The private repository ${webUrl(slug)} was created on GitHub — once it shows the template's files, add it with Add project → Clone from GitHub (${slug}).`,
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
return done('template', await finishAfterCreate([credentialStep]));
|
|
289
|
+
}
|
|
290
|
+
say('Initializing a git repository…');
|
|
291
|
+
const init = await exec('git', ['init', '-b', INITIAL_BRANCH], true);
|
|
292
|
+
if (!init.ok)
|
|
293
|
+
return fail(500, init.error);
|
|
294
|
+
// An empty commit gives the project a base commit to branch task worktrees
|
|
295
|
+
// from, without writing any file the user did not ask for. Without one the
|
|
296
|
+
// project cannot host a task, so a failure here (most likely no git
|
|
297
|
+
// identity) is a refusal, not a footnote — and nothing remote exists yet.
|
|
298
|
+
const commit = await exec('git', ['commit', '--allow-empty', '-m', 'Initial commit'], true);
|
|
299
|
+
if (!commit.ok) {
|
|
300
|
+
return fail(400, `Could not make the initial commit — set your git identity: git config --global user.name "Your Name" && git config --global user.email you@example.com (${firstLine(commit.error)})`);
|
|
301
|
+
}
|
|
302
|
+
if (!slug)
|
|
303
|
+
return done('local', undefined);
|
|
304
|
+
if (opts.signal?.aborted)
|
|
305
|
+
return fail(500, CANCELLED);
|
|
306
|
+
say(`Creating private repository ${slug}…`);
|
|
307
|
+
const created = await exec('gh', ['repo', 'create', slug, '--private'], false);
|
|
308
|
+
if (!created.ok)
|
|
309
|
+
return createFailed(created.error);
|
|
310
|
+
// HTTPS remote + gh credential helper, exactly as a clone gets (#968); the
|
|
311
|
+
// push then goes through plain git, proving the setup a task push relies on.
|
|
312
|
+
const warning = await finishAfterCreate([
|
|
313
|
+
{
|
|
314
|
+
label: 'adding the origin remote',
|
|
315
|
+
command: `git remote add origin ${cloneUrl(slug)}`,
|
|
316
|
+
run: () => exec('git', ['remote', 'add', 'origin', cloneUrl(slug)], false),
|
|
317
|
+
},
|
|
318
|
+
credentialStep,
|
|
319
|
+
{
|
|
320
|
+
label: `pushing ${INITIAL_BRANCH}`,
|
|
321
|
+
command: `git push -u origin ${INITIAL_BRANCH}`,
|
|
322
|
+
run: () => {
|
|
323
|
+
say(`Pushing ${INITIAL_BRANCH} to ${slug}…`);
|
|
324
|
+
return exec('git', ['push', '-u', 'origin', INITIAL_BRANCH], false);
|
|
325
|
+
},
|
|
326
|
+
},
|
|
327
|
+
]);
|
|
328
|
+
return done('github', warning);
|
|
329
|
+
}
|
|
330
|
+
/**
|
|
331
|
+
* The GitHub checks that run before anything exists: `gh` present and signed
|
|
332
|
+
* in, `<owner>/<name>` free, the template a live template repository. A
|
|
333
|
+
* failure answers with the refusal; `undefined` means go ahead.
|
|
334
|
+
*/
|
|
335
|
+
async function githubPreflight(slug, template, exec) {
|
|
336
|
+
const user = await exec('gh', ['api', 'user', '--jq', '.login']);
|
|
337
|
+
if (!user.ok) {
|
|
338
|
+
const reason = user.notFound ? GH_MISSING : unauthenticated(user.error);
|
|
339
|
+
return { ok: false, status: 503, error: reason, reason };
|
|
340
|
+
}
|
|
341
|
+
const existing = await exec('gh', ['api', `repos/${slug}`, '--jq', '.full_name']);
|
|
342
|
+
if (existing.ok)
|
|
343
|
+
return { ok: false, status: 409, error: `a repository named ${slug} already exists on GitHub` };
|
|
344
|
+
if (!isNotFound(existing.error)) {
|
|
345
|
+
return { ok: false, status: 500, error: `could not check whether ${slug} exists on GitHub: ${firstLine(existing.error)}` };
|
|
346
|
+
}
|
|
347
|
+
if (template) {
|
|
348
|
+
const probe = await exec('gh', ['api', `repos/${template}`, '--jq', TEMPLATE_JQ]);
|
|
349
|
+
if (!probe.ok) {
|
|
350
|
+
return isNotFound(probe.error)
|
|
351
|
+
? { ok: false, status: 400, error: `${template} was not found on GitHub` }
|
|
352
|
+
: { ok: false, status: 500, error: `could not check the template ${template}: ${firstLine(probe.error)}` };
|
|
353
|
+
}
|
|
354
|
+
let flags;
|
|
355
|
+
try {
|
|
356
|
+
flags = JSON.parse(probe.stdout.trim());
|
|
357
|
+
}
|
|
358
|
+
catch {
|
|
359
|
+
flags = null;
|
|
360
|
+
}
|
|
361
|
+
const [isTemplate, archived] = Array.isArray(flags) ? flags : [];
|
|
362
|
+
if (isTemplate !== true)
|
|
363
|
+
return { ok: false, status: 400, error: `${template} is not a GitHub template repository` };
|
|
364
|
+
if (archived !== false)
|
|
365
|
+
return { ok: false, status: 400, error: `${template} is archived` };
|
|
366
|
+
}
|
|
367
|
+
return undefined;
|
|
368
|
+
}
|
|
369
|
+
/** `GET /api/v1/projects/github-owners` — who a new repository may belong to:
|
|
370
|
+
* the signed-in user first, then their organisations, each with its avatar
|
|
371
|
+
* (and an org's description) for the dialog's owner cards. */
|
|
372
|
+
export async function listGithubOwners(run) {
|
|
373
|
+
if (!run && process.env.CEZ_DRY_RUN === '1') {
|
|
374
|
+
return {
|
|
375
|
+
available: true,
|
|
376
|
+
owners: [
|
|
377
|
+
{ login: 'dry-run-user', personal: true },
|
|
378
|
+
{ login: 'dry-run-org', personal: false, description: 'CEZ_DRY_RUN=1 fake organisation' },
|
|
379
|
+
],
|
|
380
|
+
};
|
|
381
|
+
}
|
|
382
|
+
const exec = run ?? spawnCommandRunner;
|
|
383
|
+
const cwd = process.cwd();
|
|
384
|
+
const settle = (args) => exec('gh', args, { cwd }).catch((err) => ({ ok: false, error: errText(err) }));
|
|
385
|
+
const [user, orgs] = await Promise.all([
|
|
386
|
+
settle(['api', 'user', '--jq', '[.login, .avatar_url // ""] | @tsv']),
|
|
387
|
+
settle(['api', 'user/orgs', '--paginate', '--jq', '.[] | [.login, .avatar_url // "", .description // ""] | @tsv']),
|
|
388
|
+
]);
|
|
389
|
+
if (!user.ok)
|
|
390
|
+
return { available: false, reason: user.notFound ? GH_MISSING : unauthenticated(user.error) };
|
|
391
|
+
const me = parseOwnerLine(user.stdout.split('\n')[0] ?? '', true);
|
|
392
|
+
if (!me)
|
|
393
|
+
return { available: false, reason: 'gh returned no GitHub login' };
|
|
394
|
+
// An org listing failure (e.g. a token without read:org) still leaves the
|
|
395
|
+
// personal account — degrade to that rather than hide GitHub entirely.
|
|
396
|
+
const orgOwners = new Map();
|
|
397
|
+
if (orgs.ok) {
|
|
398
|
+
for (const line of orgs.stdout.split('\n')) {
|
|
399
|
+
const org = parseOwnerLine(line, false);
|
|
400
|
+
if (org && org.login !== me.login)
|
|
401
|
+
orgOwners.set(org.login, org);
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
const sorted = [...orgOwners.values()].sort((a, b) => a.login.localeCompare(b.login));
|
|
405
|
+
return { available: true, owners: [me, ...sorted] };
|
|
406
|
+
}
|
|
407
|
+
/** One `login<TAB>avatar[<TAB>description]` line from `gh --jq … | @tsv`.
|
|
408
|
+
* Only https avatars are passed on — the cockpit renders them as `<img src>`. */
|
|
409
|
+
function parseOwnerLine(line, personal) {
|
|
410
|
+
const [login = '', avatar = '', ...rest] = line.split('\t');
|
|
411
|
+
const trimmed = login.trim();
|
|
412
|
+
if (!OWNER_SEGMENT.test(trimmed))
|
|
413
|
+
return null;
|
|
414
|
+
// `@tsv` escapes tabs/newlines inside a field as `\t`/`\n`; fold them to spaces.
|
|
415
|
+
const description = rest.join(' ').replace(/\\[tnr]/g, ' ').replace(/\s+/g, ' ').trim();
|
|
416
|
+
return {
|
|
417
|
+
login: trimmed,
|
|
418
|
+
personal,
|
|
419
|
+
...(avatar.trim().startsWith('https://') ? { avatarUrl: avatar.trim() } : {}),
|
|
420
|
+
...(description !== '' ? { description: description.slice(0, 200) } : {}),
|
|
421
|
+
};
|
|
422
|
+
}
|
|
423
|
+
function unauthenticated(error) {
|
|
424
|
+
return `gh is not authenticated — run \`gh auth login\` (${firstLine(error)})`;
|
|
425
|
+
}
|
|
426
|
+
/** `gh api` reports a missing repository as `HTTP 404`. */
|
|
427
|
+
function isNotFound(error) {
|
|
428
|
+
return /\b404\b|Not Found/.test(error);
|
|
429
|
+
}
|
|
430
|
+
/** The HTTPS remote, never the bare slug: `gh` would pick SSH from its own config, and an SSH key
|
|
431
|
+
* is what an organisation's SAML policy may reject (#968, `RepoRef.cloneUrl`). */
|
|
432
|
+
function cloneUrl(slug) {
|
|
433
|
+
return `https://github.com/${slug}.git`;
|
|
434
|
+
}
|
|
435
|
+
function webUrl(slug) {
|
|
436
|
+
return `https://github.com/${slug}`;
|
|
437
|
+
}
|
|
438
|
+
/** POSIX single-quoting for a copyable command: bare when safe, `''` when empty. */
|
|
439
|
+
function shellQuote(arg) {
|
|
440
|
+
return /^[A-Za-z0-9_./:@=-]+$/.test(arg) ? arg : `'${arg.replace(/'/g, `'\\''`)}'`;
|
|
441
|
+
}
|
|
442
|
+
function firstLine(text) {
|
|
443
|
+
return text.split('\n')[0]?.trim() || text;
|
|
444
|
+
}
|
|
445
|
+
function errText(err) {
|
|
446
|
+
return err instanceof Error ? err.message : String(err);
|
|
447
|
+
}
|
|
448
|
+
//# sourceMappingURL=create-project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-project.js","sourceRoot":"","sources":["../../src/server/create-project.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,9 +8,15 @@ type ProjectResult = {
|
|
|
8
8
|
} | {
|
|
9
9
|
projectsReason: string;
|
|
10
10
|
};
|
|
11
|
+
/** The boards linked to a repository. Throws on any failure; the caller classifies it. */
|
|
12
|
+
export declare function fetchRepositoryProjects(run: GraphqlRunner, owner: string, name: string): Promise<GithubProject[]>;
|
|
13
|
+
/** Which of `projects` each issue in `numbers` belongs to. Throws on any failure or on an
|
|
14
|
+
* incomplete membership page. */
|
|
15
|
+
export declare function fetchProjectMembership(run: GraphqlRunner, owner: string, name: string, projects: readonly GithubProject[], numbers: readonly number[]): Promise<Record<number, string[]>>;
|
|
11
16
|
/** Discover only repository-linked boards, then memberships for exactly the loaded issues.
|
|
12
17
|
* Pagination has both page and caller-owned time bounds. Incomplete metadata disables this
|
|
13
18
|
* optional filter rather than falsely claiming that some issues do not belong to a board.
|
|
19
|
+
* `discover` lets a caller share one discovery across list pages (hearsay-tools/cezarion#1183).
|
|
14
20
|
*/
|
|
15
|
-
export declare function fetchIssueProjects(run: GraphqlRunner, owner: string, name: string, numbers: readonly number[] | (() => Promise<readonly number[]>)): Promise<ProjectResult>;
|
|
21
|
+
export declare function fetchIssueProjects(run: GraphqlRunner, owner: string, name: string, numbers: readonly number[] | (() => Promise<readonly number[]>), discover?: () => Promise<GithubProject[]>): Promise<ProjectResult>;
|
|
16
22
|
export {};
|
|
@@ -48,62 +48,77 @@ export async function fetchViewerLogin(run) {
|
|
|
48
48
|
return undefined;
|
|
49
49
|
}
|
|
50
50
|
}
|
|
51
|
+
/** The boards linked to a repository. Throws on any failure; the caller classifies it. */
|
|
52
|
+
export async function fetchRepositoryProjects(run, owner, name) {
|
|
53
|
+
const projects = new Map();
|
|
54
|
+
let cursor;
|
|
55
|
+
for (let page = 0;; page++) {
|
|
56
|
+
if (page >= 10)
|
|
57
|
+
throw new Error('Project discovery exceeded its page limit');
|
|
58
|
+
const raw = JSON.parse(await run(`query($owner:String!,$name:String!,$cursor:String) {
|
|
59
|
+
repository(owner:$owner,name:$name) { projectsV2(first:100,after:$cursor) {
|
|
60
|
+
nodes { id title url } pageInfo { hasNextPage endCursor }
|
|
61
|
+
} }
|
|
62
|
+
}`, { owner, name, ...(cursor ? { cursor } : {}) }));
|
|
63
|
+
assertGraphqlSuccess(raw);
|
|
64
|
+
const connection = projectsSchema.parse(raw).data.repository.projectsV2;
|
|
65
|
+
for (const board of connection.nodes)
|
|
66
|
+
if (board)
|
|
67
|
+
projects.set(board.id, board);
|
|
68
|
+
if (!connection.pageInfo.hasNextPage)
|
|
69
|
+
break;
|
|
70
|
+
const next = connection.pageInfo.endCursor;
|
|
71
|
+
if (!next || next === cursor)
|
|
72
|
+
throw new Error('Project discovery cursor did not advance');
|
|
73
|
+
cursor = next;
|
|
74
|
+
}
|
|
75
|
+
return [...projects.values()];
|
|
76
|
+
}
|
|
77
|
+
/** Which of `projects` each issue in `numbers` belongs to. Throws on any failure or on an
|
|
78
|
+
* incomplete membership page. */
|
|
79
|
+
export async function fetchProjectMembership(run, owner, name, projects, numbers) {
|
|
80
|
+
const known = new Set(projects.map(project => project.id));
|
|
81
|
+
const membership = {};
|
|
82
|
+
if (known.size === 0)
|
|
83
|
+
return membership;
|
|
84
|
+
const ids = [...new Set(numbers)];
|
|
85
|
+
if (ids.length > 1000 || ids.some(n => !Number.isSafeInteger(n) || n <= 0)) {
|
|
86
|
+
throw new Error('Invalid issue window');
|
|
87
|
+
}
|
|
88
|
+
for (let offset = 0; offset < ids.length; offset += 100) {
|
|
89
|
+
// The aliases and literals contain validated integers only; all external strings are variables.
|
|
90
|
+
const batch = ids.slice(offset, offset + 100);
|
|
91
|
+
const fields = batch.map(n => `i${n}: issue(number:${n}) {
|
|
92
|
+
projectItems(first:100,includeArchived:true) {
|
|
93
|
+
nodes { project { id } } pageInfo { hasNextPage endCursor }
|
|
94
|
+
}
|
|
95
|
+
}`).join('\n');
|
|
96
|
+
const raw = JSON.parse(await run(`query($owner:String!,$name:String!) {
|
|
97
|
+
repository(owner:$owner,name:$name) { ${fields} }
|
|
98
|
+
}`, { owner, name }));
|
|
99
|
+
assertGraphqlSuccess(raw);
|
|
100
|
+
const rows = membershipSchema.parse(raw).data.repository;
|
|
101
|
+
for (const n of batch) {
|
|
102
|
+
const connection = rows[`i${n}`]?.projectItems;
|
|
103
|
+
if (!connection || connection.pageInfo.hasNextPage)
|
|
104
|
+
throw new Error('Incomplete project memberships');
|
|
105
|
+
membership[n] = [...new Set(connection.nodes.flatMap(row => row && known.has(row.project.id) ? [row.project.id] : []))];
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return membership;
|
|
109
|
+
}
|
|
51
110
|
/** Discover only repository-linked boards, then memberships for exactly the loaded issues.
|
|
52
111
|
* Pagination has both page and caller-owned time bounds. Incomplete metadata disables this
|
|
53
112
|
* optional filter rather than falsely claiming that some issues do not belong to a board.
|
|
113
|
+
* `discover` lets a caller share one discovery across list pages (hearsay-tools/cezarion#1183).
|
|
54
114
|
*/
|
|
55
|
-
export async function fetchIssueProjects(run, owner, name, numbers) {
|
|
115
|
+
export async function fetchIssueProjects(run, owner, name, numbers, discover = () => fetchRepositoryProjects(run, owner, name)) {
|
|
56
116
|
try {
|
|
57
|
-
const projects =
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
const raw = JSON.parse(await run(`query($owner:String!,$name:String!,$cursor:String) {
|
|
63
|
-
repository(owner:$owner,name:$name) { projectsV2(first:100,after:$cursor) {
|
|
64
|
-
nodes { id title url } pageInfo { hasNextPage endCursor }
|
|
65
|
-
} }
|
|
66
|
-
}`, { owner, name, ...(cursor ? { cursor } : {}) }));
|
|
67
|
-
assertGraphqlSuccess(raw);
|
|
68
|
-
const connection = projectsSchema.parse(raw).data.repository.projectsV2;
|
|
69
|
-
for (const board of connection.nodes)
|
|
70
|
-
if (board)
|
|
71
|
-
projects.set(board.id, board);
|
|
72
|
-
if (!connection.pageInfo.hasNextPage)
|
|
73
|
-
break;
|
|
74
|
-
const next = connection.pageInfo.endCursor;
|
|
75
|
-
if (!next || next === cursor)
|
|
76
|
-
throw new Error('Project discovery cursor did not advance');
|
|
77
|
-
cursor = next;
|
|
78
|
-
}
|
|
79
|
-
const membership = {};
|
|
80
|
-
if (projects.size === 0)
|
|
81
|
-
return { projects: [], membership };
|
|
82
|
-
const ids = [...new Set(typeof numbers === 'function' ? await numbers() : numbers)];
|
|
83
|
-
if (ids.length > 1000 || ids.some(n => !Number.isSafeInteger(n) || n <= 0)) {
|
|
84
|
-
throw new Error('Invalid issue window');
|
|
85
|
-
}
|
|
86
|
-
for (let offset = 0; offset < ids.length; offset += 100) {
|
|
87
|
-
// The aliases and literals contain validated integers only; all external strings are variables.
|
|
88
|
-
const batch = ids.slice(offset, offset + 100);
|
|
89
|
-
const fields = batch.map(n => `i${n}: issue(number:${n}) {
|
|
90
|
-
projectItems(first:100,includeArchived:true) {
|
|
91
|
-
nodes { project { id } } pageInfo { hasNextPage endCursor }
|
|
92
|
-
}
|
|
93
|
-
}`).join('\n');
|
|
94
|
-
const raw = JSON.parse(await run(`query($owner:String!,$name:String!) {
|
|
95
|
-
repository(owner:$owner,name:$name) { ${fields} }
|
|
96
|
-
}`, { owner, name }));
|
|
97
|
-
assertGraphqlSuccess(raw);
|
|
98
|
-
const rows = membershipSchema.parse(raw).data.repository;
|
|
99
|
-
for (const n of batch) {
|
|
100
|
-
const connection = rows[`i${n}`]?.projectItems;
|
|
101
|
-
if (!connection || connection.pageInfo.hasNextPage)
|
|
102
|
-
throw new Error('Incomplete project memberships');
|
|
103
|
-
membership[n] = [...new Set(connection.nodes.flatMap(row => row && projects.has(row.project.id) ? [row.project.id] : []))];
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
return { projects: [...projects.values()], membership };
|
|
117
|
+
const projects = await discover();
|
|
118
|
+
if (projects.length === 0)
|
|
119
|
+
return { projects: [], membership: {} };
|
|
120
|
+
const ids = typeof numbers === 'function' ? await numbers() : numbers;
|
|
121
|
+
return { projects, membership: await fetchProjectMembership(run, owner, name, projects, ids) };
|
|
107
122
|
}
|
|
108
123
|
catch (error) {
|
|
109
124
|
return { projectsReason: projectFailureReason(error) };
|