@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,256 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Load only when configured: ordinary mock turns retain their event-loop ordering.
|
|
3
|
+
const failureControl = process.env.CEZ_MOCK_FAILURE_CONTROL === undefined ? undefined
|
|
4
|
+
: (await import('./mock-failure-control.mjs')).readFailureControl();
|
|
5
|
+
// Print acknowledges an input on its first model work and cannot refuse one, so a held
|
|
6
|
+
// acknowledgement and a held response both hold that first model work.
|
|
7
|
+
const delivery = process.env.CEZ_MOCK_DELIVERY_CONTROL === undefined ? undefined
|
|
8
|
+
: (await import('./mock-delivery-control.mjs')).readDeliveryControl(['hold-ack', 'hold-response']);
|
|
9
|
+
import { appendFileSync, existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs';
|
|
10
|
+
// Publish a pid atomically (temporary sibling, then rename): a test reading it sees no
|
|
11
|
+
// file or a whole pid, never the empty file whose Number() is 0 (hearsay-tools/cezarion#953).
|
|
12
|
+
function watchdogWritePid(file, pid) { const tmp = `${file}.${process.pid}.tmp`; writeFileSync(tmp, pid); renameSync(tmp, file); }
|
|
13
|
+
import { spawn } from 'node:child_process';
|
|
14
|
+
import { join } from 'node:path';
|
|
15
|
+
// Dynamic, like every sibling import here, so a test's copy of this mock can repoint it.
|
|
16
|
+
const { answerNudge, NO_WAIT_NUDGE_PREFIX } = await import('./mock-nudge.mjs');
|
|
17
|
+
import { randomUUID } from 'node:crypto';
|
|
18
|
+
|
|
19
|
+
const args = process.argv.slice(2);
|
|
20
|
+
if (args.includes('--version')) { process.stdout.write('2026.10.01-e373342\n'); process.exit(0); }
|
|
21
|
+
if (args.includes('__cezar_probe_invalid__')) {
|
|
22
|
+
process.stderr.write('Invalid --allowed-tools value(s): __cezar_probe_invalid__. Expected one of: '+
|
|
23
|
+
'shell_tool_call, delete_tool_call, glob_tool_call, grep_tool_call, read_tool_call, update_todos_tool_call, read_todos_tool_call, edit_tool_call, ls_tool_call, read_lints_tool_call, mcp_tool_call, sem_search_tool_call, create_plan_tool_call, web_search_tool_call, list_mcp_resources_tool_call, read_mcp_resource_tool_call, apply_agent_diff_tool_call, ask_question_tool_call, fetch_tool_call, switch_mode_tool_call, generate_image_tool_call, record_screen_tool_call, computer_use_tool_call, write_shell_stdin_tool_call, reflect_tool_call, setup_vm_environment_tool_call, truncated_tool_call, web_fetch_tool_call, report_bugfix_results_tool_call, ai_attribution_tool_call, pr_management_tool_call, mcp_auth_tool_call, await_tool_call, blame_by_file_path_tool_call, get_mcp_tools_tool_call, report_bug_tool_call, set_active_branch_tool_call, communicate_update_tool_call, send_final_summary_tool_call, update_pr_code_tour_tool_call, replace_env_tool_call, edit_pr_labels_tool_call, record_ci_investigation_findings_tool_call, fetch_cloud_agent_data_tool_call, send_to_user_tool_call, pi_read_tool_call, pi_bash_tool_call, pi_edit_tool_call, pi_write_tool_call, pi_grep_tool_call, pi_find_tool_call, pi_ls_tool_call, connect_scm_tool_call, search_conversations_tool_call, create_goal_tool_call, update_goal_tool_call, get_pr_code_tour_tool_call, write_canvas_tool_call, read_canvas_tool_call, task_tool_call, create_agent_tool_call, adopt_tool_call, send_to_agent_tool_call, send_message_tool_call, get_agent_status_tool_call, stop_agent_tool_call, read_agent_transcript_tool_call, start_grind_execution_tool_call, start_grind_planning_tool_call\n');
|
|
24
|
+
process.exit(1);
|
|
25
|
+
}
|
|
26
|
+
const flag = name => { const at = args.indexOf(name); return at < 0 ? undefined : args[at + 1]; };
|
|
27
|
+
const resumeId = flag('--resume');
|
|
28
|
+
const mode = process.env.CEZ_MOCK_CURSOR_PRINT_MODE ?? 'normal';
|
|
29
|
+
const turn = resumeId ? 2 : 1;
|
|
30
|
+
// Cursor accepts a print prompt on stdin. Preserve the positional form so a
|
|
31
|
+
// regression back to argv delivery is visible to the runner tests.
|
|
32
|
+
const valueFlags = new Set(['--output-format', '--model', '--resume', '--allowed-tools',
|
|
33
|
+
'--add-dir', '--plugin-dir', '--image']);
|
|
34
|
+
let positionalPrompt = '';
|
|
35
|
+
for (let i = 0; i < args.length; i++) {
|
|
36
|
+
if (valueFlags.has(args[i])) { i++; continue; }
|
|
37
|
+
if (!args[i].startsWith('-')) positionalPrompt = args[i];
|
|
38
|
+
}
|
|
39
|
+
const stdinChunks = [];
|
|
40
|
+
if (!positionalPrompt) for await (const chunk of process.stdin) stdinChunks.push(chunk);
|
|
41
|
+
const stdinPrompt = Buffer.concat(stdinChunks).toString('utf8');
|
|
42
|
+
const promptArg = stdinPrompt || positionalPrompt;
|
|
43
|
+
const promptBoundary = promptArg.lastIndexOf('\n\n---\n\n');
|
|
44
|
+
const rawPrompt = promptBoundary < 0 ? promptArg : promptArg.slice(promptBoundary + '\n\n---\n\n'.length);
|
|
45
|
+
const taggedScenarios = [
|
|
46
|
+
['resume-done', 'a0000001'], ['autonomous-ask-cap', 'a0000002'],
|
|
47
|
+
['autonomous-cap', 'a0000003'], ['silent-tail-late-turn-start', 'a0000004'],
|
|
48
|
+
['silent-tail-no-reply', 'a0000005'], ['silent-tail-late-reply', 'a0000006'],
|
|
49
|
+
['silent-tail-slow-done', 'a0000007'], ['silent-tail-again', 'a0000008'],
|
|
50
|
+
['silent-tail', 'a0000009'], ['tool-tail', 'a000000a'],
|
|
51
|
+
];
|
|
52
|
+
const freshTag = taggedScenarios.find(([name]) => rawPrompt.includes(`mock:${name}`))?.[1];
|
|
53
|
+
const id = resumeId && mode !== 'mismatch-on-resume' ? resumeId
|
|
54
|
+
: (freshTag ? freshTag + randomUUID().slice(8) : randomUUID());
|
|
55
|
+
const stateFile = join(process.cwd(), '.ai', 'cezar', 'mock-cursor-print', `${id}.json`);
|
|
56
|
+
let origin = taggedScenarios.find(([, tag]) => resumeId?.startsWith(tag))?.[0];
|
|
57
|
+
if (resumeId && existsSync(stateFile)) {
|
|
58
|
+
try { origin = JSON.parse(readFileSync(stateFile, 'utf8')).origin ?? origin; } catch { /* isolated mock state */ }
|
|
59
|
+
}
|
|
60
|
+
if (freshTag) {
|
|
61
|
+
origin = taggedScenarios.find(([, tag]) => tag === freshTag)?.[0];
|
|
62
|
+
mkdirSync(join(process.cwd(), '.ai', 'cezar', 'mock-cursor-print'), { recursive: true });
|
|
63
|
+
writeFileSync(stateFile, JSON.stringify({ origin }));
|
|
64
|
+
}
|
|
65
|
+
// One process per turn: the session's opening scenario comes from its tag, not a latch.
|
|
66
|
+
const silentOrigin = /^(silent-tail|tool-tail)/.test(origin ?? '');
|
|
67
|
+
const prompt = silentOrigin ? rawPrompt : answerNudge(rawPrompt);
|
|
68
|
+
const frame = value => process.stdout.write(`${JSON.stringify(value)}\n`);
|
|
69
|
+
const assistant = text => frame({ type: 'assistant', session_id: id,
|
|
70
|
+
message: { role: 'assistant', content: [{ type: 'text', text }] } });
|
|
71
|
+
const result = (text, error = false) => frame({ type: 'result', subtype: error ? 'error_during_execution' : 'success',
|
|
72
|
+
session_id: id, is_error: error, result: text });
|
|
73
|
+
const readTool = (content = 'A project') => {
|
|
74
|
+
const call = { readToolCall: { args: { path: 'README.md' } } };
|
|
75
|
+
frame({ type: 'tool_call', subtype: 'started', call_id: 'read-1', session_id: id, tool_call: call });
|
|
76
|
+
frame({ type: 'tool_call', subtype: 'completed', call_id: 'read-1', session_id: id,
|
|
77
|
+
tool_call: { readToolCall: { ...call.readToolCall, result: { success: { content } } } } });
|
|
78
|
+
};
|
|
79
|
+
const waitForRelease = async (fallbackMs) => {
|
|
80
|
+
const file = process.env.CEZ_MOCK_RELEASE_FILE;
|
|
81
|
+
if (!file) { await new Promise(resolve => setTimeout(resolve, fallbackMs)); return; }
|
|
82
|
+
const deadline = Date.now() + 15_000;
|
|
83
|
+
while (!existsSync(file)) {
|
|
84
|
+
if (Date.now() > deadline) throw new Error('CEZ_MOCK_RELEASE_FILE was not created');
|
|
85
|
+
await new Promise(resolve => setTimeout(resolve, 10));
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
const finish = (text) => { assistant(text); result(text); };
|
|
89
|
+
const log = process.env.CEZ_MOCK_CURSOR_PRINT_LOG;
|
|
90
|
+
if (log) appendFileSync(log, `${JSON.stringify({ pid: process.pid, resumeId, id, args,
|
|
91
|
+
promptSource: stdinPrompt ? 'stdin' : 'argv', prompt: promptArg })}\n`);
|
|
92
|
+
if (process.env.CEZ_MOCK_ARGS_FILE) {
|
|
93
|
+
appendFileSync(process.env.CEZ_MOCK_ARGS_FILE, `${JSON.stringify(args)}\n`);
|
|
94
|
+
const pluginDir = flag('--plugin-dir');
|
|
95
|
+
if (pluginDir) appendFileSync(process.env.CEZ_MOCK_ARGS_FILE,
|
|
96
|
+
`${JSON.stringify({ type: 'cursor-print-plugin', ...JSON.parse(readFileSync(`${pluginDir}/mcp.json`, 'utf8')) })}\n`);
|
|
97
|
+
}
|
|
98
|
+
if (process.env.CEZ_MOCK_STDIN_FILE && stdinPrompt) {
|
|
99
|
+
appendFileSync(process.env.CEZ_MOCK_STDIN_FILE,
|
|
100
|
+
`${JSON.stringify({ method: 'cursor-print/stdin', prompt: stdinPrompt })}\n`);
|
|
101
|
+
}
|
|
102
|
+
if (mode === 'delay-init') await new Promise(resolve => setTimeout(resolve, 10_000));
|
|
103
|
+
// Reproduce a loaded host's per-process startup cost on every turn: Cursor print
|
|
104
|
+
// spawns one process per turn, so a cap row pays it MAX_AUTO_CONTINUES + 1 times
|
|
105
|
+
// (hearsay-tools/cezarion#1125).
|
|
106
|
+
const spawnDelayMs = Number.parseInt(process.env.CEZ_MOCK_CURSOR_SPAWN_DELAY_MS ?? '0', 10) || 0;
|
|
107
|
+
if (spawnDelayMs > 0) await new Promise(resolve => setTimeout(resolve, spawnDelayMs));
|
|
108
|
+
const attempt = log ? readFileSync(log, 'utf8').trim().split('\n').length : 1;
|
|
109
|
+
const rejectModel = () => process.stderr.write(`Cannot use this model: ${flag('--model')}. Available models: ${'other-model, '.repeat(1000)}\n`);
|
|
110
|
+
if (mode === 'model-rejection-always' || (mode === 'model-rejection-once' && attempt === 1) ||
|
|
111
|
+
(mode === 'model-rejection-on-resume' && resumeId && attempt === 2)) {
|
|
112
|
+
rejectModel(); process.exit(1);
|
|
113
|
+
}
|
|
114
|
+
if (mode === 'model-rejection-held') {
|
|
115
|
+
rejectModel(); await waitForRelease(10_000); process.exit(1);
|
|
116
|
+
}
|
|
117
|
+
if (mode === 'unrelated-startup-error') { process.stderr.write('Account unavailable\n'); process.exit(1); }
|
|
118
|
+
// hearsay-tools/cezarion#1112: a slow process start, before the init frame that opens the native turn.
|
|
119
|
+
if (prompt.includes('mock:deferred-turn-start')) await (await import('./mock-deferred-turn-start.mjs')).deferredTurnStart();
|
|
120
|
+
frame({ type: 'system', subtype: 'init', session_id: id, model: flag('--model') ?? 'auto', cwd: process.cwd() });
|
|
121
|
+
if (delivery) {
|
|
122
|
+
await new Promise(resolve => delivery.ack(prompt, resolve));
|
|
123
|
+
await delivery.holdResponse(prompt);
|
|
124
|
+
}
|
|
125
|
+
if (mode === 'model-rejection-after-init' || mode === 'model-rejection-after-work') {
|
|
126
|
+
if (mode === 'model-rejection-after-work') assistant('Work already began');
|
|
127
|
+
rejectModel(); process.exit(1);
|
|
128
|
+
}
|
|
129
|
+
if (mode === 'no-result') process.exit(0);
|
|
130
|
+
if (mode === 'portable-ask' && !resumeId) {
|
|
131
|
+
const ask = 'CEZ:ASK {"questions":[{"header":"Library","question":"Which library?","multiSelect":false,"options":[{"label":"Vitest","description":"Use Vitest"},{"label":"Jest","description":"Use Jest"}]}]}';
|
|
132
|
+
frame({ type: 'assistant', session_id: id, message: { role: 'assistant', content: [{ type: 'text', text: `Choose one.\n${ask}` }] } });
|
|
133
|
+
frame({ type: 'result', subtype: 'success', session_id: id, is_error: false, result: `Choose one.\n${ask}` });
|
|
134
|
+
process.exit(0);
|
|
135
|
+
}
|
|
136
|
+
if (mode === 'native-question') {
|
|
137
|
+
const args = { title: 'Choice', questions: [{ prompt: 'Choose', options: [{ label: 'Alpha' }, { label: 'Beta' }], allowMultiple: false }], runAsync: false };
|
|
138
|
+
const call = { askQuestionToolCall: { args } };
|
|
139
|
+
frame({ type: 'tool_call', subtype: 'started', call_id: 'question-1', session_id: id, tool_call: call });
|
|
140
|
+
frame({ type: 'tool_call', subtype: 'completed', call_id: 'question-1', session_id: id,
|
|
141
|
+
tool_call: { askQuestionToolCall: { args, result: { rejected: { reason: 'Questions skipped by the user, continue with the information you already have' } } } } });
|
|
142
|
+
finish('I could not ask the question.'); process.exit(0);
|
|
143
|
+
}
|
|
144
|
+
const selectedFailure = failureControl?.failureFor(prompt);
|
|
145
|
+
const nativeFailure = selectedFailure instanceof Promise ? await selectedFailure : selectedFailure;
|
|
146
|
+
if (failureControl ? nativeFailure === 'provider' : mode === 'provider-error') {
|
|
147
|
+
result('RetriableError: provider unavailable', true);
|
|
148
|
+
process.exit(0);
|
|
149
|
+
}
|
|
150
|
+
if (prompt.includes('mock:crash-stderr')) {
|
|
151
|
+
const { crashWithStderr } = await import('./mock-runner-crash.mjs');
|
|
152
|
+
crashWithStderr(prompt, '{"type":"assistant",');
|
|
153
|
+
}
|
|
154
|
+
if (prompt.includes('mock:autonomous') || prompt.startsWith('Continue working autonomously until the task is fully complete.')) {
|
|
155
|
+
const { autonomousReply } = await import('./mock-autonomous.mjs');
|
|
156
|
+
if (origin === 'autonomous-ask-cap' && resumeId && prompt.startsWith('Continue working autonomously until the task is fully complete.')) {
|
|
157
|
+
finish('Still working.'); process.exit(0);
|
|
158
|
+
}
|
|
159
|
+
const tagged = origin?.startsWith('autonomous') ? `${prompt} mock:${origin}` : prompt;
|
|
160
|
+
finish(autonomousReply(tagged)); process.exit(0);
|
|
161
|
+
}
|
|
162
|
+
if (prompt.includes('mock:silent-tail') || prompt.includes('mock:tool-tail') ||
|
|
163
|
+
(silentOrigin && prompt.includes(NO_WAIT_NUDGE_PREFIX))) {
|
|
164
|
+
const silent = await import('./mock-silent-tail.mjs');
|
|
165
|
+
if (silentOrigin && prompt.includes(NO_WAIT_NUDGE_PREFIX)) {
|
|
166
|
+
if (origin === 'silent-tail-no-reply') { setInterval(() => {}, 1000); await new Promise(() => {}); }
|
|
167
|
+
if (origin === 'silent-tail-late-reply') await new Promise(resolve => setTimeout(resolve, silent.LATE_REPLY_MS));
|
|
168
|
+
if (origin === 'silent-tail-slow-done') {
|
|
169
|
+
assistant(silent.SLOW_DONE_PREFIX);
|
|
170
|
+
// F10 can hold DONE while its test advances the reply clock; the default stays 400 ms.
|
|
171
|
+
await waitForRelease(silent.SLOW_DONE_TAIL_MS);
|
|
172
|
+
}
|
|
173
|
+
if (origin === 'silent-tail-again') { result(''); process.exit(0); }
|
|
174
|
+
finish(origin === 'tool-tail' ? silent.FINAL_MESSAGE_STANDING : silent.SILENT_TAIL_DONE);
|
|
175
|
+
process.exit(0);
|
|
176
|
+
}
|
|
177
|
+
assistant(prompt.includes('mock:tool-tail') ? silent.TOOL_TAIL_OPENING : silent.SILENT_TAIL_OPENING);
|
|
178
|
+
readTool(origin === 'silent-tail-again' ? silent.SILENT_TAIL_REASONING : 'A project'); result(''); process.exit(0);
|
|
179
|
+
}
|
|
180
|
+
if (origin === 'resume-done' && resumeId) { finish('Resumed work finished.\nCEZ:DONE'); process.exit(0); }
|
|
181
|
+
if (prompt.includes('mock:cezar-tool')) {
|
|
182
|
+
const { toolPrompt } = await import('./mock-ci-tool.mjs');
|
|
183
|
+
finish(await toolPrompt('cursor', args, prompt)); process.exit(0);
|
|
184
|
+
}
|
|
185
|
+
if (prompt.includes('mock:ci-wait') || process.env.CEZ_MOCK_CI_PR) {
|
|
186
|
+
const { ciPrompt, probeCiTool } = await import('./mock-ci-tool.mjs');
|
|
187
|
+
const response = prompt.includes('mock:ci-wait') ? await ciPrompt('cursor', args, prompt)
|
|
188
|
+
: JSON.stringify((await probeCiTool('cursor', args)).response);
|
|
189
|
+
finish(response); process.exit(0);
|
|
190
|
+
}
|
|
191
|
+
if (prompt.includes('mock:no-progress')) {
|
|
192
|
+
if (prompt.includes('ignore-term')) process.on('SIGTERM', () => {});
|
|
193
|
+
if (prompt.includes('held-pipe')) spawn(process.execPath, ['-e', 'setTimeout(() => {}, 5000)'],
|
|
194
|
+
{ stdio: ['ignore', process.stdout, process.stderr] });
|
|
195
|
+
if (prompt.includes('leftover')) {
|
|
196
|
+
const leftover = (file) => `process.on('SIGTERM',()=>{}); const fs = require('fs'); fs.writeFileSync(${JSON.stringify(`${file}.tmp`)}, String(process.pid)); fs.renameSync(${JSON.stringify(`${file}.tmp`)}, ${JSON.stringify(file)}); setTimeout(()=>{},20000)`;
|
|
197
|
+
spawn(process.execPath, ['-e', leftover('leftover-group.pid')], { stdio: 'ignore' });
|
|
198
|
+
spawn(process.execPath, ['-e', leftover('leftover-session.pid')], { stdio: 'ignore', detached: true }).unref();
|
|
199
|
+
}
|
|
200
|
+
// Publish readiness after mode setup: another process may signal us as soon as it sees it.
|
|
201
|
+
watchdogWritePid('watchdog.pid', String(process.pid));
|
|
202
|
+
setInterval(() => {}, 1000);
|
|
203
|
+
await new Promise(() => {});
|
|
204
|
+
}
|
|
205
|
+
if (prompt.includes('mock:busy-progress')) {
|
|
206
|
+
// N2: a long turn whose native output keeps it alive, then a done (hearsay-tools/cezarion#1620).
|
|
207
|
+
for (let i = 0; i < 24; i++) { assistant('working\n'); await new Promise(resolve => setTimeout(resolve, 100)); }
|
|
208
|
+
finish('busy complete\n\nCEZ:DONE'); process.exit(0);
|
|
209
|
+
}
|
|
210
|
+
if (prompt.includes('mock:hold-done')) { await waitForRelease(400); finish('parity hold-done: content after the pause\nCEZ:DONE'); process.exit(0); }
|
|
211
|
+
if (prompt.includes('mock:hold-ask')) { await waitForRelease(400); finish('Pick one.\n\nCEZ:ASK {"questions":[{"header":"Library","question":"Which test library?","options":[{"label":"Vitest"},{"label":"Node test"}]}]}'); process.exit(0); }
|
|
212
|
+
if (prompt.includes('mock:hold-gated')) { await waitForRelease(500); finish('parity hold-gated: content after the pause'); process.exit(0); }
|
|
213
|
+
if (prompt.includes('mock:multi-pr-refs')) {
|
|
214
|
+
const { multiPrText, unrelatedPr } = await import('./mock-multi-pr.mjs');
|
|
215
|
+
readTool(unrelatedPr);
|
|
216
|
+
const text = multiPrText(prompt);
|
|
217
|
+
for (const block of text.split('\n')) assistant(block + '\n');
|
|
218
|
+
result(text); process.exit(0);
|
|
219
|
+
}
|
|
220
|
+
if (prompt.includes('mock:turn-messages:')) {
|
|
221
|
+
const { turnMessages } = await import('./mock-turn-messages.mjs');
|
|
222
|
+
for (const message of turnMessages(prompt)) assistant(message + '\n');
|
|
223
|
+
result(''); process.exit(0);
|
|
224
|
+
}
|
|
225
|
+
if (prompt.includes('mock:ask-snapshot')) {
|
|
226
|
+
finish(prompt.includes('mock:ask-snapshot-bad') ? 'CEZ:ASK {not valid json'
|
|
227
|
+
: 'Using the CEZ:ASK structured question format instead:\n\nCEZ:ASK {"questions":[{"header":"Library","question":"Which test library?","options":[{"label":"Vitest"},{"label":"Node test"}]}]}');
|
|
228
|
+
process.exit(0);
|
|
229
|
+
}
|
|
230
|
+
if (prompt.includes('mock:ask-prose')) { finish('Use `CEZ:ASK {"questions":[]}` in your reply.\n> CEZ:ASK {not valid json'); process.exit(0); }
|
|
231
|
+
if (prompt.includes('mock:ask-bad')) { finish('Malformed question skipped.'); process.exit(0); }
|
|
232
|
+
if (!failureControl && prompt.includes('mock:provider-error')) { result('RetriableError: provider unavailable', true); process.exit(0); }
|
|
233
|
+
if (prompt.includes('mock:split-text')) {
|
|
234
|
+
const text = 'parity split text\nCEZ:MONITORING'; assistant(text); result(text); process.exit(0);
|
|
235
|
+
}
|
|
236
|
+
if (prompt.includes('mock:done') || (resumeId && /Library:|Tests:|Plan:/.test(prompt))) {
|
|
237
|
+
const text = 'Done.\nCEZ:DONE'; assistant(text); result(text); process.exit(0);
|
|
238
|
+
}
|
|
239
|
+
if (prompt.includes('mock:ask') && (!resumeId || prompt.includes('mock:ask-reply-late'))) {
|
|
240
|
+
const text = 'Pick one.\n\nCEZ:ASK {"questions":[{"header":"Library","question":"Which test library?","options":[{"label":"Vitest"},{"label":"Node test"}]}]}';
|
|
241
|
+
assistant(text); result(text); process.exit(0);
|
|
242
|
+
}
|
|
243
|
+
if (prompt.includes('mock:hold')) await new Promise(resolve => setTimeout(resolve, 500));
|
|
244
|
+
if (prompt === 'inspect the working tree' || prompt.includes('mock:baseline')) {
|
|
245
|
+
readTool(); const text = 'Cursor inspected the workspace.'; assistant(text); result(text); process.exit(0);
|
|
246
|
+
}
|
|
247
|
+
if (prompt.includes('mock:agent-echo')) { finish(prompt); process.exit(0); }
|
|
248
|
+
const text = `turn ${turn}: ${prompt}`;
|
|
249
|
+
if (mode === 'delay-work' && resumeId) await new Promise(resolve => setTimeout(resolve, 200));
|
|
250
|
+
assistant(text);
|
|
251
|
+
if (mode === 'crash-after-work') process.exit(1);
|
|
252
|
+
result(text);
|
|
253
|
+
if (mode === 'duplicate-result') frame({ type: 'result', subtype: 'success', session_id: id, is_error: false, result: text });
|
|
254
|
+
if (mode === 'late-frame') frame({ type: 'assistant', session_id: id,
|
|
255
|
+
message: { role: 'assistant', content: [{ type: 'text', text: 'LATE_FRAME' }] } });
|
|
256
|
+
if (mode === 'result-before-exit') await new Promise(resolve => setTimeout(resolve, 250));
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* hearsay-tools/cezarion#1112: a follow-up whose native turn starts late. A mock that sees
|
|
3
|
+
* the token in a follow-up holds that turn's native start past the 250 ms held-input
|
|
4
|
+
* recheck (HELD_HUMAN_INPUT_RECHECK_MS in workflows/run.ts), the window a loaded host
|
|
5
|
+
* opened between a Cursor print process spawning and its init frame.
|
|
6
|
+
*
|
|
7
|
+
* Callers test for the token inline before a dynamic import, so a mock without it keeps
|
|
8
|
+
* its exact event-loop ordering (an unconditional `await` would yield on every turn), and
|
|
9
|
+
* a testkit that copies a mock elsewhere and rewrites `import('./` still resolves it.
|
|
10
|
+
*/
|
|
11
|
+
export const DEFERRED_TURN_START_TOKEN = 'mock:deferred-turn-start';
|
|
12
|
+
export const DEFERRED_TURN_START_MS = 800;
|
|
13
|
+
|
|
14
|
+
export function deferredTurnStart() {
|
|
15
|
+
return new Promise(resolve => setTimeout(resolve, DEFERRED_TURN_START_MS));
|
|
16
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export type DeliveryControlOptions =
|
|
2
|
+
| { kind: 'reject'; match: string; persistent?: boolean }
|
|
3
|
+
| { kind: 'hold-ack'; match: string }
|
|
4
|
+
| { kind: 'hold-response'; match: string };
|
|
5
|
+
export type DeliveryKind = DeliveryControlOptions['kind'];
|
|
6
|
+
export function createDeliveryControl(root: string, options: DeliveryControlOptions): {
|
|
7
|
+
path: string;
|
|
8
|
+
held(): boolean;
|
|
9
|
+
release(): void;
|
|
10
|
+
lift(): void;
|
|
11
|
+
};
|
|
12
|
+
/** Throws on a malformed control. A kind outside `supportedKinds` makes the mock exit with
|
|
13
|
+
* an error naming the variable when an input matches, before it answers that input. */
|
|
14
|
+
export function readDeliveryControl(supportedKinds: readonly DeliveryKind[]): {
|
|
15
|
+
kind: DeliveryKind;
|
|
16
|
+
/** True when this input must be rejected now; a non-persistent rule claims once across processes. */
|
|
17
|
+
rejects(text: string): boolean;
|
|
18
|
+
/** Sends the acknowledgement now, or after release for a matching hold-ack, without blocking the caller. */
|
|
19
|
+
ack(text: string, send: () => void): void;
|
|
20
|
+
/** Undefined when nothing is held; for a matching hold-response, a promise that resolves on release.
|
|
21
|
+
* A synchronous answer lets a mock that cannot await decide at once whether to buffer. */
|
|
22
|
+
holdResponse(text: string): Promise<void> | undefined;
|
|
23
|
+
};
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
// Native delivery controls belong to the mock, not to source-rewriting test helpers.
|
|
2
|
+
// Only configured mocks import this module, so an unconfigured mock keeps its exact
|
|
3
|
+
// event-loop order. The control changes timing only: what a turn says still follows
|
|
4
|
+
// its input, and each mock writes its own native rejection and acknowledgement.
|
|
5
|
+
import { closeSync, existsSync, openSync, readFileSync, writeFileSync } from 'node:fs';
|
|
6
|
+
import { isAbsolute, join, resolve } from 'node:path';
|
|
7
|
+
|
|
8
|
+
const ENV = 'CEZ_MOCK_DELIVERY_CONTROL';
|
|
9
|
+
const KINDS = ['reject', 'hold-ack', 'hold-response'];
|
|
10
|
+
|
|
11
|
+
function validate(config) {
|
|
12
|
+
if (!config || typeof config !== 'object' || Array.isArray(config)) throw new Error('expected a control object');
|
|
13
|
+
const keys = config.kind === 'reject' ? ['kind', 'match', 'persistent'] : ['kind', 'match'];
|
|
14
|
+
if (KINDS.includes(config.kind) && typeof config.match === 'string' && config.match.trim()
|
|
15
|
+
&& (config.persistent === undefined || typeof config.persistent === 'boolean')
|
|
16
|
+
&& Object.keys(config).every(key => keys.includes(key))) return config;
|
|
17
|
+
throw new Error('expected reject (optionally persistent), hold-ack or hold-response with a nonempty match');
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/** Fixture setup and handles use the same marker paths as the mock reader. The
|
|
21
|
+
* fixture owns cleanup; none of this state depends on a native subprocess cwd. */
|
|
22
|
+
export function createDeliveryControl(root, options) {
|
|
23
|
+
const path = join(resolve(root), 'native-delivery-control.json');
|
|
24
|
+
writeFileSync(path, JSON.stringify(validate(options)));
|
|
25
|
+
return {
|
|
26
|
+
path,
|
|
27
|
+
held: () => existsSync(`${path}.held`),
|
|
28
|
+
release: () => writeFileSync(`${path}.released`, ''),
|
|
29
|
+
lift: () => writeFileSync(`${path}.lifted`, ''),
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** Read once at mock startup. A configured but broken fixture must never fall
|
|
34
|
+
* through to an ordinary native turn. Absence is handled by each mock before
|
|
35
|
+
* importing, so its ordinary scheduling stays unchanged. */
|
|
36
|
+
export function readDeliveryControl(supportedKinds) {
|
|
37
|
+
const path = process.env[ENV];
|
|
38
|
+
let config;
|
|
39
|
+
try {
|
|
40
|
+
if (!path || !isAbsolute(path)) throw new Error('expected an absolute control path');
|
|
41
|
+
config = validate(JSON.parse(readFileSync(path, 'utf8')));
|
|
42
|
+
} catch (error) {
|
|
43
|
+
throw new Error(`${ENV}: ${error.message}`, { cause: error });
|
|
44
|
+
}
|
|
45
|
+
// The variable reaches every mock a fixture starts, so a mixed-runner fixture (a Claude
|
|
46
|
+
// worker under an OMP parent) sees a kind its own wire cannot carry. Such a mock runs
|
|
47
|
+
// unconfigured until an input matches; then it fails closed before it answers.
|
|
48
|
+
const supported = supportedKinds.includes(config.kind);
|
|
49
|
+
const matches = (kind, text) => {
|
|
50
|
+
if (typeof text !== 'string' || !text.includes(config.match)) return false;
|
|
51
|
+
if (!supported) {
|
|
52
|
+
process.stderr.write(`${ENV}: this native mock does not support ${config.kind}\n`);
|
|
53
|
+
process.exit(1);
|
|
54
|
+
}
|
|
55
|
+
return config.kind === kind;
|
|
56
|
+
};
|
|
57
|
+
const released = () => existsSync(`${path}.released`);
|
|
58
|
+
return {
|
|
59
|
+
kind: config.kind,
|
|
60
|
+
rejects(text) {
|
|
61
|
+
if (!matches('reject', text) || existsSync(`${path}.lifted`)) return false;
|
|
62
|
+
if (config.persistent) return true;
|
|
63
|
+
// More than one matching input can arrive in a fixture. Exactly one claims
|
|
64
|
+
// the rejection, including when the inputs reach different subprocesses.
|
|
65
|
+
try { closeSync(openSync(`${path}.rejected`, 'wx')); }
|
|
66
|
+
catch (error) { if (error.code === 'EEXIST') return false; throw error; }
|
|
67
|
+
return true;
|
|
68
|
+
},
|
|
69
|
+
ack(text, send) {
|
|
70
|
+
if (!matches('hold-ack', text) || released()) { send(); return; }
|
|
71
|
+
writeFileSync(`${path}.held`, '');
|
|
72
|
+
const timer = setInterval(() => { if (released()) { clearInterval(timer); send(); } }, 5);
|
|
73
|
+
},
|
|
74
|
+
holdResponse(text) {
|
|
75
|
+
if (!matches('hold-response', text) || released()) return undefined;
|
|
76
|
+
writeFileSync(`${path}.held`, '');
|
|
77
|
+
return (async () => { while (!released()) await new Promise(resolve => setTimeout(resolve, 5)); })();
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// hearsay-tools/cezarion#784: harness parity reads which per-session variables reached each runner's
|
|
2
|
+
// native process, the one the agent's Bash and agent-browser inherit. A test preloads it into every
|
|
3
|
+
// mock with NODE_OPTIONS=--import=<this file's URL> and sets CEZ_MOCK_ENV_RECORD (the file to write)
|
|
4
|
+
// and CEZ_MOCK_ENV_RECORD_NAMES (comma-separated names).
|
|
5
|
+
import { writeFileSync } from 'node:fs';
|
|
6
|
+
|
|
7
|
+
const path = process.env.CEZ_MOCK_ENV_RECORD;
|
|
8
|
+
if (path) {
|
|
9
|
+
const names = (process.env.CEZ_MOCK_ENV_RECORD_NAMES ?? '').split(',').filter(Boolean);
|
|
10
|
+
writeFileSync(path, JSON.stringify(Object.fromEntries(names.map(name => [name, process.env[name] ?? null]))));
|
|
11
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export type NativeFailure = 'provider' | 'usage-limit' | 'unread';
|
|
2
|
+
export type FailureControlOptions = { mode: 'gated-once' }
|
|
3
|
+
| { mode: 'persistent'; opening: string; failure: NativeFailure };
|
|
4
|
+
export function createFailureControl(root: string, options: FailureControlOptions): {
|
|
5
|
+
path: string;
|
|
6
|
+
held(): boolean;
|
|
7
|
+
release(): void;
|
|
8
|
+
lift(): void;
|
|
9
|
+
};
|
|
10
|
+
export function readFailureControl(supportedFailures?: readonly NativeFailure[]): {
|
|
11
|
+
failure: NativeFailure;
|
|
12
|
+
failureFor(text: string): NativeFailure | undefined | Promise<NativeFailure | undefined>;
|
|
13
|
+
};
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
// Native failure controls belong to the mock, not to source-rewriting test helpers.
|
|
2
|
+
// Only configured mocks import this module. Persistent decisions are synchronous:
|
|
3
|
+
// in particular, Claude's unread exit must not yield to another stdin line.
|
|
4
|
+
import { closeSync, existsSync, openSync, readFileSync, writeFileSync } from 'node:fs';
|
|
5
|
+
import { isAbsolute, join, resolve } from 'node:path';
|
|
6
|
+
|
|
7
|
+
const ENV = 'CEZ_MOCK_FAILURE_CONTROL';
|
|
8
|
+
const GATED_PROMPTS = ['mock:auth-error', 'mock:provider-error', 'Resume to receive the queued CI observation.'];
|
|
9
|
+
const FAILURES = ['provider', 'usage-limit', 'unread'];
|
|
10
|
+
|
|
11
|
+
function validate(config) {
|
|
12
|
+
if (!config || typeof config !== 'object' || Array.isArray(config)) throw new Error('expected a control object');
|
|
13
|
+
if (config.mode === 'gated-once' && Object.keys(config).every(key => key === 'mode')) return config;
|
|
14
|
+
if (config.mode === 'persistent' && typeof config.opening === 'string' && config.opening.trim()
|
|
15
|
+
&& FAILURES.includes(config.failure) && Object.keys(config).every(key => ['mode', 'opening', 'failure'].includes(key))) return config;
|
|
16
|
+
throw new Error('expected gated-once, or persistent with a nonempty opening and provider/usage-limit/unread failure');
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/** Fixture setup and handles use the same marker paths as the mock reader. The
|
|
20
|
+
* fixture owns cleanup; none of this state depends on a native subprocess cwd. */
|
|
21
|
+
export function createFailureControl(root, options) {
|
|
22
|
+
const path = join(resolve(root), 'native-failure-control.json');
|
|
23
|
+
writeFileSync(path, JSON.stringify(validate(options)));
|
|
24
|
+
return {
|
|
25
|
+
path,
|
|
26
|
+
held: () => existsSync(`${path}.held`),
|
|
27
|
+
release: () => writeFileSync(`${path}.released`, ''),
|
|
28
|
+
lift: () => writeFileSync(`${path}.lifted`, ''),
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/** Read once at mock startup. A configured but broken fixture must never fall
|
|
33
|
+
* through to a successful native turn. Absence is handled by each mock before
|
|
34
|
+
* importing, so its ordinary scheduling stays unchanged. */
|
|
35
|
+
export function readFailureControl(supportedFailures = ['provider']) {
|
|
36
|
+
const path = process.env[ENV];
|
|
37
|
+
let config;
|
|
38
|
+
try {
|
|
39
|
+
if (!path || !isAbsolute(path)) throw new Error('expected an absolute control path');
|
|
40
|
+
config = validate(JSON.parse(readFileSync(path, 'utf8')));
|
|
41
|
+
const failure = config.mode === 'gated-once' ? 'provider' : config.failure;
|
|
42
|
+
if (!supportedFailures.includes(failure)) throw new Error(`this native mock does not support ${failure}`);
|
|
43
|
+
} catch (error) {
|
|
44
|
+
throw new Error(`${ENV}: ${error.message}`, { cause: error });
|
|
45
|
+
}
|
|
46
|
+
const failure = config.mode === 'gated-once' ? 'provider' : config.failure;
|
|
47
|
+
return {
|
|
48
|
+
failure,
|
|
49
|
+
failureFor(text) {
|
|
50
|
+
if (typeof text !== 'string') return undefined;
|
|
51
|
+
if (config.mode === 'persistent') {
|
|
52
|
+
return text.includes(config.opening) && !existsSync(`${path}.lifted`) ? failure : undefined;
|
|
53
|
+
}
|
|
54
|
+
if (existsSync(`${path}.failed`) || !GATED_PROMPTS.some(prompt => text.includes(prompt))) return undefined;
|
|
55
|
+
return gatedFailure();
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
async function gatedFailure() {
|
|
60
|
+
writeFileSync(`${path}.held`, '');
|
|
61
|
+
while (!existsSync(`${path}.released`)) await new Promise(resolve => setTimeout(resolve, 5));
|
|
62
|
+
// More than one matching run can be held in a fixture. Exactly one claims
|
|
63
|
+
// the failure, including when the runs belong to different subprocesses.
|
|
64
|
+
try { closeSync(openSync(`${path}.failed`, 'wx')); }
|
|
65
|
+
catch (error) { if (error.code === 'EEXIST') return undefined; throw error; }
|
|
66
|
+
return failure;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** Shared content only; each adapter emits it through its own native wire. */
|
|
2
|
+
export function multiPrText(prompt) {
|
|
3
|
+
return prompt.includes('mock:multi-pr-refs-continue')
|
|
4
|
+
? 'CEZ:PR=813\nCEZ:PR=817\nCEZ:DONE'
|
|
5
|
+
: 'CEZ:PR=812\nCEZ:PR=813\nCEZ:PR=814\nCEZ:PR=815\nCEZ:PR=812\nCEZ:PR=816\nCEZ:DONE';
|
|
6
|
+
}
|
|
7
|
+
export const unrelatedPr = 'CEZ:PR=999\nCreated a PR: https://github.com/other/repo/pull/999';
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
// Cezar's no-wait nudge (hearsay-tools/cezarion#1234). Every native mock answers it the way an agent
|
|
2
|
+
// should, by rewriting it into the mocks' own scenario prompts after the prompt is recorded: a
|
|
3
|
+
// session with cezar tools calls cezar_ask with a card (`mock:cezar-tool`), and one taught the
|
|
4
|
+
// markers ends with the ask line. CEZ_MOCK_NUDGE_REPLY=plain answers in plain text instead, so a
|
|
5
|
+
// test can reach the no-wait fallback. CEZ_MOCK_COMPLETION_REPLY, when set, is the mock prompt that
|
|
6
|
+
// answers Cezar's completion refusal nudge (hearsay-tools/cezarion#1301), so a test can choose the
|
|
7
|
+
// reply turn; unset, the refusal gets the mocks' ordinary reply. `mock:ack-only` is a reply every
|
|
8
|
+
// native mock understands: the harness acknowledges the prompt on its own wire (and reports it read
|
|
9
|
+
// where that wire can) and opens no turn until more input arrives.
|
|
10
|
+
import { FINAL_MESSAGE_NUDGE_PREFIX as NUDGE, silentTailOpened } from './mock-silent-tail.mjs';
|
|
11
|
+
|
|
12
|
+
export const NO_WAIT_NUDGE_PREFIX = NUDGE;
|
|
13
|
+
const QUESTIONS = [{ header: 'Next step', question: 'How should I continue?', options: [{ label: 'Keep going' }, { label: 'Stop here' }] }];
|
|
14
|
+
// hearsay-tools/cezarion#1458: cezar_ask requires the context the user reads above the card.
|
|
15
|
+
const CONTEXT = 'The task stopped without a next step.';
|
|
16
|
+
|
|
17
|
+
const messages = (texts) => `mock:turn-messages:${Buffer.from(JSON.stringify(texts)).toString('base64')}`;
|
|
18
|
+
const base64url = (text) => Buffer.from(text).toString('base64url');
|
|
19
|
+
|
|
20
|
+
/** A session that opened a silent-tail or tool-tail scenario answers the nudge in that scenario. */
|
|
21
|
+
export function silentNudge(prompt) {
|
|
22
|
+
return typeof prompt === 'string' && prompt.includes(NUDGE) && silentTailOpened();
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/** Every completion refusal ends with this, whichever check refused it. */
|
|
26
|
+
const COMPLETION_REFUSAL = 'then call cezar_done again.';
|
|
27
|
+
const completionReply = (prompt) => process.env.CEZ_MOCK_COMPLETION_REPLY && prompt.includes(COMPLETION_REFUSAL) ? process.env.CEZ_MOCK_COMPLETION_REPLY : undefined;
|
|
28
|
+
|
|
29
|
+
export function answerNudge(prompt) {
|
|
30
|
+
if (typeof prompt !== 'string') return prompt;
|
|
31
|
+
const completion = completionReply(prompt);
|
|
32
|
+
if (completion) return completion;
|
|
33
|
+
if (!prompt.includes(NUDGE) || silentTailOpened()) return prompt;
|
|
34
|
+
if (process.env.CEZ_MOCK_NUDGE_REPLY === 'plain') return messages(['Nothing more to add.']);
|
|
35
|
+
if (prompt.includes('CEZ:ASK')) return messages([`I need your call on the next step.\n\nCEZ:ASK ${JSON.stringify({ questions: QUESTIONS })}`]);
|
|
36
|
+
return `mock:cezar-tool cezar_ask ${base64url(JSON.stringify({ context: CONTEXT, questions: QUESTIONS }))} mock:then ${base64url('I asked how to continue.')}`;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/** OpenCode's prompt body: its text parts, joined, are the prompt. */
|
|
40
|
+
export function answerNudgeBody(body) {
|
|
41
|
+
if (!body || ((!body.includes(NUDGE) || silentTailOpened()) && !completionReply(body))) return body;
|
|
42
|
+
const parsed = JSON.parse(body);
|
|
43
|
+
const text = (parsed.parts ?? []).map((part) => part.text ?? '').join('\n');
|
|
44
|
+
return JSON.stringify({ ...parsed, parts: [{ type: 'text', text: answerNudge(text) }] });
|
|
45
|
+
}
|