@minionry/minion 0.7.36
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 +14 -0
- package/PRIVACY.md +357 -0
- package/README.md +57 -0
- package/THIRD_PARTY_NOTICES.md +245 -0
- package/bin/branding.js +4 -0
- package/bin/commands/browser-install.js +483 -0
- package/bin/commands/create-sandbox.js +542 -0
- package/bin/commands/fingerprint.js +101 -0
- package/bin/commands/login.js +400 -0
- package/bin/commands/logout.js +93 -0
- package/bin/commands/minions.js +211 -0
- package/bin/commands/sandboxes.js +309 -0
- package/bin/commands/status.js +298 -0
- package/bin/commands/whoami.js +153 -0
- package/bin/launch-env.js +35 -0
- package/bin/machine-identity.js +221 -0
- package/bin/machine-layout.js +200 -0
- package/bin/minion.js +839 -0
- package/bin/platform-endpoints.js +8 -0
- package/bin/postinstall.js +52 -0
- package/bin/pty-doctor.js +326 -0
- package/bin/pty-locator.js +110 -0
- package/bin/pty-provision.js +186 -0
- package/bin/sandbox/Dockerfile +78 -0
- package/bin/sandbox/entrypoint.sh +14 -0
- package/bin/sandbox/install-repo.sh +53 -0
- package/bin/sandbox/seccomp-userns.json +883 -0
- package/bin/sandbox-config.js +306 -0
- package/dist/bin/machine-identity.js +221 -0
- package/dist/bin/machine-layout.js +200 -0
- package/dist/electron-host/agent-lease.js +141 -0
- package/dist/electron-host/dom-driver.js +642 -0
- package/dist/electron-host/ipc-protocol.js +89 -0
- package/dist/electron-host/js-driver.js +216 -0
- package/dist/electron-host/view-manager.js +254 -0
- package/dist/server/cli/engine-resume.js +49 -0
- package/dist/server/cli/eta-estimator.js +278 -0
- package/dist/server/cli/headless/background-activity.js +109 -0
- package/dist/server/cli/headless/claude-invoker-process.js +614 -0
- package/dist/server/cli/headless/claude-invoker-stall.js +150 -0
- package/dist/server/cli/headless/claude-invoker-stream.js +555 -0
- package/dist/server/cli/headless/claude-invoker-tools.js +148 -0
- package/dist/server/cli/headless/claude-invoker.js +151 -0
- package/dist/server/cli/headless/engine-availability.js +92 -0
- package/dist/server/cli/headless/engine-notice.js +185 -0
- package/dist/server/cli/headless/haiku-assessments.js +293 -0
- package/dist/server/cli/headless/headless-logger.js +75 -0
- package/dist/server/cli/headless/index.js +9 -0
- package/dist/server/cli/headless/mcp-config.js +314 -0
- package/dist/server/cli/headless/native-timeout-detector.js +72 -0
- package/dist/server/cli/headless/output-utils.js +71 -0
- package/dist/server/cli/headless/prompt-utils.js +82 -0
- package/dist/server/cli/headless/resilient-runner.js +326 -0
- package/dist/server/cli/headless/retry-strategies.js +292 -0
- package/dist/server/cli/headless/runner.js +245 -0
- package/dist/server/cli/headless/stall-assessor.js +295 -0
- package/dist/server/cli/headless/tool-watchdog.js +447 -0
- package/dist/server/cli/headless/types.js +18 -0
- package/dist/server/cli/history-portability.js +85 -0
- package/dist/server/cli/improvisation-attachments.js +99 -0
- package/dist/server/cli/improvisation-history-store.js +121 -0
- package/dist/server/cli/improvisation-movements.js +137 -0
- package/dist/server/cli/improvisation-output-queue.js +34 -0
- package/dist/server/cli/improvisation-retry.js +8 -0
- package/dist/server/cli/improvisation-session-manager.js +1016 -0
- package/dist/server/cli/improvisation-types.js +31 -0
- package/dist/server/cli/plan-lifecycle.js +72 -0
- package/dist/server/cli/prompt-builders.js +371 -0
- package/dist/server/cli/retry/retry-best-result.js +28 -0
- package/dist/server/cli/retry/retry-context-loss.js +75 -0
- package/dist/server/cli/retry/retry-recovery-strategies.js +213 -0
- package/dist/server/cli/retry/retry-resume-strategy.js +20 -0
- package/dist/server/cli/retry/retry-runner-factory.js +92 -0
- package/dist/server/cli/retry/retry-tool-results.js +22 -0
- package/dist/server/cli/retry/retry-types.js +3 -0
- package/dist/server/engines/EngineEvent.js +57 -0
- package/dist/server/engines/claude/ClaudeCodeEngine.js +316 -0
- package/dist/server/engines/claude/claude-command.js +32 -0
- package/dist/server/engines/codex/CodexEngine.js +469 -0
- package/dist/server/engines/codex/codex-auth.js +203 -0
- package/dist/server/engines/codex/codex-invoker.js +205 -0
- package/dist/server/engines/codex/codex-provision.js +215 -0
- package/dist/server/engines/credentials/credential-probe.js +88 -0
- package/dist/server/engines/credentials/model-profiles.js +249 -0
- package/dist/server/engines/credentials/provider-credentials.js +146 -0
- package/dist/server/engines/engine-event-stream.js +52 -0
- package/dist/server/engines/execution/engine-session.js +380 -0
- package/dist/server/engines/factory.js +42 -0
- package/dist/server/engines/hermes/HermesEngine.js +628 -0
- package/dist/server/engines/hermes/hermes-auth.js +159 -0
- package/dist/server/engines/hermes/hermes-gateway-home.js +271 -0
- package/dist/server/engines/hermes/hermes-invoker.js +350 -0
- package/dist/server/engines/hermes/hermes-provision.js +318 -0
- package/dist/server/engines/read-only.js +20 -0
- package/dist/server/engines/types.js +27 -0
- package/dist/server/handlers/company-execution-registry.js +67 -0
- package/dist/server/handlers/company-handlers.js +514 -0
- package/dist/server/handlers/company-triggers.js +189 -0
- package/dist/server/handlers/company-types.js +3 -0
- package/dist/server/index.js +244 -0
- package/dist/server/mcp/app-tools-bridge.js +110 -0
- package/dist/server/mcp/app-tools-mcp-server.js +99 -0
- package/dist/server/mcp/bouncer-integration.js +744 -0
- package/dist/server/mcp/browser-mcp-server.js +915 -0
- package/dist/server/mcp/browser-redaction.js +103 -0
- package/dist/server/mcp/classifier/BouncerClassifier.js +3 -0
- package/dist/server/mcp/classifier/ClaudeBouncerClassifier.js +212 -0
- package/dist/server/mcp/classifier/factory.js +124 -0
- package/dist/server/mcp/classifier/health.js +54 -0
- package/dist/server/mcp/classifier/telemetry.js +0 -0
- package/dist/server/mcp/company-patterns.js +104 -0
- package/dist/server/mcp/department-profiles.js +133 -0
- package/dist/server/mcp/quality-bridge.js +153 -0
- package/dist/server/mcp/quality-mcp-server.js +105 -0
- package/dist/server/mcp/security-analysis.js +384 -0
- package/dist/server/mcp/security-audit.js +152 -0
- package/dist/server/mcp/security-patterns.js +314 -0
- package/dist/server/mcp/server.js +194 -0
- package/dist/server/mcp/test-utils/agent-simulator.js +301 -0
- package/dist/server/mcp/test-utils/e2e-agent.js +103 -0
- package/dist/server/mcp/test-utils/e2e-capture.js +92 -0
- package/dist/server/mcp/test-utils/e2e-client.js +116 -0
- package/dist/server/mcp/test-utils/e2e-fixtures.js +87 -0
- package/dist/server/mcp/test-utils/e2e-gating.js +8 -0
- package/dist/server/mcp/test-utils/e2e-harness.js +8 -0
- package/dist/server/mcp/test-utils/e2e-scenarios.js +105 -0
- package/dist/server/routes/files.js +18 -0
- package/dist/server/routes/improvise.js +64 -0
- package/dist/server/routes/index.js +7 -0
- package/dist/server/routes/instances.js +41 -0
- package/dist/server/routes/internal.js +900 -0
- package/dist/server/routes/notifications.js +110 -0
- package/dist/server/server-setup.js +282 -0
- package/dist/server/services/agent-push.js +148 -0
- package/dist/server/services/analytics.js +197 -0
- package/dist/server/services/apps/build.js +249 -0
- package/dist/server/services/apps/greenlight.js +199 -0
- package/dist/server/services/apps/install.js +101 -0
- package/dist/server/services/apps/layout.js +35 -0
- package/dist/server/services/apps/serve.js +665 -0
- package/dist/server/services/apps/space-apps.js +248 -0
- package/dist/server/services/auth.js +48 -0
- package/dist/server/services/browser/chrome-sandbox.js +245 -0
- package/dist/server/services/browser/chromium-launch-spec.js +51 -0
- package/dist/server/services/browser/claude-reasoner.js +669 -0
- package/dist/server/services/browser/debug-log.js +3 -0
- package/dist/server/services/browser/driver-state.js +546 -0
- package/dist/server/services/browser/electron-provision.js +256 -0
- package/dist/server/services/browser/host-internal.js +245 -0
- package/dist/server/services/browser/host-mock.js +334 -0
- package/dist/server/services/browser/host-types.js +3 -0
- package/dist/server/services/browser/host.js +1067 -0
- package/dist/server/services/browser/index.js +4 -0
- package/dist/server/services/browser/ipc-client.js +354 -0
- package/dist/server/services/browser/pipewire-sink.js +199 -0
- package/dist/server/services/browser/preflight.js +590 -0
- package/dist/server/services/browser/reasoning-agent.js +659 -0
- package/dist/server/services/browser/sandbox-policy.js +169 -0
- package/dist/server/services/browser/stderr-noise-filter.js +26 -0
- package/dist/server/services/browser/telemetry.js +107 -0
- package/dist/server/services/browser/xvfb-supervisor.js +139 -0
- package/dist/server/services/browser-frame-policy.js +56 -0
- package/dist/server/services/client-id.js +32 -0
- package/dist/server/services/collab/registry.js +408 -0
- package/dist/server/services/collab/session.js +489 -0
- package/dist/server/services/collab/text-diff.js +28 -0
- package/dist/server/services/collab/types.js +19 -0
- package/dist/server/services/e2ee-group-key.js +197 -0
- package/dist/server/services/e2ee-identity.js +203 -0
- package/dist/server/services/file-explorer-ops.js +328 -0
- package/dist/server/services/file-transfer-zip.js +188 -0
- package/dist/server/services/files.js +111 -0
- package/dist/server/services/git/branch-ops.js +62 -0
- package/dist/server/services/git/command.js +68 -0
- package/dist/server/services/git/commit-message.js +74 -0
- package/dist/server/services/git/diff-ops.js +56 -0
- package/dist/server/services/git/haiku.js +76 -0
- package/dist/server/services/git/head-watcher.js +226 -0
- package/dist/server/services/git/index.js +17 -0
- package/dist/server/services/git/log-ops.js +98 -0
- package/dist/server/services/git/merge-ops.js +314 -0
- package/dist/server/services/git/parsers.js +401 -0
- package/dist/server/services/git/remote-ops.js +192 -0
- package/dist/server/services/git/status-ops.js +105 -0
- package/dist/server/services/git/suggestion-ops.js +80 -0
- package/dist/server/services/git/tag-ops.js +36 -0
- package/dist/server/services/git/types.js +4 -0
- package/dist/server/services/git/worktree-ops.js +114 -0
- package/dist/server/services/instances.js +337 -0
- package/dist/server/services/model-catalog.js +247 -0
- package/dist/server/services/observability/posthog.js +153 -0
- package/dist/server/services/pathUtils.js +114 -0
- package/dist/server/services/plan/agent-loader.js +97 -0
- package/dist/server/services/plan/agent-manager.js +363 -0
- package/dist/server/services/plan/agent-resolver.js +74 -0
- package/dist/server/services/plan/agents/assess-stall.md +33 -0
- package/dist/server/services/plan/agents/browser-planner.md +53 -0
- package/dist/server/services/plan/agents/browser-reasoner.md +114 -0
- package/dist/server/services/plan/agents/check-injection.md +95 -0
- package/dist/server/services/plan/agents/classify-error.md +30 -0
- package/dist/server/services/plan/agents/code-review.md +142 -0
- package/dist/server/services/plan/agents/commit-message.md +28 -0
- package/dist/server/services/plan/agents/detect-context-loss.md +30 -0
- package/dist/server/services/plan/agents/execute-issue.md +58 -0
- package/dist/server/services/plan/agents/fix-quality.md +25 -0
- package/dist/server/services/plan/agents/plan-coordinator.md +72 -0
- package/dist/server/services/plan/agents/pr-description.md +29 -0
- package/dist/server/services/plan/agents/retry-task.md +27 -0
- package/dist/server/services/plan/agents/review-code.md +38 -0
- package/dist/server/services/plan/agents/review-quality.md +45 -0
- package/dist/server/services/plan/agents/triage-findings.md +78 -0
- package/dist/server/services/plan/agents/verify-review.md +57 -0
- package/dist/server/services/plan/approval-evaluator.js +143 -0
- package/dist/server/services/plan/board-archive.js +102 -0
- package/dist/server/services/plan/board-config.js +108 -0
- package/dist/server/services/plan/board-export.js +214 -0
- package/dist/server/services/plan/composer-prompt.js +115 -0
- package/dist/server/services/plan/composer.js +664 -0
- package/dist/server/services/plan/config-installer.js +103 -0
- package/dist/server/services/plan/dependency-resolver.js +137 -0
- package/dist/server/services/plan/executor.js +696 -0
- package/dist/server/services/plan/front-matter.js +43 -0
- package/dist/server/services/plan/issue-classification.js +10 -0
- package/dist/server/services/plan/issue-effort.js +182 -0
- package/dist/server/services/plan/issue-loader.js +35 -0
- package/dist/server/services/plan/issue-prompt-builder.js +152 -0
- package/dist/server/services/plan/issue-retry.js +42 -0
- package/dist/server/services/plan/issue-writer.js +102 -0
- package/dist/server/services/plan/metrics-collector.js +272 -0
- package/dist/server/services/plan/output-manager.js +77 -0
- package/dist/server/services/plan/parser-core.js +435 -0
- package/dist/server/services/plan/parser-migration.js +108 -0
- package/dist/server/services/plan/parser.js +258 -0
- package/dist/server/services/plan/plan-runner-factory.js +68 -0
- package/dist/server/services/plan/pm-timeline.js +320 -0
- package/dist/server/services/plan/progress-log.js +101 -0
- package/dist/server/services/plan/prompt-builder.js +142 -0
- package/dist/server/services/plan/quality-delta.js +274 -0
- package/dist/server/services/plan/readiness-planner.js +34 -0
- package/dist/server/services/plan/review-gate.js +409 -0
- package/dist/server/services/plan/review-report.js +134 -0
- package/dist/server/services/plan/review-verdict-stream.js +161 -0
- package/dist/server/services/plan/state-reconciler.js +238 -0
- package/dist/server/services/plan/template-diff.js +175 -0
- package/dist/server/services/plan/template-instantiator.js +516 -0
- package/dist/server/services/plan/template-manifest.js +56 -0
- package/dist/server/services/plan/template-types.js +3 -0
- package/dist/server/services/plan/trigger-evaluator.js +211 -0
- package/dist/server/services/plan/types.js +3 -0
- package/dist/server/services/plan/watcher.js +73 -0
- package/dist/server/services/platform-credentials.js +56 -0
- package/dist/server/services/platform-e2ee.js +421 -0
- package/dist/server/services/platform-envelope.js +102 -0
- package/dist/server/services/platform-heartbeat.js +88 -0
- package/dist/server/services/platform-reconnect.js +60 -0
- package/dist/server/services/platform-token-lifecycle.js +95 -0
- package/dist/server/services/platform-url.js +17 -0
- package/dist/server/services/platform.js +656 -0
- package/dist/server/services/runtime-info.js +9 -0
- package/dist/server/services/schedule/agent-schedule-store.js +232 -0
- package/dist/server/services/schedule/agent-scheduler.js +323 -0
- package/dist/server/services/schedule/daily-timing.js +105 -0
- package/dist/server/services/schedule/quality-schedule-launch.js +11 -0
- package/dist/server/services/schedule/quality-schedule-store.js +211 -0
- package/dist/server/services/schedule/quality-scheduler.js +215 -0
- package/dist/server/services/schedule/run-bootstrap.js +329 -0
- package/dist/server/services/schedule/schedule-store.js +238 -0
- package/dist/server/services/schedule/schedule-wire.js +77 -0
- package/dist/server/services/schedule/scheduler.js +310 -0
- package/dist/server/services/schedule/template-source.js +97 -0
- package/dist/server/services/sdk/agent-sessions.js +264 -0
- package/dist/server/services/sdk/agents.js +557 -0
- package/dist/server/services/sdk/app-endpoints.js +48 -0
- package/dist/server/services/sdk/app-tools.js +303 -0
- package/dist/server/services/sdk/audit.js +48 -0
- package/dist/server/services/sdk/browser-transport.js +188 -0
- package/dist/server/services/sdk/browser.js +605 -0
- package/dist/server/services/sdk/composer.js +129 -0
- package/dist/server/services/sdk/connect.js +273 -0
- package/dist/server/services/sdk/consent-cooldown.js +31 -0
- package/dist/server/services/sdk/endpoint-url.js +141 -0
- package/dist/server/services/sdk/endpoints.js +314 -0
- package/dist/server/services/sdk/file-change-notify.js +36 -0
- package/dist/server/services/sdk/files-app.js +163 -0
- package/dist/server/services/sdk/files-search.js +131 -0
- package/dist/server/services/sdk/files-transfer.js +279 -0
- package/dist/server/services/sdk/files-workspace.js +233 -0
- package/dist/server/services/sdk/git.js +520 -0
- package/dist/server/services/sdk/grant-store.js +318 -0
- package/dist/server/services/sdk/host-ops.js +84 -0
- package/dist/server/services/sdk/inference-claude.js +214 -0
- package/dist/server/services/sdk/inference.js +247 -0
- package/dist/server/services/sdk/live-registry.js +42 -0
- package/dist/server/services/sdk/local-app-bindings.js +71 -0
- package/dist/server/services/sdk/pipeline.js +190 -0
- package/dist/server/services/sdk/pm-execute.js +228 -0
- package/dist/server/services/sdk/pm-planning-tap.js +29 -0
- package/dist/server/services/sdk/pm-schedule.js +165 -0
- package/dist/server/services/sdk/pm.js +634 -0
- package/dist/server/services/sdk/quality-change-notify.js +20 -0
- package/dist/server/services/sdk/quality-schedule.js +165 -0
- package/dist/server/services/sdk/quality.js +602 -0
- package/dist/server/services/sdk/rate-limits.js +198 -0
- package/dist/server/services/sdk/registry.js +597 -0
- package/dist/server/services/sdk/revoke.js +86 -0
- package/dist/server/services/sdk/run-profile.js +41 -0
- package/dist/server/services/sdk/sandbox.js +89 -0
- package/dist/server/services/sdk/storage.js +110 -0
- package/dist/server/services/sdk/streams.js +147 -0
- package/dist/server/services/sdk/terminal.js +201 -0
- package/dist/server/services/sdk/test-utils/workshop-browser-app.js +466 -0
- package/dist/server/services/sentry.js +99 -0
- package/dist/server/services/settings.js +374 -0
- package/dist/server/services/snippets/expander.js +87 -0
- package/dist/server/services/snippets/index.js +6 -0
- package/dist/server/services/snippets/loader.js +119 -0
- package/dist/server/services/snippets/parser.js +52 -0
- package/dist/server/services/snippets/types.js +3 -0
- package/dist/server/services/snippets/watcher.js +60 -0
- package/dist/server/services/space-layout.js +80 -0
- package/dist/server/services/system-prompts.js +219 -0
- package/dist/server/services/terminal/pty-manager.js +206 -0
- package/dist/server/services/terminal/pty-utils.js +150 -0
- package/dist/server/services/timeline/assembler.js +890 -0
- package/dist/server/services/timeline/contract.js +196 -0
- package/dist/server/services/timeline/index.js +4 -0
- package/dist/server/services/websocket/agent-schedule-handlers.js +217 -0
- package/dist/server/services/websocket/apps-handlers.js +399 -0
- package/dist/server/services/websocket/ask-user-question-bridge.js +112 -0
- package/dist/server/services/websocket/autocomplete-index.js +415 -0
- package/dist/server/services/websocket/autocomplete-match.js +243 -0
- package/dist/server/services/websocket/autocomplete.js +407 -0
- package/dist/server/services/websocket/browser-agent-runtime.js +208 -0
- package/dist/server/services/websocket/browser-device-profile.js +46 -0
- package/dist/server/services/websocket/browser-handlers.js +377 -0
- package/dist/server/services/websocket/browser-host-broadcast.js +179 -0
- package/dist/server/services/websocket/browser-ice-config.js +121 -0
- package/dist/server/services/websocket/browser-payloads.js +222 -0
- package/dist/server/services/websocket/browser-viewer-lifecycle.js +84 -0
- package/dist/server/services/websocket/browser-viewer-registry.js +118 -0
- package/dist/server/services/websocket/collab-broadcast.js +11 -0
- package/dist/server/services/websocket/collab-handlers.js +116 -0
- package/dist/server/services/websocket/commit-suggestion-service.js +132 -0
- package/dist/server/services/websocket/debug-log.js +38 -0
- package/dist/server/services/websocket/dispatch-util.js +10 -0
- package/dist/server/services/websocket/engine-auth-handlers.js +323 -0
- package/dist/server/services/websocket/engine-credential-watcher.js +83 -0
- package/dist/server/services/websocket/engine-profile-handlers.js +92 -0
- package/dist/server/services/websocket/file-definition-handlers.js +180 -0
- package/dist/server/services/websocket/file-download-handler.js +291 -0
- package/dist/server/services/websocket/file-explorer-handlers.js +291 -0
- package/dist/server/services/websocket/file-search-handlers.js +267 -0
- package/dist/server/services/websocket/file-share-handlers.js +328 -0
- package/dist/server/services/websocket/file-transfer-http.js +361 -0
- package/dist/server/services/websocket/file-upload-handler.js +267 -0
- package/dist/server/services/websocket/file-utils.js +346 -0
- package/dist/server/services/websocket/git-branch-handlers.js +90 -0
- package/dist/server/services/websocket/git-diff-handlers.js +59 -0
- package/dist/server/services/websocket/git-handlers.js +212 -0
- package/dist/server/services/websocket/git-head-watcher.js +85 -0
- package/dist/server/services/websocket/git-log-handlers.js +104 -0
- package/dist/server/services/websocket/git-pr-handlers.js +56 -0
- package/dist/server/services/websocket/git-tag-handlers.js +53 -0
- package/dist/server/services/websocket/git-utils.js +11 -0
- package/dist/server/services/websocket/git-worktree-handlers.js +521 -0
- package/dist/server/services/websocket/handler-context.js +113 -0
- package/dist/server/services/websocket/handler.js +1197 -0
- package/dist/server/services/websocket/index.js +5 -0
- package/dist/server/services/websocket/movement-written-files.js +26 -0
- package/dist/server/services/websocket/msg-id-tracker.js +48 -0
- package/dist/server/services/websocket/plan-board-handlers.js +410 -0
- package/dist/server/services/websocket/plan-execution-handlers.js +244 -0
- package/dist/server/services/websocket/plan-handlers.js +67 -0
- package/dist/server/services/websocket/plan-helpers.js +161 -0
- package/dist/server/services/websocket/plan-issue-handlers.js +168 -0
- package/dist/server/services/websocket/plan-sprint-handlers.js +190 -0
- package/dist/server/services/websocket/plan-transfer-handlers.js +310 -0
- package/dist/server/services/websocket/pm-timeline-broadcast.js +28 -0
- package/dist/server/services/websocket/post-session-scan.js +132 -0
- package/dist/server/services/websocket/prompt-queue-handlers.js +96 -0
- package/dist/server/services/websocket/quality-agent-cost.js +229 -0
- package/dist/server/services/websocket/quality-agent-notes.js +113 -0
- package/dist/server/services/websocket/quality-change-activity.js +187 -0
- package/dist/server/services/websocket/quality-complexity.js +345 -0
- package/dist/server/services/websocket/quality-dependencies.js +445 -0
- package/dist/server/services/websocket/quality-duplication.js +162 -0
- package/dist/server/services/websocket/quality-eta.js +65 -0
- package/dist/server/services/websocket/quality-fingerprint.js +104 -0
- package/dist/server/services/websocket/quality-grading.js +575 -0
- package/dist/server/services/websocket/quality-handlers.js +48 -0
- package/dist/server/services/websocket/quality-linting.js +270 -0
- package/dist/server/services/websocket/quality-operations.js +54 -0
- package/dist/server/services/websocket/quality-persistence.js +410 -0
- package/dist/server/services/websocket/quality-review-agent.js +526 -0
- package/dist/server/services/websocket/quality-run.js +220 -0
- package/dist/server/services/websocket/quality-secrets.js +0 -0
- package/dist/server/services/websocket/quality-service.js +775 -0
- package/dist/server/services/websocket/quality-tools.js +383 -0
- package/dist/server/services/websocket/quality-triage-agent.js +101 -0
- package/dist/server/services/websocket/quality-types.js +149 -0
- package/dist/server/services/websocket/recommended-answers.js +28 -0
- package/dist/server/services/websocket/schedule-handlers.js +197 -0
- package/dist/server/services/websocket/sdk-agent-host.js +569 -0
- package/dist/server/services/websocket/sdk-browser-host.js +459 -0
- package/dist/server/services/websocket/sdk-composer-host.js +10 -0
- package/dist/server/services/websocket/sdk-git-host.js +115 -0
- package/dist/server/services/websocket/sdk-handlers.js +242 -0
- package/dist/server/services/websocket/sdk-pm-execution-host.js +63 -0
- package/dist/server/services/websocket/sdk-pm-schedule-host.js +21 -0
- package/dist/server/services/websocket/sdk-quality-schedule-host.js +34 -0
- package/dist/server/services/websocket/sdk-terminal-host.js +140 -0
- package/dist/server/services/websocket/session-handlers.js +565 -0
- package/dist/server/services/websocket/session-history.js +335 -0
- package/dist/server/services/websocket/session-initialization.js +315 -0
- package/dist/server/services/websocket/session-registry.js +340 -0
- package/dist/server/services/websocket/session-role-directory.js +39 -0
- package/dist/server/services/websocket/settings-handlers.js +276 -0
- package/dist/server/services/websocket/skill-handlers.js +324 -0
- package/dist/server/services/websocket/skill-watcher.js +83 -0
- package/dist/server/services/websocket/snippet-handlers.js +261 -0
- package/dist/server/services/websocket/tab-broadcast.js +35 -0
- package/dist/server/services/websocket/tab-event-buffer.js +110 -0
- package/dist/server/services/websocket/tab-event-replay.js +47 -0
- package/dist/server/services/websocket/tab-handlers.js +211 -0
- package/dist/server/services/websocket/terminal-handlers.js +268 -0
- package/dist/server/services/websocket/types.js +96 -0
- package/dist/server/types/company-messages.js +102 -0
- package/dist/server/utils/agent-manager.js +202 -0
- package/dist/server/utils/console-timestamps.js +24 -0
- package/dist/server/utils/file-store.js +112 -0
- package/dist/server/utils/paths.js +28 -0
- package/dist/server/utils/port-manager.js +43 -0
- package/dist/server/utils/port.js +204 -0
- package/electron-host/dist/agent-lease.js +141 -0
- package/electron-host/dist/capture-recovery.js +77 -0
- package/electron-host/dist/codec-policy.js +37 -0
- package/electron-host/dist/controller-channel.js +60 -0
- package/electron-host/dist/controller-handlers.js +153 -0
- package/electron-host/dist/device-emulator.js +106 -0
- package/electron-host/dist/dom-driver.js +642 -0
- package/electron-host/dist/domain-registry.js +159 -0
- package/electron-host/dist/domain-validators.js +308 -0
- package/electron-host/dist/editable-focus-reporter.js +143 -0
- package/electron-host/dist/fake-peer.test-util.js +105 -0
- package/electron-host/dist/host-log.js +31 -0
- package/electron-host/dist/host-wire.js +11 -0
- package/electron-host/dist/input-router.js +421 -0
- package/electron-host/dist/ipc-protocol.js +89 -0
- package/electron-host/dist/ipc-server.js +193 -0
- package/electron-host/dist/js-driver.js +216 -0
- package/electron-host/dist/main-guards.js +70 -0
- package/electron-host/dist/main.js +716 -0
- package/electron-host/dist/roster-sync.js +87 -0
- package/electron-host/dist/rpc-context.js +1 -0
- package/electron-host/dist/rpc-tab-methods.js +138 -0
- package/electron-host/dist/rpc-webrtc-methods.js +121 -0
- package/electron-host/dist/screen-capture-cache.js +147 -0
- package/electron-host/dist/sdk-injector.js +166 -0
- package/electron-host/dist/sdp.js +102 -0
- package/electron-host/dist/session-surface.js +78 -0
- package/electron-host/dist/surface-sizing.js +59 -0
- package/electron-host/dist/view-manager.js +254 -0
- package/electron-host/dist/viewer-registry.js +46 -0
- package/electron-host/dist/viewer-session.js +288 -0
- package/electron-host/dist/webrtc-channels.js +14 -0
- package/electron-host/dist/webrtc-controller.js +57 -0
- package/electron-host/dist/webrtc-ice-filter.js +13 -0
- package/electron-host/dist/webrtc-peer.js +45 -0
- package/electron-host/package.json +12 -0
- package/electron-host/tsconfig.json +23 -0
- package/electron-host/webrtc-controller-preload.cjs +3 -0
- package/electron-host/webrtc-controller.html +14 -0
- package/package.json +85 -0
- package/vendor/e2ee/LICENSE +14 -0
- package/vendor/e2ee/package.json +14 -0
- package/vendor/e2ee/src/index.js +310 -0
|
@@ -0,0 +1,520 @@
|
|
|
1
|
+
// Copyright (c) 2025-present Minionry, Inc.
|
|
2
|
+
// SPDX-License-Identifier: LicenseRef-Minionry-Software
|
|
3
|
+
import { resolve, sep } from 'node:path';
|
|
4
|
+
import { abortMerge, checkoutBranch, commit as commitCore, completeMerge, createBranch, createPullRequest, createTag, createWorktree, deleteBranch, discardMergeBlockers, discoverRepos, generatePrDescription, generateStagedCommitMessage, isSafeDiscardPath, isValidWorktreePath, listBranches, listTags, listWorktrees, MAX_COMMIT_MESSAGE_LENGTH, mergeWorktreeBranch, popMergeStashBySha, previewMerge, pull as pullCore, push as pushCore, pushTag, pushWorktree, readCommitDetail, readCommitFileDiff, readCurrentBranch, readFileDiff, readHeadSha, readLog, readRemoteInfo, readStatus, redactRemoteCredentials, removeWorktree, resolveMainWorktreePath, stagePaths, unstagePaths, } from '../git/index.js';
|
|
5
|
+
import { getGrant } from './grant-store.js';
|
|
6
|
+
import { listLiveSubscriptions, registerLiveSubscription } from './live-registry.js';
|
|
7
|
+
import { SdkMethodError } from './registry.js';
|
|
8
|
+
let gitHost = null;
|
|
9
|
+
export function setSdkGitHost(host) {
|
|
10
|
+
gitHost = host;
|
|
11
|
+
}
|
|
12
|
+
export function resetSdkGitHost() {
|
|
13
|
+
gitHost = null;
|
|
14
|
+
}
|
|
15
|
+
function requireHost() {
|
|
16
|
+
if (!gitHost) {
|
|
17
|
+
throw new SdkMethodError('INTERNAL', 'git host is not wired — the WebSocket handler installs it at startup');
|
|
18
|
+
}
|
|
19
|
+
return gitHost;
|
|
20
|
+
}
|
|
21
|
+
function paramsObject(params) {
|
|
22
|
+
return typeof params === 'object' && params !== null && !Array.isArray(params)
|
|
23
|
+
? params
|
|
24
|
+
: {};
|
|
25
|
+
}
|
|
26
|
+
function requireStringParam(raw, name, method) {
|
|
27
|
+
const value = raw[name];
|
|
28
|
+
if (typeof value !== 'string' || value === '') {
|
|
29
|
+
throw new SdkMethodError('BAD_REQUEST', `${method} requires params { ${name} } — a non-empty string`);
|
|
30
|
+
}
|
|
31
|
+
return value;
|
|
32
|
+
}
|
|
33
|
+
function requireHashParam(raw, name, method) {
|
|
34
|
+
const value = requireStringParam(raw, name, method);
|
|
35
|
+
if (!/^[0-9a-f]{4,64}$/i.test(value)) {
|
|
36
|
+
throw new SdkMethodError('BAD_REQUEST', `${method}: ${name} must be a 4-64 char hex commit hash`);
|
|
37
|
+
}
|
|
38
|
+
return value;
|
|
39
|
+
}
|
|
40
|
+
function requireRefParam(raw, name, method) {
|
|
41
|
+
const value = requireStringParam(raw, name, method);
|
|
42
|
+
if (value.startsWith('-') || /[\s\x00-\x1f\x7f]/.test(value)) {
|
|
43
|
+
throw new SdkMethodError('BAD_REQUEST', `${method}: ${name} is not a valid ref name`);
|
|
44
|
+
}
|
|
45
|
+
return value;
|
|
46
|
+
}
|
|
47
|
+
function optionalRefParam(raw, name, method) {
|
|
48
|
+
return raw[name] === undefined ? undefined : requireRefParam(raw, name, method);
|
|
49
|
+
}
|
|
50
|
+
function optionalStringParam(raw, name, method) {
|
|
51
|
+
if (raw[name] === undefined)
|
|
52
|
+
return undefined;
|
|
53
|
+
const value = raw[name];
|
|
54
|
+
if (typeof value !== 'string') {
|
|
55
|
+
throw new SdkMethodError('BAD_REQUEST', `${method}: ${name} must be a string when present`);
|
|
56
|
+
}
|
|
57
|
+
return value;
|
|
58
|
+
}
|
|
59
|
+
function requireStringArrayParam(raw, name, method) {
|
|
60
|
+
const value = raw[name];
|
|
61
|
+
if (!Array.isArray(value) || value.length === 0 || !value.every((p) => typeof p === 'string' && p !== '')) {
|
|
62
|
+
throw new SdkMethodError('BAD_REQUEST', `${method} requires params { ${name} } — a non-empty array of non-empty strings`);
|
|
63
|
+
}
|
|
64
|
+
return value;
|
|
65
|
+
}
|
|
66
|
+
function optionalBoundedInt(raw, name, method, bounds) {
|
|
67
|
+
const value = raw[name];
|
|
68
|
+
if (value === undefined)
|
|
69
|
+
return bounds.fallback;
|
|
70
|
+
if (typeof value !== 'number' || !Number.isInteger(value) || value < bounds.min || value > bounds.max) {
|
|
71
|
+
throw new SdkMethodError('BAD_REQUEST', `${method}: ${name} must be an integer between ${bounds.min} and ${bounds.max}`);
|
|
72
|
+
}
|
|
73
|
+
return value;
|
|
74
|
+
}
|
|
75
|
+
function unwrap(result) {
|
|
76
|
+
if (!result.ok)
|
|
77
|
+
throw new SdkMethodError('INTERNAL', result.error);
|
|
78
|
+
return result.value;
|
|
79
|
+
}
|
|
80
|
+
async function resolveGitDir(args, raw) {
|
|
81
|
+
const worktree = raw.worktree;
|
|
82
|
+
if (worktree === undefined) {
|
|
83
|
+
return requireHost().activeGitDir(args.tabId, args.workingDir);
|
|
84
|
+
}
|
|
85
|
+
if (typeof worktree !== 'string' || worktree === '') {
|
|
86
|
+
throw new SdkMethodError('BAD_REQUEST', `${args.method}: worktree must be a non-empty string when present`);
|
|
87
|
+
}
|
|
88
|
+
const repoDir = requireHost().repoDir(args.tabId, args.workingDir);
|
|
89
|
+
if (!(await isValidWorktreePath(worktree, repoDir))) {
|
|
90
|
+
throw new SdkMethodError('BAD_REQUEST', `${args.method}: '${worktree}' is not a registered worktree of this Space's repository`);
|
|
91
|
+
}
|
|
92
|
+
return resolve(worktree);
|
|
93
|
+
}
|
|
94
|
+
function requireContainedPath(cwd, path, method) {
|
|
95
|
+
const root = resolve(cwd);
|
|
96
|
+
const target = resolve(cwd, path);
|
|
97
|
+
if (target !== root && !target.startsWith(root + sep)) {
|
|
98
|
+
throw new SdkMethodError('BAD_REQUEST', `${method}: path escapes the worktree`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
export async function gitStatusHandler(args) {
|
|
102
|
+
const raw = paramsObject(args.params);
|
|
103
|
+
const cwd = await resolveGitDir(args, raw);
|
|
104
|
+
const read = unwrap(await readStatus({ cwd }));
|
|
105
|
+
if (read.status.isDirty && gitHost) {
|
|
106
|
+
const headSha = await readHeadSha({ cwd });
|
|
107
|
+
const suggestion = headSha === null ? null : gitHost.commitSuggestionForStatus(cwd, headSha, read.porcelain);
|
|
108
|
+
if (suggestion)
|
|
109
|
+
return { ...read.status, commitSuggestion: suggestion };
|
|
110
|
+
}
|
|
111
|
+
return read.status;
|
|
112
|
+
}
|
|
113
|
+
const DEFAULT_LOG_LIMIT = 10;
|
|
114
|
+
const MAX_LOG_LIMIT = 500;
|
|
115
|
+
export async function gitLogHandler(args) {
|
|
116
|
+
const raw = paramsObject(args.params);
|
|
117
|
+
const limit = optionalBoundedInt(raw, 'limit', args.method, { min: 1, max: MAX_LOG_LIMIT, fallback: DEFAULT_LOG_LIMIT });
|
|
118
|
+
const skip = optionalBoundedInt(raw, 'skip', args.method, { min: 0, max: Number.MAX_SAFE_INTEGER, fallback: 0 });
|
|
119
|
+
if (raw.search !== undefined && typeof raw.search !== 'string') {
|
|
120
|
+
throw new SdkMethodError('BAD_REQUEST', `${args.method}: search must be a string when present`);
|
|
121
|
+
}
|
|
122
|
+
const search = typeof raw.search === 'string' ? raw.search.trim() : '';
|
|
123
|
+
const cwd = await resolveGitDir(args, raw);
|
|
124
|
+
const page = unwrap(await readLog({ cwd, limit, skip, search }));
|
|
125
|
+
return { entries: page.entries, hasMore: page.hasMore, skip, search: search || undefined };
|
|
126
|
+
}
|
|
127
|
+
export async function gitDiffHandler(args) {
|
|
128
|
+
const raw = paramsObject(args.params);
|
|
129
|
+
const path = requireStringParam(raw, 'path', args.method);
|
|
130
|
+
const staged = raw.staged === true;
|
|
131
|
+
const cwd = await resolveGitDir(args, raw);
|
|
132
|
+
requireContainedPath(cwd, path, args.method);
|
|
133
|
+
const { original, modified } = await readFileDiff({ cwd, path, staged });
|
|
134
|
+
return { path, original, modified, staged };
|
|
135
|
+
}
|
|
136
|
+
export async function gitShowHandler(args) {
|
|
137
|
+
const raw = paramsObject(args.params);
|
|
138
|
+
const hash = requireHashParam(raw, 'hash', args.method);
|
|
139
|
+
const cwd = await resolveGitDir(args, raw);
|
|
140
|
+
return unwrap(await readCommitDetail({ cwd, hash }));
|
|
141
|
+
}
|
|
142
|
+
export async function gitCommitDiffHandler(args) {
|
|
143
|
+
const raw = paramsObject(args.params);
|
|
144
|
+
const hash = requireHashParam(raw, 'hash', args.method);
|
|
145
|
+
const path = requireStringParam(raw, 'path', args.method);
|
|
146
|
+
const cwd = await resolveGitDir(args, raw);
|
|
147
|
+
const { original, modified } = await readCommitFileDiff({ cwd, hash, path });
|
|
148
|
+
return { hash, path, original, modified };
|
|
149
|
+
}
|
|
150
|
+
export async function gitBranchesListHandler(args) {
|
|
151
|
+
const raw = paramsObject(args.params);
|
|
152
|
+
const cwd = await resolveGitDir(args, raw);
|
|
153
|
+
return unwrap(await listBranches({ cwd }));
|
|
154
|
+
}
|
|
155
|
+
export async function gitTagsListHandler(args) {
|
|
156
|
+
const raw = paramsObject(args.params);
|
|
157
|
+
const cwd = await resolveGitDir(args, raw);
|
|
158
|
+
return { tags: unwrap(await listTags({ cwd })) };
|
|
159
|
+
}
|
|
160
|
+
export async function gitRemoteInfoHandler(args) {
|
|
161
|
+
const raw = paramsObject(args.params);
|
|
162
|
+
const cwd = await resolveGitDir(args, raw);
|
|
163
|
+
const info = await readRemoteInfo({ cwd });
|
|
164
|
+
return info.remoteUrl === undefined ? info : { ...info, remoteUrl: redactRemoteCredentials(info.remoteUrl) };
|
|
165
|
+
}
|
|
166
|
+
export async function gitReposDiscoverHandler(args) {
|
|
167
|
+
const { repos, rootIsGitRepo } = await discoverRepos({ cwd: args.workingDir });
|
|
168
|
+
return { repos, rootIsGitRepo };
|
|
169
|
+
}
|
|
170
|
+
export async function gitWorktreesListHandler(args) {
|
|
171
|
+
const host = requireHost();
|
|
172
|
+
const worktrees = unwrap(await listWorktrees({ cwd: host.repoDir(args.tabId, args.workingDir) }));
|
|
173
|
+
return { worktrees, activeWorktreePath: host.activeWorktreePath(args.tabId, args.workingDir) };
|
|
174
|
+
}
|
|
175
|
+
export async function gitMergePreviewHandler(args) {
|
|
176
|
+
const raw = paramsObject(args.params);
|
|
177
|
+
const sourceBranch = requireRefParam(raw, 'sourceBranch', args.method);
|
|
178
|
+
const targetBranch = requireRefParam(raw, 'targetBranch', args.method);
|
|
179
|
+
const cwd = await resolveGitDir(args, raw);
|
|
180
|
+
return previewMerge({ cwd, sourceBranch, targetBranch });
|
|
181
|
+
}
|
|
182
|
+
export async function gitPrGenerateDescriptionHandler(args) {
|
|
183
|
+
const raw = paramsObject(args.params);
|
|
184
|
+
const baseBranch = raw.baseBranch === undefined ? 'main' : requireRefParam(raw, 'baseBranch', args.method);
|
|
185
|
+
const cwd = await resolveGitDir(args, raw);
|
|
186
|
+
return unwrap(await generatePrDescription({ cwd, baseBranch }));
|
|
187
|
+
}
|
|
188
|
+
function assertFreshSubscription(args) {
|
|
189
|
+
if (listLiveSubscriptions().some((sub) => sub.requestId === args.requestId)) {
|
|
190
|
+
throw new SdkMethodError('BAD_REQUEST', `requestId '${args.requestId}' already holds a live subscription`);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
function subscriptionViewerId(args) {
|
|
194
|
+
return getGrant(args.appId, args.spaceKey) ? undefined : args.viewerId;
|
|
195
|
+
}
|
|
196
|
+
export function gitSubscribeBranchChangedHandler(args) {
|
|
197
|
+
assertFreshSubscription(args);
|
|
198
|
+
const host = requireHost();
|
|
199
|
+
let active = true;
|
|
200
|
+
const unsubscribe = host.subscribeBranchChanged((event) => {
|
|
201
|
+
if (!active)
|
|
202
|
+
return;
|
|
203
|
+
args.emit('branchChanged', event);
|
|
204
|
+
});
|
|
205
|
+
registerLiveSubscription({
|
|
206
|
+
requestId: args.requestId,
|
|
207
|
+
appId: args.appId,
|
|
208
|
+
origin: args.origin,
|
|
209
|
+
spaceKey: args.spaceKey,
|
|
210
|
+
kind: 'git.subscribeBranchChanged',
|
|
211
|
+
viewerId: subscriptionViewerId(args),
|
|
212
|
+
teardown: () => {
|
|
213
|
+
active = false;
|
|
214
|
+
unsubscribe();
|
|
215
|
+
},
|
|
216
|
+
});
|
|
217
|
+
return { subscribed: true };
|
|
218
|
+
}
|
|
219
|
+
export function gitSubscribeCommitSuggestionHandler(args) {
|
|
220
|
+
assertFreshSubscription(args);
|
|
221
|
+
const host = requireHost();
|
|
222
|
+
let active = true;
|
|
223
|
+
const unsubscribe = host.subscribeCommitSuggestion((suggestion) => {
|
|
224
|
+
if (!active)
|
|
225
|
+
return;
|
|
226
|
+
args.emit('commitSuggestion', suggestion);
|
|
227
|
+
});
|
|
228
|
+
registerLiveSubscription({
|
|
229
|
+
requestId: args.requestId,
|
|
230
|
+
appId: args.appId,
|
|
231
|
+
origin: args.origin,
|
|
232
|
+
spaceKey: args.spaceKey,
|
|
233
|
+
kind: 'git.subscribeCommitSuggestion',
|
|
234
|
+
viewerId: subscriptionViewerId(args),
|
|
235
|
+
teardown: () => {
|
|
236
|
+
active = false;
|
|
237
|
+
unsubscribe();
|
|
238
|
+
},
|
|
239
|
+
});
|
|
240
|
+
return { subscribed: true };
|
|
241
|
+
}
|
|
242
|
+
export function gitWorktreesSubscribeHandler(args) {
|
|
243
|
+
assertFreshSubscription(args);
|
|
244
|
+
const host = requireHost();
|
|
245
|
+
let active = true;
|
|
246
|
+
const unsubscribe = host.subscribeWorktreesChanged(() => {
|
|
247
|
+
if (!active)
|
|
248
|
+
return;
|
|
249
|
+
void listWorktrees({ cwd: host.repoDir(args.tabId, args.workingDir) })
|
|
250
|
+
.then((listed) => {
|
|
251
|
+
if (!active || !listed.ok)
|
|
252
|
+
return;
|
|
253
|
+
const payload = {
|
|
254
|
+
worktrees: listed.value,
|
|
255
|
+
activeWorktreePath: host.activeWorktreePath(args.tabId, args.workingDir),
|
|
256
|
+
};
|
|
257
|
+
args.emit('worktreesChanged', payload);
|
|
258
|
+
})
|
|
259
|
+
.catch(() => {
|
|
260
|
+
});
|
|
261
|
+
});
|
|
262
|
+
registerLiveSubscription({
|
|
263
|
+
requestId: args.requestId,
|
|
264
|
+
appId: args.appId,
|
|
265
|
+
origin: args.origin,
|
|
266
|
+
spaceKey: args.spaceKey,
|
|
267
|
+
kind: 'git.worktrees.subscribe',
|
|
268
|
+
viewerId: subscriptionViewerId(args),
|
|
269
|
+
teardown: () => {
|
|
270
|
+
active = false;
|
|
271
|
+
unsubscribe();
|
|
272
|
+
},
|
|
273
|
+
});
|
|
274
|
+
return { subscribed: true };
|
|
275
|
+
}
|
|
276
|
+
export async function gitStageHandler(args) {
|
|
277
|
+
const raw = paramsObject(args.params);
|
|
278
|
+
const stageAll = raw.all === true;
|
|
279
|
+
const paths = stageAll ? undefined : requireStringArrayParam(raw, 'paths', args.method);
|
|
280
|
+
const cwd = await resolveGitDir(args, raw);
|
|
281
|
+
return unwrap(await stagePaths({ cwd, stageAll, paths }));
|
|
282
|
+
}
|
|
283
|
+
export async function gitUnstageHandler(args) {
|
|
284
|
+
const raw = paramsObject(args.params);
|
|
285
|
+
const paths = requireStringArrayParam(raw, 'paths', args.method);
|
|
286
|
+
const cwd = await resolveGitDir(args, raw);
|
|
287
|
+
return unwrap(await unstagePaths({ cwd, paths }));
|
|
288
|
+
}
|
|
289
|
+
export async function gitCommitHandler(args) {
|
|
290
|
+
const raw = paramsObject(args.params);
|
|
291
|
+
const message = requireStringParam(raw, 'message', args.method);
|
|
292
|
+
if (message.length > MAX_COMMIT_MESSAGE_LENGTH) {
|
|
293
|
+
throw new SdkMethodError('BAD_REQUEST', `${args.method}: message too long (${message.length} chars, max ${MAX_COMMIT_MESSAGE_LENGTH})`);
|
|
294
|
+
}
|
|
295
|
+
const cwd = await resolveGitDir(args, raw);
|
|
296
|
+
const result = await commitCore({ cwd, message });
|
|
297
|
+
if (!result.ok) {
|
|
298
|
+
throw new SdkMethodError(result.nothingToCommit ? 'BAD_REQUEST' : 'INTERNAL', result.error);
|
|
299
|
+
}
|
|
300
|
+
return { hash: result.hash };
|
|
301
|
+
}
|
|
302
|
+
export async function gitGenerateCommitMessageHandler(args) {
|
|
303
|
+
const raw = paramsObject(args.params);
|
|
304
|
+
const cwd = await resolveGitDir(args, raw);
|
|
305
|
+
const generated = await generateStagedCommitMessage({
|
|
306
|
+
cwd,
|
|
307
|
+
tabId: args.tabId,
|
|
308
|
+
startedAt: Date.now(),
|
|
309
|
+
autoCommit: false,
|
|
310
|
+
});
|
|
311
|
+
if (!generated.ok) {
|
|
312
|
+
throw new SdkMethodError(generated.error === 'No staged changes to commit' ? 'BAD_REQUEST' : 'INTERNAL', generated.error);
|
|
313
|
+
}
|
|
314
|
+
return { message: generated.value };
|
|
315
|
+
}
|
|
316
|
+
export async function gitCheckoutHandler(args) {
|
|
317
|
+
const raw = paramsObject(args.params);
|
|
318
|
+
const branch = requireRefParam(raw, 'branch', args.method);
|
|
319
|
+
const startPoint = optionalRefParam(raw, 'startPoint', args.method);
|
|
320
|
+
const cwd = await resolveGitDir(args, raw);
|
|
321
|
+
const result = unwrap(await checkoutBranch({ cwd, branch, create: raw.create === true, startPoint }));
|
|
322
|
+
return { branch, previous: result.previous };
|
|
323
|
+
}
|
|
324
|
+
export async function gitBranchesCreateHandler(args) {
|
|
325
|
+
const raw = paramsObject(args.params);
|
|
326
|
+
const name = requireRefParam(raw, 'name', args.method);
|
|
327
|
+
const startPoint = optionalRefParam(raw, 'startPoint', args.method);
|
|
328
|
+
const cwd = await resolveGitDir(args, raw);
|
|
329
|
+
return unwrap(await createBranch({ cwd, name, startPoint, checkout: raw.checkout === true }));
|
|
330
|
+
}
|
|
331
|
+
export async function gitBranchesDeleteHandler(args) {
|
|
332
|
+
const raw = paramsObject(args.params);
|
|
333
|
+
const name = requireRefParam(raw, 'name', args.method);
|
|
334
|
+
const cwd = await resolveGitDir(args, raw);
|
|
335
|
+
return unwrap(await deleteBranch({ cwd, name, force: raw.force === true }));
|
|
336
|
+
}
|
|
337
|
+
export async function gitTagsCreateHandler(args) {
|
|
338
|
+
const raw = paramsObject(args.params);
|
|
339
|
+
const name = requireRefParam(raw, 'name', args.method);
|
|
340
|
+
const message = optionalStringParam(raw, 'message', args.method);
|
|
341
|
+
const commit = optionalRefParam(raw, 'commit', args.method);
|
|
342
|
+
const cwd = await resolveGitDir(args, raw);
|
|
343
|
+
return unwrap(await createTag({ cwd, name, message, commit }));
|
|
344
|
+
}
|
|
345
|
+
export async function gitWorktreesCreateHandler(args) {
|
|
346
|
+
const raw = paramsObject(args.params);
|
|
347
|
+
const branchName = requireRefParam(raw, 'branchName', args.method);
|
|
348
|
+
const baseBranch = optionalRefParam(raw, 'baseBranch', args.method);
|
|
349
|
+
const path = optionalStringParam(raw, 'path', args.method);
|
|
350
|
+
if (path !== undefined && (path === '' || path.startsWith('-'))) {
|
|
351
|
+
throw new SdkMethodError('BAD_REQUEST', `${args.method}: path is not a valid destination`);
|
|
352
|
+
}
|
|
353
|
+
const host = requireHost();
|
|
354
|
+
const cwd = host.repoDir(args.tabId, args.workingDir);
|
|
355
|
+
const created = unwrap(await createWorktree({ cwd, branchName, baseBranch, path }));
|
|
356
|
+
if (raw.assign === true) {
|
|
357
|
+
host.setActiveWorktree(args.tabId, args.workingDir, created.path, created.branch);
|
|
358
|
+
}
|
|
359
|
+
host.worktreesMutated();
|
|
360
|
+
return created;
|
|
361
|
+
}
|
|
362
|
+
export async function gitWorktreesRemoveHandler(args) {
|
|
363
|
+
const raw = paramsObject(args.params);
|
|
364
|
+
const path = requireStringParam(raw, 'path', args.method);
|
|
365
|
+
const host = requireHost();
|
|
366
|
+
const repoDir = host.repoDir(args.tabId, args.workingDir);
|
|
367
|
+
if (!(await isValidWorktreePath(path, repoDir))) {
|
|
368
|
+
throw new SdkMethodError('BAD_REQUEST', `${args.method}: '${path}' is not a registered worktree of this Space's repository`);
|
|
369
|
+
}
|
|
370
|
+
const removed = unwrap(await removeWorktree({ cwd: repoDir, path: resolve(path), force: raw.force === true, deleteBranch: raw.deleteBranch === true }));
|
|
371
|
+
host.releaseWorktreeReferences(removed.path, args.workingDir);
|
|
372
|
+
host.worktreesMutated();
|
|
373
|
+
return removed;
|
|
374
|
+
}
|
|
375
|
+
let warnedSwitchActiveWorktreeAlias = false;
|
|
376
|
+
export async function gitWorktreesSwitchActiveHandler(args) {
|
|
377
|
+
const raw = paramsObject(args.params);
|
|
378
|
+
const host = requireHost();
|
|
379
|
+
let path = null;
|
|
380
|
+
if ('path' in raw) {
|
|
381
|
+
path = raw.path;
|
|
382
|
+
}
|
|
383
|
+
else if ('worktree' in raw) {
|
|
384
|
+
if (!warnedSwitchActiveWorktreeAlias) {
|
|
385
|
+
warnedSwitchActiveWorktreeAlias = true;
|
|
386
|
+
console.warn(`[sdk] ${args.method}: params.worktree is deprecated, use params.path instead`);
|
|
387
|
+
}
|
|
388
|
+
path = raw.worktree;
|
|
389
|
+
}
|
|
390
|
+
if (path === null) {
|
|
391
|
+
host.setActiveWorktree(args.tabId, args.workingDir, null, null);
|
|
392
|
+
host.worktreesMutated();
|
|
393
|
+
return { path: null, worktreePath: null, branch: null };
|
|
394
|
+
}
|
|
395
|
+
if (typeof path !== 'string' || path === '') {
|
|
396
|
+
throw new SdkMethodError('BAD_REQUEST', `${args.method}: path must be a non-empty string or null`);
|
|
397
|
+
}
|
|
398
|
+
if (!(await isValidWorktreePath(path, host.repoDir(args.tabId, args.workingDir)))) {
|
|
399
|
+
throw new SdkMethodError('BAD_REQUEST', `${args.method}: '${path}' is not a registered worktree of this Space's repository`);
|
|
400
|
+
}
|
|
401
|
+
const worktreePath = resolve(path);
|
|
402
|
+
const branch = await readCurrentBranch(worktreePath);
|
|
403
|
+
host.setActiveWorktree(args.tabId, args.workingDir, worktreePath, branch || null);
|
|
404
|
+
host.worktreesMutated();
|
|
405
|
+
return { path: worktreePath, worktreePath, branch: branch || null };
|
|
406
|
+
}
|
|
407
|
+
const MERGE_STRATEGIES = new Set(['merge', 'squash', 'rebase']);
|
|
408
|
+
export async function gitMergeRunHandler(args) {
|
|
409
|
+
const raw = paramsObject(args.params);
|
|
410
|
+
const sourceBranch = requireRefParam(raw, 'sourceBranch', args.method);
|
|
411
|
+
const targetBranch = requireRefParam(raw, 'targetBranch', args.method);
|
|
412
|
+
const strategy = requireStringParam(raw, 'strategy', args.method);
|
|
413
|
+
if (!MERGE_STRATEGIES.has(strategy)) {
|
|
414
|
+
throw new SdkMethodError('BAD_REQUEST', `${args.method}: strategy must be one of merge, squash, rebase`);
|
|
415
|
+
}
|
|
416
|
+
const commitMessage = optionalStringParam(raw, 'commitMessage', args.method);
|
|
417
|
+
if (commitMessage !== undefined && commitMessage.length > MAX_COMMIT_MESSAGE_LENGTH) {
|
|
418
|
+
throw new SdkMethodError('BAD_REQUEST', `${args.method}: commitMessage too long (max ${MAX_COMMIT_MESSAGE_LENGTH})`);
|
|
419
|
+
}
|
|
420
|
+
const cwd = await resolveGitDir(args, raw);
|
|
421
|
+
const { data, removedWorktreePath } = await mergeWorktreeBranch({
|
|
422
|
+
cwd,
|
|
423
|
+
sourceBranch,
|
|
424
|
+
targetBranch,
|
|
425
|
+
strategy,
|
|
426
|
+
commitMessage,
|
|
427
|
+
deleteWorktree: raw.deleteWorktree === true,
|
|
428
|
+
deleteBranch: raw.deleteBranch === true,
|
|
429
|
+
stashFirst: raw.stashFirst === true,
|
|
430
|
+
});
|
|
431
|
+
if (removedWorktreePath) {
|
|
432
|
+
const host = requireHost();
|
|
433
|
+
host.releaseWorktreeReferences(removedWorktreePath, args.workingDir);
|
|
434
|
+
host.worktreesMutated();
|
|
435
|
+
}
|
|
436
|
+
return data;
|
|
437
|
+
}
|
|
438
|
+
async function resolveResolutionWorktree(args, raw, cwd) {
|
|
439
|
+
if (raw.targetWorktreePath !== undefined)
|
|
440
|
+
return resolveMergeTarget(args, raw);
|
|
441
|
+
return raw.worktree !== undefined ? cwd : undefined;
|
|
442
|
+
}
|
|
443
|
+
export async function gitMergeAbortHandler(args) {
|
|
444
|
+
const raw = paramsObject(args.params);
|
|
445
|
+
const cwd = await resolveGitDir(args, raw);
|
|
446
|
+
const targetWorktreePath = await resolveResolutionWorktree(args, raw, cwd);
|
|
447
|
+
unwrap(await abortMerge({ cwd, targetWorktreePath }));
|
|
448
|
+
return { aborted: true };
|
|
449
|
+
}
|
|
450
|
+
export async function gitMergeCompleteHandler(args) {
|
|
451
|
+
const raw = paramsObject(args.params);
|
|
452
|
+
const cwd = await resolveGitDir(args, raw);
|
|
453
|
+
const targetWorktreePath = await resolveResolutionWorktree(args, raw, cwd);
|
|
454
|
+
const result = unwrap(await completeMerge({ cwd, targetWorktreePath }));
|
|
455
|
+
return { success: true, mergeCommit: result.mergeCommit };
|
|
456
|
+
}
|
|
457
|
+
async function resolveMergeTarget(args, raw) {
|
|
458
|
+
const target = raw.targetWorktreePath;
|
|
459
|
+
if (target !== undefined) {
|
|
460
|
+
if (typeof target !== 'string' || target === '') {
|
|
461
|
+
throw new SdkMethodError('BAD_REQUEST', `${args.method}: targetWorktreePath must be a non-empty string when present`);
|
|
462
|
+
}
|
|
463
|
+
if (!(await isValidWorktreePath(target, requireHost().repoDir(args.tabId, args.workingDir)))) {
|
|
464
|
+
throw new SdkMethodError('BAD_REQUEST', `${args.method}: '${target}' is not a registered worktree of this Space's repository`);
|
|
465
|
+
}
|
|
466
|
+
return resolve(target);
|
|
467
|
+
}
|
|
468
|
+
return resolveMainWorktreePath(requireHost().activeGitDir(args.tabId, args.workingDir));
|
|
469
|
+
}
|
|
470
|
+
export async function gitMergeStashPopHandler(args) {
|
|
471
|
+
const raw = paramsObject(args.params);
|
|
472
|
+
const stashSha = requireHashParam(raw, 'stashSha', args.method);
|
|
473
|
+
const targetWorktreePath = await resolveMergeTarget(args, raw);
|
|
474
|
+
const result = await popMergeStashBySha(targetWorktreePath, stashSha);
|
|
475
|
+
if (result.exitCode !== 0) {
|
|
476
|
+
throw new SdkMethodError('INTERNAL', result.error || 'Failed to pop stash');
|
|
477
|
+
}
|
|
478
|
+
return { success: true, targetWorktreePath };
|
|
479
|
+
}
|
|
480
|
+
export async function gitMergeDiscardBlockersHandler(args) {
|
|
481
|
+
const raw = paramsObject(args.params);
|
|
482
|
+
const paths = requireStringArrayParam(raw, 'paths', args.method);
|
|
483
|
+
if (!paths.every(isSafeDiscardPath)) {
|
|
484
|
+
throw new SdkMethodError('BAD_REQUEST', `${args.method}: invalid path in discard list`);
|
|
485
|
+
}
|
|
486
|
+
const targetWorktreePath = await resolveMergeTarget(args, raw);
|
|
487
|
+
const result = unwrap(await discardMergeBlockers({ cwd: targetWorktreePath, paths }));
|
|
488
|
+
return { success: true, targetWorktreePath, paths: result.paths };
|
|
489
|
+
}
|
|
490
|
+
export async function gitPushHandler(args) {
|
|
491
|
+
const raw = paramsObject(args.params);
|
|
492
|
+
const remote = optionalRefParam(raw, 'remote', args.method);
|
|
493
|
+
const branch = optionalRefParam(raw, 'branch', args.method);
|
|
494
|
+
const cwd = await resolveGitDir(args, raw);
|
|
495
|
+
if (remote !== undefined || branch !== undefined || raw.setUpstream !== undefined) {
|
|
496
|
+
return unwrap(await pushWorktree({ cwd, remote, branch, setUpstream: raw.setUpstream === true }));
|
|
497
|
+
}
|
|
498
|
+
return unwrap(await pushCore({ cwd }));
|
|
499
|
+
}
|
|
500
|
+
export async function gitPullHandler(args) {
|
|
501
|
+
const raw = paramsObject(args.params);
|
|
502
|
+
const cwd = await resolveGitDir(args, raw);
|
|
503
|
+
return unwrap(await pullCore({ cwd }));
|
|
504
|
+
}
|
|
505
|
+
export async function gitTagsPushHandler(args) {
|
|
506
|
+
const raw = paramsObject(args.params);
|
|
507
|
+
const all = raw.all === true;
|
|
508
|
+
const name = all ? undefined : requireRefParam(raw, 'name', args.method);
|
|
509
|
+
const cwd = await resolveGitDir(args, raw);
|
|
510
|
+
return unwrap(await pushTag({ cwd, name, all }));
|
|
511
|
+
}
|
|
512
|
+
export async function gitPrCreateHandler(args) {
|
|
513
|
+
const raw = paramsObject(args.params);
|
|
514
|
+
const title = requireStringParam(raw, 'title', args.method);
|
|
515
|
+
const body = optionalStringParam(raw, 'body', args.method);
|
|
516
|
+
const baseBranch = optionalRefParam(raw, 'baseBranch', args.method);
|
|
517
|
+
const cwd = await resolveGitDir(args, raw);
|
|
518
|
+
const created = unwrap(await createPullRequest({ cwd, title, body, baseBranch, draft: raw.draft === true }));
|
|
519
|
+
return { url: created.url, method: created.method };
|
|
520
|
+
}
|