@impulselab/hepha 0.2.567 → 0.2.568
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../packages/core/src/tagged-error.ts","../src/lib/shared/errors-constants.ts","../src/lib/cli/cli-error.ts","../src/lib/shared/output-constants.ts","../src/lib/ansi/strip-ansi.ts","../src/lib/supports/supports-color.ts","../src/lib/cli/cli-output.ts","../src/lib/output/out.ts","../src/lib/shared/config.ts","../src/lib/shared/config-constants.ts","../src/lib/path/config-path-constants.ts","../src/lib/file/read-file-as-object.ts","../src/lib/string/config-read-string.ts","../src/lib/user/read-user.ts","../src/lib/http/is-http-url.ts","../src/lib/http/read-http-url.ts","../src/lib/same/is-same-origin.ts","../src/lib/version/read-version.ts","../src/lib/version/version-constants.ts","../src/commands/help/help-constants.ts","../src/commands/command/help-command.ts","../src/lib/args/args-constants.ts","../src/lib/boolean/boolean-flags-constants.ts","../src/lib/args/parse-flag.ts","../src/lib/args/args-parser.ts","../src/lib/args/args.ts","../src/lib/wants/wants-json.ts","../src/lib/api/api-constants.ts","../src/lib/timeout/resolve-timeout.ts","../src/lib/auth/auth-headers.ts","../src/lib/version/client-headers.ts","../src/lib/retry/retry-after-seconds.ts","../src/lib/response/fetch-response.ts","../src/lib/api/add-query-parameters.ts","../src/lib/excerpt/excerpt.ts","../src/lib/api/parse-response-payload.ts","../src/lib/issues/read-issues.ts","../../../packages/core/src/api/path-not-served-constants.ts","../src/lib/string/read-string.ts","../src/lib/message/message-from.ts","../src/lib/api/throw-response-error.ts","../src/lib/api/api.ts","../src/lib/path/path.ts","../src/lib/read/read.ts","../src/lib/expect/expect-shape.ts","../src/lib/is/is.ts","../src/commands/approvals/approvals-constants.ts","../src/commands/approvals/list-approvals.ts","../src/commands/command/approvals-command.ts","../src/commands/catalog/list-catalog-branches.ts","../src/commands/catalog/list-catalog-models.ts","../src/commands/catalog/read-catalog-list.ts","../src/commands/catalog/list-catalog-repos.ts","../src/commands/catalog/list-catalog-skills.ts","../src/commands/catalog/catalog-topics.ts","../src/commands/command/catalog-command.ts","../src/commands/keys/keys-constants.ts","../src/commands/key/create-key.ts","../src/commands/command/keys-command.ts","../src/commands/command/login-command.ts","../src/lib/token/device-token-error.ts","../src/lib/retry/next-poll-delay.ts","../src/lib/browser/open-browser.ts","../src/commands/login/login-constants.ts","../../../packages/database/shared/constants.ts","../src/commands/client/client-id-constants.ts","../src/commands/sleep/sleep.ts","../src/commands/complete/complete-login.ts","../src/commands/login/resolve-login-base-url.ts","../src/commands/command/logout-command.ts","../src/commands/answers/collect-answers-constants.ts","../src/commands/answer/validate-free-text.ts","../src/commands/answer/validate-selected-option-ids.ts","../src/commands/answer/validate-answer.ts","../src/commands/answers/parse-answer-entry.ts","../src/commands/answers/parse-answers-flag.ts","../src/commands/answers/collect-answers.ts","../src/commands/questions/questions-constants.ts","../src/commands/questions/list-questions.ts","../src/commands/batch/print-batch-question.ts","../src/commands/batch/print-batch.ts","../src/commands/command/questions-command.ts","../src/lib/follow/follow-constants.ts","../../../packages/database/schema/advisor/constants.ts","../../../packages/database/schema/advisor/advisor-note-was-delivered.ts","../src/lib/truncate/truncate.ts","../src/lib/event/format-advisor-part.ts","../../../packages/realtime/src/events/deliverable/deliverable-download-path.ts","../../../packages/realtime/src/events/attachment/format-attachment-size.ts","../src/lib/event/format-deliverable-part.ts","../../../packages/agents/src/turns/turn-constants.ts","../../../packages/agents/src/tool-activity/canonical/canonical-tool-name-constants.ts","../../../packages/agents/src/tool-activity/tool-input/is-record.ts","../../../packages/agents/src/tool-activity/tool-input/str.ts","../../../packages/agents/src/tool-activity/tool-input/trimmed.ts","../../../packages/agents/src/tool-activity/tool-input/truncate.ts","../../../packages/agents/src/tool-activity/tool-input/verbatim.ts","../../../packages/agents/src/tool-activity/tool-input.ts","../../../packages/agents/src/tool-activity/label-only.ts","../../../packages/agents/src/tool-activity/tool-activity-basename.ts","../../../packages/agents/src/tool-activity/tool-activity-hostname.ts","../../../packages/agents/src/tool-activity/browser/browser-label.ts","../../../packages/agents/src/tool-activity/browser/browser-activity-constants.ts","../../../packages/agents/src/tool-activity/browser/describe-browser-act.ts","../../../packages/agents/src/tool-activity/browser/describe-browser-navigate.ts","../../../packages/agents/src/tool-activity/capture/capture-label.ts","../../../packages/agents/src/tool-activity/capture/capture-target.ts","../../../packages/agents/src/tool-activity/capture/capture-label-constants.ts","../../../packages/agents/src/tool-activity/capture/describe-take-screenshot.ts","../../../packages/agents/src/tool-activity/browser/browser-tool-activity-describers.ts","../../../packages/agents/src/tool-activity/design/design-tool-activity-describers.ts","../../../packages/agents/src/tool-activity/factory/factory-tool-activity-describers.ts","../../../packages/agents/src/tool-activity/canonical/integration-tool-activity-describers.ts","../../../packages/agents/src/tool-activity/capture/describe-annotate-image.ts","../../../packages/core/src/source-scan/end-of-comment.ts","../../../packages/core/src/source-scan/end-of-string-literal.ts","../../../packages/core/src/source-scan/end-of-skippable.ts","../../../packages/core/src/source-scan/end-of-object-literal.ts","../../../packages/core/src/source-scan/has-spread-in-code.ts","../../../packages/core/src/source-scan/meta-declaration-open.ts","../../../packages/core/src/source-scan/unescape-string-literal.ts","../../../packages/core/src/source-scan/quoted-field-at.ts","../../../packages/core/src/source-scan/top-level-string-field.ts","../../../packages/core/src/source-scan/meta-name-in-script.ts","../../../packages/agents/src/tool-activity/canonical/workflow-script-name.ts","../../../packages/agents/src/tool-activity/canonical/describe-workflow.ts","../../../packages/agents/src/tool-activity/capture/describe-attach-image.ts","../../../packages/agents/src/tool-activity/capture/describe-generate-image.ts","../../../packages/agents/src/tool-activity/capture/describe-record-video.ts","../../../packages/agents/src/tool-activity/canonical/describe-memory-search.ts","../../../packages/agents/src/tool-activity/canonical/describe-report-dev-server.ts","../../../packages/agents/src/tool-activity/canonical/describe-request-env-vars.ts","../../../packages/agents/src/tool-activity/deliverable/describe-attach-file.ts","../../../packages/agents/src/teams/agent-task-update-constants.ts","../../../packages/agents/src/tool-activity/canonical/update-task-labels.ts","../../../packages/agents/src/tool-activity/canonical/describe-native-patch.ts","../../../packages/agents/src/tool-activity/canonical/canonical-tool-activity-describers.ts","../../../packages/agents/src/tool-activity/browser/soft-fail-browser-tools-constants.ts","../../../packages/agents/src/tool-activity/browser/soft-failed-browser.ts","../../../packages/agents/src/tool-activity/capture/soft-fail-capture-tools-constants.ts","../../../packages/agents/src/tool-activity/capture/soft-failed-capture.ts","../../../packages/agents/src/tool-activity/tool-activity-state-for.ts","../../../packages/agents/src/tool-activity/skill/skill-call-constants.ts","../../../packages/agents/src/tool-activity/skill/skill-name-from-input.ts","../../../packages/agents/src/tool-activity/skill/string-field.ts","../../../packages/agents/src/tool-activity/skill/registry-calls.ts","../src/lib/event/format-tool-part.ts","../src/lib/event/format-event.ts","../src/lib/session/consume-session-events.ts","../src/lib/sleep/sleep.ts","../src/lib/sleep/sleep-constants.ts","../src/lib/sleep/timer-delay-ms.ts","../src/lib/sleep/interruptible-sleep.ts","../src/lib/session/default-follow-session-dependencies.ts","../src/lib/session/retry/follow-outage-message.ts","../src/lib/session/retry/follow-retry-constants.ts","../src/lib/session/retry/follow-retry-delay.ts","../src/lib/session/retry/remaining-outage-seconds.ts","../src/lib/session/retry/retryable-follow-error.ts","../src/lib/session/retry/should-report-follow-outage.ts","../src/lib/session/retry/wait-for-follow-retry.ts","../src/lib/session/retry/request-with-follow-retry.ts","../src/lib/blocked/blocked-constants.ts","../src/lib/terminal/terminal-constants.ts","../src/lib/session/is-follow-stop-status.ts","../src/lib/session/retry/resolve-follow-outage-budget.ts","../src/lib/session/retry/follow-request-timeout-ms.ts","../src/lib/session/follow-session.ts","../src/lib/session/build-session-detail-rows.ts","../src/lib/session/print-playbook-steps.ts","../src/lib/session/print-session.ts","../src/lib/session/session-outcome.ts","../src/lib/session/write-followed-session-outcome.ts","../src/commands/harnesses/harnesses-constants.ts","../src/commands/task/task-types-constants.ts","../src/commands/command/create-run-input.ts","../src/commands/command/run-command.ts","../src/commands/sessions/sessions-constants.ts","../src/commands/sessions/list-sessions.ts","../src/commands/session/send-session-message.ts","../src/commands/show/follow-session-logs.ts","../src/commands/show/show-logs.ts","../src/commands/sessions/session-actions.ts","../src/commands/detail/detail.ts","../src/commands/command/run-session-control-action.ts","../src/commands/command/run-session-operation.ts","../src/commands/command/sessions-command.ts","../src/commands/command/whoami-command.ts","../src/catalog-topics-constants.ts","../src/dispatch.ts","../src/main.ts","../src/cli-entry.ts"],"sourcesContent":["/**\n * Base for error kinds recognised across bundle boundaries. `instanceof` is\n * unreliable there — server and tasks bundle their own copy of a shared class —\n * so classification reads the `_tag` literal instead.\n */\nexport abstract class TaggedError<Tag extends string = string> extends Error {\n readonly _tag: Tag;\n\n constructor(tag: Tag, message: string, options?: ErrorOptions) {\n super(message, options);\n this._tag = tag;\n this.name = tag;\n }\n\n static is(value: unknown): value is TaggedError {\n return (\n value instanceof Error &&\n \"_tag\" in value &&\n typeof value._tag === \"string\"\n );\n }\n\n static hasTag<Expected extends string>(\n value: unknown,\n tag: Expected,\n ): value is TaggedError<Expected> {\n return TaggedError.is(value) && value._tag === tag;\n }\n}\n","export const CLI_ERROR_CODES = {\n BAD_USAGE: \"BAD_USAGE\",\n /** The session needs a person — the exit-3 family. */\n NEEDS_HUMAN: \"NEEDS_HUMAN\",\n NOT_AUTHENTICATED: \"NOT_AUTHENTICATED\",\n NETWORK: \"NETWORK\",\n TIMEOUT: \"TIMEOUT\",\n /** Ctrl-C: a cancellation, not a failure of ours. */\n INTERRUPTED: \"INTERRUPTED\",\n /** A 2xx whose shape this CLI version does not understand. */\n API_SCHEMA_MISMATCH: \"API_SCHEMA_MISMATCH\",\n /** Not JSON at all — wrong host, proxy, error page. */\n NON_JSON_RESPONSE: \"NON_JSON_RESPONSE\",\n ERROR: \"ERROR\",\n} as const;\n","import { TaggedError } from \"@repo/core/tagged-error\";\n\nimport { CLI_ERROR_CODES } from \"@/lib/shared/errors-constants\";\nimport type { CliErrorDetails } from \"@/lib/cli/cli-error-details\";\n\n/**\n * A failure the user should read as a message, not a stack trace.\n *\n * `exitCode` is part of the contract for scripts and agents: 1 for a plain\n * failure, 2 for bad usage, 3 for \"the session needs a human\" — so a caller\n * can branch on it without parsing text. `details` carries the same failure in\n * machine form; under `--json` it is what gets printed (see cli-output.ts).\n */\nexport class CliError extends TaggedError<\"CliError\"> {\n readonly exitCode: number;\n readonly details: CliErrorDetails;\n /**\n * A followed session parking on a question is a non-zero outcome AND a result\n * worth reading. Carried here so stdout stays ONE JSON document.\n */\n readonly result?: unknown;\n\n constructor(\n message: string,\n exitCode = 1,\n details: CliErrorDetails = {},\n result?: unknown,\n ) {\n super(\"CliError\", message);\n this.exitCode = exitCode;\n this.details = details;\n if (result !== undefined) {\n this.result = result;\n }\n }\n\n /** The code to report, defaulting to whatever the exit code implies. */\n get code(): string {\n if (this.details.code) {\n return this.details.code;\n }\n if (this.exitCode === 2) {\n return CLI_ERROR_CODES.BAD_USAGE;\n }\n if (this.exitCode === 3) {\n return CLI_ERROR_CODES.NEEDS_HUMAN;\n }\n return CLI_ERROR_CODES.ERROR;\n }\n}\n","export const COLORS: Record<string, string> = {\n reset: \"\\u001b[0m\",\n dim: \"\\u001b[2m\",\n bold: \"\\u001b[1m\",\n red: \"\\u001b[31m\",\n green: \"\\u001b[32m\",\n yellow: \"\\u001b[33m\",\n blue: \"\\u001b[34m\",\n magenta: \"\\u001b[35m\",\n};\n\nexport const STATUS_COLORS: Record<string, string> = {\n running: \"blue\",\n provisioning: \"blue\",\n queued: \"dim\",\n created: \"dim\",\n delivering: \"blue\",\n verifying: \"blue\",\n waiting_human: \"yellow\",\n waiting_external: \"blue\",\n awaiting_approval: \"yellow\",\n completed: \"green\",\n failed: \"red\",\n killed: \"red\",\n abstained: \"yellow\",\n};\n","/** Width is measured on the visible text, so colour never breaks alignment. */\nexport function stripAnsi(text: string): string {\n return text.replace(/\\u001b\\[\\d+m/g, \"\");\n}\n","export function supportsColor(jsonMode: boolean): boolean {\n return (\n process.stdout.isTTY === true &&\n process.env.NO_COLOR === undefined &&\n !jsonMode\n );\n}\n","import type { CliError } from \"./cli-error\";\nimport { COLORS, STATUS_COLORS } from \"@/lib/shared/output-constants\";\nimport { stripAnsi } from \"@/lib/ansi/strip-ansi\";\nimport { supportsColor } from \"@/lib/supports/supports-color\";\n\n/**\n * Two audiences, one command set: humans read the aligned text, agents pass\n * `--json` and parse stdout. Everything a command prints goes through here, so\n * `--json` is never partially honoured.\n */\nexport class CliOutput {\n private jsonMode = false;\n\n /** Declared once per run, before anything can fail. */\n setJson(enabled: boolean): void {\n this.jsonMode = enabled;\n }\n\n isJson(): boolean {\n return this.jsonMode;\n }\n\n json(value: unknown): void {\n process.stdout.write(`${JSON.stringify(value, null, 2)}\\n`);\n }\n\n line(text = \"\"): void {\n process.stdout.write(`${text}\\n`);\n }\n\n error(text: string): void {\n // Sanitised like everything else: a failure message often carries a\n // session's statusReason, which is agent- or tool-authored text — and an\n // error line is the last thing that should be able to repaint the screen.\n process.stderr.write(`${this.paint(`error: ${this.safe(text)}`, \"red\")}\\n`);\n }\n\n // Progress a long command owes the user; stderr keeps `--json` stdout whole.\n warn(text: string): void {\n process.stderr.write(`${this.paint(this.safe(text), \"yellow\")}\\n`);\n }\n\n /**\n * The one place a failure is reported. Under `--json` stdout must be\n * parseable, and it was not: failures went to stderr as prose. Success keeps\n * its bare shape, so nothing that already parses stdout has to change.\n */\n failure(error: CliError): void {\n if (!this.jsonMode) {\n this.error(error.message);\n return;\n }\n\n this.json({\n ok: false,\n error: {\n ...(error.details.status === undefined\n ? {}\n : { status: error.details.status }),\n code: error.code,\n message: this.safe(error.message),\n ...(error.details.issues ? { issues: error.details.issues } : {}),\n ...(error.details.retryAfterSeconds === undefined\n ? {}\n : { retryAfterSeconds: error.details.retryAfterSeconds }),\n },\n // Inside the envelope, so stdout stays one parseable document.\n ...(error.result === undefined ? {} : { result: error.result }),\n });\n }\n\n paint(text: string, color: string): string {\n if (!supportsColor(this.jsonMode)) {\n return text;\n }\n return `${COLORS[color] ?? \"\"}${text}${COLORS.reset}`;\n }\n\n /**\n * Neutralise terminal control sequences in text the platform gives us.\n *\n * Transcript content, PR titles and question bodies carry model output, tool\n * output and repository contents — none of it trusted. Printed raw, an ESC\n * sequence could repaint or erase what the user already read, or emit an OSC\n * 8 hyperlink pointing somewhere else entirely. Newlines and tabs survive;\n * every other C0/C1 control does not. (`--json` is unaffected: JSON.stringify\n * already escapes control characters.)\n */\n safe(text: string): string {\n return text.replace(/[\\u0000-\\u0008\\u000b-\\u001f\\u007f-\\u009f]/g, \"\");\n }\n\n /** `safe`, flattened to one line — anything going into a table cell. */\n cell(text: string): string {\n return this.safe(text).replace(/\\s+/g, \" \").trim();\n }\n\n status(status: string): string {\n return this.paint(status, STATUS_COLORS[status] ?? \"reset\");\n }\n\n /** Left-aligned two-column block — the shape used by every list command. */\n table(rows: string[][]): void {\n if (rows.length === 0) {\n return;\n }\n const firstRow = rows[0];\n if (firstRow === undefined) {\n return;\n }\n const widths = firstRow.map((_, column) =>\n Math.max(...rows.map((row) => stripAnsi(row[column] ?? \"\").length)),\n );\n for (const row of rows) {\n const line = row\n .map((cell, column) => {\n const width = widths[column];\n if (width === undefined) {\n return cell;\n }\n const padding = width - stripAnsi(cell).length;\n return column === row.length - 1 ? cell : cell + \" \".repeat(padding);\n })\n .join(\" \");\n this.line(line.trimEnd());\n }\n }\n}\n","import { CliOutput } from \"@/lib/cli/cli-output\";\n\nexport const out = new CliOutput();\n","import { chmodSync, mkdirSync, rmSync, writeFileSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\n\nimport { CliError } from \"../cli/cli-error\";\nimport { DEFAULT_BASE_URL } from \"@/lib/shared/config-constants\";\nimport type { CliConfig } from \"@/lib/cli/cli-config\";\nimport { CONFIG_PATH } from \"@/lib/path/config-path-constants\";\nimport { readFileAsObject } from \"@/lib/file/read-file-as-object\";\nimport { configReadString } from \"@/lib/string/config-read-string\";\nimport { readUser } from \"@/lib/user/read-user\";\nimport { readHttpUrl } from \"@/lib/http/read-http-url\";\nimport { isSameOrigin } from \"@/lib/same/is-same-origin\";\n\n/**\n * `~/.hepha/config.json` — where a device-flow session lives between runs.\n *\n * Written 0600, because it holds a token that acts as the human. Agents are\n * expected to use HEPHA_API_KEY instead and never touch this file.\n */\nexport const config = {\n path: CONFIG_PATH,\n\n load(): CliConfig {\n const stored = readFileAsObject();\n const storedBaseUrl = readHttpUrl(stored.baseUrl);\n\n // A malformed HEPHA_URL is refused rather than ignored. Falling back would\n // run the command against production — with the production token, since\n // the origin would then match — which is the exact accident the\n // origin-binding below exists to prevent. A malformed value in the config\n // FILE still falls back: the user did not ask for it this run, and\n // bricking every command over a stale file helps nobody.\n const override = configReadString(process.env.HEPHA_URL);\n if (override && !readHttpUrl(override)) {\n throw new CliError(\n `HEPHA_URL is not a valid http(s) URL: \"${override}\".`,\n 2,\n );\n }\n\n const baseUrl = readHttpUrl(override) ?? storedBaseUrl ?? DEFAULT_BASE_URL;\n\n // The stored token is bound to the deployment it was issued by. Pointing\n // HEPHA_URL at staging or somebody else's instance must not send a human\n // bearer token for production to that origin — it would not authenticate\n // there, and it would hand the credential to whoever runs it.\n const token =\n storedBaseUrl && isSameOrigin(storedBaseUrl, baseUrl)\n ? configReadString(stored.token)\n : undefined;\n const user = token ? readUser(stored.user) : undefined;\n\n return {\n baseUrl,\n ...(token ? { token } : {}),\n ...(user ? { user } : {}),\n };\n },\n\n save(next: CliConfig): void {\n mkdirSync(dirname(CONFIG_PATH), { recursive: true, mode: 0o700 });\n writeFileSync(CONFIG_PATH, `${JSON.stringify(next, null, 2)}\\n`, {\n mode: 0o600,\n });\n chmodSync(CONFIG_PATH, 0o600);\n },\n\n clear(): void {\n rmSync(CONFIG_PATH, { force: true });\n },\n};\n","export const DEFAULT_BASE_URL = \"https://hephaistos.impulselab.ai\";\n","import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nexport const CONFIG_PATH = join(homedir(), \".hepha\", \"config.json\");\n","import { readFileSync } from \"node:fs\";\nimport { CONFIG_PATH } from \"@/lib/path/config-path-constants\";\nexport function readFileAsObject(): Record<string, unknown> {\n try {\n const parsed: unknown = JSON.parse(readFileSync(CONFIG_PATH, \"utf8\"));\n // Valid JSON is not necessarily an object: a file holding `null` or a\n // bare string parses fine and then throws on the first property read,\n // taking down every command. Fall back to defaults instead.\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n return {};\n }\n return parsed as Record<string, unknown>;\n } catch {\n return {};\n }\n}\n","/** A hand-edited file can hold anything; only usable strings get through. */\nexport function configReadString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n}\n","import type { CliConfig } from \"@/lib/cli/cli-config\";\nimport { configReadString } from \"@/lib/string/config-read-string\";\nexport function readUser(value: unknown): CliConfig[\"user\"] {\n if (!value || typeof value !== \"object\") {\n return undefined;\n }\n const candidate = value as Record<string, unknown>;\n const user = {\n id: configReadString(candidate.id),\n name: configReadString(candidate.name),\n email: configReadString(candidate.email),\n };\n\n return user.id && user.name && user.email\n ? { id: user.id, name: user.name, email: user.email }\n : undefined;\n}\n","export function isHttpUrl(value: string): boolean {\n try {\n const parsed = new URL(value);\n return parsed.protocol === \"http:\" || parsed.protocol === \"https:\";\n } catch {\n return false;\n }\n}\n","import { isHttpUrl } from \"@/lib/http/is-http-url\";\nimport { configReadString } from \"@/lib/string/config-read-string\";\n/** A usable base URL, or nothing — \"not a url\" would otherwise reach\n * `new URL()` in api.ts and break every command. */\nexport function readHttpUrl(value: unknown): string | undefined {\n const raw = configReadString(value);\n return raw && isHttpUrl(raw) ? raw : undefined;\n}\n","/** Same deployment? Compared on origin, so a trailing slash does not matter. */\nexport function isSameOrigin(a: string, b: string): boolean {\n try {\n return new URL(a).origin === new URL(b).origin;\n } catch {\n return false;\n }\n}\n","import { readFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n/**\n * Read at runtime, not baked in: CI stamps the real version onto package.json\n * when it publishes. Walking up covers both `dist/index.js` (installed) and\n * `src/lib/version.ts` (`pnpm dev`).\n */\nexport function readVersion(): string {\n let directory = dirname(fileURLToPath(import.meta.url));\n\n for (let depth = 0; depth < 5; depth += 1) {\n try {\n const manifest: unknown = JSON.parse(\n readFileSync(join(directory, \"package.json\"), \"utf8\"),\n );\n const version = (manifest as { version?: unknown }).version;\n if (typeof version === \"string\" && version.length > 0) {\n return version;\n }\n } catch {\n // Keep walking: not every ancestor holds a manifest.\n }\n const parent = dirname(directory);\n if (parent === directory) {\n break;\n }\n directory = parent;\n }\n\n return \"unknown\";\n}\n","import { readVersion } from \"@/lib/version/read-version\";\n\nexport const VERSION = readVersion();\n","export const HELP = `hepha — orchestrate Hephaistos sessions from a terminal or an agent.\n\nUSAGE\n hepha <command> [args] [--flags]\n\nTHE LOOP\n hepha run \"<prompt>\" --repo owner/repo --follow\n Start a session and follow it until it finishes or asks you something.\n Exit 0 completed · 3 waiting on a human · 1 failed.\n [--title \"…\"] [--task-type implement|new-project|orchestrator|design]\n [--model <slug>] [--harness claude-code|codex] [--branch <name>]\n [--skill <id>]…\n hepha questions list [--session <id>]\n hepha questions show <batchId>\n hepha questions answer <batchId> --option <questionId>=1,2 --text <questionId>=\"…\"\n [--answers '<json array>']\n hepha questions cancel <batchId>\n hepha approvals list | show <id> | approve <id> | reject <id> --mode rework --feedback \"…\"\n\nSESSIONS\n hepha sessions list [--status active|waiting|done] [--repo owner/repo]\n [--search \"…\"] [--page N] [--limit N] [--all]\n hepha sessions get <id>\n hepha sessions logs <id> [--after <sequence>] [--limit N] [--follow]\n hepha sessions send <id> \"<message>\"\n hepha sessions pause|resume|archive <id>\n hepha sessions kill <id> [--reason \"…\"]\n hepha sessions checks|pr|verify <id>\n\nCATALOG\n hepha repos\n hepha branches <owner/repo>\n hepha models\n hepha skills\n\nAUTH\n hepha login [--url https://…] Device authorization: approve it in a browser.\n hepha logout\n hepha whoami\n hepha keys list\n hepha keys create <name> [--scope sessions:read]… [--expires-in-days 90]\n hepha keys revoke <keyId>\n\nENVIRONMENT\n HEPHA_API_KEY Act as an agent. Takes precedence over a stored login, so\n the human-only commands (approvals approve/reject, keys)\n answer 403 while it is set — unset it to act as yourself.\n HEPHA_TOKEN A device-flow session token, instead of ~/.hepha/config.json.\n HEPHA_URL Platform base URL.\n HEPHA_TIMEOUT_MS Per-request timeout in milliseconds (default 30000).\n HEPHA_FOLLOW_MAX_OUTAGE_SECONDS\n Give up this long after --follow's first failure, with that\n failure as the exit code. Unset, it waits for the platform\n to come back.\n\nGLOBAL FLAGS\n --json Machine-readable output on stdout. Every command that\n returns data honours it; login is interactive and does not.\n Failures print {\"ok\":false,\"error\":{…}} and keep their exit code.\n --quiet Suppress the streamed transcript while following a session.\n --version Print the version and exit.\n --help Print this.\n\nUnknown flags and surplus arguments are refused: for an agent, a typo must\nfail rather than run with default options.\n\n`;\n","import { config } from \"../../lib/shared/config\";\nimport { out } from \"../../lib/output/out\";\nimport { VERSION } from \"../../lib/version/version-constants\";\nimport { HELP } from \"@/commands/help/help-constants\";\n\nexport function helpCommand(): void {\n // Resolved, not a placeholder: the reader can click straight through to the\n // Scalar reference for the platform this CLI is actually pointed at.\n const baseUrl = config.load().baseUrl.replace(/\\/$/, \"\");\n out.line(`${HELP}hepha ${VERSION} · full reference: ${baseUrl}/api/v1/docs`);\n}\n","export const GLOBAL_BOOLEANS = [\"json\", \"help\", \"quiet\"] as const;\n","import { GLOBAL_BOOLEANS } from \"@/lib/args/args-constants\";\nexport const BOOLEAN_FLAGS = new Set<string>([\n ...GLOBAL_BOOLEANS,\n \"follow\",\n \"all\",\n \"version\",\n]);\n","import { BOOLEAN_FLAGS } from \"@/lib/boolean/boolean-flags-constants\";\nimport { CliError } from \"@/lib/cli/cli-error\";\nimport type { ParsedArgs } from \"@/lib/parsed/parsed-args\";\n\nexport function parseFlag(\n argv: string[],\n index: number,\n parsed: ParsedArgs,\n): number {\n const token = argv[index];\n if (token === undefined) {\n return index;\n }\n\n const withoutDashes = token.slice(2);\n const equalsAt = withoutDashes.indexOf(\"=\");\n let name: string;\n let value: string | undefined;\n\n if (equalsAt >= 0) {\n name = withoutDashes.slice(0, equalsAt);\n value = withoutDashes.slice(equalsAt + 1);\n // `--json=false` must not become a truthy boolean flag.\n if (BOOLEAN_FLAGS.has(name)) {\n throw new CliError(\n `--${name} is a boolean flag: pass --${name} to enable it, or omit it. \"--${name}=${value}\" is not a value.`,\n 2,\n );\n }\n } else {\n name = withoutDashes;\n const next = argv[index + 1];\n if (\n !BOOLEAN_FLAGS.has(name) &&\n next !== undefined &&\n !next.startsWith(\"--\")\n ) {\n value = next;\n index += 1;\n }\n }\n\n // Empty value flags are typos; accepting `--url=` can select another target.\n if (value === undefined || value.trim() === \"\") {\n if (!BOOLEAN_FLAGS.has(name)) {\n throw new CliError(`--${name} expects a value.`, 2);\n }\n parsed.booleans.add(name);\n return index;\n }\n\n parsed.flags[name] = value;\n (parsed.repeated[name] ??= []).push(value);\n return index;\n}\n","import { CliError } from \"../cli/cli-error\";\nimport { GLOBAL_BOOLEANS } from \"@/lib/args/args-constants\";\nimport type { ArgsSpec } from \"@/lib/args/args-spec\";\nimport type { ParsedArgs } from \"@/lib/parsed/parsed-args\";\nimport { parseFlag } from \"@/lib/args/parse-flag\";\n\n/**\n * A deliberately small parser: no dependency, and the grammar stays something an\n * agent can generate blind — `hepha <group> <command> [args] [--flags]`. Strict\n * on purpose: `hepha keys create x --scpoe admin` used to mint a key with the\n * DEFAULT scopes and exit 0.\n */\nexport class ArgsParser {\n parse(argv: string[]): ParsedArgs {\n const parsed: ParsedArgs = {\n positional: [],\n flags: {},\n repeated: {},\n booleans: new Set(),\n };\n\n let flagsEnded = false;\n\n for (let index = 0; index < argv.length; index += 1) {\n const token = argv[index];\n if (token === undefined) {\n break;\n }\n\n // `--` ends option parsing: a prompt or a steering message is allowed to\n // start with dashes, and without this there is no way to send one.\n if (!flagsEnded && token === \"--\") {\n flagsEnded = true;\n continue;\n }\n\n if (flagsEnded || !token.startsWith(\"--\")) {\n parsed.positional.push(token);\n continue;\n }\n\n index = parseFlag(argv, index, parsed);\n }\n\n return parsed;\n }\n\n /**\n * Refuse anything this action does not understand. Called once the action is\n * known, because `sessions list` and `sessions logs` accept different flags.\n */\n expect(parsed: ParsedArgs, spec: ArgsSpec): void {\n const allowed = new Set<string>([\n ...GLOBAL_BOOLEANS,\n ...(spec.flags ?? []),\n ...(spec.booleans ?? []),\n ]);\n\n for (const name of [...Object.keys(parsed.flags), ...parsed.booleans]) {\n if (!allowed.has(name)) {\n throw new CliError(`Unknown flag --${name}.`, 2);\n }\n }\n\n const max = spec.positional ?? 0;\n if (parsed.positional.length > max) {\n const surplus = parsed.positional\n .slice(max)\n .map((value) => `\"${value}\"`)\n .join(\", \");\n throw new CliError(\n `Unexpected argument${parsed.positional.length - max > 1 ? \"s\" : \"\"} ${surplus}.`,\n 2,\n );\n }\n }\n\n /** The action name, validated against what the group actually implements. */\n action(\n parsed: ParsedArgs,\n group: string,\n allowed: readonly string[],\n fallback: string,\n ): string {\n const action = parsed.positional[0] ?? fallback;\n // Checked BEFORE the action's own arguments: `hepha approvals frobnicate`\n // used to ask for a <guardrailRequestId> it was never going to use.\n if (!allowed.includes(action)) {\n throw new CliError(\n `Unknown ${group} command \"${action}\". Expected one of: ${allowed.join(\", \")}.`,\n 2,\n );\n }\n return action;\n }\n\n required(parsed: ParsedArgs, index: number, name: string): string {\n const value = parsed.positional[index];\n if (!value) {\n throw new CliError(`Missing <${name}>.`, 2);\n }\n return value;\n }\n\n /**\n * A whole number inside a range, refused locally: `--page -1` used to come\n * back from the API as a bare \"Input validation failed\".\n */\n integer(\n parsed: ParsedArgs,\n name: string,\n bounds: { min?: number; max?: number } = {},\n ): number | undefined {\n const raw = parsed.flags[name];\n if (raw === undefined) {\n return undefined;\n }\n const trimmed = raw.trim();\n const value = Number(trimmed);\n // Number(\"\") is 0, so an empty `--limit=` would quietly mean zero.\n if (trimmed === \"\" || !Number.isFinite(value)) {\n throw new CliError(`--${name} expects a number, got \"${raw}\".`, 2);\n }\n if (!Number.isInteger(value)) {\n throw new CliError(`--${name} expects a whole number, got \"${raw}\".`, 2);\n }\n if (bounds.min !== undefined && value < bounds.min) {\n throw new CliError(`--${name} must be at least ${bounds.min}.`, 2);\n }\n if (bounds.max !== undefined && value > bounds.max) {\n throw new CliError(`--${name} must be at most ${bounds.max}.`, 2);\n }\n return value;\n }\n\n /** One of a fixed set, named in the error so the fix is obvious. */\n choice<T extends string>(\n parsed: ParsedArgs,\n name: string,\n allowed: readonly T[],\n ): T | undefined {\n const raw = parsed.flags[name];\n if (raw === undefined) {\n return undefined;\n }\n if (!(allowed as readonly string[]).includes(raw)) {\n throw new CliError(\n `--${name} expects one of: ${allowed.join(\", \")}. Got \"${raw}\".`,\n 2,\n );\n }\n return raw as T;\n }\n}\n","import { ArgsParser } from \"@/lib/args/args-parser\";\n\nexport const args = new ArgsParser();\n","/**\n * Was machine output asked for, before anything can fail?\n *\n * The failure path needs to know, and it starts in `main()`'s catch — including\n * for errors raised BY the parser, which is exactly when an agent most needs a\n * parseable answer. Mirrors the parser's own rule: a bare `--json` token, and\n * `--` ends option parsing so a prompt may still contain the word.\n */\nexport function wantsJson(argv: string[]): boolean {\n for (const token of argv) {\n if (token === \"--\") {\n return false;\n }\n if (token === \"--json\") {\n return true;\n }\n }\n return false;\n}\n","export const DEFAULT_TIMEOUT_MS = 30_000;\n","import { CliError } from \"@/lib/cli/cli-error\";\nimport { DEFAULT_TIMEOUT_MS } from \"@/lib/api/api-constants\";\nexport function resolveTimeout(override?: number): number {\n if (override !== undefined) {\n return override;\n }\n const raw = process.env.HEPHA_TIMEOUT_MS?.trim();\n if (!raw) {\n return DEFAULT_TIMEOUT_MS;\n }\n const parsed = Number(raw);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n throw new CliError(\n `HEPHA_TIMEOUT_MS expects a positive number of milliseconds, got \"${raw}\".`,\n 2,\n );\n }\n return parsed;\n}\n","import { config } from \"@/lib/shared/config\";\nimport { CliError } from \"@/lib/cli/cli-error\";\nimport { CLI_ERROR_CODES } from \"@/lib/shared/errors-constants\";\nimport type { RequestOptions } from \"@/lib/request/request-options\";\nexport function authHeaders(as: RequestOptions[\"as\"]): Record<string, string> {\n if (as) {\n return { authorization: `Bearer ${as.token}` };\n }\n\n const apiKey = process.env.HEPHA_API_KEY;\n if (apiKey) {\n // An agent's key wins over any stored human session, so a CI run is never\n // silently attributed to whoever last ran `hepha login` on the machine.\n return { \"x-api-key\": apiKey };\n }\n\n const token = process.env.HEPHA_TOKEN ?? config.load().token;\n if (token) {\n return { authorization: `Bearer ${token}` };\n }\n\n throw new CliError(\n \"Not signed in. Run `hepha login`, or set HEPHA_API_KEY to act as an agent.\",\n 1,\n { code: CLI_ERROR_CODES.NOT_AUTHENTICATED },\n );\n}\n","import { VERSION } from \"./version-constants\";\n/** Installed from npm on its own schedule: server logs are the only census. */\nexport function clientHeaders(): Record<string, string> {\n return { \"x-hepha-client\": `hepha-cli/${VERSION}` };\n}\n","export function retryAfterSeconds(response: Response): number | undefined {\n // Better Auth answers `x-retry-after`, the public API answers the standard\n // header — read both rather than pick a side.\n const raw =\n response.headers.get(\"retry-after\") ??\n response.headers.get(\"x-retry-after\");\n if (!raw) {\n return undefined;\n }\n const seconds = Number(raw.trim());\n if (Number.isFinite(seconds)) {\n return seconds >= 0 ? seconds : undefined;\n }\n // RFC 9110 allows an HTTP-date instead of a delay, and proxies do send it.\n const date = Date.parse(raw.trim());\n return Number.isNaN(date)\n ? undefined\n : Math.max(0, (date - Date.now()) / 1_000);\n}\n","import { CliError } from \"@/lib/cli/cli-error\";\nimport { CLI_ERROR_CODES } from \"@/lib/shared/errors-constants\";\n\ninterface FetchResponseOptions {\n url: URL;\n method: string;\n headers: HeadersInit;\n body: unknown;\n deadline: number;\n baseUrl: string;\n}\n\nexport async function fetchResponse({\n url,\n method,\n headers,\n body,\n deadline,\n baseUrl,\n}: FetchResponseOptions): Promise<[Response, string]> {\n const controller = new AbortController();\n let abortedBy: \"timeout\" | \"interrupt\" | null = null;\n const timer = setTimeout(() => {\n abortedBy ??= \"timeout\";\n controller.abort();\n }, deadline);\n const onInterrupt = () => {\n abortedBy ??= \"interrupt\";\n controller.abort();\n };\n process.once(\"SIGINT\", onInterrupt);\n\n try {\n const response = await fetch(url, {\n method,\n headers,\n signal: controller.signal,\n ...(body === undefined ? {} : { body: JSON.stringify(body) }),\n });\n return [response, await response.text()];\n } catch (cause) {\n if (abortedBy === \"interrupt\") {\n throw new CliError(`${method} ${url.pathname} interrupted.`, 130, {\n code: CLI_ERROR_CODES.INTERRUPTED,\n });\n }\n if (abortedBy === \"timeout\") {\n throw new CliError(\n `${method} ${url.pathname} timed out after ${deadline}ms. Raise HEPHA_TIMEOUT_MS if the platform is simply slow.`,\n 1,\n { code: CLI_ERROR_CODES.TIMEOUT },\n );\n }\n throw new CliError(\n `Cannot reach ${baseUrl}. Set HEPHA_URL if the platform lives elsewhere. (${String(cause)})`,\n 1,\n { code: CLI_ERROR_CODES.NETWORK },\n );\n } finally {\n clearTimeout(timer);\n process.removeListener(\"SIGINT\", onInterrupt);\n }\n}\n","import type { RequestOptions } from \"@/lib/request/request-options\";\n\nexport function addQueryParameters(\n url: URL,\n query: RequestOptions[\"query\"],\n): void {\n for (const [key, value] of Object.entries(query ?? {})) {\n if (value !== undefined) {\n url.searchParams.set(key, String(value));\n }\n }\n}\n","import { out } from \"@/lib/output/out\";\n/** Bounded and control-character-free: an HTML error page must not be able to\n * smuggle escape sequences into a terminal through a diagnostic. */\nexport function excerpt(text: string): string {\n const flattened = out.cell(text);\n return flattened.length > 200\n ? `${flattened.slice(0, 200)}\\u2026`\n : flattened;\n}\n","import { CliError } from \"@/lib/cli/cli-error\";\nimport { excerpt } from \"@/lib/excerpt/excerpt\";\nimport { CLI_ERROR_CODES } from \"@/lib/shared/errors-constants\";\n\nexport function parseResponsePayload(\n response: Response,\n text: string,\n request: { method: string; url: URL; retryAfter: number | undefined },\n): unknown {\n const { method, url, retryAfter } = request;\n\n if (!text) {\n return null;\n }\n\n try {\n return JSON.parse(text);\n } catch {\n const body = excerpt(text);\n const contentType = response.headers.get(\"content-type\") ?? \"unknown\";\n // A non-JSON error is primarily an upstream failure, not a URL diagnosis.\n throw new CliError(\n response.ok\n ? `${method} ${url.pathname} answered ${response.status} with a non-JSON body (${contentType}). Is HEPHA_URL pointing at a Hephaistos deployment?${body ? ` Body: ${body}` : \"\"}`\n : `${method} ${url.pathname} failed with ${response.status} and a non-JSON body (${contentType}).${body ? ` Body: ${body}` : \"\"}`,\n 1,\n {\n status: response.status,\n code: CLI_ERROR_CODES.NON_JSON_RESPONSE,\n ...(retryAfter === undefined ? {} : { retryAfterSeconds: retryAfter }),\n },\n );\n }\n}\n","export function readIssues(payload: unknown): unknown[] | undefined {\n if (!payload || typeof payload !== \"object\") {\n return undefined;\n }\n const data = (payload as { data?: unknown }).data;\n if (!data || typeof data !== \"object\") {\n return undefined;\n }\n const issues = (data as { issues?: unknown }).issues;\n return Array.isArray(issues) ? issues : undefined;\n}\n","/** Wire contract: the `/api/v1` unmatched-route marker, read by the npm CLI. */\nexport const PATH_NOT_SERVED = \"path_not_served\";\n","export function readString(payload: unknown, key: string): string | undefined {\n if (!payload || typeof payload !== \"object\") {\n return undefined;\n }\n const value = (payload as Record<string, unknown>)[key];\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n","import { PATH_NOT_SERVED } from \"@repo/core/api/path-not-served-constants\";\nimport { readString } from \"@/lib/string/read-string\";\nimport { VERSION } from \"@/lib/version/version-constants\";\nexport function messageFrom(status: number, payload: unknown): string {\n const message = readString(payload, \"message\");\n // Only our own unmatched-route fallback sends this, and only on a 404: a\n // proxy or the wrong host has no such code and keeps its own diagnosis.\n if (\n status === 404 &&\n readString(payload, \"error\") === PATH_NOT_SERVED &&\n message\n ) {\n return `${message} hepha ${VERSION} may be ahead of the platform.`;\n }\n if (message) {\n // A 403 with HEPHA_API_KEY set is almost always the precedence rule biting.\n return status === 403 && process.env.HEPHA_API_KEY\n ? `${message} (HEPHA_API_KEY is set and takes precedence over your \\`hepha login\\` session — unset it to act as yourself.)`\n : message;\n }\n if (status === 401) {\n return \"Unauthorized — your credential is missing, expired or revoked.\";\n }\n return `Request failed with status ${status}.`;\n}\n","import { CliError } from \"@/lib/cli/cli-error\";\nimport { readIssues } from \"@/lib/issues/read-issues\";\nimport { messageFrom } from \"@/lib/message/message-from\";\nimport { readString } from \"@/lib/string/read-string\";\n\nexport function throwResponseError(\n response: Response,\n payload: unknown,\n retryAfter: number | undefined,\n): never {\n // Pre-router refusals use `error`; oRPC responses take precedence via `code`.\n const code = readString(payload, \"code\") ?? readString(payload, \"error\");\n const issues = readIssues(payload);\n\n throw new CliError(\n messageFrom(response.status, payload) +\n (response.status === 429 && retryAfter !== undefined\n ? ` Retry in ${retryAfter}s.`\n : \"\"),\n 1,\n {\n status: response.status,\n ...(code ? { code } : {}),\n ...(issues ? { issues } : {}),\n ...(retryAfter === undefined ? {} : { retryAfterSeconds: retryAfter }),\n },\n );\n}\n","import { config } from \"../shared/config\";\nimport type { RequestOptions } from \"@/lib/request/request-options\";\nimport { resolveTimeout } from \"@/lib/timeout/resolve-timeout\";\nimport { authHeaders } from \"@/lib/auth/auth-headers\";\nimport { clientHeaders } from \"@/lib/version/client-headers\";\nimport { retryAfterSeconds } from \"@/lib/retry/retry-after-seconds\";\nimport { fetchResponse } from \"@/lib/response/fetch-response\";\nimport { addQueryParameters } from \"@/lib/api/add-query-parameters\";\nimport { parseResponsePayload } from \"@/lib/api/parse-response-payload\";\nimport { throwResponseError } from \"@/lib/api/throw-response-error\";\n\n/**\n * The one place the CLI talks to the platform.\n *\n * Every command names its REST path once and gets its types from the router\n * (api-inputs.ts), so there is no generated client to keep in step and no\n * second copy of the API surface.\n */\nexport async function api<T>(\n requestPath: string,\n options: RequestOptions = {},\n): Promise<T> {\n const baseUrl = options.as?.baseUrl ?? config.load().baseUrl;\n const url = new URL(`${baseUrl.replace(/\\/$/, \"\")}/api/v1${requestPath}`);\n addQueryParameters(url, options.query);\n\n // Resolved before the try: a missing credential is a usage error, not a\n // network failure, and must not be reported as one.\n const headers = {\n ...clientHeaders(),\n ...authHeaders(options.as),\n ...(options.body === undefined\n ? {}\n : { \"content-type\": \"application/json\" }),\n };\n\n const method = options.method ?? \"GET\";\n const deadline = resolveTimeout(options.timeoutMs);\n const [response, text] = await fetchResponse({\n url,\n method,\n headers,\n body: options.body,\n deadline,\n baseUrl,\n });\n\n const retryAfter = retryAfterSeconds(response);\n const payload = parseResponsePayload(response, text, {\n method,\n url,\n retryAfter,\n });\n\n if (!response.ok) {\n throwResponseError(response, payload, retryAfter);\n }\n\n return payload as T;\n}\n","/**\n * Build a REST path with every dynamic segment escaped.\n *\n * Session ids, key ids and repository names were interpolated raw, so a value\n * holding `?`, `#`, `/` or `%` silently moved the request to another route or\n * grew a query string the caller never wrote. A tagged template makes the safe\n * form the easy one, and the structural slashes stay in the literal parts.\n */\nexport function path(\n strings: TemplateStringsArray,\n ...values: string[]\n): string {\n return strings.reduce(\n (accumulator, literal, index) =>\n accumulator +\n (index === 0 ? \"\" : encodeURIComponent(values[index - 1] ?? \"\")) +\n literal,\n \"\",\n );\n}\n","export function read(payload: unknown, dotted: string): unknown {\n return dotted.split(\".\").reduce<unknown>((current, key) => {\n if (!current || typeof current !== \"object\") {\n return undefined;\n }\n return (current as Record<string, unknown>)[key];\n }, payload);\n}\n","import { CliError } from \"../cli/cli-error\";\nimport { VERSION } from \"../version/version-constants\";\nimport { CLI_ERROR_CODES } from \"@/lib/shared/errors-constants\";\nimport type { Predicate } from \"@/lib/predicate/predicate\";\nimport { read } from \"@/lib/read/read\";\n\n/**\n * Check a 2xx payload before the command destructures it. The client casts\n * responses to the router's types — a compile-time promise about a server that\n * may be older or newer than this binary. When it did not hold, the first\n * property read threw `Cannot read properties of undefined`.\n */\nexport function expectShape<T>(\n payload: unknown,\n endpoint: string,\n requirements: Record<string, Predicate>,\n): T {\n for (const [field, predicate] of Object.entries(requirements)) {\n if (!predicate(read(payload, field))) {\n throw new CliError(\n `${endpoint} returned a payload this CLI does not understand: \"${field}\" is missing or has the wrong type. hepha ${VERSION} may be out of step with the platform — try \\`npm install -g @impulselab/hepha\\`.`,\n 1,\n { code: CLI_ERROR_CODES.API_SCHEMA_MISMATCH },\n );\n }\n }\n\n return payload as T;\n}\n","/** The handful of shapes the CLI actually destructures. */\nexport const is = {\n string: (value: unknown) => typeof value === \"string\",\n // Absent passes: a field a deployment older than this binary does not send.\n optionalString: (value: unknown) =>\n value === undefined || typeof value === \"string\",\n number: (value: unknown) => typeof value === \"number\",\n array: (value: unknown) => Array.isArray(value),\n object: (value: unknown) =>\n Boolean(value) && typeof value === \"object\" && !Array.isArray(value),\n};\n","export const ACTIONS = [\"list\", \"show\", \"approve\", \"reject\"] as const;\n\nexport const REJECT_MODES = [\"rework\", \"terminate\"] as const;\n","import { api } from \"@/lib/api/api\";\nimport { expectShape } from \"@/lib/expect/expect-shape\";\nimport { is } from \"@/lib/is/is\";\nimport { out } from \"@/lib/output/out\";\nimport type { ApiOutputs } from \"@/lib/api/api-outputs\";\n\nexport async function listApprovals(asJson: boolean): Promise<void> {\n const result = expectShape<ApiOutputs[\"approvals\"][\"list\"]>(\n await api(\"/approvals\"),\n \"GET /approvals\",\n { items: is.array },\n );\n if (asJson) {\n out.json(result);\n return;\n }\n if (result.items.length === 0) {\n out.line(\"No guardrail waiting on you.\");\n return;\n }\n out.table(\n result.items.map((item) => [\n out.cell(item.id),\n out.cell(item.guardrailKind),\n out.cell(item.repoName ?? \"—\"),\n out.cell(item.summary),\n ]),\n );\n}\n","import { api } from \"../../lib/api/api\";\nimport { path } from \"../../lib/path/path\";\nimport { args } from \"../../lib/args/args\";\nimport { CliError } from \"../../lib/cli/cli-error\";\nimport { expectShape } from \"../../lib/expect/expect-shape\";\nimport { is } from \"../../lib/is/is\";\nimport { out } from \"../../lib/output/out\";\nimport {\n ACTIONS,\n REJECT_MODES,\n} from \"@/commands/approvals/approvals-constants\";\nimport { listApprovals } from \"@/commands/approvals/list-approvals\";\nimport type { ApiOutputs } from \"@/lib/api/api-outputs\";\nimport type { ParsedArgs } from \"@/lib/parsed/parsed-args\";\n\n/**\n * Approving and rejecting require a human session and are refused for an API\n * key: a machine standing in for human validation would defeat the guardrail.\n */\nexport async function approvalsCommand(parsed: ParsedArgs): Promise<void> {\n const action = args.action(parsed, \"approvals\", ACTIONS, \"list\");\n const asJson = parsed.booleans.has(\"json\");\n\n if (action === \"list\") {\n args.expect(parsed, { positional: 1 });\n return await listApprovals(asJson);\n }\n\n args.expect(parsed, {\n positional: 2,\n ...(action === \"reject\" ? { flags: [\"mode\", \"feedback\"] } : {}),\n });\n const guardrailId = args.required(parsed, 1, \"guardrailRequestId\");\n\n if (action === \"show\") {\n const detail = expectShape<ApiOutputs[\"approvals\"][\"get\"]>(\n await api(path`/approvals/${guardrailId}`),\n \"GET /approvals/{id}\",\n { guardrailKind: is.string, status: is.string, summary: is.string },\n );\n if (asJson) {\n out.json(detail);\n return;\n }\n out.line(\n `${out.paint(out.cell(detail.guardrailKind), \"bold\")} ${detail.status}`,\n );\n out.line(out.safe(detail.summary));\n out.line();\n out.json(detail.payload);\n return;\n }\n\n if (action === \"approve\") {\n const result = await api<ApiOutputs[\"approvals\"][\"approve\"]>(\n path`/approvals/${guardrailId}/approve`,\n { method: \"POST\", body: {} },\n );\n if (asJson) {\n out.json(result);\n return;\n }\n out.line(`${out.paint(\"✓\", \"green\")} Approved ${out.cell(guardrailId)}`);\n return;\n }\n\n const mode = args.choice(parsed, \"mode\", REJECT_MODES) ?? \"rework\";\n if (mode === \"rework\" && !parsed.flags.feedback) {\n throw new CliError(\n \"--feedback is required with --mode rework: the agent needs to know what to change.\",\n 2,\n );\n }\n\n const result = await api<ApiOutputs[\"approvals\"][\"reject\"]>(\n path`/approvals/${guardrailId}/reject`,\n {\n method: \"POST\",\n body: {\n mode,\n ...(parsed.flags.feedback ? { feedback: parsed.flags.feedback } : {}),\n },\n },\n );\n if (asJson) {\n out.json(result);\n return;\n }\n out.line(\n `${out.paint(\"✓\", \"green\")} Rejected ${out.cell(guardrailId)} (${mode})`,\n );\n}\n","import { api } from \"@/lib/api/api\";\nimport { args } from \"@/lib/args/args\";\nimport { CliError } from \"@/lib/cli/cli-error\";\nimport { out } from \"@/lib/output/out\";\nimport { path } from \"@/lib/path/path\";\nimport type { ApiOutputs } from \"@/lib/api/api-outputs\";\nimport type { ParsedArgs } from \"@/lib/parsed/parsed-args\";\n\nexport async function listCatalogBranches(\n parsed: ParsedArgs,\n asJson: boolean,\n): Promise<void> {\n args.expect(parsed, { positional: 1 });\n const repoFullName = args.required(parsed, 0, \"owner/repo\");\n const segments = repoFullName.split(\"/\");\n const [owner, repo] = segments;\n if (segments.length !== 2 || !owner || !repo) {\n throw new CliError(\n `Expected a repository as \"owner/repo\", got \"${repoFullName}\".`,\n 2,\n );\n }\n\n const result = await api<ApiOutputs[\"catalog\"][\"branches\"]>(\n path`/repos/${owner}/${repo}/branches`,\n );\n if (!result.result) {\n throw new CliError(`No GitHub installation covers ${repoFullName}.`);\n }\n if (asJson) {\n out.json(result);\n return;\n }\n for (const branch of result.result.branches) {\n out.line(\n branch === result.result.defaultBranch\n ? `${out.cell(branch)} ${out.paint(\"(default)\", \"dim\")}`\n : out.cell(branch),\n );\n }\n}\n","import { api } from \"@/lib/api/api\";\nimport { args } from \"@/lib/args/args\";\nimport { expectShape } from \"@/lib/expect/expect-shape\";\nimport { is } from \"@/lib/is/is\";\nimport { out } from \"@/lib/output/out\";\nimport type { ApiOutputs } from \"@/lib/api/api-outputs\";\nimport type { ParsedArgs } from \"@/lib/parsed/parsed-args\";\n\nexport async function listCatalogModels(\n parsed: ParsedArgs,\n asJson: boolean,\n): Promise<void> {\n args.expect(parsed, {});\n const result = expectShape<ApiOutputs[\"catalog\"][\"models\"]>(\n await api(\"/models\"),\n \"GET /models\",\n { harnesses: is.array, gatewayModels: is.array },\n );\n if (asJson) {\n out.json(result);\n return;\n }\n out.line(out.paint(\"harnesses\", \"dim\"));\n for (const harness of result.harnesses) {\n out.line(` ${out.cell(harness)}`);\n }\n out.line();\n out.line(out.paint(\"gateway models\", \"dim\"));\n for (const model of result.gatewayModels) {\n out.line(` ${out.cell(model.id)}`);\n }\n}\n","import { api } from \"@/lib/api/api\";\nimport { args } from \"@/lib/args/args\";\nimport { expectShape } from \"@/lib/expect/expect-shape\";\nimport { is } from \"@/lib/is/is\";\nimport type { ParsedArgs } from \"@/lib/parsed/parsed-args\";\n\n/**\n * Reads a catalog list endpoint: no flags accepted, the response shape checked\n * before anything renders it. Generic in the payload so each command keeps its\n * own contract from `ApiOutputs` and only names the array it expects.\n */\nexport async function readCatalogList<T>(\n parsed: ParsedArgs,\n path: string,\n field: string,\n): Promise<T> {\n args.expect(parsed, {});\n return expectShape<T>(await api(path), `GET ${path}`, { [field]: is.array });\n}\n","import { out } from \"@/lib/output/out\";\nimport { readCatalogList } from \"@/commands/catalog/read-catalog-list\";\nimport type { ApiOutputs } from \"@/lib/api/api-outputs\";\nimport type { ParsedArgs } from \"@/lib/parsed/parsed-args\";\n\nexport async function listCatalogRepos(\n parsed: ParsedArgs,\n asJson: boolean,\n): Promise<void> {\n const result = await readCatalogList<ApiOutputs[\"catalog\"][\"repos\"]>(\n parsed,\n \"/repos\",\n \"repos\",\n );\n if (asJson) {\n out.json(result);\n return;\n }\n for (const repo of result.repos) {\n out.line(out.cell(repo));\n }\n}\n","import { out } from \"@/lib/output/out\";\nimport { readCatalogList } from \"@/commands/catalog/read-catalog-list\";\nimport type { ApiOutputs } from \"@/lib/api/api-outputs\";\nimport type { ParsedArgs } from \"@/lib/parsed/parsed-args\";\n\nexport async function listCatalogSkills(\n parsed: ParsedArgs,\n asJson: boolean,\n): Promise<void> {\n const result = await readCatalogList<ApiOutputs[\"catalog\"][\"skills\"]>(\n parsed,\n \"/skills\",\n \"skills\",\n );\n if (asJson) {\n out.json(result);\n return;\n }\n out.table(\n result.skills.map((skill) => [\n out.cell(skill.id),\n out.cell(skill.name),\n out.cell(skill.description ?? \"\"),\n ]),\n );\n}\n","import { listCatalogBranches } from \"@/commands/catalog/list-catalog-branches\";\nimport { listCatalogModels } from \"@/commands/catalog/list-catalog-models\";\nimport { listCatalogRepos } from \"@/commands/catalog/list-catalog-repos\";\nimport { listCatalogSkills } from \"@/commands/catalog/list-catalog-skills\";\nimport type { ParsedArgs } from \"@/lib/parsed/parsed-args\";\n\n/**\n * What `hepha catalog <topic>` can list. A table rather than a chain of\n * comparisons: adding a topic is one line, and the set of topics is readable\n * without following four branches.\n */\nexport const catalogTopics: Record<\n string,\n (parsed: ParsedArgs, asJson: boolean) => Promise<void>\n> = {\n branches: listCatalogBranches,\n models: listCatalogModels,\n repos: listCatalogRepos,\n skills: listCatalogSkills,\n};\n","import { CliError } from \"../../lib/cli/cli-error\";\nimport { catalogTopics } from \"@/commands/catalog/catalog-topics\";\nimport type { ParsedArgs } from \"@/lib/parsed/parsed-args\";\n\n/**\n * Read before creating a session: a repository outside `repos` is refused at\n * creation, and a model outside `models` is not routable.\n */\nexport async function catalogCommand(\n topic: string,\n parsed: ParsedArgs,\n): Promise<void> {\n const list = catalogTopics[topic];\n if (!list) {\n throw new CliError(`Unknown catalog topic \"${topic}\".`, 2);\n }\n await list(parsed, parsed.booleans.has(\"json\"));\n}\n","export const ACTIONS = [\"list\", \"create\", \"revoke\"] as const;\n","import { api } from \"@/lib/api/api\";\nimport { args } from \"@/lib/args/args\";\nimport { expectShape } from \"@/lib/expect/expect-shape\";\nimport { is } from \"@/lib/is/is\";\nimport { out } from \"@/lib/output/out\";\nimport type { Scope } from \"@/commands/scope/scope\";\nimport type { ApiOutputs } from \"@/lib/api/api-outputs\";\nimport type { ParsedArgs } from \"@/lib/parsed/parsed-args\";\n\nexport async function createKey(\n parsed: ParsedArgs,\n asJson: boolean,\n): Promise<void> {\n args.expect(parsed, { flags: [\"scope\", \"expires-in-days\"], positional: 2 });\n const name = args.required(parsed, 1, \"name\");\n const scopes = parsed.repeated.scope as Scope;\n const expiresInDays = args.integer(parsed, \"expires-in-days\", {\n min: 1,\n max: 365,\n });\n const created = expectShape<ApiOutputs[\"keys\"][\"create\"]>(\n await api(\"/keys\", {\n method: \"POST\",\n body: {\n name,\n ...(scopes && scopes.length > 0 ? { scopes } : {}),\n ...(expiresInDays !== undefined ? { expiresInDays } : {}),\n },\n }),\n \"POST /keys\",\n { key: is.string, scopes: is.array },\n );\n if (asJson) {\n out.json(created);\n return;\n }\n out.line(\n `${out.paint(\"✓\", \"green\")} Created \"${out.cell(created.name ?? name)}\"`,\n );\n out.line();\n out.line(` ${out.paint(created.key, \"bold\")}`);\n out.line();\n out.line(\n out.paint(\n \" Copy it now — it is hashed at rest and never shown again.\",\n \"dim\",\n ),\n );\n out.line(out.paint(` Scopes: ${created.scopes.join(\" \")}`, \"dim\"));\n}\n","import { api } from \"../../lib/api/api\";\nimport { path } from \"../../lib/path/path\";\nimport { args } from \"../../lib/args/args\";\nimport { expectShape } from \"../../lib/expect/expect-shape\";\nimport { is } from \"../../lib/is/is\";\nimport { out } from \"../../lib/output/out\";\nimport { ACTIONS } from \"@/commands/keys/keys-constants\";\nimport { createKey } from \"@/commands/key/create-key\";\nimport type { ApiOutputs } from \"@/lib/api/api-outputs\";\nimport type { ParsedArgs } from \"@/lib/parsed/parsed-args\";\n\n/**\n * Human sessions only, by design: a key cannot mint or revoke a key, so the\n * whole group fails with a 403 when HEPHA_API_KEY is set.\n */\nexport async function keysCommand(parsed: ParsedArgs): Promise<void> {\n const action = args.action(parsed, \"keys\", ACTIONS, \"list\");\n const asJson = parsed.booleans.has(\"json\");\n\n if (action === \"list\") {\n args.expect(parsed, { positional: 1 });\n const result = expectShape<ApiOutputs[\"keys\"][\"list\"]>(\n await api(\"/keys\"),\n \"GET /keys\",\n { keys: is.array },\n );\n if (asJson) {\n out.json(result);\n return;\n }\n if (result.keys.length === 0) {\n out.line(\"No keys. Create one with `hepha keys create <name>`.\");\n return;\n }\n out.table([\n [\n out.paint(\"ID\", \"dim\"),\n out.paint(\"NAME\", \"dim\"),\n out.paint(\"PREFIX\", \"dim\"),\n out.paint(\"SCOPES\", \"dim\"),\n ],\n ...result.keys.map((key) => [\n out.cell(key.id),\n out.cell(key.name ?? \"—\"),\n out.cell(key.start ?? \"—\"),\n key.scopes.join(\" \"),\n ]),\n ]);\n return;\n }\n\n if (action === \"create\") {\n return await createKey(parsed, asJson);\n }\n\n args.expect(parsed, { positional: 2 });\n const keyId = args.required(parsed, 1, \"keyId\");\n const result = await api<ApiOutputs[\"keys\"][\"revoke\"]>(path`/keys/${keyId}`, {\n method: \"DELETE\",\n });\n if (asJson) {\n out.json(result);\n return;\n }\n out.line(`${out.paint(\"✓\", \"green\")} Revoked ${out.cell(keyId)}`);\n}\n","import { createAuthClient } from \"better-auth/client\";\nimport { deviceAuthorizationClient } from \"better-auth/client/plugins\";\n\nimport { args } from \"../../lib/args/args\";\nimport { deviceTokenError } from \"../../lib/token/device-token-error\";\nimport { nextPollDelay } from \"../../lib/retry/next-poll-delay\";\nimport { CliError } from \"../../lib/cli/cli-error\";\nimport { openBrowser } from \"../../lib/browser/open-browser\";\nimport { out } from \"../../lib/output/out\";\nimport { MIN_BACKOFF } from \"@/commands/login/login-constants\";\nimport { CLIENT_ID } from \"@/commands/client/client-id-constants\";\nimport { sleep } from \"@/commands/sleep/sleep\";\nimport { completeLogin } from \"@/commands/complete/complete-login\";\nimport { resolveLoginBaseUrl } from \"@/commands/login/resolve-login-base-url\";\nimport type { ParsedArgs } from \"@/lib/parsed/parsed-args\";\n\n/**\n * `hepha login` — OAuth 2.0 device authorization (RFC 8628).\n *\n * The CLI never sees a password and never asks for a pasted token: it gets a\n * short code, a human approves it in a browser that is already signed in to\n * Hephaistos, and only then does a session token exist. That approval is also\n * what makes a CLI session count as \"a human\" for guardrail decisions.\n */\nexport async function loginCommand(parsed: ParsedArgs): Promise<void> {\n args.expect(parsed, { flags: [\"url\"] });\n\n const baseUrl = resolveLoginBaseUrl(parsed);\n\n const authClient = createAuthClient({\n baseURL: baseUrl,\n plugins: [deviceAuthorizationClient()],\n });\n\n const { data: device, error: deviceError } = await authClient.device.code({\n client_id: CLIENT_ID,\n scope: \"openid profile email\",\n });\n\n if (deviceError || !device) {\n throw new CliError(\n deviceError?.error_description ??\n `Could not start a device login against ${baseUrl}.`,\n );\n }\n\n const verificationUrl =\n device.verification_uri_complete ?? device.verification_uri;\n\n out.line();\n out.line(` Code ${out.paint(out.cell(device.user_code), \"bold\")}`);\n out.line(` Open ${out.cell(verificationUrl)}`);\n out.line();\n out.line(out.paint(\" Waiting for approval…\", \"dim\"));\n\n openBrowser(verificationUrl);\n\n let interval = device.interval ?? 5;\n const deadline = Date.now() + (device.expires_in ?? 900) * 1000;\n\n while (Date.now() < deadline) {\n // Never sleep past the code's own expiry (see nextPollDelay).\n const delay = nextPollDelay(interval, (deadline - Date.now()) / 1000);\n if (delay === null) {\n break;\n }\n await sleep(delay);\n\n const { data: token, error } = await authClient.device.token({\n grant_type: \"urn:ietf:params:oauth:grant-type:device_code\",\n device_code: device.device_code,\n client_id: CLIENT_ID,\n });\n\n // A 429 is transient by definition, and giving up on one abandoned a login\n // the human was about to approve — with \"Device authorization failed.\" as\n // the only clue, because the rate limiter answers a plain message and none\n // of the OAuth error codes below. Back off for as long as the server asks\n // (it answers `x-retry-after`), with a floor, and keep polling.\n if (error?.status === 429) {\n interval = Math.max(\n deviceTokenError.retryAfter(error) ?? interval * 2,\n MIN_BACKOFF,\n );\n continue;\n }\n\n if (token?.access_token) {\n await completeLogin(baseUrl, token.access_token);\n return;\n }\n\n if (!error) {\n continue;\n }\n\n switch (error.error) {\n case \"authorization_pending\":\n continue;\n case \"slow_down\":\n interval += 5;\n continue;\n case \"access_denied\":\n throw new CliError(\"Access denied — the request was rejected.\");\n default:\n // The server's own message, when it has one. Collapsing everything\n // that is not an OAuth code into \"Device authorization failed.\" is how\n // a rate-limit refusal looked like a broken device flow.\n throw new CliError(\n error.error_description ||\n deviceTokenError.message(error) ||\n `Device authorization failed (HTTP ${error.status}).`,\n );\n }\n }\n\n throw new CliError(\"The code expired before it was approved. Try again.\");\n}\n","/**\n * The client types this error as the OAuth code set alone, but the refusals that\n * actually broke `hepha login` carry neither — a rate limiter answers a plain\n * message and a status. Hence reading defensively off `unknown`.\n */\nexport const deviceTokenError = {\n /** What the server said, when it said anything at all. */\n message(error: unknown): string | undefined {\n if (!error || typeof error !== \"object\") {\n return undefined;\n }\n const message = (error as { message?: unknown }).message;\n return typeof message === \"string\" && message.length > 0\n ? message\n : undefined;\n },\n\n /** Better Auth answers `X-Retry-After`, the platform the standard header. */\n retryAfter(error: unknown): number | undefined {\n if (!error || typeof error !== \"object\") {\n return undefined;\n }\n const headers = (error as { headers?: unknown }).headers;\n if (!(headers instanceof Headers)) {\n return undefined;\n }\n const raw =\n headers.get(\"x-retry-after\") ?? headers.get(\"retry-after\") ?? undefined;\n if (!raw) {\n return undefined;\n }\n const seconds = Number(raw.trim());\n return Number.isFinite(seconds) && seconds > 0 ? seconds : undefined;\n },\n};\n","/**\n * How long to wait before the next attempt, or null when there is no time left.\n * A loop that tests its deadline only BEFORE sleeping slept a grown backoff in\n * full — minutes past the expiry of the device code, or of a follow's budget.\n */\nexport function nextPollDelay(\n interval: number,\n remainingSeconds: number,\n): number | null {\n if (remainingSeconds <= 0) {\n return null;\n }\n return Math.min(interval, remainingSeconds);\n}\n","import { spawn } from \"node:child_process\";\n\n/**\n * Best effort: on a headless box or over SSH there is no browser to open, so a\n * failure here is not an error — the URL is always printed as well.\n */\nexport function openBrowser(url: string): void {\n const command =\n process.platform === \"darwin\"\n ? \"open\"\n : process.platform === \"win32\"\n ? \"cmd\"\n : \"xdg-open\";\n const commandArgs =\n process.platform === \"win32\" ? [\"/c\", \"start\", \"\", url] : [url];\n\n try {\n const child = spawn(command, commandArgs, {\n stdio: \"ignore\",\n detached: true,\n });\n // A missing `xdg-open` (minimal containers, most SSH hosts) surfaces as an\n // ASYNCHRONOUS 'error' event that the try/catch cannot see. Unhandled, it\n // is an uncaught exception that kills the process mid-login — so the CLI\n // would stop polling instead of falling back to the printed URL.\n child.on(\"error\", () => {});\n child.unref();\n } catch {\n // Printing the URL is the fallback, and it already happened.\n }\n}\n","export const MIN_BACKOFF = 10;\n","// Every check in the codebase asks \"is this ADMIN?\", so a new role starts with\n// a member's reach: `guest` is narrowed explicitly, never implicitly.\nexport const USER_ROLES = {\n ADMIN: \"admin\",\n MEMBER: \"member\",\n GUEST: \"guest\",\n} as const;\n\nexport type UserRole = (typeof USER_ROLES)[keyof typeof USER_ROLES];\nexport const ALL_USER_ROLES = Object.values(USER_ROLES);\n\n/** Who may sign up unannounced. Anyone else needs a nominative invitation. */\nexport const ALLOWED_EMAIL_DOMAIN = \"@impulselab.ai\";\n\n/** How long a nominative invitation stays usable. */\nexport const INVITATION_TTL_DAYS = 14;\n\n/**\n * Public API scopes, in `resource:action` form. A Better Auth API key stores\n * them as its `permissions` map; a human session (browser cookie or a CLI\n * device-flow bearer token) implicitly holds every scope and is governed by\n * the user's role instead.\n *\n * Deliberately absent: `approvals:decide`, anything under `keys`, and\n * `devices:register` / `devices:revoke`. Guardrail decisions (VISION \"never\n * without explicit human validation\") and credential issuance are human-only\n * actions — no key can ever be granted them, so a leaked key can neither\n * approve a merge nor mint another key. Enrolling one of your machines and\n * cutting it off are the same kind of act: the machine IS a credential, so a\n * key must not be able to enrol another one or disown the one it runs on.\n */\nexport const API_SCOPES = [\n \"sessions:read\",\n \"sessions:write\",\n \"questions:read\",\n \"questions:answer\",\n \"approvals:read\",\n \"catalog:read\",\n \"pull_requests:read\",\n \"devices:read\",\n \"devices:write\",\n \"browser:read\",\n \"browser:write\",\n \"accounts:read\",\n \"inference:write\",\n] as const;\n\nexport type ApiScope = (typeof API_SCOPES)[number];\n\n/** Read-only, minus the browser vault: it names the services a human uses. */\nexport const DEFAULT_API_SCOPES: readonly ApiScope[] = API_SCOPES.filter(\n (scope) => scope.endsWith(\":read\") && !scope.startsWith(\"browser:\"),\n);\n\n/**\n * What the daemon on a paired machine is allowed to be. It is the equivalent\n * of a Daytona sandbox, not of its owner: open its channel, run what it is\n * sent, write the transcript back, publish its folders and its metrics.\n *\n * Everything else is absent on purpose, and each absence is a stolen-laptop\n * answer. No `browser:*`: the daemon must not read the vault of cookies its\n * owner captured. No `accounts:read`: it must not enumerate the subscription\n * pool. No `inference:write`: it must not spend on the org's gateway outside a\n * turn. No `approvals:read`, no `catalog:read`, no `pull_requests:read`. And\n * because `devices:register` / `devices:revoke` are not scopes at all, a\n * machine can neither enrol another one nor disown itself — those routes take\n * a human session, which the daemon no longer holds.\n */\nexport const MACHINE_API_SCOPES: readonly ApiScope[] = [\n \"devices:read\",\n \"devices:write\",\n \"sessions:read\",\n \"sessions:write\",\n \"questions:read\",\n];\n\n/** Prefix stamped on every issued key, so leaks are greppable. */\nexport const API_KEY_PREFIX = \"hepha_\";\n\n/**\n * Better Auth's own ceiling is 32, which `machine:<deviceId>` overruns by two:\n * a ULID is 26 characters and the label is eight. Raised rather than the name\n * shortened — the name is what a human reads next to a key in the UI, and the\n * device it names is the whole of its meaning.\n */\nexport const API_KEY_MAX_NAME_LENGTH = 64;\n\n/**\n * Browser session lifetime. Signing in is always \"remember me\": there is no\n * opt-out in the UI, so every sign-in path writes a PERSISTENT cookie that\n * survives closing the browser. `UPDATE_AGE` slides the expiry forward on use,\n * so an active human never sees the sign-in screen again.\n */\nexport const SESSION = {\n /** Cookie + session row lifetime: 30 days. */\n EXPIRES_IN: 60 * 60 * 24 * 30,\n /** Refresh the expiry at most once a day, to avoid a write per request. */\n UPDATE_AGE: 60 * 60 * 24,\n /** Cache the session row in memory for this long, to avoid a read per request. */\n COOKIE_CACHE_MAX_AGE: 60,\n} as const;\n\n/**\n * OAuth 2.0 device authorization grant (RFC 8628) — how the CLI logs a human\n * in without ever handling their password: it asks for a user code, the human\n * approves it on {BASE_URL}{VERIFICATION_PATH} in an already-signed-in\n * browser, and the CLI exchanges the device code for a session token.\n */\nexport const DEVICE_AUTHORIZATION = {\n /** Only these clients may open a device flow. */\n CLIENT_IDS: [\"hepha-cli\", \"hepha-extension\"],\n /** Lifetime of an unapproved user code. */\n EXPIRES_IN: \"15m\",\n /** Minimum delay the CLI must wait between two token polls. */\n INTERVAL: \"5s\",\n /** Page a human visits to approve a pending device. */\n VERIFICATION_PATH: \"/device\",\n /**\n * Per-IP ceiling on `/device/token`. The window is deliberately SHORTER than\n * INTERVAL: Better Auth only resets its counter when two requests are further\n * apart than the window, so a 5s poll under the default 60s window never reset\n * it and every login 429'd partway through the code's lifetime.\n */\n POLL_RATE_LIMIT: { WINDOW_SECONDS: 4, MAX_REQUESTS: 10 },\n} as const;\n\n// Copied by hand into the extension, which ships no build step and cannot\n// import this; `apps/browser-extension/test/limits-match-server.test.mjs` fails on drift.\nexport const BROWSER_CAPTURE_LIMITS = {\n COOKIES: 300,\n ORIGINS: 25,\n STORAGE_KEYS_PER_ORIGIN: 300,\n NAME_LENGTH: 1024,\n VALUE_LENGTH: 32_768,\n /** `JSON.stringify(state).length`: UTF-16 code units, not bytes. */\n TOTAL_CHARS: 1_000_000,\n LABEL_LENGTH: 120,\n USER_AGENT_LENGTH: 512,\n LOCALE_LENGTH: 64,\n EXTENSION_VERSION_LENGTH: 32,\n DOMAINS_PER_USER: 200,\n} as const;\n\n/**\n * Bounds of a registry skill, shared by every write path so the registry can\n * never hold a skill the edit form refuses to save back.\n *\n * The caps used to be restated per route, so a skill written through one path\n * could violate another's rule and become uneditable for good.\n */\nexport const SKILL_LIMITS = {\n /** Kebab-case slug, matched verbatim by `buildHarnessSkills`. */\n NAME_PATTERN: /^[a-z0-9]+(-[a-z0-9]+)*$/,\n NAME_MAX_LENGTH: 80,\n /** Not a title: the full \"use this when…\" trigger list drives matching. */\n DESCRIPTION_MAX_LENGTH: 2000,\n /** Relative POSIX path of a supporting file bundled with the skill. */\n FILE_PATH_MAX_LENGTH: 200,\n /** One activation scope entry: a repo full name or a channel id. */\n ACTIVATION_SCOPE_MAX_LENGTH: 120,\n} as const;\n\n/** Reserved: the harness materializes the skill body as SKILL.md. */\nexport const SKILL_BODY_FILENAME = \"skill.md\";\n\n/** The auto-maintained global review-lessons skill; per-repo names come from\n * utils/review-lesson-skill-name.ts. */\nexport const REVIEW_LESSONS_SKILL_NAME = \"review-lessons\";\n\n// Derived by Chrome from the RSA key in `apps/browser-extension/manifest.json`.\n// One exact id, never a wildcard: trusted origins also allowlist redirects.\nexport const BROWSER_EXTENSION_ORIGIN =\n \"chrome-extension://ieppdghbneelaninllkeimfcdnccbblj\";\n\n// Human code-quality rating: every criterion of the rubric is scored on this\n// scale. Client-safe, so the rating card can render the buttons without pulling\n// in the server-only database entry.\nexport const QUALITY_SCORE_MIN = 1;\n\nexport const QUALITY_SCORE_MAX = 5;\n\n/** rebase_only | queued — mirrors `pull_request_merge_intent_mode`. */\nexport const MERGE_INTENT_MODES = [\"rebase_only\", \"queued\"] as const;\n\n/** How long an unattached auto-rebase claim keeps exclusive branch ownership. */\nexport const AUTO_REBASE_CLAIM_MS = 30 * 60 * 1000;\n","import { DEVICE_AUTHORIZATION } from \"@repo/database/constants\";\nexport const CLIENT_ID = DEVICE_AUTHORIZATION.CLIENT_IDS[0];\n","export function sleep(seconds: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, seconds * 1000));\n}\n","import { api } from \"@/lib/api/api\";\nimport { config } from \"@/lib/shared/config\";\nimport { out } from \"@/lib/output/out\";\nimport type { ApiOutputs } from \"@/lib/api/api-outputs\";\n\nexport async function completeLogin(\n baseUrl: string,\n token: string,\n): Promise<void> {\n const identity = await api<ApiOutputs[\"me\"][\"get\"]>(\"/me\", {\n as: { baseUrl, token },\n });\n config.save({\n baseUrl,\n token,\n user: {\n id: identity.user.id,\n name: identity.user.name,\n email: identity.user.email,\n },\n });\n out.line();\n out.line(\n `${out.paint(\"✓\", \"green\")} Signed in as ${identity.user.email} on ${baseUrl}`,\n );\n out.line(out.paint(` Session stored in ${config.path}`, \"dim\"));\n}\n","import { config } from \"@/lib/shared/config\";\nimport { CliError } from \"@/lib/cli/cli-error\";\nimport { isHttpUrl } from \"@/lib/http/is-http-url\";\nimport type { ParsedArgs } from \"@/lib/parsed/parsed-args\";\n\nexport function resolveLoginBaseUrl(parsed: ParsedArgs): string {\n const requested = parsed.flags.url?.trim();\n if (requested !== undefined && !isHttpUrl(requested)) {\n throw new CliError(`--url is not a valid http(s) URL: \"${requested}\".`, 2);\n }\n return (requested ?? config.load().baseUrl).replace(/\\/$/, \"\");\n}\n","import { args } from \"../../lib/args/args\";\nimport { config } from \"../../lib/shared/config\";\nimport { out } from \"../../lib/output/out\";\nimport type { ParsedArgs } from \"@/lib/parsed/parsed-args\";\n\n/** Forgets the local session only; issued API keys keep working. */\nexport function logoutCommand(parsed: ParsedArgs): void {\n args.expect(parsed, {});\n\n config.clear();\n\n if (parsed.booleans.has(\"json\")) {\n out.json({ signedOut: true });\n return;\n }\n\n out.line(\"Signed out.\");\n}\n","export const LIMITS = {\n QUESTION_ID: 40,\n OPTION_ID: 40,\n OPTIONS_PER_ANSWER: 50,\n FREE_TEXT: 10_000,\n ANSWERS: 50,\n} as const;\n","import { LIMITS } from \"@/commands/answers/collect-answers-constants\";\nimport { CliError } from \"@/lib/cli/cli-error\";\n\nexport function validateFreeText(\n value: string | undefined,\n label: string,\n): void {\n if (value === undefined) {\n return;\n }\n const freeText = value.trim();\n if (freeText.length === 0) {\n throw new CliError(`${label} has empty free text.`, 2);\n }\n if (freeText.length > LIMITS.FREE_TEXT) {\n throw new CliError(\n `${label} has free text longer than ${LIMITS.FREE_TEXT} characters.`,\n 2,\n );\n }\n}\n","import { LIMITS } from \"@/commands/answers/collect-answers-constants\";\nimport { CliError } from \"@/lib/cli/cli-error\";\n\nexport function validateSelectedOptionIds(\n options: string[] | undefined,\n label: string,\n): void {\n if (options === undefined) {\n return;\n }\n if (options.length > LIMITS.OPTIONS_PER_ANSWER) {\n throw new CliError(\n `${label} selects more than ${LIMITS.OPTIONS_PER_ANSWER} options.`,\n 2,\n );\n }\n for (const id of options) {\n if (id.trim().length === 0) {\n throw new CliError(`${label} has an empty option id.`, 2);\n }\n if (id.trim().length > LIMITS.OPTION_ID) {\n throw new CliError(\n `${label} has an option id longer than ${LIMITS.OPTION_ID} characters.`,\n 2,\n );\n }\n }\n}\n","import { CliError } from \"@/lib/cli/cli-error\";\nimport { LIMITS } from \"@/commands/answers/collect-answers-constants\";\nimport type { Answer } from \"@/commands/answer/answer\";\nimport { validateFreeText } from \"@/commands/answer/validate-free-text\";\nimport { validateSelectedOptionIds } from \"@/commands/answer/validate-selected-option-ids\";\n/** `label` names the source — `--answers[2]` or `--option q1=…` — because both\n * entry paths build the same shape and must fail identically. */\nexport function validateAnswer(answer: Answer, label: string): void {\n // The ONE field the server does not trim, so its ceiling applies to the raw\n // value. Emptiness is checked more strictly than the API on purpose: a blank\n // id passes `min(1)` and then matches no question, leaving the round silently\n // unanswered.\n if (answer.questionId.trim().length === 0) {\n throw new CliError(`${label} needs a non-empty \"questionId\".`, 2);\n }\n if (answer.questionId.length > LIMITS.QUESTION_ID) {\n throw new CliError(\n `${label} has a \"questionId\" longer than ${LIMITS.QUESTION_ID} characters.`,\n 2,\n );\n }\n\n const options = answer.selectedOptionIds;\n validateSelectedOptionIds(options, label);\n validateFreeText(answer.freeText, label);\n\n // The server's own rule; `--option q1=,,` reaches exactly this shape.\n if (\n (options === undefined || options.length === 0) &&\n answer.freeText === undefined\n ) {\n throw new CliError(\n `${label} answers nothing. Give it at least one option id or some free text.`,\n 2,\n );\n }\n}\n","import { validateAnswer } from \"@/commands/answer/validate-answer\";\nimport type { Answer } from \"@/commands/answer/answer\";\nimport { CliError } from \"@/lib/cli/cli-error\";\n\nexport function parseAnswerEntry(entry: unknown, label: string): Answer {\n if (!entry || typeof entry !== \"object\" || Array.isArray(entry)) {\n throw new CliError(`${label} must be an object.`, 2);\n }\n\n const answer = entry as Record<string, unknown>;\n if (typeof answer.questionId !== \"string\") {\n throw new CliError(`${label} needs a non-empty \"questionId\".`, 2);\n }\n if (\n answer.selectedOptionIds !== undefined &&\n (!Array.isArray(answer.selectedOptionIds) ||\n answer.selectedOptionIds.some((id) => typeof id !== \"string\"))\n ) {\n throw new CliError(\n `${label}.selectedOptionIds must be an array of strings.`,\n 2,\n );\n }\n if (answer.freeText !== undefined && typeof answer.freeText !== \"string\") {\n throw new CliError(`${label}.freeText must be a string.`, 2);\n }\n\n const parsed = entry as Answer;\n validateAnswer(parsed, label);\n return parsed;\n}\n","import { CliError } from \"@/lib/cli/cli-error\";\nimport { LIMITS } from \"@/commands/answers/collect-answers-constants\";\nimport type { Answers } from \"@/commands/answers/answers\";\nimport { parseAnswerEntry } from \"@/commands/answers/parse-answer-entry\";\n/** `--answers '{}'` used to sail through `JSON.parse` and be posted as\n * `{\"answers\": {}}`, contradicting the CLI's own error message. */\nexport function parseAnswersFlag(raw: string): Answers {\n let decoded: unknown;\n try {\n decoded = JSON.parse(raw);\n } catch {\n throw new CliError(\"--answers expects a JSON array.\", 2);\n }\n\n if (!Array.isArray(decoded) || decoded.length === 0) {\n throw new CliError(\n '--answers expects a non-empty JSON array, e.g. \\'[{\"questionId\":\"q1\",\"selectedOptionIds\":[\"1\"]}]\\'.',\n 2,\n );\n }\n\n if (decoded.length > LIMITS.ANSWERS) {\n throw new CliError(\n `--answers carries more than ${LIMITS.ANSWERS} entries.`,\n 2,\n );\n }\n\n for (const [index, entry] of decoded.entries()) {\n parseAnswerEntry(entry, `--answers[${index}]`);\n }\n\n return decoded as Answers;\n}\n","import { CliError } from \"../../lib/cli/cli-error\";\nimport { LIMITS } from \"@/commands/answers/collect-answers-constants\";\nimport type { Answers } from \"@/commands/answers/answers\";\nimport type { Answer } from \"@/commands/answer/answer\";\nimport { validateAnswer } from \"@/commands/answer/validate-answer\";\nimport { parseAnswersFlag } from \"@/commands/answers/parse-answers-flag\";\nimport type { ParsedArgs } from \"@/lib/parsed/parsed-args\";\n\n/** `--option <questionId>=1,2` and `--text <questionId>=…`, or `--answers <json>`. */\nexport function collectAnswers(parsed: ParsedArgs): Answers {\n if (parsed.flags.answers) {\n return parseAnswersFlag(parsed.flags.answers);\n }\n\n const byQuestion = new Map<string, Answer>();\n\n const put = (pair: string, apply: (entry: Answer) => void) => {\n const equalsAt = pair.indexOf(\"=\");\n if (equalsAt < 0) {\n throw new CliError(`Expected <questionId>=<value>, got \"${pair}\".`, 2);\n }\n const questionId = pair.slice(0, equalsAt);\n const entry = byQuestion.get(questionId) ?? { questionId };\n apply(entry);\n byQuestion.set(questionId, entry);\n };\n\n for (const pair of parsed.repeated.option ?? []) {\n put(pair, (entry) => {\n entry.selectedOptionIds = pair\n .slice(pair.indexOf(\"=\") + 1)\n .split(\",\")\n .map((id) => id.trim())\n .filter(Boolean);\n });\n }\n\n for (const pair of parsed.repeated.text ?? []) {\n put(pair, (entry) => {\n entry.freeText = pair.slice(pair.indexOf(\"=\") + 1);\n });\n }\n\n const answers = [...byQuestion.values()];\n if (answers.length === 0) {\n throw new CliError(\n \"Nothing to submit. Use --option <questionId>=<ids>, --text <questionId>=<answer>, or --answers <json>.\",\n 2,\n );\n }\n if (answers.length > LIMITS.ANSWERS) {\n throw new CliError(\n `More than ${LIMITS.ANSWERS} answers in one submission.`,\n 2,\n );\n }\n\n for (const answer of answers) {\n validateAnswer(answer, `--option/--text ${answer.questionId}`);\n }\n\n return answers;\n}\n","export const ACTIONS = [\"list\", \"show\", \"answer\", \"cancel\"] as const;\n","import { api } from \"@/lib/api/api\";\nimport { expectShape } from \"@/lib/expect/expect-shape\";\nimport { is } from \"@/lib/is/is\";\nimport { out } from \"@/lib/output/out\";\nimport { path } from \"@/lib/path/path\";\nimport type { ApiOutputs } from \"@/lib/api/api-outputs\";\n\nexport async function listQuestions(\n sessionId: string | undefined,\n asJson: boolean,\n): Promise<void> {\n const result = expectShape<ApiOutputs[\"questions\"][\"list\"]>(\n await api(\n sessionId ? path`/sessions/${sessionId}/questions` : \"/questions\",\n ),\n \"GET /questions\",\n { items: is.array },\n );\n if (asJson) {\n out.json(result);\n return;\n }\n if (result.items.length === 0) {\n out.line(\"Nothing waiting on you.\");\n return;\n }\n out.table(\n result.items.map((batch) => [\n out.cell(batch.id),\n out.cell(batch.sessionId),\n `${batch.questions.length} question(s)`,\n out.cell(batch.sessionTitle),\n ]),\n );\n}\n","import type { Batch } from \"@/commands/batch/batch\";\nimport { out } from \"@/lib/output/out\";\n\nexport function printBatchQuestion(question: Batch[\"questions\"][number]): void {\n out.line();\n if (question.header) {\n out.line(out.paint(out.cell(question.header), \"dim\"));\n }\n out.line(\n `${out.paint(out.cell(question.id), \"dim\")} ${out.safe(question.body)}`,\n );\n if (question.image) {\n out.line(out.paint(` (image) ${out.cell(question.image)}`, \"dim\"));\n }\n for (const option of question.options) {\n const recommended = option.id === question.recommendedOptionId;\n // Image-only options still need an identifiable terminal label.\n const label = option.label\n ? out.cell(option.label)\n : option.image\n ? out.paint(`(image) ${out.cell(option.image)}`, \"dim\")\n : out.paint(\"(no label)\", \"dim\");\n out.line(\n ` ${out.cell(option.id)}) ${label}${recommended ? out.paint(\" ← recommended\", \"green\") : \"\"}`,\n );\n }\n if (question.allowFreeText) {\n out.line(out.paint(\" free text accepted\", \"dim\"));\n }\n}\n","import { out } from \"@/lib/output/out\";\nimport type { Batch } from \"@/commands/batch/batch\";\nimport { printBatchQuestion } from \"@/commands/batch/print-batch-question\";\nexport function printBatch(batch: Batch): void {\n // Questions are agent-authored text — sanitise before printing (out.safe).\n out.line(\n `${out.paint(out.cell(batch.sessionTitle), \"bold\")} ${out.paint(`round ${batch.round}`, \"dim\")}`,\n );\n out.line(\n out.paint(\n `batch ${out.cell(batch.id)} · session ${out.cell(batch.sessionId)}`,\n \"dim\",\n ),\n );\n\n for (const question of batch.questions) {\n printBatchQuestion(question);\n }\n}\n","import { api } from \"../../lib/api/api\";\nimport { path } from \"../../lib/path/path\";\nimport { args } from \"../../lib/args/args\";\nimport { collectAnswers } from \"../answers/collect-answers\";\nimport { expectShape } from \"../../lib/expect/expect-shape\";\nimport { is } from \"../../lib/is/is\";\nimport { out } from \"../../lib/output/out\";\nimport { ACTIONS } from \"@/commands/questions/questions-constants\";\nimport type { Batch } from \"@/commands/batch/batch\";\nimport { listQuestions } from \"@/commands/questions/list-questions\";\nimport { printBatch } from \"@/commands/batch/print-batch\";\nimport type { ApiOutputs } from \"@/lib/api/api-outputs\";\nimport type { ParsedArgs } from \"@/lib/parsed/parsed-args\";\n\n/**\n * A session with an unanswered round parks forever. Answering is a normal\n * scope, so an agent can do it; only guardrail decisions need a human.\n */\nexport async function questionsCommand(parsed: ParsedArgs): Promise<void> {\n const action = args.action(parsed, \"questions\", ACTIONS, \"list\");\n const asJson = parsed.booleans.has(\"json\");\n\n if (action === \"list\") {\n args.expect(parsed, { flags: [\"session\"], positional: 1 });\n return await listQuestions(parsed.flags.session, asJson);\n }\n\n args.expect(parsed, {\n positional: 2,\n ...(action === \"answer\" ? { flags: [\"option\", \"text\", \"answers\"] } : {}),\n });\n const batchId = args.required(parsed, 1, \"batchId\");\n\n if (action === \"show\") {\n const batch = expectShape<Batch>(\n await api(path`/questions/${batchId}`),\n \"GET /questions/{id}\",\n { id: is.string, questions: is.array, sessionTitle: is.string },\n );\n if (asJson) {\n out.json(batch);\n return;\n }\n printBatch(batch);\n return;\n }\n\n if (action === \"answer\") {\n const result = expectShape<ApiOutputs[\"questions\"][\"submit\"]>(\n await api(path`/questions/${batchId}/submit`, {\n method: \"POST\",\n body: { answers: collectAnswers(parsed) },\n }),\n \"POST /questions/{id}/submit\",\n { answeredCount: is.number },\n );\n if (asJson) {\n out.json(result);\n return;\n }\n out.line(\n `${out.paint(\"✓\", \"green\")} Answered ${result.answeredCount} question(s); the session resumes.`,\n );\n return;\n }\n\n const result = await api<ApiOutputs[\"questions\"][\"cancel\"]>(\n path`/questions/${batchId}/cancel`,\n { method: \"POST\", body: {} },\n );\n if (asJson) {\n out.json(result);\n return;\n }\n out.line(\n 'Round cancelled. The session stays parked — send a message to steer it: `hepha sessions send <id> \"…\"`',\n );\n}\n","export const POLL_SECONDS = 3;\n\nexport const PAGE_SIZE = 200;\n","export const ADVISOR_NOTE_SEVERITIES = [\n \"note\",\n \"warn\",\n \"alert\",\n \"suggestion\",\n] as const;\nexport const ADVISOR_NOTE_STATUSES = [\n \"posted\",\n \"pending\",\n \"confirmed\",\n \"dismissed\",\n] as const;\n\ntype AdvisorNoteSeverityLiteral = (typeof ADVISOR_NOTE_SEVERITIES)[number];\ntype AdvisorNoteStatusLiteral = (typeof ADVISOR_NOTE_STATUSES)[number];\n\nexport const ADVISOR_NOTE_SEVERITY = {\n NOTE: \"note\",\n WARN: \"warn\",\n ALERT: \"alert\",\n SUGGESTION: \"suggestion\",\n} as const satisfies {\n [Severity in AdvisorNoteSeverityLiteral as Uppercase<Severity>]: Severity;\n};\n\nexport const ADVISOR_NOTE_STATUS = {\n POSTED: \"posted\",\n PENDING: \"pending\",\n CONFIRMED: \"confirmed\",\n DISMISSED: \"dismissed\",\n} as const satisfies {\n [Status in AdvisorNoteStatusLiteral as Uppercase<Status>]: Status;\n};\n\nexport const ADVISOR_ALERT_SOURCE = \"advisor_alert\";\nexport const ADVISOR_WARNING_SOURCE = \"advisor_warning\";\nexport const ADVISOR_SUGGESTION_SOURCE = \"advisor_suggestion\";\nexport const ADVISOR_TRANSCRIPT_SOURCE = \"advisor_transcript\";\nexport const ADVISOR_PASS_FAILURE_SOURCE = \"advisor_pass_failure\";\nexport const ADVISOR_ALERT_DELIVERY_FAILURE_SOURCE =\n \"advisor_alert_delivery_failure\";\nexport const ADVISOR_PASS_FAILURE_DEDUPE_KEY = \"advisor-pass-failure-active\";\nexport const ADVISOR_ALERT_DELIVERY_FAILURE_DEDUPE_KEY =\n \"advisor-alert-delivery-failure\";\nexport const ADVISOR_NOTE_EVENT_TYPE = \"advisor_note\";\nexport const ADVISOR_NOTE_PART_KIND = \"advisor\";\nexport const ADVISOR_WARN_NOTIFICATION_TYPE = \"advisor_warn\";\nexport const ADVISOR_ALERT_NOTIFICATION_TYPE = \"advisor_alert\";\nexport const ADVISOR_THROUGH_SEQUENCE_KEY = \"advisorThroughSequence\";\n","import { ADVISOR_NOTE_SEVERITY, ADVISOR_NOTE_STATUS } from \"./constants\";\n\n// A warning confirmed before auto-forwarding was steered without a `steered`\n// flag: the old decision path only moved the status.\nexport function advisorNoteWasDelivered(note: {\n severity?: unknown;\n status?: unknown;\n steered?: unknown;\n}): boolean {\n return (\n note.steered === true ||\n (note.severity === ADVISOR_NOTE_SEVERITY.WARN &&\n note.status === ADVISOR_NOTE_STATUS.CONFIRMED)\n );\n}\n","import { out } from \"@/lib/output/out\";\n/** Sanitised first: transcript text is model, tool and repository output. */\nexport function truncate(text: string, max = 2000): string {\n const trimmed = out.safe(text).trim();\n return trimmed.length > max ? `${trimmed.slice(0, max)}…` : trimmed;\n}\n","import { ADVISOR_NOTE_SEVERITY } from \"@repo/database/advisor-constants\";\nimport { advisorNoteWasDelivered } from \"@repo/database/advisor-note-was-delivered\";\n\nimport { out } from \"../output/out\";\nimport { truncate } from \"@/lib/truncate/truncate\";\nimport type { TranscriptEvent } from \"@/lib/event/transcript-event\";\n\n/** Not the agent's words: the advisor watches the session from the outside. */\nexport function formatAdvisorPart(\n part: Extract<TranscriptEvent[\"part\"], { kind: \"advisor\" }>,\n): string {\n const note = truncate(part.text, 400);\n // The send, never the effect: queued steering waits for the agent's next turn.\n const delivery = advisorNoteWasDelivered(part)\n ? \"sent to the agent\"\n : \"not delivered\";\n switch (part.severity) {\n case ADVISOR_NOTE_SEVERITY.ALERT:\n return out.paint(`advisor alert, ${delivery}: ${note}`, \"red\");\n case ADVISOR_NOTE_SEVERITY.WARN:\n return out.paint(`advisor warning, ${delivery}: ${note}`, \"yellow\");\n case ADVISOR_NOTE_SEVERITY.SUGGESTION: {\n const named = part.skillName ? ` ${part.skillName}` : \"\";\n // \"offered\", not \"sent\": the agent decides whether to load the skill.\n const offer =\n delivery === \"not delivered\" ? delivery : \"offered to the agent\";\n return out.paint(\n `advisor skill suggestion${named}, ${offer}: ${note}`,\n \"blue\",\n );\n }\n case ADVISOR_NOTE_SEVERITY.NOTE:\n return out.paint(`advisor ${note}`, \"dim\");\n default:\n return part.severity satisfies never;\n }\n}\n","/** Re-signs on every click behind the session's read gate: this never expires. */\nexport function deliverableDownloadPath(\n sessionId: string,\n pathname: string,\n options?: { inline?: boolean },\n): string {\n const query = new URLSearchParams({ pathname });\n if (options?.inline) {\n query.set(\"disposition\", \"inline\");\n }\n return `/api/sessions/${sessionId}/deliverables?${query.toString()}`;\n}\n","/** Bytes as a short human-readable size (B / KB / MB). */\nexport function formatAttachmentSize(bytes: number): string {\n if (bytes < 1024) {\n return `${bytes} B`;\n }\n const kb = bytes / 1024;\n if (kb < 1024) {\n return `${kb.toFixed(0)} KB`;\n }\n return `${(kb / 1024).toFixed(1)} MB`;\n}\n","import { deliverableDownloadPath } from \"@repo/realtime/events/deliverable-download-path\";\nimport { formatAttachmentSize } from \"@repo/realtime/events/format-attachment-size\";\n\nimport { out } from \"../output/out\";\nimport type { DeliverablePart } from \"@repo/realtime/events/deliverable-part\";\n\n/** The durable auth-gated route: a signed Blob URL in a log is replayable. */\nexport function formatDeliverablePart(\n part: DeliverablePart,\n sessionId: string,\n baseUrl: string,\n): string {\n const entries = part.archive ? `, ${part.archive.entryCount} entries` : \"\";\n const size = `${formatAttachmentSize(part.sizeBytes)}${entries}`;\n const caption = part.caption ? ` - ${out.cell(part.caption)}` : \"\";\n const link = `${baseUrl}${deliverableDownloadPath(sessionId, part.pathname)}`;\n return `${out.paint(\"attach\", \"dim\")} ${out.cell(part.name)} ${out.paint(`(${size})`, \"dim\")}${caption}\\n ${out.cell(link)}`;\n}\n","// HarnessAgent termination modes mapping exactly to the session lifecycle\n// (docs/03-harnesses/01-harness-agent.md): destroy() = end, detach() = park\n// warm, stop() = park cold, suspendTurn() = cross-process handoff.\nexport const SESSION_TERMINATION_MODES = {\n DESTROY: \"destroy\",\n DETACH: \"detach\",\n STOP: \"stop\",\n SUSPEND_TURN: \"suspend-turn\",\n} as const;\n\nexport type SessionTerminationMode =\n (typeof SESSION_TERMINATION_MODES)[keyof typeof SESSION_TERMINATION_MODES];\nexport const ALL_SESSION_TERMINATION_MODES = Object.values(\n SESSION_TERMINATION_MODES,\n);\n\n// Platform host tools exposed to every harness\n// (docs/03-harnesses/01-harness-agent.md, host tools row).\nexport const HOST_TOOL_NAMES = {\n ADVISE: \"advise\",\n ASK_USER: \"ask_user\",\n SAVE_DEV_ENV_MANIFEST: \"save_dev_env_manifest\",\n REQUEST_DEV_ENV_CREDENTIALS: \"request_dev_env_credentials\",\n // Its sibling for every OTHER task type: the value is stored for the repo\n // and pushed to its Vercel project (docs/integrations/env-vars.md).\n REQUEST_ENV_VARS: \"request_env_vars\",\n GENERATE_DEV_ENV_SECRET: \"generate_dev_env_secret\",\n SET_DEV_ENV_SIZING: \"set_dev_env_sizing\",\n BAKE_DEV_ENV: \"bake_dev_env\",\n PROPOSE_PLAN: \"propose_plan\",\n REPORT_CONFIDENCE: \"report_confidence\",\n REQUEST_GUARDRAIL_APPROVAL: \"request_guardrail_approval\",\n // Somnium, mid-run: the automatic recall only fires on a session's FIRST\n // prompt, so the agent reads on demand and writes what it learns.\n MEMORY_SEARCH: \"memory_search\",\n MEMORY_WRITE: \"memory_write\",\n // Another chat, read through a separate model for one goal, never loaded\n // whole (docs/agents/session-reading.md).\n READ_SESSION: \"read_session\",\n // A project's shared context (docs/agents/projects.md): every session of the\n // project reads it in its instructions and writes back what it learned.\n PROJECT_CONTEXT_READ: \"project_context_read\",\n PROJECT_CONTEXT_WRITE: \"project_context_write\",\n SKILL_SEARCH: \"skill_search\",\n SKILL_LOAD: \"skill_load\",\n SAVE_SKILL: \"save_skill\",\n RECORD_REVIEW_LESSON: \"record_review_lesson\",\n // Proposes an EDIT to a skill already in the registry: a version above the\n // skill's current one, invisible to sessions until a human approves it\n // (docs/08-skills/01-registry.md).\n PROPOSE_SKILL_EDIT: \"propose_skill_edit\",\n DELIVERABLE_PUBLISH: \"deliverable_publish\",\n // Design mode: pull a round of static bundles out of the sandbox, store them\n // as immutable versions, and hand back the public link the panel mirrors.\n PUBLISH_DESIGN: \"publish_design\",\n SET_LIVE_DESIGN: \"set_live_design\",\n SUBMIT_SPECS: \"submit_specs\",\n SET_BRAND_KIT: \"set_brand_kit\",\n PLAN_TICKETS: \"plan_tickets\",\n // Run engine seats (docs/agents/software-factory.md): the foundation session\n // reports its checklist, the merge-decision session settles a ticket's PR,\n // the QA session settles the verification phase.\n MARK_PROVISIONING_STEP: \"mark_provisioning_step\",\n DECIDE_MERGE: \"decide_merge\",\n DECIDE_QA: \"decide_qa\",\n // Advisory dynamic playbook (WS6): the agent defines its own ordered steps\n // (set_steps) and fills each step's todo checklist (set_todos). Replaces the\n // fixed 5-phase set_phase pointer; neither parks the turn, the runner park\n // logic is untouched. A step's status is derived from its todos.\n SET_STEPS: \"set_steps\",\n SET_TODOS: \"set_todos\",\n // The chat's title is generated from the FIRST prompt by the platform's\n // small model. This lets the agent correct it mid-run when the real scope\n // turns out to be something else, and only then (see the pipeline\n // templates). Refused once a human has renamed the chat; never parks.\n RENAME_SESSION: \"rename_session\",\n // Files an issue in Hephaistos' own Linear tracker; never parks the turn.\n REPORT_HARNESS_ISSUE: \"report_harness_issue\",\n REPORT_DEV_SERVER: \"report_dev_server\",\n RUN_VALIDATION: \"run_validation\",\n // Media tool (Stage 1): generate images host-side via the AI Gateway; the\n // result renders inline in the thread. Always available, never parks the\n // turn.\n GENERATE_IMAGE: \"generate_image\",\n // In-sandbox annotation (#43): renders the source image + an SVG overlay in\n // the sandbox's chromium and screenshots it. NEVER host-side, the previous\n // @napi-rs/canvas implementation broke the glibc Trigger.dev worker deploy.\n ANNOTATE_IMAGE: \"annotate_image\",\n // WS8: the admin-configured image_generator registry, the agent reads the\n // enabled {model, description} rows to pick a model for generate_image.\n GET_IMAGE_GENERATORS: \"get_image_generators\",\n // Capture tools (Stage 2): drive a headless chromium INSIDE the session's\n // sandbox to screenshot / record a running app URL (or a file:// the agent\n // rendered), then attach the result inline. Provision the sandbox on demand\n // (WS7), always exposed.\n TAKE_SCREENSHOT: \"take_screenshot\",\n RECORD_VIDEO: \"record_video\",\n // Interactive browser control: ONE persistent chromium per sandbox, one\n // context per session, driven by the in-sandbox daemon (packages/tasks\n // lib/browser). The snapshot is an accessibility tree with `ref=eN` handles\n // the act tool targets, no coordinates, no throwaway playwright script.\n BROWSER_NAVIGATE: \"browser_navigate\",\n BROWSER_SNAPSHOT: \"browser_snapshot\",\n BROWSER_ACT: \"browser_act\",\n // The same page loop, decided by Jev instead of an agent turn: one call\n // walks a whole flow (docs/agents/browser-control.md).\n BROWSER_AUTOPILOT: \"browser_autopilot\",\n BROWSER_WAIT: \"browser_wait\",\n BROWSER_INSPECT: \"browser_inspect\",\n BROWSER_SCREENSHOT: \"browser_screenshot\",\n // A recording is a PAIR: playwright only films a context it created with\n // recording on, so start recycles the context and stop hands back the clip.\n BROWSER_RECORD_START: \"browser_record_start\",\n BROWSER_RECORD_STOP: \"browser_record_stop\",\n BROWSER_CLOSE: \"browser_close\",\n // The escape hatch: JS evaluated in a Node context that SURVIVES between\n // calls, with the live page bound into it.\n REPL_EVAL: \"repl_eval\",\n REPL_RESET: \"repl_reset\",\n // WS5: upload a PNG the agent produced in the sandbox (script/python/write)\n // as a media reference, silent for ask_user option images, inline otherwise.\n ATTACH_IMAGE: \"attach_image\",\n // Browser-session vault: sites a human captured with the Hephaistos\n // extension, applied to the live browser one domain at a time, on demand.\n BROWSER_SESSIONS_LIST: \"browser_sessions_list\",\n BROWSER_USE_SESSION: \"browser_use_session\",\n BROWSER_FORGET_SESSION: \"browser_forget_session\",\n // Outbound files: any format the human should keep, uploaded from the sandbox\n // to durable storage and downloadable once the sandbox is gone.\n ATTACH_FILE: \"attach_file\",\n // Delegation: a task is the work, a session is one attempt at it. The agent\n // describes the task and the PLATFORM dispatches it; these address the task,\n // never a runner. Fire-and-forget, none of them park the turn.\n CREATE_TASK: \"create_task\",\n LIST_TASKS: \"list_tasks\",\n UPDATE_TASK: \"update_task\",\n PEEK_TASK: \"peek_task\",\n SEND_TO_TASK: \"send_to_task\",\n STOP_TASK: \"stop_task\",\n PICKUP_TASK: \"pickup_task\",\n // A JS script whose agent() calls ARE platform tasks (docs/agents/workflows.md).\n WORKFLOW: \"workflow\",\n // docs/integrations/database-access.md; detect is environment-setup only.\n DATABASE_QUERY: \"database_query\",\n DATABASE_WRITE: \"database_write\",\n DETECT_PROJECT_DATABASE: \"detect_project_database\",\n BIND_PROJECT_DATABASE: \"bind_project_database\",\n // Historical: the agent-addressed family the tools above replaced. No agent\n // can call them, but old transcripts still render rows named after them.\n SPAWN_AGENT: \"spawn_agent\",\n LIST_AGENTS: \"list_agents\",\n PEEK_AGENT: \"peek_agent\",\n SEND_TO_AGENT: \"send_to_agent\",\n STOP_AGENT: \"stop_agent\",\n} as const;\n\nexport type HostToolName =\n (typeof HOST_TOOL_NAMES)[keyof typeof HOST_TOOL_NAMES];\nexport const ALL_HOST_TOOL_NAMES = Object.values(HOST_TOOL_NAMES);\n\nexport const TURN_CLOSING_TOOL_NAMES: readonly HostToolName[] = [\n HOST_TOOL_NAMES.UPDATE_TASK,\n HOST_TOOL_NAMES.CREATE_TASK,\n];\n\n// The file and shell tools the worker runs against the session VM\n// (@repo/tasks `remoteWorkspaceTools`). They shadow the harness' native\n// builtins field for field, so anything reading a tool call by name, the\n// transcript, the chat mirrors, must map them back onto the native family.\nexport const WORKSPACE_TOOL_NAMES = {\n BASH: \"workspace_bash\",\n READ: \"workspace_read\",\n WRITE: \"workspace_write\",\n EDIT: \"workspace_edit\",\n GLOB: \"workspace_glob\",\n GREP: \"workspace_grep\",\n TASK_OUTPUT: \"workspace_task_output\",\n TASK_STOP: \"workspace_task_stop\",\n} as const;\n\nexport type WorkspaceToolName =\n (typeof WORKSPACE_TOOL_NAMES)[keyof typeof WORKSPACE_TOOL_NAMES];\n\n/**\n * MCP namespace the bridge registers the platform's own toolbox under. Only\n * this namespace may be dropped when matching a tool call by name: a\n * third-party server is free to expose its own `read` or `create_task`, and\n * stripping its namespace too would let it borrow a built-in's label.\n */\nexport const HARNESS_MCP_NAMESPACE = \"mcp__harness-tools__\";\n\n// How a `send_to_task` message reaches an attempt that is already working:\n// abort the current turn immediately, stop it at the next settled tool call,\n// or wait for its next turn.\nexport const AGENT_MESSAGE_DELIVERY_MODES = {\n INTERRUPT: \"interrupt\",\n AFTER_TOOL: \"after_tool\",\n QUEUE: \"queue\",\n} as const;\n\nexport type AgentMessageDeliveryMode =\n (typeof AGENT_MESSAGE_DELIVERY_MODES)[keyof typeof AGENT_MESSAGE_DELIVERY_MODES];\nexport const ALL_AGENT_MESSAGE_DELIVERY_MODES = Object.values(\n AGENT_MESSAGE_DELIVERY_MODES,\n);\nexport const DEFAULT_AGENT_MESSAGE_DELIVERY_MODE =\n AGENT_MESSAGE_DELIVERY_MODES.AFTER_TOOL;\nexport const PARKED_TOOL_CALL_OUTPUT =\n \"The session parked on this call, the turn ended here.\";\n/** `payload.source` of a steering row written by a parent session. */\nexport const AGENT_MESSAGE_SOURCE_PARENT_SESSION = \"parent_session\";\n/** `payload.source` of a steering row a child session wrote to its parent. */\nexport const AGENT_MESSAGE_SOURCE_CHILD_SESSION = \"child_session\";\n/** `payload.source` of the row the platform writes when a sandbox dies mid-turn. */\nexport const AGENT_MESSAGE_SOURCE_WORKSPACE_LOSS = \"workspace_loss\";\n/** `payload.source` of the reminder an orchestrator gets for editing files itself. */\nexport const AGENT_MESSAGE_SOURCE_ORCHESTRATOR_DRIFT = \"orchestrator_drift\";\n\n// Sources allowed to cut a RUNNING turn at its next settled tool call: the\n// orchestration link (both directions) and the drift reminder; the rest waits.\nexport const AFTER_TOOL_STEERING_SOURCES = [\n AGENT_MESSAGE_SOURCE_PARENT_SESSION,\n AGENT_MESSAGE_SOURCE_CHILD_SESSION,\n AGENT_MESSAGE_SOURCE_ORCHESTRATOR_DRIFT,\n] as const;\n","import { WORKSPACE_TOOL_NAMES } from \"../../turns/turn-constants\";\n\n/**\n * The native tool each remote workspace tool shadows. `workspace_task_output`\n * and `workspace_task_stop` have no native counterpart and keep their own name.\n */\nexport const NATIVE_EQUIVALENT: Record<string, string> = {\n [WORKSPACE_TOOL_NAMES.BASH]: \"bash\",\n [WORKSPACE_TOOL_NAMES.READ]: \"read\",\n [WORKSPACE_TOOL_NAMES.WRITE]: \"write\",\n [WORKSPACE_TOOL_NAMES.EDIT]: \"edit\",\n [WORKSPACE_TOOL_NAMES.GLOB]: \"glob\",\n [WORKSPACE_TOOL_NAMES.GREP]: \"grep\",\n};\n","export function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","export function str(value: unknown): string | undefined {\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n","import { str } from \"./str\";\n\n/** A blank field carries no meaning: it reads as absent, not as an empty value. */\nexport function trimmed(value: unknown): string | null {\n const text = str(value)?.trim();\n return text ? text : null;\n}\n","export function truncate(value: string, max: number): string {\n const text = value.trim();\n return text.length > max ? `${text.slice(0, max - 1)}…` : text;\n}\n","import { str } from \"./str\";\n\n/** The field exactly as given, or null when it is blank — no silent rewrite. */\nexport function verbatim(value: unknown): string | null {\n const text = str(value);\n return text && text.trim().length > 0 ? text : null;\n}\n","import { isRecord, str, trimmed, truncate, verbatim } from \"./tool-input/index\";\n\n/** Defensive readers for a tool call's `input`, which is typed `unknown`. */\nexport const toolInput = { isRecord, str, trimmed, truncate, verbatim };\n","import type { ToolActivity } from \"./tool-activity\";\n\nexport function labelOnly(text: string): ToolActivity {\n return { text, command: null };\n}\n","export function toolActivityBasename(\n path: string | undefined,\n): string | undefined {\n if (!path) {\n return undefined;\n }\n const segments = path.split(/[/\\\\]/).filter(Boolean);\n return segments.at(-1) ?? path;\n}\n","export function toolActivityHostname(\n url: string | undefined,\n): string | undefined {\n if (!url) {\n return undefined;\n }\n try {\n return new URL(url).hostname;\n } catch {\n return url.replace(/^https?:\\/\\//, \"\").split(\"/\")[0] || undefined;\n }\n}\n","import { labelOnly } from \"../label-only\";\nimport type { ToolActivity } from \"../tool-activity\";\nimport type { ToolActivityState } from \"../tool-activity-state\";\n\n/** The browser tools answer a failure as TEXT, so only `hasFailed` separates\n * \"Clicked Log in\" from \"Could not click Log in\". */\nexport function browserLabel(\n state: ToolActivityState,\n labels: { failed: string; running: string; done: string },\n): ToolActivity {\n if (state.hasFailed) return labelOnly(labels.failed);\n return labelOnly(state.isRunning ? labels.running : labels.done);\n}\n","/** browser_act action → the three tenses the transcript needs. */\nexport const BROWSER_ACT_VERBS: Record<\n string,\n { done: string; gerund: string; bare: string }\n> = Object.assign(Object.create(null) as Record<string, never>, {\n click: { done: \"Clicked\", gerund: \"Clicking\", bare: \"click\" },\n dblclick: {\n done: \"Double-clicked\",\n gerund: \"Double-clicking\",\n bare: \"double-click\",\n },\n fill: { done: \"Filled\", gerund: \"Filling\", bare: \"fill\" },\n type: { done: \"Typed into\", gerund: \"Typing into\", bare: \"type into\" },\n select: { done: \"Selected in\", gerund: \"Selecting in\", bare: \"select in\" },\n check: { done: \"Checked\", gerund: \"Checking\", bare: \"check\" },\n uncheck: { done: \"Unchecked\", gerund: \"Unchecking\", bare: \"uncheck\" },\n hover: { done: \"Hovered\", gerund: \"Hovering\", bare: \"hover\" },\n press: {\n done: \"Pressed a key on\",\n gerund: \"Pressing a key on\",\n bare: \"press a key on\",\n },\n scroll: { done: \"Scrolled\", gerund: \"Scrolling\", bare: \"scroll\" },\n upload: {\n done: \"Uploaded a file to\",\n gerund: \"Uploading a file to\",\n bare: \"upload a file to\",\n },\n});\n\n/** browser_navigate history moves → their label, in the same three tenses. */\nexport const BROWSER_HISTORY_LABELS: Record<\n string,\n { done: string; gerund: string; bare: string }\n> = Object.assign(Object.create(null) as Record<string, never>, {\n back: { done: \"Went back\", gerund: \"Going back\", bare: \"go back\" },\n forward: {\n done: \"Went forward\",\n gerund: \"Going forward\",\n bare: \"go forward\",\n },\n reload: {\n done: \"Reloaded the page\",\n gerund: \"Reloading the page\",\n bare: \"reload the page\",\n },\n});\n","import type { ToolActivity } from \"../tool-activity\";\nimport type { ToolActivityState } from \"../tool-activity-state\";\nimport { toolInput } from \"../tool-input\";\nimport { browserLabel } from \"./browser-label\";\nimport { BROWSER_ACT_VERBS } from \"./browser-activity-constants\";\n\n/** \"Clicked Se connecter\" reads; \"called browser_act\" does not. */\nexport function describeBrowserAct(\n record: Record<string, unknown>,\n state: ToolActivityState,\n): ToolActivity {\n const action = toolInput.str(record.action) ?? \"click\";\n const verb = (Object.hasOwn(BROWSER_ACT_VERBS, action)\n ? BROWSER_ACT_VERBS[action]\n : undefined) ?? {\n done: \"Acted on\",\n gerund: \"Acting on\",\n bare: \"act on\",\n };\n const target =\n toolInput.trimmed(record.name) ??\n toolInput.trimmed(record.selector) ??\n toolInput.trimmed(record.ref) ??\n toolInput.trimmed(record.role);\n const subject = target ? toolInput.truncate(target, 60) : \"an element\";\n return browserLabel(state, {\n failed: `Could not ${verb.bare} ${subject}`,\n running: `${verb.gerund} ${subject}`,\n done: `${verb.done} ${subject}`,\n });\n}\n","import type { ToolActivity } from \"../tool-activity\";\nimport { toolActivityHostname } from \"../tool-activity-hostname\";\nimport type { ToolActivityState } from \"../tool-activity-state\";\nimport { toolInput } from \"../tool-input\";\nimport { browserLabel } from \"./browser-label\";\nimport { BROWSER_HISTORY_LABELS } from \"./browser-activity-constants\";\n\nexport function describeBrowserNavigate(\n record: Record<string, unknown>,\n state: ToolActivityState,\n): ToolActivity {\n const action = toolInput.str(record.action);\n if (action && action !== \"goto\") {\n const move = Object.hasOwn(BROWSER_HISTORY_LABELS, action)\n ? BROWSER_HISTORY_LABELS[action]\n : undefined;\n return move\n ? browserLabel(state, {\n failed: `Could not ${move.bare}`,\n running: move.gerund,\n done: move.done,\n })\n : browserLabel(state, {\n failed: \"Could not move in the browser\",\n running: \"Moving in the browser\",\n done: \"Moved in the browser\",\n });\n }\n const host = toolActivityHostname(toolInput.str(record.url));\n const subject = host ?? \"a page\";\n return browserLabel(state, {\n failed: `Could not open ${subject}`,\n running: `Opening ${subject}`,\n done: `Opened ${subject}`,\n });\n}\n","import { labelOnly } from \"../label-only\";\nimport type { ToolActivity } from \"../tool-activity\";\nimport type { ToolActivityState } from \"../tool-activity-state\";\n\n/**\n * The four sentences every capture tool needs — the option variant of a\n * capture never names its target (an ask_user thumb is about the question,\n * not about what was framed), which is why `option` carries no subject.\n */\nexport interface CaptureLabels {\n optionFailed: string;\n optionRunning: string;\n optionDone: string;\n failed: (subject: string | null) => string;\n running: (subject: string | null) => string;\n done: (subject: string | null) => string;\n}\n\nexport function captureLabel(\n labels: CaptureLabels,\n state: ToolActivityState,\n options: { isOption: boolean; subject: string | null },\n): ToolActivity {\n if (options.isOption) {\n if (state.hasFailed) {\n return labelOnly(labels.optionFailed);\n }\n return labelOnly(\n state.isRunning ? labels.optionRunning : labels.optionDone,\n );\n }\n if (state.hasFailed) {\n return labelOnly(labels.failed(options.subject));\n }\n return labelOnly(\n state.isRunning\n ? labels.running(options.subject)\n : labels.done(options.subject),\n );\n}\n","import { toolActivityBasename } from \"../tool-activity-basename\";\n/** Capture target for live labels: `localhost:3000`, a file basename, a path. */\nexport function captureTarget(url: string | undefined): string | undefined {\n if (!url) {\n return undefined;\n }\n try {\n const parsed = new URL(url);\n if (parsed.protocol === \"file:\") {\n return toolActivityBasename(parsed.pathname) ?? url;\n }\n return parsed.host || parsed.hostname;\n } catch {\n return toolActivityBasename(url) ?? url;\n }\n}\n","/** Same budget as the other single-line activity labels. */\nexport const CAPTURE_LABEL_MAX = 60;\n","import type { ToolActivity } from \"../tool-activity\";\nimport { toolInput } from \"../tool-input\";\nimport type { ToolActivityState } from \"../tool-activity-state\";\nimport { captureLabel } from \"./capture-label\";\nimport { captureTarget } from \"./capture-target\";\nimport { CAPTURE_LABEL_MAX } from \"./capture-label-constants\";\n\nexport function describeTakeScreenshot(\n record: Record<string, unknown>,\n state: ToolActivityState,\n): ToolActivity {\n const target = captureTarget(toolInput.str(record.url));\n return captureLabel(\n {\n optionFailed: \"Failed to take a silent screenshot\",\n optionRunning: \"Taking a silent screenshot\",\n optionDone: \"Took a silent screenshot\",\n failed: (subject) =>\n subject\n ? `Failed to screenshot ${subject}`\n : \"Failed to take a screenshot\",\n running: (subject) =>\n subject ? `Taking a screenshot of ${subject}` : \"Taking a screenshot\",\n done: (subject) =>\n subject ? `Took a screenshot of ${subject}` : \"Took a screenshot\",\n },\n state,\n {\n isOption: record.silent === true,\n subject: target ? toolInput.truncate(target, CAPTURE_LABEL_MAX) : null,\n },\n );\n}\n","import { HOST_TOOL_NAMES } from \"../../turns/turn-constants\";\nimport type { ToolActivity } from \"../tool-activity\";\nimport type { ToolActivityState } from \"../tool-activity-state\";\nimport { browserLabel } from \"./browser-label\";\nimport { toolInput } from \"../tool-input\";\nimport { describeBrowserAct } from \"./describe-browser-act\";\nimport { describeBrowserNavigate } from \"./describe-browser-navigate\";\nimport { describeTakeScreenshot } from \"../capture/describe-take-screenshot\";\n\n/** The browser + REPL half of the canonical describers, kept out of the big\n * map so neither file outgrows the line cap. */\nexport const browserToolActivityDescribers: readonly [\n string,\n (record: Record<string, unknown>, state: ToolActivityState) => ToolActivity,\n][] = [\n [HOST_TOOL_NAMES.BROWSER_NAVIGATE, describeBrowserNavigate],\n [HOST_TOOL_NAMES.BROWSER_ACT, describeBrowserAct],\n [\n // The goal is the only thing worth reading: the steps are in the result.\n HOST_TOOL_NAMES.BROWSER_AUTOPILOT,\n (record, state) => {\n const goal = toolInput.str(record.goal);\n return browserLabel(state, {\n failed: goal ? `Could not: ${goal}` : \"Could not drive the browser\",\n running: goal ? `Driving the browser: ${goal}` : \"Driving the browser\",\n done: goal ? `Drove the browser: ${goal}` : \"Drove the browser\",\n });\n },\n ],\n [\n HOST_TOOL_NAMES.BROWSER_SNAPSHOT,\n (_record, state) =>\n browserLabel(state, {\n failed: \"Could not read the page\",\n running: \"Reading the page\",\n done: \"Read the page\",\n }),\n ],\n [\n HOST_TOOL_NAMES.BROWSER_WAIT,\n (_record, state) =>\n browserLabel(state, {\n failed: \"Gave up waiting for the page\",\n running: \"Waiting for the page\",\n done: \"Waited for the page\",\n }),\n ],\n [\n HOST_TOOL_NAMES.BROWSER_INSPECT,\n (_record, state) =>\n browserLabel(state, {\n failed: \"Could not read the console and network\",\n running: \"Reading the console and network\",\n done: \"Read the console and network\",\n }),\n ],\n [\n HOST_TOOL_NAMES.BROWSER_SCREENSHOT,\n (record, state) => describeTakeScreenshot(record, state),\n ],\n [\n HOST_TOOL_NAMES.BROWSER_RECORD_START,\n (_record, state) =>\n browserLabel(state, {\n failed: \"Could not start recording\",\n running: \"Starting a recording\",\n done: \"Started recording the browser\",\n }),\n ],\n [\n HOST_TOOL_NAMES.BROWSER_RECORD_STOP,\n (_record, state) =>\n browserLabel(state, {\n failed: \"Could not finish the recording\",\n running: \"Finishing the recording\",\n done: \"Recorded the browser\",\n }),\n ],\n [\n HOST_TOOL_NAMES.BROWSER_CLOSE,\n (_record, state) =>\n browserLabel(state, {\n failed: \"Could not close the browser\",\n running: \"Closing the browser\",\n done: \"Closed the browser\",\n }),\n ],\n [\n HOST_TOOL_NAMES.BROWSER_SESSIONS_LIST,\n (_record, state) =>\n browserLabel(state, {\n failed: \"Could not read your captured logins\",\n running: \"Listing your captured logins\",\n done: \"Listed your captured logins\",\n }),\n ],\n [\n // The site, never what the vault holds for it.\n HOST_TOOL_NAMES.BROWSER_USE_SESSION,\n (record, state) => {\n const domain = toolInput.str(record.domain);\n return browserLabel(state, {\n failed: domain\n ? `Could not sign in to ${domain} as you`\n : \"Could not load a captured login\",\n running: domain\n ? `Signing in to ${domain} as you`\n : \"Loading a captured login\",\n done: domain\n ? `Signed in to ${domain} as you`\n : \"Loaded a captured login\",\n });\n },\n ],\n [\n HOST_TOOL_NAMES.BROWSER_FORGET_SESSION,\n (_record, state) =>\n browserLabel(state, {\n failed: \"Could not forget the captured logins\",\n running: \"Forgetting the captured logins\",\n done: \"Forgot the captured logins\",\n }),\n ],\n [\n HOST_TOOL_NAMES.REPL_EVAL,\n (_record, state) =>\n browserLabel(state, {\n failed: \"JavaScript in the REPL failed\",\n running: \"Running JavaScript in the REPL\",\n done: \"Ran JavaScript in the REPL\",\n }),\n ],\n [\n HOST_TOOL_NAMES.REPL_RESET,\n (_record, state) =>\n browserLabel(state, {\n failed: \"Could not reset the REPL\",\n running: \"Resetting the REPL\",\n done: \"Reset the REPL\",\n }),\n ],\n];\n","import { HOST_TOOL_NAMES } from \"../../turns/turn-constants\";\nimport { labelOnly } from \"../label-only\";\nimport type { ToolActivity } from \"../tool-activity\";\nimport type { ToolActivityState } from \"../tool-activity-state\";\nimport { toolInput } from \"../tool-input\";\n\n/** Design-mode tools (docs/agents/design-mode.md), kept out of the big\n * canonical map so it stays under the line cap. */\nexport const designToolActivityDescribers: readonly [\n string,\n (record: Record<string, unknown>, state: ToolActivityState) => ToolActivity,\n][] = [\n [\n HOST_TOOL_NAMES.PUBLISH_DESIGN,\n (record) => {\n const count = Array.isArray(record.directions)\n ? record.directions.length\n : 0;\n return labelOnly(\n count > 1\n ? `Published ${count} design directions`\n : \"Published a design\",\n );\n },\n ],\n [\n HOST_TOOL_NAMES.SET_LIVE_DESIGN,\n (record) => {\n const version = toolInput.trimmed(record.version);\n return labelOnly(\n version\n ? `Pointed the design link at v${version}`\n : \"Moved the design link\",\n );\n },\n ],\n];\n","import { HOST_TOOL_NAMES } from \"../../turns/turn-constants\";\nimport { labelOnly } from \"../label-only\";\nimport type { ToolActivity } from \"../tool-activity\";\nimport type { ToolActivityState } from \"../tool-activity-state\";\nimport { toolInput } from \"../tool-input\";\n\n/** The software-factory seats' tools, kept out of the big canonical map so it\n * stays under the line cap. */\nexport const factoryToolActivityDescribers: readonly [\n string,\n (record: Record<string, unknown>, state: ToolActivityState) => ToolActivity,\n][] = [\n [HOST_TOOL_NAMES.SUBMIT_SPECS, () => labelOnly(\"Submitted the specs\")],\n [HOST_TOOL_NAMES.SET_BRAND_KIT, () => labelOnly(\"Set the brand kit\")],\n [HOST_TOOL_NAMES.PLAN_TICKETS, () => labelOnly(\"Planned the tickets\")],\n [\n HOST_TOOL_NAMES.MARK_PROVISIONING_STEP,\n (record) => {\n const name = toolInput.trimmed(record.name);\n const status = toolInput.trimmed(record.status);\n return labelOnly(\n name && status\n ? `Marked provisioning step ${name} ${status}`\n : \"Reported a provisioning step\",\n );\n },\n ],\n [HOST_TOOL_NAMES.DECIDE_MERGE, () => labelOnly(\"Settled the ticket's PR\")],\n [HOST_TOOL_NAMES.DECIDE_QA, () => labelOnly(\"Settled the QA verdict\")],\n];\n","import { labelOnly } from \"../label-only\";\nimport { toolInput } from \"../tool-input\";\nimport type { ToolActivity } from \"../tool-activity\";\nimport type { ToolActivityState } from \"../tool-activity-state\";\n\nexport const integrationToolActivityDescribers: readonly [\n string,\n (record: Record<string, unknown>, state: ToolActivityState) => ToolActivity,\n][] = [\n [\n \"tool_search\",\n (record) => {\n const query = toolInput.str(record.query);\n return labelOnly(\n query\n ? `Searched integrations for \"${toolInput.truncate(query, 60)}\"`\n : \"Searched the connected integrations\",\n );\n },\n ],\n [\n \"tool_execute\",\n (record) => {\n const target = toolInput.str(record.tool);\n return labelOnly(\n target\n ? `Ran ${toolInput.truncate(target, 60)}`\n : \"Ran an integration tool\",\n );\n },\n ],\n];\n","import type { ToolActivity } from \"../tool-activity\";\nimport type { ToolActivityState } from \"../tool-activity-state\";\nimport { captureLabel } from \"./capture-label\";\n\nexport function describeAnnotateImage(\n record: Record<string, unknown>,\n state: ToolActivityState,\n): ToolActivity {\n return captureLabel(\n {\n optionFailed: \"Failed to annotate a silent image\",\n optionRunning: \"Annotating a silent image\",\n optionDone: \"Annotated a silent image\",\n failed: () => \"Failed to annotate an image\",\n running: () => \"Annotating an image\",\n done: () => \"Annotated an image\",\n },\n state,\n { isOption: record.silent === true, subject: null },\n );\n}\n","/** Index of the last character of the comment at `at`, or `at` if there is none. */\nexport function endOfComment(source: string, at: number): number {\n if (source[at] !== \"/\") return at;\n if (source[at + 1] === \"/\") {\n // line - 1: the newline ends the comment, it is not part of it.\n const line = source.indexOf(\"\\n\", at);\n return line === -1 ? source.length : line - 1;\n }\n if (source[at + 1] === \"*\") {\n const block = source.indexOf(\"*/\", at + 2);\n return block === -1 ? source.length : block + 1;\n }\n return at;\n}\n","/** Index of the quote closing the literal that opens at `open`, escapes honoured. */\nexport function endOfStringLiteral(source: string, open: number): number {\n const quote = source[open];\n for (let at = open + 1; at < source.length; at += 1) {\n if (source[at] === \"\\\\\") at += 1;\n else if (source[at] === quote) return at;\n }\n return source.length;\n}\n","import { endOfComment } from \"./end-of-comment\";\nimport { endOfStringLiteral } from \"./end-of-string-literal\";\n\n/**\n * Index of the last character of the string or comment at `at`, or `at` if\n * neither. Strings and comments only: a regex literal is not recognised.\n */\nexport function endOfSkippable(source: string, at: number): number {\n const char = source[at];\n if (char === \"'\" || char === '\"' || char === \"`\") {\n return endOfStringLiteral(source, at);\n }\n return endOfComment(source, at);\n}\n","import { endOfSkippable } from \"./end-of-skippable\";\n\n/** Index just past the `}` closing the object at `open`, or -1 if unbalanced. */\nexport function endOfObjectLiteral(source: string, open: number): number {\n let depth = 0;\n for (let at = open; at < source.length; at += 1) {\n const skipped = endOfSkippable(source, at);\n if (skipped !== at) {\n at = skipped;\n continue;\n }\n if (source[at] === \"{\") depth += 1;\n else if (source[at] === \"}\" && (depth -= 1) === 0) return at + 1;\n }\n return -1;\n}\n","import { endOfSkippable } from \"./end-of-skippable\";\n\n/** A spread in CODE position, at any depth: the parser cannot evaluate one. */\nexport function hasSpreadInCode(literal: string): boolean {\n for (let at = 0; at < literal.length; at += 1) {\n const skipped = endOfSkippable(literal, at);\n if (skipped !== at) {\n at = skipped;\n continue;\n }\n if (literal.startsWith(\"...\", at)) return true;\n }\n return false;\n}\n","import { endOfComment } from \"./end-of-comment\";\n\n/**\n * Index of the `{` opening the meta the script BEGINS with, or -1. Only\n * whitespace and comments may precede it: a declaration quoted further down is\n * text the engine never runs, and recording it is worse than refusing.\n */\nexport function metaDeclarationOpen(script: string): number {\n const anchor = /export[ \\t]+const[ \\t]+meta[ \\t]*=\\s*\\{/y;\n let at = 0;\n while (at < script.length) {\n if (/\\s/.test(script[at] ?? \"\")) {\n at += 1;\n continue;\n }\n const comment = endOfComment(script, at);\n if (comment !== at) {\n at = comment + 1;\n continue;\n }\n anchor.lastIndex = at;\n return anchor.test(script) ? script.indexOf(\"{\", at) : -1;\n }\n return -1;\n}\n","/** The VALUE of a quoted literal's body: `\\n` is a newline, not the letter n. */\nexport function unescapeStringLiteral(body: string): string {\n const single: Record<string, string> = {\n n: \"\\n\",\n t: \"\\t\",\n r: \"\\r\",\n b: \"\\b\",\n f: \"\\f\",\n v: \"\\v\",\n \"0\": \"\\0\",\n };\n return body.replace(\n /\\\\(u\\{([0-9a-fA-F]+)\\}|u([0-9a-fA-F]{4})|x([0-9a-fA-F]{2})|.)/gs,\n (_, escape: string, braced?: string, unicode?: string, hex?: string) => {\n const code = braced ?? unicode ?? hex;\n if (code === undefined) return single[escape] ?? escape;\n const point = Number.parseInt(code, 16);\n // Out of range is not decodable: keep the source text rather than throw\n // inside a transcript row that only wants a label.\n return point <= 0x10ffff ? String.fromCodePoint(point) : `\\\\${escape}`;\n },\n );\n}\n","import { endOfSkippable } from \"./end-of-skippable\";\nimport { endOfStringLiteral } from \"./end-of-string-literal\";\nimport { unescapeStringLiteral } from \"./unescape-string-literal\";\n\n/** The quoted value of `field:` starting at `at`, JSON-style keys included. */\nexport function quotedFieldAt(\n literal: string,\n at: number,\n field: string,\n): string | undefined {\n const key = /^(['\"])?/.exec(literal.slice(at));\n const quoted = key?.[1] ?? \"\";\n const start = at + quoted.length;\n if (!literal.startsWith(field, start)) return undefined;\n if (!quoted && /[A-Za-z0-9_$]/.test(literal[at - 1] ?? \"\")) return undefined;\n const after = literal.slice(start + field.length);\n const opener = new RegExp(`^${quoted}\\\\s*:\\\\s*['\"\\`]`).exec(after);\n if (!opener) return undefined;\n const quote = start + field.length + opener[0].length - 1;\n const close = endOfStringLiteral(literal, quote);\n // A literal that only OPENS the value (`'a' + b`, a template with a hole) is\n // not the value: the authoritative parser evaluates it, this cannot.\n let tail = close + 1;\n for (;;) {\n while (/\\s/.test(literal[tail] ?? \"\")) tail += 1;\n const skipped = endOfSkippable(literal, tail);\n if (skipped === tail) break;\n tail = skipped + 1;\n }\n if (literal[tail] !== \",\" && literal[tail] !== \"}\") return undefined;\n if (literal[quote] === \"`\" && /\\$\\{/.test(literal.slice(quote, close))) {\n return undefined;\n }\n // The VALUE, not its source text: the run row stores what JavaScript builds.\n return unescapeStringLiteral(literal.slice(quote + 1, close));\n}\n","import { endOfSkippable } from \"./end-of-skippable\";\nimport { quotedFieldAt } from \"./quoted-field-at\";\n\n/** A quoted `field:` at the object's OWN level, ignoring anything nested in it. */\nexport function topLevelStringField(\n literal: string,\n field: string,\n): string | undefined {\n let depth = 0;\n let found: string | undefined;\n for (let at = 0; at < literal.length; at += 1) {\n // Before skipping: a JSON-style key opens with the quote we would skip.\n if (depth === 1) {\n // Last wins, as it does when JavaScript builds the object.\n const value = quotedFieldAt(literal, at, field);\n if (value !== undefined) found = value;\n }\n const skipped = endOfSkippable(literal, at);\n if (skipped !== at) {\n at = skipped;\n continue;\n }\n const char = literal[at];\n if (char === \"{\" || char === \"[\") depth += 1;\n else if (char === \"}\" || char === \"]\") depth -= 1;\n }\n return found;\n}\n","import { endOfObjectLiteral } from \"./end-of-object-literal\";\nimport { hasSpreadInCode } from \"./has-spread-in-code\";\nimport { metaDeclarationOpen } from \"./meta-declaration-open\";\nimport { topLevelStringField } from \"./top-level-string-field\";\n\n/**\n * `meta.name` off a workflow script, or undefined when the parser would refuse\n * it: a row naming a run that does not exist is worse than an unnamed one.\n */\nexport function metaNameInScript(script: string): string | undefined {\n const open = metaDeclarationOpen(script);\n if (open === -1) return undefined;\n const end = endOfObjectLiteral(script, open);\n if (end === -1) return undefined;\n const literal = script.slice(open, end);\n if (hasSpreadInCode(literal)) return undefined;\n const name = topLevelStringField(literal, \"name\");\n // trim() is the parser's EMPTINESS test; the value it stores is untrimmed.\n return name?.trim() && topLevelStringField(literal, \"description\")?.trim()\n ? name.slice(0, 80)\n : undefined;\n}\n","import { metaNameInScript } from \"@repo/core/source-scan/meta-name-in-script\";\n\n/** The label's `meta.name`, read the way the parser anchors, bounds and picks it. */\nexport function workflowScriptName(script: string): string | undefined {\n return metaNameInScript(script);\n}\n","import { labelOnly } from \"../label-only\";\nimport type { ToolActivity } from \"../tool-activity\";\nimport { toolInput } from \"../tool-input\";\nimport { workflowScriptName } from \"./workflow-script-name\";\n\nexport function describeWorkflow(\n record: Record<string, unknown>,\n): ToolActivity {\n const name = workflowScriptName(toolInput.str(record.script) ?? \"\");\n return labelOnly(name ? `Ran workflow \"${name}\"` : \"Ran a workflow\");\n}\n","import type { ToolActivity } from \"../tool-activity\";\nimport { toolActivityBasename } from \"../tool-activity-basename\";\nimport { toolInput } from \"../tool-input\";\nimport type { ToolActivityState } from \"../tool-activity-state\";\nimport { captureLabel } from \"./capture-label\";\nimport { CAPTURE_LABEL_MAX } from \"./capture-label-constants\";\n\nexport function describeAttachImage(\n record: Record<string, unknown>,\n state: ToolActivityState,\n): ToolActivity {\n const file = toolActivityBasename(toolInput.str(record.path));\n return captureLabel(\n {\n optionFailed: \"Failed to attach a silent image\",\n optionRunning: \"Attaching a silent image\",\n optionDone: \"Attached a silent image\",\n failed: (subject) =>\n subject ? `Failed to attach ${subject}` : \"Failed to attach an image\",\n running: (subject) =>\n subject ? `Attaching ${subject}` : \"Attaching an image\",\n done: (subject) =>\n subject ? `Attached ${subject}` : \"Attached an image\",\n },\n state,\n {\n isOption: record.silent === true,\n subject: file ? toolInput.truncate(file, CAPTURE_LABEL_MAX) : null,\n },\n );\n}\n","import type { ToolActivity } from \"../tool-activity\";\nimport type { ToolActivityState } from \"../tool-activity-state\";\nimport { captureLabel } from \"./capture-label\";\n\nexport function describeGenerateImage(\n _record: Record<string, unknown>,\n state: ToolActivityState,\n): ToolActivity {\n return captureLabel(\n {\n optionFailed: \"Failed to generate an image\",\n optionRunning: \"Generating an image\",\n optionDone: \"Generated an image\",\n failed: () => \"Failed to generate an image\",\n running: () => \"Generating an image\",\n done: () => \"Generated an image\",\n },\n state,\n { isOption: false, subject: null },\n );\n}\n","import type { ToolActivity } from \"../tool-activity\";\nimport { toolInput } from \"../tool-input\";\nimport type { ToolActivityState } from \"../tool-activity-state\";\nimport { captureLabel } from \"./capture-label\";\nimport { captureTarget } from \"./capture-target\";\nimport { CAPTURE_LABEL_MAX } from \"./capture-label-constants\";\n\nexport function describeRecordVideo(\n record: Record<string, unknown>,\n state: ToolActivityState,\n): ToolActivity {\n const target = captureTarget(toolInput.str(record.url));\n return captureLabel(\n {\n // record_video has no option variant: a strip thumb is a still image.\n optionFailed: \"Failed to record a video\",\n optionRunning: \"Recording a video\",\n optionDone: \"Recorded a video\",\n failed: (subject) =>\n subject\n ? `Failed to record a video of ${subject}`\n : \"Failed to record a video\",\n running: (subject) =>\n subject ? `Recording a video of ${subject}` : \"Recording a video\",\n done: (subject) =>\n subject ? `Recorded a video of ${subject}` : \"Recorded a video\",\n },\n state,\n {\n isOption: false,\n subject: target ? toolInput.truncate(target, CAPTURE_LABEL_MAX) : null,\n },\n );\n}\n","import { labelOnly } from \"../label-only\";\nimport type { ToolActivity } from \"../tool-activity\";\nimport { toolInput } from \"../tool-input\";\n\nexport function describeMemorySearch(\n record: Record<string, unknown>,\n): ToolActivity {\n const query = toolInput.str(record.query);\n return labelOnly(\n query\n ? `Searched its memory: ${toolInput.truncate(query, 60)}`\n : \"Searched its memory\",\n );\n}\n","import { labelOnly } from \"../label-only\";\nimport type { ToolActivity } from \"../tool-activity\";\nimport { toolInput } from \"../tool-input\";\n\nexport function describeReportDevServer(\n record: Record<string, unknown>,\n): ToolActivity {\n const status = toolInput.str(record.status);\n const port = toolInput.str(record.port) ?? String(record.port ?? \"\");\n if (status && port) {\n return labelOnly(`Reported the dev server ${status} on port ${port}`);\n }\n if (status) {\n return labelOnly(`Reported the dev server ${status}`);\n }\n return labelOnly(\"Reported the dev server\");\n}\n","import { labelOnly } from \"../label-only\";\nimport type { ToolActivity } from \"../tool-activity\";\n\nexport function describeRequestEnvVars(\n record: Record<string, unknown>,\n): ToolActivity {\n const asked = Array.isArray(record.variables)\n ? record.variables.length\n : null;\n return labelOnly(\n asked\n ? `Requested ${asked} environment variable${asked === 1 ? \"\" : \"s\"}`\n : \"Requested environment variables\",\n );\n}\n","import { labelOnly } from \"../label-only\";\nimport type { ToolActivity } from \"../tool-activity\";\nimport { toolActivityBasename } from \"../tool-activity-basename\";\nimport { toolInput } from \"../tool-input\";\nimport type { ToolActivityState } from \"../tool-activity-state\";\n\nexport function describeAttachFile(\n record: Record<string, unknown>,\n state: ToolActivityState,\n): ToolActivity {\n const file = toolActivityBasename(toolInput.str(record.path));\n const subject = file ?? \"a file\";\n if (state.hasFailed) {\n return labelOnly(`Failed to deliver ${subject}`);\n }\n return labelOnly(\n state.isRunning ? `Delivering ${subject}` : `Delivered ${subject}`,\n );\n}\n","export const AGENT_TASK_UPDATE_ACTIONS = {\n BLOCK: \"block\",\n COMPLETE: \"complete\",\n FAIL: \"fail\",\n HEARTBEAT: \"heartbeat\",\n PROGRESS: \"progress\",\n RELEASE: \"release\",\n} as const;\n\nexport const OPEN_AGENT_TASK_UPDATE_ACTIONS: readonly AgentTaskUpdateAction[] =\n [\n AGENT_TASK_UPDATE_ACTIONS.HEARTBEAT,\n AGENT_TASK_UPDATE_ACTIONS.PROGRESS,\n AGENT_TASK_UPDATE_ACTIONS.RELEASE,\n ];\n\nexport type AgentTaskUpdateAction =\n (typeof AGENT_TASK_UPDATE_ACTIONS)[keyof typeof AGENT_TASK_UPDATE_ACTIONS];\n\nexport const AGENT_TASK_EVIDENCE_TYPES = [\n \"artifact\",\n \"commit\",\n \"file\",\n \"test\",\n \"url\",\n] as const;\n","import {\n AGENT_TASK_UPDATE_ACTIONS,\n type AgentTaskUpdateAction,\n} from \"../../teams/agent-task-update-constants\";\n\n// A Map, not an object: an action named after an Object member would otherwise\n// read the prototype's value. `satisfies` fails the build on a new action.\nexport const updateTaskLabels: ReadonlyMap<string, string> = new Map(\n Object.entries({\n [AGENT_TASK_UPDATE_ACTIONS.BLOCK]: \"Blocked a task\",\n [AGENT_TASK_UPDATE_ACTIONS.COMPLETE]: \"Completed a task\",\n [AGENT_TASK_UPDATE_ACTIONS.FAIL]: \"Marked a task failed\",\n [AGENT_TASK_UPDATE_ACTIONS.HEARTBEAT]: \"Kept a task alive\",\n [AGENT_TASK_UPDATE_ACTIONS.PROGRESS]: \"Reported progress on a task\",\n [AGENT_TASK_UPDATE_ACTIONS.RELEASE]: \"Released a blocked task\",\n } satisfies Record<AgentTaskUpdateAction, string>),\n);\n","import { labelOnly } from \"../label-only\";\nimport type { ToolActivity } from \"../tool-activity\";\nimport type { ToolActivityState } from \"../tool-activity-state\";\nimport { toolActivityBasename } from \"../tool-activity-basename\";\nimport { toolInput } from \"../tool-input\";\n\nexport function describeNativePatch(\n record: Record<string, unknown>,\n state: ToolActivityState,\n): ToolActivity {\n const path = toolActivityBasename(toolInput.str(record.path));\n const count = Array.isArray(record.changes) ? record.changes.length : 0;\n const target =\n path ?? (count > 0 ? `${count} file${count === 1 ? \"\" : \"s\"}` : \"files\");\n const verb = state.hasFailed\n ? \"Failed to edit\"\n : state.isRunning\n ? \"Editing\"\n : \"Edited\";\n return labelOnly(`${verb} ${target}`);\n}\n","import {\n HOST_TOOL_NAMES,\n WORKSPACE_TOOL_NAMES,\n} from \"../../turns/turn-constants\";\nimport { labelOnly } from \"../label-only\";\nimport type { ToolActivity } from \"../tool-activity\";\nimport { toolActivityBasename } from \"../tool-activity-basename\";\nimport { toolActivityHostname } from \"../tool-activity-hostname\";\nimport { toolInput } from \"../tool-input\";\nimport type { ToolActivityState } from \"../tool-activity-state\";\nimport { browserToolActivityDescribers } from \"../browser/browser-tool-activity-describers\";\nimport { designToolActivityDescribers } from \"../design/design-tool-activity-describers\";\nimport { factoryToolActivityDescribers } from \"../factory/factory-tool-activity-describers\";\nimport { integrationToolActivityDescribers } from \"./integration-tool-activity-describers\";\nimport { describeAnnotateImage } from \"../capture/describe-annotate-image\";\nimport { describeWorkflow } from \"./describe-workflow\";\nimport { describeAttachImage } from \"../capture/describe-attach-image\";\nimport { describeGenerateImage } from \"../capture/describe-generate-image\";\nimport { describeRecordVideo } from \"../capture/describe-record-video\";\nimport { describeTakeScreenshot } from \"../capture/describe-take-screenshot\";\nimport { describeMemorySearch } from \"./describe-memory-search\";\nimport { describeReportDevServer } from \"./describe-report-dev-server\";\nimport { describeRequestEnvVars } from \"./describe-request-env-vars\";\nimport { describeAttachFile } from \"../deliverable/describe-attach-file\";\nimport { updateTaskLabels } from \"./update-task-labels\";\nimport { describeNativePatch } from \"./describe-native-patch\";\n\nexport const canonicalToolActivityDescribers: ReadonlyMap<\n string,\n (record: Record<string, unknown>, state: ToolActivityState) => ToolActivity\n> = new Map([\n [\"apply_patch\", describeNativePatch],\n [HOST_TOOL_NAMES.ADVISE, () => labelOnly(\"Advised the watched session\")],\n [\n \"read\",\n (record) =>\n labelOnly(\n `Read ${toolActivityBasename(toolInput.str(record.file_path) ?? toolInput.str(record.path)) ?? \"a file\"}`,\n ),\n ],\n [\n \"write\",\n (record) =>\n labelOnly(\n `Wrote ${toolActivityBasename(toolInput.str(record.file_path) ?? toolInput.str(record.path)) ?? \"a file\"}`,\n ),\n ],\n [\n \"edit\",\n (record) =>\n labelOnly(\n `Edited ${toolActivityBasename(toolInput.str(record.file_path) ?? toolInput.str(record.path)) ?? \"a file\"}`,\n ),\n ],\n [\n \"bash\",\n (record) => {\n // Native harnesses may omit either the intent or the command.\n const command =\n toolInput.verbatim(record.command) ?? toolInput.verbatim(record.cmd);\n const intent = toolInput.trimmed(record.description);\n if (!command && !intent) {\n return labelOnly(\"Ran a command\");\n }\n return { text: intent, command };\n },\n ],\n [\n WORKSPACE_TOOL_NAMES.TASK_OUTPUT,\n () => labelOnly(\"Read a background command's output\"),\n ],\n [\n WORKSPACE_TOOL_NAMES.TASK_STOP,\n () => labelOnly(\"Stopped a background command\"),\n ],\n [\n \"grep\",\n (record) => {\n const pattern =\n toolInput.str(record.pattern) ?? toolInput.str(record.query);\n return labelOnly(\n pattern ? `Searched \"${toolInput.truncate(pattern, 60)}\"` : \"Searched\",\n );\n },\n ],\n [\n \"glob\",\n (record) => {\n const pattern =\n toolInput.str(record.pattern) ?? toolInput.str(record.glob);\n return labelOnly(\n pattern\n ? `Matched ${toolInput.truncate(pattern, 60)}`\n : \"Matched files\",\n );\n },\n ],\n [\n \"ls\",\n (record) => {\n const path = toolInput.str(record.path) ?? toolInput.str(record.dir);\n return labelOnly(path ? `Listed ${path}` : \"Listed a directory\");\n },\n ],\n [\n \"webfetch\",\n (record) => {\n const host = toolActivityHostname(toolInput.str(record.url));\n return labelOnly(host ? `Fetched ${host}` : \"Fetched a page\");\n },\n ],\n [\n \"websearch\",\n (record) => {\n const query = toolInput.str(record.query) ?? toolInput.str(record.q);\n return labelOnly(\n query\n ? `Searched the web for \"${toolInput.truncate(query, 60)}\"`\n : \"Searched the web\",\n );\n },\n ],\n [\"task\", () => labelOnly(\"Ran a subagent\")],\n [\n HOST_TOOL_NAMES.SET_STEPS,\n (record) => {\n const steps = Array.isArray(record.steps) ? record.steps.length : null;\n return labelOnly(\n steps\n ? `Planned ${steps} step${steps === 1 ? \"\" : \"s\"}`\n : \"Planned the work\",\n );\n },\n ],\n [\n HOST_TOOL_NAMES.SET_TODOS,\n (record) => {\n const step = toolInput.trimmed(record.step);\n return labelOnly(step ? `Updated the plan: ${step}` : \"Updated the plan\");\n },\n ],\n [\n HOST_TOOL_NAMES.SAVE_DEV_ENV_MANIFEST,\n () => labelOnly(\"Saved the dev environment manifest\"),\n ],\n [\n HOST_TOOL_NAMES.REQUEST_DEV_ENV_CREDENTIALS,\n (record) => {\n const asked = Array.isArray(record.credentials)\n ? record.credentials.length\n : null;\n return labelOnly(\n asked\n ? `Requested ${asked} credential${asked === 1 ? \"\" : \"s\"}`\n : \"Requested credentials\",\n );\n },\n ],\n [HOST_TOOL_NAMES.REQUEST_ENV_VARS, describeRequestEnvVars],\n [\n HOST_TOOL_NAMES.GENERATE_DEV_ENV_SECRET,\n (record) =>\n labelOnly(\n typeof record.name === \"string\"\n ? `Generated ${record.name}`\n : \"Generated a dev environment secret\",\n ),\n ],\n [\n HOST_TOOL_NAMES.SET_DEV_ENV_SIZING,\n () => labelOnly(\"Recorded the dev environment sizing\"),\n ],\n [HOST_TOOL_NAMES.BAKE_DEV_ENV, () => labelOnly(\"Baked the dev environment\")],\n [\n HOST_TOOL_NAMES.DETECT_PROJECT_DATABASE,\n () => labelOnly(\"Recorded the project database\"),\n ],\n [\n HOST_TOOL_NAMES.BIND_PROJECT_DATABASE,\n () => labelOnly(\"Requested approval to bind the project database\"),\n ],\n [\n HOST_TOOL_NAMES.DATABASE_QUERY,\n (record) => {\n const branch = toolInput.trimmed(record.branch) ?? \"production\";\n const sql = toolInput.verbatim(record.sql);\n return sql\n ? { text: `Read the database (${branch})`, command: sql }\n : labelOnly(`Read the database (${branch})`);\n },\n ],\n [\n HOST_TOOL_NAMES.DATABASE_WRITE,\n (record) => {\n const branch = toolInput.trimmed(record.branch) ?? \"production\";\n const sql = toolInput.verbatim(record.sql);\n return sql\n ? {\n text: `Requested approval to write to the database (${branch})`,\n command: sql,\n }\n : labelOnly(`Requested approval to write to the database (${branch})`);\n },\n ],\n [HOST_TOOL_NAMES.TAKE_SCREENSHOT, describeTakeScreenshot],\n [HOST_TOOL_NAMES.RECORD_VIDEO, describeRecordVideo],\n [HOST_TOOL_NAMES.ATTACH_IMAGE, describeAttachImage],\n [HOST_TOOL_NAMES.ATTACH_FILE, describeAttachFile],\n [\n HOST_TOOL_NAMES.GET_IMAGE_GENERATORS,\n () => labelOnly(\"Listed the image models\"),\n ],\n [\n HOST_TOOL_NAMES.ASK_USER,\n (record) => {\n const asked = Array.isArray(record.questions)\n ? record.questions.length\n : null;\n return labelOnly(\n asked\n ? `Asked ${asked} question${asked === 1 ? \"\" : \"s\"}`\n : \"Asked a question\",\n );\n },\n ],\n [\n HOST_TOOL_NAMES.PROPOSE_PLAN,\n (record) => {\n const title = toolInput.trimmed(record.title);\n return labelOnly(\n title\n ? `Proposed a plan: ${toolInput.truncate(title, 60)}`\n : \"Proposed a plan\",\n );\n },\n ],\n [\n HOST_TOOL_NAMES.REQUEST_GUARDRAIL_APPROVAL,\n () => labelOnly(\"Asked for an approval\"),\n ],\n [\n HOST_TOOL_NAMES.REPORT_CONFIDENCE,\n () => labelOnly(\"Reported its confidence\"),\n ],\n [\n HOST_TOOL_NAMES.REPORT_HARNESS_ISSUE,\n (record) => {\n const title = toolInput.trimmed(record.title);\n return labelOnly(\n title\n ? `Reported a harness issue: ${toolInput.truncate(title, 60)}`\n : \"Reported a harness issue\",\n );\n },\n ],\n [HOST_TOOL_NAMES.MEMORY_SEARCH, describeMemorySearch],\n [HOST_TOOL_NAMES.REPORT_DEV_SERVER, describeReportDevServer],\n [HOST_TOOL_NAMES.MEMORY_WRITE, () => labelOnly(\"Wrote to its memory\")],\n [\n HOST_TOOL_NAMES.READ_SESSION,\n (record) => {\n const goal = toolInput.str(record.goal);\n return labelOnly(\n goal\n ? `Read another chat: ${toolInput.truncate(goal, 60)}`\n : \"Read another chat\",\n );\n },\n ],\n [\n HOST_TOOL_NAMES.PROJECT_CONTEXT_READ,\n () => labelOnly(\"Read the project's shared context\"),\n ],\n [\n HOST_TOOL_NAMES.PROJECT_CONTEXT_WRITE,\n (record) => {\n const title = toolInput.verbatim(record.title);\n return title\n ? labelOnly(\n `Wrote to the project context: ${toolInput.truncate(title, 60)}`,\n )\n : labelOnly(\"Wrote to the project context\");\n },\n ],\n [\n HOST_TOOL_NAMES.RUN_VALIDATION,\n (record) => {\n const command = toolInput.verbatim(record.command);\n return command\n ? { text: \"Ran a validation command\", command }\n : labelOnly(\"Ran a validation command\");\n },\n ],\n [\n HOST_TOOL_NAMES.CREATE_TASK,\n (record) => {\n const title = toolInput.trimmed(record.title);\n return labelOnly(\n title\n ? `Created task \"${toolInput.truncate(title, 60)}\"`\n : \"Created a team task\",\n );\n },\n ],\n [HOST_TOOL_NAMES.LIST_TASKS, () => labelOnly(\"Listed the team tasks\")],\n [HOST_TOOL_NAMES.WORKFLOW, describeWorkflow],\n [HOST_TOOL_NAMES.PICKUP_TASK, () => labelOnly(\"Picked up a team task\")],\n [\n HOST_TOOL_NAMES.UPDATE_TASK,\n (record) => {\n const action = toolInput.str(record.action);\n return labelOnly(\n (action ? updateTaskLabels.get(action) : null) ?? \"Updated a team task\",\n );\n },\n ],\n [\n HOST_TOOL_NAMES.DELIVERABLE_PUBLISH,\n () => labelOnly(\"Published a deliverable\"),\n ],\n [\n HOST_TOOL_NAMES.RENAME_SESSION,\n (record) => {\n const title = toolInput.trimmed(record.title);\n return labelOnly(\n title\n ? `Renamed the chat \"${toolInput.truncate(title, 60)}\"`\n : \"Renamed the chat\",\n );\n },\n ],\n [HOST_TOOL_NAMES.GENERATE_IMAGE, describeGenerateImage],\n [HOST_TOOL_NAMES.ANNOTATE_IMAGE, describeAnnotateImage],\n ...integrationToolActivityDescribers,\n ...browserToolActivityDescribers,\n ...designToolActivityDescribers,\n ...factoryToolActivityDescribers,\n]);\n","import { HOST_TOOL_NAMES } from \"../../turns/turn-constants\";\n\nexport const SOFT_FAIL_BROWSER_TOOLS = new Set<string>([\n HOST_TOOL_NAMES.BROWSER_NAVIGATE,\n HOST_TOOL_NAMES.BROWSER_SNAPSHOT,\n HOST_TOOL_NAMES.BROWSER_ACT,\n HOST_TOOL_NAMES.BROWSER_AUTOPILOT,\n HOST_TOOL_NAMES.BROWSER_WAIT,\n HOST_TOOL_NAMES.BROWSER_INSPECT,\n HOST_TOOL_NAMES.BROWSER_SCREENSHOT,\n HOST_TOOL_NAMES.BROWSER_RECORD_START,\n HOST_TOOL_NAMES.BROWSER_RECORD_STOP,\n HOST_TOOL_NAMES.BROWSER_CLOSE,\n HOST_TOOL_NAMES.REPL_EVAL,\n HOST_TOOL_NAMES.REPL_RESET,\n]);\n","import { SOFT_FAIL_BROWSER_TOOLS } from \"./soft-fail-browser-tools-constants\";\n\n/** Anchored at the START: a snapshot of a page reading \"login failed\" is a\n * successful read, and a loose match would paint it as an error. */\nexport function softFailedBrowser(toolName: string, output: unknown): boolean {\n return (\n SOFT_FAIL_BROWSER_TOOLS.has(toolName) &&\n typeof output === \"string\" &&\n /^(?:browser|repl)_[a-z_]+ failed:/.test(output.trimStart())\n );\n}\n","import { HOST_TOOL_NAMES } from \"../../turns/turn-constants\";\n\nexport const SOFT_FAIL_CAPTURE_TOOLS = new Set<string>([\n HOST_TOOL_NAMES.TAKE_SCREENSHOT,\n HOST_TOOL_NAMES.RECORD_VIDEO,\n HOST_TOOL_NAMES.ATTACH_IMAGE,\n HOST_TOOL_NAMES.ATTACH_FILE,\n HOST_TOOL_NAMES.GENERATE_IMAGE,\n HOST_TOOL_NAMES.ANNOTATE_IMAGE,\n]);\n","import { SOFT_FAIL_CAPTURE_TOOLS } from \"./soft-fail-capture-tools-constants\";\n/**\n * Capture tools report failure as prose on a `completed` call, always opening\n * with their own name. Anchored there: a delivered `failed.txt` is a success.\n */\nexport function softFailedCapture(toolName: string, output: unknown): boolean {\n if (!SOFT_FAIL_CAPTURE_TOOLS.has(toolName) || typeof output !== \"string\") {\n return false;\n }\n return output.trimStart().startsWith(`${toolName} failed`);\n}\n","import type { DescribeToolActivityOptions } from \"./describe-tool-activity-options\";\nimport type { ToolActivityState } from \"./tool-activity-state\";\nimport { softFailedBrowser } from \"./browser/soft-failed-browser\";\nimport { softFailedCapture } from \"./capture/soft-failed-capture\";\n/**\n * A running call is labelled in the progressive tense; a failed one says so.\n * Capture tools report their failures as prose on a `completed` call, so the\n * output is read too rather than trusting the status alone.\n */\nexport function toolActivityStateFor(\n toolName: string,\n options: DescribeToolActivityOptions | undefined,\n): ToolActivityState {\n const isRunning = options?.status === \"running\";\n return {\n isRunning,\n hasFailed:\n options?.status === \"failed\" ||\n (!isRunning &&\n (softFailedCapture(toolName, options?.output) ||\n softFailedBrowser(toolName, options?.output))),\n };\n}\n","// Most specific first: adapters disagree on which key carries the slug.\nexport const SKILL_NAME_KEYS = [\n \"skill\",\n \"skill_name\",\n \"skillName\",\n \"name\",\n \"command\",\n];\n\nexport const SKILL_FILE = \"skill.md\";\n","import { toolInput } from \"../tool-input\";\nimport { SKILL_NAME_KEYS } from \"./skill-call-constants\";\n\n/** The skill slug a loader call targets, or null when the input is unreadable. */\nexport function skillNameFromInput(input: unknown): string | null {\n if (!toolInput.isRecord(input)) {\n return null;\n }\n for (const key of SKILL_NAME_KEYS) {\n const value = input[key];\n if (typeof value === \"string\" && value.trim().length > 0) {\n // `command` may arrive as \"dataviz some args\": the slug is its head.\n // A plugin-namespaced `plugin:skill` stays whole.\n return value.trim().split(/\\s+/u)[0] ?? null;\n }\n }\n return null;\n}\n","import { toolInput } from \"../tool-input\";\n\nexport function stringField(input: unknown, key: string): string | null {\n return toolInput.isRecord(input) ? toolInput.trimmed(input[key]) : null;\n}\n","import { HOST_TOOL_NAMES } from \"../../turns/turn-constants\";\nimport type { SkillCall } from \"../skill/skill-call\";\nimport { skillNameFromInput } from \"./skill-name-from-input\";\nimport { stringField } from \"./string-field\";\n\n// Keyed by the platform's own constants: a renamed host tool must break the\n// build here, not silently fall back to a raw monospace row.\nexport const registryCalls: Record<string, (input: unknown) => SkillCall> = {\n [HOST_TOOL_NAMES.SKILL_SEARCH]: (input) => ({\n kind: \"search\",\n query: stringField(input, \"query\"),\n }),\n [HOST_TOOL_NAMES.SKILL_LOAD]: (input) => ({\n kind: \"load\",\n name: skillNameFromInput(input),\n via: \"tool\",\n }),\n [HOST_TOOL_NAMES.SAVE_SKILL]: (input) => ({\n kind: \"save\",\n name: stringField(input, \"name\"),\n }),\n [HOST_TOOL_NAMES.PROPOSE_SKILL_EDIT]: (input) => ({\n kind: \"edit\",\n name: stringField(input, \"name\"),\n }),\n [HOST_TOOL_NAMES.RECORD_REVIEW_LESSON]: (input) => ({\n kind: \"lesson\",\n scope: stringField(input, \"scope\"),\n }),\n};\n","import { toolActivityStateFor } from \"@repo/agents/tool-activity\";\n\nimport { out } from \"../output/out\";\nimport type { TranscriptEvent } from \"@/lib/event/transcript-event\";\n\n/** Some tools report failure as prose on a completed call: the state knows. */\nexport function formatToolPart(\n part: Extract<TranscriptEvent[\"part\"], { kind: \"tool\" }>,\n): string {\n const { hasFailed } = toolActivityStateFor(part.toolName, {\n status: part.status,\n output: part.output,\n });\n const status = hasFailed ? \"failed\" : part.status;\n return `${out.paint(\"tool\", \"dim\")} ${out.cell(part.toolName)} ${out.paint(`(${status})`, \"dim\")}`;\n}\n","import { out } from \"../output/out\";\nimport { formatAdvisorPart } from \"@/lib/event/format-advisor-part\";\nimport { formatDeliverablePart } from \"@/lib/event/format-deliverable-part\";\nimport { formatToolPart } from \"@/lib/event/format-tool-part\";\nimport type { TranscriptEvent } from \"@/lib/event/transcript-event\";\nimport { truncate } from \"@/lib/truncate/truncate\";\n\n/**\n * One transcript event as one readable block.\n *\n * The transcript is the only honest account of what the agent did, so the\n * shapes that matter to a reviewer — tool calls, file changes, questions,\n * guardrails, errors — each keep a distinct marker instead of collapsing into\n * prose.\n */\nexport function formatEvent(\n event: TranscriptEvent,\n baseUrl: string,\n): string | null {\n const part = event.part;\n\n switch (part.kind) {\n case \"text\":\n if (part.authorUserId) {\n return `${out.paint(\"you\", \"magenta\")} ${truncate(part.text)}`;\n }\n // Text with no author but a source was injected by the platform (an\n // integration trigger, an inbox event): the transcript contract says it\n // must never be attributed to the model.\n if (part.source) {\n return out.paint(`system ${truncate(part.text, 400)}`, \"dim\");\n }\n return `${out.paint(\"agent\", \"blue\")} ${truncate(part.text)}`;\n case \"reasoning\":\n return out.paint(`think ${truncate(part.text, 400)}`, \"dim\");\n case \"tool\":\n return formatToolPart(part);\n case \"file_change\":\n return `${out.paint(\"file\", \"dim\")} ${part.changeType.padEnd(8)} ${out.cell(part.path)}`;\n case \"question\":\n return out.paint(\n `ask question round ${part.questionBatchId} — answer with \\`hepha questions answer ${part.questionBatchId}\\``,\n \"yellow\",\n );\n // No CLI verb decides a plan: the accept/refuse pair lives in the app.\n case \"plan\":\n return out.paint(\n `plan plan ${part.planProposalId} awaits accept/refuse in the app`,\n \"yellow\",\n );\n case \"approval\":\n return out.paint(\n `gate guardrail ${part.guardrailRequestId} needs a human — \\`hepha approvals show ${part.guardrailRequestId}\\``,\n \"yellow\",\n );\n case \"media\": {\n // The signed URL is why this part exists: a screenshot or a recording is\n // the session's proof, and a reader who cannot open it has nothing.\n const target = part.url ?? part.pathname;\n return `${out.paint(\"media\", \"dim\")} ${part.mediaType}${part.caption ? ` — ${out.cell(part.caption)}` : \"\"}${target ? `\\n ${out.cell(target)}` : \"\"}`;\n }\n case \"advisor\":\n return formatAdvisorPart(part);\n case \"deliverable\":\n return formatDeliverablePart(part, event.sessionId, baseUrl);\n case \"error\":\n return out.paint(`error ${truncate(part.message)}`, \"red\");\n case \"external_event\":\n return `${out.paint(\"event\", \"dim\")} ${out.cell(part.title)}${part.conclusion ? ` — ${out.cell(part.conclusion)}` : \"\"}`;\n case \"system\":\n return out.paint(`system ${truncate(part.text, 300)}`, \"dim\");\n // The session's opening row: with the fenced prompt hidden, this is the\n // only place a CLI reader sees what the run was asked to do.\n case \"source_context\":\n return `${out.paint(\"source\", \"dim\")} ${out.cell(\n [part.reference, part.title].filter(Boolean).join(\" \"),\n )}${part.url ? ` — ${out.cell(part.url)}` : \"\"}${\n part.body ? `\\n ${truncate(part.body, 400)}` : \"\"\n }`;\n case \"verification\":\n return `${out.paint(\"check\", \"dim\")} ${out.cell(part.name)} ${out.paint(`(${part.status})`, \"dim\")}`;\n default:\n return null;\n }\n}\n","import { formatEvent } from \"@/lib/event/format-event\";\nimport { out } from \"@/lib/output/out\";\nimport type { ApiOutputs } from \"@/lib/api/api-outputs\";\n\nexport function consumeSessionEvents(\n events: ApiOutputs[\"sessions\"][\"events\"][\"items\"],\n cursor: number,\n quiet: boolean | undefined,\n baseUrl: string,\n): number {\n for (const event of events) {\n cursor = Math.max(cursor, event.sequence);\n if (quiet) {\n continue;\n }\n const line = formatEvent(event, baseUrl);\n if (line) {\n out.line(line);\n }\n }\n return cursor;\n}\n","export function sleep(seconds: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, seconds * 1000));\n}\n","// setTimeout stores its delay in a signed 32-bit int and fires AT ONCE past it.\nexport const MAX_TIMER_MS = 2_147_483_647;\n","import { MAX_TIMER_MS } from \"./sleep-constants\";\n\n/** A wait a timer can actually hold: longer means \"as long as it can\". */\nexport function timerDelayMs(seconds: number): number {\n return Math.min(Math.max(0, seconds) * 1_000, MAX_TIMER_MS);\n}\n","import { CliError } from \"@/lib/cli/cli-error\";\nimport { CLI_ERROR_CODES } from \"@/lib/shared/errors-constants\";\nimport { timerDelayMs } from \"./timer-delay-ms\";\n\nexport function interruptibleSleep(seconds: number): Promise<void> {\n return new Promise((resolve, reject) => {\n const onInterrupt = () => {\n clearTimeout(timer);\n reject(\n new CliError(\"Follow interrupted.\", 130, {\n code: CLI_ERROR_CODES.INTERRUPTED,\n }),\n );\n };\n const timer = setTimeout(() => {\n process.removeListener(\"SIGINT\", onInterrupt);\n resolve();\n }, timerDelayMs(seconds));\n process.once(\"SIGINT\", onInterrupt);\n });\n}\n","import { api } from \"@/lib/api/api\";\nimport { out } from \"@/lib/output/out\";\nimport { sleep } from \"@/lib/sleep/sleep\";\nimport { interruptibleSleep } from \"@/lib/sleep/interruptible-sleep\";\nimport type { FollowSessionDependencies } from \"./follow-session-dependencies\";\n\nexport const defaultFollowSessionDependencies: FollowSessionDependencies = {\n request: api,\n pollSleep: sleep,\n retrySleep: interruptibleSleep,\n random: Math.random,\n // Monotonic: an NTP step backwards must not hand the outage budget more time\n // to burn, nor mute the periodic reminder until the clock catches up.\n now: () => performance.now(),\n warn: (message) => out.warn(message),\n};\n","export function followOutageMessage(warned: boolean): string {\n return warned\n ? \"Hepha API still unavailable; retrying follow.\"\n : \"Hepha API unavailable; retrying follow.\";\n}\n","export const FOLLOW_RETRY_CAP_SECONDS = 22.5;\nexport const FOLLOW_OUTAGE_FEEDBACK_MS = 5 * 60 * 1_000;\n// The platform's own transient class, kept identical: see TRANSIENT_STATUS in\n// packages/tasks/src/lib/failure/classify/classify-harness-failure-constants.ts.\nexport const RETRYABLE_FOLLOW_STATUS = new Set([\n 408, 425, 429, 500, 502, 503, 504,\n]);\n","import { CliError } from \"@/lib/cli/cli-error\";\nimport { FOLLOW_RETRY_CAP_SECONDS } from \"./follow-retry-constants\";\n\nexport function followRetryDelay(\n error: CliError,\n failures: number,\n random: () => number,\n): number {\n const exponential = Math.min(\n FOLLOW_RETRY_CAP_SECONDS,\n 2 ** Math.min(failures - 1, 30),\n );\n const jittered = exponential / 2 + random() * (exponential / 2);\n // Retry-After is the server telling us when it will be ready: honoured whole,\n // and merely spread on top so followers do not wake as one.\n const retryAfter = Math.max(0, error.details.retryAfterSeconds ?? 0);\n return Math.max(jittered, retryAfter + random() * (exponential / 2));\n}\n","/** Infinity when no budget was set: the follow then waits any outage out. */\nexport function remainingOutageSeconds(\n outageStartedAt: number,\n now: number,\n maxOutageMs: number | null,\n): number {\n if (maxOutageMs === null) {\n return Number.POSITIVE_INFINITY;\n }\n return (maxOutageMs - (now - outageStartedAt)) / 1_000;\n}\n","import { CliError } from \"@/lib/cli/cli-error\";\nimport { CLI_ERROR_CODES } from \"@/lib/shared/errors-constants\";\nimport { RETRYABLE_FOLLOW_STATUS } from \"./follow-retry-constants\";\n\nexport function retryableFollowError(error: unknown): error is CliError {\n return (\n error instanceof CliError &&\n (RETRYABLE_FOLLOW_STATUS.has(error.details.status ?? 0) ||\n error.details.code === CLI_ERROR_CODES.NETWORK ||\n error.details.code === CLI_ERROR_CODES.TIMEOUT)\n );\n}\n","import { FOLLOW_OUTAGE_FEEDBACK_MS } from \"./follow-retry-constants\";\n\nexport function shouldReportFollowOutage(\n lastWarnedAt: number | null,\n now: number,\n): boolean {\n return (\n lastWarnedAt === null || now - lastWarnedAt >= FOLLOW_OUTAGE_FEEDBACK_MS\n );\n}\n","import { nextPollDelay } from \"@/lib/retry/next-poll-delay\";\nimport type { FollowSessionDependencies } from \"../follow-session-dependencies\";\nimport { followOutageMessage } from \"./follow-outage-message\";\nimport { followRetryDelay } from \"./follow-retry-delay\";\nimport type { FollowRetryState } from \"./follow-retry-state\";\nimport { remainingOutageSeconds } from \"./remaining-outage-seconds\";\nimport { retryableFollowError } from \"./retryable-follow-error\";\nimport { shouldReportFollowOutage } from \"./should-report-follow-outage\";\n\n/** Wait out one failure, or rethrow the ones a follow cannot sit through. */\nexport async function waitForFollowRetry(params: {\n error: unknown;\n retry: FollowRetryState;\n maxOutageMs: number | null;\n dependencies: FollowSessionDependencies;\n}): Promise<void> {\n const { error, retry, dependencies } = params;\n if (!retryableFollowError(error)) {\n throw error;\n }\n retry.failures += 1;\n const now = dependencies.now();\n retry.outageStartedAt ??= now;\n // Unbudgeted, a follow waits any outage out; budgeted, the sleep stops at the\n // deadline and the last failure reaches the caller as its exit code.\n const delay = nextPollDelay(\n followRetryDelay(error, retry.failures, dependencies.random),\n remainingOutageSeconds(retry.outageStartedAt, now, params.maxOutageMs),\n );\n if (delay === null) {\n throw error;\n }\n if (shouldReportFollowOutage(retry.lastWarnedAt, now)) {\n dependencies.warn(followOutageMessage(retry.warned));\n retry.warned = true;\n retry.lastWarnedAt = now;\n }\n await dependencies.retrySleep(delay);\n // Waking up on the deadline itself: fail with the real failure rather than\n // spend the caller's last millisecond on a request that cannot land.\n if (\n remainingOutageSeconds(\n retry.outageStartedAt,\n dependencies.now(),\n params.maxOutageMs,\n ) <= 0\n ) {\n throw error;\n }\n}\n","import type { FollowSessionDependencies } from \"../follow-session-dependencies\";\nimport type { FollowRetryState } from \"./follow-retry-state\";\nimport { waitForFollowRetry } from \"./wait-for-follow-retry\";\n\nexport async function requestWithFollowRetry<T>(params: {\n operation: () => Promise<T>;\n retry: FollowRetryState;\n maxOutageMs: number | null;\n dependencies: FollowSessionDependencies;\n}): Promise<T> {\n for (;;) {\n try {\n const result = await params.operation();\n if (params.retry.warned) {\n params.dependencies.warn(\"Hepha API recovered; continuing follow.\");\n }\n params.retry.failures = 0;\n params.retry.warned = false;\n params.retry.lastWarnedAt = null;\n params.retry.outageStartedAt = null;\n return result;\n } catch (error) {\n await waitForFollowRetry({\n error,\n retry: params.retry,\n maxOutageMs: params.maxOutageMs,\n dependencies: params.dependencies,\n });\n }\n }\n}\n","export const BLOCKED = new Set([\"waiting_human\", \"awaiting_approval\"]);\n","export const TERMINAL = new Set([\"completed\", \"failed\", \"killed\", \"abstained\"]);\n","import { BLOCKED } from \"@/lib/blocked/blocked-constants\";\nimport { TERMINAL } from \"@/lib/terminal/terminal-constants\";\n\n// Undefined is a deployment too old to report the status on an events page.\nexport function isFollowStopStatus(status: string | undefined): boolean {\n return status !== undefined && (TERMINAL.has(status) || BLOCKED.has(status));\n}\n","import { CliError } from \"@/lib/cli/cli-error\";\n\n/** Unset means forever: only a caller with no Ctrl-C needs an exit code. */\nexport function resolveFollowOutageBudget(): number | null {\n const raw = process.env.HEPHA_FOLLOW_MAX_OUTAGE_SECONDS?.trim();\n if (!raw) {\n return null;\n }\n // Checked in milliseconds: a finite 1e306 seconds overflows to an Infinity\n // budget, which would silently never expire.\n const budgetMs = Number(raw) * 1_000;\n if (!Number.isFinite(budgetMs) || budgetMs <= 0) {\n throw new CliError(\n `HEPHA_FOLLOW_MAX_OUTAGE_SECONDS expects a positive number of seconds, got \"${raw}\".`,\n 2,\n );\n }\n return budgetMs;\n}\n","import { resolveTimeout } from \"@/lib/timeout/resolve-timeout\";\nimport type { FollowRetryState } from \"./follow-retry-state\";\nimport { remainingOutageSeconds } from \"./remaining-outage-seconds\";\n\n/** A request may not outlive the outage budget it is being retried under. */\nexport function followRequestTimeoutMs(\n retry: FollowRetryState,\n maxOutageMs: number | null,\n now: number,\n): number {\n if (retry.outageStartedAt === null) {\n return resolveTimeout();\n }\n const remainingMs =\n remainingOutageSeconds(retry.outageStartedAt, now, maxOutageMs) * 1_000;\n return Math.max(1, Math.min(resolveTimeout(), remainingMs));\n}\n","import { config } from \"@/lib/shared/config\";\nimport { path } from \"../path/path\";\nimport { expectShape } from \"../expect/expect-shape\";\nimport { is } from \"../is/is\";\nimport { POLL_SECONDS, PAGE_SIZE } from \"@/lib/follow/follow-constants\";\nimport type { SessionDetail } from \"@/lib/session/session-detail\";\nimport { consumeSessionEvents } from \"@/lib/session/consume-session-events\";\nimport type { ApiOutputs } from \"@/lib/api/api-outputs\";\nimport type { FollowRetryState } from \"@/lib/session/retry/follow-retry-state\";\nimport type { FollowSessionDependencies } from \"@/lib/session/follow-session-dependencies\";\nimport { defaultFollowSessionDependencies } from \"@/lib/session/default-follow-session-dependencies\";\nimport { requestWithFollowRetry } from \"@/lib/session/retry/request-with-follow-retry\";\nimport { isFollowStopStatus } from \"@/lib/session/is-follow-stop-status\";\nimport { resolveFollowOutageBudget } from \"@/lib/session/retry/resolve-follow-outage-budget\";\nimport { followRequestTimeoutMs } from \"@/lib/session/retry/follow-request-timeout-ms\";\n\n/**\n * Follow a session until it finishes or needs a person.\n *\n * Stopping on `waiting_human` / `awaiting_approval` is the important part: the\n * agent parks there and burns nothing, so a follower that kept waiting would\n * hang forever. The caller turns that into a distinct exit code, which is what\n * lets an orchestrating agent branch on \"it asked me something\".\n */\nexport async function followSession(\n sessionId: string,\n options: { quiet?: boolean; after?: number } = {},\n dependencies: FollowSessionDependencies = defaultFollowSessionDependencies,\n): Promise<SessionDetail> {\n // Resuming a follow starts where the caller left off, so `--after` does not\n // replay (and reprint) the whole transcript.\n let cursor = options.after ?? 0;\n let emptyPolls = 0;\n const retry: FollowRetryState = {\n failures: 0,\n warned: false,\n lastWarnedAt: null,\n outageStartedAt: null,\n };\n const maxOutageMs = resolveFollowOutageBudget();\n // The transcript prints durable download links, which need the API origin.\n const { baseUrl } = config.load();\n\n for (;;) {\n const page = await requestWithFollowRetry({\n retry,\n maxOutageMs,\n dependencies,\n operation: async () =>\n expectShape<\n Omit<ApiOutputs[\"sessions\"][\"events\"], \"status\"> & { status?: string }\n >(\n await dependencies.request(path`/sessions/${sessionId}/events`, {\n query: { after: cursor || undefined, limit: PAGE_SIZE },\n timeoutMs: followRequestTimeoutMs(\n retry,\n maxOutageMs,\n dependencies.now(),\n ),\n }),\n \"GET /sessions/{id}/events\",\n {\n items: is.array,\n hasMore: (value) => typeof value === \"boolean\",\n nextCursor: (value) => value === null || is.number(value),\n // Optional: a deployment older than this binary omits it, and a\n // missing field here would be a non-retryable schema mismatch.\n status: is.optionalString,\n },\n ),\n });\n\n cursor = consumeSessionEvents(page.items, cursor, options.quiet, baseUrl);\n\n // Advance on the SERVER's cursor, not on what we could render. The API\n // paginates raw rows and drops the ones with no transcript representation,\n // so a page can come back empty with hasMore true — following the items\n // alone would re-request the same page forever, without even sleeping.\n if (page.nextCursor !== null) {\n cursor = Math.max(cursor, page.nextCursor);\n }\n\n if (page.hasMore) {\n continue;\n }\n\n emptyPolls = page.items.length === 0 ? emptyPolls + 1 : 0;\n if (\n isFollowStopStatus(page.status) ||\n page.items.length > 0 ||\n emptyPolls >= 3\n ) {\n const session = await requestWithFollowRetry({\n retry,\n maxOutageMs,\n dependencies,\n operation: async () =>\n expectShape<SessionDetail>(\n await dependencies.request(path`/sessions/${sessionId}`, {\n timeoutMs: followRequestTimeoutMs(\n retry,\n maxOutageMs,\n dependencies.now(),\n ),\n }),\n \"GET /sessions/{id}\",\n { status: is.string },\n ),\n });\n emptyPolls = 0;\n if (isFollowStopStatus(session.status)) {\n return session;\n }\n }\n\n await dependencies.pollSleep(POLL_SECONDS);\n }\n}\n","import { out } from \"@/lib/output/out\";\nimport type { SessionDetail } from \"@/lib/session/session-detail\";\n\nexport function buildSessionDetailRows(session: SessionDetail): string[][] {\n const rows: string[][] = [[\"id\", out.cell(session.id)]];\n if (session.statusReason) {\n rows.push([\"reason\", out.cell(session.statusReason)]);\n }\n if (session.repoFullName) {\n const branch = session.repos.find(\n (repo) => repo.repoFullName === session.repoFullName,\n )?.branch;\n rows.push([\n \"repo\",\n out.cell(session.repoFullName + (branch ? ` @ ${branch}` : \"\")),\n ]);\n }\n rows.push([\"task\", session.taskType]);\n if (session.model) {\n rows.push([\"model\", out.cell(session.model)]);\n }\n if (session.prUrl) {\n rows.push([\n \"pr\",\n out.cell(\n `${session.prUrl}${session.prState ? ` (${session.prState})` : \"\"}`,\n ),\n ]);\n }\n for (const deliverable of session.deliverables) {\n if (deliverable.url && deliverable.url !== session.prUrl) {\n rows.push([out.cell(deliverable.type), out.cell(deliverable.url)]);\n }\n }\n return rows;\n}\n","import { out } from \"@/lib/output/out\";\nimport type { SessionDetail } from \"@/lib/session/session-detail\";\n\nexport function printPlaybookSteps(\n steps: NonNullable<SessionDetail[\"playbook\"]>[\"steps\"],\n): void {\n if (steps.length === 0) {\n return;\n }\n out.line();\n for (const step of steps) {\n const done = step.todos.filter(\n (todo) => todo.status === \"completed\",\n ).length;\n const marker =\n done === step.todos.length && step.todos.length > 0 ? \"✓\" : \"·\";\n out.line(\n ` ${marker} ${out.cell(step.title)} ${out.paint(`${done}/${step.todos.length}`, \"dim\")}`,\n );\n }\n}\n","import { out } from \"../output/out\";\nimport type { SessionDetail } from \"@/lib/session/session-detail\";\nimport { buildSessionDetailRows } from \"@/lib/session/build-session-detail-rows\";\nimport { printPlaybookSteps } from \"@/lib/session/print-playbook-steps\";\n\n/** The single-session view shared by `get`, `run` and every control command. */\nexport function printSession(session: SessionDetail): void {\n // Titles, reasons, URLs and step names are agent-authored: sanitise before\n // they reach a terminal (see out.safe).\n out.line(\n `${out.paint(out.cell(session.title), \"bold\")} ${out.status(session.status)}`,\n );\n\n const rows = buildSessionDetailRows(session);\n\n out.table(\n rows.map(([label, value]) => [out.paint(label ?? \"\", \"dim\"), value ?? \"\"]),\n );\n\n printPlaybookSteps(session.playbook?.steps ?? []);\n}\n","import { CliError } from \"../cli/cli-error\";\nimport type { SessionDetail } from \"@/lib/session/session-detail\";\n\n/**\n * What a followed session means for the caller's exit code.\n *\n * `followSession` returns on two very different conditions — the work is over,\n * or it needs a person — and both `run --follow` and `sessions logs --follow`\n * have to tell them apart the same way. Returns null when the session\n * completed (exit 0), a CliError carrying 3 when a human is needed, and 1 for\n * a real failure. The session rides on the error so `--json` can emit one\n * document holding both the outcome and what it applies to.\n */\nexport function sessionOutcome(session: SessionDetail): CliError | null {\n switch (session.status) {\n case \"completed\":\n return null;\n case \"waiting_human\":\n return new CliError(\n `Waiting on an answer — \\`hepha questions list --session ${session.id}\\``,\n 3,\n {},\n session,\n );\n case \"awaiting_approval\":\n return new CliError(\n \"Waiting on a guardrail approval — `hepha approvals list`\",\n 3,\n {},\n session,\n );\n default:\n return new CliError(\n `Session ended ${session.status}${session.statusReason ? `: ${session.statusReason}` : \".\"}`,\n 1,\n {},\n session,\n );\n }\n}\n","import { out } from \"../output/out\";\nimport { printSession } from \"./print-session\";\nimport { sessionOutcome } from \"./session-outcome\";\nimport type { SessionDetail } from \"./session-detail\";\n\nexport function writeFollowedSessionOutcome(\n session: SessionDetail,\n asJson: boolean,\n): void {\n const outcome = sessionOutcome(session);\n\n if (asJson) {\n if (!outcome) out.json(session);\n } else {\n out.line();\n printSession(session);\n }\n\n if (outcome) throw outcome;\n}\n","import type { CreateInput } from \"@/commands/create/create-input\";\nexport const HARNESSES = [\n \"claude-code\",\n \"codex\",\n \"cursor\",\n] as const satisfies readonly NonNullable<CreateInput[\"harnessPin\"]>[];\n","import type { CreateInput } from \"@/commands/create/create-input\";\n/**\n * Validated locally so a typo names itself, instead of travelling to the API\n * and coming back as a bare \"Input validation failed\" that says nothing about\n * which flag was wrong.\n *\n * `satisfies` against the router's own input type is what keeps these lists\n * honest: adding a task type server-side without updating this one is a\n * `types:check` failure, not a CLI that quietly refuses a valid value.\n */\nexport const TASK_TYPES = [\n \"implement\",\n \"new-project\",\n \"orchestrator\",\n \"design\",\n] as const satisfies readonly NonNullable<CreateInput[\"taskType\"]>[];\n","import { args } from \"@/lib/args/args\";\nimport type { ParsedArgs } from \"@/lib/parsed/parsed-args\";\nimport type { CreateInput } from \"@/commands/create/create-input\";\nimport { HARNESSES } from \"@/commands/harnesses/harnesses-constants\";\nimport { TASK_TYPES } from \"@/commands/task/task-types-constants\";\n\nexport function createRunInput(\n parsed: ParsedArgs,\n prompt: string,\n): CreateInput {\n const taskType = args.choice(parsed, \"task-type\", TASK_TYPES);\n const harness = args.choice(parsed, \"harness\", HARNESSES);\n\n return {\n prompt,\n ...(parsed.flags.title ? { title: parsed.flags.title } : {}),\n ...(taskType ? { taskType } : {}),\n ...(parsed.flags.model ? { modelSelection: parsed.flags.model } : {}),\n ...(harness ? { harnessPin: harness } : {}),\n ...(parsed.flags.repo ? { repoFullName: parsed.flags.repo } : {}),\n ...(parsed.flags.branch ? { branch: parsed.flags.branch } : {}),\n ...(parsed.repeated.skill ? { pinnedSkillIds: parsed.repeated.skill } : {}),\n };\n}\n","import { api } from \"../../lib/api/api\";\nimport { args } from \"../../lib/args/args\";\nimport { expectShape } from \"../../lib/expect/expect-shape\";\nimport { is } from \"../../lib/is/is\";\nimport { followSession } from \"../../lib/session/follow-session\";\nimport { out } from \"../../lib/output/out\";\nimport { printSession } from \"../../lib/session/print-session\";\nimport { writeFollowedSessionOutcome } from \"../../lib/session/write-followed-session-outcome\";\nimport { createRunInput } from \"@/commands/command/create-run-input\";\nimport type { ApiOutputs } from \"@/lib/api/api-outputs\";\nimport type { ParsedArgs } from \"@/lib/parsed/parsed-args\";\n\n/**\n * Exit code carries the outcome — 0 done, 3 waiting on a human, 1 failed — so\n * a caller can drive the loop without parsing text.\n */\nexport async function runCommand(parsed: ParsedArgs): Promise<void> {\n args.expect(parsed, {\n flags: [\n \"title\",\n \"task-type\",\n \"model\",\n \"harness\",\n \"repo\",\n \"branch\",\n \"skill\",\n ],\n booleans: [\"follow\"],\n positional: 1,\n });\n\n const prompt = args.required(parsed, 0, \"prompt\");\n const asJson = parsed.booleans.has(\"json\");\n const body = createRunInput(parsed, prompt);\n\n const session = expectShape<ApiOutputs[\"sessions\"][\"create\"]>(\n await api(\"/sessions\", { method: \"POST\", body }),\n \"POST /sessions\",\n { id: is.string, title: is.string, status: is.string },\n );\n\n if (!parsed.booleans.has(\"follow\")) {\n if (asJson) {\n out.json(session);\n return;\n }\n printSession(session);\n out.line();\n out.line(out.paint(` hepha sessions logs ${session.id} --follow`, \"dim\"));\n return;\n }\n\n const quiet = asJson || parsed.booleans.has(\"quiet\");\n\n if (!quiet) {\n out.line(out.paint(`session ${session.id}`, \"dim\"));\n out.line();\n }\n\n const final = await followSession(session.id, { quiet });\n writeFollowedSessionOutcome(final, asJson);\n}\n","import { is } from \"@/lib/is/is\";\n\nexport const ACTIONS = [\n \"list\",\n \"get\",\n \"logs\",\n \"send\",\n \"pause\",\n \"resume\",\n \"kill\",\n \"archive\",\n \"checks\",\n \"pr\",\n \"verify\",\n] as const;\n\nexport const CONTROL_PATHS: Record<string, string> = {\n pause: \"pause\",\n resume: \"resume\",\n kill: \"kill\",\n archive: \"archive\",\n};\n\nexport const STATUS_GROUPS = [\"active\", \"waiting\", \"done\"] as const;\n\nexport const SESSION_FIELDS = {\n id: is.string,\n title: is.string,\n status: is.string,\n taskType: is.string,\n repos: is.array,\n deliverables: is.array,\n};\n","import { api } from \"@/lib/api/api\";\nimport { args } from \"@/lib/args/args\";\nimport { expectShape } from \"@/lib/expect/expect-shape\";\nimport { is } from \"@/lib/is/is\";\nimport { out } from \"@/lib/output/out\";\nimport { STATUS_GROUPS } from \"@/commands/sessions/sessions-constants\";\nimport type { ApiOutputs } from \"@/lib/api/api-outputs\";\nimport type { ParsedArgs } from \"@/lib/parsed/parsed-args\";\nexport async function listSessions(parsed: ParsedArgs): Promise<void> {\n args.expect(parsed, {\n flags: [\"status\", \"repo\", \"search\", \"page\", \"limit\"],\n booleans: [\"all\"],\n positional: 1,\n });\n\n const result = expectShape<ApiOutputs[\"sessions\"][\"list\"]>(\n await api(\"/sessions\", {\n query: {\n statusGroup: args.choice(parsed, \"status\", STATUS_GROUPS),\n repoFullName: parsed.flags.repo,\n search: parsed.flags.search,\n page: args.integer(parsed, \"page\", { min: 1 }),\n limit: args.integer(parsed, \"limit\", { min: 1, max: 100 }),\n scope: parsed.booleans.has(\"all\") ? \"all\" : undefined,\n },\n }),\n \"GET /sessions\",\n { data: is.array, \"pagination.page\": is.number },\n );\n\n if (parsed.booleans.has(\"json\")) {\n out.json(result);\n return;\n }\n\n if (result.data.length === 0) {\n out.line(\"No sessions.\");\n return;\n }\n\n if (result.pagination.hasNextPage) {\n out.line(\n out.paint(\n `page ${result.pagination.page}/${result.pagination.totalPages} — --page ${result.pagination.page + 1} for more`,\n \"dim\",\n ),\n );\n out.line();\n }\n\n out.table(\n result.data.map((session) => [\n out.cell(session.id),\n out.status(session.status),\n out.cell(session.repoFullName ?? \"—\"),\n out.cell(session.title),\n ]),\n );\n}\n","import { api } from \"@/lib/api/api\";\nimport { args } from \"@/lib/args/args\";\nimport { expectShape } from \"@/lib/expect/expect-shape\";\nimport { is } from \"@/lib/is/is\";\nimport { out } from \"@/lib/output/out\";\nimport { path } from \"@/lib/path/path\";\nimport type { ApiOutputs } from \"@/lib/api/api-outputs\";\nimport type { ParsedArgs } from \"@/lib/parsed/parsed-args\";\n\nexport async function sendSessionMessage(\n parsed: ParsedArgs,\n asJson: boolean,\n): Promise<void> {\n args.expect(parsed, { positional: 3 });\n const sessionId = args.required(parsed, 1, \"sessionId\");\n const message = args.required(parsed, 2, \"message\");\n const result = expectShape<ApiOutputs[\"sessions\"][\"sendMessage\"]>(\n await api(path`/sessions/${sessionId}/messages`, {\n method: \"POST\",\n body: { message },\n }),\n \"POST /sessions/{id}/messages\",\n { delivery: is.string },\n );\n if (asJson) {\n out.json(result);\n return;\n }\n out.line(\n result.delivery === \"interrupt\"\n ? \"Delivered to the running agent.\"\n : \"Queued — the agent picks it up at the end of its turn.\",\n );\n}\n","import type { ParsedArgs } from \"@/lib/parsed/parsed-args\";\nimport { followSession } from \"@/lib/session/follow-session\";\nimport { writeFollowedSessionOutcome } from \"@/lib/session/write-followed-session-outcome\";\n\nexport async function followSessionLogs(\n parsed: ParsedArgs,\n sessionId: string,\n after: number | undefined,\n asJson: boolean,\n): Promise<void> {\n // JSON mode suppresses the transcript so stdout remains one document.\n const session = await followSession(sessionId, {\n quiet: asJson || parsed.booleans.has(\"quiet\"),\n ...(after !== undefined ? { after } : {}),\n });\n writeFollowedSessionOutcome(session, asJson);\n}\n","import { api } from \"@/lib/api/api\";\nimport { config } from \"@/lib/shared/config\";\nimport { path } from \"@/lib/path/path\";\nimport { args } from \"@/lib/args/args\";\nimport { expectShape } from \"@/lib/expect/expect-shape\";\nimport { is } from \"@/lib/is/is\";\nimport { formatEvent } from \"@/lib/event/format-event\";\nimport { out } from \"@/lib/output/out\";\nimport { followSessionLogs } from \"@/commands/show/follow-session-logs\";\nimport type { ApiOutputs } from \"@/lib/api/api-outputs\";\nimport type { ParsedArgs } from \"@/lib/parsed/parsed-args\";\nexport async function showLogs(parsed: ParsedArgs): Promise<void> {\n args.expect(parsed, {\n flags: [\"after\", \"limit\"],\n booleans: [\"follow\"],\n positional: 2,\n });\n\n const sessionId = args.required(parsed, 1, \"sessionId\");\n const asJson = parsed.booleans.has(\"json\");\n const after = args.integer(parsed, \"after\", { min: 0 });\n\n if (parsed.booleans.has(\"follow\")) {\n await followSessionLogs(parsed, sessionId, after, asJson);\n return;\n }\n\n const page = expectShape<ApiOutputs[\"sessions\"][\"events\"]>(\n await api(path`/sessions/${sessionId}/events`, {\n query: {\n after,\n limit: args.integer(parsed, \"limit\", { min: 1, max: 200 }),\n },\n }),\n \"GET /sessions/{id}/events\",\n { items: is.array },\n );\n\n if (asJson) {\n out.json(page);\n return;\n }\n\n const { baseUrl } = config.load();\n for (const event of page.items) {\n const line = formatEvent(event, baseUrl);\n if (line) {\n out.line(line);\n }\n }\n\n // Never let a truncated transcript look complete. Formatted events do not\n // carry their sequence, so the continuation cursor has to be spelled out.\n if (page.hasMore && page.nextCursor !== null) {\n out.line();\n out.line(\n out.paint(\n `more events — hepha sessions logs ${sessionId} --after ${page.nextCursor}`,\n \"dim\",\n ),\n );\n }\n}\n","import { listSessions } from \"@/commands/sessions/list-sessions\";\nimport { sendSessionMessage } from \"@/commands/session/send-session-message\";\nimport { showLogs } from \"@/commands/show/show-logs\";\nimport type { ParsedArgs } from \"@/lib/parsed/parsed-args\";\n\n/**\n * The session actions with their own command. Anything absent here is a\n * per-session operation and goes through `runSessionOperation`, which resolves\n * the session id first.\n */\nexport const sessionActions: Record<\n string,\n (parsed: ParsedArgs, asJson: boolean) => Promise<void>\n> = {\n list: (parsed) => listSessions(parsed),\n logs: (parsed) => showLogs(parsed),\n send: sendSessionMessage,\n};\n","import { expectShape } from \"@/lib/expect/expect-shape\";\nimport { SESSION_FIELDS } from \"@/commands/sessions/sessions-constants\";\nimport type { SessionDetail } from \"@/commands/session/session-detail\";\nexport function detail(payload: unknown, endpoint: string): SessionDetail {\n return expectShape<SessionDetail>(payload, endpoint, SESSION_FIELDS);\n}\n","import { api } from \"@/lib/api/api\";\nimport { CliError } from \"@/lib/cli/cli-error\";\nimport { path } from \"@/lib/path/path\";\nimport { out } from \"@/lib/output/out\";\nimport { printSession } from \"@/lib/session/print-session\";\nimport { detail } from \"@/commands/detail/detail\";\nimport { CONTROL_PATHS } from \"@/commands/sessions/sessions-constants\";\nimport type { ParsedArgs } from \"@/lib/parsed/parsed-args\";\n\nexport async function runSessionControlAction(\n parsed: ParsedArgs,\n action: string,\n sessionId: string,\n asJson: boolean,\n): Promise<void> {\n const controlPath = CONTROL_PATHS[action];\n if (controlPath === undefined) {\n throw new CliError(`Unknown session action: ${action}`, 2);\n }\n const session = detail(\n await api(path`/sessions/${sessionId}/${controlPath}`, {\n method: \"POST\",\n body:\n action === \"kill\" && parsed.flags.reason\n ? { reason: parsed.flags.reason }\n : {},\n }),\n `POST /sessions/{id}/${controlPath}`,\n );\n if (asJson) {\n out.json(session);\n return;\n }\n printSession(session);\n}\n","import { api } from \"@/lib/api/api\";\nimport { args } from \"@/lib/args/args\";\nimport { path } from \"@/lib/path/path\";\nimport { out } from \"@/lib/output/out\";\nimport { printSession } from \"@/lib/session/print-session\";\nimport { runSessionControlAction } from \"@/commands/command/run-session-control-action\";\nimport { detail } from \"@/commands/detail/detail\";\nimport { CONTROL_PATHS } from \"@/commands/sessions/sessions-constants\";\nimport type { ApiOutputs } from \"@/lib/api/api-outputs\";\nimport type { ParsedArgs } from \"@/lib/parsed/parsed-args\";\n\nexport async function runSessionOperation(\n parsed: ParsedArgs,\n action: string,\n asJson: boolean,\n): Promise<void> {\n // Only kill consumes --reason; the other operations must reject it.\n args.expect(parsed, {\n positional: 2,\n ...(action === \"kill\" ? { flags: [\"reason\"] } : {}),\n });\n\n const sessionId = args.required(parsed, 1, \"sessionId\");\n\n if (action === \"get\") {\n const session = detail(\n await api(path`/sessions/${sessionId}`),\n \"GET /sessions/{id}\",\n );\n if (asJson) {\n out.json(session);\n return;\n }\n printSession(session);\n return;\n }\n\n // Avoid inherited keys such as `toString` becoming control paths.\n if (Object.hasOwn(CONTROL_PATHS, action)) {\n await runSessionControlAction(parsed, action, sessionId, asJson);\n return;\n }\n\n if (action === \"checks\") {\n out.json(\n await api<ApiOutputs[\"sessions\"][\"runChecks\"]>(\n path`/sessions/${sessionId}/checks`,\n { method: \"POST\", body: {} },\n ),\n );\n return;\n }\n\n if (action === \"pr\") {\n out.json(\n await api<ApiOutputs[\"sessions\"][\"prChecks\"]>(\n path`/sessions/${sessionId}/pr-checks`,\n ),\n );\n return;\n }\n\n out.json(\n await api<ApiOutputs[\"sessions\"][\"verification\"]>(\n path`/sessions/${sessionId}/verification`,\n ),\n );\n}\n","import { args } from \"../../lib/args/args\";\nimport { ACTIONS } from \"@/commands/sessions/sessions-constants\";\nimport { sessionActions } from \"@/commands/sessions/session-actions\";\nimport { runSessionOperation } from \"@/commands/command/run-session-operation\";\nimport type { ParsedArgs } from \"@/lib/parsed/parsed-args\";\n\nexport async function sessionsCommand(parsed: ParsedArgs): Promise<void> {\n // The action is validated FIRST, so `hepha sessions frobnicate <id>` names\n // the real problem instead of asking for an argument it would never use.\n const action = args.action(parsed, \"sessions\", ACTIONS, \"list\");\n const asJson = parsed.booleans.has(\"json\");\n\n const dedicated = sessionActions[action];\n if (dedicated) {\n return await dedicated(parsed, asJson);\n }\n await runSessionOperation(parsed, action, asJson);\n}\n","import { api } from \"../../lib/api/api\";\nimport { args } from \"../../lib/args/args\";\nimport { config } from \"../../lib/shared/config\";\nimport { expectShape } from \"../../lib/expect/expect-shape\";\nimport { is } from \"../../lib/is/is\";\nimport { out } from \"../../lib/output/out\";\nimport type { ApiOutputs } from \"@/lib/api/api-outputs\";\nimport type { ParsedArgs } from \"@/lib/parsed/parsed-args\";\n\nexport async function whoamiCommand(parsed: ParsedArgs): Promise<void> {\n args.expect(parsed, {});\n\n const identity = expectShape<ApiOutputs[\"me\"][\"get\"]>(\n await api(\"/me\"),\n \"GET /me\",\n {\n \"user.name\": is.string,\n \"user.email\": is.string,\n \"auth.method\": is.string,\n \"auth.scopes\": is.array,\n },\n );\n\n if (parsed.booleans.has(\"json\")) {\n out.json(identity);\n return;\n }\n\n out.table([\n [\n out.paint(\"user\", \"dim\"),\n out.cell(`${identity.user.name} <${identity.user.email}>`),\n ],\n [out.paint(\"role\", \"dim\"), out.cell(identity.user.role ?? \"member\")],\n [\n out.paint(\"auth\", \"dim\"),\n out.cell(\n identity.auth.method === \"api_key\"\n ? `api key${identity.auth.keyName ? ` \"${identity.auth.keyName}\"` : \"\"}`\n : \"session\",\n ),\n ],\n [out.paint(\"scopes\", \"dim\"), identity.auth.scopes.join(\" \")],\n [out.paint(\"url\", \"dim\"), config.load().baseUrl],\n ]);\n}\n","export const CATALOG_TOPICS = new Set([\n \"repos\",\n \"branches\",\n \"models\",\n \"skills\",\n]);\n","import { approvalsCommand } from \"@/commands/command/approvals-command\";\nimport { catalogCommand } from \"@/commands/command/catalog-command\";\nimport { helpCommand } from \"@/commands/command/help-command\";\nimport { keysCommand } from \"@/commands/command/keys-command\";\nimport { loginCommand } from \"@/commands/command/login-command\";\nimport { logoutCommand } from \"@/commands/command/logout-command\";\nimport { questionsCommand } from \"@/commands/command/questions-command\";\nimport { runCommand } from \"@/commands/command/run-command\";\nimport { sessionsCommand } from \"@/commands/command/sessions-command\";\nimport { whoamiCommand } from \"@/commands/command/whoami-command\";\nimport { args } from \"@/lib/args/args\";\nimport { CliError } from \"@/lib/cli/cli-error\";\nimport { CATALOG_TOPICS } from \"@/catalog-topics-constants\";\nexport async function dispatch(command: string, argv: string[]): Promise<void> {\n const parsed = args.parse(argv);\n\n if (parsed.booleans.has(\"help\")) {\n helpCommand();\n return;\n }\n\n if (CATALOG_TOPICS.has(command)) {\n return await catalogCommand(command, parsed);\n }\n\n switch (command) {\n case \"login\":\n return await loginCommand(parsed);\n case \"logout\":\n return logoutCommand(parsed);\n case \"whoami\":\n return await whoamiCommand(parsed);\n case \"keys\":\n return await keysCommand(parsed);\n case \"run\":\n return await runCommand(parsed);\n case \"sessions\":\n return await sessionsCommand(parsed);\n case \"questions\":\n return await questionsCommand(parsed);\n case \"approvals\":\n return await approvalsCommand(parsed);\n default:\n helpCommand();\n throw new CliError(`Unknown command \"${command}\".`, 2);\n }\n}\n","import { helpCommand } from \"@/commands/command/help-command\";\nimport { args } from \"@/lib/args/args\";\nimport { out } from \"@/lib/output/out\";\nimport { VERSION } from \"@/lib/version/version-constants\";\nimport { wantsJson } from \"@/lib/wants/wants-json\";\nimport { dispatch } from \"@/dispatch\";\nexport async function main(): Promise<void> {\n const argv = process.argv.slice(2);\n out.setJson(wantsJson(argv));\n\n const [command, ...rest] = argv;\n\n if (!command || command === \"help\" || command === \"--help\") {\n helpCommand();\n return;\n }\n\n // Answered early, but NOT before the arguments are checked: returning ahead\n // of the parser would exempt this command from the strictness every other one\n // applies.\n if (command === \"--version\" || command === \"-v\" || command === \"version\") {\n args.expect(args.parse(rest), {});\n if (out.isJson()) {\n out.json({ version: VERSION });\n } else {\n out.line(VERSION);\n }\n return;\n }\n\n await dispatch(command, rest);\n}\n","import { CliError } from \"./lib/cli/cli-error\";\nimport { out } from \"./lib/output/out\";\nimport { main } from \"@/main\";\n\nexport async function cliEntry() {\n try {\n await main();\n } catch (error: unknown) {\n const failure =\n error instanceof CliError\n ? error\n : new CliError(error instanceof Error ? error.message : String(error));\n\n out.failure(failure);\n process.exit(failure.exitCode);\n }\n}\n\nvoid cliEntry();\n"],"mappings":"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","names":["readFileSync","dirname","join","trimmed","detail","result","segments","path","ACTIONS","ACTIONS","result","ACTIONS","ACTIONS","result","trimmed","truncate","truncate","path","segments","path","path","sleep","sleep","ACTIONS","ACTIONS"]}
|
|
1
|
+
{"version":3,"sources":["../../../packages/core/src/tagged-error.ts","../src/lib/shared/errors-constants.ts","../src/lib/cli/cli-error.ts","../src/lib/shared/output-constants.ts","../src/lib/ansi/strip-ansi.ts","../src/lib/supports/supports-color.ts","../src/lib/cli/cli-output.ts","../src/lib/output/out.ts","../src/lib/shared/config.ts","../src/lib/shared/config-constants.ts","../src/lib/path/config-path-constants.ts","../src/lib/file/read-file-as-object.ts","../src/lib/string/config-read-string.ts","../src/lib/user/read-user.ts","../src/lib/http/is-http-url.ts","../src/lib/http/read-http-url.ts","../src/lib/same/is-same-origin.ts","../src/lib/version/read-version.ts","../src/lib/version/version-constants.ts","../src/commands/help/help-constants.ts","../src/commands/command/help-command.ts","../src/lib/args/args-constants.ts","../src/lib/boolean/boolean-flags-constants.ts","../src/lib/args/parse-flag.ts","../src/lib/args/args-parser.ts","../src/lib/args/args.ts","../src/lib/wants/wants-json.ts","../src/lib/api/api-constants.ts","../src/lib/timeout/resolve-timeout.ts","../src/lib/auth/auth-headers.ts","../src/lib/version/client-headers.ts","../src/lib/retry/retry-after-seconds.ts","../src/lib/response/fetch-response.ts","../src/lib/api/add-query-parameters.ts","../src/lib/excerpt/excerpt.ts","../src/lib/api/parse-response-payload.ts","../src/lib/issues/read-issues.ts","../../../packages/core/src/api/path-not-served-constants.ts","../src/lib/string/read-string.ts","../src/lib/message/message-from.ts","../src/lib/api/throw-response-error.ts","../src/lib/api/api.ts","../src/lib/path/path.ts","../src/lib/read/read.ts","../src/lib/expect/expect-shape.ts","../src/lib/is/is.ts","../src/commands/approvals/approvals-constants.ts","../src/commands/approvals/list-approvals.ts","../src/commands/command/approvals-command.ts","../src/commands/catalog/list-catalog-branches.ts","../src/commands/catalog/list-catalog-models.ts","../src/commands/catalog/read-catalog-list.ts","../src/commands/catalog/list-catalog-repos.ts","../src/commands/catalog/list-catalog-skills.ts","../src/commands/catalog/catalog-topics.ts","../src/commands/command/catalog-command.ts","../src/commands/keys/keys-constants.ts","../src/commands/key/create-key.ts","../src/commands/command/keys-command.ts","../src/commands/command/login-command.ts","../src/lib/token/device-token-error.ts","../src/lib/retry/next-poll-delay.ts","../src/lib/browser/open-browser.ts","../src/commands/login/login-constants.ts","../../../packages/database/shared/constants.ts","../src/commands/client/client-id-constants.ts","../src/commands/sleep/sleep.ts","../src/commands/complete/complete-login.ts","../src/commands/login/resolve-login-base-url.ts","../src/commands/command/logout-command.ts","../src/commands/answers/collect-answers-constants.ts","../src/commands/answer/validate-free-text.ts","../src/commands/answer/validate-selected-option-ids.ts","../src/commands/answer/validate-answer.ts","../src/commands/answers/parse-answer-entry.ts","../src/commands/answers/parse-answers-flag.ts","../src/commands/answers/collect-answers.ts","../src/commands/questions/questions-constants.ts","../src/commands/questions/list-questions.ts","../src/commands/batch/print-batch-question.ts","../src/commands/batch/print-batch.ts","../src/commands/command/questions-command.ts","../src/lib/follow/follow-constants.ts","../../../packages/database/schema/advisor/constants.ts","../../../packages/database/schema/advisor/advisor-note-was-delivered.ts","../src/lib/truncate/truncate.ts","../src/lib/event/format-advisor-part.ts","../../../packages/realtime/src/events/deliverable/deliverable-download-path.ts","../../../packages/realtime/src/events/attachment/format-attachment-size.ts","../src/lib/event/format-deliverable-part.ts","../../../packages/agents/src/turns/turn-constants.ts","../../../packages/agents/src/tool-activity/canonical/canonical-tool-name-constants.ts","../../../packages/agents/src/tool-activity/tool-input/is-record.ts","../../../packages/agents/src/tool-activity/tool-input/str.ts","../../../packages/agents/src/tool-activity/tool-input/trimmed.ts","../../../packages/agents/src/tool-activity/tool-input/truncate.ts","../../../packages/agents/src/tool-activity/tool-input/verbatim.ts","../../../packages/agents/src/tool-activity/tool-input.ts","../../../packages/agents/src/tool-activity/label-only.ts","../../../packages/agents/src/tool-activity/tool-activity-basename.ts","../../../packages/agents/src/tool-activity/tool-activity-hostname.ts","../../../packages/agents/src/tool-activity/browser/browser-label.ts","../../../packages/agents/src/tool-activity/browser/browser-activity-constants.ts","../../../packages/agents/src/tool-activity/browser/describe-browser-act.ts","../../../packages/agents/src/tool-activity/browser/describe-browser-navigate.ts","../../../packages/agents/src/tool-activity/capture/capture-label.ts","../../../packages/agents/src/tool-activity/capture/capture-target.ts","../../../packages/agents/src/tool-activity/capture/capture-label-constants.ts","../../../packages/agents/src/tool-activity/capture/describe-take-screenshot.ts","../../../packages/agents/src/tool-activity/browser/browser-tool-activity-describers.ts","../../../packages/agents/src/tool-activity/design/design-tool-activity-describers.ts","../../../packages/agents/src/tool-activity/review/review-tool-activity-describers.ts","../../../packages/agents/src/tool-activity/factory/factory-tool-activity-describers.ts","../../../packages/agents/src/tool-activity/canonical/integration-tool-activity-describers.ts","../../../packages/agents/src/tool-activity/capture/describe-annotate-image.ts","../../../packages/core/src/source-scan/end-of-comment.ts","../../../packages/core/src/source-scan/end-of-string-literal.ts","../../../packages/core/src/source-scan/end-of-skippable.ts","../../../packages/core/src/source-scan/end-of-object-literal.ts","../../../packages/core/src/source-scan/has-spread-in-code.ts","../../../packages/core/src/source-scan/meta-declaration-open.ts","../../../packages/core/src/source-scan/unescape-string-literal.ts","../../../packages/core/src/source-scan/quoted-field-at.ts","../../../packages/core/src/source-scan/top-level-string-field.ts","../../../packages/core/src/source-scan/meta-name-in-script.ts","../../../packages/agents/src/tool-activity/canonical/workflow-script-name.ts","../../../packages/agents/src/tool-activity/canonical/describe-workflow.ts","../../../packages/agents/src/tool-activity/capture/describe-attach-image.ts","../../../packages/agents/src/tool-activity/capture/describe-generate-image.ts","../../../packages/agents/src/tool-activity/capture/describe-record-video.ts","../../../packages/agents/src/tool-activity/canonical/describe-memory-search.ts","../../../packages/agents/src/tool-activity/canonical/describe-report-dev-server.ts","../../../packages/agents/src/tool-activity/canonical/describe-request-env-vars.ts","../../../packages/agents/src/tool-activity/deliverable/describe-attach-file.ts","../../../packages/agents/src/teams/agent-task-update-constants.ts","../../../packages/agents/src/tool-activity/canonical/update-task-labels.ts","../../../packages/agents/src/tool-activity/canonical/describe-native-patch.ts","../../../packages/agents/src/tool-activity/canonical/canonical-tool-activity-describers.ts","../../../packages/agents/src/tool-activity/browser/soft-fail-browser-tools-constants.ts","../../../packages/agents/src/tool-activity/browser/soft-failed-browser.ts","../../../packages/agents/src/tool-activity/capture/soft-fail-capture-tools-constants.ts","../../../packages/agents/src/tool-activity/capture/soft-failed-capture.ts","../../../packages/agents/src/tool-activity/tool-activity-state-for.ts","../../../packages/agents/src/tool-activity/skill/skill-call-constants.ts","../../../packages/agents/src/tool-activity/skill/skill-name-from-input.ts","../../../packages/agents/src/tool-activity/skill/string-field.ts","../../../packages/agents/src/tool-activity/skill/registry-calls.ts","../src/lib/event/format-tool-part.ts","../src/lib/event/format-event.ts","../src/lib/session/consume-session-events.ts","../src/lib/sleep/sleep.ts","../src/lib/sleep/sleep-constants.ts","../src/lib/sleep/timer-delay-ms.ts","../src/lib/sleep/interruptible-sleep.ts","../src/lib/session/default-follow-session-dependencies.ts","../src/lib/session/retry/follow-outage-message.ts","../src/lib/session/retry/follow-retry-constants.ts","../src/lib/session/retry/follow-retry-delay.ts","../src/lib/session/retry/remaining-outage-seconds.ts","../src/lib/session/retry/retryable-follow-error.ts","../src/lib/session/retry/should-report-follow-outage.ts","../src/lib/session/retry/wait-for-follow-retry.ts","../src/lib/session/retry/request-with-follow-retry.ts","../src/lib/blocked/blocked-constants.ts","../src/lib/terminal/terminal-constants.ts","../src/lib/session/is-follow-stop-status.ts","../src/lib/session/retry/resolve-follow-outage-budget.ts","../src/lib/session/retry/follow-request-timeout-ms.ts","../src/lib/session/follow-session.ts","../src/lib/session/build-session-detail-rows.ts","../src/lib/session/print-playbook-steps.ts","../src/lib/session/print-session.ts","../src/lib/session/session-outcome.ts","../src/lib/session/write-followed-session-outcome.ts","../src/commands/harnesses/harnesses-constants.ts","../src/commands/task/task-types-constants.ts","../src/commands/command/create-run-input.ts","../src/commands/command/run-command.ts","../src/commands/sessions/sessions-constants.ts","../src/commands/sessions/list-sessions.ts","../src/commands/session/send-session-message.ts","../src/commands/show/follow-session-logs.ts","../src/commands/show/show-logs.ts","../src/commands/sessions/session-actions.ts","../src/commands/detail/detail.ts","../src/commands/command/run-session-control-action.ts","../src/commands/command/run-session-operation.ts","../src/commands/command/sessions-command.ts","../src/commands/command/whoami-command.ts","../src/catalog-topics-constants.ts","../src/dispatch.ts","../src/main.ts","../src/cli-entry.ts"],"sourcesContent":["/**\n * Base for error kinds recognised across bundle boundaries. `instanceof` is\n * unreliable there — server and tasks bundle their own copy of a shared class —\n * so classification reads the `_tag` literal instead.\n */\nexport abstract class TaggedError<Tag extends string = string> extends Error {\n readonly _tag: Tag;\n\n constructor(tag: Tag, message: string, options?: ErrorOptions) {\n super(message, options);\n this._tag = tag;\n this.name = tag;\n }\n\n static is(value: unknown): value is TaggedError {\n return (\n value instanceof Error &&\n \"_tag\" in value &&\n typeof value._tag === \"string\"\n );\n }\n\n static hasTag<Expected extends string>(\n value: unknown,\n tag: Expected,\n ): value is TaggedError<Expected> {\n return TaggedError.is(value) && value._tag === tag;\n }\n}\n","export const CLI_ERROR_CODES = {\n BAD_USAGE: \"BAD_USAGE\",\n /** The session needs a person — the exit-3 family. */\n NEEDS_HUMAN: \"NEEDS_HUMAN\",\n NOT_AUTHENTICATED: \"NOT_AUTHENTICATED\",\n NETWORK: \"NETWORK\",\n TIMEOUT: \"TIMEOUT\",\n /** Ctrl-C: a cancellation, not a failure of ours. */\n INTERRUPTED: \"INTERRUPTED\",\n /** A 2xx whose shape this CLI version does not understand. */\n API_SCHEMA_MISMATCH: \"API_SCHEMA_MISMATCH\",\n /** Not JSON at all — wrong host, proxy, error page. */\n NON_JSON_RESPONSE: \"NON_JSON_RESPONSE\",\n ERROR: \"ERROR\",\n} as const;\n","import { TaggedError } from \"@repo/core/tagged-error\";\n\nimport { CLI_ERROR_CODES } from \"@/lib/shared/errors-constants\";\nimport type { CliErrorDetails } from \"@/lib/cli/cli-error-details\";\n\n/**\n * A failure the user should read as a message, not a stack trace.\n *\n * `exitCode` is part of the contract for scripts and agents: 1 for a plain\n * failure, 2 for bad usage, 3 for \"the session needs a human\" — so a caller\n * can branch on it without parsing text. `details` carries the same failure in\n * machine form; under `--json` it is what gets printed (see cli-output.ts).\n */\nexport class CliError extends TaggedError<\"CliError\"> {\n readonly exitCode: number;\n readonly details: CliErrorDetails;\n /**\n * A followed session parking on a question is a non-zero outcome AND a result\n * worth reading. Carried here so stdout stays ONE JSON document.\n */\n readonly result?: unknown;\n\n constructor(\n message: string,\n exitCode = 1,\n details: CliErrorDetails = {},\n result?: unknown,\n ) {\n super(\"CliError\", message);\n this.exitCode = exitCode;\n this.details = details;\n if (result !== undefined) {\n this.result = result;\n }\n }\n\n /** The code to report, defaulting to whatever the exit code implies. */\n get code(): string {\n if (this.details.code) {\n return this.details.code;\n }\n if (this.exitCode === 2) {\n return CLI_ERROR_CODES.BAD_USAGE;\n }\n if (this.exitCode === 3) {\n return CLI_ERROR_CODES.NEEDS_HUMAN;\n }\n return CLI_ERROR_CODES.ERROR;\n }\n}\n","export const COLORS: Record<string, string> = {\n reset: \"\\u001b[0m\",\n dim: \"\\u001b[2m\",\n bold: \"\\u001b[1m\",\n red: \"\\u001b[31m\",\n green: \"\\u001b[32m\",\n yellow: \"\\u001b[33m\",\n blue: \"\\u001b[34m\",\n magenta: \"\\u001b[35m\",\n};\n\nexport const STATUS_COLORS: Record<string, string> = {\n running: \"blue\",\n provisioning: \"blue\",\n queued: \"dim\",\n created: \"dim\",\n delivering: \"blue\",\n verifying: \"blue\",\n waiting_human: \"yellow\",\n waiting_external: \"blue\",\n awaiting_approval: \"yellow\",\n completed: \"green\",\n failed: \"red\",\n killed: \"red\",\n abstained: \"yellow\",\n};\n","/** Width is measured on the visible text, so colour never breaks alignment. */\nexport function stripAnsi(text: string): string {\n return text.replace(/\\u001b\\[\\d+m/g, \"\");\n}\n","export function supportsColor(jsonMode: boolean): boolean {\n return (\n process.stdout.isTTY === true &&\n process.env.NO_COLOR === undefined &&\n !jsonMode\n );\n}\n","import type { CliError } from \"./cli-error\";\nimport { COLORS, STATUS_COLORS } from \"@/lib/shared/output-constants\";\nimport { stripAnsi } from \"@/lib/ansi/strip-ansi\";\nimport { supportsColor } from \"@/lib/supports/supports-color\";\n\n/**\n * Two audiences, one command set: humans read the aligned text, agents pass\n * `--json` and parse stdout. Everything a command prints goes through here, so\n * `--json` is never partially honoured.\n */\nexport class CliOutput {\n private jsonMode = false;\n\n /** Declared once per run, before anything can fail. */\n setJson(enabled: boolean): void {\n this.jsonMode = enabled;\n }\n\n isJson(): boolean {\n return this.jsonMode;\n }\n\n json(value: unknown): void {\n process.stdout.write(`${JSON.stringify(value, null, 2)}\\n`);\n }\n\n line(text = \"\"): void {\n process.stdout.write(`${text}\\n`);\n }\n\n error(text: string): void {\n // Sanitised like everything else: a failure message often carries a\n // session's statusReason, which is agent- or tool-authored text — and an\n // error line is the last thing that should be able to repaint the screen.\n process.stderr.write(`${this.paint(`error: ${this.safe(text)}`, \"red\")}\\n`);\n }\n\n // Progress a long command owes the user; stderr keeps `--json` stdout whole.\n warn(text: string): void {\n process.stderr.write(`${this.paint(this.safe(text), \"yellow\")}\\n`);\n }\n\n /**\n * The one place a failure is reported. Under `--json` stdout must be\n * parseable, and it was not: failures went to stderr as prose. Success keeps\n * its bare shape, so nothing that already parses stdout has to change.\n */\n failure(error: CliError): void {\n if (!this.jsonMode) {\n this.error(error.message);\n return;\n }\n\n this.json({\n ok: false,\n error: {\n ...(error.details.status === undefined\n ? {}\n : { status: error.details.status }),\n code: error.code,\n message: this.safe(error.message),\n ...(error.details.issues ? { issues: error.details.issues } : {}),\n ...(error.details.retryAfterSeconds === undefined\n ? {}\n : { retryAfterSeconds: error.details.retryAfterSeconds }),\n },\n // Inside the envelope, so stdout stays one parseable document.\n ...(error.result === undefined ? {} : { result: error.result }),\n });\n }\n\n paint(text: string, color: string): string {\n if (!supportsColor(this.jsonMode)) {\n return text;\n }\n return `${COLORS[color] ?? \"\"}${text}${COLORS.reset}`;\n }\n\n /**\n * Neutralise terminal control sequences in text the platform gives us.\n *\n * Transcript content, PR titles and question bodies carry model output, tool\n * output and repository contents — none of it trusted. Printed raw, an ESC\n * sequence could repaint or erase what the user already read, or emit an OSC\n * 8 hyperlink pointing somewhere else entirely. Newlines and tabs survive;\n * every other C0/C1 control does not. (`--json` is unaffected: JSON.stringify\n * already escapes control characters.)\n */\n safe(text: string): string {\n return text.replace(/[\\u0000-\\u0008\\u000b-\\u001f\\u007f-\\u009f]/g, \"\");\n }\n\n /** `safe`, flattened to one line — anything going into a table cell. */\n cell(text: string): string {\n return this.safe(text).replace(/\\s+/g, \" \").trim();\n }\n\n status(status: string): string {\n return this.paint(status, STATUS_COLORS[status] ?? \"reset\");\n }\n\n /** Left-aligned two-column block — the shape used by every list command. */\n table(rows: string[][]): void {\n if (rows.length === 0) {\n return;\n }\n const firstRow = rows[0];\n if (firstRow === undefined) {\n return;\n }\n const widths = firstRow.map((_, column) =>\n Math.max(...rows.map((row) => stripAnsi(row[column] ?? \"\").length)),\n );\n for (const row of rows) {\n const line = row\n .map((cell, column) => {\n const width = widths[column];\n if (width === undefined) {\n return cell;\n }\n const padding = width - stripAnsi(cell).length;\n return column === row.length - 1 ? cell : cell + \" \".repeat(padding);\n })\n .join(\" \");\n this.line(line.trimEnd());\n }\n }\n}\n","import { CliOutput } from \"@/lib/cli/cli-output\";\n\nexport const out = new CliOutput();\n","import { chmodSync, mkdirSync, rmSync, writeFileSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\n\nimport { CliError } from \"../cli/cli-error\";\nimport { DEFAULT_BASE_URL } from \"@/lib/shared/config-constants\";\nimport type { CliConfig } from \"@/lib/cli/cli-config\";\nimport { CONFIG_PATH } from \"@/lib/path/config-path-constants\";\nimport { readFileAsObject } from \"@/lib/file/read-file-as-object\";\nimport { configReadString } from \"@/lib/string/config-read-string\";\nimport { readUser } from \"@/lib/user/read-user\";\nimport { readHttpUrl } from \"@/lib/http/read-http-url\";\nimport { isSameOrigin } from \"@/lib/same/is-same-origin\";\n\n/**\n * `~/.hepha/config.json` — where a device-flow session lives between runs.\n *\n * Written 0600, because it holds a token that acts as the human. Agents are\n * expected to use HEPHA_API_KEY instead and never touch this file.\n */\nexport const config = {\n path: CONFIG_PATH,\n\n load(): CliConfig {\n const stored = readFileAsObject();\n const storedBaseUrl = readHttpUrl(stored.baseUrl);\n\n // A malformed HEPHA_URL is refused rather than ignored. Falling back would\n // run the command against production — with the production token, since\n // the origin would then match — which is the exact accident the\n // origin-binding below exists to prevent. A malformed value in the config\n // FILE still falls back: the user did not ask for it this run, and\n // bricking every command over a stale file helps nobody.\n const override = configReadString(process.env.HEPHA_URL);\n if (override && !readHttpUrl(override)) {\n throw new CliError(\n `HEPHA_URL is not a valid http(s) URL: \"${override}\".`,\n 2,\n );\n }\n\n const baseUrl = readHttpUrl(override) ?? storedBaseUrl ?? DEFAULT_BASE_URL;\n\n // The stored token is bound to the deployment it was issued by. Pointing\n // HEPHA_URL at staging or somebody else's instance must not send a human\n // bearer token for production to that origin — it would not authenticate\n // there, and it would hand the credential to whoever runs it.\n const token =\n storedBaseUrl && isSameOrigin(storedBaseUrl, baseUrl)\n ? configReadString(stored.token)\n : undefined;\n const user = token ? readUser(stored.user) : undefined;\n\n return {\n baseUrl,\n ...(token ? { token } : {}),\n ...(user ? { user } : {}),\n };\n },\n\n save(next: CliConfig): void {\n mkdirSync(dirname(CONFIG_PATH), { recursive: true, mode: 0o700 });\n writeFileSync(CONFIG_PATH, `${JSON.stringify(next, null, 2)}\\n`, {\n mode: 0o600,\n });\n chmodSync(CONFIG_PATH, 0o600);\n },\n\n clear(): void {\n rmSync(CONFIG_PATH, { force: true });\n },\n};\n","export const DEFAULT_BASE_URL = \"https://hephaistos.impulselab.ai\";\n","import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nexport const CONFIG_PATH = join(homedir(), \".hepha\", \"config.json\");\n","import { readFileSync } from \"node:fs\";\nimport { CONFIG_PATH } from \"@/lib/path/config-path-constants\";\nexport function readFileAsObject(): Record<string, unknown> {\n try {\n const parsed: unknown = JSON.parse(readFileSync(CONFIG_PATH, \"utf8\"));\n // Valid JSON is not necessarily an object: a file holding `null` or a\n // bare string parses fine and then throws on the first property read,\n // taking down every command. Fall back to defaults instead.\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n return {};\n }\n return parsed as Record<string, unknown>;\n } catch {\n return {};\n }\n}\n","/** A hand-edited file can hold anything; only usable strings get through. */\nexport function configReadString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n}\n","import type { CliConfig } from \"@/lib/cli/cli-config\";\nimport { configReadString } from \"@/lib/string/config-read-string\";\nexport function readUser(value: unknown): CliConfig[\"user\"] {\n if (!value || typeof value !== \"object\") {\n return undefined;\n }\n const candidate = value as Record<string, unknown>;\n const user = {\n id: configReadString(candidate.id),\n name: configReadString(candidate.name),\n email: configReadString(candidate.email),\n };\n\n return user.id && user.name && user.email\n ? { id: user.id, name: user.name, email: user.email }\n : undefined;\n}\n","export function isHttpUrl(value: string): boolean {\n try {\n const parsed = new URL(value);\n return parsed.protocol === \"http:\" || parsed.protocol === \"https:\";\n } catch {\n return false;\n }\n}\n","import { isHttpUrl } from \"@/lib/http/is-http-url\";\nimport { configReadString } from \"@/lib/string/config-read-string\";\n/** A usable base URL, or nothing — \"not a url\" would otherwise reach\n * `new URL()` in api.ts and break every command. */\nexport function readHttpUrl(value: unknown): string | undefined {\n const raw = configReadString(value);\n return raw && isHttpUrl(raw) ? raw : undefined;\n}\n","/** Same deployment? Compared on origin, so a trailing slash does not matter. */\nexport function isSameOrigin(a: string, b: string): boolean {\n try {\n return new URL(a).origin === new URL(b).origin;\n } catch {\n return false;\n }\n}\n","import { readFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n/**\n * Read at runtime, not baked in: CI stamps the real version onto package.json\n * when it publishes. Walking up covers both `dist/index.js` (installed) and\n * `src/lib/version.ts` (`pnpm dev`).\n */\nexport function readVersion(): string {\n let directory = dirname(fileURLToPath(import.meta.url));\n\n for (let depth = 0; depth < 5; depth += 1) {\n try {\n const manifest: unknown = JSON.parse(\n readFileSync(join(directory, \"package.json\"), \"utf8\"),\n );\n const version = (manifest as { version?: unknown }).version;\n if (typeof version === \"string\" && version.length > 0) {\n return version;\n }\n } catch {\n // Keep walking: not every ancestor holds a manifest.\n }\n const parent = dirname(directory);\n if (parent === directory) {\n break;\n }\n directory = parent;\n }\n\n return \"unknown\";\n}\n","import { readVersion } from \"@/lib/version/read-version\";\n\nexport const VERSION = readVersion();\n","export const HELP = `hepha — orchestrate Hephaistos sessions from a terminal or an agent.\n\nUSAGE\n hepha <command> [args] [--flags]\n\nTHE LOOP\n hepha run \"<prompt>\" --repo owner/repo --follow\n Start a session and follow it until it finishes or asks you something.\n Exit 0 completed · 3 waiting on a human · 1 failed.\n [--title \"…\"] [--task-type implement|new-project|orchestrator|design]\n [--model <slug>] [--harness claude-code|codex] [--branch <name>]\n [--skill <id>]…\n hepha questions list [--session <id>]\n hepha questions show <batchId>\n hepha questions answer <batchId> --option <questionId>=1,2 --text <questionId>=\"…\"\n [--answers '<json array>']\n hepha questions cancel <batchId>\n hepha approvals list | show <id> | approve <id> | reject <id> --mode rework --feedback \"…\"\n\nSESSIONS\n hepha sessions list [--status active|waiting|done] [--repo owner/repo]\n [--search \"…\"] [--page N] [--limit N] [--all]\n hepha sessions get <id>\n hepha sessions logs <id> [--after <sequence>] [--limit N] [--follow]\n hepha sessions send <id> \"<message>\"\n hepha sessions pause|resume|archive <id>\n hepha sessions kill <id> [--reason \"…\"]\n hepha sessions checks|pr|verify <id>\n\nCATALOG\n hepha repos\n hepha branches <owner/repo>\n hepha models\n hepha skills\n\nAUTH\n hepha login [--url https://…] Device authorization: approve it in a browser.\n hepha logout\n hepha whoami\n hepha keys list\n hepha keys create <name> [--scope sessions:read]… [--expires-in-days 90]\n hepha keys revoke <keyId>\n\nENVIRONMENT\n HEPHA_API_KEY Act as an agent. Takes precedence over a stored login, so\n the human-only commands (approvals approve/reject, keys)\n answer 403 while it is set — unset it to act as yourself.\n HEPHA_TOKEN A device-flow session token, instead of ~/.hepha/config.json.\n HEPHA_URL Platform base URL.\n HEPHA_TIMEOUT_MS Per-request timeout in milliseconds (default 30000).\n HEPHA_FOLLOW_MAX_OUTAGE_SECONDS\n Give up this long after --follow's first failure, with that\n failure as the exit code. Unset, it waits for the platform\n to come back.\n\nGLOBAL FLAGS\n --json Machine-readable output on stdout. Every command that\n returns data honours it; login is interactive and does not.\n Failures print {\"ok\":false,\"error\":{…}} and keep their exit code.\n --quiet Suppress the streamed transcript while following a session.\n --version Print the version and exit.\n --help Print this.\n\nUnknown flags and surplus arguments are refused: for an agent, a typo must\nfail rather than run with default options.\n\n`;\n","import { config } from \"../../lib/shared/config\";\nimport { out } from \"../../lib/output/out\";\nimport { VERSION } from \"../../lib/version/version-constants\";\nimport { HELP } from \"@/commands/help/help-constants\";\n\nexport function helpCommand(): void {\n // Resolved, not a placeholder: the reader can click straight through to the\n // Scalar reference for the platform this CLI is actually pointed at.\n const baseUrl = config.load().baseUrl.replace(/\\/$/, \"\");\n out.line(`${HELP}hepha ${VERSION} · full reference: ${baseUrl}/api/v1/docs`);\n}\n","export const GLOBAL_BOOLEANS = [\"json\", \"help\", \"quiet\"] as const;\n","import { GLOBAL_BOOLEANS } from \"@/lib/args/args-constants\";\nexport const BOOLEAN_FLAGS = new Set<string>([\n ...GLOBAL_BOOLEANS,\n \"follow\",\n \"all\",\n \"version\",\n]);\n","import { BOOLEAN_FLAGS } from \"@/lib/boolean/boolean-flags-constants\";\nimport { CliError } from \"@/lib/cli/cli-error\";\nimport type { ParsedArgs } from \"@/lib/parsed/parsed-args\";\n\nexport function parseFlag(\n argv: string[],\n index: number,\n parsed: ParsedArgs,\n): number {\n const token = argv[index];\n if (token === undefined) {\n return index;\n }\n\n const withoutDashes = token.slice(2);\n const equalsAt = withoutDashes.indexOf(\"=\");\n let name: string;\n let value: string | undefined;\n\n if (equalsAt >= 0) {\n name = withoutDashes.slice(0, equalsAt);\n value = withoutDashes.slice(equalsAt + 1);\n // `--json=false` must not become a truthy boolean flag.\n if (BOOLEAN_FLAGS.has(name)) {\n throw new CliError(\n `--${name} is a boolean flag: pass --${name} to enable it, or omit it. \"--${name}=${value}\" is not a value.`,\n 2,\n );\n }\n } else {\n name = withoutDashes;\n const next = argv[index + 1];\n if (\n !BOOLEAN_FLAGS.has(name) &&\n next !== undefined &&\n !next.startsWith(\"--\")\n ) {\n value = next;\n index += 1;\n }\n }\n\n // Empty value flags are typos; accepting `--url=` can select another target.\n if (value === undefined || value.trim() === \"\") {\n if (!BOOLEAN_FLAGS.has(name)) {\n throw new CliError(`--${name} expects a value.`, 2);\n }\n parsed.booleans.add(name);\n return index;\n }\n\n parsed.flags[name] = value;\n (parsed.repeated[name] ??= []).push(value);\n return index;\n}\n","import { CliError } from \"../cli/cli-error\";\nimport { GLOBAL_BOOLEANS } from \"@/lib/args/args-constants\";\nimport type { ArgsSpec } from \"@/lib/args/args-spec\";\nimport type { ParsedArgs } from \"@/lib/parsed/parsed-args\";\nimport { parseFlag } from \"@/lib/args/parse-flag\";\n\n/**\n * A deliberately small parser: no dependency, and the grammar stays something an\n * agent can generate blind — `hepha <group> <command> [args] [--flags]`. Strict\n * on purpose: `hepha keys create x --scpoe admin` used to mint a key with the\n * DEFAULT scopes and exit 0.\n */\nexport class ArgsParser {\n parse(argv: string[]): ParsedArgs {\n const parsed: ParsedArgs = {\n positional: [],\n flags: {},\n repeated: {},\n booleans: new Set(),\n };\n\n let flagsEnded = false;\n\n for (let index = 0; index < argv.length; index += 1) {\n const token = argv[index];\n if (token === undefined) {\n break;\n }\n\n // `--` ends option parsing: a prompt or a steering message is allowed to\n // start with dashes, and without this there is no way to send one.\n if (!flagsEnded && token === \"--\") {\n flagsEnded = true;\n continue;\n }\n\n if (flagsEnded || !token.startsWith(\"--\")) {\n parsed.positional.push(token);\n continue;\n }\n\n index = parseFlag(argv, index, parsed);\n }\n\n return parsed;\n }\n\n /**\n * Refuse anything this action does not understand. Called once the action is\n * known, because `sessions list` and `sessions logs` accept different flags.\n */\n expect(parsed: ParsedArgs, spec: ArgsSpec): void {\n const allowed = new Set<string>([\n ...GLOBAL_BOOLEANS,\n ...(spec.flags ?? []),\n ...(spec.booleans ?? []),\n ]);\n\n for (const name of [...Object.keys(parsed.flags), ...parsed.booleans]) {\n if (!allowed.has(name)) {\n throw new CliError(`Unknown flag --${name}.`, 2);\n }\n }\n\n const max = spec.positional ?? 0;\n if (parsed.positional.length > max) {\n const surplus = parsed.positional\n .slice(max)\n .map((value) => `\"${value}\"`)\n .join(\", \");\n throw new CliError(\n `Unexpected argument${parsed.positional.length - max > 1 ? \"s\" : \"\"} ${surplus}.`,\n 2,\n );\n }\n }\n\n /** The action name, validated against what the group actually implements. */\n action(\n parsed: ParsedArgs,\n group: string,\n allowed: readonly string[],\n fallback: string,\n ): string {\n const action = parsed.positional[0] ?? fallback;\n // Checked BEFORE the action's own arguments: `hepha approvals frobnicate`\n // used to ask for a <guardrailRequestId> it was never going to use.\n if (!allowed.includes(action)) {\n throw new CliError(\n `Unknown ${group} command \"${action}\". Expected one of: ${allowed.join(\", \")}.`,\n 2,\n );\n }\n return action;\n }\n\n required(parsed: ParsedArgs, index: number, name: string): string {\n const value = parsed.positional[index];\n if (!value) {\n throw new CliError(`Missing <${name}>.`, 2);\n }\n return value;\n }\n\n /**\n * A whole number inside a range, refused locally: `--page -1` used to come\n * back from the API as a bare \"Input validation failed\".\n */\n integer(\n parsed: ParsedArgs,\n name: string,\n bounds: { min?: number; max?: number } = {},\n ): number | undefined {\n const raw = parsed.flags[name];\n if (raw === undefined) {\n return undefined;\n }\n const trimmed = raw.trim();\n const value = Number(trimmed);\n // Number(\"\") is 0, so an empty `--limit=` would quietly mean zero.\n if (trimmed === \"\" || !Number.isFinite(value)) {\n throw new CliError(`--${name} expects a number, got \"${raw}\".`, 2);\n }\n if (!Number.isInteger(value)) {\n throw new CliError(`--${name} expects a whole number, got \"${raw}\".`, 2);\n }\n if (bounds.min !== undefined && value < bounds.min) {\n throw new CliError(`--${name} must be at least ${bounds.min}.`, 2);\n }\n if (bounds.max !== undefined && value > bounds.max) {\n throw new CliError(`--${name} must be at most ${bounds.max}.`, 2);\n }\n return value;\n }\n\n /** One of a fixed set, named in the error so the fix is obvious. */\n choice<T extends string>(\n parsed: ParsedArgs,\n name: string,\n allowed: readonly T[],\n ): T | undefined {\n const raw = parsed.flags[name];\n if (raw === undefined) {\n return undefined;\n }\n if (!(allowed as readonly string[]).includes(raw)) {\n throw new CliError(\n `--${name} expects one of: ${allowed.join(\", \")}. Got \"${raw}\".`,\n 2,\n );\n }\n return raw as T;\n }\n}\n","import { ArgsParser } from \"@/lib/args/args-parser\";\n\nexport const args = new ArgsParser();\n","/**\n * Was machine output asked for, before anything can fail?\n *\n * The failure path needs to know, and it starts in `main()`'s catch — including\n * for errors raised BY the parser, which is exactly when an agent most needs a\n * parseable answer. Mirrors the parser's own rule: a bare `--json` token, and\n * `--` ends option parsing so a prompt may still contain the word.\n */\nexport function wantsJson(argv: string[]): boolean {\n for (const token of argv) {\n if (token === \"--\") {\n return false;\n }\n if (token === \"--json\") {\n return true;\n }\n }\n return false;\n}\n","export const DEFAULT_TIMEOUT_MS = 30_000;\n","import { CliError } from \"@/lib/cli/cli-error\";\nimport { DEFAULT_TIMEOUT_MS } from \"@/lib/api/api-constants\";\nexport function resolveTimeout(override?: number): number {\n if (override !== undefined) {\n return override;\n }\n const raw = process.env.HEPHA_TIMEOUT_MS?.trim();\n if (!raw) {\n return DEFAULT_TIMEOUT_MS;\n }\n const parsed = Number(raw);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n throw new CliError(\n `HEPHA_TIMEOUT_MS expects a positive number of milliseconds, got \"${raw}\".`,\n 2,\n );\n }\n return parsed;\n}\n","import { config } from \"@/lib/shared/config\";\nimport { CliError } from \"@/lib/cli/cli-error\";\nimport { CLI_ERROR_CODES } from \"@/lib/shared/errors-constants\";\nimport type { RequestOptions } from \"@/lib/request/request-options\";\nexport function authHeaders(as: RequestOptions[\"as\"]): Record<string, string> {\n if (as) {\n return { authorization: `Bearer ${as.token}` };\n }\n\n const apiKey = process.env.HEPHA_API_KEY;\n if (apiKey) {\n // An agent's key wins over any stored human session, so a CI run is never\n // silently attributed to whoever last ran `hepha login` on the machine.\n return { \"x-api-key\": apiKey };\n }\n\n const token = process.env.HEPHA_TOKEN ?? config.load().token;\n if (token) {\n return { authorization: `Bearer ${token}` };\n }\n\n throw new CliError(\n \"Not signed in. Run `hepha login`, or set HEPHA_API_KEY to act as an agent.\",\n 1,\n { code: CLI_ERROR_CODES.NOT_AUTHENTICATED },\n );\n}\n","import { VERSION } from \"./version-constants\";\n/** Installed from npm on its own schedule: server logs are the only census. */\nexport function clientHeaders(): Record<string, string> {\n return { \"x-hepha-client\": `hepha-cli/${VERSION}` };\n}\n","export function retryAfterSeconds(response: Response): number | undefined {\n // Better Auth answers `x-retry-after`, the public API answers the standard\n // header — read both rather than pick a side.\n const raw =\n response.headers.get(\"retry-after\") ??\n response.headers.get(\"x-retry-after\");\n if (!raw) {\n return undefined;\n }\n const seconds = Number(raw.trim());\n if (Number.isFinite(seconds)) {\n return seconds >= 0 ? seconds : undefined;\n }\n // RFC 9110 allows an HTTP-date instead of a delay, and proxies do send it.\n const date = Date.parse(raw.trim());\n return Number.isNaN(date)\n ? undefined\n : Math.max(0, (date - Date.now()) / 1_000);\n}\n","import { CliError } from \"@/lib/cli/cli-error\";\nimport { CLI_ERROR_CODES } from \"@/lib/shared/errors-constants\";\n\ninterface FetchResponseOptions {\n url: URL;\n method: string;\n headers: HeadersInit;\n body: unknown;\n deadline: number;\n baseUrl: string;\n}\n\nexport async function fetchResponse({\n url,\n method,\n headers,\n body,\n deadline,\n baseUrl,\n}: FetchResponseOptions): Promise<[Response, string]> {\n const controller = new AbortController();\n let abortedBy: \"timeout\" | \"interrupt\" | null = null;\n const timer = setTimeout(() => {\n abortedBy ??= \"timeout\";\n controller.abort();\n }, deadline);\n const onInterrupt = () => {\n abortedBy ??= \"interrupt\";\n controller.abort();\n };\n process.once(\"SIGINT\", onInterrupt);\n\n try {\n const response = await fetch(url, {\n method,\n headers,\n signal: controller.signal,\n ...(body === undefined ? {} : { body: JSON.stringify(body) }),\n });\n return [response, await response.text()];\n } catch (cause) {\n if (abortedBy === \"interrupt\") {\n throw new CliError(`${method} ${url.pathname} interrupted.`, 130, {\n code: CLI_ERROR_CODES.INTERRUPTED,\n });\n }\n if (abortedBy === \"timeout\") {\n throw new CliError(\n `${method} ${url.pathname} timed out after ${deadline}ms. Raise HEPHA_TIMEOUT_MS if the platform is simply slow.`,\n 1,\n { code: CLI_ERROR_CODES.TIMEOUT },\n );\n }\n throw new CliError(\n `Cannot reach ${baseUrl}. Set HEPHA_URL if the platform lives elsewhere. (${String(cause)})`,\n 1,\n { code: CLI_ERROR_CODES.NETWORK },\n );\n } finally {\n clearTimeout(timer);\n process.removeListener(\"SIGINT\", onInterrupt);\n }\n}\n","import type { RequestOptions } from \"@/lib/request/request-options\";\n\nexport function addQueryParameters(\n url: URL,\n query: RequestOptions[\"query\"],\n): void {\n for (const [key, value] of Object.entries(query ?? {})) {\n if (value !== undefined) {\n url.searchParams.set(key, String(value));\n }\n }\n}\n","import { out } from \"@/lib/output/out\";\n/** Bounded and control-character-free: an HTML error page must not be able to\n * smuggle escape sequences into a terminal through a diagnostic. */\nexport function excerpt(text: string): string {\n const flattened = out.cell(text);\n return flattened.length > 200\n ? `${flattened.slice(0, 200)}\\u2026`\n : flattened;\n}\n","import { CliError } from \"@/lib/cli/cli-error\";\nimport { excerpt } from \"@/lib/excerpt/excerpt\";\nimport { CLI_ERROR_CODES } from \"@/lib/shared/errors-constants\";\n\nexport function parseResponsePayload(\n response: Response,\n text: string,\n request: { method: string; url: URL; retryAfter: number | undefined },\n): unknown {\n const { method, url, retryAfter } = request;\n\n if (!text) {\n return null;\n }\n\n try {\n return JSON.parse(text);\n } catch {\n const body = excerpt(text);\n const contentType = response.headers.get(\"content-type\") ?? \"unknown\";\n // A non-JSON error is primarily an upstream failure, not a URL diagnosis.\n throw new CliError(\n response.ok\n ? `${method} ${url.pathname} answered ${response.status} with a non-JSON body (${contentType}). Is HEPHA_URL pointing at a Hephaistos deployment?${body ? ` Body: ${body}` : \"\"}`\n : `${method} ${url.pathname} failed with ${response.status} and a non-JSON body (${contentType}).${body ? ` Body: ${body}` : \"\"}`,\n 1,\n {\n status: response.status,\n code: CLI_ERROR_CODES.NON_JSON_RESPONSE,\n ...(retryAfter === undefined ? {} : { retryAfterSeconds: retryAfter }),\n },\n );\n }\n}\n","export function readIssues(payload: unknown): unknown[] | undefined {\n if (!payload || typeof payload !== \"object\") {\n return undefined;\n }\n const data = (payload as { data?: unknown }).data;\n if (!data || typeof data !== \"object\") {\n return undefined;\n }\n const issues = (data as { issues?: unknown }).issues;\n return Array.isArray(issues) ? issues : undefined;\n}\n","/** Wire contract: the `/api/v1` unmatched-route marker, read by the npm CLI. */\nexport const PATH_NOT_SERVED = \"path_not_served\";\n","export function readString(payload: unknown, key: string): string | undefined {\n if (!payload || typeof payload !== \"object\") {\n return undefined;\n }\n const value = (payload as Record<string, unknown>)[key];\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n","import { PATH_NOT_SERVED } from \"@repo/core/api/path-not-served-constants\";\nimport { readString } from \"@/lib/string/read-string\";\nimport { VERSION } from \"@/lib/version/version-constants\";\nexport function messageFrom(status: number, payload: unknown): string {\n const message = readString(payload, \"message\");\n // Only our own unmatched-route fallback sends this, and only on a 404: a\n // proxy or the wrong host has no such code and keeps its own diagnosis.\n if (\n status === 404 &&\n readString(payload, \"error\") === PATH_NOT_SERVED &&\n message\n ) {\n return `${message} hepha ${VERSION} may be ahead of the platform.`;\n }\n if (message) {\n // A 403 with HEPHA_API_KEY set is almost always the precedence rule biting.\n return status === 403 && process.env.HEPHA_API_KEY\n ? `${message} (HEPHA_API_KEY is set and takes precedence over your \\`hepha login\\` session — unset it to act as yourself.)`\n : message;\n }\n if (status === 401) {\n return \"Unauthorized — your credential is missing, expired or revoked.\";\n }\n return `Request failed with status ${status}.`;\n}\n","import { CliError } from \"@/lib/cli/cli-error\";\nimport { readIssues } from \"@/lib/issues/read-issues\";\nimport { messageFrom } from \"@/lib/message/message-from\";\nimport { readString } from \"@/lib/string/read-string\";\n\nexport function throwResponseError(\n response: Response,\n payload: unknown,\n retryAfter: number | undefined,\n): never {\n // Pre-router refusals use `error`; oRPC responses take precedence via `code`.\n const code = readString(payload, \"code\") ?? readString(payload, \"error\");\n const issues = readIssues(payload);\n\n throw new CliError(\n messageFrom(response.status, payload) +\n (response.status === 429 && retryAfter !== undefined\n ? ` Retry in ${retryAfter}s.`\n : \"\"),\n 1,\n {\n status: response.status,\n ...(code ? { code } : {}),\n ...(issues ? { issues } : {}),\n ...(retryAfter === undefined ? {} : { retryAfterSeconds: retryAfter }),\n },\n );\n}\n","import { config } from \"../shared/config\";\nimport type { RequestOptions } from \"@/lib/request/request-options\";\nimport { resolveTimeout } from \"@/lib/timeout/resolve-timeout\";\nimport { authHeaders } from \"@/lib/auth/auth-headers\";\nimport { clientHeaders } from \"@/lib/version/client-headers\";\nimport { retryAfterSeconds } from \"@/lib/retry/retry-after-seconds\";\nimport { fetchResponse } from \"@/lib/response/fetch-response\";\nimport { addQueryParameters } from \"@/lib/api/add-query-parameters\";\nimport { parseResponsePayload } from \"@/lib/api/parse-response-payload\";\nimport { throwResponseError } from \"@/lib/api/throw-response-error\";\n\n/**\n * The one place the CLI talks to the platform.\n *\n * Every command names its REST path once and gets its types from the router\n * (api-inputs.ts), so there is no generated client to keep in step and no\n * second copy of the API surface.\n */\nexport async function api<T>(\n requestPath: string,\n options: RequestOptions = {},\n): Promise<T> {\n const baseUrl = options.as?.baseUrl ?? config.load().baseUrl;\n const url = new URL(`${baseUrl.replace(/\\/$/, \"\")}/api/v1${requestPath}`);\n addQueryParameters(url, options.query);\n\n // Resolved before the try: a missing credential is a usage error, not a\n // network failure, and must not be reported as one.\n const headers = {\n ...clientHeaders(),\n ...authHeaders(options.as),\n ...(options.body === undefined\n ? {}\n : { \"content-type\": \"application/json\" }),\n };\n\n const method = options.method ?? \"GET\";\n const deadline = resolveTimeout(options.timeoutMs);\n const [response, text] = await fetchResponse({\n url,\n method,\n headers,\n body: options.body,\n deadline,\n baseUrl,\n });\n\n const retryAfter = retryAfterSeconds(response);\n const payload = parseResponsePayload(response, text, {\n method,\n url,\n retryAfter,\n });\n\n if (!response.ok) {\n throwResponseError(response, payload, retryAfter);\n }\n\n return payload as T;\n}\n","/**\n * Build a REST path with every dynamic segment escaped.\n *\n * Session ids, key ids and repository names were interpolated raw, so a value\n * holding `?`, `#`, `/` or `%` silently moved the request to another route or\n * grew a query string the caller never wrote. A tagged template makes the safe\n * form the easy one, and the structural slashes stay in the literal parts.\n */\nexport function path(\n strings: TemplateStringsArray,\n ...values: string[]\n): string {\n return strings.reduce(\n (accumulator, literal, index) =>\n accumulator +\n (index === 0 ? \"\" : encodeURIComponent(values[index - 1] ?? \"\")) +\n literal,\n \"\",\n );\n}\n","export function read(payload: unknown, dotted: string): unknown {\n return dotted.split(\".\").reduce<unknown>((current, key) => {\n if (!current || typeof current !== \"object\") {\n return undefined;\n }\n return (current as Record<string, unknown>)[key];\n }, payload);\n}\n","import { CliError } from \"../cli/cli-error\";\nimport { VERSION } from \"../version/version-constants\";\nimport { CLI_ERROR_CODES } from \"@/lib/shared/errors-constants\";\nimport type { Predicate } from \"@/lib/predicate/predicate\";\nimport { read } from \"@/lib/read/read\";\n\n/**\n * Check a 2xx payload before the command destructures it. The client casts\n * responses to the router's types — a compile-time promise about a server that\n * may be older or newer than this binary. When it did not hold, the first\n * property read threw `Cannot read properties of undefined`.\n */\nexport function expectShape<T>(\n payload: unknown,\n endpoint: string,\n requirements: Record<string, Predicate>,\n): T {\n for (const [field, predicate] of Object.entries(requirements)) {\n if (!predicate(read(payload, field))) {\n throw new CliError(\n `${endpoint} returned a payload this CLI does not understand: \"${field}\" is missing or has the wrong type. hepha ${VERSION} may be out of step with the platform — try \\`npm install -g @impulselab/hepha\\`.`,\n 1,\n { code: CLI_ERROR_CODES.API_SCHEMA_MISMATCH },\n );\n }\n }\n\n return payload as T;\n}\n","/** The handful of shapes the CLI actually destructures. */\nexport const is = {\n string: (value: unknown) => typeof value === \"string\",\n // Absent passes: a field a deployment older than this binary does not send.\n optionalString: (value: unknown) =>\n value === undefined || typeof value === \"string\",\n number: (value: unknown) => typeof value === \"number\",\n array: (value: unknown) => Array.isArray(value),\n object: (value: unknown) =>\n Boolean(value) && typeof value === \"object\" && !Array.isArray(value),\n};\n","export const ACTIONS = [\"list\", \"show\", \"approve\", \"reject\"] as const;\n\nexport const REJECT_MODES = [\"rework\", \"terminate\"] as const;\n","import { api } from \"@/lib/api/api\";\nimport { expectShape } from \"@/lib/expect/expect-shape\";\nimport { is } from \"@/lib/is/is\";\nimport { out } from \"@/lib/output/out\";\nimport type { ApiOutputs } from \"@/lib/api/api-outputs\";\n\nexport async function listApprovals(asJson: boolean): Promise<void> {\n const result = expectShape<ApiOutputs[\"approvals\"][\"list\"]>(\n await api(\"/approvals\"),\n \"GET /approvals\",\n { items: is.array },\n );\n if (asJson) {\n out.json(result);\n return;\n }\n if (result.items.length === 0) {\n out.line(\"No guardrail waiting on you.\");\n return;\n }\n out.table(\n result.items.map((item) => [\n out.cell(item.id),\n out.cell(item.guardrailKind),\n out.cell(item.repoName ?? \"—\"),\n out.cell(item.summary),\n ]),\n );\n}\n","import { api } from \"../../lib/api/api\";\nimport { path } from \"../../lib/path/path\";\nimport { args } from \"../../lib/args/args\";\nimport { CliError } from \"../../lib/cli/cli-error\";\nimport { expectShape } from \"../../lib/expect/expect-shape\";\nimport { is } from \"../../lib/is/is\";\nimport { out } from \"../../lib/output/out\";\nimport {\n ACTIONS,\n REJECT_MODES,\n} from \"@/commands/approvals/approvals-constants\";\nimport { listApprovals } from \"@/commands/approvals/list-approvals\";\nimport type { ApiOutputs } from \"@/lib/api/api-outputs\";\nimport type { ParsedArgs } from \"@/lib/parsed/parsed-args\";\n\n/**\n * Approving and rejecting require a human session and are refused for an API\n * key: a machine standing in for human validation would defeat the guardrail.\n */\nexport async function approvalsCommand(parsed: ParsedArgs): Promise<void> {\n const action = args.action(parsed, \"approvals\", ACTIONS, \"list\");\n const asJson = parsed.booleans.has(\"json\");\n\n if (action === \"list\") {\n args.expect(parsed, { positional: 1 });\n return await listApprovals(asJson);\n }\n\n args.expect(parsed, {\n positional: 2,\n ...(action === \"reject\" ? { flags: [\"mode\", \"feedback\"] } : {}),\n });\n const guardrailId = args.required(parsed, 1, \"guardrailRequestId\");\n\n if (action === \"show\") {\n const detail = expectShape<ApiOutputs[\"approvals\"][\"get\"]>(\n await api(path`/approvals/${guardrailId}`),\n \"GET /approvals/{id}\",\n { guardrailKind: is.string, status: is.string, summary: is.string },\n );\n if (asJson) {\n out.json(detail);\n return;\n }\n out.line(\n `${out.paint(out.cell(detail.guardrailKind), \"bold\")} ${detail.status}`,\n );\n out.line(out.safe(detail.summary));\n out.line();\n out.json(detail.payload);\n return;\n }\n\n if (action === \"approve\") {\n const result = await api<ApiOutputs[\"approvals\"][\"approve\"]>(\n path`/approvals/${guardrailId}/approve`,\n { method: \"POST\", body: {} },\n );\n if (asJson) {\n out.json(result);\n return;\n }\n out.line(`${out.paint(\"✓\", \"green\")} Approved ${out.cell(guardrailId)}`);\n return;\n }\n\n const mode = args.choice(parsed, \"mode\", REJECT_MODES) ?? \"rework\";\n if (mode === \"rework\" && !parsed.flags.feedback) {\n throw new CliError(\n \"--feedback is required with --mode rework: the agent needs to know what to change.\",\n 2,\n );\n }\n\n const result = await api<ApiOutputs[\"approvals\"][\"reject\"]>(\n path`/approvals/${guardrailId}/reject`,\n {\n method: \"POST\",\n body: {\n mode,\n ...(parsed.flags.feedback ? { feedback: parsed.flags.feedback } : {}),\n },\n },\n );\n if (asJson) {\n out.json(result);\n return;\n }\n out.line(\n `${out.paint(\"✓\", \"green\")} Rejected ${out.cell(guardrailId)} (${mode})`,\n );\n}\n","import { api } from \"@/lib/api/api\";\nimport { args } from \"@/lib/args/args\";\nimport { CliError } from \"@/lib/cli/cli-error\";\nimport { out } from \"@/lib/output/out\";\nimport { path } from \"@/lib/path/path\";\nimport type { ApiOutputs } from \"@/lib/api/api-outputs\";\nimport type { ParsedArgs } from \"@/lib/parsed/parsed-args\";\n\nexport async function listCatalogBranches(\n parsed: ParsedArgs,\n asJson: boolean,\n): Promise<void> {\n args.expect(parsed, { positional: 1 });\n const repoFullName = args.required(parsed, 0, \"owner/repo\");\n const segments = repoFullName.split(\"/\");\n const [owner, repo] = segments;\n if (segments.length !== 2 || !owner || !repo) {\n throw new CliError(\n `Expected a repository as \"owner/repo\", got \"${repoFullName}\".`,\n 2,\n );\n }\n\n const result = await api<ApiOutputs[\"catalog\"][\"branches\"]>(\n path`/repos/${owner}/${repo}/branches`,\n );\n if (!result.result) {\n throw new CliError(`No GitHub installation covers ${repoFullName}.`);\n }\n if (asJson) {\n out.json(result);\n return;\n }\n for (const branch of result.result.branches) {\n out.line(\n branch === result.result.defaultBranch\n ? `${out.cell(branch)} ${out.paint(\"(default)\", \"dim\")}`\n : out.cell(branch),\n );\n }\n}\n","import { api } from \"@/lib/api/api\";\nimport { args } from \"@/lib/args/args\";\nimport { expectShape } from \"@/lib/expect/expect-shape\";\nimport { is } from \"@/lib/is/is\";\nimport { out } from \"@/lib/output/out\";\nimport type { ApiOutputs } from \"@/lib/api/api-outputs\";\nimport type { ParsedArgs } from \"@/lib/parsed/parsed-args\";\n\nexport async function listCatalogModels(\n parsed: ParsedArgs,\n asJson: boolean,\n): Promise<void> {\n args.expect(parsed, {});\n const result = expectShape<ApiOutputs[\"catalog\"][\"models\"]>(\n await api(\"/models\"),\n \"GET /models\",\n { harnesses: is.array, gatewayModels: is.array },\n );\n if (asJson) {\n out.json(result);\n return;\n }\n out.line(out.paint(\"harnesses\", \"dim\"));\n for (const harness of result.harnesses) {\n out.line(` ${out.cell(harness)}`);\n }\n out.line();\n out.line(out.paint(\"gateway models\", \"dim\"));\n for (const model of result.gatewayModels) {\n out.line(` ${out.cell(model.id)}`);\n }\n}\n","import { api } from \"@/lib/api/api\";\nimport { args } from \"@/lib/args/args\";\nimport { expectShape } from \"@/lib/expect/expect-shape\";\nimport { is } from \"@/lib/is/is\";\nimport type { ParsedArgs } from \"@/lib/parsed/parsed-args\";\n\n/**\n * Reads a catalog list endpoint: no flags accepted, the response shape checked\n * before anything renders it. Generic in the payload so each command keeps its\n * own contract from `ApiOutputs` and only names the array it expects.\n */\nexport async function readCatalogList<T>(\n parsed: ParsedArgs,\n path: string,\n field: string,\n): Promise<T> {\n args.expect(parsed, {});\n return expectShape<T>(await api(path), `GET ${path}`, { [field]: is.array });\n}\n","import { out } from \"@/lib/output/out\";\nimport { readCatalogList } from \"@/commands/catalog/read-catalog-list\";\nimport type { ApiOutputs } from \"@/lib/api/api-outputs\";\nimport type { ParsedArgs } from \"@/lib/parsed/parsed-args\";\n\nexport async function listCatalogRepos(\n parsed: ParsedArgs,\n asJson: boolean,\n): Promise<void> {\n const result = await readCatalogList<ApiOutputs[\"catalog\"][\"repos\"]>(\n parsed,\n \"/repos\",\n \"repos\",\n );\n if (asJson) {\n out.json(result);\n return;\n }\n for (const repo of result.repos) {\n out.line(out.cell(repo));\n }\n}\n","import { out } from \"@/lib/output/out\";\nimport { readCatalogList } from \"@/commands/catalog/read-catalog-list\";\nimport type { ApiOutputs } from \"@/lib/api/api-outputs\";\nimport type { ParsedArgs } from \"@/lib/parsed/parsed-args\";\n\nexport async function listCatalogSkills(\n parsed: ParsedArgs,\n asJson: boolean,\n): Promise<void> {\n const result = await readCatalogList<ApiOutputs[\"catalog\"][\"skills\"]>(\n parsed,\n \"/skills\",\n \"skills\",\n );\n if (asJson) {\n out.json(result);\n return;\n }\n out.table(\n result.skills.map((skill) => [\n out.cell(skill.id),\n out.cell(skill.name),\n out.cell(skill.description ?? \"\"),\n ]),\n );\n}\n","import { listCatalogBranches } from \"@/commands/catalog/list-catalog-branches\";\nimport { listCatalogModels } from \"@/commands/catalog/list-catalog-models\";\nimport { listCatalogRepos } from \"@/commands/catalog/list-catalog-repos\";\nimport { listCatalogSkills } from \"@/commands/catalog/list-catalog-skills\";\nimport type { ParsedArgs } from \"@/lib/parsed/parsed-args\";\n\n/**\n * What `hepha catalog <topic>` can list. A table rather than a chain of\n * comparisons: adding a topic is one line, and the set of topics is readable\n * without following four branches.\n */\nexport const catalogTopics: Record<\n string,\n (parsed: ParsedArgs, asJson: boolean) => Promise<void>\n> = {\n branches: listCatalogBranches,\n models: listCatalogModels,\n repos: listCatalogRepos,\n skills: listCatalogSkills,\n};\n","import { CliError } from \"../../lib/cli/cli-error\";\nimport { catalogTopics } from \"@/commands/catalog/catalog-topics\";\nimport type { ParsedArgs } from \"@/lib/parsed/parsed-args\";\n\n/**\n * Read before creating a session: a repository outside `repos` is refused at\n * creation, and a model outside `models` is not routable.\n */\nexport async function catalogCommand(\n topic: string,\n parsed: ParsedArgs,\n): Promise<void> {\n const list = catalogTopics[topic];\n if (!list) {\n throw new CliError(`Unknown catalog topic \"${topic}\".`, 2);\n }\n await list(parsed, parsed.booleans.has(\"json\"));\n}\n","export const ACTIONS = [\"list\", \"create\", \"revoke\"] as const;\n","import { api } from \"@/lib/api/api\";\nimport { args } from \"@/lib/args/args\";\nimport { expectShape } from \"@/lib/expect/expect-shape\";\nimport { is } from \"@/lib/is/is\";\nimport { out } from \"@/lib/output/out\";\nimport type { Scope } from \"@/commands/scope/scope\";\nimport type { ApiOutputs } from \"@/lib/api/api-outputs\";\nimport type { ParsedArgs } from \"@/lib/parsed/parsed-args\";\n\nexport async function createKey(\n parsed: ParsedArgs,\n asJson: boolean,\n): Promise<void> {\n args.expect(parsed, { flags: [\"scope\", \"expires-in-days\"], positional: 2 });\n const name = args.required(parsed, 1, \"name\");\n const scopes = parsed.repeated.scope as Scope;\n const expiresInDays = args.integer(parsed, \"expires-in-days\", {\n min: 1,\n max: 365,\n });\n const created = expectShape<ApiOutputs[\"keys\"][\"create\"]>(\n await api(\"/keys\", {\n method: \"POST\",\n body: {\n name,\n ...(scopes && scopes.length > 0 ? { scopes } : {}),\n ...(expiresInDays !== undefined ? { expiresInDays } : {}),\n },\n }),\n \"POST /keys\",\n { key: is.string, scopes: is.array },\n );\n if (asJson) {\n out.json(created);\n return;\n }\n out.line(\n `${out.paint(\"✓\", \"green\")} Created \"${out.cell(created.name ?? name)}\"`,\n );\n out.line();\n out.line(` ${out.paint(created.key, \"bold\")}`);\n out.line();\n out.line(\n out.paint(\n \" Copy it now — it is hashed at rest and never shown again.\",\n \"dim\",\n ),\n );\n out.line(out.paint(` Scopes: ${created.scopes.join(\" \")}`, \"dim\"));\n}\n","import { api } from \"../../lib/api/api\";\nimport { path } from \"../../lib/path/path\";\nimport { args } from \"../../lib/args/args\";\nimport { expectShape } from \"../../lib/expect/expect-shape\";\nimport { is } from \"../../lib/is/is\";\nimport { out } from \"../../lib/output/out\";\nimport { ACTIONS } from \"@/commands/keys/keys-constants\";\nimport { createKey } from \"@/commands/key/create-key\";\nimport type { ApiOutputs } from \"@/lib/api/api-outputs\";\nimport type { ParsedArgs } from \"@/lib/parsed/parsed-args\";\n\n/**\n * Human sessions only, by design: a key cannot mint or revoke a key, so the\n * whole group fails with a 403 when HEPHA_API_KEY is set.\n */\nexport async function keysCommand(parsed: ParsedArgs): Promise<void> {\n const action = args.action(parsed, \"keys\", ACTIONS, \"list\");\n const asJson = parsed.booleans.has(\"json\");\n\n if (action === \"list\") {\n args.expect(parsed, { positional: 1 });\n const result = expectShape<ApiOutputs[\"keys\"][\"list\"]>(\n await api(\"/keys\"),\n \"GET /keys\",\n { keys: is.array },\n );\n if (asJson) {\n out.json(result);\n return;\n }\n if (result.keys.length === 0) {\n out.line(\"No keys. Create one with `hepha keys create <name>`.\");\n return;\n }\n out.table([\n [\n out.paint(\"ID\", \"dim\"),\n out.paint(\"NAME\", \"dim\"),\n out.paint(\"PREFIX\", \"dim\"),\n out.paint(\"SCOPES\", \"dim\"),\n ],\n ...result.keys.map((key) => [\n out.cell(key.id),\n out.cell(key.name ?? \"—\"),\n out.cell(key.start ?? \"—\"),\n key.scopes.join(\" \"),\n ]),\n ]);\n return;\n }\n\n if (action === \"create\") {\n return await createKey(parsed, asJson);\n }\n\n args.expect(parsed, { positional: 2 });\n const keyId = args.required(parsed, 1, \"keyId\");\n const result = await api<ApiOutputs[\"keys\"][\"revoke\"]>(path`/keys/${keyId}`, {\n method: \"DELETE\",\n });\n if (asJson) {\n out.json(result);\n return;\n }\n out.line(`${out.paint(\"✓\", \"green\")} Revoked ${out.cell(keyId)}`);\n}\n","import { createAuthClient } from \"better-auth/client\";\nimport { deviceAuthorizationClient } from \"better-auth/client/plugins\";\n\nimport { args } from \"../../lib/args/args\";\nimport { deviceTokenError } from \"../../lib/token/device-token-error\";\nimport { nextPollDelay } from \"../../lib/retry/next-poll-delay\";\nimport { CliError } from \"../../lib/cli/cli-error\";\nimport { openBrowser } from \"../../lib/browser/open-browser\";\nimport { out } from \"../../lib/output/out\";\nimport { MIN_BACKOFF } from \"@/commands/login/login-constants\";\nimport { CLIENT_ID } from \"@/commands/client/client-id-constants\";\nimport { sleep } from \"@/commands/sleep/sleep\";\nimport { completeLogin } from \"@/commands/complete/complete-login\";\nimport { resolveLoginBaseUrl } from \"@/commands/login/resolve-login-base-url\";\nimport type { ParsedArgs } from \"@/lib/parsed/parsed-args\";\n\n/**\n * `hepha login` — OAuth 2.0 device authorization (RFC 8628).\n *\n * The CLI never sees a password and never asks for a pasted token: it gets a\n * short code, a human approves it in a browser that is already signed in to\n * Hephaistos, and only then does a session token exist. That approval is also\n * what makes a CLI session count as \"a human\" for guardrail decisions.\n */\nexport async function loginCommand(parsed: ParsedArgs): Promise<void> {\n args.expect(parsed, { flags: [\"url\"] });\n\n const baseUrl = resolveLoginBaseUrl(parsed);\n\n const authClient = createAuthClient({\n baseURL: baseUrl,\n plugins: [deviceAuthorizationClient()],\n });\n\n const { data: device, error: deviceError } = await authClient.device.code({\n client_id: CLIENT_ID,\n scope: \"openid profile email\",\n });\n\n if (deviceError || !device) {\n throw new CliError(\n deviceError?.error_description ??\n `Could not start a device login against ${baseUrl}.`,\n );\n }\n\n const verificationUrl =\n device.verification_uri_complete ?? device.verification_uri;\n\n out.line();\n out.line(` Code ${out.paint(out.cell(device.user_code), \"bold\")}`);\n out.line(` Open ${out.cell(verificationUrl)}`);\n out.line();\n out.line(out.paint(\" Waiting for approval…\", \"dim\"));\n\n openBrowser(verificationUrl);\n\n let interval = device.interval ?? 5;\n const deadline = Date.now() + (device.expires_in ?? 900) * 1000;\n\n while (Date.now() < deadline) {\n // Never sleep past the code's own expiry (see nextPollDelay).\n const delay = nextPollDelay(interval, (deadline - Date.now()) / 1000);\n if (delay === null) {\n break;\n }\n await sleep(delay);\n\n const { data: token, error } = await authClient.device.token({\n grant_type: \"urn:ietf:params:oauth:grant-type:device_code\",\n device_code: device.device_code,\n client_id: CLIENT_ID,\n });\n\n // A 429 is transient by definition, and giving up on one abandoned a login\n // the human was about to approve — with \"Device authorization failed.\" as\n // the only clue, because the rate limiter answers a plain message and none\n // of the OAuth error codes below. Back off for as long as the server asks\n // (it answers `x-retry-after`), with a floor, and keep polling.\n if (error?.status === 429) {\n interval = Math.max(\n deviceTokenError.retryAfter(error) ?? interval * 2,\n MIN_BACKOFF,\n );\n continue;\n }\n\n if (token?.access_token) {\n await completeLogin(baseUrl, token.access_token);\n return;\n }\n\n if (!error) {\n continue;\n }\n\n switch (error.error) {\n case \"authorization_pending\":\n continue;\n case \"slow_down\":\n interval += 5;\n continue;\n case \"access_denied\":\n throw new CliError(\"Access denied — the request was rejected.\");\n default:\n // The server's own message, when it has one. Collapsing everything\n // that is not an OAuth code into \"Device authorization failed.\" is how\n // a rate-limit refusal looked like a broken device flow.\n throw new CliError(\n error.error_description ||\n deviceTokenError.message(error) ||\n `Device authorization failed (HTTP ${error.status}).`,\n );\n }\n }\n\n throw new CliError(\"The code expired before it was approved. Try again.\");\n}\n","/**\n * The client types this error as the OAuth code set alone, but the refusals that\n * actually broke `hepha login` carry neither — a rate limiter answers a plain\n * message and a status. Hence reading defensively off `unknown`.\n */\nexport const deviceTokenError = {\n /** What the server said, when it said anything at all. */\n message(error: unknown): string | undefined {\n if (!error || typeof error !== \"object\") {\n return undefined;\n }\n const message = (error as { message?: unknown }).message;\n return typeof message === \"string\" && message.length > 0\n ? message\n : undefined;\n },\n\n /** Better Auth answers `X-Retry-After`, the platform the standard header. */\n retryAfter(error: unknown): number | undefined {\n if (!error || typeof error !== \"object\") {\n return undefined;\n }\n const headers = (error as { headers?: unknown }).headers;\n if (!(headers instanceof Headers)) {\n return undefined;\n }\n const raw =\n headers.get(\"x-retry-after\") ?? headers.get(\"retry-after\") ?? undefined;\n if (!raw) {\n return undefined;\n }\n const seconds = Number(raw.trim());\n return Number.isFinite(seconds) && seconds > 0 ? seconds : undefined;\n },\n};\n","/**\n * How long to wait before the next attempt, or null when there is no time left.\n * A loop that tests its deadline only BEFORE sleeping slept a grown backoff in\n * full — minutes past the expiry of the device code, or of a follow's budget.\n */\nexport function nextPollDelay(\n interval: number,\n remainingSeconds: number,\n): number | null {\n if (remainingSeconds <= 0) {\n return null;\n }\n return Math.min(interval, remainingSeconds);\n}\n","import { spawn } from \"node:child_process\";\n\n/**\n * Best effort: on a headless box or over SSH there is no browser to open, so a\n * failure here is not an error — the URL is always printed as well.\n */\nexport function openBrowser(url: string): void {\n const command =\n process.platform === \"darwin\"\n ? \"open\"\n : process.platform === \"win32\"\n ? \"cmd\"\n : \"xdg-open\";\n const commandArgs =\n process.platform === \"win32\" ? [\"/c\", \"start\", \"\", url] : [url];\n\n try {\n const child = spawn(command, commandArgs, {\n stdio: \"ignore\",\n detached: true,\n });\n // A missing `xdg-open` (minimal containers, most SSH hosts) surfaces as an\n // ASYNCHRONOUS 'error' event that the try/catch cannot see. Unhandled, it\n // is an uncaught exception that kills the process mid-login — so the CLI\n // would stop polling instead of falling back to the printed URL.\n child.on(\"error\", () => {});\n child.unref();\n } catch {\n // Printing the URL is the fallback, and it already happened.\n }\n}\n","export const MIN_BACKOFF = 10;\n","// Every check in the codebase asks \"is this ADMIN?\", so a new role starts with\n// a member's reach: `guest` is narrowed explicitly, never implicitly.\nexport const USER_ROLES = {\n ADMIN: \"admin\",\n MEMBER: \"member\",\n GUEST: \"guest\",\n} as const;\n\nexport type UserRole = (typeof USER_ROLES)[keyof typeof USER_ROLES];\nexport const ALL_USER_ROLES = Object.values(USER_ROLES);\n\n/** Who may sign up unannounced. Anyone else needs a nominative invitation. */\nexport const ALLOWED_EMAIL_DOMAIN = \"@impulselab.ai\";\n\n/** How long a nominative invitation stays usable. */\nexport const INVITATION_TTL_DAYS = 14;\n\n/**\n * Public API scopes, in `resource:action` form. A Better Auth API key stores\n * them as its `permissions` map; a human session (browser cookie or a CLI\n * device-flow bearer token) implicitly holds every scope and is governed by\n * the user's role instead.\n *\n * Deliberately absent: `approvals:decide`, anything under `keys`, and\n * `devices:register` / `devices:revoke`. Guardrail decisions (VISION \"never\n * without explicit human validation\") and credential issuance are human-only\n * actions — no key can ever be granted them, so a leaked key can neither\n * approve a merge nor mint another key. Enrolling one of your machines and\n * cutting it off are the same kind of act: the machine IS a credential, so a\n * key must not be able to enrol another one or disown the one it runs on.\n */\nexport const API_SCOPES = [\n \"sessions:read\",\n \"sessions:write\",\n \"questions:read\",\n \"questions:answer\",\n \"approvals:read\",\n \"catalog:read\",\n \"pull_requests:read\",\n \"devices:read\",\n \"devices:write\",\n \"browser:read\",\n \"browser:write\",\n \"accounts:read\",\n \"inference:write\",\n] as const;\n\nexport type ApiScope = (typeof API_SCOPES)[number];\n\n/** Read-only, minus the browser vault: it names the services a human uses. */\nexport const DEFAULT_API_SCOPES: readonly ApiScope[] = API_SCOPES.filter(\n (scope) => scope.endsWith(\":read\") && !scope.startsWith(\"browser:\"),\n);\n\n/**\n * What the daemon on a paired machine is allowed to be. It is the equivalent\n * of a Daytona sandbox, not of its owner: open its channel, run what it is\n * sent, write the transcript back, publish its folders and its metrics.\n *\n * Everything else is absent on purpose, and each absence is a stolen-laptop\n * answer. No `browser:*`: the daemon must not read the vault of cookies its\n * owner captured. No `accounts:read`: it must not enumerate the subscription\n * pool. No `inference:write`: it must not spend on the org's gateway outside a\n * turn. No `approvals:read`, no `catalog:read`, no `pull_requests:read`. And\n * because `devices:register` / `devices:revoke` are not scopes at all, a\n * machine can neither enrol another one nor disown itself — those routes take\n * a human session, which the daemon no longer holds.\n */\nexport const MACHINE_API_SCOPES: readonly ApiScope[] = [\n \"devices:read\",\n \"devices:write\",\n \"sessions:read\",\n \"sessions:write\",\n \"questions:read\",\n];\n\n/** Prefix stamped on every issued key, so leaks are greppable. */\nexport const API_KEY_PREFIX = \"hepha_\";\n\n/**\n * Better Auth's own ceiling is 32, which `machine:<deviceId>` overruns by two:\n * a ULID is 26 characters and the label is eight. Raised rather than the name\n * shortened — the name is what a human reads next to a key in the UI, and the\n * device it names is the whole of its meaning.\n */\nexport const API_KEY_MAX_NAME_LENGTH = 64;\n\n/**\n * Browser session lifetime. Signing in is always \"remember me\": there is no\n * opt-out in the UI, so every sign-in path writes a PERSISTENT cookie that\n * survives closing the browser. `UPDATE_AGE` slides the expiry forward on use,\n * so an active human never sees the sign-in screen again.\n */\nexport const SESSION = {\n /** Cookie + session row lifetime: 30 days. */\n EXPIRES_IN: 60 * 60 * 24 * 30,\n /** Refresh the expiry at most once a day, to avoid a write per request. */\n UPDATE_AGE: 60 * 60 * 24,\n /** Cache the session row in memory for this long, to avoid a read per request. */\n COOKIE_CACHE_MAX_AGE: 60,\n} as const;\n\n/**\n * OAuth 2.0 device authorization grant (RFC 8628) — how the CLI logs a human\n * in without ever handling their password: it asks for a user code, the human\n * approves it on {BASE_URL}{VERIFICATION_PATH} in an already-signed-in\n * browser, and the CLI exchanges the device code for a session token.\n */\nexport const DEVICE_AUTHORIZATION = {\n /** Only these clients may open a device flow. */\n CLIENT_IDS: [\"hepha-cli\", \"hepha-extension\"],\n /** Lifetime of an unapproved user code. */\n EXPIRES_IN: \"15m\",\n /** Minimum delay the CLI must wait between two token polls. */\n INTERVAL: \"5s\",\n /** Page a human visits to approve a pending device. */\n VERIFICATION_PATH: \"/device\",\n /**\n * Per-IP ceiling on `/device/token`. The window is deliberately SHORTER than\n * INTERVAL: Better Auth only resets its counter when two requests are further\n * apart than the window, so a 5s poll under the default 60s window never reset\n * it and every login 429'd partway through the code's lifetime.\n */\n POLL_RATE_LIMIT: { WINDOW_SECONDS: 4, MAX_REQUESTS: 10 },\n} as const;\n\n// Copied by hand into the extension, which ships no build step and cannot\n// import this; `apps/browser-extension/test/limits-match-server.test.mjs` fails on drift.\nexport const BROWSER_CAPTURE_LIMITS = {\n COOKIES: 300,\n ORIGINS: 25,\n STORAGE_KEYS_PER_ORIGIN: 300,\n NAME_LENGTH: 1024,\n VALUE_LENGTH: 32_768,\n /** `JSON.stringify(state).length`: UTF-16 code units, not bytes. */\n TOTAL_CHARS: 1_000_000,\n LABEL_LENGTH: 120,\n USER_AGENT_LENGTH: 512,\n LOCALE_LENGTH: 64,\n EXTENSION_VERSION_LENGTH: 32,\n DOMAINS_PER_USER: 200,\n} as const;\n\n/**\n * Bounds of a registry skill, shared by every write path so the registry can\n * never hold a skill the edit form refuses to save back.\n *\n * The caps used to be restated per route, so a skill written through one path\n * could violate another's rule and become uneditable for good.\n */\nexport const SKILL_LIMITS = {\n /** Kebab-case slug, matched verbatim by `buildHarnessSkills`. */\n NAME_PATTERN: /^[a-z0-9]+(-[a-z0-9]+)*$/,\n NAME_MAX_LENGTH: 80,\n /** Not a title: the full \"use this when…\" trigger list drives matching. */\n DESCRIPTION_MAX_LENGTH: 2000,\n /** Relative POSIX path of a supporting file bundled with the skill. */\n FILE_PATH_MAX_LENGTH: 200,\n /** One activation scope entry: a repo full name or a channel id. */\n ACTIVATION_SCOPE_MAX_LENGTH: 120,\n} as const;\n\n/** Reserved: the harness materializes the skill body as SKILL.md. */\nexport const SKILL_BODY_FILENAME = \"skill.md\";\n\n/** The auto-maintained global review-lessons skill; per-repo names come from\n * utils/review-lesson-skill-name.ts. */\nexport const REVIEW_LESSONS_SKILL_NAME = \"review-lessons\";\n\n// Derived by Chrome from the RSA key in `apps/browser-extension/manifest.json`.\n// One exact id, never a wildcard: trusted origins also allowlist redirects.\nexport const BROWSER_EXTENSION_ORIGIN =\n \"chrome-extension://ieppdghbneelaninllkeimfcdnccbblj\";\n\n// Human code-quality rating: every criterion of the rubric is scored on this\n// scale. Client-safe, so the rating card can render the buttons without pulling\n// in the server-only database entry.\nexport const QUALITY_SCORE_MIN = 1;\n\nexport const QUALITY_SCORE_MAX = 5;\n\n/** rebase_only | queued — mirrors `pull_request_merge_intent_mode`. */\nexport const MERGE_INTENT_MODES = [\"rebase_only\", \"queued\"] as const;\n\n/** How long an unattached auto-rebase claim keeps exclusive branch ownership. */\nexport const AUTO_REBASE_CLAIM_MS = 30 * 60 * 1000;\n","import { DEVICE_AUTHORIZATION } from \"@repo/database/constants\";\nexport const CLIENT_ID = DEVICE_AUTHORIZATION.CLIENT_IDS[0];\n","export function sleep(seconds: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, seconds * 1000));\n}\n","import { api } from \"@/lib/api/api\";\nimport { config } from \"@/lib/shared/config\";\nimport { out } from \"@/lib/output/out\";\nimport type { ApiOutputs } from \"@/lib/api/api-outputs\";\n\nexport async function completeLogin(\n baseUrl: string,\n token: string,\n): Promise<void> {\n const identity = await api<ApiOutputs[\"me\"][\"get\"]>(\"/me\", {\n as: { baseUrl, token },\n });\n config.save({\n baseUrl,\n token,\n user: {\n id: identity.user.id,\n name: identity.user.name,\n email: identity.user.email,\n },\n });\n out.line();\n out.line(\n `${out.paint(\"✓\", \"green\")} Signed in as ${identity.user.email} on ${baseUrl}`,\n );\n out.line(out.paint(` Session stored in ${config.path}`, \"dim\"));\n}\n","import { config } from \"@/lib/shared/config\";\nimport { CliError } from \"@/lib/cli/cli-error\";\nimport { isHttpUrl } from \"@/lib/http/is-http-url\";\nimport type { ParsedArgs } from \"@/lib/parsed/parsed-args\";\n\nexport function resolveLoginBaseUrl(parsed: ParsedArgs): string {\n const requested = parsed.flags.url?.trim();\n if (requested !== undefined && !isHttpUrl(requested)) {\n throw new CliError(`--url is not a valid http(s) URL: \"${requested}\".`, 2);\n }\n return (requested ?? config.load().baseUrl).replace(/\\/$/, \"\");\n}\n","import { args } from \"../../lib/args/args\";\nimport { config } from \"../../lib/shared/config\";\nimport { out } from \"../../lib/output/out\";\nimport type { ParsedArgs } from \"@/lib/parsed/parsed-args\";\n\n/** Forgets the local session only; issued API keys keep working. */\nexport function logoutCommand(parsed: ParsedArgs): void {\n args.expect(parsed, {});\n\n config.clear();\n\n if (parsed.booleans.has(\"json\")) {\n out.json({ signedOut: true });\n return;\n }\n\n out.line(\"Signed out.\");\n}\n","export const LIMITS = {\n QUESTION_ID: 40,\n OPTION_ID: 40,\n OPTIONS_PER_ANSWER: 50,\n FREE_TEXT: 10_000,\n ANSWERS: 50,\n} as const;\n","import { LIMITS } from \"@/commands/answers/collect-answers-constants\";\nimport { CliError } from \"@/lib/cli/cli-error\";\n\nexport function validateFreeText(\n value: string | undefined,\n label: string,\n): void {\n if (value === undefined) {\n return;\n }\n const freeText = value.trim();\n if (freeText.length === 0) {\n throw new CliError(`${label} has empty free text.`, 2);\n }\n if (freeText.length > LIMITS.FREE_TEXT) {\n throw new CliError(\n `${label} has free text longer than ${LIMITS.FREE_TEXT} characters.`,\n 2,\n );\n }\n}\n","import { LIMITS } from \"@/commands/answers/collect-answers-constants\";\nimport { CliError } from \"@/lib/cli/cli-error\";\n\nexport function validateSelectedOptionIds(\n options: string[] | undefined,\n label: string,\n): void {\n if (options === undefined) {\n return;\n }\n if (options.length > LIMITS.OPTIONS_PER_ANSWER) {\n throw new CliError(\n `${label} selects more than ${LIMITS.OPTIONS_PER_ANSWER} options.`,\n 2,\n );\n }\n for (const id of options) {\n if (id.trim().length === 0) {\n throw new CliError(`${label} has an empty option id.`, 2);\n }\n if (id.trim().length > LIMITS.OPTION_ID) {\n throw new CliError(\n `${label} has an option id longer than ${LIMITS.OPTION_ID} characters.`,\n 2,\n );\n }\n }\n}\n","import { CliError } from \"@/lib/cli/cli-error\";\nimport { LIMITS } from \"@/commands/answers/collect-answers-constants\";\nimport type { Answer } from \"@/commands/answer/answer\";\nimport { validateFreeText } from \"@/commands/answer/validate-free-text\";\nimport { validateSelectedOptionIds } from \"@/commands/answer/validate-selected-option-ids\";\n/** `label` names the source — `--answers[2]` or `--option q1=…` — because both\n * entry paths build the same shape and must fail identically. */\nexport function validateAnswer(answer: Answer, label: string): void {\n // The ONE field the server does not trim, so its ceiling applies to the raw\n // value. Emptiness is checked more strictly than the API on purpose: a blank\n // id passes `min(1)` and then matches no question, leaving the round silently\n // unanswered.\n if (answer.questionId.trim().length === 0) {\n throw new CliError(`${label} needs a non-empty \"questionId\".`, 2);\n }\n if (answer.questionId.length > LIMITS.QUESTION_ID) {\n throw new CliError(\n `${label} has a \"questionId\" longer than ${LIMITS.QUESTION_ID} characters.`,\n 2,\n );\n }\n\n const options = answer.selectedOptionIds;\n validateSelectedOptionIds(options, label);\n validateFreeText(answer.freeText, label);\n\n // The server's own rule; `--option q1=,,` reaches exactly this shape.\n if (\n (options === undefined || options.length === 0) &&\n answer.freeText === undefined\n ) {\n throw new CliError(\n `${label} answers nothing. Give it at least one option id or some free text.`,\n 2,\n );\n }\n}\n","import { validateAnswer } from \"@/commands/answer/validate-answer\";\nimport type { Answer } from \"@/commands/answer/answer\";\nimport { CliError } from \"@/lib/cli/cli-error\";\n\nexport function parseAnswerEntry(entry: unknown, label: string): Answer {\n if (!entry || typeof entry !== \"object\" || Array.isArray(entry)) {\n throw new CliError(`${label} must be an object.`, 2);\n }\n\n const answer = entry as Record<string, unknown>;\n if (typeof answer.questionId !== \"string\") {\n throw new CliError(`${label} needs a non-empty \"questionId\".`, 2);\n }\n if (\n answer.selectedOptionIds !== undefined &&\n (!Array.isArray(answer.selectedOptionIds) ||\n answer.selectedOptionIds.some((id) => typeof id !== \"string\"))\n ) {\n throw new CliError(\n `${label}.selectedOptionIds must be an array of strings.`,\n 2,\n );\n }\n if (answer.freeText !== undefined && typeof answer.freeText !== \"string\") {\n throw new CliError(`${label}.freeText must be a string.`, 2);\n }\n\n const parsed = entry as Answer;\n validateAnswer(parsed, label);\n return parsed;\n}\n","import { CliError } from \"@/lib/cli/cli-error\";\nimport { LIMITS } from \"@/commands/answers/collect-answers-constants\";\nimport type { Answers } from \"@/commands/answers/answers\";\nimport { parseAnswerEntry } from \"@/commands/answers/parse-answer-entry\";\n/** `--answers '{}'` used to sail through `JSON.parse` and be posted as\n * `{\"answers\": {}}`, contradicting the CLI's own error message. */\nexport function parseAnswersFlag(raw: string): Answers {\n let decoded: unknown;\n try {\n decoded = JSON.parse(raw);\n } catch {\n throw new CliError(\"--answers expects a JSON array.\", 2);\n }\n\n if (!Array.isArray(decoded) || decoded.length === 0) {\n throw new CliError(\n '--answers expects a non-empty JSON array, e.g. \\'[{\"questionId\":\"q1\",\"selectedOptionIds\":[\"1\"]}]\\'.',\n 2,\n );\n }\n\n if (decoded.length > LIMITS.ANSWERS) {\n throw new CliError(\n `--answers carries more than ${LIMITS.ANSWERS} entries.`,\n 2,\n );\n }\n\n for (const [index, entry] of decoded.entries()) {\n parseAnswerEntry(entry, `--answers[${index}]`);\n }\n\n return decoded as Answers;\n}\n","import { CliError } from \"../../lib/cli/cli-error\";\nimport { LIMITS } from \"@/commands/answers/collect-answers-constants\";\nimport type { Answers } from \"@/commands/answers/answers\";\nimport type { Answer } from \"@/commands/answer/answer\";\nimport { validateAnswer } from \"@/commands/answer/validate-answer\";\nimport { parseAnswersFlag } from \"@/commands/answers/parse-answers-flag\";\nimport type { ParsedArgs } from \"@/lib/parsed/parsed-args\";\n\n/** `--option <questionId>=1,2` and `--text <questionId>=…`, or `--answers <json>`. */\nexport function collectAnswers(parsed: ParsedArgs): Answers {\n if (parsed.flags.answers) {\n return parseAnswersFlag(parsed.flags.answers);\n }\n\n const byQuestion = new Map<string, Answer>();\n\n const put = (pair: string, apply: (entry: Answer) => void) => {\n const equalsAt = pair.indexOf(\"=\");\n if (equalsAt < 0) {\n throw new CliError(`Expected <questionId>=<value>, got \"${pair}\".`, 2);\n }\n const questionId = pair.slice(0, equalsAt);\n const entry = byQuestion.get(questionId) ?? { questionId };\n apply(entry);\n byQuestion.set(questionId, entry);\n };\n\n for (const pair of parsed.repeated.option ?? []) {\n put(pair, (entry) => {\n entry.selectedOptionIds = pair\n .slice(pair.indexOf(\"=\") + 1)\n .split(\",\")\n .map((id) => id.trim())\n .filter(Boolean);\n });\n }\n\n for (const pair of parsed.repeated.text ?? []) {\n put(pair, (entry) => {\n entry.freeText = pair.slice(pair.indexOf(\"=\") + 1);\n });\n }\n\n const answers = [...byQuestion.values()];\n if (answers.length === 0) {\n throw new CliError(\n \"Nothing to submit. Use --option <questionId>=<ids>, --text <questionId>=<answer>, or --answers <json>.\",\n 2,\n );\n }\n if (answers.length > LIMITS.ANSWERS) {\n throw new CliError(\n `More than ${LIMITS.ANSWERS} answers in one submission.`,\n 2,\n );\n }\n\n for (const answer of answers) {\n validateAnswer(answer, `--option/--text ${answer.questionId}`);\n }\n\n return answers;\n}\n","export const ACTIONS = [\"list\", \"show\", \"answer\", \"cancel\"] as const;\n","import { api } from \"@/lib/api/api\";\nimport { expectShape } from \"@/lib/expect/expect-shape\";\nimport { is } from \"@/lib/is/is\";\nimport { out } from \"@/lib/output/out\";\nimport { path } from \"@/lib/path/path\";\nimport type { ApiOutputs } from \"@/lib/api/api-outputs\";\n\nexport async function listQuestions(\n sessionId: string | undefined,\n asJson: boolean,\n): Promise<void> {\n const result = expectShape<ApiOutputs[\"questions\"][\"list\"]>(\n await api(\n sessionId ? path`/sessions/${sessionId}/questions` : \"/questions\",\n ),\n \"GET /questions\",\n { items: is.array },\n );\n if (asJson) {\n out.json(result);\n return;\n }\n if (result.items.length === 0) {\n out.line(\"Nothing waiting on you.\");\n return;\n }\n out.table(\n result.items.map((batch) => [\n out.cell(batch.id),\n out.cell(batch.sessionId),\n `${batch.questions.length} question(s)`,\n out.cell(batch.sessionTitle),\n ]),\n );\n}\n","import type { Batch } from \"@/commands/batch/batch\";\nimport { out } from \"@/lib/output/out\";\n\nexport function printBatchQuestion(question: Batch[\"questions\"][number]): void {\n out.line();\n if (question.header) {\n out.line(out.paint(out.cell(question.header), \"dim\"));\n }\n out.line(\n `${out.paint(out.cell(question.id), \"dim\")} ${out.safe(question.body)}`,\n );\n if (question.image) {\n out.line(out.paint(` (image) ${out.cell(question.image)}`, \"dim\"));\n }\n for (const option of question.options) {\n const recommended = option.id === question.recommendedOptionId;\n // Image-only options still need an identifiable terminal label.\n const label = option.label\n ? out.cell(option.label)\n : option.image\n ? out.paint(`(image) ${out.cell(option.image)}`, \"dim\")\n : out.paint(\"(no label)\", \"dim\");\n out.line(\n ` ${out.cell(option.id)}) ${label}${recommended ? out.paint(\" ← recommended\", \"green\") : \"\"}`,\n );\n }\n if (question.allowFreeText) {\n out.line(out.paint(\" free text accepted\", \"dim\"));\n }\n}\n","import { out } from \"@/lib/output/out\";\nimport type { Batch } from \"@/commands/batch/batch\";\nimport { printBatchQuestion } from \"@/commands/batch/print-batch-question\";\nexport function printBatch(batch: Batch): void {\n // Questions are agent-authored text — sanitise before printing (out.safe).\n out.line(\n `${out.paint(out.cell(batch.sessionTitle), \"bold\")} ${out.paint(`round ${batch.round}`, \"dim\")}`,\n );\n out.line(\n out.paint(\n `batch ${out.cell(batch.id)} · session ${out.cell(batch.sessionId)}`,\n \"dim\",\n ),\n );\n\n for (const question of batch.questions) {\n printBatchQuestion(question);\n }\n}\n","import { api } from \"../../lib/api/api\";\nimport { path } from \"../../lib/path/path\";\nimport { args } from \"../../lib/args/args\";\nimport { collectAnswers } from \"../answers/collect-answers\";\nimport { expectShape } from \"../../lib/expect/expect-shape\";\nimport { is } from \"../../lib/is/is\";\nimport { out } from \"../../lib/output/out\";\nimport { ACTIONS } from \"@/commands/questions/questions-constants\";\nimport type { Batch } from \"@/commands/batch/batch\";\nimport { listQuestions } from \"@/commands/questions/list-questions\";\nimport { printBatch } from \"@/commands/batch/print-batch\";\nimport type { ApiOutputs } from \"@/lib/api/api-outputs\";\nimport type { ParsedArgs } from \"@/lib/parsed/parsed-args\";\n\n/**\n * A session with an unanswered round parks forever. Answering is a normal\n * scope, so an agent can do it; only guardrail decisions need a human.\n */\nexport async function questionsCommand(parsed: ParsedArgs): Promise<void> {\n const action = args.action(parsed, \"questions\", ACTIONS, \"list\");\n const asJson = parsed.booleans.has(\"json\");\n\n if (action === \"list\") {\n args.expect(parsed, { flags: [\"session\"], positional: 1 });\n return await listQuestions(parsed.flags.session, asJson);\n }\n\n args.expect(parsed, {\n positional: 2,\n ...(action === \"answer\" ? { flags: [\"option\", \"text\", \"answers\"] } : {}),\n });\n const batchId = args.required(parsed, 1, \"batchId\");\n\n if (action === \"show\") {\n const batch = expectShape<Batch>(\n await api(path`/questions/${batchId}`),\n \"GET /questions/{id}\",\n { id: is.string, questions: is.array, sessionTitle: is.string },\n );\n if (asJson) {\n out.json(batch);\n return;\n }\n printBatch(batch);\n return;\n }\n\n if (action === \"answer\") {\n const result = expectShape<ApiOutputs[\"questions\"][\"submit\"]>(\n await api(path`/questions/${batchId}/submit`, {\n method: \"POST\",\n body: { answers: collectAnswers(parsed) },\n }),\n \"POST /questions/{id}/submit\",\n { answeredCount: is.number },\n );\n if (asJson) {\n out.json(result);\n return;\n }\n out.line(\n `${out.paint(\"✓\", \"green\")} Answered ${result.answeredCount} question(s); the session resumes.`,\n );\n return;\n }\n\n const result = await api<ApiOutputs[\"questions\"][\"cancel\"]>(\n path`/questions/${batchId}/cancel`,\n { method: \"POST\", body: {} },\n );\n if (asJson) {\n out.json(result);\n return;\n }\n out.line(\n 'Round cancelled. The session stays parked — send a message to steer it: `hepha sessions send <id> \"…\"`',\n );\n}\n","export const POLL_SECONDS = 3;\n\nexport const PAGE_SIZE = 200;\n","export const ADVISOR_NOTE_SEVERITIES = [\n \"note\",\n \"warn\",\n \"alert\",\n \"suggestion\",\n] as const;\nexport const ADVISOR_NOTE_STATUSES = [\n \"posted\",\n \"pending\",\n \"confirmed\",\n \"dismissed\",\n] as const;\n\ntype AdvisorNoteSeverityLiteral = (typeof ADVISOR_NOTE_SEVERITIES)[number];\ntype AdvisorNoteStatusLiteral = (typeof ADVISOR_NOTE_STATUSES)[number];\n\nexport const ADVISOR_NOTE_SEVERITY = {\n NOTE: \"note\",\n WARN: \"warn\",\n ALERT: \"alert\",\n SUGGESTION: \"suggestion\",\n} as const satisfies {\n [Severity in AdvisorNoteSeverityLiteral as Uppercase<Severity>]: Severity;\n};\n\nexport const ADVISOR_NOTE_STATUS = {\n POSTED: \"posted\",\n PENDING: \"pending\",\n CONFIRMED: \"confirmed\",\n DISMISSED: \"dismissed\",\n} as const satisfies {\n [Status in AdvisorNoteStatusLiteral as Uppercase<Status>]: Status;\n};\n\nexport const ADVISOR_ALERT_SOURCE = \"advisor_alert\";\nexport const ADVISOR_WARNING_SOURCE = \"advisor_warning\";\nexport const ADVISOR_SUGGESTION_SOURCE = \"advisor_suggestion\";\nexport const ADVISOR_TRANSCRIPT_SOURCE = \"advisor_transcript\";\nexport const ADVISOR_PASS_FAILURE_SOURCE = \"advisor_pass_failure\";\nexport const ADVISOR_ALERT_DELIVERY_FAILURE_SOURCE =\n \"advisor_alert_delivery_failure\";\nexport const ADVISOR_PASS_FAILURE_DEDUPE_KEY = \"advisor-pass-failure-active\";\nexport const ADVISOR_ALERT_DELIVERY_FAILURE_DEDUPE_KEY =\n \"advisor-alert-delivery-failure\";\nexport const ADVISOR_NOTE_EVENT_TYPE = \"advisor_note\";\nexport const ADVISOR_NOTE_PART_KIND = \"advisor\";\nexport const ADVISOR_WARN_NOTIFICATION_TYPE = \"advisor_warn\";\nexport const ADVISOR_ALERT_NOTIFICATION_TYPE = \"advisor_alert\";\nexport const ADVISOR_THROUGH_SEQUENCE_KEY = \"advisorThroughSequence\";\n","import { ADVISOR_NOTE_SEVERITY, ADVISOR_NOTE_STATUS } from \"./constants\";\n\n// A warning confirmed before auto-forwarding was steered without a `steered`\n// flag: the old decision path only moved the status.\nexport function advisorNoteWasDelivered(note: {\n severity?: unknown;\n status?: unknown;\n steered?: unknown;\n}): boolean {\n return (\n note.steered === true ||\n (note.severity === ADVISOR_NOTE_SEVERITY.WARN &&\n note.status === ADVISOR_NOTE_STATUS.CONFIRMED)\n );\n}\n","import { out } from \"@/lib/output/out\";\n/** Sanitised first: transcript text is model, tool and repository output. */\nexport function truncate(text: string, max = 2000): string {\n const trimmed = out.safe(text).trim();\n return trimmed.length > max ? `${trimmed.slice(0, max)}…` : trimmed;\n}\n","import { ADVISOR_NOTE_SEVERITY } from \"@repo/database/advisor-constants\";\nimport { advisorNoteWasDelivered } from \"@repo/database/advisor-note-was-delivered\";\n\nimport { out } from \"../output/out\";\nimport { truncate } from \"@/lib/truncate/truncate\";\nimport type { TranscriptEvent } from \"@/lib/event/transcript-event\";\n\n/** Not the agent's words: the advisor watches the session from the outside. */\nexport function formatAdvisorPart(\n part: Extract<TranscriptEvent[\"part\"], { kind: \"advisor\" }>,\n): string {\n const note = truncate(part.text, 400);\n // The send, never the effect: queued steering waits for the agent's next turn.\n const delivery = advisorNoteWasDelivered(part)\n ? \"sent to the agent\"\n : \"not delivered\";\n switch (part.severity) {\n case ADVISOR_NOTE_SEVERITY.ALERT:\n return out.paint(`advisor alert, ${delivery}: ${note}`, \"red\");\n case ADVISOR_NOTE_SEVERITY.WARN:\n return out.paint(`advisor warning, ${delivery}: ${note}`, \"yellow\");\n case ADVISOR_NOTE_SEVERITY.SUGGESTION: {\n const named = part.skillName ? ` ${part.skillName}` : \"\";\n // \"offered\", not \"sent\": the agent decides whether to load the skill.\n const offer =\n delivery === \"not delivered\" ? delivery : \"offered to the agent\";\n return out.paint(\n `advisor skill suggestion${named}, ${offer}: ${note}`,\n \"blue\",\n );\n }\n case ADVISOR_NOTE_SEVERITY.NOTE:\n return out.paint(`advisor ${note}`, \"dim\");\n default:\n return part.severity satisfies never;\n }\n}\n","/** Re-signs on every click behind the session's read gate: this never expires. */\nexport function deliverableDownloadPath(\n sessionId: string,\n pathname: string,\n options?: { inline?: boolean },\n): string {\n const query = new URLSearchParams({ pathname });\n if (options?.inline) {\n query.set(\"disposition\", \"inline\");\n }\n return `/api/sessions/${sessionId}/deliverables?${query.toString()}`;\n}\n","/** Bytes as a short human-readable size (B / KB / MB). */\nexport function formatAttachmentSize(bytes: number): string {\n if (bytes < 1024) {\n return `${bytes} B`;\n }\n const kb = bytes / 1024;\n if (kb < 1024) {\n return `${kb.toFixed(0)} KB`;\n }\n return `${(kb / 1024).toFixed(1)} MB`;\n}\n","import { deliverableDownloadPath } from \"@repo/realtime/events/deliverable-download-path\";\nimport { formatAttachmentSize } from \"@repo/realtime/events/format-attachment-size\";\n\nimport { out } from \"../output/out\";\nimport type { DeliverablePart } from \"@repo/realtime/events/deliverable-part\";\n\n/** The durable auth-gated route: a signed Blob URL in a log is replayable. */\nexport function formatDeliverablePart(\n part: DeliverablePart,\n sessionId: string,\n baseUrl: string,\n): string {\n const entries = part.archive ? `, ${part.archive.entryCount} entries` : \"\";\n const size = `${formatAttachmentSize(part.sizeBytes)}${entries}`;\n const caption = part.caption ? ` - ${out.cell(part.caption)}` : \"\";\n const link = `${baseUrl}${deliverableDownloadPath(sessionId, part.pathname)}`;\n return `${out.paint(\"attach\", \"dim\")} ${out.cell(part.name)} ${out.paint(`(${size})`, \"dim\")}${caption}\\n ${out.cell(link)}`;\n}\n","// HarnessAgent termination modes mapping exactly to the session lifecycle\n// (docs/03-harnesses/01-harness-agent.md): destroy() = end, detach() = park\n// warm, stop() = park cold, suspendTurn() = cross-process handoff.\nexport const SESSION_TERMINATION_MODES = {\n DESTROY: \"destroy\",\n DETACH: \"detach\",\n STOP: \"stop\",\n SUSPEND_TURN: \"suspend-turn\",\n} as const;\n\nexport type SessionTerminationMode =\n (typeof SESSION_TERMINATION_MODES)[keyof typeof SESSION_TERMINATION_MODES];\nexport const ALL_SESSION_TERMINATION_MODES = Object.values(\n SESSION_TERMINATION_MODES,\n);\n\n// Platform host tools exposed to every harness\n// (docs/03-harnesses/01-harness-agent.md, host tools row).\nexport const HOST_TOOL_NAMES = {\n ADVISE: \"advise\",\n ASK_USER: \"ask_user\",\n SAVE_DEV_ENV_MANIFEST: \"save_dev_env_manifest\",\n REQUEST_DEV_ENV_CREDENTIALS: \"request_dev_env_credentials\",\n // Its sibling for every OTHER task type: the value is stored for the repo\n // and pushed to its Vercel project (docs/integrations/env-vars.md).\n REQUEST_ENV_VARS: \"request_env_vars\",\n GENERATE_DEV_ENV_SECRET: \"generate_dev_env_secret\",\n SET_DEV_ENV_SIZING: \"set_dev_env_sizing\",\n BAKE_DEV_ENV: \"bake_dev_env\",\n PROPOSE_PLAN: \"propose_plan\",\n REPORT_CONFIDENCE: \"report_confidence\",\n REQUEST_GUARDRAIL_APPROVAL: \"request_guardrail_approval\",\n // Somnium, mid-run: the automatic recall only fires on a session's FIRST\n // prompt, so the agent reads on demand and writes what it learns.\n MEMORY_SEARCH: \"memory_search\",\n MEMORY_WRITE: \"memory_write\",\n // Another chat, read through a separate model for one goal, never loaded\n // whole (docs/agents/session-reading.md).\n READ_SESSION: \"read_session\",\n // A project's shared context (docs/agents/projects.md): every session of the\n // project reads it in its instructions and writes back what it learned.\n PROJECT_CONTEXT_READ: \"project_context_read\",\n PROJECT_CONTEXT_WRITE: \"project_context_write\",\n SKILL_SEARCH: \"skill_search\",\n SKILL_LOAD: \"skill_load\",\n SAVE_SKILL: \"save_skill\",\n RECORD_REVIEW_LESSON: \"record_review_lesson\",\n // Proposes an EDIT to a skill already in the registry: a version above the\n // skill's current one, invisible to sessions until a human approves it\n // (docs/08-skills/01-registry.md).\n PROPOSE_SKILL_EDIT: \"propose_skill_edit\",\n DELIVERABLE_PUBLISH: \"deliverable_publish\",\n // Design mode: pull a round of static bundles out of the sandbox, store them\n // as immutable versions, and hand back the public link the panel mirrors.\n PUBLISH_DESIGN: \"publish_design\",\n SET_LIVE_DESIGN: \"set_live_design\",\n SUBMIT_SPECS: \"submit_specs\",\n SET_BRAND_KIT: \"set_brand_kit\",\n PLAN_TICKETS: \"plan_tickets\",\n // Run engine seats (docs/agents/software-factory.md): the foundation session\n // reports its checklist, the merge-decision session settles a ticket's PR,\n // the QA session settles the verification phase.\n MARK_PROVISIONING_STEP: \"mark_provisioning_step\",\n DECIDE_MERGE: \"decide_merge\",\n DECIDE_QA: \"decide_qa\",\n // Advisory dynamic playbook (WS6): the agent defines its own ordered steps\n // (set_steps) and fills each step's todo checklist (set_todos). Replaces the\n // fixed 5-phase set_phase pointer; neither parks the turn, the runner park\n // logic is untouched. A step's status is derived from its todos.\n SET_STEPS: \"set_steps\",\n SET_TODOS: \"set_todos\",\n // The chat's title is generated from the FIRST prompt by the platform's\n // small model. This lets the agent correct it mid-run when the real scope\n // turns out to be something else, and only then (see the pipeline\n // templates). Refused once a human has renamed the chat; never parks.\n RENAME_SESSION: \"rename_session\",\n // Files an issue in Hephaistos' own Linear tracker; never parks the turn.\n REPORT_HARNESS_ISSUE: \"report_harness_issue\",\n REPORT_DEV_SERVER: \"report_dev_server\",\n RUN_VALIDATION: \"run_validation\",\n REVIEW_SCOPE: \"review_scope\",\n FILTER_REVIEW_FINDINGS: \"filter_review_findings\",\n // Media tool (Stage 1): generate images host-side via the AI Gateway; the\n // result renders inline in the thread. Always available, never parks the\n // turn.\n GENERATE_IMAGE: \"generate_image\",\n // In-sandbox annotation (#43): renders the source image + an SVG overlay in\n // the sandbox's chromium and screenshots it. NEVER host-side, the previous\n // @napi-rs/canvas implementation broke the glibc Trigger.dev worker deploy.\n ANNOTATE_IMAGE: \"annotate_image\",\n // WS8: the admin-configured image_generator registry, the agent reads the\n // enabled {model, description} rows to pick a model for generate_image.\n GET_IMAGE_GENERATORS: \"get_image_generators\",\n // Capture tools (Stage 2): drive a headless chromium INSIDE the session's\n // sandbox to screenshot / record a running app URL (or a file:// the agent\n // rendered), then attach the result inline. Provision the sandbox on demand\n // (WS7), always exposed.\n TAKE_SCREENSHOT: \"take_screenshot\",\n RECORD_VIDEO: \"record_video\",\n // Interactive browser control: ONE persistent chromium per sandbox, one\n // context per session, driven by the in-sandbox daemon (packages/tasks\n // lib/browser). The snapshot is an accessibility tree with `ref=eN` handles\n // the act tool targets, no coordinates, no throwaway playwright script.\n BROWSER_NAVIGATE: \"browser_navigate\",\n BROWSER_SNAPSHOT: \"browser_snapshot\",\n BROWSER_ACT: \"browser_act\",\n // The same page loop, decided by Jev instead of an agent turn: one call\n // walks a whole flow (docs/agents/browser-control.md).\n BROWSER_AUTOPILOT: \"browser_autopilot\",\n BROWSER_WAIT: \"browser_wait\",\n BROWSER_INSPECT: \"browser_inspect\",\n BROWSER_SCREENSHOT: \"browser_screenshot\",\n // A recording is a PAIR: playwright only films a context it created with\n // recording on, so start recycles the context and stop hands back the clip.\n BROWSER_RECORD_START: \"browser_record_start\",\n BROWSER_RECORD_STOP: \"browser_record_stop\",\n BROWSER_CLOSE: \"browser_close\",\n // The escape hatch: JS evaluated in a Node context that SURVIVES between\n // calls, with the live page bound into it.\n REPL_EVAL: \"repl_eval\",\n REPL_RESET: \"repl_reset\",\n // WS5: upload a PNG the agent produced in the sandbox (script/python/write)\n // as a media reference, silent for ask_user option images, inline otherwise.\n ATTACH_IMAGE: \"attach_image\",\n // Browser-session vault: sites a human captured with the Hephaistos\n // extension, applied to the live browser one domain at a time, on demand.\n BROWSER_SESSIONS_LIST: \"browser_sessions_list\",\n BROWSER_USE_SESSION: \"browser_use_session\",\n BROWSER_FORGET_SESSION: \"browser_forget_session\",\n // Outbound files: any format the human should keep, uploaded from the sandbox\n // to durable storage and downloadable once the sandbox is gone.\n ATTACH_FILE: \"attach_file\",\n // Delegation: a task is the work, a session is one attempt at it. The agent\n // describes the task and the PLATFORM dispatches it; these address the task,\n // never a runner. Fire-and-forget, none of them park the turn.\n CREATE_TASK: \"create_task\",\n LIST_TASKS: \"list_tasks\",\n UPDATE_TASK: \"update_task\",\n PEEK_TASK: \"peek_task\",\n SEND_TO_TASK: \"send_to_task\",\n STOP_TASK: \"stop_task\",\n PICKUP_TASK: \"pickup_task\",\n // A JS script whose agent() calls ARE platform tasks (docs/agents/workflows.md).\n WORKFLOW: \"workflow\",\n // docs/integrations/database-access.md; detect is environment-setup only.\n DATABASE_QUERY: \"database_query\",\n DATABASE_WRITE: \"database_write\",\n DETECT_PROJECT_DATABASE: \"detect_project_database\",\n BIND_PROJECT_DATABASE: \"bind_project_database\",\n // Historical: the agent-addressed family the tools above replaced. No agent\n // can call them, but old transcripts still render rows named after them.\n SPAWN_AGENT: \"spawn_agent\",\n LIST_AGENTS: \"list_agents\",\n PEEK_AGENT: \"peek_agent\",\n SEND_TO_AGENT: \"send_to_agent\",\n STOP_AGENT: \"stop_agent\",\n} as const;\n\nexport type HostToolName =\n (typeof HOST_TOOL_NAMES)[keyof typeof HOST_TOOL_NAMES];\nexport const ALL_HOST_TOOL_NAMES = Object.values(HOST_TOOL_NAMES);\n\nexport const TURN_CLOSING_TOOL_NAMES: readonly HostToolName[] = [\n HOST_TOOL_NAMES.UPDATE_TASK,\n HOST_TOOL_NAMES.CREATE_TASK,\n];\n\n// The file and shell tools the worker runs against the session VM\n// (@repo/tasks `remoteWorkspaceTools`). They shadow the harness' native\n// builtins field for field, so anything reading a tool call by name, the\n// transcript, the chat mirrors, must map them back onto the native family.\nexport const WORKSPACE_TOOL_NAMES = {\n BASH: \"workspace_bash\",\n READ: \"workspace_read\",\n WRITE: \"workspace_write\",\n EDIT: \"workspace_edit\",\n GLOB: \"workspace_glob\",\n GREP: \"workspace_grep\",\n TASK_OUTPUT: \"workspace_task_output\",\n TASK_STOP: \"workspace_task_stop\",\n} as const;\n\nexport type WorkspaceToolName =\n (typeof WORKSPACE_TOOL_NAMES)[keyof typeof WORKSPACE_TOOL_NAMES];\n\n/**\n * MCP namespace the bridge registers the platform's own toolbox under. Only\n * this namespace may be dropped when matching a tool call by name: a\n * third-party server is free to expose its own `read` or `create_task`, and\n * stripping its namespace too would let it borrow a built-in's label.\n */\nexport const HARNESS_MCP_NAMESPACE = \"mcp__harness-tools__\";\n\n// How a `send_to_task` message reaches an attempt that is already working:\n// abort the current turn immediately, stop it at the next settled tool call,\n// or wait for its next turn.\nexport const AGENT_MESSAGE_DELIVERY_MODES = {\n INTERRUPT: \"interrupt\",\n AFTER_TOOL: \"after_tool\",\n QUEUE: \"queue\",\n} as const;\n\nexport type AgentMessageDeliveryMode =\n (typeof AGENT_MESSAGE_DELIVERY_MODES)[keyof typeof AGENT_MESSAGE_DELIVERY_MODES];\nexport const ALL_AGENT_MESSAGE_DELIVERY_MODES = Object.values(\n AGENT_MESSAGE_DELIVERY_MODES,\n);\nexport const DEFAULT_AGENT_MESSAGE_DELIVERY_MODE =\n AGENT_MESSAGE_DELIVERY_MODES.AFTER_TOOL;\nexport const PARKED_TOOL_CALL_OUTPUT =\n \"The session parked on this call, the turn ended here.\";\n/** `payload.source` of a steering row written by a parent session. */\nexport const AGENT_MESSAGE_SOURCE_PARENT_SESSION = \"parent_session\";\n/** `payload.source` of a steering row a child session wrote to its parent. */\nexport const AGENT_MESSAGE_SOURCE_CHILD_SESSION = \"child_session\";\n/** `payload.source` of the row the platform writes when a sandbox dies mid-turn. */\nexport const AGENT_MESSAGE_SOURCE_WORKSPACE_LOSS = \"workspace_loss\";\n/** `payload.source` of the reminder an orchestrator gets for editing files itself. */\nexport const AGENT_MESSAGE_SOURCE_ORCHESTRATOR_DRIFT = \"orchestrator_drift\";\n\n// Sources allowed to cut a RUNNING turn at its next settled tool call: the\n// orchestration link (both directions) and the drift reminder; the rest waits.\nexport const AFTER_TOOL_STEERING_SOURCES = [\n AGENT_MESSAGE_SOURCE_PARENT_SESSION,\n AGENT_MESSAGE_SOURCE_CHILD_SESSION,\n AGENT_MESSAGE_SOURCE_ORCHESTRATOR_DRIFT,\n] as const;\n","import { WORKSPACE_TOOL_NAMES } from \"../../turns/turn-constants\";\n\n/**\n * The native tool each remote workspace tool shadows. `workspace_task_output`\n * and `workspace_task_stop` have no native counterpart and keep their own name.\n */\nexport const NATIVE_EQUIVALENT: Record<string, string> = {\n [WORKSPACE_TOOL_NAMES.BASH]: \"bash\",\n [WORKSPACE_TOOL_NAMES.READ]: \"read\",\n [WORKSPACE_TOOL_NAMES.WRITE]: \"write\",\n [WORKSPACE_TOOL_NAMES.EDIT]: \"edit\",\n [WORKSPACE_TOOL_NAMES.GLOB]: \"glob\",\n [WORKSPACE_TOOL_NAMES.GREP]: \"grep\",\n};\n","export function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","export function str(value: unknown): string | undefined {\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n","import { str } from \"./str\";\n\n/** A blank field carries no meaning: it reads as absent, not as an empty value. */\nexport function trimmed(value: unknown): string | null {\n const text = str(value)?.trim();\n return text ? text : null;\n}\n","export function truncate(value: string, max: number): string {\n const text = value.trim();\n return text.length > max ? `${text.slice(0, max - 1)}…` : text;\n}\n","import { str } from \"./str\";\n\n/** The field exactly as given, or null when it is blank — no silent rewrite. */\nexport function verbatim(value: unknown): string | null {\n const text = str(value);\n return text && text.trim().length > 0 ? text : null;\n}\n","import { isRecord, str, trimmed, truncate, verbatim } from \"./tool-input/index\";\n\n/** Defensive readers for a tool call's `input`, which is typed `unknown`. */\nexport const toolInput = { isRecord, str, trimmed, truncate, verbatim };\n","import type { ToolActivity } from \"./tool-activity\";\n\nexport function labelOnly(text: string): ToolActivity {\n return { text, command: null };\n}\n","export function toolActivityBasename(\n path: string | undefined,\n): string | undefined {\n if (!path) {\n return undefined;\n }\n const segments = path.split(/[/\\\\]/).filter(Boolean);\n return segments.at(-1) ?? path;\n}\n","export function toolActivityHostname(\n url: string | undefined,\n): string | undefined {\n if (!url) {\n return undefined;\n }\n try {\n return new URL(url).hostname;\n } catch {\n return url.replace(/^https?:\\/\\//, \"\").split(\"/\")[0] || undefined;\n }\n}\n","import { labelOnly } from \"../label-only\";\nimport type { ToolActivity } from \"../tool-activity\";\nimport type { ToolActivityState } from \"../tool-activity-state\";\n\n/** The browser tools answer a failure as TEXT, so only `hasFailed` separates\n * \"Clicked Log in\" from \"Could not click Log in\". */\nexport function browserLabel(\n state: ToolActivityState,\n labels: { failed: string; running: string; done: string },\n): ToolActivity {\n if (state.hasFailed) return labelOnly(labels.failed);\n return labelOnly(state.isRunning ? labels.running : labels.done);\n}\n","/** browser_act action → the three tenses the transcript needs. */\nexport const BROWSER_ACT_VERBS: Record<\n string,\n { done: string; gerund: string; bare: string }\n> = Object.assign(Object.create(null) as Record<string, never>, {\n click: { done: \"Clicked\", gerund: \"Clicking\", bare: \"click\" },\n dblclick: {\n done: \"Double-clicked\",\n gerund: \"Double-clicking\",\n bare: \"double-click\",\n },\n fill: { done: \"Filled\", gerund: \"Filling\", bare: \"fill\" },\n type: { done: \"Typed into\", gerund: \"Typing into\", bare: \"type into\" },\n select: { done: \"Selected in\", gerund: \"Selecting in\", bare: \"select in\" },\n check: { done: \"Checked\", gerund: \"Checking\", bare: \"check\" },\n uncheck: { done: \"Unchecked\", gerund: \"Unchecking\", bare: \"uncheck\" },\n hover: { done: \"Hovered\", gerund: \"Hovering\", bare: \"hover\" },\n press: {\n done: \"Pressed a key on\",\n gerund: \"Pressing a key on\",\n bare: \"press a key on\",\n },\n scroll: { done: \"Scrolled\", gerund: \"Scrolling\", bare: \"scroll\" },\n upload: {\n done: \"Uploaded a file to\",\n gerund: \"Uploading a file to\",\n bare: \"upload a file to\",\n },\n});\n\n/** browser_navigate history moves → their label, in the same three tenses. */\nexport const BROWSER_HISTORY_LABELS: Record<\n string,\n { done: string; gerund: string; bare: string }\n> = Object.assign(Object.create(null) as Record<string, never>, {\n back: { done: \"Went back\", gerund: \"Going back\", bare: \"go back\" },\n forward: {\n done: \"Went forward\",\n gerund: \"Going forward\",\n bare: \"go forward\",\n },\n reload: {\n done: \"Reloaded the page\",\n gerund: \"Reloading the page\",\n bare: \"reload the page\",\n },\n});\n","import type { ToolActivity } from \"../tool-activity\";\nimport type { ToolActivityState } from \"../tool-activity-state\";\nimport { toolInput } from \"../tool-input\";\nimport { browserLabel } from \"./browser-label\";\nimport { BROWSER_ACT_VERBS } from \"./browser-activity-constants\";\n\n/** \"Clicked Se connecter\" reads; \"called browser_act\" does not. */\nexport function describeBrowserAct(\n record: Record<string, unknown>,\n state: ToolActivityState,\n): ToolActivity {\n const action = toolInput.str(record.action) ?? \"click\";\n const verb = (Object.hasOwn(BROWSER_ACT_VERBS, action)\n ? BROWSER_ACT_VERBS[action]\n : undefined) ?? {\n done: \"Acted on\",\n gerund: \"Acting on\",\n bare: \"act on\",\n };\n const target =\n toolInput.trimmed(record.name) ??\n toolInput.trimmed(record.selector) ??\n toolInput.trimmed(record.ref) ??\n toolInput.trimmed(record.role);\n const subject = target ? toolInput.truncate(target, 60) : \"an element\";\n return browserLabel(state, {\n failed: `Could not ${verb.bare} ${subject}`,\n running: `${verb.gerund} ${subject}`,\n done: `${verb.done} ${subject}`,\n });\n}\n","import type { ToolActivity } from \"../tool-activity\";\nimport { toolActivityHostname } from \"../tool-activity-hostname\";\nimport type { ToolActivityState } from \"../tool-activity-state\";\nimport { toolInput } from \"../tool-input\";\nimport { browserLabel } from \"./browser-label\";\nimport { BROWSER_HISTORY_LABELS } from \"./browser-activity-constants\";\n\nexport function describeBrowserNavigate(\n record: Record<string, unknown>,\n state: ToolActivityState,\n): ToolActivity {\n const action = toolInput.str(record.action);\n if (action && action !== \"goto\") {\n const move = Object.hasOwn(BROWSER_HISTORY_LABELS, action)\n ? BROWSER_HISTORY_LABELS[action]\n : undefined;\n return move\n ? browserLabel(state, {\n failed: `Could not ${move.bare}`,\n running: move.gerund,\n done: move.done,\n })\n : browserLabel(state, {\n failed: \"Could not move in the browser\",\n running: \"Moving in the browser\",\n done: \"Moved in the browser\",\n });\n }\n const host = toolActivityHostname(toolInput.str(record.url));\n const subject = host ?? \"a page\";\n return browserLabel(state, {\n failed: `Could not open ${subject}`,\n running: `Opening ${subject}`,\n done: `Opened ${subject}`,\n });\n}\n","import { labelOnly } from \"../label-only\";\nimport type { ToolActivity } from \"../tool-activity\";\nimport type { ToolActivityState } from \"../tool-activity-state\";\n\n/**\n * The four sentences every capture tool needs — the option variant of a\n * capture never names its target (an ask_user thumb is about the question,\n * not about what was framed), which is why `option` carries no subject.\n */\nexport interface CaptureLabels {\n optionFailed: string;\n optionRunning: string;\n optionDone: string;\n failed: (subject: string | null) => string;\n running: (subject: string | null) => string;\n done: (subject: string | null) => string;\n}\n\nexport function captureLabel(\n labels: CaptureLabels,\n state: ToolActivityState,\n options: { isOption: boolean; subject: string | null },\n): ToolActivity {\n if (options.isOption) {\n if (state.hasFailed) {\n return labelOnly(labels.optionFailed);\n }\n return labelOnly(\n state.isRunning ? labels.optionRunning : labels.optionDone,\n );\n }\n if (state.hasFailed) {\n return labelOnly(labels.failed(options.subject));\n }\n return labelOnly(\n state.isRunning\n ? labels.running(options.subject)\n : labels.done(options.subject),\n );\n}\n","import { toolActivityBasename } from \"../tool-activity-basename\";\n/** Capture target for live labels: `localhost:3000`, a file basename, a path. */\nexport function captureTarget(url: string | undefined): string | undefined {\n if (!url) {\n return undefined;\n }\n try {\n const parsed = new URL(url);\n if (parsed.protocol === \"file:\") {\n return toolActivityBasename(parsed.pathname) ?? url;\n }\n return parsed.host || parsed.hostname;\n } catch {\n return toolActivityBasename(url) ?? url;\n }\n}\n","/** Same budget as the other single-line activity labels. */\nexport const CAPTURE_LABEL_MAX = 60;\n","import type { ToolActivity } from \"../tool-activity\";\nimport { toolInput } from \"../tool-input\";\nimport type { ToolActivityState } from \"../tool-activity-state\";\nimport { captureLabel } from \"./capture-label\";\nimport { captureTarget } from \"./capture-target\";\nimport { CAPTURE_LABEL_MAX } from \"./capture-label-constants\";\n\nexport function describeTakeScreenshot(\n record: Record<string, unknown>,\n state: ToolActivityState,\n): ToolActivity {\n const target = captureTarget(toolInput.str(record.url));\n return captureLabel(\n {\n optionFailed: \"Failed to take a silent screenshot\",\n optionRunning: \"Taking a silent screenshot\",\n optionDone: \"Took a silent screenshot\",\n failed: (subject) =>\n subject\n ? `Failed to screenshot ${subject}`\n : \"Failed to take a screenshot\",\n running: (subject) =>\n subject ? `Taking a screenshot of ${subject}` : \"Taking a screenshot\",\n done: (subject) =>\n subject ? `Took a screenshot of ${subject}` : \"Took a screenshot\",\n },\n state,\n {\n isOption: record.silent === true,\n subject: target ? toolInput.truncate(target, CAPTURE_LABEL_MAX) : null,\n },\n );\n}\n","import { HOST_TOOL_NAMES } from \"../../turns/turn-constants\";\nimport type { ToolActivity } from \"../tool-activity\";\nimport type { ToolActivityState } from \"../tool-activity-state\";\nimport { browserLabel } from \"./browser-label\";\nimport { toolInput } from \"../tool-input\";\nimport { describeBrowserAct } from \"./describe-browser-act\";\nimport { describeBrowserNavigate } from \"./describe-browser-navigate\";\nimport { describeTakeScreenshot } from \"../capture/describe-take-screenshot\";\n\n/** The browser + REPL half of the canonical describers, kept out of the big\n * map so neither file outgrows the line cap. */\nexport const browserToolActivityDescribers: readonly [\n string,\n (record: Record<string, unknown>, state: ToolActivityState) => ToolActivity,\n][] = [\n [HOST_TOOL_NAMES.BROWSER_NAVIGATE, describeBrowserNavigate],\n [HOST_TOOL_NAMES.BROWSER_ACT, describeBrowserAct],\n [\n // The goal is the only thing worth reading: the steps are in the result.\n HOST_TOOL_NAMES.BROWSER_AUTOPILOT,\n (record, state) => {\n const goal = toolInput.str(record.goal);\n return browserLabel(state, {\n failed: goal ? `Could not: ${goal}` : \"Could not drive the browser\",\n running: goal ? `Driving the browser: ${goal}` : \"Driving the browser\",\n done: goal ? `Drove the browser: ${goal}` : \"Drove the browser\",\n });\n },\n ],\n [\n HOST_TOOL_NAMES.BROWSER_SNAPSHOT,\n (_record, state) =>\n browserLabel(state, {\n failed: \"Could not read the page\",\n running: \"Reading the page\",\n done: \"Read the page\",\n }),\n ],\n [\n HOST_TOOL_NAMES.BROWSER_WAIT,\n (_record, state) =>\n browserLabel(state, {\n failed: \"Gave up waiting for the page\",\n running: \"Waiting for the page\",\n done: \"Waited for the page\",\n }),\n ],\n [\n HOST_TOOL_NAMES.BROWSER_INSPECT,\n (_record, state) =>\n browserLabel(state, {\n failed: \"Could not read the console and network\",\n running: \"Reading the console and network\",\n done: \"Read the console and network\",\n }),\n ],\n [\n HOST_TOOL_NAMES.BROWSER_SCREENSHOT,\n (record, state) => describeTakeScreenshot(record, state),\n ],\n [\n HOST_TOOL_NAMES.BROWSER_RECORD_START,\n (_record, state) =>\n browserLabel(state, {\n failed: \"Could not start recording\",\n running: \"Starting a recording\",\n done: \"Started recording the browser\",\n }),\n ],\n [\n HOST_TOOL_NAMES.BROWSER_RECORD_STOP,\n (_record, state) =>\n browserLabel(state, {\n failed: \"Could not finish the recording\",\n running: \"Finishing the recording\",\n done: \"Recorded the browser\",\n }),\n ],\n [\n HOST_TOOL_NAMES.BROWSER_CLOSE,\n (_record, state) =>\n browserLabel(state, {\n failed: \"Could not close the browser\",\n running: \"Closing the browser\",\n done: \"Closed the browser\",\n }),\n ],\n [\n HOST_TOOL_NAMES.BROWSER_SESSIONS_LIST,\n (_record, state) =>\n browserLabel(state, {\n failed: \"Could not read your captured logins\",\n running: \"Listing your captured logins\",\n done: \"Listed your captured logins\",\n }),\n ],\n [\n // The site, never what the vault holds for it.\n HOST_TOOL_NAMES.BROWSER_USE_SESSION,\n (record, state) => {\n const domain = toolInput.str(record.domain);\n return browserLabel(state, {\n failed: domain\n ? `Could not sign in to ${domain} as you`\n : \"Could not load a captured login\",\n running: domain\n ? `Signing in to ${domain} as you`\n : \"Loading a captured login\",\n done: domain\n ? `Signed in to ${domain} as you`\n : \"Loaded a captured login\",\n });\n },\n ],\n [\n HOST_TOOL_NAMES.BROWSER_FORGET_SESSION,\n (_record, state) =>\n browserLabel(state, {\n failed: \"Could not forget the captured logins\",\n running: \"Forgetting the captured logins\",\n done: \"Forgot the captured logins\",\n }),\n ],\n [\n HOST_TOOL_NAMES.REPL_EVAL,\n (_record, state) =>\n browserLabel(state, {\n failed: \"JavaScript in the REPL failed\",\n running: \"Running JavaScript in the REPL\",\n done: \"Ran JavaScript in the REPL\",\n }),\n ],\n [\n HOST_TOOL_NAMES.REPL_RESET,\n (_record, state) =>\n browserLabel(state, {\n failed: \"Could not reset the REPL\",\n running: \"Resetting the REPL\",\n done: \"Reset the REPL\",\n }),\n ],\n];\n","import { HOST_TOOL_NAMES } from \"../../turns/turn-constants\";\nimport { labelOnly } from \"../label-only\";\nimport type { ToolActivity } from \"../tool-activity\";\nimport type { ToolActivityState } from \"../tool-activity-state\";\nimport { toolInput } from \"../tool-input\";\n\n/** Design-mode tools (docs/agents/design-mode.md), kept out of the big\n * canonical map so it stays under the line cap. */\nexport const designToolActivityDescribers: readonly [\n string,\n (record: Record<string, unknown>, state: ToolActivityState) => ToolActivity,\n][] = [\n [\n HOST_TOOL_NAMES.PUBLISH_DESIGN,\n (record) => {\n const count = Array.isArray(record.directions)\n ? record.directions.length\n : 0;\n return labelOnly(\n count > 1\n ? `Published ${count} design directions`\n : \"Published a design\",\n );\n },\n ],\n [\n HOST_TOOL_NAMES.SET_LIVE_DESIGN,\n (record) => {\n const version = toolInput.trimmed(record.version);\n return labelOnly(\n version\n ? `Pointed the design link at v${version}`\n : \"Moved the design link\",\n );\n },\n ],\n];\n","import { HOST_TOOL_NAMES } from \"../../turns/turn-constants\";\nimport { labelOnly } from \"../label-only\";\nimport type { ToolActivity } from \"../tool-activity\";\nimport type { ToolActivityState } from \"../tool-activity-state\";\nimport { toolInput } from \"../tool-input\";\n\nexport const reviewToolActivityDescribers: readonly [\n string,\n (record: Record<string, unknown>, state: ToolActivityState) => ToolActivity,\n][] = [\n [\n HOST_TOOL_NAMES.REVIEW_SCOPE,\n (record) => {\n const base = toolInput.str(record.base);\n const head = toolInput.str(record.head);\n return labelOnly(\n base && head\n ? `Scoped the review of ${toolInput.truncate(`${base}...${head}`, 60)}`\n : \"Scoped the review\",\n );\n },\n ],\n [\n HOST_TOOL_NAMES.FILTER_REVIEW_FINDINGS,\n (record) => {\n const count = Array.isArray(record.findings) ? record.findings.length : 0;\n return labelOnly(\n count > 0\n ? `Fact-checked ${count} review finding${count === 1 ? \"\" : \"s\"}`\n : \"Fact-checked the review findings\",\n );\n },\n ],\n];\n","import { HOST_TOOL_NAMES } from \"../../turns/turn-constants\";\nimport { labelOnly } from \"../label-only\";\nimport type { ToolActivity } from \"../tool-activity\";\nimport type { ToolActivityState } from \"../tool-activity-state\";\nimport { toolInput } from \"../tool-input\";\n\n/** The software-factory seats' tools, kept out of the big canonical map so it\n * stays under the line cap. */\nexport const factoryToolActivityDescribers: readonly [\n string,\n (record: Record<string, unknown>, state: ToolActivityState) => ToolActivity,\n][] = [\n [HOST_TOOL_NAMES.SUBMIT_SPECS, () => labelOnly(\"Submitted the specs\")],\n [HOST_TOOL_NAMES.SET_BRAND_KIT, () => labelOnly(\"Set the brand kit\")],\n [HOST_TOOL_NAMES.PLAN_TICKETS, () => labelOnly(\"Planned the tickets\")],\n [\n HOST_TOOL_NAMES.MARK_PROVISIONING_STEP,\n (record) => {\n const name = toolInput.trimmed(record.name);\n const status = toolInput.trimmed(record.status);\n return labelOnly(\n name && status\n ? `Marked provisioning step ${name} ${status}`\n : \"Reported a provisioning step\",\n );\n },\n ],\n [HOST_TOOL_NAMES.DECIDE_MERGE, () => labelOnly(\"Settled the ticket's PR\")],\n [HOST_TOOL_NAMES.DECIDE_QA, () => labelOnly(\"Settled the QA verdict\")],\n];\n","import { labelOnly } from \"../label-only\";\nimport { toolInput } from \"../tool-input\";\nimport type { ToolActivity } from \"../tool-activity\";\nimport type { ToolActivityState } from \"../tool-activity-state\";\n\nexport const integrationToolActivityDescribers: readonly [\n string,\n (record: Record<string, unknown>, state: ToolActivityState) => ToolActivity,\n][] = [\n [\n \"tool_search\",\n (record) => {\n const query = toolInput.str(record.query);\n return labelOnly(\n query\n ? `Searched integrations for \"${toolInput.truncate(query, 60)}\"`\n : \"Searched the connected integrations\",\n );\n },\n ],\n [\n \"tool_execute\",\n (record) => {\n const target = toolInput.str(record.tool);\n return labelOnly(\n target\n ? `Ran ${toolInput.truncate(target, 60)}`\n : \"Ran an integration tool\",\n );\n },\n ],\n];\n","import type { ToolActivity } from \"../tool-activity\";\nimport type { ToolActivityState } from \"../tool-activity-state\";\nimport { captureLabel } from \"./capture-label\";\n\nexport function describeAnnotateImage(\n record: Record<string, unknown>,\n state: ToolActivityState,\n): ToolActivity {\n return captureLabel(\n {\n optionFailed: \"Failed to annotate a silent image\",\n optionRunning: \"Annotating a silent image\",\n optionDone: \"Annotated a silent image\",\n failed: () => \"Failed to annotate an image\",\n running: () => \"Annotating an image\",\n done: () => \"Annotated an image\",\n },\n state,\n { isOption: record.silent === true, subject: null },\n );\n}\n","/** Index of the last character of the comment at `at`, or `at` if there is none. */\nexport function endOfComment(source: string, at: number): number {\n if (source[at] !== \"/\") return at;\n if (source[at + 1] === \"/\") {\n // line - 1: the newline ends the comment, it is not part of it.\n const line = source.indexOf(\"\\n\", at);\n return line === -1 ? source.length : line - 1;\n }\n if (source[at + 1] === \"*\") {\n const block = source.indexOf(\"*/\", at + 2);\n return block === -1 ? source.length : block + 1;\n }\n return at;\n}\n","/** Index of the quote closing the literal that opens at `open`, escapes honoured. */\nexport function endOfStringLiteral(source: string, open: number): number {\n const quote = source[open];\n for (let at = open + 1; at < source.length; at += 1) {\n if (source[at] === \"\\\\\") at += 1;\n else if (source[at] === quote) return at;\n }\n return source.length;\n}\n","import { endOfComment } from \"./end-of-comment\";\nimport { endOfStringLiteral } from \"./end-of-string-literal\";\n\n/**\n * Index of the last character of the string or comment at `at`, or `at` if\n * neither. Strings and comments only: a regex literal is not recognised.\n */\nexport function endOfSkippable(source: string, at: number): number {\n const char = source[at];\n if (char === \"'\" || char === '\"' || char === \"`\") {\n return endOfStringLiteral(source, at);\n }\n return endOfComment(source, at);\n}\n","import { endOfSkippable } from \"./end-of-skippable\";\n\n/** Index just past the `}` closing the object at `open`, or -1 if unbalanced. */\nexport function endOfObjectLiteral(source: string, open: number): number {\n let depth = 0;\n for (let at = open; at < source.length; at += 1) {\n const skipped = endOfSkippable(source, at);\n if (skipped !== at) {\n at = skipped;\n continue;\n }\n if (source[at] === \"{\") depth += 1;\n else if (source[at] === \"}\" && (depth -= 1) === 0) return at + 1;\n }\n return -1;\n}\n","import { endOfSkippable } from \"./end-of-skippable\";\n\n/** A spread in CODE position, at any depth: the parser cannot evaluate one. */\nexport function hasSpreadInCode(literal: string): boolean {\n for (let at = 0; at < literal.length; at += 1) {\n const skipped = endOfSkippable(literal, at);\n if (skipped !== at) {\n at = skipped;\n continue;\n }\n if (literal.startsWith(\"...\", at)) return true;\n }\n return false;\n}\n","import { endOfComment } from \"./end-of-comment\";\n\n/**\n * Index of the `{` opening the meta the script BEGINS with, or -1. Only\n * whitespace and comments may precede it: a declaration quoted further down is\n * text the engine never runs, and recording it is worse than refusing.\n */\nexport function metaDeclarationOpen(script: string): number {\n const anchor = /export[ \\t]+const[ \\t]+meta[ \\t]*=\\s*\\{/y;\n let at = 0;\n while (at < script.length) {\n if (/\\s/.test(script[at] ?? \"\")) {\n at += 1;\n continue;\n }\n const comment = endOfComment(script, at);\n if (comment !== at) {\n at = comment + 1;\n continue;\n }\n anchor.lastIndex = at;\n return anchor.test(script) ? script.indexOf(\"{\", at) : -1;\n }\n return -1;\n}\n","/** The VALUE of a quoted literal's body: `\\n` is a newline, not the letter n. */\nexport function unescapeStringLiteral(body: string): string {\n const single: Record<string, string> = {\n n: \"\\n\",\n t: \"\\t\",\n r: \"\\r\",\n b: \"\\b\",\n f: \"\\f\",\n v: \"\\v\",\n \"0\": \"\\0\",\n };\n return body.replace(\n /\\\\(u\\{([0-9a-fA-F]+)\\}|u([0-9a-fA-F]{4})|x([0-9a-fA-F]{2})|.)/gs,\n (_, escape: string, braced?: string, unicode?: string, hex?: string) => {\n const code = braced ?? unicode ?? hex;\n if (code === undefined) return single[escape] ?? escape;\n const point = Number.parseInt(code, 16);\n // Out of range is not decodable: keep the source text rather than throw\n // inside a transcript row that only wants a label.\n return point <= 0x10ffff ? String.fromCodePoint(point) : `\\\\${escape}`;\n },\n );\n}\n","import { endOfSkippable } from \"./end-of-skippable\";\nimport { endOfStringLiteral } from \"./end-of-string-literal\";\nimport { unescapeStringLiteral } from \"./unescape-string-literal\";\n\n/** The quoted value of `field:` starting at `at`, JSON-style keys included. */\nexport function quotedFieldAt(\n literal: string,\n at: number,\n field: string,\n): string | undefined {\n const key = /^(['\"])?/.exec(literal.slice(at));\n const quoted = key?.[1] ?? \"\";\n const start = at + quoted.length;\n if (!literal.startsWith(field, start)) return undefined;\n if (!quoted && /[A-Za-z0-9_$]/.test(literal[at - 1] ?? \"\")) return undefined;\n const after = literal.slice(start + field.length);\n const opener = new RegExp(`^${quoted}\\\\s*:\\\\s*['\"\\`]`).exec(after);\n if (!opener) return undefined;\n const quote = start + field.length + opener[0].length - 1;\n const close = endOfStringLiteral(literal, quote);\n // A literal that only OPENS the value (`'a' + b`, a template with a hole) is\n // not the value: the authoritative parser evaluates it, this cannot.\n let tail = close + 1;\n for (;;) {\n while (/\\s/.test(literal[tail] ?? \"\")) tail += 1;\n const skipped = endOfSkippable(literal, tail);\n if (skipped === tail) break;\n tail = skipped + 1;\n }\n if (literal[tail] !== \",\" && literal[tail] !== \"}\") return undefined;\n if (literal[quote] === \"`\" && /\\$\\{/.test(literal.slice(quote, close))) {\n return undefined;\n }\n // The VALUE, not its source text: the run row stores what JavaScript builds.\n return unescapeStringLiteral(literal.slice(quote + 1, close));\n}\n","import { endOfSkippable } from \"./end-of-skippable\";\nimport { quotedFieldAt } from \"./quoted-field-at\";\n\n/** A quoted `field:` at the object's OWN level, ignoring anything nested in it. */\nexport function topLevelStringField(\n literal: string,\n field: string,\n): string | undefined {\n let depth = 0;\n let found: string | undefined;\n for (let at = 0; at < literal.length; at += 1) {\n // Before skipping: a JSON-style key opens with the quote we would skip.\n if (depth === 1) {\n // Last wins, as it does when JavaScript builds the object.\n const value = quotedFieldAt(literal, at, field);\n if (value !== undefined) found = value;\n }\n const skipped = endOfSkippable(literal, at);\n if (skipped !== at) {\n at = skipped;\n continue;\n }\n const char = literal[at];\n if (char === \"{\" || char === \"[\") depth += 1;\n else if (char === \"}\" || char === \"]\") depth -= 1;\n }\n return found;\n}\n","import { endOfObjectLiteral } from \"./end-of-object-literal\";\nimport { hasSpreadInCode } from \"./has-spread-in-code\";\nimport { metaDeclarationOpen } from \"./meta-declaration-open\";\nimport { topLevelStringField } from \"./top-level-string-field\";\n\n/**\n * `meta.name` off a workflow script, or undefined when the parser would refuse\n * it: a row naming a run that does not exist is worse than an unnamed one.\n */\nexport function metaNameInScript(script: string): string | undefined {\n const open = metaDeclarationOpen(script);\n if (open === -1) return undefined;\n const end = endOfObjectLiteral(script, open);\n if (end === -1) return undefined;\n const literal = script.slice(open, end);\n if (hasSpreadInCode(literal)) return undefined;\n const name = topLevelStringField(literal, \"name\");\n // trim() is the parser's EMPTINESS test; the value it stores is untrimmed.\n return name?.trim() && topLevelStringField(literal, \"description\")?.trim()\n ? name.slice(0, 80)\n : undefined;\n}\n","import { metaNameInScript } from \"@repo/core/source-scan/meta-name-in-script\";\n\n/** The label's `meta.name`, read the way the parser anchors, bounds and picks it. */\nexport function workflowScriptName(script: string): string | undefined {\n return metaNameInScript(script);\n}\n","import { labelOnly } from \"../label-only\";\nimport type { ToolActivity } from \"../tool-activity\";\nimport { toolInput } from \"../tool-input\";\nimport { workflowScriptName } from \"./workflow-script-name\";\n\nexport function describeWorkflow(\n record: Record<string, unknown>,\n): ToolActivity {\n const name = workflowScriptName(toolInput.str(record.script) ?? \"\");\n return labelOnly(name ? `Ran workflow \"${name}\"` : \"Ran a workflow\");\n}\n","import type { ToolActivity } from \"../tool-activity\";\nimport { toolActivityBasename } from \"../tool-activity-basename\";\nimport { toolInput } from \"../tool-input\";\nimport type { ToolActivityState } from \"../tool-activity-state\";\nimport { captureLabel } from \"./capture-label\";\nimport { CAPTURE_LABEL_MAX } from \"./capture-label-constants\";\n\nexport function describeAttachImage(\n record: Record<string, unknown>,\n state: ToolActivityState,\n): ToolActivity {\n const file = toolActivityBasename(toolInput.str(record.path));\n return captureLabel(\n {\n optionFailed: \"Failed to attach a silent image\",\n optionRunning: \"Attaching a silent image\",\n optionDone: \"Attached a silent image\",\n failed: (subject) =>\n subject ? `Failed to attach ${subject}` : \"Failed to attach an image\",\n running: (subject) =>\n subject ? `Attaching ${subject}` : \"Attaching an image\",\n done: (subject) =>\n subject ? `Attached ${subject}` : \"Attached an image\",\n },\n state,\n {\n isOption: record.silent === true,\n subject: file ? toolInput.truncate(file, CAPTURE_LABEL_MAX) : null,\n },\n );\n}\n","import type { ToolActivity } from \"../tool-activity\";\nimport type { ToolActivityState } from \"../tool-activity-state\";\nimport { captureLabel } from \"./capture-label\";\n\nexport function describeGenerateImage(\n _record: Record<string, unknown>,\n state: ToolActivityState,\n): ToolActivity {\n return captureLabel(\n {\n optionFailed: \"Failed to generate an image\",\n optionRunning: \"Generating an image\",\n optionDone: \"Generated an image\",\n failed: () => \"Failed to generate an image\",\n running: () => \"Generating an image\",\n done: () => \"Generated an image\",\n },\n state,\n { isOption: false, subject: null },\n );\n}\n","import type { ToolActivity } from \"../tool-activity\";\nimport { toolInput } from \"../tool-input\";\nimport type { ToolActivityState } from \"../tool-activity-state\";\nimport { captureLabel } from \"./capture-label\";\nimport { captureTarget } from \"./capture-target\";\nimport { CAPTURE_LABEL_MAX } from \"./capture-label-constants\";\n\nexport function describeRecordVideo(\n record: Record<string, unknown>,\n state: ToolActivityState,\n): ToolActivity {\n const target = captureTarget(toolInput.str(record.url));\n return captureLabel(\n {\n // record_video has no option variant: a strip thumb is a still image.\n optionFailed: \"Failed to record a video\",\n optionRunning: \"Recording a video\",\n optionDone: \"Recorded a video\",\n failed: (subject) =>\n subject\n ? `Failed to record a video of ${subject}`\n : \"Failed to record a video\",\n running: (subject) =>\n subject ? `Recording a video of ${subject}` : \"Recording a video\",\n done: (subject) =>\n subject ? `Recorded a video of ${subject}` : \"Recorded a video\",\n },\n state,\n {\n isOption: false,\n subject: target ? toolInput.truncate(target, CAPTURE_LABEL_MAX) : null,\n },\n );\n}\n","import { labelOnly } from \"../label-only\";\nimport type { ToolActivity } from \"../tool-activity\";\nimport { toolInput } from \"../tool-input\";\n\nexport function describeMemorySearch(\n record: Record<string, unknown>,\n): ToolActivity {\n const query = toolInput.str(record.query);\n return labelOnly(\n query\n ? `Searched its memory: ${toolInput.truncate(query, 60)}`\n : \"Searched its memory\",\n );\n}\n","import { labelOnly } from \"../label-only\";\nimport type { ToolActivity } from \"../tool-activity\";\nimport { toolInput } from \"../tool-input\";\n\nexport function describeReportDevServer(\n record: Record<string, unknown>,\n): ToolActivity {\n const status = toolInput.str(record.status);\n const port = toolInput.str(record.port) ?? String(record.port ?? \"\");\n if (status && port) {\n return labelOnly(`Reported the dev server ${status} on port ${port}`);\n }\n if (status) {\n return labelOnly(`Reported the dev server ${status}`);\n }\n return labelOnly(\"Reported the dev server\");\n}\n","import { labelOnly } from \"../label-only\";\nimport type { ToolActivity } from \"../tool-activity\";\n\nexport function describeRequestEnvVars(\n record: Record<string, unknown>,\n): ToolActivity {\n const asked = Array.isArray(record.variables)\n ? record.variables.length\n : null;\n return labelOnly(\n asked\n ? `Requested ${asked} environment variable${asked === 1 ? \"\" : \"s\"}`\n : \"Requested environment variables\",\n );\n}\n","import { labelOnly } from \"../label-only\";\nimport type { ToolActivity } from \"../tool-activity\";\nimport { toolActivityBasename } from \"../tool-activity-basename\";\nimport { toolInput } from \"../tool-input\";\nimport type { ToolActivityState } from \"../tool-activity-state\";\n\nexport function describeAttachFile(\n record: Record<string, unknown>,\n state: ToolActivityState,\n): ToolActivity {\n const file = toolActivityBasename(toolInput.str(record.path));\n const subject = file ?? \"a file\";\n if (state.hasFailed) {\n return labelOnly(`Failed to deliver ${subject}`);\n }\n return labelOnly(\n state.isRunning ? `Delivering ${subject}` : `Delivered ${subject}`,\n );\n}\n","export const AGENT_TASK_UPDATE_ACTIONS = {\n BLOCK: \"block\",\n COMPLETE: \"complete\",\n FAIL: \"fail\",\n HEARTBEAT: \"heartbeat\",\n PROGRESS: \"progress\",\n RELEASE: \"release\",\n} as const;\n\nexport const OPEN_AGENT_TASK_UPDATE_ACTIONS: readonly AgentTaskUpdateAction[] =\n [\n AGENT_TASK_UPDATE_ACTIONS.HEARTBEAT,\n AGENT_TASK_UPDATE_ACTIONS.PROGRESS,\n AGENT_TASK_UPDATE_ACTIONS.RELEASE,\n ];\n\nexport type AgentTaskUpdateAction =\n (typeof AGENT_TASK_UPDATE_ACTIONS)[keyof typeof AGENT_TASK_UPDATE_ACTIONS];\n\nexport const AGENT_TASK_EVIDENCE_TYPES = [\n \"artifact\",\n \"commit\",\n \"file\",\n \"test\",\n \"url\",\n] as const;\n","import {\n AGENT_TASK_UPDATE_ACTIONS,\n type AgentTaskUpdateAction,\n} from \"../../teams/agent-task-update-constants\";\n\n// A Map, not an object: an action named after an Object member would otherwise\n// read the prototype's value. `satisfies` fails the build on a new action.\nexport const updateTaskLabels: ReadonlyMap<string, string> = new Map(\n Object.entries({\n [AGENT_TASK_UPDATE_ACTIONS.BLOCK]: \"Blocked a task\",\n [AGENT_TASK_UPDATE_ACTIONS.COMPLETE]: \"Completed a task\",\n [AGENT_TASK_UPDATE_ACTIONS.FAIL]: \"Marked a task failed\",\n [AGENT_TASK_UPDATE_ACTIONS.HEARTBEAT]: \"Kept a task alive\",\n [AGENT_TASK_UPDATE_ACTIONS.PROGRESS]: \"Reported progress on a task\",\n [AGENT_TASK_UPDATE_ACTIONS.RELEASE]: \"Released a blocked task\",\n } satisfies Record<AgentTaskUpdateAction, string>),\n);\n","import { labelOnly } from \"../label-only\";\nimport type { ToolActivity } from \"../tool-activity\";\nimport type { ToolActivityState } from \"../tool-activity-state\";\nimport { toolActivityBasename } from \"../tool-activity-basename\";\nimport { toolInput } from \"../tool-input\";\n\nexport function describeNativePatch(\n record: Record<string, unknown>,\n state: ToolActivityState,\n): ToolActivity {\n const path = toolActivityBasename(toolInput.str(record.path));\n const count = Array.isArray(record.changes) ? record.changes.length : 0;\n const target =\n path ?? (count > 0 ? `${count} file${count === 1 ? \"\" : \"s\"}` : \"files\");\n const verb = state.hasFailed\n ? \"Failed to edit\"\n : state.isRunning\n ? \"Editing\"\n : \"Edited\";\n return labelOnly(`${verb} ${target}`);\n}\n","import {\n HOST_TOOL_NAMES,\n WORKSPACE_TOOL_NAMES,\n} from \"../../turns/turn-constants\";\nimport { labelOnly } from \"../label-only\";\nimport type { ToolActivity } from \"../tool-activity\";\nimport { toolActivityBasename } from \"../tool-activity-basename\";\nimport { toolActivityHostname } from \"../tool-activity-hostname\";\nimport { toolInput } from \"../tool-input\";\nimport type { ToolActivityState } from \"../tool-activity-state\";\nimport { browserToolActivityDescribers } from \"../browser/browser-tool-activity-describers\";\nimport { designToolActivityDescribers } from \"../design/design-tool-activity-describers\";\nimport { reviewToolActivityDescribers } from \"../review/review-tool-activity-describers\";\nimport { factoryToolActivityDescribers } from \"../factory/factory-tool-activity-describers\";\nimport { integrationToolActivityDescribers } from \"./integration-tool-activity-describers\";\nimport { describeAnnotateImage } from \"../capture/describe-annotate-image\";\nimport { describeWorkflow } from \"./describe-workflow\";\nimport { describeAttachImage } from \"../capture/describe-attach-image\";\nimport { describeGenerateImage } from \"../capture/describe-generate-image\";\nimport { describeRecordVideo } from \"../capture/describe-record-video\";\nimport { describeTakeScreenshot } from \"../capture/describe-take-screenshot\";\nimport { describeMemorySearch } from \"./describe-memory-search\";\nimport { describeReportDevServer } from \"./describe-report-dev-server\";\nimport { describeRequestEnvVars } from \"./describe-request-env-vars\";\nimport { describeAttachFile } from \"../deliverable/describe-attach-file\";\nimport { updateTaskLabels } from \"./update-task-labels\";\nimport { describeNativePatch } from \"./describe-native-patch\";\n\nexport const canonicalToolActivityDescribers: ReadonlyMap<\n string,\n (record: Record<string, unknown>, state: ToolActivityState) => ToolActivity\n> = new Map([\n [\"apply_patch\", describeNativePatch],\n [HOST_TOOL_NAMES.ADVISE, () => labelOnly(\"Advised the watched session\")],\n [\n \"read\",\n (record) =>\n labelOnly(\n `Read ${toolActivityBasename(toolInput.str(record.file_path) ?? toolInput.str(record.path)) ?? \"a file\"}`,\n ),\n ],\n [\n \"write\",\n (record) =>\n labelOnly(\n `Wrote ${toolActivityBasename(toolInput.str(record.file_path) ?? toolInput.str(record.path)) ?? \"a file\"}`,\n ),\n ],\n [\n \"edit\",\n (record) =>\n labelOnly(\n `Edited ${toolActivityBasename(toolInput.str(record.file_path) ?? toolInput.str(record.path)) ?? \"a file\"}`,\n ),\n ],\n [\n \"bash\",\n (record) => {\n // Native harnesses may omit either the intent or the command.\n const command =\n toolInput.verbatim(record.command) ?? toolInput.verbatim(record.cmd);\n const intent = toolInput.trimmed(record.description);\n if (!command && !intent) {\n return labelOnly(\"Ran a command\");\n }\n return { text: intent, command };\n },\n ],\n [\n WORKSPACE_TOOL_NAMES.TASK_OUTPUT,\n () => labelOnly(\"Read a background command's output\"),\n ],\n [\n WORKSPACE_TOOL_NAMES.TASK_STOP,\n () => labelOnly(\"Stopped a background command\"),\n ],\n [\n \"grep\",\n (record) => {\n const pattern =\n toolInput.str(record.pattern) ?? toolInput.str(record.query);\n return labelOnly(\n pattern ? `Searched \"${toolInput.truncate(pattern, 60)}\"` : \"Searched\",\n );\n },\n ],\n [\n \"glob\",\n (record) => {\n const pattern =\n toolInput.str(record.pattern) ?? toolInput.str(record.glob);\n return labelOnly(\n pattern\n ? `Matched ${toolInput.truncate(pattern, 60)}`\n : \"Matched files\",\n );\n },\n ],\n [\n \"ls\",\n (record) => {\n const path = toolInput.str(record.path) ?? toolInput.str(record.dir);\n return labelOnly(path ? `Listed ${path}` : \"Listed a directory\");\n },\n ],\n [\n \"webfetch\",\n (record) => {\n const host = toolActivityHostname(toolInput.str(record.url));\n return labelOnly(host ? `Fetched ${host}` : \"Fetched a page\");\n },\n ],\n [\n \"websearch\",\n (record) => {\n const query = toolInput.str(record.query) ?? toolInput.str(record.q);\n return labelOnly(\n query\n ? `Searched the web for \"${toolInput.truncate(query, 60)}\"`\n : \"Searched the web\",\n );\n },\n ],\n [\"task\", () => labelOnly(\"Ran a subagent\")],\n [\n HOST_TOOL_NAMES.SET_STEPS,\n (record) => {\n const steps = Array.isArray(record.steps) ? record.steps.length : null;\n return labelOnly(\n steps\n ? `Planned ${steps} step${steps === 1 ? \"\" : \"s\"}`\n : \"Planned the work\",\n );\n },\n ],\n [\n HOST_TOOL_NAMES.SET_TODOS,\n (record) => {\n const step = toolInput.trimmed(record.step);\n return labelOnly(step ? `Updated the plan: ${step}` : \"Updated the plan\");\n },\n ],\n [\n HOST_TOOL_NAMES.SAVE_DEV_ENV_MANIFEST,\n () => labelOnly(\"Saved the dev environment manifest\"),\n ],\n [\n HOST_TOOL_NAMES.REQUEST_DEV_ENV_CREDENTIALS,\n (record) => {\n const asked = Array.isArray(record.credentials)\n ? record.credentials.length\n : null;\n return labelOnly(\n asked\n ? `Requested ${asked} credential${asked === 1 ? \"\" : \"s\"}`\n : \"Requested credentials\",\n );\n },\n ],\n [HOST_TOOL_NAMES.REQUEST_ENV_VARS, describeRequestEnvVars],\n [\n HOST_TOOL_NAMES.GENERATE_DEV_ENV_SECRET,\n (record) =>\n labelOnly(\n typeof record.name === \"string\"\n ? `Generated ${record.name}`\n : \"Generated a dev environment secret\",\n ),\n ],\n [\n HOST_TOOL_NAMES.SET_DEV_ENV_SIZING,\n () => labelOnly(\"Recorded the dev environment sizing\"),\n ],\n [HOST_TOOL_NAMES.BAKE_DEV_ENV, () => labelOnly(\"Baked the dev environment\")],\n [\n HOST_TOOL_NAMES.DETECT_PROJECT_DATABASE,\n () => labelOnly(\"Recorded the project database\"),\n ],\n [\n HOST_TOOL_NAMES.BIND_PROJECT_DATABASE,\n () => labelOnly(\"Requested approval to bind the project database\"),\n ],\n [\n HOST_TOOL_NAMES.DATABASE_QUERY,\n (record) => {\n const branch = toolInput.trimmed(record.branch) ?? \"production\";\n const sql = toolInput.verbatim(record.sql);\n return sql\n ? { text: `Read the database (${branch})`, command: sql }\n : labelOnly(`Read the database (${branch})`);\n },\n ],\n [\n HOST_TOOL_NAMES.DATABASE_WRITE,\n (record) => {\n const branch = toolInput.trimmed(record.branch) ?? \"production\";\n const sql = toolInput.verbatim(record.sql);\n return sql\n ? {\n text: `Requested approval to write to the database (${branch})`,\n command: sql,\n }\n : labelOnly(`Requested approval to write to the database (${branch})`);\n },\n ],\n [HOST_TOOL_NAMES.TAKE_SCREENSHOT, describeTakeScreenshot],\n [HOST_TOOL_NAMES.RECORD_VIDEO, describeRecordVideo],\n [HOST_TOOL_NAMES.ATTACH_IMAGE, describeAttachImage],\n [HOST_TOOL_NAMES.ATTACH_FILE, describeAttachFile],\n [\n HOST_TOOL_NAMES.GET_IMAGE_GENERATORS,\n () => labelOnly(\"Listed the image models\"),\n ],\n [\n HOST_TOOL_NAMES.ASK_USER,\n (record) => {\n const asked = Array.isArray(record.questions)\n ? record.questions.length\n : null;\n return labelOnly(\n asked\n ? `Asked ${asked} question${asked === 1 ? \"\" : \"s\"}`\n : \"Asked a question\",\n );\n },\n ],\n [\n HOST_TOOL_NAMES.PROPOSE_PLAN,\n (record) => {\n const title = toolInput.trimmed(record.title);\n return labelOnly(\n title\n ? `Proposed a plan: ${toolInput.truncate(title, 60)}`\n : \"Proposed a plan\",\n );\n },\n ],\n [\n HOST_TOOL_NAMES.REQUEST_GUARDRAIL_APPROVAL,\n () => labelOnly(\"Asked for an approval\"),\n ],\n [\n HOST_TOOL_NAMES.REPORT_CONFIDENCE,\n () => labelOnly(\"Reported its confidence\"),\n ],\n [\n HOST_TOOL_NAMES.REPORT_HARNESS_ISSUE,\n (record) => {\n const title = toolInput.trimmed(record.title);\n return labelOnly(\n title\n ? `Reported a harness issue: ${toolInput.truncate(title, 60)}`\n : \"Reported a harness issue\",\n );\n },\n ],\n [HOST_TOOL_NAMES.MEMORY_SEARCH, describeMemorySearch],\n [HOST_TOOL_NAMES.REPORT_DEV_SERVER, describeReportDevServer],\n [HOST_TOOL_NAMES.MEMORY_WRITE, () => labelOnly(\"Wrote to its memory\")],\n [\n HOST_TOOL_NAMES.READ_SESSION,\n (record) => {\n const goal = toolInput.str(record.goal);\n return labelOnly(\n goal\n ? `Read another chat: ${toolInput.truncate(goal, 60)}`\n : \"Read another chat\",\n );\n },\n ],\n [\n HOST_TOOL_NAMES.PROJECT_CONTEXT_READ,\n () => labelOnly(\"Read the project's shared context\"),\n ],\n [\n HOST_TOOL_NAMES.PROJECT_CONTEXT_WRITE,\n (record) => {\n const title = toolInput.verbatim(record.title);\n return title\n ? labelOnly(\n `Wrote to the project context: ${toolInput.truncate(title, 60)}`,\n )\n : labelOnly(\"Wrote to the project context\");\n },\n ],\n [\n HOST_TOOL_NAMES.RUN_VALIDATION,\n (record) => {\n const command = toolInput.verbatim(record.command);\n return command\n ? { text: \"Ran a validation command\", command }\n : labelOnly(\"Ran a validation command\");\n },\n ],\n [\n HOST_TOOL_NAMES.CREATE_TASK,\n (record) => {\n const title = toolInput.trimmed(record.title);\n return labelOnly(\n title\n ? `Created task \"${toolInput.truncate(title, 60)}\"`\n : \"Created a team task\",\n );\n },\n ],\n [HOST_TOOL_NAMES.LIST_TASKS, () => labelOnly(\"Listed the team tasks\")],\n [HOST_TOOL_NAMES.WORKFLOW, describeWorkflow],\n [HOST_TOOL_NAMES.PICKUP_TASK, () => labelOnly(\"Picked up a team task\")],\n [\n HOST_TOOL_NAMES.UPDATE_TASK,\n (record) => {\n const action = toolInput.str(record.action);\n return labelOnly(\n (action ? updateTaskLabels.get(action) : null) ?? \"Updated a team task\",\n );\n },\n ],\n [\n HOST_TOOL_NAMES.DELIVERABLE_PUBLISH,\n () => labelOnly(\"Published a deliverable\"),\n ],\n [\n HOST_TOOL_NAMES.RENAME_SESSION,\n (record) => {\n const title = toolInput.trimmed(record.title);\n return labelOnly(\n title\n ? `Renamed the chat \"${toolInput.truncate(title, 60)}\"`\n : \"Renamed the chat\",\n );\n },\n ],\n [HOST_TOOL_NAMES.GENERATE_IMAGE, describeGenerateImage],\n [HOST_TOOL_NAMES.ANNOTATE_IMAGE, describeAnnotateImage],\n ...integrationToolActivityDescribers,\n ...browserToolActivityDescribers,\n ...designToolActivityDescribers,\n ...reviewToolActivityDescribers,\n ...factoryToolActivityDescribers,\n]);\n","import { HOST_TOOL_NAMES } from \"../../turns/turn-constants\";\n\nexport const SOFT_FAIL_BROWSER_TOOLS = new Set<string>([\n HOST_TOOL_NAMES.BROWSER_NAVIGATE,\n HOST_TOOL_NAMES.BROWSER_SNAPSHOT,\n HOST_TOOL_NAMES.BROWSER_ACT,\n HOST_TOOL_NAMES.BROWSER_AUTOPILOT,\n HOST_TOOL_NAMES.BROWSER_WAIT,\n HOST_TOOL_NAMES.BROWSER_INSPECT,\n HOST_TOOL_NAMES.BROWSER_SCREENSHOT,\n HOST_TOOL_NAMES.BROWSER_RECORD_START,\n HOST_TOOL_NAMES.BROWSER_RECORD_STOP,\n HOST_TOOL_NAMES.BROWSER_CLOSE,\n HOST_TOOL_NAMES.REPL_EVAL,\n HOST_TOOL_NAMES.REPL_RESET,\n]);\n","import { SOFT_FAIL_BROWSER_TOOLS } from \"./soft-fail-browser-tools-constants\";\n\n/** Anchored at the START: a snapshot of a page reading \"login failed\" is a\n * successful read, and a loose match would paint it as an error. */\nexport function softFailedBrowser(toolName: string, output: unknown): boolean {\n return (\n SOFT_FAIL_BROWSER_TOOLS.has(toolName) &&\n typeof output === \"string\" &&\n /^(?:browser|repl)_[a-z_]+ failed:/.test(output.trimStart())\n );\n}\n","import { HOST_TOOL_NAMES } from \"../../turns/turn-constants\";\n\nexport const SOFT_FAIL_CAPTURE_TOOLS = new Set<string>([\n HOST_TOOL_NAMES.TAKE_SCREENSHOT,\n HOST_TOOL_NAMES.RECORD_VIDEO,\n HOST_TOOL_NAMES.ATTACH_IMAGE,\n HOST_TOOL_NAMES.ATTACH_FILE,\n HOST_TOOL_NAMES.GENERATE_IMAGE,\n HOST_TOOL_NAMES.ANNOTATE_IMAGE,\n]);\n","import { SOFT_FAIL_CAPTURE_TOOLS } from \"./soft-fail-capture-tools-constants\";\n/**\n * Capture tools report failure as prose on a `completed` call, always opening\n * with their own name. Anchored there: a delivered `failed.txt` is a success.\n */\nexport function softFailedCapture(toolName: string, output: unknown): boolean {\n if (!SOFT_FAIL_CAPTURE_TOOLS.has(toolName) || typeof output !== \"string\") {\n return false;\n }\n return output.trimStart().startsWith(`${toolName} failed`);\n}\n","import type { DescribeToolActivityOptions } from \"./describe-tool-activity-options\";\nimport type { ToolActivityState } from \"./tool-activity-state\";\nimport { softFailedBrowser } from \"./browser/soft-failed-browser\";\nimport { softFailedCapture } from \"./capture/soft-failed-capture\";\n/**\n * A running call is labelled in the progressive tense; a failed one says so.\n * Capture tools report their failures as prose on a `completed` call, so the\n * output is read too rather than trusting the status alone.\n */\nexport function toolActivityStateFor(\n toolName: string,\n options: DescribeToolActivityOptions | undefined,\n): ToolActivityState {\n const isRunning = options?.status === \"running\";\n return {\n isRunning,\n hasFailed:\n options?.status === \"failed\" ||\n (!isRunning &&\n (softFailedCapture(toolName, options?.output) ||\n softFailedBrowser(toolName, options?.output))),\n };\n}\n","// Most specific first: adapters disagree on which key carries the slug.\nexport const SKILL_NAME_KEYS = [\n \"skill\",\n \"skill_name\",\n \"skillName\",\n \"name\",\n \"command\",\n];\n\nexport const SKILL_FILE = \"skill.md\";\n","import { toolInput } from \"../tool-input\";\nimport { SKILL_NAME_KEYS } from \"./skill-call-constants\";\n\n/** The skill slug a loader call targets, or null when the input is unreadable. */\nexport function skillNameFromInput(input: unknown): string | null {\n if (!toolInput.isRecord(input)) {\n return null;\n }\n for (const key of SKILL_NAME_KEYS) {\n const value = input[key];\n if (typeof value === \"string\" && value.trim().length > 0) {\n // `command` may arrive as \"dataviz some args\": the slug is its head.\n // A plugin-namespaced `plugin:skill` stays whole.\n return value.trim().split(/\\s+/u)[0] ?? null;\n }\n }\n return null;\n}\n","import { toolInput } from \"../tool-input\";\n\nexport function stringField(input: unknown, key: string): string | null {\n return toolInput.isRecord(input) ? toolInput.trimmed(input[key]) : null;\n}\n","import { HOST_TOOL_NAMES } from \"../../turns/turn-constants\";\nimport type { SkillCall } from \"../skill/skill-call\";\nimport { skillNameFromInput } from \"./skill-name-from-input\";\nimport { stringField } from \"./string-field\";\n\n// Keyed by the platform's own constants: a renamed host tool must break the\n// build here, not silently fall back to a raw monospace row.\nexport const registryCalls: Record<string, (input: unknown) => SkillCall> = {\n [HOST_TOOL_NAMES.SKILL_SEARCH]: (input) => ({\n kind: \"search\",\n query: stringField(input, \"query\"),\n }),\n [HOST_TOOL_NAMES.SKILL_LOAD]: (input) => ({\n kind: \"load\",\n name: skillNameFromInput(input),\n via: \"tool\",\n }),\n [HOST_TOOL_NAMES.SAVE_SKILL]: (input) => ({\n kind: \"save\",\n name: stringField(input, \"name\"),\n }),\n [HOST_TOOL_NAMES.PROPOSE_SKILL_EDIT]: (input) => ({\n kind: \"edit\",\n name: stringField(input, \"name\"),\n }),\n [HOST_TOOL_NAMES.RECORD_REVIEW_LESSON]: (input) => ({\n kind: \"lesson\",\n scope: stringField(input, \"scope\"),\n }),\n};\n","import { toolActivityStateFor } from \"@repo/agents/tool-activity\";\n\nimport { out } from \"../output/out\";\nimport type { TranscriptEvent } from \"@/lib/event/transcript-event\";\n\n/** Some tools report failure as prose on a completed call: the state knows. */\nexport function formatToolPart(\n part: Extract<TranscriptEvent[\"part\"], { kind: \"tool\" }>,\n): string {\n const { hasFailed } = toolActivityStateFor(part.toolName, {\n status: part.status,\n output: part.output,\n });\n const status = hasFailed ? \"failed\" : part.status;\n return `${out.paint(\"tool\", \"dim\")} ${out.cell(part.toolName)} ${out.paint(`(${status})`, \"dim\")}`;\n}\n","import { out } from \"../output/out\";\nimport { formatAdvisorPart } from \"@/lib/event/format-advisor-part\";\nimport { formatDeliverablePart } from \"@/lib/event/format-deliverable-part\";\nimport { formatToolPart } from \"@/lib/event/format-tool-part\";\nimport type { TranscriptEvent } from \"@/lib/event/transcript-event\";\nimport { truncate } from \"@/lib/truncate/truncate\";\n\n/**\n * One transcript event as one readable block.\n *\n * The transcript is the only honest account of what the agent did, so the\n * shapes that matter to a reviewer — tool calls, file changes, questions,\n * guardrails, errors — each keep a distinct marker instead of collapsing into\n * prose.\n */\nexport function formatEvent(\n event: TranscriptEvent,\n baseUrl: string,\n): string | null {\n const part = event.part;\n\n switch (part.kind) {\n case \"text\":\n if (part.authorUserId) {\n return `${out.paint(\"you\", \"magenta\")} ${truncate(part.text)}`;\n }\n // Text with no author but a source was injected by the platform (an\n // integration trigger, an inbox event): the transcript contract says it\n // must never be attributed to the model.\n if (part.source) {\n return out.paint(`system ${truncate(part.text, 400)}`, \"dim\");\n }\n return `${out.paint(\"agent\", \"blue\")} ${truncate(part.text)}`;\n case \"reasoning\":\n return out.paint(`think ${truncate(part.text, 400)}`, \"dim\");\n case \"tool\":\n return formatToolPart(part);\n case \"file_change\":\n return `${out.paint(\"file\", \"dim\")} ${part.changeType.padEnd(8)} ${out.cell(part.path)}`;\n case \"question\":\n return out.paint(\n `ask question round ${part.questionBatchId} — answer with \\`hepha questions answer ${part.questionBatchId}\\``,\n \"yellow\",\n );\n // No CLI verb decides a plan: the accept/refuse pair lives in the app.\n case \"plan\":\n return out.paint(\n `plan plan ${part.planProposalId} awaits accept/refuse in the app`,\n \"yellow\",\n );\n case \"approval\":\n return out.paint(\n `gate guardrail ${part.guardrailRequestId} needs a human — \\`hepha approvals show ${part.guardrailRequestId}\\``,\n \"yellow\",\n );\n case \"media\": {\n // The signed URL is why this part exists: a screenshot or a recording is\n // the session's proof, and a reader who cannot open it has nothing.\n const target = part.url ?? part.pathname;\n return `${out.paint(\"media\", \"dim\")} ${part.mediaType}${part.caption ? ` — ${out.cell(part.caption)}` : \"\"}${target ? `\\n ${out.cell(target)}` : \"\"}`;\n }\n case \"advisor\":\n return formatAdvisorPart(part);\n case \"deliverable\":\n return formatDeliverablePart(part, event.sessionId, baseUrl);\n case \"error\":\n return out.paint(`error ${truncate(part.message)}`, \"red\");\n case \"external_event\":\n return `${out.paint(\"event\", \"dim\")} ${out.cell(part.title)}${part.conclusion ? ` — ${out.cell(part.conclusion)}` : \"\"}`;\n case \"system\":\n return out.paint(`system ${truncate(part.text, 300)}`, \"dim\");\n // The session's opening row: with the fenced prompt hidden, this is the\n // only place a CLI reader sees what the run was asked to do.\n case \"source_context\":\n return `${out.paint(\"source\", \"dim\")} ${out.cell(\n [part.reference, part.title].filter(Boolean).join(\" \"),\n )}${part.url ? ` — ${out.cell(part.url)}` : \"\"}${\n part.body ? `\\n ${truncate(part.body, 400)}` : \"\"\n }`;\n case \"verification\":\n return `${out.paint(\"check\", \"dim\")} ${out.cell(part.name)} ${out.paint(`(${part.status})`, \"dim\")}`;\n default:\n return null;\n }\n}\n","import { formatEvent } from \"@/lib/event/format-event\";\nimport { out } from \"@/lib/output/out\";\nimport type { ApiOutputs } from \"@/lib/api/api-outputs\";\n\nexport function consumeSessionEvents(\n events: ApiOutputs[\"sessions\"][\"events\"][\"items\"],\n cursor: number,\n quiet: boolean | undefined,\n baseUrl: string,\n): number {\n for (const event of events) {\n cursor = Math.max(cursor, event.sequence);\n if (quiet) {\n continue;\n }\n const line = formatEvent(event, baseUrl);\n if (line) {\n out.line(line);\n }\n }\n return cursor;\n}\n","export function sleep(seconds: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, seconds * 1000));\n}\n","// setTimeout stores its delay in a signed 32-bit int and fires AT ONCE past it.\nexport const MAX_TIMER_MS = 2_147_483_647;\n","import { MAX_TIMER_MS } from \"./sleep-constants\";\n\n/** A wait a timer can actually hold: longer means \"as long as it can\". */\nexport function timerDelayMs(seconds: number): number {\n return Math.min(Math.max(0, seconds) * 1_000, MAX_TIMER_MS);\n}\n","import { CliError } from \"@/lib/cli/cli-error\";\nimport { CLI_ERROR_CODES } from \"@/lib/shared/errors-constants\";\nimport { timerDelayMs } from \"./timer-delay-ms\";\n\nexport function interruptibleSleep(seconds: number): Promise<void> {\n return new Promise((resolve, reject) => {\n const onInterrupt = () => {\n clearTimeout(timer);\n reject(\n new CliError(\"Follow interrupted.\", 130, {\n code: CLI_ERROR_CODES.INTERRUPTED,\n }),\n );\n };\n const timer = setTimeout(() => {\n process.removeListener(\"SIGINT\", onInterrupt);\n resolve();\n }, timerDelayMs(seconds));\n process.once(\"SIGINT\", onInterrupt);\n });\n}\n","import { api } from \"@/lib/api/api\";\nimport { out } from \"@/lib/output/out\";\nimport { sleep } from \"@/lib/sleep/sleep\";\nimport { interruptibleSleep } from \"@/lib/sleep/interruptible-sleep\";\nimport type { FollowSessionDependencies } from \"./follow-session-dependencies\";\n\nexport const defaultFollowSessionDependencies: FollowSessionDependencies = {\n request: api,\n pollSleep: sleep,\n retrySleep: interruptibleSleep,\n random: Math.random,\n // Monotonic: an NTP step backwards must not hand the outage budget more time\n // to burn, nor mute the periodic reminder until the clock catches up.\n now: () => performance.now(),\n warn: (message) => out.warn(message),\n};\n","export function followOutageMessage(warned: boolean): string {\n return warned\n ? \"Hepha API still unavailable; retrying follow.\"\n : \"Hepha API unavailable; retrying follow.\";\n}\n","export const FOLLOW_RETRY_CAP_SECONDS = 22.5;\nexport const FOLLOW_OUTAGE_FEEDBACK_MS = 5 * 60 * 1_000;\n// The platform's own transient class, kept identical: see TRANSIENT_STATUS in\n// packages/tasks/src/lib/failure/classify/classify-harness-failure-constants.ts.\nexport const RETRYABLE_FOLLOW_STATUS = new Set([\n 408, 425, 429, 500, 502, 503, 504,\n]);\n","import { CliError } from \"@/lib/cli/cli-error\";\nimport { FOLLOW_RETRY_CAP_SECONDS } from \"./follow-retry-constants\";\n\nexport function followRetryDelay(\n error: CliError,\n failures: number,\n random: () => number,\n): number {\n const exponential = Math.min(\n FOLLOW_RETRY_CAP_SECONDS,\n 2 ** Math.min(failures - 1, 30),\n );\n const jittered = exponential / 2 + random() * (exponential / 2);\n // Retry-After is the server telling us when it will be ready: honoured whole,\n // and merely spread on top so followers do not wake as one.\n const retryAfter = Math.max(0, error.details.retryAfterSeconds ?? 0);\n return Math.max(jittered, retryAfter + random() * (exponential / 2));\n}\n","/** Infinity when no budget was set: the follow then waits any outage out. */\nexport function remainingOutageSeconds(\n outageStartedAt: number,\n now: number,\n maxOutageMs: number | null,\n): number {\n if (maxOutageMs === null) {\n return Number.POSITIVE_INFINITY;\n }\n return (maxOutageMs - (now - outageStartedAt)) / 1_000;\n}\n","import { CliError } from \"@/lib/cli/cli-error\";\nimport { CLI_ERROR_CODES } from \"@/lib/shared/errors-constants\";\nimport { RETRYABLE_FOLLOW_STATUS } from \"./follow-retry-constants\";\n\nexport function retryableFollowError(error: unknown): error is CliError {\n return (\n error instanceof CliError &&\n (RETRYABLE_FOLLOW_STATUS.has(error.details.status ?? 0) ||\n error.details.code === CLI_ERROR_CODES.NETWORK ||\n error.details.code === CLI_ERROR_CODES.TIMEOUT)\n );\n}\n","import { FOLLOW_OUTAGE_FEEDBACK_MS } from \"./follow-retry-constants\";\n\nexport function shouldReportFollowOutage(\n lastWarnedAt: number | null,\n now: number,\n): boolean {\n return (\n lastWarnedAt === null || now - lastWarnedAt >= FOLLOW_OUTAGE_FEEDBACK_MS\n );\n}\n","import { nextPollDelay } from \"@/lib/retry/next-poll-delay\";\nimport type { FollowSessionDependencies } from \"../follow-session-dependencies\";\nimport { followOutageMessage } from \"./follow-outage-message\";\nimport { followRetryDelay } from \"./follow-retry-delay\";\nimport type { FollowRetryState } from \"./follow-retry-state\";\nimport { remainingOutageSeconds } from \"./remaining-outage-seconds\";\nimport { retryableFollowError } from \"./retryable-follow-error\";\nimport { shouldReportFollowOutage } from \"./should-report-follow-outage\";\n\n/** Wait out one failure, or rethrow the ones a follow cannot sit through. */\nexport async function waitForFollowRetry(params: {\n error: unknown;\n retry: FollowRetryState;\n maxOutageMs: number | null;\n dependencies: FollowSessionDependencies;\n}): Promise<void> {\n const { error, retry, dependencies } = params;\n if (!retryableFollowError(error)) {\n throw error;\n }\n retry.failures += 1;\n const now = dependencies.now();\n retry.outageStartedAt ??= now;\n // Unbudgeted, a follow waits any outage out; budgeted, the sleep stops at the\n // deadline and the last failure reaches the caller as its exit code.\n const delay = nextPollDelay(\n followRetryDelay(error, retry.failures, dependencies.random),\n remainingOutageSeconds(retry.outageStartedAt, now, params.maxOutageMs),\n );\n if (delay === null) {\n throw error;\n }\n if (shouldReportFollowOutage(retry.lastWarnedAt, now)) {\n dependencies.warn(followOutageMessage(retry.warned));\n retry.warned = true;\n retry.lastWarnedAt = now;\n }\n await dependencies.retrySleep(delay);\n // Waking up on the deadline itself: fail with the real failure rather than\n // spend the caller's last millisecond on a request that cannot land.\n if (\n remainingOutageSeconds(\n retry.outageStartedAt,\n dependencies.now(),\n params.maxOutageMs,\n ) <= 0\n ) {\n throw error;\n }\n}\n","import type { FollowSessionDependencies } from \"../follow-session-dependencies\";\nimport type { FollowRetryState } from \"./follow-retry-state\";\nimport { waitForFollowRetry } from \"./wait-for-follow-retry\";\n\nexport async function requestWithFollowRetry<T>(params: {\n operation: () => Promise<T>;\n retry: FollowRetryState;\n maxOutageMs: number | null;\n dependencies: FollowSessionDependencies;\n}): Promise<T> {\n for (;;) {\n try {\n const result = await params.operation();\n if (params.retry.warned) {\n params.dependencies.warn(\"Hepha API recovered; continuing follow.\");\n }\n params.retry.failures = 0;\n params.retry.warned = false;\n params.retry.lastWarnedAt = null;\n params.retry.outageStartedAt = null;\n return result;\n } catch (error) {\n await waitForFollowRetry({\n error,\n retry: params.retry,\n maxOutageMs: params.maxOutageMs,\n dependencies: params.dependencies,\n });\n }\n }\n}\n","export const BLOCKED = new Set([\"waiting_human\", \"awaiting_approval\"]);\n","export const TERMINAL = new Set([\"completed\", \"failed\", \"killed\", \"abstained\"]);\n","import { BLOCKED } from \"@/lib/blocked/blocked-constants\";\nimport { TERMINAL } from \"@/lib/terminal/terminal-constants\";\n\n// Undefined is a deployment too old to report the status on an events page.\nexport function isFollowStopStatus(status: string | undefined): boolean {\n return status !== undefined && (TERMINAL.has(status) || BLOCKED.has(status));\n}\n","import { CliError } from \"@/lib/cli/cli-error\";\n\n/** Unset means forever: only a caller with no Ctrl-C needs an exit code. */\nexport function resolveFollowOutageBudget(): number | null {\n const raw = process.env.HEPHA_FOLLOW_MAX_OUTAGE_SECONDS?.trim();\n if (!raw) {\n return null;\n }\n // Checked in milliseconds: a finite 1e306 seconds overflows to an Infinity\n // budget, which would silently never expire.\n const budgetMs = Number(raw) * 1_000;\n if (!Number.isFinite(budgetMs) || budgetMs <= 0) {\n throw new CliError(\n `HEPHA_FOLLOW_MAX_OUTAGE_SECONDS expects a positive number of seconds, got \"${raw}\".`,\n 2,\n );\n }\n return budgetMs;\n}\n","import { resolveTimeout } from \"@/lib/timeout/resolve-timeout\";\nimport type { FollowRetryState } from \"./follow-retry-state\";\nimport { remainingOutageSeconds } from \"./remaining-outage-seconds\";\n\n/** A request may not outlive the outage budget it is being retried under. */\nexport function followRequestTimeoutMs(\n retry: FollowRetryState,\n maxOutageMs: number | null,\n now: number,\n): number {\n if (retry.outageStartedAt === null) {\n return resolveTimeout();\n }\n const remainingMs =\n remainingOutageSeconds(retry.outageStartedAt, now, maxOutageMs) * 1_000;\n return Math.max(1, Math.min(resolveTimeout(), remainingMs));\n}\n","import { config } from \"@/lib/shared/config\";\nimport { path } from \"../path/path\";\nimport { expectShape } from \"../expect/expect-shape\";\nimport { is } from \"../is/is\";\nimport { POLL_SECONDS, PAGE_SIZE } from \"@/lib/follow/follow-constants\";\nimport type { SessionDetail } from \"@/lib/session/session-detail\";\nimport { consumeSessionEvents } from \"@/lib/session/consume-session-events\";\nimport type { ApiOutputs } from \"@/lib/api/api-outputs\";\nimport type { FollowRetryState } from \"@/lib/session/retry/follow-retry-state\";\nimport type { FollowSessionDependencies } from \"@/lib/session/follow-session-dependencies\";\nimport { defaultFollowSessionDependencies } from \"@/lib/session/default-follow-session-dependencies\";\nimport { requestWithFollowRetry } from \"@/lib/session/retry/request-with-follow-retry\";\nimport { isFollowStopStatus } from \"@/lib/session/is-follow-stop-status\";\nimport { resolveFollowOutageBudget } from \"@/lib/session/retry/resolve-follow-outage-budget\";\nimport { followRequestTimeoutMs } from \"@/lib/session/retry/follow-request-timeout-ms\";\n\n/**\n * Follow a session until it finishes or needs a person.\n *\n * Stopping on `waiting_human` / `awaiting_approval` is the important part: the\n * agent parks there and burns nothing, so a follower that kept waiting would\n * hang forever. The caller turns that into a distinct exit code, which is what\n * lets an orchestrating agent branch on \"it asked me something\".\n */\nexport async function followSession(\n sessionId: string,\n options: { quiet?: boolean; after?: number } = {},\n dependencies: FollowSessionDependencies = defaultFollowSessionDependencies,\n): Promise<SessionDetail> {\n // Resuming a follow starts where the caller left off, so `--after` does not\n // replay (and reprint) the whole transcript.\n let cursor = options.after ?? 0;\n let emptyPolls = 0;\n const retry: FollowRetryState = {\n failures: 0,\n warned: false,\n lastWarnedAt: null,\n outageStartedAt: null,\n };\n const maxOutageMs = resolveFollowOutageBudget();\n // The transcript prints durable download links, which need the API origin.\n const { baseUrl } = config.load();\n\n for (;;) {\n const page = await requestWithFollowRetry({\n retry,\n maxOutageMs,\n dependencies,\n operation: async () =>\n expectShape<\n Omit<ApiOutputs[\"sessions\"][\"events\"], \"status\"> & { status?: string }\n >(\n await dependencies.request(path`/sessions/${sessionId}/events`, {\n query: { after: cursor || undefined, limit: PAGE_SIZE },\n timeoutMs: followRequestTimeoutMs(\n retry,\n maxOutageMs,\n dependencies.now(),\n ),\n }),\n \"GET /sessions/{id}/events\",\n {\n items: is.array,\n hasMore: (value) => typeof value === \"boolean\",\n nextCursor: (value) => value === null || is.number(value),\n // Optional: a deployment older than this binary omits it, and a\n // missing field here would be a non-retryable schema mismatch.\n status: is.optionalString,\n },\n ),\n });\n\n cursor = consumeSessionEvents(page.items, cursor, options.quiet, baseUrl);\n\n // Advance on the SERVER's cursor, not on what we could render. The API\n // paginates raw rows and drops the ones with no transcript representation,\n // so a page can come back empty with hasMore true — following the items\n // alone would re-request the same page forever, without even sleeping.\n if (page.nextCursor !== null) {\n cursor = Math.max(cursor, page.nextCursor);\n }\n\n if (page.hasMore) {\n continue;\n }\n\n emptyPolls = page.items.length === 0 ? emptyPolls + 1 : 0;\n if (\n isFollowStopStatus(page.status) ||\n page.items.length > 0 ||\n emptyPolls >= 3\n ) {\n const session = await requestWithFollowRetry({\n retry,\n maxOutageMs,\n dependencies,\n operation: async () =>\n expectShape<SessionDetail>(\n await dependencies.request(path`/sessions/${sessionId}`, {\n timeoutMs: followRequestTimeoutMs(\n retry,\n maxOutageMs,\n dependencies.now(),\n ),\n }),\n \"GET /sessions/{id}\",\n { status: is.string },\n ),\n });\n emptyPolls = 0;\n if (isFollowStopStatus(session.status)) {\n return session;\n }\n }\n\n await dependencies.pollSleep(POLL_SECONDS);\n }\n}\n","import { out } from \"@/lib/output/out\";\nimport type { SessionDetail } from \"@/lib/session/session-detail\";\n\nexport function buildSessionDetailRows(session: SessionDetail): string[][] {\n const rows: string[][] = [[\"id\", out.cell(session.id)]];\n if (session.statusReason) {\n rows.push([\"reason\", out.cell(session.statusReason)]);\n }\n if (session.repoFullName) {\n const branch = session.repos.find(\n (repo) => repo.repoFullName === session.repoFullName,\n )?.branch;\n rows.push([\n \"repo\",\n out.cell(session.repoFullName + (branch ? ` @ ${branch}` : \"\")),\n ]);\n }\n rows.push([\"task\", session.taskType]);\n if (session.model) {\n rows.push([\"model\", out.cell(session.model)]);\n }\n if (session.prUrl) {\n rows.push([\n \"pr\",\n out.cell(\n `${session.prUrl}${session.prState ? ` (${session.prState})` : \"\"}`,\n ),\n ]);\n }\n for (const deliverable of session.deliverables) {\n if (deliverable.url && deliverable.url !== session.prUrl) {\n rows.push([out.cell(deliverable.type), out.cell(deliverable.url)]);\n }\n }\n return rows;\n}\n","import { out } from \"@/lib/output/out\";\nimport type { SessionDetail } from \"@/lib/session/session-detail\";\n\nexport function printPlaybookSteps(\n steps: NonNullable<SessionDetail[\"playbook\"]>[\"steps\"],\n): void {\n if (steps.length === 0) {\n return;\n }\n out.line();\n for (const step of steps) {\n const done = step.todos.filter(\n (todo) => todo.status === \"completed\",\n ).length;\n const marker =\n done === step.todos.length && step.todos.length > 0 ? \"✓\" : \"·\";\n out.line(\n ` ${marker} ${out.cell(step.title)} ${out.paint(`${done}/${step.todos.length}`, \"dim\")}`,\n );\n }\n}\n","import { out } from \"../output/out\";\nimport type { SessionDetail } from \"@/lib/session/session-detail\";\nimport { buildSessionDetailRows } from \"@/lib/session/build-session-detail-rows\";\nimport { printPlaybookSteps } from \"@/lib/session/print-playbook-steps\";\n\n/** The single-session view shared by `get`, `run` and every control command. */\nexport function printSession(session: SessionDetail): void {\n // Titles, reasons, URLs and step names are agent-authored: sanitise before\n // they reach a terminal (see out.safe).\n out.line(\n `${out.paint(out.cell(session.title), \"bold\")} ${out.status(session.status)}`,\n );\n\n const rows = buildSessionDetailRows(session);\n\n out.table(\n rows.map(([label, value]) => [out.paint(label ?? \"\", \"dim\"), value ?? \"\"]),\n );\n\n printPlaybookSteps(session.playbook?.steps ?? []);\n}\n","import { CliError } from \"../cli/cli-error\";\nimport type { SessionDetail } from \"@/lib/session/session-detail\";\n\n/**\n * What a followed session means for the caller's exit code.\n *\n * `followSession` returns on two very different conditions — the work is over,\n * or it needs a person — and both `run --follow` and `sessions logs --follow`\n * have to tell them apart the same way. Returns null when the session\n * completed (exit 0), a CliError carrying 3 when a human is needed, and 1 for\n * a real failure. The session rides on the error so `--json` can emit one\n * document holding both the outcome and what it applies to.\n */\nexport function sessionOutcome(session: SessionDetail): CliError | null {\n switch (session.status) {\n case \"completed\":\n return null;\n case \"waiting_human\":\n return new CliError(\n `Waiting on an answer — \\`hepha questions list --session ${session.id}\\``,\n 3,\n {},\n session,\n );\n case \"awaiting_approval\":\n return new CliError(\n \"Waiting on a guardrail approval — `hepha approvals list`\",\n 3,\n {},\n session,\n );\n default:\n return new CliError(\n `Session ended ${session.status}${session.statusReason ? `: ${session.statusReason}` : \".\"}`,\n 1,\n {},\n session,\n );\n }\n}\n","import { out } from \"../output/out\";\nimport { printSession } from \"./print-session\";\nimport { sessionOutcome } from \"./session-outcome\";\nimport type { SessionDetail } from \"./session-detail\";\n\nexport function writeFollowedSessionOutcome(\n session: SessionDetail,\n asJson: boolean,\n): void {\n const outcome = sessionOutcome(session);\n\n if (asJson) {\n if (!outcome) out.json(session);\n } else {\n out.line();\n printSession(session);\n }\n\n if (outcome) throw outcome;\n}\n","import type { CreateInput } from \"@/commands/create/create-input\";\nexport const HARNESSES = [\n \"claude-code\",\n \"codex\",\n \"cursor\",\n] as const satisfies readonly NonNullable<CreateInput[\"harnessPin\"]>[];\n","import type { CreateInput } from \"@/commands/create/create-input\";\n/**\n * Validated locally so a typo names itself, instead of travelling to the API\n * and coming back as a bare \"Input validation failed\" that says nothing about\n * which flag was wrong.\n *\n * `satisfies` against the router's own input type is what keeps these lists\n * honest: adding a task type server-side without updating this one is a\n * `types:check` failure, not a CLI that quietly refuses a valid value.\n */\nexport const TASK_TYPES = [\n \"implement\",\n \"new-project\",\n \"orchestrator\",\n \"design\",\n] as const satisfies readonly NonNullable<CreateInput[\"taskType\"]>[];\n","import { args } from \"@/lib/args/args\";\nimport type { ParsedArgs } from \"@/lib/parsed/parsed-args\";\nimport type { CreateInput } from \"@/commands/create/create-input\";\nimport { HARNESSES } from \"@/commands/harnesses/harnesses-constants\";\nimport { TASK_TYPES } from \"@/commands/task/task-types-constants\";\n\nexport function createRunInput(\n parsed: ParsedArgs,\n prompt: string,\n): CreateInput {\n const taskType = args.choice(parsed, \"task-type\", TASK_TYPES);\n const harness = args.choice(parsed, \"harness\", HARNESSES);\n\n return {\n prompt,\n ...(parsed.flags.title ? { title: parsed.flags.title } : {}),\n ...(taskType ? { taskType } : {}),\n ...(parsed.flags.model ? { modelSelection: parsed.flags.model } : {}),\n ...(harness ? { harnessPin: harness } : {}),\n ...(parsed.flags.repo ? { repoFullName: parsed.flags.repo } : {}),\n ...(parsed.flags.branch ? { branch: parsed.flags.branch } : {}),\n ...(parsed.repeated.skill ? { pinnedSkillIds: parsed.repeated.skill } : {}),\n };\n}\n","import { api } from \"../../lib/api/api\";\nimport { args } from \"../../lib/args/args\";\nimport { expectShape } from \"../../lib/expect/expect-shape\";\nimport { is } from \"../../lib/is/is\";\nimport { followSession } from \"../../lib/session/follow-session\";\nimport { out } from \"../../lib/output/out\";\nimport { printSession } from \"../../lib/session/print-session\";\nimport { writeFollowedSessionOutcome } from \"../../lib/session/write-followed-session-outcome\";\nimport { createRunInput } from \"@/commands/command/create-run-input\";\nimport type { ApiOutputs } from \"@/lib/api/api-outputs\";\nimport type { ParsedArgs } from \"@/lib/parsed/parsed-args\";\n\n/**\n * Exit code carries the outcome — 0 done, 3 waiting on a human, 1 failed — so\n * a caller can drive the loop without parsing text.\n */\nexport async function runCommand(parsed: ParsedArgs): Promise<void> {\n args.expect(parsed, {\n flags: [\n \"title\",\n \"task-type\",\n \"model\",\n \"harness\",\n \"repo\",\n \"branch\",\n \"skill\",\n ],\n booleans: [\"follow\"],\n positional: 1,\n });\n\n const prompt = args.required(parsed, 0, \"prompt\");\n const asJson = parsed.booleans.has(\"json\");\n const body = createRunInput(parsed, prompt);\n\n const session = expectShape<ApiOutputs[\"sessions\"][\"create\"]>(\n await api(\"/sessions\", { method: \"POST\", body }),\n \"POST /sessions\",\n { id: is.string, title: is.string, status: is.string },\n );\n\n if (!parsed.booleans.has(\"follow\")) {\n if (asJson) {\n out.json(session);\n return;\n }\n printSession(session);\n out.line();\n out.line(out.paint(` hepha sessions logs ${session.id} --follow`, \"dim\"));\n return;\n }\n\n const quiet = asJson || parsed.booleans.has(\"quiet\");\n\n if (!quiet) {\n out.line(out.paint(`session ${session.id}`, \"dim\"));\n out.line();\n }\n\n const final = await followSession(session.id, { quiet });\n writeFollowedSessionOutcome(final, asJson);\n}\n","import { is } from \"@/lib/is/is\";\n\nexport const ACTIONS = [\n \"list\",\n \"get\",\n \"logs\",\n \"send\",\n \"pause\",\n \"resume\",\n \"kill\",\n \"archive\",\n \"checks\",\n \"pr\",\n \"verify\",\n] as const;\n\nexport const CONTROL_PATHS: Record<string, string> = {\n pause: \"pause\",\n resume: \"resume\",\n kill: \"kill\",\n archive: \"archive\",\n};\n\nexport const STATUS_GROUPS = [\"active\", \"waiting\", \"done\"] as const;\n\nexport const SESSION_FIELDS = {\n id: is.string,\n title: is.string,\n status: is.string,\n taskType: is.string,\n repos: is.array,\n deliverables: is.array,\n};\n","import { api } from \"@/lib/api/api\";\nimport { args } from \"@/lib/args/args\";\nimport { expectShape } from \"@/lib/expect/expect-shape\";\nimport { is } from \"@/lib/is/is\";\nimport { out } from \"@/lib/output/out\";\nimport { STATUS_GROUPS } from \"@/commands/sessions/sessions-constants\";\nimport type { ApiOutputs } from \"@/lib/api/api-outputs\";\nimport type { ParsedArgs } from \"@/lib/parsed/parsed-args\";\nexport async function listSessions(parsed: ParsedArgs): Promise<void> {\n args.expect(parsed, {\n flags: [\"status\", \"repo\", \"search\", \"page\", \"limit\"],\n booleans: [\"all\"],\n positional: 1,\n });\n\n const result = expectShape<ApiOutputs[\"sessions\"][\"list\"]>(\n await api(\"/sessions\", {\n query: {\n statusGroup: args.choice(parsed, \"status\", STATUS_GROUPS),\n repoFullName: parsed.flags.repo,\n search: parsed.flags.search,\n page: args.integer(parsed, \"page\", { min: 1 }),\n limit: args.integer(parsed, \"limit\", { min: 1, max: 100 }),\n scope: parsed.booleans.has(\"all\") ? \"all\" : undefined,\n },\n }),\n \"GET /sessions\",\n { data: is.array, \"pagination.page\": is.number },\n );\n\n if (parsed.booleans.has(\"json\")) {\n out.json(result);\n return;\n }\n\n if (result.data.length === 0) {\n out.line(\"No sessions.\");\n return;\n }\n\n if (result.pagination.hasNextPage) {\n out.line(\n out.paint(\n `page ${result.pagination.page}/${result.pagination.totalPages} — --page ${result.pagination.page + 1} for more`,\n \"dim\",\n ),\n );\n out.line();\n }\n\n out.table(\n result.data.map((session) => [\n out.cell(session.id),\n out.status(session.status),\n out.cell(session.repoFullName ?? \"—\"),\n out.cell(session.title),\n ]),\n );\n}\n","import { api } from \"@/lib/api/api\";\nimport { args } from \"@/lib/args/args\";\nimport { expectShape } from \"@/lib/expect/expect-shape\";\nimport { is } from \"@/lib/is/is\";\nimport { out } from \"@/lib/output/out\";\nimport { path } from \"@/lib/path/path\";\nimport type { ApiOutputs } from \"@/lib/api/api-outputs\";\nimport type { ParsedArgs } from \"@/lib/parsed/parsed-args\";\n\nexport async function sendSessionMessage(\n parsed: ParsedArgs,\n asJson: boolean,\n): Promise<void> {\n args.expect(parsed, { positional: 3 });\n const sessionId = args.required(parsed, 1, \"sessionId\");\n const message = args.required(parsed, 2, \"message\");\n const result = expectShape<ApiOutputs[\"sessions\"][\"sendMessage\"]>(\n await api(path`/sessions/${sessionId}/messages`, {\n method: \"POST\",\n body: { message },\n }),\n \"POST /sessions/{id}/messages\",\n { delivery: is.string },\n );\n if (asJson) {\n out.json(result);\n return;\n }\n out.line(\n result.delivery === \"interrupt\"\n ? \"Delivered to the running agent.\"\n : \"Queued — the agent picks it up at the end of its turn.\",\n );\n}\n","import type { ParsedArgs } from \"@/lib/parsed/parsed-args\";\nimport { followSession } from \"@/lib/session/follow-session\";\nimport { writeFollowedSessionOutcome } from \"@/lib/session/write-followed-session-outcome\";\n\nexport async function followSessionLogs(\n parsed: ParsedArgs,\n sessionId: string,\n after: number | undefined,\n asJson: boolean,\n): Promise<void> {\n // JSON mode suppresses the transcript so stdout remains one document.\n const session = await followSession(sessionId, {\n quiet: asJson || parsed.booleans.has(\"quiet\"),\n ...(after !== undefined ? { after } : {}),\n });\n writeFollowedSessionOutcome(session, asJson);\n}\n","import { api } from \"@/lib/api/api\";\nimport { config } from \"@/lib/shared/config\";\nimport { path } from \"@/lib/path/path\";\nimport { args } from \"@/lib/args/args\";\nimport { expectShape } from \"@/lib/expect/expect-shape\";\nimport { is } from \"@/lib/is/is\";\nimport { formatEvent } from \"@/lib/event/format-event\";\nimport { out } from \"@/lib/output/out\";\nimport { followSessionLogs } from \"@/commands/show/follow-session-logs\";\nimport type { ApiOutputs } from \"@/lib/api/api-outputs\";\nimport type { ParsedArgs } from \"@/lib/parsed/parsed-args\";\nexport async function showLogs(parsed: ParsedArgs): Promise<void> {\n args.expect(parsed, {\n flags: [\"after\", \"limit\"],\n booleans: [\"follow\"],\n positional: 2,\n });\n\n const sessionId = args.required(parsed, 1, \"sessionId\");\n const asJson = parsed.booleans.has(\"json\");\n const after = args.integer(parsed, \"after\", { min: 0 });\n\n if (parsed.booleans.has(\"follow\")) {\n await followSessionLogs(parsed, sessionId, after, asJson);\n return;\n }\n\n const page = expectShape<ApiOutputs[\"sessions\"][\"events\"]>(\n await api(path`/sessions/${sessionId}/events`, {\n query: {\n after,\n limit: args.integer(parsed, \"limit\", { min: 1, max: 200 }),\n },\n }),\n \"GET /sessions/{id}/events\",\n { items: is.array },\n );\n\n if (asJson) {\n out.json(page);\n return;\n }\n\n const { baseUrl } = config.load();\n for (const event of page.items) {\n const line = formatEvent(event, baseUrl);\n if (line) {\n out.line(line);\n }\n }\n\n // Never let a truncated transcript look complete. Formatted events do not\n // carry their sequence, so the continuation cursor has to be spelled out.\n if (page.hasMore && page.nextCursor !== null) {\n out.line();\n out.line(\n out.paint(\n `more events — hepha sessions logs ${sessionId} --after ${page.nextCursor}`,\n \"dim\",\n ),\n );\n }\n}\n","import { listSessions } from \"@/commands/sessions/list-sessions\";\nimport { sendSessionMessage } from \"@/commands/session/send-session-message\";\nimport { showLogs } from \"@/commands/show/show-logs\";\nimport type { ParsedArgs } from \"@/lib/parsed/parsed-args\";\n\n/**\n * The session actions with their own command. Anything absent here is a\n * per-session operation and goes through `runSessionOperation`, which resolves\n * the session id first.\n */\nexport const sessionActions: Record<\n string,\n (parsed: ParsedArgs, asJson: boolean) => Promise<void>\n> = {\n list: (parsed) => listSessions(parsed),\n logs: (parsed) => showLogs(parsed),\n send: sendSessionMessage,\n};\n","import { expectShape } from \"@/lib/expect/expect-shape\";\nimport { SESSION_FIELDS } from \"@/commands/sessions/sessions-constants\";\nimport type { SessionDetail } from \"@/commands/session/session-detail\";\nexport function detail(payload: unknown, endpoint: string): SessionDetail {\n return expectShape<SessionDetail>(payload, endpoint, SESSION_FIELDS);\n}\n","import { api } from \"@/lib/api/api\";\nimport { CliError } from \"@/lib/cli/cli-error\";\nimport { path } from \"@/lib/path/path\";\nimport { out } from \"@/lib/output/out\";\nimport { printSession } from \"@/lib/session/print-session\";\nimport { detail } from \"@/commands/detail/detail\";\nimport { CONTROL_PATHS } from \"@/commands/sessions/sessions-constants\";\nimport type { ParsedArgs } from \"@/lib/parsed/parsed-args\";\n\nexport async function runSessionControlAction(\n parsed: ParsedArgs,\n action: string,\n sessionId: string,\n asJson: boolean,\n): Promise<void> {\n const controlPath = CONTROL_PATHS[action];\n if (controlPath === undefined) {\n throw new CliError(`Unknown session action: ${action}`, 2);\n }\n const session = detail(\n await api(path`/sessions/${sessionId}/${controlPath}`, {\n method: \"POST\",\n body:\n action === \"kill\" && parsed.flags.reason\n ? { reason: parsed.flags.reason }\n : {},\n }),\n `POST /sessions/{id}/${controlPath}`,\n );\n if (asJson) {\n out.json(session);\n return;\n }\n printSession(session);\n}\n","import { api } from \"@/lib/api/api\";\nimport { args } from \"@/lib/args/args\";\nimport { path } from \"@/lib/path/path\";\nimport { out } from \"@/lib/output/out\";\nimport { printSession } from \"@/lib/session/print-session\";\nimport { runSessionControlAction } from \"@/commands/command/run-session-control-action\";\nimport { detail } from \"@/commands/detail/detail\";\nimport { CONTROL_PATHS } from \"@/commands/sessions/sessions-constants\";\nimport type { ApiOutputs } from \"@/lib/api/api-outputs\";\nimport type { ParsedArgs } from \"@/lib/parsed/parsed-args\";\n\nexport async function runSessionOperation(\n parsed: ParsedArgs,\n action: string,\n asJson: boolean,\n): Promise<void> {\n // Only kill consumes --reason; the other operations must reject it.\n args.expect(parsed, {\n positional: 2,\n ...(action === \"kill\" ? { flags: [\"reason\"] } : {}),\n });\n\n const sessionId = args.required(parsed, 1, \"sessionId\");\n\n if (action === \"get\") {\n const session = detail(\n await api(path`/sessions/${sessionId}`),\n \"GET /sessions/{id}\",\n );\n if (asJson) {\n out.json(session);\n return;\n }\n printSession(session);\n return;\n }\n\n // Avoid inherited keys such as `toString` becoming control paths.\n if (Object.hasOwn(CONTROL_PATHS, action)) {\n await runSessionControlAction(parsed, action, sessionId, asJson);\n return;\n }\n\n if (action === \"checks\") {\n out.json(\n await api<ApiOutputs[\"sessions\"][\"runChecks\"]>(\n path`/sessions/${sessionId}/checks`,\n { method: \"POST\", body: {} },\n ),\n );\n return;\n }\n\n if (action === \"pr\") {\n out.json(\n await api<ApiOutputs[\"sessions\"][\"prChecks\"]>(\n path`/sessions/${sessionId}/pr-checks`,\n ),\n );\n return;\n }\n\n out.json(\n await api<ApiOutputs[\"sessions\"][\"verification\"]>(\n path`/sessions/${sessionId}/verification`,\n ),\n );\n}\n","import { args } from \"../../lib/args/args\";\nimport { ACTIONS } from \"@/commands/sessions/sessions-constants\";\nimport { sessionActions } from \"@/commands/sessions/session-actions\";\nimport { runSessionOperation } from \"@/commands/command/run-session-operation\";\nimport type { ParsedArgs } from \"@/lib/parsed/parsed-args\";\n\nexport async function sessionsCommand(parsed: ParsedArgs): Promise<void> {\n // The action is validated FIRST, so `hepha sessions frobnicate <id>` names\n // the real problem instead of asking for an argument it would never use.\n const action = args.action(parsed, \"sessions\", ACTIONS, \"list\");\n const asJson = parsed.booleans.has(\"json\");\n\n const dedicated = sessionActions[action];\n if (dedicated) {\n return await dedicated(parsed, asJson);\n }\n await runSessionOperation(parsed, action, asJson);\n}\n","import { api } from \"../../lib/api/api\";\nimport { args } from \"../../lib/args/args\";\nimport { config } from \"../../lib/shared/config\";\nimport { expectShape } from \"../../lib/expect/expect-shape\";\nimport { is } from \"../../lib/is/is\";\nimport { out } from \"../../lib/output/out\";\nimport type { ApiOutputs } from \"@/lib/api/api-outputs\";\nimport type { ParsedArgs } from \"@/lib/parsed/parsed-args\";\n\nexport async function whoamiCommand(parsed: ParsedArgs): Promise<void> {\n args.expect(parsed, {});\n\n const identity = expectShape<ApiOutputs[\"me\"][\"get\"]>(\n await api(\"/me\"),\n \"GET /me\",\n {\n \"user.name\": is.string,\n \"user.email\": is.string,\n \"auth.method\": is.string,\n \"auth.scopes\": is.array,\n },\n );\n\n if (parsed.booleans.has(\"json\")) {\n out.json(identity);\n return;\n }\n\n out.table([\n [\n out.paint(\"user\", \"dim\"),\n out.cell(`${identity.user.name} <${identity.user.email}>`),\n ],\n [out.paint(\"role\", \"dim\"), out.cell(identity.user.role ?? \"member\")],\n [\n out.paint(\"auth\", \"dim\"),\n out.cell(\n identity.auth.method === \"api_key\"\n ? `api key${identity.auth.keyName ? ` \"${identity.auth.keyName}\"` : \"\"}`\n : \"session\",\n ),\n ],\n [out.paint(\"scopes\", \"dim\"), identity.auth.scopes.join(\" \")],\n [out.paint(\"url\", \"dim\"), config.load().baseUrl],\n ]);\n}\n","export const CATALOG_TOPICS = new Set([\n \"repos\",\n \"branches\",\n \"models\",\n \"skills\",\n]);\n","import { approvalsCommand } from \"@/commands/command/approvals-command\";\nimport { catalogCommand } from \"@/commands/command/catalog-command\";\nimport { helpCommand } from \"@/commands/command/help-command\";\nimport { keysCommand } from \"@/commands/command/keys-command\";\nimport { loginCommand } from \"@/commands/command/login-command\";\nimport { logoutCommand } from \"@/commands/command/logout-command\";\nimport { questionsCommand } from \"@/commands/command/questions-command\";\nimport { runCommand } from \"@/commands/command/run-command\";\nimport { sessionsCommand } from \"@/commands/command/sessions-command\";\nimport { whoamiCommand } from \"@/commands/command/whoami-command\";\nimport { args } from \"@/lib/args/args\";\nimport { CliError } from \"@/lib/cli/cli-error\";\nimport { CATALOG_TOPICS } from \"@/catalog-topics-constants\";\nexport async function dispatch(command: string, argv: string[]): Promise<void> {\n const parsed = args.parse(argv);\n\n if (parsed.booleans.has(\"help\")) {\n helpCommand();\n return;\n }\n\n if (CATALOG_TOPICS.has(command)) {\n return await catalogCommand(command, parsed);\n }\n\n switch (command) {\n case \"login\":\n return await loginCommand(parsed);\n case \"logout\":\n return logoutCommand(parsed);\n case \"whoami\":\n return await whoamiCommand(parsed);\n case \"keys\":\n return await keysCommand(parsed);\n case \"run\":\n return await runCommand(parsed);\n case \"sessions\":\n return await sessionsCommand(parsed);\n case \"questions\":\n return await questionsCommand(parsed);\n case \"approvals\":\n return await approvalsCommand(parsed);\n default:\n helpCommand();\n throw new CliError(`Unknown command \"${command}\".`, 2);\n }\n}\n","import { helpCommand } from \"@/commands/command/help-command\";\nimport { args } from \"@/lib/args/args\";\nimport { out } from \"@/lib/output/out\";\nimport { VERSION } from \"@/lib/version/version-constants\";\nimport { wantsJson } from \"@/lib/wants/wants-json\";\nimport { dispatch } from \"@/dispatch\";\nexport async function main(): Promise<void> {\n const argv = process.argv.slice(2);\n out.setJson(wantsJson(argv));\n\n const [command, ...rest] = argv;\n\n if (!command || command === \"help\" || command === \"--help\") {\n helpCommand();\n return;\n }\n\n // Answered early, but NOT before the arguments are checked: returning ahead\n // of the parser would exempt this command from the strictness every other one\n // applies.\n if (command === \"--version\" || command === \"-v\" || command === \"version\") {\n args.expect(args.parse(rest), {});\n if (out.isJson()) {\n out.json({ version: VERSION });\n } else {\n out.line(VERSION);\n }\n return;\n }\n\n await dispatch(command, rest);\n}\n","import { CliError } from \"./lib/cli/cli-error\";\nimport { out } from \"./lib/output/out\";\nimport { main } from \"@/main\";\n\nexport async function cliEntry() {\n try {\n await main();\n } catch (error: unknown) {\n const failure =\n error instanceof CliError\n ? error\n : new CliError(error instanceof Error ? error.message : String(error));\n\n out.failure(failure);\n process.exit(failure.exitCode);\n }\n}\n\nvoid cliEntry();\n"],"mappings":"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","names":["readFileSync","dirname","join","trimmed","detail","result","segments","path","ACTIONS","ACTIONS","result","ACTIONS","ACTIONS","result","trimmed","truncate","truncate","path","segments","path","path","sleep","sleep","ACTIONS","ACTIONS"]}
|