relaycontrol 0.3.1
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/README.md +292 -0
- package/dist/index.js +21915 -0
- package/dist/index.js.map +7 -0
- package/package.json +63 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../packages/shared/src/constants.ts", "../../packages/shared/src/types/feedback.ts", "../../packages/shared/src/validators/feedback.ts", "../../packages/shared/src/validators/instance.ts", "../../packages/shared/src/validators/budget.ts", "../../packages/shared/src/validators/company.ts", "../../packages/shared/src/validators/company-skill.ts", "../../packages/shared/src/validators/adapter-skills.ts", "../../packages/shared/src/validators/issue.ts", "../../packages/shared/src/validators/routine.ts", "../../packages/shared/src/validators/company-portability.ts", "../../packages/shared/src/validators/secret.ts", "../../packages/shared/src/validators/agent.ts", "../../packages/shared/src/validators/project.ts", "../../packages/shared/src/validators/work-product.ts", "../../packages/shared/src/validators/execution-workspace.ts", "../../packages/shared/src/validators/goal.ts", "../../packages/shared/src/validators/approval.ts", "../../packages/shared/src/validators/cost.ts", "../../packages/shared/src/validators/finance.ts", "../../packages/shared/src/validators/asset.ts", "../../packages/shared/src/validators/access.ts", "../../packages/shared/src/validators/plugin.ts", "../../packages/shared/src/validators/index.ts", "../../packages/shared/src/api.ts", "../../packages/shared/src/agent-url-key.ts", "../../packages/shared/src/project-url-key.ts", "../../packages/shared/src/project-mentions.ts", "../../packages/shared/src/routine-variables.ts", "../../packages/shared/src/config-schema.ts", "../../packages/shared/src/index.ts", "../src/config/schema.ts", "../src/config/home.ts", "../src/config/store.ts", "../src/config/env.ts", "../src/utils/path-resolver.ts", "../src/config/secrets-key.ts", "../src/prompts/database.ts", "../src/prompts/llm.ts", "../src/prompts/logging.ts", "../src/prompts/secrets.ts", "../src/prompts/storage.ts", "../src/config/hostnames.ts", "../src/prompts/server.ts", "../../packages/db/src/schema/companies.ts", "../../packages/db/src/schema/agents.ts", "../../packages/db/src/schema/assets.ts", "../../packages/db/src/schema/company_logos.ts", "../../packages/db/src/schema/auth.ts", "../../packages/db/src/schema/instance_settings.ts", "../../packages/db/src/schema/instance_user_roles.ts", "../../packages/db/src/schema/board_api_keys.ts", "../../packages/db/src/schema/cli_auth_challenges.ts", "../../packages/db/src/schema/company_memberships.ts", "../../packages/db/src/schema/principal_permission_grants.ts", "../../packages/db/src/schema/invites.ts", "../../packages/db/src/schema/join_requests.ts", "../../packages/db/src/schema/budget_policies.ts", "../../packages/db/src/schema/approvals.ts", "../../packages/db/src/schema/budget_incidents.ts", "../../packages/db/src/schema/agent_config_revisions.ts", "../../packages/db/src/schema/agent_api_keys.ts", "../../packages/db/src/schema/agent_runtime_state.ts", "../../packages/db/src/schema/agent_wakeup_requests.ts", "../../packages/db/src/schema/heartbeat_runs.ts", "../../packages/db/src/schema/agent_task_sessions.ts", "../../packages/db/src/schema/goals.ts", "../../packages/db/src/schema/projects.ts", "../../packages/db/src/schema/project_workspaces.ts", "../../packages/db/src/schema/issues.ts", "../../packages/db/src/schema/execution_workspaces.ts", "../../packages/db/src/schema/workspace_operations.ts", "../../packages/db/src/schema/workspace_runtime_services.ts", "../../packages/db/src/schema/project_goals.ts", "../../packages/db/src/schema/company_secrets.ts", "../../packages/db/src/schema/routines.ts", "../../packages/db/src/schema/issue_work_products.ts", "../../packages/db/src/schema/labels.ts", "../../packages/db/src/schema/issue_labels.ts", "../../packages/db/src/schema/issue_approvals.ts", "../../packages/db/src/schema/issue_comments.ts", "../../packages/db/src/schema/issue_inbox_archives.ts", "../../packages/db/src/schema/feedback_votes.ts", "../../packages/db/src/schema/feedback_exports.ts", "../../packages/db/src/schema/issue_read_states.ts", "../../packages/db/src/schema/issue_attachments.ts", "../../packages/db/src/schema/documents.ts", "../../packages/db/src/schema/document_revisions.ts", "../../packages/db/src/schema/issue_documents.ts", "../../packages/db/src/schema/heartbeat_run_events.ts", "../../packages/db/src/schema/cost_events.ts", "../../packages/db/src/schema/finance_events.ts", "../../packages/db/src/schema/approval_comments.ts", "../../packages/db/src/schema/activity_log.ts", "../../packages/db/src/schema/company_secret_versions.ts", "../../packages/db/src/schema/company_skills.ts", "../../packages/db/src/schema/plugins.ts", "../../packages/db/src/schema/plugin_config.ts", "../../packages/db/src/schema/plugin_company_settings.ts", "../../packages/db/src/schema/plugin_state.ts", "../../packages/db/src/schema/plugin_entities.ts", "../../packages/db/src/schema/plugin_jobs.ts", "../../packages/db/src/schema/plugin_webhooks.ts", "../../packages/db/src/schema/plugin_logs.ts", "../../packages/db/src/schema/knowledge_entries.ts", "../../packages/db/src/schema/knowledge_injections.ts", "../../packages/db/src/schema/cost_recommendations.ts", "../../packages/db/src/schema/pipelines.ts", "../../packages/db/src/schema/index.ts", "../../packages/db/src/client.ts", "../../packages/db/src/test-embedded-postgres.ts", "../../packages/db/src/backup-lib.ts", "../../packages/db/src/embedded-postgres-error.ts", "../../packages/db/src/index.ts", "../src/commands/auth-bootstrap-ceo.ts", "../src/utils/banner.ts", "../../packages/shared/src/telemetry/client.ts", "../../packages/shared/src/telemetry/config.ts", "../../packages/shared/src/telemetry/state.ts", "../../packages/shared/src/telemetry/events.ts", "../../packages/shared/src/telemetry/index.ts", "../src/version.ts", "../src/telemetry.ts", "../src/checks/agent-jwt-secret-check.ts", "../src/checks/config-check.ts", "../src/checks/deployment-auth-check.ts", "../src/checks/path-resolver.ts", "../src/checks/database-check.ts", "../src/checks/llm-check.ts", "../src/checks/log-check.ts", "../src/utils/net.ts", "../src/checks/port-check.ts", "../src/checks/secrets-check.ts", "../src/checks/storage-check.ts", "../src/checks/index.ts", "../src/commands/doctor.ts", "../src/commands/run.ts", "../src/commands/onboard.ts", "../src/index.ts", "../src/commands/env.ts", "../src/commands/configure.ts", "../src/commands/allowed-hostname.ts", "../src/commands/heartbeat-run.ts", "../../packages/adapters/claude-local/src/cli/format-event.ts", "../../packages/adapters/codex-local/src/cli/format-event.ts", "../../packages/adapters/cursor-local/src/cli/format-event.ts", "../../packages/adapters/cursor-local/src/shared/stream.ts", "../../packages/adapters/gemini-local/src/cli/format-event.ts", "../../packages/adapters/opencode-local/src/cli/format-event.ts", "../../packages/adapters/pi-local/src/cli/format-event.ts", "../../packages/adapters/openclaw-gateway/src/cli/format-event.ts", "../src/adapters/process/format-event.ts", "../src/adapters/process/index.ts", "../src/adapters/http/format-event.ts", "../src/adapters/http/index.ts", "../src/adapters/registry.ts", "../src/commands/client/common.ts", "../src/client/board-auth.ts", "../src/client/command-label.ts", "../src/client/context.ts", "../src/client/http.ts", "../src/commands/db-backup.ts", "../src/commands/client/context.ts", "../src/commands/client/company.ts", "../src/commands/client/zip.ts", "../src/commands/client/feedback.ts", "../src/commands/client/issue.ts", "../../packages/adapter-utils/src/server-utils.ts", "../src/commands/client/agent.ts", "../src/commands/client/approval.ts", "../src/commands/client/activity.ts", "../src/commands/client/dashboard.ts", "../src/commands/routines.ts", "../src/config/data-dir.ts", "../src/commands/worktree.ts", "../src/commands/worktree-lib.ts", "../src/commands/worktree-merge-history-lib.ts", "../src/commands/client/plugin.ts", "../src/commands/client/auth.ts", "../src/commands/connect.ts", "../src/commands/runner.ts", "../../packages/adapters/claude-local/src/server/execute.ts", "../../packages/adapters/claude-local/src/server/parse.ts", "../../packages/adapters/claude-local/src/server/skills.ts", "../../packages/adapters/claude-local/src/server/quota.ts", "../../packages/adapters/codex-local/src/server/execute.ts", "../../packages/adapter-utils/src/billing.ts", "../../packages/adapters/codex-local/src/server/parse.ts", "../../packages/adapters/codex-local/src/server/codex-home.ts", "../../packages/adapters/codex-local/src/server/skills.ts", "../../packages/adapters/cursor-local/src/server/execute.ts", "../../packages/adapters/cursor-local/src/index.ts", "../../packages/adapters/cursor-local/src/server/parse.ts", "../../packages/adapters/cursor-local/src/shared/trust.ts", "../../packages/adapters/cursor-local/src/server/skills.ts", "../../packages/adapters/gemini-local/src/server/execute.ts", "../../packages/adapters/gemini-local/src/index.ts", "../../packages/adapters/gemini-local/src/server/parse.ts", "../../packages/adapters/gemini-local/src/server/utils.ts", "../../packages/adapters/gemini-local/src/server/skills.ts", "../../packages/adapters/opencode-local/src/server/execute.ts", "../../packages/adapters/opencode-local/src/server/parse.ts", "../../packages/adapters/opencode-local/src/server/models.ts", "../../packages/adapters/opencode-local/src/server/runtime-config.ts", "../../packages/adapters/opencode-local/src/server/skills.ts", "../../packages/adapters/pi-local/src/server/execute.ts", "../../packages/adapters/pi-local/src/server/parse.ts", "../../packages/adapters/pi-local/src/server/models.ts", "../../packages/adapters/pi-local/src/server/skills.ts"],
|
|
4
|
+
"sourcesContent": ["export const COMPANY_STATUSES = [\"active\", \"paused\", \"archived\"] as const;\nexport type CompanyStatus = (typeof COMPANY_STATUSES)[number];\n\nexport const DEPLOYMENT_MODES = [\"local_trusted\", \"authenticated\"] as const;\nexport type DeploymentMode = (typeof DEPLOYMENT_MODES)[number];\n\nexport const DEPLOYMENT_EXPOSURES = [\"private\", \"public\"] as const;\nexport type DeploymentExposure = (typeof DEPLOYMENT_EXPOSURES)[number];\n\nexport const AUTH_BASE_URL_MODES = [\"auto\", \"explicit\"] as const;\nexport type AuthBaseUrlMode = (typeof AUTH_BASE_URL_MODES)[number];\n\nexport const AGENT_STATUSES = [\n \"active\",\n \"paused\",\n \"idle\",\n \"running\",\n \"error\",\n \"pending_approval\",\n \"terminated\",\n] as const;\nexport type AgentStatus = (typeof AGENT_STATUSES)[number];\n\nexport const AGENT_ADAPTER_TYPES = [\n \"process\",\n \"http\",\n \"claude_local\",\n \"codex_local\",\n \"gemini_local\",\n \"opencode_local\",\n \"pi_local\",\n \"cursor\",\n \"openclaw_gateway\",\n \"hermes_local\",\n] as const;\nexport type AgentAdapterType = (typeof AGENT_ADAPTER_TYPES)[number];\n\nexport const AGENT_ROLES = [\n \"ceo\",\n \"cto\",\n \"cmo\",\n \"cfo\",\n \"engineer\",\n \"designer\",\n \"pm\",\n \"qa\",\n \"devops\",\n \"researcher\",\n \"general\",\n] as const;\nexport type AgentRole = (typeof AGENT_ROLES)[number];\n\nexport const AGENT_ROLE_LABELS: Record<AgentRole, string> = {\n ceo: \"CEO\",\n cto: \"CTO\",\n cmo: \"CMO\",\n cfo: \"CFO\",\n engineer: \"Engineer\",\n designer: \"Designer\",\n pm: \"PM\",\n qa: \"QA\",\n devops: \"DevOps\",\n researcher: \"Researcher\",\n general: \"General\",\n};\n\nexport const AGENT_ICON_NAMES = [\n \"bot\",\n \"cpu\",\n \"brain\",\n \"zap\",\n \"rocket\",\n \"code\",\n \"terminal\",\n \"shield\",\n \"eye\",\n \"search\",\n \"wrench\",\n \"hammer\",\n \"lightbulb\",\n \"sparkles\",\n \"star\",\n \"heart\",\n \"flame\",\n \"bug\",\n \"cog\",\n \"database\",\n \"globe\",\n \"lock\",\n \"mail\",\n \"message-square\",\n \"file-code\",\n \"git-branch\",\n \"package\",\n \"puzzle\",\n \"target\",\n \"wand\",\n \"atom\",\n \"circuit-board\",\n \"radar\",\n \"swords\",\n \"telescope\",\n \"microscope\",\n \"crown\",\n \"gem\",\n \"hexagon\",\n \"pentagon\",\n \"fingerprint\",\n] as const;\nexport type AgentIconName = (typeof AGENT_ICON_NAMES)[number];\n\nexport const ISSUE_STATUSES = [\n \"backlog\",\n \"todo\",\n \"in_progress\",\n \"in_review\",\n \"done\",\n \"blocked\",\n \"cancelled\",\n] as const;\nexport type IssueStatus = (typeof ISSUE_STATUSES)[number];\n\nexport const INBOX_MINE_ISSUE_STATUSES = [\n \"backlog\",\n \"todo\",\n \"in_progress\",\n \"in_review\",\n \"blocked\",\n \"done\",\n] as const;\nexport const INBOX_MINE_ISSUE_STATUS_FILTER = INBOX_MINE_ISSUE_STATUSES.join(\",\");\n\nexport const ISSUE_PRIORITIES = [\"critical\", \"high\", \"medium\", \"low\"] as const;\nexport type IssuePriority = (typeof ISSUE_PRIORITIES)[number];\n\nexport const ISSUE_ORIGIN_KINDS = [\"manual\", \"routine_execution\"] as const;\nexport type IssueOriginKind = (typeof ISSUE_ORIGIN_KINDS)[number];\n\nexport const GOAL_LEVELS = [\"company\", \"team\", \"agent\", \"task\"] as const;\nexport type GoalLevel = (typeof GOAL_LEVELS)[number];\n\nexport const GOAL_STATUSES = [\"planned\", \"active\", \"achieved\", \"cancelled\"] as const;\nexport type GoalStatus = (typeof GOAL_STATUSES)[number];\n\nexport const PROJECT_STATUSES = [\n \"backlog\",\n \"planned\",\n \"in_progress\",\n \"completed\",\n \"cancelled\",\n] as const;\nexport type ProjectStatus = (typeof PROJECT_STATUSES)[number];\n\nexport const ROUTINE_STATUSES = [\"active\", \"paused\", \"archived\"] as const;\nexport type RoutineStatus = (typeof ROUTINE_STATUSES)[number];\n\nexport const ROUTINE_CONCURRENCY_POLICIES = [\"coalesce_if_active\", \"always_enqueue\", \"skip_if_active\"] as const;\nexport type RoutineConcurrencyPolicy = (typeof ROUTINE_CONCURRENCY_POLICIES)[number];\n\nexport const ROUTINE_CATCH_UP_POLICIES = [\"skip_missed\", \"enqueue_missed_with_cap\"] as const;\nexport type RoutineCatchUpPolicy = (typeof ROUTINE_CATCH_UP_POLICIES)[number];\n\nexport const ROUTINE_TRIGGER_KINDS = [\"schedule\", \"webhook\", \"api\"] as const;\nexport type RoutineTriggerKind = (typeof ROUTINE_TRIGGER_KINDS)[number];\n\nexport const ROUTINE_TRIGGER_SIGNING_MODES = [\"bearer\", \"hmac_sha256\"] as const;\nexport type RoutineTriggerSigningMode = (typeof ROUTINE_TRIGGER_SIGNING_MODES)[number];\n\nexport const ROUTINE_VARIABLE_TYPES = [\"text\", \"textarea\", \"number\", \"boolean\", \"select\"] as const;\nexport type RoutineVariableType = (typeof ROUTINE_VARIABLE_TYPES)[number];\n\nexport const ROUTINE_RUN_STATUSES = [\n \"received\",\n \"coalesced\",\n \"skipped\",\n \"issue_created\",\n \"completed\",\n \"failed\",\n ] as const;\nexport type RoutineRunStatus = (typeof ROUTINE_RUN_STATUSES)[number];\n\nexport const ROUTINE_RUN_SOURCES = [\"schedule\", \"manual\", \"api\", \"webhook\"] as const;\nexport type RoutineRunSource = (typeof ROUTINE_RUN_SOURCES)[number];\n\nexport const PAUSE_REASONS = [\"manual\", \"budget\", \"system\"] as const;\nexport type PauseReason = (typeof PAUSE_REASONS)[number];\n\nexport const PROJECT_COLORS = [\n \"#6366f1\", // indigo\n \"#8b5cf6\", // violet\n \"#ec4899\", // pink\n \"#ef4444\", // red\n \"#f97316\", // orange\n \"#eab308\", // yellow\n \"#22c55e\", // green\n \"#14b8a6\", // teal\n \"#06b6d4\", // cyan\n \"#3b82f6\", // blue\n] as const;\n\nexport const APPROVAL_TYPES = [\"hire_agent\", \"approve_ceo_strategy\", \"budget_override_required\"] as const;\nexport type ApprovalType = (typeof APPROVAL_TYPES)[number];\n\nexport const APPROVAL_STATUSES = [\n \"pending\",\n \"revision_requested\",\n \"approved\",\n \"rejected\",\n \"cancelled\",\n] as const;\nexport type ApprovalStatus = (typeof APPROVAL_STATUSES)[number];\n\nexport const SECRET_PROVIDERS = [\n \"local_encrypted\",\n \"aws_secrets_manager\",\n \"gcp_secret_manager\",\n \"vault\",\n] as const;\nexport type SecretProvider = (typeof SECRET_PROVIDERS)[number];\n\nexport const STORAGE_PROVIDERS = [\"local_disk\", \"s3\"] as const;\nexport type StorageProvider = (typeof STORAGE_PROVIDERS)[number];\n\nexport const BILLING_TYPES = [\n \"metered_api\",\n \"subscription_included\",\n \"subscription_overage\",\n \"credits\",\n \"fixed\",\n \"unknown\",\n] as const;\nexport type BillingType = (typeof BILLING_TYPES)[number];\n\nexport const FINANCE_EVENT_KINDS = [\n \"inference_charge\",\n \"platform_fee\",\n \"credit_purchase\",\n \"credit_refund\",\n \"credit_expiry\",\n \"byok_fee\",\n \"gateway_overhead\",\n \"log_storage_charge\",\n \"logpush_charge\",\n \"provisioned_capacity_charge\",\n \"training_charge\",\n \"custom_model_import_charge\",\n \"custom_model_storage_charge\",\n \"manual_adjustment\",\n] as const;\nexport type FinanceEventKind = (typeof FINANCE_EVENT_KINDS)[number];\n\nexport const FINANCE_DIRECTIONS = [\"debit\", \"credit\"] as const;\nexport type FinanceDirection = (typeof FINANCE_DIRECTIONS)[number];\n\nexport const FINANCE_UNITS = [\n \"input_token\",\n \"output_token\",\n \"cached_input_token\",\n \"request\",\n \"credit_usd\",\n \"credit_unit\",\n \"model_unit_minute\",\n \"model_unit_hour\",\n \"gb_month\",\n \"train_token\",\n \"unknown\",\n] as const;\nexport type FinanceUnit = (typeof FINANCE_UNITS)[number];\n\nexport const BUDGET_SCOPE_TYPES = [\"company\", \"agent\", \"project\"] as const;\nexport type BudgetScopeType = (typeof BUDGET_SCOPE_TYPES)[number];\n\nexport const BUDGET_METRICS = [\"billed_cents\"] as const;\nexport type BudgetMetric = (typeof BUDGET_METRICS)[number];\n\nexport const BUDGET_WINDOW_KINDS = [\"calendar_month_utc\", \"lifetime\"] as const;\nexport type BudgetWindowKind = (typeof BUDGET_WINDOW_KINDS)[number];\n\nexport const BUDGET_THRESHOLD_TYPES = [\"soft\", \"hard\"] as const;\nexport type BudgetThresholdType = (typeof BUDGET_THRESHOLD_TYPES)[number];\n\nexport const BUDGET_INCIDENT_STATUSES = [\"open\", \"resolved\", \"dismissed\"] as const;\nexport type BudgetIncidentStatus = (typeof BUDGET_INCIDENT_STATUSES)[number];\n\nexport const BUDGET_INCIDENT_RESOLUTION_ACTIONS = [\n \"keep_paused\",\n \"raise_budget_and_resume\",\n] as const;\nexport type BudgetIncidentResolutionAction = (typeof BUDGET_INCIDENT_RESOLUTION_ACTIONS)[number];\n\nexport const HEARTBEAT_INVOCATION_SOURCES = [\n \"timer\",\n \"assignment\",\n \"on_demand\",\n \"automation\",\n] as const;\nexport type HeartbeatInvocationSource = (typeof HEARTBEAT_INVOCATION_SOURCES)[number];\n\nexport const WAKEUP_TRIGGER_DETAILS = [\"manual\", \"ping\", \"callback\", \"system\"] as const;\nexport type WakeupTriggerDetail = (typeof WAKEUP_TRIGGER_DETAILS)[number];\n\nexport const WAKEUP_REQUEST_STATUSES = [\n \"queued\",\n \"deferred_issue_execution\",\n \"claimed\",\n \"coalesced\",\n \"skipped\",\n \"completed\",\n \"failed\",\n \"cancelled\",\n] as const;\nexport type WakeupRequestStatus = (typeof WAKEUP_REQUEST_STATUSES)[number];\n\nexport const HEARTBEAT_RUN_STATUSES = [\n \"queued\",\n \"running\",\n \"succeeded\",\n \"failed\",\n \"cancelled\",\n \"timed_out\",\n] as const;\nexport type HeartbeatRunStatus = (typeof HEARTBEAT_RUN_STATUSES)[number];\n\nexport const LIVE_EVENT_TYPES = [\n \"heartbeat.run.queued\",\n \"heartbeat.run.status\",\n \"heartbeat.run.event\",\n \"heartbeat.run.log\",\n \"agent.status\",\n \"activity.logged\",\n \"plugin.ui.updated\",\n \"plugin.worker.crashed\",\n \"plugin.worker.restarted\",\n] as const;\nexport type LiveEventType = (typeof LIVE_EVENT_TYPES)[number];\n\nexport const PRINCIPAL_TYPES = [\"user\", \"agent\"] as const;\nexport type PrincipalType = (typeof PRINCIPAL_TYPES)[number];\n\nexport const MEMBERSHIP_STATUSES = [\"pending\", \"active\", \"suspended\"] as const;\nexport type MembershipStatus = (typeof MEMBERSHIP_STATUSES)[number];\n\nexport const INSTANCE_USER_ROLES = [\"instance_admin\"] as const;\nexport type InstanceUserRole = (typeof INSTANCE_USER_ROLES)[number];\n\nexport const INVITE_TYPES = [\"company_join\", \"bootstrap_ceo\"] as const;\nexport type InviteType = (typeof INVITE_TYPES)[number];\n\nexport const INVITE_JOIN_TYPES = [\"human\", \"agent\", \"both\"] as const;\nexport type InviteJoinType = (typeof INVITE_JOIN_TYPES)[number];\n\nexport const JOIN_REQUEST_TYPES = [\"human\", \"agent\"] as const;\nexport type JoinRequestType = (typeof JOIN_REQUEST_TYPES)[number];\n\nexport const JOIN_REQUEST_STATUSES = [\"pending_approval\", \"approved\", \"rejected\"] as const;\nexport type JoinRequestStatus = (typeof JOIN_REQUEST_STATUSES)[number];\n\nexport const PERMISSION_KEYS = [\n \"agents:create\",\n \"users:invite\",\n \"users:manage_permissions\",\n \"tasks:assign\",\n \"tasks:assign_scope\",\n \"joins:approve\",\n] as const;\nexport type PermissionKey = (typeof PERMISSION_KEYS)[number];\n\n// ---------------------------------------------------------------------------\n// Plugin System \u2014 see doc/plugins/PLUGIN_SPEC.md for the full specification\n// ---------------------------------------------------------------------------\n\n/**\n * The current version of the Plugin API contract.\n *\n * Increment this value whenever a breaking change is made to the plugin API\n * so that the host can reject incompatible plugin manifests.\n *\n * @see PLUGIN_SPEC.md \u00A74 \u2014 Versioning\n */\nexport const PLUGIN_API_VERSION = 1 as const;\n\n/**\n * Lifecycle statuses for an installed plugin.\n *\n * State machine: installed \u2192 ready | error, ready \u2192 disabled | error | upgrade_pending | uninstalled,\n * disabled \u2192 ready | uninstalled, error \u2192 ready | uninstalled,\n * upgrade_pending \u2192 ready | error | uninstalled, uninstalled \u2192 installed (reinstall).\n *\n * @see {@link PluginStatus} \u2014 inferred union type\n * @see PLUGIN_SPEC.md \u00A721.3 `plugins.status`\n */\nexport const PLUGIN_STATUSES = [\n \"installed\",\n \"ready\",\n \"disabled\",\n \"error\",\n \"upgrade_pending\",\n \"uninstalled\",\n] as const;\nexport type PluginStatus = (typeof PLUGIN_STATUSES)[number];\n\n/**\n * Plugin classification categories. A plugin declares one or more categories\n * in its manifest to describe its primary purpose.\n *\n * @see PLUGIN_SPEC.md \u00A76.2\n */\nexport const PLUGIN_CATEGORIES = [\n \"connector\",\n \"workspace\",\n \"automation\",\n \"ui\",\n] as const;\nexport type PluginCategory = (typeof PLUGIN_CATEGORIES)[number];\n\n/**\n * Named permissions the host grants to a plugin. Plugins declare required\n * capabilities in their manifest; the host enforces them at runtime via the\n * plugin capability validator.\n *\n * Grouped into: Data Read, Data Write, Plugin State, Runtime/Integration,\n * Agent Tools, and UI.\n *\n * @see PLUGIN_SPEC.md \u00A715 \u2014 Capability Model\n */\nexport const PLUGIN_CAPABILITIES = [\n // Data Read\n \"companies.read\",\n \"projects.read\",\n \"project.workspaces.read\",\n \"issues.read\",\n \"issue.comments.read\",\n \"issue.documents.read\",\n \"agents.read\",\n \"goals.read\",\n \"goals.create\",\n \"goals.update\",\n \"activity.read\",\n \"costs.read\",\n // Data Write\n \"issues.create\",\n \"issues.update\",\n \"issue.comments.create\",\n \"issue.documents.write\",\n \"agents.pause\",\n \"agents.resume\",\n \"agents.invoke\",\n \"agent.sessions.create\",\n \"agent.sessions.list\",\n \"agent.sessions.send\",\n \"agent.sessions.close\",\n \"activity.log.write\",\n \"metrics.write\",\n \"telemetry.track\",\n // Plugin State\n \"plugin.state.read\",\n \"plugin.state.write\",\n // Runtime / Integration\n \"events.subscribe\",\n \"events.emit\",\n \"jobs.schedule\",\n \"webhooks.receive\",\n \"http.outbound\",\n \"secrets.read-ref\",\n // Agent Tools\n \"agent.tools.register\",\n // UI\n \"instance.settings.register\",\n \"ui.sidebar.register\",\n \"ui.page.register\",\n \"ui.detailTab.register\",\n \"ui.dashboardWidget.register\",\n \"ui.commentAnnotation.register\",\n \"ui.action.register\",\n] as const;\nexport type PluginCapability = (typeof PLUGIN_CAPABILITIES)[number];\n\n/**\n * UI extension slot types. Each slot type corresponds to a mount point in the\n * Paperclip UI where plugin components can be rendered.\n *\n * @see PLUGIN_SPEC.md \u00A719 \u2014 UI Extension Model\n */\nexport const PLUGIN_UI_SLOT_TYPES = [\n \"page\",\n \"detailTab\",\n \"taskDetailView\",\n \"dashboardWidget\",\n \"sidebar\",\n \"sidebarPanel\",\n \"projectSidebarItem\",\n \"globalToolbarButton\",\n \"toolbarButton\",\n \"contextMenuItem\",\n \"commentAnnotation\",\n \"commentContextMenuItem\",\n \"settingsPage\",\n] as const;\nexport type PluginUiSlotType = (typeof PLUGIN_UI_SLOT_TYPES)[number];\n\n/**\n * Reserved company-scoped route segments that plugin page routes may not claim.\n *\n * These map to first-class host pages under `/:companyPrefix/...`.\n */\nexport const PLUGIN_RESERVED_COMPANY_ROUTE_SEGMENTS = [\n \"dashboard\",\n \"onboarding\",\n \"companies\",\n \"company\",\n \"settings\",\n \"plugins\",\n \"org\",\n \"agents\",\n \"projects\",\n \"issues\",\n \"goals\",\n \"approvals\",\n \"costs\",\n \"activity\",\n \"inbox\",\n \"design-guide\",\n \"tests\",\n] as const;\nexport type PluginReservedCompanyRouteSegment =\n (typeof PLUGIN_RESERVED_COMPANY_ROUTE_SEGMENTS)[number];\n\n/**\n * Launcher placement zones describe where a plugin-owned launcher can appear\n * in the host UI. These are intentionally aligned with current slot surfaces\n * so manifest authors can describe launch intent without coupling to a single\n * component implementation detail.\n */\nexport const PLUGIN_LAUNCHER_PLACEMENT_ZONES = [\n \"page\",\n \"detailTab\",\n \"taskDetailView\",\n \"dashboardWidget\",\n \"sidebar\",\n \"sidebarPanel\",\n \"projectSidebarItem\",\n \"globalToolbarButton\",\n \"toolbarButton\",\n \"contextMenuItem\",\n \"commentAnnotation\",\n \"commentContextMenuItem\",\n \"settingsPage\",\n] as const;\nexport type PluginLauncherPlacementZone = (typeof PLUGIN_LAUNCHER_PLACEMENT_ZONES)[number];\n\n/**\n * Launcher action kinds describe what the launcher does when activated.\n */\nexport const PLUGIN_LAUNCHER_ACTIONS = [\n \"navigate\",\n \"openModal\",\n \"openDrawer\",\n \"openPopover\",\n \"performAction\",\n \"deepLink\",\n] as const;\nexport type PluginLauncherAction = (typeof PLUGIN_LAUNCHER_ACTIONS)[number];\n\n/**\n * Optional size hints the host can use when rendering plugin-owned launcher\n * destinations such as overlays, drawers, or full page handoffs.\n */\nexport const PLUGIN_LAUNCHER_BOUNDS = [\n \"inline\",\n \"compact\",\n \"default\",\n \"wide\",\n \"full\",\n] as const;\nexport type PluginLauncherBounds = (typeof PLUGIN_LAUNCHER_BOUNDS)[number];\n\n/**\n * Render environments describe the container a launcher expects after it is\n * activated. The current host may map these to concrete UI primitives.\n */\nexport const PLUGIN_LAUNCHER_RENDER_ENVIRONMENTS = [\n \"hostInline\",\n \"hostOverlay\",\n \"hostRoute\",\n \"external\",\n \"iframe\",\n] as const;\nexport type PluginLauncherRenderEnvironment =\n (typeof PLUGIN_LAUNCHER_RENDER_ENVIRONMENTS)[number];\n\n/**\n * Entity types that a `detailTab` UI slot can attach to.\n *\n * @see PLUGIN_SPEC.md \u00A719.3 \u2014 Detail Tabs\n */\nexport const PLUGIN_UI_SLOT_ENTITY_TYPES = [\n \"project\",\n \"issue\",\n \"agent\",\n \"goal\",\n \"run\",\n \"comment\",\n] as const;\nexport type PluginUiSlotEntityType = (typeof PLUGIN_UI_SLOT_ENTITY_TYPES)[number];\n\n/**\n * Scope kinds for plugin state storage. Determines the granularity at which\n * a plugin stores key-value state data.\n *\n * @see PLUGIN_SPEC.md \u00A721.3 `plugin_state.scope_kind`\n */\nexport const PLUGIN_STATE_SCOPE_KINDS = [\n \"instance\",\n \"company\",\n \"project\",\n \"project_workspace\",\n \"agent\",\n \"issue\",\n \"goal\",\n \"run\",\n] as const;\nexport type PluginStateScopeKind = (typeof PLUGIN_STATE_SCOPE_KINDS)[number];\n\n/** Statuses for a plugin's scheduled job definition. */\nexport const PLUGIN_JOB_STATUSES = [\n \"active\",\n \"paused\",\n \"failed\",\n] as const;\nexport type PluginJobStatus = (typeof PLUGIN_JOB_STATUSES)[number];\n\n/** Statuses for individual job run executions. */\nexport const PLUGIN_JOB_RUN_STATUSES = [\n \"pending\",\n \"queued\",\n \"running\",\n \"succeeded\",\n \"failed\",\n \"cancelled\",\n] as const;\nexport type PluginJobRunStatus = (typeof PLUGIN_JOB_RUN_STATUSES)[number];\n\n/** What triggered a particular job run. */\nexport const PLUGIN_JOB_RUN_TRIGGERS = [\n \"schedule\",\n \"manual\",\n \"retry\",\n] as const;\nexport type PluginJobRunTrigger = (typeof PLUGIN_JOB_RUN_TRIGGERS)[number];\n\n/** Statuses for inbound webhook deliveries. */\nexport const PLUGIN_WEBHOOK_DELIVERY_STATUSES = [\n \"pending\",\n \"success\",\n \"failed\",\n] as const;\nexport type PluginWebhookDeliveryStatus = (typeof PLUGIN_WEBHOOK_DELIVERY_STATUSES)[number];\n\n/**\n * Core domain event types that plugins can subscribe to via the\n * `events.subscribe` capability.\n *\n * @see PLUGIN_SPEC.md \u00A716 \u2014 Event System\n */\nexport const PLUGIN_EVENT_TYPES = [\n \"company.created\",\n \"company.updated\",\n \"project.created\",\n \"project.updated\",\n \"project.workspace_created\",\n \"project.workspace_updated\",\n \"project.workspace_deleted\",\n \"issue.created\",\n \"issue.updated\",\n \"issue.comment.created\",\n \"agent.created\",\n \"agent.updated\",\n \"agent.status_changed\",\n \"agent.run.started\",\n \"agent.run.finished\",\n \"agent.run.failed\",\n \"agent.run.cancelled\",\n \"goal.created\",\n \"goal.updated\",\n \"approval.created\",\n \"approval.decided\",\n \"cost_event.created\",\n \"activity.logged\",\n] as const;\nexport type PluginEventType = (typeof PLUGIN_EVENT_TYPES)[number];\n\n/**\n * Error codes returned by the plugin bridge when a UI \u2192 worker call fails.\n *\n * @see PLUGIN_SPEC.md \u00A719.7 \u2014 Error Propagation Through The Bridge\n */\nexport const PLUGIN_BRIDGE_ERROR_CODES = [\n \"WORKER_UNAVAILABLE\",\n \"CAPABILITY_DENIED\",\n \"WORKER_ERROR\",\n \"TIMEOUT\",\n \"UNKNOWN\",\n] as const;\nexport type PluginBridgeErrorCode = (typeof PLUGIN_BRIDGE_ERROR_CODES)[number];\n", "export const FEEDBACK_TARGET_TYPES = [\"issue_comment\", \"issue_document_revision\"] as const;\nexport type FeedbackTargetType = (typeof FEEDBACK_TARGET_TYPES)[number];\n\nexport const FEEDBACK_VOTE_VALUES = [\"up\", \"down\"] as const;\nexport type FeedbackVoteValue = (typeof FEEDBACK_VOTE_VALUES)[number];\n\nexport const FEEDBACK_DATA_SHARING_PREFERENCES = [\"allowed\", \"not_allowed\", \"prompt\"] as const;\nexport type FeedbackDataSharingPreference = (typeof FEEDBACK_DATA_SHARING_PREFERENCES)[number];\n\nexport const DEFAULT_FEEDBACK_DATA_SHARING_PREFERENCE: FeedbackDataSharingPreference = \"prompt\";\n\nexport const FEEDBACK_TRACE_STATUSES = [\"local_only\", \"pending\", \"sent\", \"failed\"] as const;\nexport type FeedbackTraceStatus = (typeof FEEDBACK_TRACE_STATUSES)[number];\n\nexport const DEFAULT_FEEDBACK_DATA_SHARING_TERMS_VERSION = \"feedback-data-sharing-v1\";\n\nexport interface FeedbackVote {\n id: string;\n companyId: string;\n issueId: string;\n targetType: FeedbackTargetType;\n targetId: string;\n authorUserId: string;\n vote: FeedbackVoteValue;\n reason: string | null;\n sharedWithLabs: boolean;\n sharedAt: Date | null;\n consentVersion: string | null;\n redactionSummary: Record<string, unknown> | null;\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport interface FeedbackTraceTargetSummary {\n label: string;\n excerpt: string | null;\n authorAgentId: string | null;\n authorUserId: string | null;\n createdAt: Date | null;\n documentKey: string | null;\n documentTitle: string | null;\n revisionNumber: number | null;\n}\n\nexport interface FeedbackTrace {\n id: string;\n companyId: string;\n feedbackVoteId: string;\n issueId: string;\n projectId: string | null;\n issueIdentifier: string | null;\n issueTitle: string;\n authorUserId: string;\n targetType: FeedbackTargetType;\n targetId: string;\n vote: FeedbackVoteValue;\n status: FeedbackTraceStatus;\n destination: string | null;\n exportId: string | null;\n consentVersion: string | null;\n schemaVersion: string;\n bundleVersion: string;\n payloadVersion: string;\n payloadDigest: string | null;\n payloadSnapshot: Record<string, unknown> | null;\n targetSummary: FeedbackTraceTargetSummary;\n redactionSummary: Record<string, unknown> | null;\n attemptCount: number;\n lastAttemptedAt: Date | null;\n exportedAt: Date | null;\n failureReason: string | null;\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport type FeedbackTraceBundleCaptureStatus = \"full\" | \"partial\" | \"unavailable\";\n\nexport interface FeedbackTraceBundleFile {\n path: string;\n contentType: string;\n encoding: \"utf8\";\n byteLength: number;\n sha256: string;\n source:\n | \"paperclip_run\"\n | \"paperclip_run_events\"\n | \"paperclip_run_log\"\n | \"codex_session\"\n | \"claude_stream_json\"\n | \"claude_project_session\"\n | \"claude_project_artifact\"\n | \"claude_debug_log\"\n | \"claude_task_metadata\"\n | \"opencode_session\"\n | \"opencode_session_diff\"\n | \"opencode_message\"\n | \"opencode_message_part\"\n | \"opencode_project\"\n | \"opencode_todo\";\n contents: string;\n}\n\nexport interface FeedbackTraceBundle {\n traceId: string;\n exportId: string | null;\n companyId: string;\n issueId: string;\n issueIdentifier: string | null;\n adapterType: string | null;\n captureStatus: FeedbackTraceBundleCaptureStatus;\n notes: string[];\n envelope: Record<string, unknown>;\n surface: Record<string, unknown> | null;\n paperclipRun: Record<string, unknown> | null;\n rawAdapterTrace: Record<string, unknown> | null;\n normalizedAdapterTrace: Record<string, unknown> | null;\n privacy: Record<string, unknown> | null;\n integrity: Record<string, unknown>;\n files: FeedbackTraceBundleFile[];\n}\n", "import { z } from \"zod\";\nimport {\n FEEDBACK_DATA_SHARING_PREFERENCES,\n FEEDBACK_TARGET_TYPES,\n FEEDBACK_TRACE_STATUSES,\n FEEDBACK_VOTE_VALUES,\n} from \"../types/feedback.js\";\n\nexport const feedbackTargetTypeSchema = z.enum(FEEDBACK_TARGET_TYPES);\nexport const feedbackTraceStatusSchema = z.enum(FEEDBACK_TRACE_STATUSES);\nexport const feedbackVoteValueSchema = z.enum(FEEDBACK_VOTE_VALUES);\nexport const feedbackDataSharingPreferenceSchema = z.enum(FEEDBACK_DATA_SHARING_PREFERENCES);\n\nexport const upsertIssueFeedbackVoteSchema = z.object({\n targetType: feedbackTargetTypeSchema,\n targetId: z.string().uuid(),\n vote: feedbackVoteValueSchema,\n reason: z.string().trim().max(1000).optional(),\n allowSharing: z.boolean().optional(),\n});\n\nexport type UpsertIssueFeedbackVote = z.infer<typeof upsertIssueFeedbackVoteSchema>;\n", "import { z } from \"zod\";\nimport { DEFAULT_FEEDBACK_DATA_SHARING_PREFERENCE } from \"../types/feedback.js\";\nimport { feedbackDataSharingPreferenceSchema } from \"./feedback.js\";\n\nexport const instanceGeneralSettingsSchema = z.object({\n censorUsernameInLogs: z.boolean().default(false),\n keyboardShortcuts: z.boolean().default(false),\n feedbackDataSharingPreference: feedbackDataSharingPreferenceSchema.default(\n DEFAULT_FEEDBACK_DATA_SHARING_PREFERENCE,\n ),\n}).strict();\n\nexport const patchInstanceGeneralSettingsSchema = instanceGeneralSettingsSchema.partial();\n\nexport const instanceExperimentalSettingsSchema = z.object({\n enableIsolatedWorkspaces: z.boolean().default(false),\n autoRestartDevServerWhenIdle: z.boolean().default(false),\n}).strict();\n\nexport const patchInstanceExperimentalSettingsSchema = instanceExperimentalSettingsSchema.partial();\n\nexport type InstanceGeneralSettings = z.infer<typeof instanceGeneralSettingsSchema>;\nexport type PatchInstanceGeneralSettings = z.infer<typeof patchInstanceGeneralSettingsSchema>;\nexport type InstanceExperimentalSettings = z.infer<typeof instanceExperimentalSettingsSchema>;\nexport type PatchInstanceExperimentalSettings = z.infer<typeof patchInstanceExperimentalSettingsSchema>;\n", "import { z } from \"zod\";\nimport {\n BUDGET_INCIDENT_RESOLUTION_ACTIONS,\n BUDGET_METRICS,\n BUDGET_SCOPE_TYPES,\n BUDGET_WINDOW_KINDS,\n} from \"../constants.js\";\n\nexport const upsertBudgetPolicySchema = z.object({\n scopeType: z.enum(BUDGET_SCOPE_TYPES),\n scopeId: z.string().uuid(),\n metric: z.enum(BUDGET_METRICS).optional().default(\"billed_cents\"),\n windowKind: z.enum(BUDGET_WINDOW_KINDS).optional().default(\"calendar_month_utc\"),\n amount: z.number().int().nonnegative(),\n warnPercent: z.number().int().min(1).max(99).optional().default(80),\n hardStopEnabled: z.boolean().optional().default(true),\n notifyEnabled: z.boolean().optional().default(true),\n isActive: z.boolean().optional().default(true),\n});\n\nexport type UpsertBudgetPolicy = z.infer<typeof upsertBudgetPolicySchema>;\n\nexport const resolveBudgetIncidentSchema = z.object({\n action: z.enum(BUDGET_INCIDENT_RESOLUTION_ACTIONS),\n amount: z.number().int().nonnegative().optional(),\n decisionNote: z.string().optional().nullable(),\n}).superRefine((value, ctx) => {\n if (value.action === \"raise_budget_and_resume\" && typeof value.amount !== \"number\") {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"amount is required when raising a budget\",\n path: [\"amount\"],\n });\n }\n});\n\nexport type ResolveBudgetIncident = z.infer<typeof resolveBudgetIncidentSchema>;\n", "import { z } from \"zod\";\nimport { COMPANY_STATUSES } from \"../constants.js\";\n\nconst logoAssetIdSchema = z.string().uuid().nullable().optional();\nconst brandColorSchema = z.string().regex(/^#[0-9a-fA-F]{6}$/).nullable().optional();\nconst feedbackDataSharingTermsVersionSchema = z.string().min(1).nullable().optional();\n\nexport const createCompanySchema = z.object({\n name: z.string().min(1),\n description: z.string().optional().nullable(),\n budgetMonthlyCents: z.number().int().nonnegative().optional().default(0),\n});\n\nexport type CreateCompany = z.infer<typeof createCompanySchema>;\n\nexport const updateCompanySchema = createCompanySchema\n .partial()\n .extend({\n status: z.enum(COMPANY_STATUSES).optional(),\n spentMonthlyCents: z.number().int().nonnegative().optional(),\n requireBoardApprovalForNewAgents: z.boolean().optional(),\n feedbackDataSharingEnabled: z.boolean().optional(),\n feedbackDataSharingConsentAt: z.coerce.date().nullable().optional(),\n feedbackDataSharingConsentByUserId: z.string().min(1).nullable().optional(),\n feedbackDataSharingTermsVersion: feedbackDataSharingTermsVersionSchema,\n brandColor: brandColorSchema,\n logoAssetId: logoAssetIdSchema,\n });\n\nexport type UpdateCompany = z.infer<typeof updateCompanySchema>;\n\nexport const updateCompanyBrandingSchema = z\n .object({\n name: z.string().min(1).optional(),\n description: z.string().nullable().optional(),\n brandColor: brandColorSchema,\n logoAssetId: logoAssetIdSchema,\n })\n .strict()\n .refine(\n (value) =>\n value.name !== undefined\n || value.description !== undefined\n || value.brandColor !== undefined\n || value.logoAssetId !== undefined,\n \"At least one branding field must be provided\",\n );\n\nexport type UpdateCompanyBranding = z.infer<typeof updateCompanyBrandingSchema>;\n", "import { z } from \"zod\";\n\nexport const companySkillSourceTypeSchema = z.enum([\"local_path\", \"github\", \"url\", \"catalog\", \"skills_sh\"]);\nexport const companySkillTrustLevelSchema = z.enum([\"markdown_only\", \"assets\", \"scripts_executables\"]);\nexport const companySkillCompatibilitySchema = z.enum([\"compatible\", \"unknown\", \"invalid\"]);\nexport const companySkillSourceBadgeSchema = z.enum([\"paperclip\", \"github\", \"local\", \"url\", \"catalog\", \"skills_sh\"]);\n\nexport const companySkillFileInventoryEntrySchema = z.object({\n path: z.string().min(1),\n kind: z.enum([\"skill\", \"markdown\", \"reference\", \"script\", \"asset\", \"other\"]),\n});\n\nexport const companySkillSchema = z.object({\n id: z.string().uuid(),\n companyId: z.string().uuid(),\n key: z.string().min(1),\n slug: z.string().min(1),\n name: z.string().min(1),\n description: z.string().nullable(),\n markdown: z.string(),\n sourceType: companySkillSourceTypeSchema,\n sourceLocator: z.string().nullable(),\n sourceRef: z.string().nullable(),\n trustLevel: companySkillTrustLevelSchema,\n compatibility: companySkillCompatibilitySchema,\n fileInventory: z.array(companySkillFileInventoryEntrySchema).default([]),\n metadata: z.record(z.unknown()).nullable(),\n createdAt: z.coerce.date(),\n updatedAt: z.coerce.date(),\n});\n\nexport const companySkillListItemSchema = companySkillSchema.extend({\n attachedAgentCount: z.number().int().nonnegative(),\n editable: z.boolean(),\n editableReason: z.string().nullable(),\n sourceLabel: z.string().nullable(),\n sourceBadge: companySkillSourceBadgeSchema,\n});\n\nexport const companySkillUsageAgentSchema = z.object({\n id: z.string().uuid(),\n name: z.string().min(1),\n urlKey: z.string().min(1),\n adapterType: z.string().min(1),\n desired: z.boolean(),\n actualState: z.string().nullable(),\n});\n\nexport const companySkillDetailSchema = companySkillSchema.extend({\n attachedAgentCount: z.number().int().nonnegative(),\n usedByAgents: z.array(companySkillUsageAgentSchema).default([]),\n editable: z.boolean(),\n editableReason: z.string().nullable(),\n sourceLabel: z.string().nullable(),\n sourceBadge: companySkillSourceBadgeSchema,\n});\n\nexport const companySkillUpdateStatusSchema = z.object({\n supported: z.boolean(),\n reason: z.string().nullable(),\n trackingRef: z.string().nullable(),\n currentRef: z.string().nullable(),\n latestRef: z.string().nullable(),\n hasUpdate: z.boolean(),\n});\n\nexport const companySkillImportSchema = z.object({\n source: z.string().min(1),\n});\n\nexport const companySkillProjectScanRequestSchema = z.object({\n projectIds: z.array(z.string().uuid()).optional(),\n workspaceIds: z.array(z.string().uuid()).optional(),\n});\n\nexport const companySkillProjectScanSkippedSchema = z.object({\n projectId: z.string().uuid(),\n projectName: z.string().min(1),\n workspaceId: z.string().uuid().nullable(),\n workspaceName: z.string().nullable(),\n path: z.string().nullable(),\n reason: z.string().min(1),\n});\n\nexport const companySkillProjectScanConflictSchema = z.object({\n slug: z.string().min(1),\n key: z.string().min(1),\n projectId: z.string().uuid(),\n projectName: z.string().min(1),\n workspaceId: z.string().uuid(),\n workspaceName: z.string().min(1),\n path: z.string().min(1),\n existingSkillId: z.string().uuid(),\n existingSkillKey: z.string().min(1),\n existingSourceLocator: z.string().nullable(),\n reason: z.string().min(1),\n});\n\nexport const companySkillProjectScanResultSchema = z.object({\n scannedProjects: z.number().int().nonnegative(),\n scannedWorkspaces: z.number().int().nonnegative(),\n discovered: z.number().int().nonnegative(),\n imported: z.array(companySkillSchema),\n updated: z.array(companySkillSchema),\n skipped: z.array(companySkillProjectScanSkippedSchema),\n conflicts: z.array(companySkillProjectScanConflictSchema),\n warnings: z.array(z.string()),\n});\n\nexport const companySkillCreateSchema = z.object({\n name: z.string().min(1),\n slug: z.string().min(1).nullable().optional(),\n description: z.string().nullable().optional(),\n markdown: z.string().nullable().optional(),\n});\n\nexport const companySkillFileDetailSchema = z.object({\n skillId: z.string().uuid(),\n path: z.string().min(1),\n kind: z.enum([\"skill\", \"markdown\", \"reference\", \"script\", \"asset\", \"other\"]),\n content: z.string(),\n language: z.string().nullable(),\n markdown: z.boolean(),\n editable: z.boolean(),\n});\n\nexport const companySkillFileUpdateSchema = z.object({\n path: z.string().min(1),\n content: z.string(),\n});\n\nexport type CompanySkillImport = z.infer<typeof companySkillImportSchema>;\nexport type CompanySkillProjectScan = z.infer<typeof companySkillProjectScanRequestSchema>;\nexport type CompanySkillCreate = z.infer<typeof companySkillCreateSchema>;\nexport type CompanySkillFileUpdate = z.infer<typeof companySkillFileUpdateSchema>;\n", "import { z } from \"zod\";\n\nexport const agentSkillStateSchema = z.enum([\n \"available\",\n \"configured\",\n \"installed\",\n \"missing\",\n \"stale\",\n \"external\",\n]);\n\nexport const agentSkillOriginSchema = z.enum([\n \"company_managed\",\n \"paperclip_required\",\n \"user_installed\",\n \"external_unknown\",\n]);\n\nexport const agentSkillSyncModeSchema = z.enum([\n \"unsupported\",\n \"persistent\",\n \"ephemeral\",\n]);\n\nexport const agentSkillEntrySchema = z.object({\n key: z.string().min(1),\n runtimeName: z.string().min(1).nullable(),\n desired: z.boolean(),\n managed: z.boolean(),\n required: z.boolean().optional(),\n requiredReason: z.string().nullable().optional(),\n state: agentSkillStateSchema,\n origin: agentSkillOriginSchema.optional(),\n originLabel: z.string().nullable().optional(),\n locationLabel: z.string().nullable().optional(),\n readOnly: z.boolean().optional(),\n sourcePath: z.string().nullable().optional(),\n targetPath: z.string().nullable().optional(),\n detail: z.string().nullable().optional(),\n});\n\nexport const agentSkillSnapshotSchema = z.object({\n adapterType: z.string().min(1),\n supported: z.boolean(),\n mode: agentSkillSyncModeSchema,\n desiredSkills: z.array(z.string().min(1)),\n entries: z.array(agentSkillEntrySchema),\n warnings: z.array(z.string()),\n});\n\nexport const agentSkillSyncSchema = z.object({\n desiredSkills: z.array(z.string().min(1)),\n});\n\nexport type AgentSkillSync = z.infer<typeof agentSkillSyncSchema>;\n", "import { z } from \"zod\";\nimport { ISSUE_PRIORITIES, ISSUE_STATUSES } from \"../constants.js\";\n\nexport const ISSUE_EXECUTION_WORKSPACE_PREFERENCES = [\n \"inherit\",\n \"shared_workspace\",\n \"isolated_workspace\",\n \"operator_branch\",\n \"reuse_existing\",\n \"agent_default\",\n] as const;\n\nconst executionWorkspaceStrategySchema = z\n .object({\n type: z.enum([\"project_primary\", \"git_worktree\", \"adapter_managed\", \"cloud_sandbox\"]).optional(),\n baseRef: z.string().optional().nullable(),\n branchTemplate: z.string().optional().nullable(),\n worktreeParentDir: z.string().optional().nullable(),\n provisionCommand: z.string().optional().nullable(),\n teardownCommand: z.string().optional().nullable(),\n })\n .strict();\n\nexport const issueExecutionWorkspaceSettingsSchema = z\n .object({\n mode: z.enum(ISSUE_EXECUTION_WORKSPACE_PREFERENCES).optional(),\n workspaceStrategy: executionWorkspaceStrategySchema.optional().nullable(),\n workspaceRuntime: z.record(z.unknown()).optional().nullable(),\n })\n .strict();\n\nexport const issueAssigneeAdapterOverridesSchema = z\n .object({\n adapterConfig: z.record(z.unknown()).optional(),\n useProjectWorkspace: z.boolean().optional(),\n })\n .strict();\n\nexport const createIssueSchema = z.object({\n projectId: z.string().uuid().optional().nullable(),\n projectWorkspaceId: z.string().uuid().optional().nullable(),\n goalId: z.string().uuid().optional().nullable(),\n parentId: z.string().uuid().optional().nullable(),\n inheritExecutionWorkspaceFromIssueId: z.string().uuid().optional().nullable(),\n title: z.string().min(1),\n description: z.string().optional().nullable(),\n status: z.enum(ISSUE_STATUSES).optional().default(\"backlog\"),\n priority: z.enum(ISSUE_PRIORITIES).optional().default(\"medium\"),\n assigneeAgentId: z.string().uuid().optional().nullable(),\n assigneeUserId: z.string().optional().nullable(),\n requestDepth: z.number().int().nonnegative().optional().default(0),\n billingCode: z.string().optional().nullable(),\n assigneeAdapterOverrides: issueAssigneeAdapterOverridesSchema.optional().nullable(),\n executionWorkspaceId: z.string().uuid().optional().nullable(),\n executionWorkspacePreference: z.enum(ISSUE_EXECUTION_WORKSPACE_PREFERENCES).optional().nullable(),\n executionWorkspaceSettings: issueExecutionWorkspaceSettingsSchema.optional().nullable(),\n labelIds: z.array(z.string().uuid()).optional(),\n});\n\nexport type CreateIssue = z.infer<typeof createIssueSchema>;\n\nexport const createIssueLabelSchema = z.object({\n name: z.string().trim().min(1).max(48),\n color: z.string().regex(/^#(?:[0-9a-fA-F]{6})$/, \"Color must be a 6-digit hex value\"),\n});\n\nexport type CreateIssueLabel = z.infer<typeof createIssueLabelSchema>;\n\nexport const updateIssueSchema = createIssueSchema.partial().extend({\n comment: z.string().min(1).optional(),\n reopen: z.boolean().optional(),\n interrupt: z.boolean().optional(),\n hiddenAt: z.string().datetime().nullable().optional(),\n});\n\nexport type UpdateIssue = z.infer<typeof updateIssueSchema>;\nexport type IssueExecutionWorkspaceSettings = z.infer<typeof issueExecutionWorkspaceSettingsSchema>;\n\nexport const checkoutIssueSchema = z.object({\n agentId: z.string().uuid(),\n expectedStatuses: z.array(z.enum(ISSUE_STATUSES)).nonempty(),\n});\n\nexport type CheckoutIssue = z.infer<typeof checkoutIssueSchema>;\n\nexport const addIssueCommentSchema = z.object({\n body: z.string().min(1),\n reopen: z.boolean().optional(),\n interrupt: z.boolean().optional(),\n});\n\nexport type AddIssueComment = z.infer<typeof addIssueCommentSchema>;\n\nexport const linkIssueApprovalSchema = z.object({\n approvalId: z.string().uuid(),\n});\n\nexport type LinkIssueApproval = z.infer<typeof linkIssueApprovalSchema>;\n\nexport const createIssueAttachmentMetadataSchema = z.object({\n issueCommentId: z.string().uuid().optional().nullable(),\n});\n\nexport type CreateIssueAttachmentMetadata = z.infer<typeof createIssueAttachmentMetadataSchema>;\n\nexport const ISSUE_DOCUMENT_FORMATS = [\"markdown\"] as const;\n\nexport const issueDocumentFormatSchema = z.enum(ISSUE_DOCUMENT_FORMATS);\n\nexport const issueDocumentKeySchema = z\n .string()\n .trim()\n .min(1)\n .max(64)\n .regex(/^[a-z0-9][a-z0-9_-]*$/, \"Document key must be lowercase letters, numbers, _ or -\");\n\nexport const upsertIssueDocumentSchema = z.object({\n title: z.string().trim().max(200).nullable().optional(),\n format: issueDocumentFormatSchema,\n body: z.string().max(524288),\n changeSummary: z.string().trim().max(500).nullable().optional(),\n baseRevisionId: z.string().uuid().nullable().optional(),\n});\n\nexport const restoreIssueDocumentRevisionSchema = z.object({});\n\nexport type IssueDocumentFormat = z.infer<typeof issueDocumentFormatSchema>;\nexport type UpsertIssueDocument = z.infer<typeof upsertIssueDocumentSchema>;\nexport type RestoreIssueDocumentRevision = z.infer<typeof restoreIssueDocumentRevisionSchema>;\n", "import { z } from \"zod\";\nimport {\n ISSUE_PRIORITIES,\n ROUTINE_CATCH_UP_POLICIES,\n ROUTINE_CONCURRENCY_POLICIES,\n ROUTINE_STATUSES,\n ROUTINE_TRIGGER_SIGNING_MODES,\n ROUTINE_VARIABLE_TYPES,\n} from \"../constants.js\";\nimport {\n ISSUE_EXECUTION_WORKSPACE_PREFERENCES,\n issueExecutionWorkspaceSettingsSchema,\n} from \"./issue.js\";\n\nconst routineVariableValueSchema = z.union([z.string(), z.number().finite(), z.boolean()]);\n\nexport const routineVariableSchema = z.object({\n name: z.string().trim().regex(/^[A-Za-z][A-Za-z0-9_]*$/),\n label: z.string().trim().max(120).optional().nullable(),\n type: z.enum(ROUTINE_VARIABLE_TYPES).optional().default(\"text\"),\n defaultValue: routineVariableValueSchema.optional().nullable(),\n required: z.boolean().optional().default(true),\n options: z.array(z.string().trim().min(1).max(120)).max(50).optional().default([]),\n}).superRefine((value, ctx) => {\n if (value.type === \"select\" && value.options.length === 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: [\"options\"],\n message: \"Select variables require at least one option\",\n });\n }\n if (value.type !== \"select\" && value.options.length > 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: [\"options\"],\n message: \"Only select variables can define options\",\n });\n }\n if (value.type === \"select\" && value.defaultValue != null) {\n if (typeof value.defaultValue !== \"string\" || !value.options.includes(value.defaultValue)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: [\"defaultValue\"],\n message: \"Select variable defaults must match one of the allowed options\",\n });\n }\n }\n});\n\nexport const createRoutineSchema = z.object({\n projectId: z.string().uuid(),\n goalId: z.string().uuid().optional().nullable(),\n parentIssueId: z.string().uuid().optional().nullable(),\n title: z.string().trim().min(1).max(200),\n description: z.string().optional().nullable(),\n assigneeAgentId: z.string().uuid(),\n priority: z.enum(ISSUE_PRIORITIES).optional().default(\"medium\"),\n status: z.enum(ROUTINE_STATUSES).optional().default(\"active\"),\n concurrencyPolicy: z.enum(ROUTINE_CONCURRENCY_POLICIES).optional().default(\"coalesce_if_active\"),\n catchUpPolicy: z.enum(ROUTINE_CATCH_UP_POLICIES).optional().default(\"skip_missed\"),\n variables: z.array(routineVariableSchema).optional().default([]),\n});\n\nexport type CreateRoutine = z.infer<typeof createRoutineSchema>;\n\nexport const updateRoutineSchema = createRoutineSchema.partial();\nexport type UpdateRoutine = z.infer<typeof updateRoutineSchema>;\n\nconst baseTriggerSchema = z.object({\n label: z.string().trim().max(120).optional().nullable(),\n enabled: z.boolean().optional().default(true),\n});\n\nexport const createRoutineTriggerSchema = z.discriminatedUnion(\"kind\", [\n baseTriggerSchema.extend({\n kind: z.literal(\"schedule\"),\n cronExpression: z.string().trim().min(1),\n timezone: z.string().trim().min(1).default(\"UTC\"),\n }),\n baseTriggerSchema.extend({\n kind: z.literal(\"webhook\"),\n signingMode: z.enum(ROUTINE_TRIGGER_SIGNING_MODES).optional().default(\"bearer\"),\n replayWindowSec: z.number().int().min(30).max(86_400).optional().default(300),\n }),\n baseTriggerSchema.extend({\n kind: z.literal(\"api\"),\n }),\n]);\n\nexport type CreateRoutineTrigger = z.infer<typeof createRoutineTriggerSchema>;\n\nexport const updateRoutineTriggerSchema = z.object({\n label: z.string().trim().max(120).optional().nullable(),\n enabled: z.boolean().optional(),\n cronExpression: z.string().trim().min(1).optional().nullable(),\n timezone: z.string().trim().min(1).optional().nullable(),\n signingMode: z.enum(ROUTINE_TRIGGER_SIGNING_MODES).optional().nullable(),\n replayWindowSec: z.number().int().min(30).max(86_400).optional().nullable(),\n});\n\nexport type UpdateRoutineTrigger = z.infer<typeof updateRoutineTriggerSchema>;\n\nexport const runRoutineSchema = z.object({\n triggerId: z.string().uuid().optional().nullable(),\n payload: z.record(z.unknown()).optional().nullable(),\n variables: z.record(routineVariableValueSchema).optional().nullable(),\n idempotencyKey: z.string().trim().max(255).optional().nullable(),\n source: z.enum([\"manual\", \"api\"]).optional().default(\"manual\"),\n executionWorkspaceId: z.string().uuid().optional().nullable(),\n executionWorkspacePreference: z.enum(ISSUE_EXECUTION_WORKSPACE_PREFERENCES).optional().nullable(),\n executionWorkspaceSettings: issueExecutionWorkspaceSettingsSchema.optional().nullable(),\n});\n\nexport type RunRoutine = z.infer<typeof runRoutineSchema>;\n\nexport const rotateRoutineTriggerSecretSchema = z.object({});\nexport type RotateRoutineTriggerSecret = z.infer<typeof rotateRoutineTriggerSecretSchema>;\n", "import { z } from \"zod\";\nimport { routineVariableSchema } from \"./routine.js\";\n\nexport const portabilityIncludeSchema = z\n .object({\n company: z.boolean().optional(),\n agents: z.boolean().optional(),\n projects: z.boolean().optional(),\n issues: z.boolean().optional(),\n skills: z.boolean().optional(),\n })\n .partial();\n\nexport const portabilityEnvInputSchema = z.object({\n key: z.string().min(1),\n description: z.string().nullable(),\n agentSlug: z.string().min(1).nullable(),\n kind: z.enum([\"secret\", \"plain\"]),\n requirement: z.enum([\"required\", \"optional\"]),\n defaultValue: z.string().nullable(),\n portability: z.enum([\"portable\", \"system_dependent\"]),\n});\n\nexport const portabilityFileEntrySchema = z.union([\n z.string(),\n z.object({\n encoding: z.literal(\"base64\"),\n data: z.string(),\n contentType: z.string().min(1).optional().nullable(),\n }),\n]);\n\nexport const portabilityCompanyManifestEntrySchema = z.object({\n path: z.string().min(1),\n name: z.string().min(1),\n description: z.string().nullable(),\n brandColor: z.string().nullable(),\n logoPath: z.string().nullable(),\n requireBoardApprovalForNewAgents: z.boolean(),\n feedbackDataSharingEnabled: z.boolean().default(false),\n feedbackDataSharingConsentAt: z.string().datetime().nullable().default(null),\n feedbackDataSharingConsentByUserId: z.string().nullable().default(null),\n feedbackDataSharingTermsVersion: z.string().nullable().default(null),\n});\n\nexport const portabilitySidebarOrderSchema = z.object({\n agents: z.array(z.string().min(1)).default([]),\n projects: z.array(z.string().min(1)).default([]),\n});\n\nexport const portabilityAgentManifestEntrySchema = z.object({\n slug: z.string().min(1),\n name: z.string().min(1),\n path: z.string().min(1),\n skills: z.array(z.string().min(1)).default([]),\n role: z.string().min(1),\n title: z.string().nullable(),\n icon: z.string().nullable(),\n capabilities: z.string().nullable(),\n reportsToSlug: z.string().min(1).nullable(),\n adapterType: z.string().min(1),\n adapterConfig: z.record(z.unknown()),\n runtimeConfig: z.record(z.unknown()),\n permissions: z.record(z.unknown()),\n budgetMonthlyCents: z.number().int().nonnegative(),\n metadata: z.record(z.unknown()).nullable(),\n});\n\nexport const portabilitySkillManifestEntrySchema = z.object({\n key: z.string().min(1),\n slug: z.string().min(1),\n name: z.string().min(1),\n path: z.string().min(1),\n description: z.string().nullable(),\n sourceType: z.string().min(1),\n sourceLocator: z.string().nullable(),\n sourceRef: z.string().nullable(),\n trustLevel: z.string().nullable(),\n compatibility: z.string().nullable(),\n metadata: z.record(z.unknown()).nullable(),\n fileInventory: z.array(z.object({\n path: z.string().min(1),\n kind: z.string().min(1),\n })).default([]),\n});\n\nexport const portabilityProjectManifestEntrySchema = z.object({\n slug: z.string().min(1),\n name: z.string().min(1),\n path: z.string().min(1),\n description: z.string().nullable(),\n ownerAgentSlug: z.string().min(1).nullable(),\n leadAgentSlug: z.string().min(1).nullable(),\n targetDate: z.string().nullable(),\n color: z.string().nullable(),\n status: z.string().nullable(),\n executionWorkspacePolicy: z.record(z.unknown()).nullable(),\n workspaces: z.array(z.object({\n key: z.string().min(1),\n name: z.string().min(1),\n sourceType: z.string().nullable(),\n repoUrl: z.string().nullable(),\n repoRef: z.string().nullable(),\n defaultRef: z.string().nullable(),\n visibility: z.string().nullable(),\n setupCommand: z.string().nullable(),\n cleanupCommand: z.string().nullable(),\n metadata: z.record(z.unknown()).nullable(),\n isPrimary: z.boolean(),\n })).default([]),\n metadata: z.record(z.unknown()).nullable(),\n});\n\nexport const portabilityIssueRoutineTriggerManifestEntrySchema = z.object({\n kind: z.string().min(1),\n label: z.string().nullable(),\n enabled: z.boolean(),\n cronExpression: z.string().nullable(),\n timezone: z.string().nullable(),\n signingMode: z.string().nullable(),\n replayWindowSec: z.number().int().nullable(),\n});\n\nexport const portabilityIssueRoutineManifestEntrySchema = z.object({\n concurrencyPolicy: z.string().nullable(),\n catchUpPolicy: z.string().nullable(),\n variables: z.array(routineVariableSchema).nullable().optional(),\n triggers: z.array(portabilityIssueRoutineTriggerManifestEntrySchema).default([]),\n});\n\nexport const portabilityIssueManifestEntrySchema = z.object({\n slug: z.string().min(1),\n identifier: z.string().min(1).nullable(),\n title: z.string().min(1),\n path: z.string().min(1),\n projectSlug: z.string().min(1).nullable(),\n projectWorkspaceKey: z.string().min(1).nullable(),\n assigneeAgentSlug: z.string().min(1).nullable(),\n description: z.string().nullable(),\n recurring: z.boolean().default(false),\n routine: portabilityIssueRoutineManifestEntrySchema.nullable(),\n legacyRecurrence: z.record(z.unknown()).nullable(),\n status: z.string().nullable(),\n priority: z.string().nullable(),\n labelIds: z.array(z.string().min(1)).default([]),\n billingCode: z.string().nullable(),\n executionWorkspaceSettings: z.record(z.unknown()).nullable(),\n assigneeAdapterOverrides: z.record(z.unknown()).nullable(),\n metadata: z.record(z.unknown()).nullable(),\n});\n\nexport const portabilityManifestSchema = z.object({\n schemaVersion: z.number().int().positive(),\n generatedAt: z.string().datetime(),\n source: z\n .object({\n companyId: z.string().uuid(),\n companyName: z.string().min(1),\n })\n .nullable(),\n includes: z.object({\n company: z.boolean(),\n agents: z.boolean(),\n projects: z.boolean(),\n issues: z.boolean(),\n skills: z.boolean(),\n }),\n company: portabilityCompanyManifestEntrySchema.nullable(),\n sidebar: portabilitySidebarOrderSchema.nullable(),\n agents: z.array(portabilityAgentManifestEntrySchema),\n skills: z.array(portabilitySkillManifestEntrySchema).default([]),\n projects: z.array(portabilityProjectManifestEntrySchema).default([]),\n issues: z.array(portabilityIssueManifestEntrySchema).default([]),\n envInputs: z.array(portabilityEnvInputSchema).default([]),\n});\n\nexport const portabilitySourceSchema = z.discriminatedUnion(\"type\", [\n z.object({\n type: z.literal(\"inline\"),\n rootPath: z.string().min(1).optional().nullable(),\n files: z.record(portabilityFileEntrySchema),\n }),\n z.object({\n type: z.literal(\"github\"),\n url: z.string().url(),\n }),\n]);\n\nexport const portabilityTargetSchema = z.discriminatedUnion(\"mode\", [\n z.object({\n mode: z.literal(\"new_company\"),\n newCompanyName: z.string().min(1).optional().nullable(),\n }),\n z.object({\n mode: z.literal(\"existing_company\"),\n companyId: z.string().uuid(),\n }),\n]);\n\nexport const portabilityAgentSelectionSchema = z.union([\n z.literal(\"all\"),\n z.array(z.string().min(1)),\n]);\n\nexport const portabilityCollisionStrategySchema = z.enum([\"rename\", \"skip\", \"replace\"]);\n\nexport const companyPortabilityExportSchema = z.object({\n include: portabilityIncludeSchema.optional(),\n agents: z.array(z.string().min(1)).optional(),\n skills: z.array(z.string().min(1)).optional(),\n projects: z.array(z.string().min(1)).optional(),\n issues: z.array(z.string().min(1)).optional(),\n projectIssues: z.array(z.string().min(1)).optional(),\n selectedFiles: z.array(z.string().min(1)).optional(),\n expandReferencedSkills: z.boolean().optional(),\n sidebarOrder: portabilitySidebarOrderSchema.partial().optional(),\n});\n\nexport type CompanyPortabilityExport = z.infer<typeof companyPortabilityExportSchema>;\n\nexport const companyPortabilityPreviewSchema = z.object({\n source: portabilitySourceSchema,\n include: portabilityIncludeSchema.optional(),\n target: portabilityTargetSchema,\n agents: portabilityAgentSelectionSchema.optional(),\n collisionStrategy: portabilityCollisionStrategySchema.optional(),\n nameOverrides: z.record(z.string().min(1), z.string().min(1)).optional(),\n selectedFiles: z.array(z.string().min(1)).optional(),\n});\n\nexport type CompanyPortabilityPreview = z.infer<typeof companyPortabilityPreviewSchema>;\n\nexport const portabilityAdapterOverrideSchema = z.object({\n adapterType: z.string().min(1),\n adapterConfig: z.record(z.unknown()).optional(),\n});\n\nexport const companyPortabilityImportSchema = companyPortabilityPreviewSchema.extend({\n adapterOverrides: z.record(z.string().min(1), portabilityAdapterOverrideSchema).optional(),\n});\n\nexport type CompanyPortabilityImport = z.infer<typeof companyPortabilityImportSchema>;\n", "import { z } from \"zod\";\nimport { SECRET_PROVIDERS } from \"../constants.js\";\n\nexport const envBindingPlainSchema = z.object({\n type: z.literal(\"plain\"),\n value: z.string(),\n});\n\nexport const envBindingSecretRefSchema = z.object({\n type: z.literal(\"secret_ref\"),\n secretId: z.string().uuid(),\n version: z.union([z.literal(\"latest\"), z.number().int().positive()]).optional(),\n});\n\n// Backward-compatible union that accepts legacy inline values.\nexport const envBindingSchema = z.union([\n z.string(),\n envBindingPlainSchema,\n envBindingSecretRefSchema,\n]);\n\nexport const envConfigSchema = z.record(envBindingSchema);\n\nexport const createSecretSchema = z.object({\n name: z.string().min(1),\n provider: z.enum(SECRET_PROVIDERS).optional(),\n value: z.string().min(1),\n description: z.string().optional().nullable(),\n externalRef: z.string().optional().nullable(),\n});\n\nexport type CreateSecret = z.infer<typeof createSecretSchema>;\n\nexport const rotateSecretSchema = z.object({\n value: z.string().min(1),\n externalRef: z.string().optional().nullable(),\n});\n\nexport type RotateSecret = z.infer<typeof rotateSecretSchema>;\n\nexport const updateSecretSchema = z.object({\n name: z.string().min(1).optional(),\n description: z.string().optional().nullable(),\n externalRef: z.string().optional().nullable(),\n});\n\nexport type UpdateSecret = z.infer<typeof updateSecretSchema>;\n", "import { z } from \"zod\";\nimport {\n AGENT_ADAPTER_TYPES,\n AGENT_ICON_NAMES,\n AGENT_ROLES,\n AGENT_STATUSES,\n INBOX_MINE_ISSUE_STATUS_FILTER,\n} from \"../constants.js\";\nimport { envConfigSchema } from \"./secret.js\";\n\nexport const agentPermissionsSchema = z.object({\n canCreateAgents: z.boolean().optional().default(false),\n});\n\nexport const agentInstructionsBundleModeSchema = z.enum([\"managed\", \"external\"]);\n\nexport const updateAgentInstructionsBundleSchema = z.object({\n mode: agentInstructionsBundleModeSchema.optional(),\n rootPath: z.string().trim().min(1).nullable().optional(),\n entryFile: z.string().trim().min(1).optional(),\n clearLegacyPromptTemplate: z.boolean().optional().default(false),\n});\n\nexport type UpdateAgentInstructionsBundle = z.infer<typeof updateAgentInstructionsBundleSchema>;\n\nexport const upsertAgentInstructionsFileSchema = z.object({\n path: z.string().trim().min(1),\n content: z.string(),\n clearLegacyPromptTemplate: z.boolean().optional().default(false),\n});\n\nexport type UpsertAgentInstructionsFile = z.infer<typeof upsertAgentInstructionsFileSchema>;\n\nconst adapterConfigSchema = z.record(z.unknown()).superRefine((value, ctx) => {\n const envValue = value.env;\n if (envValue === undefined) return;\n const parsed = envConfigSchema.safeParse(envValue);\n if (!parsed.success) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"adapterConfig.env must be a map of valid env bindings\",\n path: [\"env\"],\n });\n }\n});\n\nexport const createAgentSchema = z.object({\n name: z.string().min(1),\n role: z.enum(AGENT_ROLES).optional().default(\"general\"),\n title: z.string().optional().nullable(),\n icon: z.enum(AGENT_ICON_NAMES).optional().nullable(),\n reportsTo: z.string().uuid().optional().nullable(),\n capabilities: z.string().optional().nullable(),\n desiredSkills: z.array(z.string().min(1)).optional(),\n adapterType: z.enum(AGENT_ADAPTER_TYPES).optional().default(\"process\"),\n adapterConfig: adapterConfigSchema.optional().default({}),\n runtimeConfig: z.record(z.unknown()).optional().default({}),\n budgetMonthlyCents: z.number().int().nonnegative().optional().default(0),\n permissions: agentPermissionsSchema.optional(),\n metadata: z.record(z.unknown()).optional().nullable(),\n});\n\nexport type CreateAgent = z.infer<typeof createAgentSchema>;\n\nexport const createAgentHireSchema = createAgentSchema.extend({\n sourceIssueId: z.string().uuid().optional().nullable(),\n sourceIssueIds: z.array(z.string().uuid()).optional(),\n});\n\nexport type CreateAgentHire = z.infer<typeof createAgentHireSchema>;\n\nexport const updateAgentSchema = createAgentSchema\n .omit({ permissions: true })\n .partial()\n .extend({\n permissions: z.never().optional(),\n replaceAdapterConfig: z.boolean().optional(),\n status: z.enum(AGENT_STATUSES).optional(),\n spentMonthlyCents: z.number().int().nonnegative().optional(),\n });\n\nexport type UpdateAgent = z.infer<typeof updateAgentSchema>;\n\nexport const updateAgentInstructionsPathSchema = z.object({\n path: z.string().trim().min(1).nullable(),\n adapterConfigKey: z.string().trim().min(1).optional(),\n});\n\nexport type UpdateAgentInstructionsPath = z.infer<typeof updateAgentInstructionsPathSchema>;\n\nexport const createAgentKeySchema = z.object({\n name: z.string().min(1).default(\"default\"),\n});\n\nexport type CreateAgentKey = z.infer<typeof createAgentKeySchema>;\n\nexport const agentMineInboxQuerySchema = z.object({\n userId: z.string().trim().min(1),\n status: z.string().trim().min(1).optional().default(INBOX_MINE_ISSUE_STATUS_FILTER),\n});\n\nexport type AgentMineInboxQuery = z.infer<typeof agentMineInboxQuerySchema>;\n\nexport const wakeAgentSchema = z.object({\n source: z.enum([\"timer\", \"assignment\", \"on_demand\", \"automation\"]).optional().default(\"on_demand\"),\n triggerDetail: z.enum([\"manual\", \"ping\", \"callback\", \"system\"]).optional(),\n reason: z.string().optional().nullable(),\n payload: z.record(z.unknown()).optional().nullable(),\n idempotencyKey: z.string().optional().nullable(),\n forceFreshSession: z.preprocess(\n (value) => (value === null ? undefined : value),\n z.boolean().optional().default(false),\n ),\n});\n\nexport type WakeAgent = z.infer<typeof wakeAgentSchema>;\n\nexport const resetAgentSessionSchema = z.object({\n taskKey: z.string().min(1).optional().nullable(),\n});\n\nexport type ResetAgentSession = z.infer<typeof resetAgentSessionSchema>;\n\nexport const testAdapterEnvironmentSchema = z.object({\n adapterConfig: adapterConfigSchema.optional().default({}),\n});\n\nexport type TestAdapterEnvironment = z.infer<typeof testAdapterEnvironmentSchema>;\n\nexport const updateAgentPermissionsSchema = z.object({\n canCreateAgents: z.boolean(),\n canAssignTasks: z.boolean(),\n});\n\nexport type UpdateAgentPermissions = z.infer<typeof updateAgentPermissionsSchema>;\n", "import { z } from \"zod\";\nimport { PROJECT_STATUSES } from \"../constants.js\";\n\nconst executionWorkspaceStrategySchema = z\n .object({\n type: z.enum([\"project_primary\", \"git_worktree\", \"adapter_managed\", \"cloud_sandbox\"]).optional(),\n baseRef: z.string().optional().nullable(),\n branchTemplate: z.string().optional().nullable(),\n worktreeParentDir: z.string().optional().nullable(),\n provisionCommand: z.string().optional().nullable(),\n teardownCommand: z.string().optional().nullable(),\n })\n .strict();\n\nexport const projectExecutionWorkspacePolicySchema = z\n .object({\n enabled: z.boolean(),\n defaultMode: z.enum([\"shared_workspace\", \"isolated_workspace\", \"operator_branch\", \"adapter_default\"]).optional(),\n allowIssueOverride: z.boolean().optional(),\n defaultProjectWorkspaceId: z.string().uuid().optional().nullable(),\n workspaceStrategy: executionWorkspaceStrategySchema.optional().nullable(),\n workspaceRuntime: z.record(z.unknown()).optional().nullable(),\n branchPolicy: z.record(z.unknown()).optional().nullable(),\n pullRequestPolicy: z.record(z.unknown()).optional().nullable(),\n runtimePolicy: z.record(z.unknown()).optional().nullable(),\n cleanupPolicy: z.record(z.unknown()).optional().nullable(),\n })\n .strict();\n\nexport const projectWorkspaceRuntimeConfigSchema = z.object({\n workspaceRuntime: z.record(z.unknown()).optional().nullable(),\n desiredState: z.enum([\"running\", \"stopped\"]).optional().nullable(),\n}).strict();\n\nconst projectWorkspaceSourceTypeSchema = z.enum([\"local_path\", \"git_repo\", \"remote_managed\", \"non_git_path\"]);\nconst projectWorkspaceVisibilitySchema = z.enum([\"default\", \"advanced\"]);\n\nconst projectWorkspaceFields = {\n name: z.string().min(1).optional(),\n sourceType: projectWorkspaceSourceTypeSchema.optional(),\n cwd: z.string().min(1).optional().nullable(),\n repoUrl: z.string().url().optional().nullable(),\n repoRef: z.string().optional().nullable(),\n defaultRef: z.string().optional().nullable(),\n visibility: projectWorkspaceVisibilitySchema.optional(),\n setupCommand: z.string().optional().nullable(),\n cleanupCommand: z.string().optional().nullable(),\n remoteProvider: z.string().optional().nullable(),\n remoteWorkspaceRef: z.string().optional().nullable(),\n sharedWorkspaceKey: z.string().optional().nullable(),\n metadata: z.record(z.unknown()).optional().nullable(),\n runtimeConfig: projectWorkspaceRuntimeConfigSchema.optional().nullable(),\n};\n\nfunction validateProjectWorkspace(value: Record<string, unknown>, ctx: z.RefinementCtx) {\n const sourceType = value.sourceType ?? \"local_path\";\n const hasCwd = typeof value.cwd === \"string\" && value.cwd.trim().length > 0;\n const hasRepo = typeof value.repoUrl === \"string\" && value.repoUrl.trim().length > 0;\n const hasRemoteRef = typeof value.remoteWorkspaceRef === \"string\" && value.remoteWorkspaceRef.trim().length > 0;\n\n if (sourceType === \"remote_managed\") {\n if (!hasRemoteRef && !hasRepo) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"Remote-managed workspace requires remoteWorkspaceRef or repoUrl.\",\n path: [\"remoteWorkspaceRef\"],\n });\n }\n return;\n }\n\n if (!hasCwd && !hasRepo) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"Workspace requires at least one of cwd or repoUrl.\",\n path: [\"cwd\"],\n });\n }\n}\n\nexport const createProjectWorkspaceSchema = z.object({\n ...projectWorkspaceFields,\n isPrimary: z.boolean().optional().default(false),\n}).superRefine(validateProjectWorkspace);\n\nexport type CreateProjectWorkspace = z.infer<typeof createProjectWorkspaceSchema>;\n\nexport const updateProjectWorkspaceSchema = z.object({\n ...projectWorkspaceFields,\n isPrimary: z.boolean().optional(),\n}).partial();\n\nexport type UpdateProjectWorkspace = z.infer<typeof updateProjectWorkspaceSchema>;\n\nconst projectFields = {\n /** @deprecated Use goalIds instead */\n goalId: z.string().uuid().optional().nullable(),\n goalIds: z.array(z.string().uuid()).optional(),\n name: z.string().min(1),\n description: z.string().optional().nullable(),\n status: z.enum(PROJECT_STATUSES).optional().default(\"backlog\"),\n leadAgentId: z.string().uuid().optional().nullable(),\n targetDate: z.string().optional().nullable(),\n color: z.string().optional().nullable(),\n executionWorkspacePolicy: projectExecutionWorkspacePolicySchema.optional().nullable(),\n archivedAt: z.string().datetime().optional().nullable(),\n};\n\nexport const createProjectSchema = z.object({\n ...projectFields,\n workspace: createProjectWorkspaceSchema.optional(),\n});\n\nexport type CreateProject = z.infer<typeof createProjectSchema>;\n\nexport const updateProjectSchema = z.object(projectFields).partial();\n\nexport type UpdateProject = z.infer<typeof updateProjectSchema>;\n\nexport type ProjectExecutionWorkspacePolicy = z.infer<typeof projectExecutionWorkspacePolicySchema>;\n", "import { z } from \"zod\";\n\nexport const issueWorkProductTypeSchema = z.enum([\n \"preview_url\",\n \"runtime_service\",\n \"pull_request\",\n \"branch\",\n \"commit\",\n \"artifact\",\n \"document\",\n]);\n\nexport const issueWorkProductStatusSchema = z.enum([\n \"active\",\n \"ready_for_review\",\n \"approved\",\n \"changes_requested\",\n \"merged\",\n \"closed\",\n \"failed\",\n \"archived\",\n \"draft\",\n]);\n\nexport const issueWorkProductReviewStateSchema = z.enum([\n \"none\",\n \"needs_board_review\",\n \"approved\",\n \"changes_requested\",\n]);\n\nexport const createIssueWorkProductSchema = z.object({\n projectId: z.string().uuid().optional().nullable(),\n executionWorkspaceId: z.string().uuid().optional().nullable(),\n runtimeServiceId: z.string().uuid().optional().nullable(),\n type: issueWorkProductTypeSchema,\n provider: z.string().min(1),\n externalId: z.string().optional().nullable(),\n title: z.string().min(1),\n url: z.string().url().optional().nullable(),\n status: issueWorkProductStatusSchema.default(\"active\"),\n reviewState: issueWorkProductReviewStateSchema.optional().default(\"none\"),\n isPrimary: z.boolean().optional().default(false),\n healthStatus: z.enum([\"unknown\", \"healthy\", \"unhealthy\"]).optional().default(\"unknown\"),\n summary: z.string().optional().nullable(),\n metadata: z.record(z.unknown()).optional().nullable(),\n createdByRunId: z.string().uuid().optional().nullable(),\n});\n\nexport type CreateIssueWorkProduct = z.infer<typeof createIssueWorkProductSchema>;\n\nexport const updateIssueWorkProductSchema = createIssueWorkProductSchema.partial();\n\nexport type UpdateIssueWorkProduct = z.infer<typeof updateIssueWorkProductSchema>;\n", "import { z } from \"zod\";\n\nexport const executionWorkspaceStatusSchema = z.enum([\n \"active\",\n \"idle\",\n \"in_review\",\n \"archived\",\n \"cleanup_failed\",\n]);\n\nexport const executionWorkspaceConfigSchema = z.object({\n provisionCommand: z.string().optional().nullable(),\n teardownCommand: z.string().optional().nullable(),\n cleanupCommand: z.string().optional().nullable(),\n workspaceRuntime: z.record(z.unknown()).optional().nullable(),\n desiredState: z.enum([\"running\", \"stopped\"]).optional().nullable(),\n}).strict();\n\nexport const executionWorkspaceCloseReadinessStateSchema = z.enum([\n \"ready\",\n \"ready_with_warnings\",\n \"blocked\",\n]);\n\nexport const executionWorkspaceCloseActionKindSchema = z.enum([\n \"archive_record\",\n \"stop_runtime_services\",\n \"cleanup_command\",\n \"teardown_command\",\n \"git_worktree_remove\",\n \"git_branch_delete\",\n \"remove_local_directory\",\n]);\n\nexport const executionWorkspaceCloseActionSchema = z.object({\n kind: executionWorkspaceCloseActionKindSchema,\n label: z.string(),\n description: z.string(),\n command: z.string().nullable(),\n}).strict();\n\nexport const executionWorkspaceCloseLinkedIssueSchema = z.object({\n id: z.string().uuid(),\n identifier: z.string().nullable(),\n title: z.string(),\n status: z.string(),\n isTerminal: z.boolean(),\n}).strict();\n\nexport const executionWorkspaceCloseGitReadinessSchema = z.object({\n repoRoot: z.string().nullable(),\n workspacePath: z.string().nullable(),\n branchName: z.string().nullable(),\n baseRef: z.string().nullable(),\n hasDirtyTrackedFiles: z.boolean(),\n hasUntrackedFiles: z.boolean(),\n dirtyEntryCount: z.number().int().nonnegative(),\n untrackedEntryCount: z.number().int().nonnegative(),\n aheadCount: z.number().int().nonnegative().nullable(),\n behindCount: z.number().int().nonnegative().nullable(),\n isMergedIntoBase: z.boolean().nullable(),\n createdByRuntime: z.boolean(),\n}).strict();\n\nexport const workspaceRuntimeServiceSchema = z.object({\n id: z.string(),\n companyId: z.string().uuid(),\n projectId: z.string().uuid().nullable(),\n projectWorkspaceId: z.string().uuid().nullable(),\n executionWorkspaceId: z.string().uuid().nullable(),\n issueId: z.string().uuid().nullable(),\n scopeType: z.enum([\"project_workspace\", \"execution_workspace\", \"run\", \"agent\"]),\n scopeId: z.string().nullable(),\n serviceName: z.string(),\n status: z.enum([\"starting\", \"running\", \"stopped\", \"failed\"]),\n lifecycle: z.enum([\"shared\", \"ephemeral\"]),\n reuseKey: z.string().nullable(),\n command: z.string().nullable(),\n cwd: z.string().nullable(),\n port: z.number().int().nullable(),\n url: z.string().nullable(),\n provider: z.enum([\"local_process\", \"adapter_managed\"]),\n providerRef: z.string().nullable(),\n ownerAgentId: z.string().uuid().nullable(),\n startedByRunId: z.string().uuid().nullable(),\n lastUsedAt: z.coerce.date(),\n startedAt: z.coerce.date(),\n stoppedAt: z.coerce.date().nullable(),\n stopPolicy: z.record(z.unknown()).nullable(),\n healthStatus: z.enum([\"unknown\", \"healthy\", \"unhealthy\"]),\n createdAt: z.coerce.date(),\n updatedAt: z.coerce.date(),\n}).strict();\n\nexport const executionWorkspaceCloseReadinessSchema = z.object({\n workspaceId: z.string().uuid(),\n state: executionWorkspaceCloseReadinessStateSchema,\n blockingReasons: z.array(z.string()),\n warnings: z.array(z.string()),\n linkedIssues: z.array(executionWorkspaceCloseLinkedIssueSchema),\n plannedActions: z.array(executionWorkspaceCloseActionSchema),\n isDestructiveCloseAllowed: z.boolean(),\n isSharedWorkspace: z.boolean(),\n isProjectPrimaryWorkspace: z.boolean(),\n git: executionWorkspaceCloseGitReadinessSchema.nullable(),\n runtimeServices: z.array(workspaceRuntimeServiceSchema),\n}).strict();\n\nexport const updateExecutionWorkspaceSchema = z.object({\n name: z.string().min(1).optional(),\n cwd: z.string().optional().nullable(),\n repoUrl: z.string().optional().nullable(),\n baseRef: z.string().optional().nullable(),\n branchName: z.string().optional().nullable(),\n providerRef: z.string().optional().nullable(),\n status: executionWorkspaceStatusSchema.optional(),\n cleanupEligibleAt: z.string().datetime().optional().nullable(),\n cleanupReason: z.string().optional().nullable(),\n config: executionWorkspaceConfigSchema.optional().nullable(),\n metadata: z.record(z.unknown()).optional().nullable(),\n}).strict();\n\nexport type UpdateExecutionWorkspace = z.infer<typeof updateExecutionWorkspaceSchema>;\n", "import { z } from \"zod\";\nimport { GOAL_LEVELS, GOAL_STATUSES } from \"../constants.js\";\n\nexport const createGoalSchema = z.object({\n title: z.string().min(1),\n description: z.string().optional().nullable(),\n level: z.enum(GOAL_LEVELS).optional().default(\"task\"),\n status: z.enum(GOAL_STATUSES).optional().default(\"planned\"),\n parentId: z.string().uuid().optional().nullable(),\n ownerAgentId: z.string().uuid().optional().nullable(),\n});\n\nexport type CreateGoal = z.infer<typeof createGoalSchema>;\n\nexport const updateGoalSchema = createGoalSchema.partial();\n\nexport type UpdateGoal = z.infer<typeof updateGoalSchema>;\n", "import { z } from \"zod\";\nimport { APPROVAL_TYPES } from \"../constants.js\";\n\nexport const createApprovalSchema = z.object({\n type: z.enum(APPROVAL_TYPES),\n requestedByAgentId: z.string().uuid().optional().nullable(),\n payload: z.record(z.unknown()),\n issueIds: z.array(z.string().uuid()).optional(),\n});\n\nexport type CreateApproval = z.infer<typeof createApprovalSchema>;\n\nexport const resolveApprovalSchema = z.object({\n decisionNote: z.string().optional().nullable(),\n decidedByUserId: z.string().optional().default(\"board\"),\n});\n\nexport type ResolveApproval = z.infer<typeof resolveApprovalSchema>;\n\nexport const requestApprovalRevisionSchema = z.object({\n decisionNote: z.string().optional().nullable(),\n decidedByUserId: z.string().optional().default(\"board\"),\n});\n\nexport type RequestApprovalRevision = z.infer<typeof requestApprovalRevisionSchema>;\n\nexport const resubmitApprovalSchema = z.object({\n payload: z.record(z.unknown()).optional(),\n});\n\nexport type ResubmitApproval = z.infer<typeof resubmitApprovalSchema>;\n\nexport const addApprovalCommentSchema = z.object({\n body: z.string().min(1),\n});\n\nexport type AddApprovalComment = z.infer<typeof addApprovalCommentSchema>;\n", "import { z } from \"zod\";\nimport { BILLING_TYPES } from \"../constants.js\";\n\nexport const createCostEventSchema = z.object({\n agentId: z.string().uuid(),\n issueId: z.string().uuid().optional().nullable(),\n projectId: z.string().uuid().optional().nullable(),\n goalId: z.string().uuid().optional().nullable(),\n heartbeatRunId: z.string().uuid().optional().nullable(),\n billingCode: z.string().optional().nullable(),\n provider: z.string().min(1),\n biller: z.string().min(1).optional(),\n billingType: z.enum(BILLING_TYPES).optional().default(\"unknown\"),\n model: z.string().min(1),\n inputTokens: z.number().int().nonnegative().optional().default(0),\n cachedInputTokens: z.number().int().nonnegative().optional().default(0),\n outputTokens: z.number().int().nonnegative().optional().default(0),\n costCents: z.number().int().nonnegative(),\n occurredAt: z.string().datetime(),\n}).transform((value) => ({\n ...value,\n biller: value.biller ?? value.provider,\n}));\n\nexport type CreateCostEvent = z.infer<typeof createCostEventSchema>;\n\nexport const updateBudgetSchema = z.object({\n budgetMonthlyCents: z.number().int().nonnegative(),\n});\n\nexport type UpdateBudget = z.infer<typeof updateBudgetSchema>;\n", "import { z } from \"zod\";\nimport { AGENT_ADAPTER_TYPES, FINANCE_DIRECTIONS, FINANCE_EVENT_KINDS, FINANCE_UNITS } from \"../constants.js\";\n\nexport const createFinanceEventSchema = z.object({\n agentId: z.string().uuid().optional().nullable(),\n issueId: z.string().uuid().optional().nullable(),\n projectId: z.string().uuid().optional().nullable(),\n goalId: z.string().uuid().optional().nullable(),\n heartbeatRunId: z.string().uuid().optional().nullable(),\n costEventId: z.string().uuid().optional().nullable(),\n billingCode: z.string().optional().nullable(),\n description: z.string().max(500).optional().nullable(),\n eventKind: z.enum(FINANCE_EVENT_KINDS),\n direction: z.enum(FINANCE_DIRECTIONS).optional().default(\"debit\"),\n biller: z.string().min(1),\n provider: z.string().min(1).optional().nullable(),\n executionAdapterType: z.enum(AGENT_ADAPTER_TYPES).optional().nullable(),\n pricingTier: z.string().min(1).optional().nullable(),\n region: z.string().min(1).optional().nullable(),\n model: z.string().min(1).optional().nullable(),\n quantity: z.number().int().nonnegative().optional().nullable(),\n unit: z.enum(FINANCE_UNITS).optional().nullable(),\n amountCents: z.number().int().nonnegative(),\n currency: z.string().length(3).optional().default(\"USD\"),\n estimated: z.boolean().optional().default(false),\n externalInvoiceId: z.string().optional().nullable(),\n metadataJson: z.record(z.string(), z.unknown()).optional().nullable(),\n occurredAt: z.string().datetime(),\n}).transform((value) => ({\n ...value,\n currency: value.currency.toUpperCase(),\n}));\n\nexport type CreateFinanceEvent = z.infer<typeof createFinanceEventSchema>;\n", "import { z } from \"zod\";\n\nexport const createAssetImageMetadataSchema = z.object({\n namespace: z\n .string()\n .trim()\n .min(1)\n .max(120)\n .regex(/^[a-zA-Z0-9/_-]+$/)\n .optional(),\n});\n\nexport type CreateAssetImageMetadata = z.infer<typeof createAssetImageMetadataSchema>;\n\n", "import { z } from \"zod\";\nimport {\n AGENT_ADAPTER_TYPES,\n INVITE_JOIN_TYPES,\n JOIN_REQUEST_STATUSES,\n JOIN_REQUEST_TYPES,\n PERMISSION_KEYS,\n} from \"../constants.js\";\n\nexport const createCompanyInviteSchema = z.object({\n allowedJoinTypes: z.enum(INVITE_JOIN_TYPES).default(\"both\"),\n defaultsPayload: z.record(z.string(), z.unknown()).optional().nullable(),\n agentMessage: z.string().max(4000).optional().nullable(),\n});\n\nexport type CreateCompanyInvite = z.infer<typeof createCompanyInviteSchema>;\n\nexport const createOpenClawInvitePromptSchema = z.object({\n agentMessage: z.string().max(4000).optional().nullable(),\n});\n\nexport type CreateOpenClawInvitePrompt = z.infer<\n typeof createOpenClawInvitePromptSchema\n>;\n\nexport const acceptInviteSchema = z.object({\n requestType: z.enum(JOIN_REQUEST_TYPES),\n agentName: z.string().min(1).max(120).optional(),\n adapterType: z.enum(AGENT_ADAPTER_TYPES).optional(),\n capabilities: z.string().max(4000).optional().nullable(),\n agentDefaultsPayload: z.record(z.string(), z.unknown()).optional().nullable(),\n // OpenClaw join compatibility fields accepted at top level.\n responsesWebhookUrl: z.string().max(4000).optional().nullable(),\n responsesWebhookMethod: z.string().max(32).optional().nullable(),\n responsesWebhookHeaders: z.record(z.string(), z.unknown()).optional().nullable(),\n paperclipApiUrl: z.string().max(4000).optional().nullable(),\n webhookAuthHeader: z.string().max(4000).optional().nullable(),\n});\n\nexport type AcceptInvite = z.infer<typeof acceptInviteSchema>;\n\nexport const listJoinRequestsQuerySchema = z.object({\n status: z.enum(JOIN_REQUEST_STATUSES).optional(),\n requestType: z.enum(JOIN_REQUEST_TYPES).optional(),\n});\n\nexport type ListJoinRequestsQuery = z.infer<typeof listJoinRequestsQuerySchema>;\n\nexport const claimJoinRequestApiKeySchema = z.object({\n claimSecret: z.string().min(16).max(256),\n});\n\nexport type ClaimJoinRequestApiKey = z.infer<typeof claimJoinRequestApiKeySchema>;\n\nexport const boardCliAuthAccessLevelSchema = z.enum([\n \"board\",\n \"instance_admin_required\",\n]);\n\nexport type BoardCliAuthAccessLevel = z.infer<typeof boardCliAuthAccessLevelSchema>;\n\nexport const createCliAuthChallengeSchema = z.object({\n command: z.string().min(1).max(240),\n clientName: z.string().max(120).optional().nullable(),\n requestedAccess: boardCliAuthAccessLevelSchema.default(\"board\"),\n requestedCompanyId: z.string().uuid().optional().nullable(),\n});\n\nexport type CreateCliAuthChallenge = z.infer<typeof createCliAuthChallengeSchema>;\n\nexport const resolveCliAuthChallengeSchema = z.object({\n token: z.string().min(16).max(256),\n});\n\nexport type ResolveCliAuthChallenge = z.infer<typeof resolveCliAuthChallengeSchema>;\n\nexport const updateMemberPermissionsSchema = z.object({\n grants: z.array(\n z.object({\n permissionKey: z.enum(PERMISSION_KEYS),\n scope: z.record(z.string(), z.unknown()).optional().nullable(),\n }),\n ),\n});\n\nexport type UpdateMemberPermissions = z.infer<typeof updateMemberPermissionsSchema>;\n\nexport const updateUserCompanyAccessSchema = z.object({\n companyIds: z.array(z.string().uuid()).default([]),\n});\n\nexport type UpdateUserCompanyAccess = z.infer<typeof updateUserCompanyAccessSchema>;\n", "import { z } from \"zod\";\nimport {\n PLUGIN_STATUSES,\n PLUGIN_CATEGORIES,\n PLUGIN_CAPABILITIES,\n PLUGIN_UI_SLOT_TYPES,\n PLUGIN_UI_SLOT_ENTITY_TYPES,\n PLUGIN_RESERVED_COMPANY_ROUTE_SEGMENTS,\n PLUGIN_LAUNCHER_PLACEMENT_ZONES,\n PLUGIN_LAUNCHER_ACTIONS,\n PLUGIN_LAUNCHER_BOUNDS,\n PLUGIN_LAUNCHER_RENDER_ENVIRONMENTS,\n PLUGIN_STATE_SCOPE_KINDS,\n} from \"../constants.js\";\n\n// ---------------------------------------------------------------------------\n// JSON Schema placeholder \u2013 a permissive validator for JSON Schema objects\n// ---------------------------------------------------------------------------\n\n/**\n * Permissive validator for JSON Schema objects. Accepts any `Record<string, unknown>`\n * that contains at least a `type`, `$ref`, or composition keyword (`oneOf`/`anyOf`/`allOf`).\n * Empty objects are also accepted.\n *\n * Used to validate `instanceConfigSchema` and `parametersSchema` fields in the\n * plugin manifest without fully parsing JSON Schema.\n *\n * @see PLUGIN_SPEC.md \u00A710.1 \u2014 Manifest shape\n */\nexport const jsonSchemaSchema = z.record(z.unknown()).refine(\n (val) => {\n // Must have a \"type\" field if non-empty, or be a valid JSON Schema object\n if (Object.keys(val).length === 0) return true;\n return typeof val.type === \"string\" || val.$ref !== undefined || val.oneOf !== undefined || val.anyOf !== undefined || val.allOf !== undefined;\n },\n { message: \"Must be a valid JSON Schema object (requires at least a 'type', '$ref', or composition keyword)\" },\n);\n\n// ---------------------------------------------------------------------------\n// Manifest sub-type schemas\n// ---------------------------------------------------------------------------\n\n/**\n * Validates a {@link PluginJobDeclaration} \u2014 a scheduled job declared in the\n * plugin manifest. Requires `jobKey` and `displayName`; `description` and\n * `schedule` (cron expression) are optional.\n *\n * @see PLUGIN_SPEC.md \u00A717 \u2014 Scheduled Jobs\n */\n/**\n * Validates a cron expression has exactly 5 whitespace-separated fields,\n * each containing only valid cron characters (digits, *, /, -, ,).\n *\n * Valid tokens per field: *, N, N-M, N/S, * /S, N-M/S, and comma-separated lists.\n */\nconst CRON_FIELD_PATTERN = /^(\\*(?:\\/[0-9]+)?|[0-9]+(?:-[0-9]+)?(?:\\/[0-9]+)?)(?:,(\\*(?:\\/[0-9]+)?|[0-9]+(?:-[0-9]+)?(?:\\/[0-9]+)?))*$/;\n\nfunction isValidCronExpression(expression: string): boolean {\n const trimmed = expression.trim();\n if (!trimmed) return false;\n const fields = trimmed.split(/\\s+/);\n if (fields.length !== 5) return false;\n return fields.every((f) => CRON_FIELD_PATTERN.test(f));\n}\n\nexport const pluginJobDeclarationSchema = z.object({\n jobKey: z.string().min(1),\n displayName: z.string().min(1),\n description: z.string().optional(),\n schedule: z.string().refine(\n (val) => isValidCronExpression(val),\n { message: \"schedule must be a valid 5-field cron expression (e.g. '*/15 * * * *')\" },\n ).optional(),\n});\n\nexport type PluginJobDeclarationInput = z.infer<typeof pluginJobDeclarationSchema>;\n\n/**\n * Validates a {@link PluginWebhookDeclaration} \u2014 a webhook endpoint declared\n * in the plugin manifest. Requires `endpointKey` and `displayName`.\n *\n * @see PLUGIN_SPEC.md \u00A718 \u2014 Webhooks\n */\nexport const pluginWebhookDeclarationSchema = z.object({\n endpointKey: z.string().min(1),\n displayName: z.string().min(1),\n description: z.string().optional(),\n});\n\nexport type PluginWebhookDeclarationInput = z.infer<typeof pluginWebhookDeclarationSchema>;\n\n/**\n * Validates a {@link PluginToolDeclaration} \u2014 an agent tool contributed by the\n * plugin. Requires `name`, `displayName`, `description`, and a valid\n * `parametersSchema`. Requires the `agent.tools.register` capability.\n *\n * @see PLUGIN_SPEC.md \u00A711 \u2014 Agent Tools\n */\nexport const pluginToolDeclarationSchema = z.object({\n name: z.string().min(1),\n displayName: z.string().min(1),\n description: z.string().min(1),\n parametersSchema: jsonSchemaSchema,\n});\n\nexport type PluginToolDeclarationInput = z.infer<typeof pluginToolDeclarationSchema>;\n\n/**\n * Validates a {@link PluginUiSlotDeclaration} \u2014 a UI extension slot the plugin\n * fills with a React component. Includes `superRefine` checks for slot-specific\n * requirements such as `entityTypes` for context-sensitive slots.\n *\n * @see PLUGIN_SPEC.md \u00A719 \u2014 UI Extension Model\n */\nexport const pluginUiSlotDeclarationSchema = z.object({\n type: z.enum(PLUGIN_UI_SLOT_TYPES),\n id: z.string().min(1),\n displayName: z.string().min(1),\n exportName: z.string().min(1),\n entityTypes: z.array(z.enum(PLUGIN_UI_SLOT_ENTITY_TYPES)).optional(),\n routePath: z.string().regex(/^[a-z0-9][a-z0-9-]*$/, {\n message: \"routePath must be a lowercase single-segment slug (letters, numbers, hyphens)\",\n }).optional(),\n order: z.number().int().optional(),\n}).superRefine((value, ctx) => {\n // context-sensitive slots require explicit entity targeting.\n const entityScopedTypes = [\"detailTab\", \"taskDetailView\", \"contextMenuItem\", \"commentAnnotation\", \"commentContextMenuItem\", \"projectSidebarItem\"];\n if (\n entityScopedTypes.includes(value.type)\n && (!value.entityTypes || value.entityTypes.length === 0)\n ) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `${value.type} slots require at least one entityType`,\n path: [\"entityTypes\"],\n });\n }\n // projectSidebarItem only makes sense for entityType \"project\".\n if (value.type === \"projectSidebarItem\" && value.entityTypes && !value.entityTypes.includes(\"project\")) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"projectSidebarItem slots require entityTypes to include \\\"project\\\"\",\n path: [\"entityTypes\"],\n });\n }\n // commentAnnotation only makes sense for entityType \"comment\".\n if (value.type === \"commentAnnotation\" && value.entityTypes && !value.entityTypes.includes(\"comment\")) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"commentAnnotation slots require entityTypes to include \\\"comment\\\"\",\n path: [\"entityTypes\"],\n });\n }\n // commentContextMenuItem only makes sense for entityType \"comment\".\n if (value.type === \"commentContextMenuItem\" && value.entityTypes && !value.entityTypes.includes(\"comment\")) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"commentContextMenuItem slots require entityTypes to include \\\"comment\\\"\",\n path: [\"entityTypes\"],\n });\n }\n if (value.routePath && value.type !== \"page\") {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"routePath is only supported for page slots\",\n path: [\"routePath\"],\n });\n }\n if (value.routePath && PLUGIN_RESERVED_COMPANY_ROUTE_SEGMENTS.includes(value.routePath as (typeof PLUGIN_RESERVED_COMPANY_ROUTE_SEGMENTS)[number])) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `routePath \"${value.routePath}\" is reserved by the host`,\n path: [\"routePath\"],\n });\n }\n});\n\nexport type PluginUiSlotDeclarationInput = z.infer<typeof pluginUiSlotDeclarationSchema>;\n\nconst entityScopedLauncherPlacementZones = [\n \"detailTab\",\n \"taskDetailView\",\n \"contextMenuItem\",\n \"commentAnnotation\",\n \"commentContextMenuItem\",\n \"projectSidebarItem\",\n] as const;\n\nconst launcherBoundsByEnvironment: Record<\n (typeof PLUGIN_LAUNCHER_RENDER_ENVIRONMENTS)[number],\n readonly (typeof PLUGIN_LAUNCHER_BOUNDS)[number][]\n> = {\n hostInline: [\"inline\", \"compact\", \"default\"],\n hostOverlay: [\"compact\", \"default\", \"wide\", \"full\"],\n hostRoute: [\"default\", \"wide\", \"full\"],\n external: [],\n iframe: [\"compact\", \"default\", \"wide\", \"full\"],\n};\n\n/**\n * Validates the action payload for a declarative plugin launcher.\n */\nexport const pluginLauncherActionDeclarationSchema = z.object({\n type: z.enum(PLUGIN_LAUNCHER_ACTIONS),\n target: z.string().min(1),\n params: z.record(z.unknown()).optional(),\n}).superRefine((value, ctx) => {\n if (value.type === \"performAction\" && value.target.includes(\"/\")) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"performAction launchers must target an action key, not a route or URL\",\n path: [\"target\"],\n });\n }\n\n if (value.type === \"navigate\" && /^https?:\\/\\//.test(value.target)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"navigate launchers must target a host route, not an absolute URL\",\n path: [\"target\"],\n });\n }\n});\n\nexport type PluginLauncherActionDeclarationInput =\n z.infer<typeof pluginLauncherActionDeclarationSchema>;\n\n/**\n * Validates optional render hints for a plugin launcher destination.\n */\nexport const pluginLauncherRenderDeclarationSchema = z.object({\n environment: z.enum(PLUGIN_LAUNCHER_RENDER_ENVIRONMENTS),\n bounds: z.enum(PLUGIN_LAUNCHER_BOUNDS).optional(),\n}).superRefine((value, ctx) => {\n if (!value.bounds) {\n return;\n }\n\n const supportedBounds = launcherBoundsByEnvironment[value.environment];\n if (!supportedBounds.includes(value.bounds)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `bounds \"${value.bounds}\" is not supported for render environment \"${value.environment}\"`,\n path: [\"bounds\"],\n });\n }\n});\n\nexport type PluginLauncherRenderDeclarationInput =\n z.infer<typeof pluginLauncherRenderDeclarationSchema>;\n\n/**\n * Validates declarative launcher metadata in a plugin manifest.\n */\nexport const pluginLauncherDeclarationSchema = z.object({\n id: z.string().min(1),\n displayName: z.string().min(1),\n description: z.string().optional(),\n placementZone: z.enum(PLUGIN_LAUNCHER_PLACEMENT_ZONES),\n exportName: z.string().min(1).optional(),\n entityTypes: z.array(z.enum(PLUGIN_UI_SLOT_ENTITY_TYPES)).optional(),\n order: z.number().int().optional(),\n action: pluginLauncherActionDeclarationSchema,\n render: pluginLauncherRenderDeclarationSchema.optional(),\n}).superRefine((value, ctx) => {\n if (\n entityScopedLauncherPlacementZones.some((zone) => zone === value.placementZone)\n && (!value.entityTypes || value.entityTypes.length === 0)\n ) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `${value.placementZone} launchers require at least one entityType`,\n path: [\"entityTypes\"],\n });\n }\n\n if (\n value.placementZone === \"projectSidebarItem\"\n && value.entityTypes\n && !value.entityTypes.includes(\"project\")\n ) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"projectSidebarItem launchers require entityTypes to include \\\"project\\\"\",\n path: [\"entityTypes\"],\n });\n }\n\n if (value.action.type === \"performAction\" && value.render) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"performAction launchers cannot declare render hints\",\n path: [\"render\"],\n });\n }\n\n if (\n [\"openModal\", \"openDrawer\", \"openPopover\"].includes(value.action.type)\n && !value.render\n ) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `${value.action.type} launchers require render metadata`,\n path: [\"render\"],\n });\n }\n\n if (value.action.type === \"openModal\" && value.render?.environment === \"hostInline\") {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"openModal launchers cannot use the hostInline render environment\",\n path: [\"render\", \"environment\"],\n });\n }\n\n if (\n value.action.type === \"openDrawer\"\n && value.render\n && ![\"hostOverlay\", \"iframe\"].includes(value.render.environment)\n ) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"openDrawer launchers must use hostOverlay or iframe render environments\",\n path: [\"render\", \"environment\"],\n });\n }\n\n if (value.action.type === \"openPopover\" && value.render?.environment === \"hostRoute\") {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"openPopover launchers cannot use the hostRoute render environment\",\n path: [\"render\", \"environment\"],\n });\n }\n});\n\nexport type PluginLauncherDeclarationInput = z.infer<typeof pluginLauncherDeclarationSchema>;\n\n// ---------------------------------------------------------------------------\n// Plugin Manifest V1 schema\n// ---------------------------------------------------------------------------\n\n/**\n * Zod schema for {@link PaperclipPluginManifestV1} \u2014 the complete runtime\n * validator for plugin manifests read at install time.\n *\n * Field-level constraints (see PLUGIN_SPEC.md \u00A710.1 for the normative rules):\n *\n * | Field | Type | Constraints |\n * |--------------------------|------------|----------------------------------------------|\n * | `id` | string | `^[a-z0-9][a-z0-9._-]*$` |\n * | `apiVersion` | literal 1 | must equal `PLUGIN_API_VERSION` |\n * | `version` | string | semver (`\\d+\\.\\d+\\.\\d+`) |\n * | `displayName` | string | 1\u2013100 chars |\n * | `description` | string | 1\u2013500 chars |\n * | `author` | string | 1\u2013200 chars |\n * | `categories` | enum[] | at least one; values from PLUGIN_CATEGORIES |\n * | `minimumHostVersion` | string? | semver lower bound if present, no leading `v`|\n * | `minimumPaperclipVersion`| string? | legacy alias of `minimumHostVersion` |\n * | `capabilities` | enum[] | at least one; values from PLUGIN_CAPABILITIES|\n * | `entrypoints.worker` | string | min 1 char |\n * | `entrypoints.ui` | string? | required when `ui.slots` is declared |\n *\n * Cross-field rules enforced via `superRefine`:\n * - `entrypoints.ui` required when `ui.slots` declared\n * - `agent.tools.register` capability required when `tools` declared\n * - `jobs.schedule` capability required when `jobs` declared\n * - `webhooks.receive` capability required when `webhooks` declared\n * - duplicate `jobs[].jobKey` values are rejected\n * - duplicate `webhooks[].endpointKey` values are rejected\n * - duplicate `tools[].name` values are rejected\n * - duplicate `ui.slots[].id` values are rejected\n *\n * @see PLUGIN_SPEC.md \u00A710.1 \u2014 Manifest shape\n * @see {@link PaperclipPluginManifestV1} \u2014 the inferred TypeScript type\n */\nexport const pluginManifestV1Schema = z.object({\n id: z.string().min(1).regex(\n /^[a-z0-9][a-z0-9._-]*$/,\n \"Plugin id must start with a lowercase alphanumeric and contain only lowercase letters, digits, dots, hyphens, or underscores\",\n ),\n apiVersion: z.literal(1),\n version: z.string().min(1).regex(\n /^\\d+\\.\\d+\\.\\d+(-[0-9A-Za-z-]+(\\.[0-9A-Za-z-]+)*)?(\\+[0-9A-Za-z-]+(\\.[0-9A-Za-z-]+)*)?$/,\n \"Version must follow semver (e.g. 1.0.0 or 1.0.0-beta.1)\",\n ),\n displayName: z.string().min(1).max(100),\n description: z.string().min(1).max(500),\n author: z.string().min(1).max(200),\n categories: z.array(z.enum(PLUGIN_CATEGORIES)).min(1),\n minimumHostVersion: z.string().regex(\n /^\\d+\\.\\d+\\.\\d+(-[0-9A-Za-z-]+(\\.[0-9A-Za-z-]+)*)?(\\+[0-9A-Za-z-]+(\\.[0-9A-Za-z-]+)*)?$/,\n \"minimumHostVersion must follow semver (e.g. 1.0.0)\",\n ).optional(),\n minimumPaperclipVersion: z.string().regex(\n /^\\d+\\.\\d+\\.\\d+(-[0-9A-Za-z-]+(\\.[0-9A-Za-z-]+)*)?(\\+[0-9A-Za-z-]+(\\.[0-9A-Za-z-]+)*)?$/,\n \"minimumPaperclipVersion must follow semver (e.g. 1.0.0)\",\n ).optional(),\n capabilities: z.array(z.enum(PLUGIN_CAPABILITIES)).min(1),\n entrypoints: z.object({\n worker: z.string().min(1),\n ui: z.string().min(1).optional(),\n }),\n instanceConfigSchema: jsonSchemaSchema.optional(),\n jobs: z.array(pluginJobDeclarationSchema).optional(),\n webhooks: z.array(pluginWebhookDeclarationSchema).optional(),\n tools: z.array(pluginToolDeclarationSchema).optional(),\n launchers: z.array(pluginLauncherDeclarationSchema).optional(),\n ui: z.object({\n slots: z.array(pluginUiSlotDeclarationSchema).min(1).optional(),\n launchers: z.array(pluginLauncherDeclarationSchema).optional(),\n }).optional(),\n}).superRefine((manifest, ctx) => {\n // \u2500\u2500 Entrypoint \u2194 UI slot consistency \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // Plugins that declare UI slots must also declare a UI entrypoint so the\n // host knows where to load the bundle from (PLUGIN_SPEC.md \u00A710.1).\n const hasUiSlots = (manifest.ui?.slots?.length ?? 0) > 0;\n const hasUiLaunchers = (manifest.ui?.launchers?.length ?? 0) > 0;\n if ((hasUiSlots || hasUiLaunchers) && !manifest.entrypoints.ui) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"entrypoints.ui is required when ui.slots or ui.launchers are declared\",\n path: [\"entrypoints\", \"ui\"],\n });\n }\n\n if (\n manifest.minimumHostVersion\n && manifest.minimumPaperclipVersion\n && manifest.minimumHostVersion !== manifest.minimumPaperclipVersion\n ) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"minimumHostVersion and minimumPaperclipVersion must match when both are declared\",\n path: [\"minimumHostVersion\"],\n });\n }\n\n // \u2500\u2500 Capability \u2194 feature declaration consistency \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // The host enforces capabilities at install and runtime. A plugin must\n // declare every capability it needs up-front; silently having more features\n // than capabilities would cause runtime rejections.\n\n // tools require agent.tools.register (PLUGIN_SPEC.md \u00A711)\n if (manifest.tools && manifest.tools.length > 0) {\n if (!manifest.capabilities.includes(\"agent.tools.register\")) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"Capability 'agent.tools.register' is required when tools are declared\",\n path: [\"capabilities\"],\n });\n }\n }\n\n // jobs require jobs.schedule (PLUGIN_SPEC.md \u00A717)\n if (manifest.jobs && manifest.jobs.length > 0) {\n if (!manifest.capabilities.includes(\"jobs.schedule\")) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"Capability 'jobs.schedule' is required when jobs are declared\",\n path: [\"capabilities\"],\n });\n }\n }\n\n // webhooks require webhooks.receive (PLUGIN_SPEC.md \u00A718)\n if (manifest.webhooks && manifest.webhooks.length > 0) {\n if (!manifest.capabilities.includes(\"webhooks.receive\")) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"Capability 'webhooks.receive' is required when webhooks are declared\",\n path: [\"capabilities\"],\n });\n }\n }\n\n // \u2500\u2500 Uniqueness checks \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // Duplicate keys within a plugin's own manifest are always a bug. The host\n // would not know which declaration takes precedence, so we reject early.\n\n // job keys must be unique within the plugin (used as identifiers in the DB)\n if (manifest.jobs) {\n const jobKeys = manifest.jobs.map((j) => j.jobKey);\n const duplicates = jobKeys.filter((key, i) => jobKeys.indexOf(key) !== i);\n if (duplicates.length > 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Duplicate job keys: ${[...new Set(duplicates)].join(\", \")}`,\n path: [\"jobs\"],\n });\n }\n }\n\n // webhook endpoint keys must be unique within the plugin (used in routes)\n if (manifest.webhooks) {\n const endpointKeys = manifest.webhooks.map((w) => w.endpointKey);\n const duplicates = endpointKeys.filter((key, i) => endpointKeys.indexOf(key) !== i);\n if (duplicates.length > 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Duplicate webhook endpoint keys: ${[...new Set(duplicates)].join(\", \")}`,\n path: [\"webhooks\"],\n });\n }\n }\n\n // tool names must be unique within the plugin (namespaced at runtime)\n if (manifest.tools) {\n const toolNames = manifest.tools.map((t) => t.name);\n const duplicates = toolNames.filter((name, i) => toolNames.indexOf(name) !== i);\n if (duplicates.length > 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Duplicate tool names: ${[...new Set(duplicates)].join(\", \")}`,\n path: [\"tools\"],\n });\n }\n }\n\n // UI slot ids must be unique within the plugin (namespaced at runtime)\n if (manifest.ui) {\n if (manifest.ui.slots) {\n const slotIds = manifest.ui.slots.map((s) => s.id);\n const duplicates = slotIds.filter((id, i) => slotIds.indexOf(id) !== i);\n if (duplicates.length > 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Duplicate UI slot ids: ${[...new Set(duplicates)].join(\", \")}`,\n path: [\"ui\", \"slots\"],\n });\n }\n }\n }\n\n // launcher ids must be unique within the plugin\n const allLaunchers = [\n ...(manifest.launchers ?? []),\n ...(manifest.ui?.launchers ?? []),\n ];\n if (allLaunchers.length > 0) {\n const launcherIds = allLaunchers.map((launcher) => launcher.id);\n const duplicates = launcherIds.filter((id, i) => launcherIds.indexOf(id) !== i);\n if (duplicates.length > 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Duplicate launcher ids: ${[...new Set(duplicates)].join(\", \")}`,\n path: manifest.ui?.launchers ? [\"ui\", \"launchers\"] : [\"launchers\"],\n });\n }\n }\n});\n\nexport type PluginManifestV1Input = z.infer<typeof pluginManifestV1Schema>;\n\n// ---------------------------------------------------------------------------\n// Plugin installation / registration request\n// ---------------------------------------------------------------------------\n\n/**\n * Schema for installing (registering) a plugin.\n * The server receives the packageName and resolves the manifest from the\n * installed package.\n */\nexport const installPluginSchema = z.object({\n packageName: z.string().min(1),\n version: z.string().min(1).optional(),\n /** Set by loader for local-path installs so the worker can be resolved. */\n packagePath: z.string().min(1).optional(),\n});\n\nexport type InstallPlugin = z.infer<typeof installPluginSchema>;\n\n// ---------------------------------------------------------------------------\n// Plugin config (instance configuration) schemas\n// ---------------------------------------------------------------------------\n\n/**\n * Schema for creating or updating a plugin's instance configuration.\n * configJson is validated permissively here; runtime validation against\n * the plugin's instanceConfigSchema is done at the service layer.\n */\nexport const upsertPluginConfigSchema = z.object({\n configJson: z.record(z.unknown()),\n});\n\nexport type UpsertPluginConfig = z.infer<typeof upsertPluginConfigSchema>;\n\n/**\n * Schema for partially updating a plugin's instance configuration.\n * Allows a partial merge of config values.\n */\nexport const patchPluginConfigSchema = z.object({\n configJson: z.record(z.unknown()),\n});\n\nexport type PatchPluginConfig = z.infer<typeof patchPluginConfigSchema>;\n\n// ---------------------------------------------------------------------------\n// Plugin status update\n// ---------------------------------------------------------------------------\n\n/**\n * Schema for updating a plugin's lifecycle status. Used by the lifecycle\n * manager to persist state transitions.\n *\n * @see {@link PLUGIN_STATUSES} for the valid status values\n */\nexport const updatePluginStatusSchema = z.object({\n status: z.enum(PLUGIN_STATUSES),\n lastError: z.string().nullable().optional(),\n});\n\nexport type UpdatePluginStatus = z.infer<typeof updatePluginStatusSchema>;\n\n// ---------------------------------------------------------------------------\n// Plugin uninstall\n// ---------------------------------------------------------------------------\n\n/** Schema for the uninstall request. `removeData` controls hard vs soft delete. */\nexport const uninstallPluginSchema = z.object({\n removeData: z.boolean().optional().default(false),\n});\n\nexport type UninstallPlugin = z.infer<typeof uninstallPluginSchema>;\n\n// ---------------------------------------------------------------------------\n// Plugin state (key-value storage) schemas\n// ---------------------------------------------------------------------------\n\n/**\n * Schema for a plugin state scope key \u2014 identifies the exact location where\n * state is stored. Used by the `ctx.state.get()`, `ctx.state.set()`, and\n * `ctx.state.delete()` SDK methods.\n *\n * @see PLUGIN_SPEC.md \u00A721.3 `plugin_state`\n */\nexport const pluginStateScopeKeySchema = z.object({\n scopeKind: z.enum(PLUGIN_STATE_SCOPE_KINDS),\n scopeId: z.string().min(1).optional(),\n namespace: z.string().min(1).optional(),\n stateKey: z.string().min(1),\n});\n\nexport type PluginStateScopeKey = z.infer<typeof pluginStateScopeKeySchema>;\n\n/**\n * Schema for setting a plugin state value.\n */\nexport const setPluginStateSchema = z.object({\n scopeKind: z.enum(PLUGIN_STATE_SCOPE_KINDS),\n scopeId: z.string().min(1).optional(),\n namespace: z.string().min(1).optional(),\n stateKey: z.string().min(1),\n /** JSON-serializable value to store. */\n value: z.unknown(),\n});\n\nexport type SetPluginState = z.infer<typeof setPluginStateSchema>;\n\n/**\n * Schema for querying plugin state entries. All fields are optional to allow\n * flexible list queries (e.g. all state for a plugin within a scope).\n */\nexport const listPluginStateSchema = z.object({\n scopeKind: z.enum(PLUGIN_STATE_SCOPE_KINDS).optional(),\n scopeId: z.string().min(1).optional(),\n namespace: z.string().min(1).optional(),\n});\n\nexport type ListPluginState = z.infer<typeof listPluginStateSchema>;\n", "export {\n instanceGeneralSettingsSchema,\n patchInstanceGeneralSettingsSchema,\n type InstanceGeneralSettings,\n type PatchInstanceGeneralSettings,\n instanceExperimentalSettingsSchema,\n patchInstanceExperimentalSettingsSchema,\n type InstanceExperimentalSettings,\n type PatchInstanceExperimentalSettings,\n} from \"./instance.js\";\n\nexport {\n upsertBudgetPolicySchema,\n resolveBudgetIncidentSchema,\n type UpsertBudgetPolicy,\n type ResolveBudgetIncident,\n} from \"./budget.js\";\n\nexport {\n createCompanySchema,\n updateCompanySchema,\n updateCompanyBrandingSchema,\n type CreateCompany,\n type UpdateCompany,\n type UpdateCompanyBranding,\n} from \"./company.js\";\nexport {\n feedbackDataSharingPreferenceSchema,\n feedbackTargetTypeSchema,\n feedbackTraceStatusSchema,\n feedbackVoteValueSchema,\n upsertIssueFeedbackVoteSchema,\n type UpsertIssueFeedbackVote,\n} from \"./feedback.js\";\nexport {\n companySkillSourceTypeSchema,\n companySkillTrustLevelSchema,\n companySkillCompatibilitySchema,\n companySkillSourceBadgeSchema,\n companySkillFileInventoryEntrySchema,\n companySkillSchema,\n companySkillListItemSchema,\n companySkillUsageAgentSchema,\n companySkillDetailSchema,\n companySkillUpdateStatusSchema,\n companySkillImportSchema,\n companySkillProjectScanRequestSchema,\n companySkillProjectScanSkippedSchema,\n companySkillProjectScanConflictSchema,\n companySkillProjectScanResultSchema,\n companySkillCreateSchema,\n companySkillFileDetailSchema,\n companySkillFileUpdateSchema,\n type CompanySkillImport,\n type CompanySkillProjectScan,\n type CompanySkillCreate,\n type CompanySkillFileUpdate,\n} from \"./company-skill.js\";\nexport {\n agentSkillStateSchema,\n agentSkillSyncModeSchema,\n agentSkillEntrySchema,\n agentSkillSnapshotSchema,\n agentSkillSyncSchema,\n type AgentSkillSync,\n} from \"./adapter-skills.js\";\nexport {\n portabilityIncludeSchema,\n portabilityEnvInputSchema,\n portabilityCompanyManifestEntrySchema,\n portabilitySidebarOrderSchema,\n portabilityAgentManifestEntrySchema,\n portabilitySkillManifestEntrySchema,\n portabilityManifestSchema,\n portabilitySourceSchema,\n portabilityTargetSchema,\n portabilityAgentSelectionSchema,\n portabilityCollisionStrategySchema,\n companyPortabilityExportSchema,\n companyPortabilityPreviewSchema,\n companyPortabilityImportSchema,\n type CompanyPortabilityExport,\n type CompanyPortabilityPreview,\n type CompanyPortabilityImport,\n} from \"./company-portability.js\";\n\nexport {\n createAgentSchema,\n createAgentHireSchema,\n updateAgentSchema,\n agentInstructionsBundleModeSchema,\n updateAgentInstructionsBundleSchema,\n upsertAgentInstructionsFileSchema,\n updateAgentInstructionsPathSchema,\n createAgentKeySchema,\n agentMineInboxQuerySchema,\n wakeAgentSchema,\n resetAgentSessionSchema,\n testAdapterEnvironmentSchema,\n agentPermissionsSchema,\n updateAgentPermissionsSchema,\n type CreateAgent,\n type CreateAgentHire,\n type UpdateAgent,\n type UpdateAgentInstructionsBundle,\n type UpsertAgentInstructionsFile,\n type UpdateAgentInstructionsPath,\n type CreateAgentKey,\n type AgentMineInboxQuery,\n type WakeAgent,\n type ResetAgentSession,\n type TestAdapterEnvironment,\n type UpdateAgentPermissions,\n} from \"./agent.js\";\n\nexport {\n createProjectSchema,\n updateProjectSchema,\n createProjectWorkspaceSchema,\n updateProjectWorkspaceSchema,\n projectExecutionWorkspacePolicySchema,\n projectWorkspaceRuntimeConfigSchema,\n type CreateProject,\n type UpdateProject,\n type CreateProjectWorkspace,\n type UpdateProjectWorkspace,\n type ProjectExecutionWorkspacePolicy,\n} from \"./project.js\";\n\nexport {\n createIssueSchema,\n createIssueLabelSchema,\n updateIssueSchema,\n issueExecutionWorkspaceSettingsSchema,\n checkoutIssueSchema,\n addIssueCommentSchema,\n linkIssueApprovalSchema,\n createIssueAttachmentMetadataSchema,\n issueDocumentFormatSchema,\n issueDocumentKeySchema,\n upsertIssueDocumentSchema,\n restoreIssueDocumentRevisionSchema,\n type CreateIssue,\n type CreateIssueLabel,\n type UpdateIssue,\n type IssueExecutionWorkspaceSettings,\n type CheckoutIssue,\n type AddIssueComment,\n type LinkIssueApproval,\n type CreateIssueAttachmentMetadata,\n type IssueDocumentFormat,\n type UpsertIssueDocument,\n type RestoreIssueDocumentRevision,\n} from \"./issue.js\";\n\nexport {\n createIssueWorkProductSchema,\n updateIssueWorkProductSchema,\n issueWorkProductTypeSchema,\n issueWorkProductStatusSchema,\n issueWorkProductReviewStateSchema,\n type CreateIssueWorkProduct,\n type UpdateIssueWorkProduct,\n} from \"./work-product.js\";\n\nexport {\n executionWorkspaceConfigSchema,\n updateExecutionWorkspaceSchema,\n executionWorkspaceStatusSchema,\n executionWorkspaceCloseActionKindSchema,\n executionWorkspaceCloseActionSchema,\n executionWorkspaceCloseGitReadinessSchema,\n executionWorkspaceCloseLinkedIssueSchema,\n executionWorkspaceCloseReadinessSchema,\n executionWorkspaceCloseReadinessStateSchema,\n type UpdateExecutionWorkspace,\n} from \"./execution-workspace.js\";\n\nexport {\n createGoalSchema,\n updateGoalSchema,\n type CreateGoal,\n type UpdateGoal,\n} from \"./goal.js\";\n\nexport {\n createApprovalSchema,\n resolveApprovalSchema,\n requestApprovalRevisionSchema,\n resubmitApprovalSchema,\n addApprovalCommentSchema,\n type CreateApproval,\n type ResolveApproval,\n type RequestApprovalRevision,\n type ResubmitApproval,\n type AddApprovalComment,\n} from \"./approval.js\";\n\nexport {\n envBindingPlainSchema,\n envBindingSecretRefSchema,\n envBindingSchema,\n envConfigSchema,\n createSecretSchema,\n rotateSecretSchema,\n updateSecretSchema,\n type CreateSecret,\n type RotateSecret,\n type UpdateSecret,\n} from \"./secret.js\";\n\nexport {\n createRoutineSchema,\n updateRoutineSchema,\n createRoutineTriggerSchema,\n updateRoutineTriggerSchema,\n routineVariableSchema,\n runRoutineSchema,\n rotateRoutineTriggerSecretSchema,\n type CreateRoutine,\n type UpdateRoutine,\n type CreateRoutineTrigger,\n type UpdateRoutineTrigger,\n type RunRoutine,\n type RotateRoutineTriggerSecret,\n} from \"./routine.js\";\n\nexport {\n createCostEventSchema,\n updateBudgetSchema,\n type CreateCostEvent,\n type UpdateBudget,\n} from \"./cost.js\";\n\nexport {\n createFinanceEventSchema,\n type CreateFinanceEvent,\n} from \"./finance.js\";\n\nexport {\n createAssetImageMetadataSchema,\n type CreateAssetImageMetadata,\n} from \"./asset.js\";\n\nexport {\n createCompanyInviteSchema,\n createOpenClawInvitePromptSchema,\n acceptInviteSchema,\n listJoinRequestsQuerySchema,\n claimJoinRequestApiKeySchema,\n boardCliAuthAccessLevelSchema,\n createCliAuthChallengeSchema,\n resolveCliAuthChallengeSchema,\n updateMemberPermissionsSchema,\n updateUserCompanyAccessSchema,\n type CreateCompanyInvite,\n type CreateOpenClawInvitePrompt,\n type AcceptInvite,\n type ListJoinRequestsQuery,\n type ClaimJoinRequestApiKey,\n type BoardCliAuthAccessLevel,\n type CreateCliAuthChallenge,\n type ResolveCliAuthChallenge,\n type UpdateMemberPermissions,\n type UpdateUserCompanyAccess,\n} from \"./access.js\";\n\nexport {\n jsonSchemaSchema,\n pluginJobDeclarationSchema,\n pluginWebhookDeclarationSchema,\n pluginToolDeclarationSchema,\n pluginUiSlotDeclarationSchema,\n pluginLauncherActionDeclarationSchema,\n pluginLauncherRenderDeclarationSchema,\n pluginLauncherDeclarationSchema,\n pluginManifestV1Schema,\n installPluginSchema,\n upsertPluginConfigSchema,\n patchPluginConfigSchema,\n updatePluginStatusSchema,\n uninstallPluginSchema,\n pluginStateScopeKeySchema,\n setPluginStateSchema,\n listPluginStateSchema,\n type PluginJobDeclarationInput,\n type PluginWebhookDeclarationInput,\n type PluginToolDeclarationInput,\n type PluginUiSlotDeclarationInput,\n type PluginLauncherActionDeclarationInput,\n type PluginLauncherRenderDeclarationInput,\n type PluginLauncherDeclarationInput,\n type PluginManifestV1Input,\n type InstallPlugin,\n type UpsertPluginConfig,\n type PatchPluginConfig,\n type UpdatePluginStatus,\n type UninstallPlugin,\n type PluginStateScopeKey,\n type SetPluginState,\n type ListPluginState,\n} from \"./plugin.js\";\n", "export const API_PREFIX = \"/api\";\n\nexport const API = {\n health: `${API_PREFIX}/health`,\n companies: `${API_PREFIX}/companies`,\n agents: `${API_PREFIX}/agents`,\n projects: `${API_PREFIX}/projects`,\n issues: `${API_PREFIX}/issues`,\n goals: `${API_PREFIX}/goals`,\n approvals: `${API_PREFIX}/approvals`,\n secrets: `${API_PREFIX}/secrets`,\n costs: `${API_PREFIX}/costs`,\n activity: `${API_PREFIX}/activity`,\n dashboard: `${API_PREFIX}/dashboard`,\n sidebarBadges: `${API_PREFIX}/sidebar-badges`,\n invites: `${API_PREFIX}/invites`,\n joinRequests: `${API_PREFIX}/join-requests`,\n members: `${API_PREFIX}/members`,\n admin: `${API_PREFIX}/admin`,\n} as const;\n", "const AGENT_URL_KEY_DELIM_RE = /[^a-z0-9]+/g;\nconst AGENT_URL_KEY_TRIM_RE = /^-+|-+$/g;\nconst UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n\nexport function isUuidLike(value: string | null | undefined): boolean {\n if (typeof value !== \"string\") return false;\n return UUID_RE.test(value.trim());\n}\n\nexport function normalizeAgentUrlKey(value: string | null | undefined): string | null {\n if (typeof value !== \"string\") return null;\n const normalized = value\n .trim()\n .toLowerCase()\n .replace(AGENT_URL_KEY_DELIM_RE, \"-\")\n .replace(AGENT_URL_KEY_TRIM_RE, \"\");\n return normalized.length > 0 ? normalized : null;\n}\n\nexport function deriveAgentUrlKey(name: string | null | undefined, fallback?: string | null): string {\n return normalizeAgentUrlKey(name) ?? normalizeAgentUrlKey(fallback) ?? \"agent\";\n}\n", "const PROJECT_URL_KEY_DELIM_RE = /[^a-z0-9]+/g;\nconst PROJECT_URL_KEY_TRIM_RE = /^-+|-+$/g;\nconst NON_ASCII_RE = /[^\\x00-\\x7F]/;\nconst UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n\nexport function normalizeProjectUrlKey(value: string | null | undefined): string | null {\n if (typeof value !== \"string\") return null;\n const normalized = value\n .trim()\n .toLowerCase()\n .replace(PROJECT_URL_KEY_DELIM_RE, \"-\")\n .replace(PROJECT_URL_KEY_TRIM_RE, \"\");\n return normalized.length > 0 ? normalized : null;\n}\n\n/** Check whether a string contains non-ASCII characters that normalization would strip. */\nexport function hasNonAsciiContent(value: string | null | undefined): boolean {\n if (typeof value !== \"string\") return false;\n return NON_ASCII_RE.test(value);\n}\n\n/** Extract the first 8 hex chars from a valid UUID, or null. */\nfunction shortIdFromUuid(value: string | null | undefined): string | null {\n if (typeof value !== \"string\" || !UUID_RE.test(value.trim())) return null;\n return value.trim().replace(/-/g, \"\").slice(0, 8).toLowerCase();\n}\n\nexport function deriveProjectUrlKey(name: string | null | undefined, fallback?: string | null): string {\n const base = normalizeProjectUrlKey(name);\n if (base && !hasNonAsciiContent(name)) return base;\n // Non-ASCII content was stripped \u2014 append short UUID suffix for uniqueness.\n const shortId = shortIdFromUuid(fallback);\n if (base && shortId) return `${base}-${shortId}`;\n if (shortId) return shortId;\n return base ?? normalizeProjectUrlKey(fallback) ?? \"project\";\n}\n", "export const PROJECT_MENTION_SCHEME = \"project://\";\nexport const AGENT_MENTION_SCHEME = \"agent://\";\n\nconst HEX_COLOR_RE = /^[0-9a-f]{6}$/i;\nconst HEX_COLOR_SHORT_RE = /^[0-9a-f]{3}$/i;\nconst HEX_COLOR_WITH_HASH_RE = /^#[0-9a-f]{6}$/i;\nconst HEX_COLOR_SHORT_WITH_HASH_RE = /^#[0-9a-f]{3}$/i;\nconst PROJECT_MENTION_LINK_RE = /\\[[^\\]]*]\\((project:\\/\\/[^)\\s]+)\\)/gi;\nconst AGENT_MENTION_LINK_RE = /\\[[^\\]]*]\\((agent:\\/\\/[^)\\s]+)\\)/gi;\nconst AGENT_ICON_NAME_RE = /^[a-z0-9-]+$/i;\n\nexport interface ParsedProjectMention {\n projectId: string;\n color: string | null;\n}\n\nexport interface ParsedAgentMention {\n agentId: string;\n icon: string | null;\n}\n\nfunction normalizeHexColor(input: string | null | undefined): string | null {\n if (!input) return null;\n const trimmed = input.trim();\n if (!trimmed) return null;\n\n if (HEX_COLOR_WITH_HASH_RE.test(trimmed)) {\n return trimmed.toLowerCase();\n }\n if (HEX_COLOR_RE.test(trimmed)) {\n return `#${trimmed.toLowerCase()}`;\n }\n if (HEX_COLOR_SHORT_WITH_HASH_RE.test(trimmed)) {\n const raw = trimmed.slice(1).toLowerCase();\n return `#${raw[0]}${raw[0]}${raw[1]}${raw[1]}${raw[2]}${raw[2]}`;\n }\n if (HEX_COLOR_SHORT_RE.test(trimmed)) {\n const raw = trimmed.toLowerCase();\n return `#${raw[0]}${raw[0]}${raw[1]}${raw[1]}${raw[2]}${raw[2]}`;\n }\n return null;\n}\n\nexport function buildProjectMentionHref(projectId: string, color?: string | null): string {\n const trimmedProjectId = projectId.trim();\n const normalizedColor = normalizeHexColor(color ?? null);\n if (!normalizedColor) {\n return `${PROJECT_MENTION_SCHEME}${trimmedProjectId}`;\n }\n return `${PROJECT_MENTION_SCHEME}${trimmedProjectId}?c=${encodeURIComponent(normalizedColor.slice(1))}`;\n}\n\nexport function parseProjectMentionHref(href: string): ParsedProjectMention | null {\n if (!href.startsWith(PROJECT_MENTION_SCHEME)) return null;\n\n let url: URL;\n try {\n url = new URL(href);\n } catch {\n return null;\n }\n\n if (url.protocol !== \"project:\") return null;\n\n const projectId = `${url.hostname}${url.pathname}`.replace(/^\\/+/, \"\").trim();\n if (!projectId) return null;\n\n const color = normalizeHexColor(url.searchParams.get(\"c\") ?? url.searchParams.get(\"color\"));\n\n return {\n projectId,\n color,\n };\n}\n\nexport function buildAgentMentionHref(agentId: string, icon?: string | null): string {\n const trimmedAgentId = agentId.trim();\n const normalizedIcon = normalizeAgentIcon(icon ?? null);\n if (!normalizedIcon) {\n return `${AGENT_MENTION_SCHEME}${trimmedAgentId}`;\n }\n return `${AGENT_MENTION_SCHEME}${trimmedAgentId}?i=${encodeURIComponent(normalizedIcon)}`;\n}\n\nexport function parseAgentMentionHref(href: string): ParsedAgentMention | null {\n if (!href.startsWith(AGENT_MENTION_SCHEME)) return null;\n\n let url: URL;\n try {\n url = new URL(href);\n } catch {\n return null;\n }\n\n if (url.protocol !== \"agent:\") return null;\n\n const agentId = `${url.hostname}${url.pathname}`.replace(/^\\/+/, \"\").trim();\n if (!agentId) return null;\n\n return {\n agentId,\n icon: normalizeAgentIcon(url.searchParams.get(\"i\") ?? url.searchParams.get(\"icon\")),\n };\n}\n\nexport function extractProjectMentionIds(markdown: string): string[] {\n if (!markdown) return [];\n const ids = new Set<string>();\n const re = new RegExp(PROJECT_MENTION_LINK_RE);\n let match: RegExpExecArray | null;\n while ((match = re.exec(markdown)) !== null) {\n const parsed = parseProjectMentionHref(match[1]);\n if (parsed) ids.add(parsed.projectId);\n }\n return [...ids];\n}\n\nexport function extractAgentMentionIds(markdown: string): string[] {\n if (!markdown) return [];\n const ids = new Set<string>();\n const re = new RegExp(AGENT_MENTION_LINK_RE);\n let match: RegExpExecArray | null;\n while ((match = re.exec(markdown)) !== null) {\n const parsed = parseAgentMentionHref(match[1]);\n if (parsed) ids.add(parsed.agentId);\n }\n return [...ids];\n}\n\nfunction normalizeAgentIcon(input: string | null | undefined): string | null {\n if (!input) return null;\n const trimmed = input.trim().toLowerCase();\n if (!trimmed || !AGENT_ICON_NAME_RE.test(trimmed)) return null;\n return trimmed;\n}\n", "import type { RoutineVariable } from \"./types/routine.js\";\n\nconst ROUTINE_VARIABLE_MATCHER = /\\{\\{\\s*([A-Za-z][A-Za-z0-9_]*)\\s*\\}\\}/g;\n\nexport function isValidRoutineVariableName(name: string): boolean {\n return /^[A-Za-z][A-Za-z0-9_]*$/.test(name);\n}\n\nexport function extractRoutineVariableNames(template: string | null | undefined): string[] {\n if (!template) return [];\n const found = new Set<string>();\n for (const match of template.matchAll(ROUTINE_VARIABLE_MATCHER)) {\n const name = match[1];\n if (name && !found.has(name)) {\n found.add(name);\n }\n }\n return [...found];\n}\n\nfunction defaultRoutineVariable(name: string): RoutineVariable {\n return {\n name,\n label: null,\n type: \"text\",\n defaultValue: null,\n required: true,\n options: [],\n };\n}\n\nexport function syncRoutineVariablesWithTemplate(\n template: string | null | undefined,\n existing: RoutineVariable[] | null | undefined,\n): RoutineVariable[] {\n const names = extractRoutineVariableNames(template);\n const existingByName = new Map((existing ?? []).map((variable) => [variable.name, variable]));\n return names.map((name) => existingByName.get(name) ?? defaultRoutineVariable(name));\n}\n\nexport function stringifyRoutineVariableValue(value: unknown): string {\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\" || typeof value === \"boolean\") return String(value);\n if (value == null) return \"\";\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\nexport function interpolateRoutineTemplate(\n template: string | null | undefined,\n values: Record<string, unknown> | null | undefined,\n): string | null {\n if (template == null) return null;\n if (!values || Object.keys(values).length === 0) return template;\n return template.replace(ROUTINE_VARIABLE_MATCHER, (match, rawName: string) => {\n if (!(rawName in values)) return match;\n return stringifyRoutineVariableValue(values[rawName]);\n });\n}\n", "import { z } from \"zod\";\nimport {\n AUTH_BASE_URL_MODES,\n DEPLOYMENT_EXPOSURES,\n DEPLOYMENT_MODES,\n SECRET_PROVIDERS,\n STORAGE_PROVIDERS,\n} from \"./constants.js\";\n\nexport const configMetaSchema = z.object({\n version: z.literal(1),\n updatedAt: z.string(),\n source: z.enum([\"onboard\", \"configure\", \"doctor\"]),\n});\n\nexport const llmConfigSchema = z.object({\n provider: z.enum([\"claude\", \"openai\"]),\n apiKey: z.string().optional(),\n});\n\nexport const databaseBackupConfigSchema = z.object({\n enabled: z.boolean().default(true),\n intervalMinutes: z.number().int().min(1).max(7 * 24 * 60).default(60),\n retentionDays: z.number().int().min(1).max(3650).default(30),\n dir: z.string().default(\"~/.paperclip/instances/default/data/backups\"),\n});\n\nexport const databaseConfigSchema = z.object({\n mode: z.enum([\"embedded-postgres\", \"postgres\"]).default(\"embedded-postgres\"),\n connectionString: z.string().optional(),\n embeddedPostgresDataDir: z.string().default(\"~/.paperclip/instances/default/db\"),\n embeddedPostgresPort: z.number().int().min(1).max(65535).default(54329),\n backup: databaseBackupConfigSchema.default({\n enabled: true,\n intervalMinutes: 60,\n retentionDays: 30,\n dir: \"~/.paperclip/instances/default/data/backups\",\n }),\n});\n\nexport const loggingConfigSchema = z.object({\n mode: z.enum([\"file\", \"cloud\"]),\n logDir: z.string().default(\"~/.paperclip/instances/default/logs\"),\n});\n\nexport const serverConfigSchema = z.object({\n deploymentMode: z.enum(DEPLOYMENT_MODES).default(\"local_trusted\"),\n exposure: z.enum(DEPLOYMENT_EXPOSURES).default(\"private\"),\n host: z.string().default(\"127.0.0.1\"),\n port: z.number().int().min(1).max(65535).default(3100),\n allowedHostnames: z.array(z.string().min(1)).default([]),\n serveUi: z.boolean().default(true),\n});\n\nexport const authConfigSchema = z.object({\n baseUrlMode: z.enum(AUTH_BASE_URL_MODES).default(\"auto\"),\n publicBaseUrl: z.string().url().optional(),\n disableSignUp: z.boolean().default(false),\n});\n\nexport const storageLocalDiskConfigSchema = z.object({\n baseDir: z.string().default(\"~/.paperclip/instances/default/data/storage\"),\n});\n\nexport const storageS3ConfigSchema = z.object({\n bucket: z.string().min(1).default(\"paperclip\"),\n region: z.string().min(1).default(\"us-east-1\"),\n endpoint: z.string().optional(),\n prefix: z.string().default(\"\"),\n forcePathStyle: z.boolean().default(false),\n});\n\nexport const storageConfigSchema = z.object({\n provider: z.enum(STORAGE_PROVIDERS).default(\"local_disk\"),\n localDisk: storageLocalDiskConfigSchema.default({\n baseDir: \"~/.paperclip/instances/default/data/storage\",\n }),\n s3: storageS3ConfigSchema.default({\n bucket: \"paperclip\",\n region: \"us-east-1\",\n prefix: \"\",\n forcePathStyle: false,\n }),\n});\n\nexport const secretsLocalEncryptedConfigSchema = z.object({\n keyFilePath: z.string().default(\"~/.paperclip/instances/default/secrets/master.key\"),\n});\n\nexport const secretsConfigSchema = z.object({\n provider: z.enum(SECRET_PROVIDERS).default(\"local_encrypted\"),\n strictMode: z.boolean().default(false),\n localEncrypted: secretsLocalEncryptedConfigSchema.default({\n keyFilePath: \"~/.paperclip/instances/default/secrets/master.key\",\n }),\n});\n\nexport const telemetryConfigSchema = z.object({\n enabled: z.boolean().default(true),\n}).default({});\n\nexport const paperclipConfigSchema = z\n .object({\n $meta: configMetaSchema,\n llm: llmConfigSchema.optional(),\n database: databaseConfigSchema,\n logging: loggingConfigSchema,\n server: serverConfigSchema,\n telemetry: telemetryConfigSchema,\n auth: authConfigSchema.default({\n baseUrlMode: \"auto\",\n disableSignUp: false,\n }),\n storage: storageConfigSchema.default({\n provider: \"local_disk\",\n localDisk: {\n baseDir: \"~/.paperclip/instances/default/data/storage\",\n },\n s3: {\n bucket: \"paperclip\",\n region: \"us-east-1\",\n prefix: \"\",\n forcePathStyle: false,\n },\n }),\n secrets: secretsConfigSchema.default({\n provider: \"local_encrypted\",\n strictMode: false,\n localEncrypted: {\n keyFilePath: \"~/.paperclip/instances/default/secrets/master.key\",\n },\n }),\n })\n .superRefine((value, ctx) => {\n if (value.server.deploymentMode === \"local_trusted\") {\n if (value.server.exposure !== \"private\") {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"server.exposure must be private when deploymentMode is local_trusted\",\n path: [\"server\", \"exposure\"],\n });\n }\n return;\n }\n\n if (value.auth.baseUrlMode === \"explicit\" && !value.auth.publicBaseUrl) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"auth.publicBaseUrl is required when auth.baseUrlMode is explicit\",\n path: [\"auth\", \"publicBaseUrl\"],\n });\n }\n\n if (value.server.exposure === \"public\" && value.auth.baseUrlMode !== \"explicit\") {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"auth.baseUrlMode must be explicit when deploymentMode=authenticated and exposure=public\",\n path: [\"auth\", \"baseUrlMode\"],\n });\n }\n\n if (value.server.exposure === \"public\" && !value.auth.publicBaseUrl) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"auth.publicBaseUrl is required when deploymentMode=authenticated and exposure=public\",\n path: [\"auth\", \"publicBaseUrl\"],\n });\n }\n });\n\nexport type PaperclipConfig = z.infer<typeof paperclipConfigSchema>;\nexport type LlmConfig = z.infer<typeof llmConfigSchema>;\nexport type DatabaseConfig = z.infer<typeof databaseConfigSchema>;\nexport type LoggingConfig = z.infer<typeof loggingConfigSchema>;\nexport type ServerConfig = z.infer<typeof serverConfigSchema>;\nexport type StorageConfig = z.infer<typeof storageConfigSchema>;\nexport type StorageLocalDiskConfig = z.infer<typeof storageLocalDiskConfigSchema>;\nexport type StorageS3Config = z.infer<typeof storageS3ConfigSchema>;\nexport type SecretsConfig = z.infer<typeof secretsConfigSchema>;\nexport type SecretsLocalEncryptedConfig = z.infer<typeof secretsLocalEncryptedConfigSchema>;\nexport type AuthConfig = z.infer<typeof authConfigSchema>;\nexport type TelemetryConfig = z.infer<typeof telemetryConfigSchema>;\nexport type ConfigMeta = z.infer<typeof configMetaSchema>;\nexport type DatabaseBackupConfig = z.infer<typeof databaseBackupConfigSchema>;\n", "export {\n COMPANY_STATUSES,\n DEPLOYMENT_MODES,\n DEPLOYMENT_EXPOSURES,\n AUTH_BASE_URL_MODES,\n AGENT_STATUSES,\n AGENT_ADAPTER_TYPES,\n AGENT_ROLES,\n AGENT_ROLE_LABELS,\n AGENT_ICON_NAMES,\n ISSUE_STATUSES,\n INBOX_MINE_ISSUE_STATUSES,\n INBOX_MINE_ISSUE_STATUS_FILTER,\n ISSUE_PRIORITIES,\n ISSUE_ORIGIN_KINDS,\n GOAL_LEVELS,\n GOAL_STATUSES,\n PROJECT_STATUSES,\n ROUTINE_STATUSES,\n ROUTINE_CONCURRENCY_POLICIES,\n ROUTINE_CATCH_UP_POLICIES,\n ROUTINE_TRIGGER_KINDS,\n ROUTINE_TRIGGER_SIGNING_MODES,\n ROUTINE_VARIABLE_TYPES,\n ROUTINE_RUN_STATUSES,\n ROUTINE_RUN_SOURCES,\n PAUSE_REASONS,\n PROJECT_COLORS,\n APPROVAL_TYPES,\n APPROVAL_STATUSES,\n SECRET_PROVIDERS,\n STORAGE_PROVIDERS,\n BILLING_TYPES,\n FINANCE_EVENT_KINDS,\n FINANCE_DIRECTIONS,\n FINANCE_UNITS,\n BUDGET_SCOPE_TYPES,\n BUDGET_METRICS,\n BUDGET_WINDOW_KINDS,\n BUDGET_THRESHOLD_TYPES,\n BUDGET_INCIDENT_STATUSES,\n BUDGET_INCIDENT_RESOLUTION_ACTIONS,\n HEARTBEAT_INVOCATION_SOURCES,\n HEARTBEAT_RUN_STATUSES,\n WAKEUP_TRIGGER_DETAILS,\n WAKEUP_REQUEST_STATUSES,\n LIVE_EVENT_TYPES,\n PRINCIPAL_TYPES,\n MEMBERSHIP_STATUSES,\n INSTANCE_USER_ROLES,\n INVITE_TYPES,\n INVITE_JOIN_TYPES,\n JOIN_REQUEST_TYPES,\n JOIN_REQUEST_STATUSES,\n PERMISSION_KEYS,\n PLUGIN_API_VERSION,\n PLUGIN_STATUSES,\n PLUGIN_CATEGORIES,\n PLUGIN_CAPABILITIES,\n PLUGIN_UI_SLOT_TYPES,\n PLUGIN_UI_SLOT_ENTITY_TYPES,\n PLUGIN_LAUNCHER_PLACEMENT_ZONES,\n PLUGIN_LAUNCHER_ACTIONS,\n PLUGIN_LAUNCHER_BOUNDS,\n PLUGIN_LAUNCHER_RENDER_ENVIRONMENTS,\n PLUGIN_STATE_SCOPE_KINDS,\n PLUGIN_JOB_STATUSES,\n PLUGIN_JOB_RUN_STATUSES,\n PLUGIN_JOB_RUN_TRIGGERS,\n PLUGIN_WEBHOOK_DELIVERY_STATUSES,\n PLUGIN_EVENT_TYPES,\n PLUGIN_BRIDGE_ERROR_CODES,\n type CompanyStatus,\n type DeploymentMode,\n type DeploymentExposure,\n type AuthBaseUrlMode,\n type AgentStatus,\n type AgentAdapterType,\n type AgentRole,\n type AgentIconName,\n type IssueStatus,\n type IssuePriority,\n type IssueOriginKind,\n type GoalLevel,\n type GoalStatus,\n type ProjectStatus,\n type RoutineStatus,\n type RoutineConcurrencyPolicy,\n type RoutineCatchUpPolicy,\n type RoutineTriggerKind,\n type RoutineTriggerSigningMode,\n type RoutineVariableType,\n type RoutineRunStatus,\n type RoutineRunSource,\n type PauseReason,\n type ApprovalType,\n type ApprovalStatus,\n type SecretProvider,\n type StorageProvider,\n type BillingType,\n type FinanceEventKind,\n type FinanceDirection,\n type FinanceUnit,\n type BudgetScopeType,\n type BudgetMetric,\n type BudgetWindowKind,\n type BudgetThresholdType,\n type BudgetIncidentStatus,\n type BudgetIncidentResolutionAction,\n type HeartbeatInvocationSource,\n type HeartbeatRunStatus,\n type WakeupTriggerDetail,\n type WakeupRequestStatus,\n type LiveEventType,\n type PrincipalType,\n type MembershipStatus,\n type InstanceUserRole,\n type InviteType,\n type InviteJoinType,\n type JoinRequestType,\n type JoinRequestStatus,\n type PermissionKey,\n type PluginStatus,\n type PluginCategory,\n type PluginCapability,\n type PluginUiSlotType,\n type PluginUiSlotEntityType,\n type PluginLauncherPlacementZone,\n type PluginLauncherAction,\n type PluginLauncherBounds,\n type PluginLauncherRenderEnvironment,\n type PluginStateScopeKind,\n type PluginJobStatus,\n type PluginJobRunStatus,\n type PluginJobRunTrigger,\n type PluginWebhookDeliveryStatus,\n type PluginEventType,\n type PluginBridgeErrorCode,\n} from \"./constants.js\";\n\nexport type {\n Company,\n FeedbackVote,\n FeedbackDataSharingPreference,\n FeedbackTargetType,\n FeedbackVoteValue,\n FeedbackTrace,\n FeedbackTraceStatus,\n FeedbackTraceTargetSummary,\n FeedbackTraceBundleCaptureStatus,\n FeedbackTraceBundleFile,\n FeedbackTraceBundle,\n CompanySkillSourceType,\n CompanySkillTrustLevel,\n CompanySkillCompatibility,\n CompanySkillSourceBadge,\n CompanySkillFileInventoryEntry,\n CompanySkill,\n CompanySkillListItem,\n CompanySkillUsageAgent,\n CompanySkillDetail,\n CompanySkillUpdateStatus,\n CompanySkillImportRequest,\n CompanySkillImportResult,\n CompanySkillProjectScanRequest,\n CompanySkillProjectScanSkipped,\n CompanySkillProjectScanConflict,\n CompanySkillProjectScanResult,\n CompanySkillCreateRequest,\n CompanySkillFileDetail,\n CompanySkillFileUpdateRequest,\n AgentSkillSyncMode,\n AgentSkillState,\n AgentSkillOrigin,\n AgentSkillEntry,\n AgentSkillSnapshot,\n AgentSkillSyncRequest,\n InstanceExperimentalSettings,\n InstanceGeneralSettings,\n InstanceSettings,\n Agent,\n AgentAccessState,\n AgentChainOfCommandEntry,\n AgentDetail,\n AgentPermissions,\n AgentInstructionsBundleMode,\n AgentInstructionsFileSummary,\n AgentInstructionsFileDetail,\n AgentInstructionsBundle,\n AgentKeyCreated,\n AgentConfigRevision,\n AdapterEnvironmentCheckLevel,\n AdapterEnvironmentTestStatus,\n AdapterEnvironmentCheck,\n AdapterEnvironmentTestResult,\n AssetImage,\n Project,\n ProjectCodebase,\n ProjectCodebaseOrigin,\n ProjectGoalRef,\n ProjectWorkspace,\n ExecutionWorkspace,\n ExecutionWorkspaceConfig,\n ExecutionWorkspaceCloseAction,\n ExecutionWorkspaceCloseActionKind,\n ExecutionWorkspaceCloseGitReadiness,\n ExecutionWorkspaceCloseLinkedIssue,\n ExecutionWorkspaceCloseReadiness,\n ExecutionWorkspaceCloseReadinessState,\n ProjectWorkspaceRuntimeConfig,\n WorkspaceRuntimeService,\n WorkspaceOperation,\n WorkspaceOperationPhase,\n WorkspaceOperationStatus,\n WorkspaceRuntimeDesiredState,\n ExecutionWorkspaceStrategyType,\n ExecutionWorkspaceMode,\n ExecutionWorkspaceProviderType,\n ExecutionWorkspaceStatus,\n ExecutionWorkspaceStrategy,\n ProjectExecutionWorkspacePolicy,\n ProjectExecutionWorkspaceDefaultMode,\n IssueExecutionWorkspaceSettings,\n IssueWorkProduct,\n IssueWorkProductType,\n IssueWorkProductProvider,\n IssueWorkProductStatus,\n IssueWorkProductReviewState,\n Issue,\n IssueAssigneeAdapterOverrides,\n IssueComment,\n IssueDocument,\n IssueDocumentSummary,\n DocumentRevision,\n DocumentFormat,\n LegacyPlanDocument,\n IssueAttachment,\n IssueLabel,\n Goal,\n Approval,\n ApprovalComment,\n BudgetPolicy,\n BudgetPolicySummary,\n BudgetIncident,\n BudgetOverview,\n BudgetPolicyUpsertInput,\n BudgetIncidentResolutionInput,\n CostEvent,\n CostSummary,\n CostByAgent,\n CostByProviderModel,\n CostByBiller,\n CostByAgentModel,\n CostWindowSpendRow,\n CostByProject,\n FinanceEvent,\n FinanceSummary,\n FinanceByBiller,\n FinanceByKind,\n AgentWakeupResponse,\n AgentWakeupSkipped,\n HeartbeatRun,\n HeartbeatRunEvent,\n AgentRuntimeState,\n AgentTaskSession,\n AgentWakeupRequest,\n InstanceSchedulerHeartbeatAgent,\n LiveEvent,\n DashboardSummary,\n ActivityEvent,\n SidebarBadges,\n CompanyMembership,\n PrincipalPermissionGrant,\n Invite,\n JoinRequest,\n InstanceUserRoleGrant,\n CompanyPortabilityInclude,\n CompanyPortabilityEnvInput,\n CompanyPortabilityFileEntry,\n CompanyPortabilityCompanyManifestEntry,\n CompanyPortabilitySidebarOrder,\n CompanyPortabilityAgentManifestEntry,\n CompanyPortabilitySkillManifestEntry,\n CompanyPortabilityProjectManifestEntry,\n CompanyPortabilityProjectWorkspaceManifestEntry,\n CompanyPortabilityIssueRoutineTriggerManifestEntry,\n CompanyPortabilityIssueRoutineManifestEntry,\n CompanyPortabilityIssueManifestEntry,\n CompanyPortabilityManifest,\n CompanyPortabilityExportResult,\n CompanyPortabilityExportPreviewFile,\n CompanyPortabilityExportPreviewResult,\n CompanyPortabilitySource,\n CompanyPortabilityImportTarget,\n CompanyPortabilityAgentSelection,\n CompanyPortabilityCollisionStrategy,\n CompanyPortabilityPreviewRequest,\n CompanyPortabilityPreviewAgentPlan,\n CompanyPortabilityPreviewProjectPlan,\n CompanyPortabilityPreviewIssuePlan,\n CompanyPortabilityPreviewResult,\n CompanyPortabilityAdapterOverride,\n CompanyPortabilityImportRequest,\n CompanyPortabilityImportResult,\n CompanyPortabilityExportRequest,\n EnvBinding,\n AgentEnvConfig,\n CompanySecret,\n SecretProviderDescriptor,\n Routine,\n RoutineVariable,\n RoutineVariableDefaultValue,\n RoutineTrigger,\n RoutineRun,\n RoutineTriggerSecretMaterial,\n RoutineDetail,\n RoutineRunSummary,\n RoutineExecutionIssueOrigin,\n RoutineListItem,\n JsonSchema,\n PluginJobDeclaration,\n PluginWebhookDeclaration,\n PluginToolDeclaration,\n PluginUiSlotDeclaration,\n PluginLauncherActionDeclaration,\n PluginLauncherRenderDeclaration,\n PluginLauncherRenderContextSnapshot,\n PluginLauncherDeclaration,\n PluginMinimumHostVersion,\n PluginUiDeclaration,\n PaperclipPluginManifestV1,\n PluginRecord,\n PluginStateRecord,\n PluginConfig,\n PluginEntityRecord,\n PluginEntityQuery,\n PluginJobRecord,\n PluginJobRunRecord,\n PluginWebhookDeliveryRecord,\n QuotaWindow,\n ProviderQuotaResult,\n} from \"./types/index.js\";\n\nexport {\n DEFAULT_FEEDBACK_DATA_SHARING_PREFERENCE,\n FEEDBACK_TARGET_TYPES,\n FEEDBACK_DATA_SHARING_PREFERENCES,\n FEEDBACK_TRACE_STATUSES,\n FEEDBACK_VOTE_VALUES,\n DEFAULT_FEEDBACK_DATA_SHARING_TERMS_VERSION,\n} from \"./types/feedback.js\";\n\nexport {\n instanceGeneralSettingsSchema,\n patchInstanceGeneralSettingsSchema,\n type PatchInstanceGeneralSettings,\n instanceExperimentalSettingsSchema,\n patchInstanceExperimentalSettingsSchema,\n type PatchInstanceExperimentalSettings,\n} from \"./validators/index.js\";\n\nexport {\n createCompanySchema,\n updateCompanySchema,\n updateCompanyBrandingSchema,\n feedbackTargetTypeSchema,\n feedbackTraceStatusSchema,\n feedbackVoteValueSchema,\n upsertIssueFeedbackVoteSchema,\n type CreateCompany,\n type UpdateCompany,\n type UpdateCompanyBranding,\n type UpsertIssueFeedbackVote,\n agentSkillStateSchema,\n agentSkillSyncModeSchema,\n agentSkillEntrySchema,\n agentSkillSnapshotSchema,\n agentSkillSyncSchema,\n type AgentSkillSync,\n createAgentSchema,\n createAgentHireSchema,\n updateAgentSchema,\n agentInstructionsBundleModeSchema,\n updateAgentInstructionsBundleSchema,\n upsertAgentInstructionsFileSchema,\n updateAgentInstructionsPathSchema,\n createAgentKeySchema,\n agentMineInboxQuerySchema,\n wakeAgentSchema,\n resetAgentSessionSchema,\n testAdapterEnvironmentSchema,\n agentPermissionsSchema,\n updateAgentPermissionsSchema,\n type CreateAgent,\n type CreateAgentHire,\n type UpdateAgent,\n type UpdateAgentInstructionsBundle,\n type UpsertAgentInstructionsFile,\n type UpdateAgentInstructionsPath,\n type CreateAgentKey,\n type AgentMineInboxQuery,\n type WakeAgent,\n type ResetAgentSession,\n type TestAdapterEnvironment,\n type UpdateAgentPermissions,\n createProjectSchema,\n updateProjectSchema,\n createProjectWorkspaceSchema,\n updateProjectWorkspaceSchema,\n type CreateProject,\n type UpdateProject,\n type CreateProjectWorkspace,\n type UpdateProjectWorkspace,\n projectExecutionWorkspacePolicySchema,\n createIssueSchema,\n createIssueLabelSchema,\n updateIssueSchema,\n issueExecutionWorkspaceSettingsSchema,\n checkoutIssueSchema,\n addIssueCommentSchema,\n linkIssueApprovalSchema,\n createIssueAttachmentMetadataSchema,\n createIssueWorkProductSchema,\n updateIssueWorkProductSchema,\n issueWorkProductTypeSchema,\n issueWorkProductStatusSchema,\n issueWorkProductReviewStateSchema,\n updateExecutionWorkspaceSchema,\n executionWorkspaceStatusSchema,\n executionWorkspaceCloseActionKindSchema,\n executionWorkspaceCloseActionSchema,\n executionWorkspaceCloseGitReadinessSchema,\n executionWorkspaceCloseLinkedIssueSchema,\n executionWorkspaceCloseReadinessSchema,\n executionWorkspaceCloseReadinessStateSchema,\n issueDocumentFormatSchema,\n issueDocumentKeySchema,\n upsertIssueDocumentSchema,\n restoreIssueDocumentRevisionSchema,\n type CreateIssue,\n type CreateIssueLabel,\n type UpdateIssue,\n type CheckoutIssue,\n type AddIssueComment,\n type LinkIssueApproval,\n type CreateIssueAttachmentMetadata,\n type CreateIssueWorkProduct,\n type UpdateIssueWorkProduct,\n type UpdateExecutionWorkspace,\n type IssueDocumentFormat,\n type UpsertIssueDocument,\n type RestoreIssueDocumentRevision,\n createGoalSchema,\n updateGoalSchema,\n type CreateGoal,\n type UpdateGoal,\n createApprovalSchema,\n upsertBudgetPolicySchema,\n resolveBudgetIncidentSchema,\n resolveApprovalSchema,\n requestApprovalRevisionSchema,\n resubmitApprovalSchema,\n addApprovalCommentSchema,\n type CreateApproval,\n type UpsertBudgetPolicy,\n type ResolveBudgetIncident,\n type ResolveApproval,\n type RequestApprovalRevision,\n type ResubmitApproval,\n type AddApprovalComment,\n envBindingPlainSchema,\n envBindingSecretRefSchema,\n envBindingSchema,\n envConfigSchema,\n createSecretSchema,\n rotateSecretSchema,\n updateSecretSchema,\n createRoutineSchema,\n updateRoutineSchema,\n createRoutineTriggerSchema,\n updateRoutineTriggerSchema,\n routineVariableSchema,\n runRoutineSchema,\n rotateRoutineTriggerSecretSchema,\n type CreateSecret,\n type RotateSecret,\n type UpdateSecret,\n type CreateRoutine,\n type UpdateRoutine,\n type CreateRoutineTrigger,\n type UpdateRoutineTrigger,\n type RunRoutine,\n type RotateRoutineTriggerSecret,\n createCostEventSchema,\n createFinanceEventSchema,\n updateBudgetSchema,\n createAssetImageMetadataSchema,\n createCompanyInviteSchema,\n createOpenClawInvitePromptSchema,\n acceptInviteSchema,\n listJoinRequestsQuerySchema,\n claimJoinRequestApiKeySchema,\n boardCliAuthAccessLevelSchema,\n createCliAuthChallengeSchema,\n resolveCliAuthChallengeSchema,\n updateMemberPermissionsSchema,\n updateUserCompanyAccessSchema,\n type CreateCostEvent,\n type CreateFinanceEvent,\n type UpdateBudget,\n type CreateAssetImageMetadata,\n type CreateCompanyInvite,\n type CreateOpenClawInvitePrompt,\n type AcceptInvite,\n type ListJoinRequestsQuery,\n type ClaimJoinRequestApiKey,\n type BoardCliAuthAccessLevel,\n type CreateCliAuthChallenge,\n type ResolveCliAuthChallenge,\n type UpdateMemberPermissions,\n type UpdateUserCompanyAccess,\n companySkillSourceTypeSchema,\n companySkillTrustLevelSchema,\n companySkillCompatibilitySchema,\n companySkillSourceBadgeSchema,\n companySkillFileInventoryEntrySchema,\n companySkillSchema,\n companySkillListItemSchema,\n companySkillUsageAgentSchema,\n companySkillDetailSchema,\n companySkillUpdateStatusSchema,\n companySkillImportSchema,\n companySkillProjectScanRequestSchema,\n companySkillProjectScanSkippedSchema,\n companySkillProjectScanConflictSchema,\n companySkillProjectScanResultSchema,\n companySkillCreateSchema,\n companySkillFileDetailSchema,\n companySkillFileUpdateSchema,\n portabilityIncludeSchema,\n portabilityEnvInputSchema,\n portabilityCompanyManifestEntrySchema,\n portabilitySidebarOrderSchema,\n portabilityAgentManifestEntrySchema,\n portabilityManifestSchema,\n portabilitySourceSchema,\n portabilityTargetSchema,\n portabilityAgentSelectionSchema,\n portabilityCollisionStrategySchema,\n companyPortabilityExportSchema,\n companyPortabilityPreviewSchema,\n companyPortabilityImportSchema,\n type CompanyPortabilityExport,\n type CompanyPortabilityPreview,\n type CompanyPortabilityImport,\n jsonSchemaSchema,\n pluginJobDeclarationSchema,\n pluginWebhookDeclarationSchema,\n pluginToolDeclarationSchema,\n pluginUiSlotDeclarationSchema,\n pluginLauncherActionDeclarationSchema,\n pluginLauncherRenderDeclarationSchema,\n pluginLauncherDeclarationSchema,\n pluginManifestV1Schema,\n installPluginSchema,\n upsertPluginConfigSchema,\n patchPluginConfigSchema,\n updatePluginStatusSchema,\n uninstallPluginSchema,\n pluginStateScopeKeySchema,\n setPluginStateSchema,\n listPluginStateSchema,\n type PluginJobDeclarationInput,\n type PluginWebhookDeclarationInput,\n type PluginToolDeclarationInput,\n type PluginUiSlotDeclarationInput,\n type PluginLauncherActionDeclarationInput,\n type PluginLauncherRenderDeclarationInput,\n type PluginLauncherDeclarationInput,\n type PluginManifestV1Input,\n type InstallPlugin,\n type UpsertPluginConfig,\n type PatchPluginConfig,\n type UpdatePluginStatus,\n type UninstallPlugin,\n type PluginStateScopeKey,\n type SetPluginState,\n type ListPluginState,\n} from \"./validators/index.js\";\n\nexport { API_PREFIX, API } from \"./api.js\";\nexport { normalizeAgentUrlKey, deriveAgentUrlKey, isUuidLike } from \"./agent-url-key.js\";\nexport { deriveProjectUrlKey, normalizeProjectUrlKey, hasNonAsciiContent } from \"./project-url-key.js\";\nexport {\n AGENT_MENTION_SCHEME,\n PROJECT_MENTION_SCHEME,\n buildAgentMentionHref,\n buildProjectMentionHref,\n extractAgentMentionIds,\n parseAgentMentionHref,\n parseProjectMentionHref,\n extractProjectMentionIds,\n type ParsedAgentMention,\n type ParsedProjectMention,\n} from \"./project-mentions.js\";\n\nexport {\n extractRoutineVariableNames,\n interpolateRoutineTemplate,\n isValidRoutineVariableName,\n stringifyRoutineVariableValue,\n syncRoutineVariablesWithTemplate,\n} from \"./routine-variables.js\";\n\nexport {\n paperclipConfigSchema,\n configMetaSchema,\n llmConfigSchema,\n databaseBackupConfigSchema,\n databaseConfigSchema,\n loggingConfigSchema,\n serverConfigSchema,\n authConfigSchema,\n secretsConfigSchema,\n storageConfigSchema,\n storageLocalDiskConfigSchema,\n storageS3ConfigSchema,\n secretsLocalEncryptedConfigSchema,\n telemetryConfigSchema,\n type TelemetryConfig,\n type PaperclipConfig,\n type LlmConfig,\n type DatabaseBackupConfig,\n type DatabaseConfig,\n type LoggingConfig,\n type ServerConfig,\n type AuthConfig,\n type StorageConfig,\n type StorageLocalDiskConfig,\n type StorageS3Config,\n type SecretsConfig,\n type SecretsLocalEncryptedConfig,\n type ConfigMeta,\n} from \"./config-schema.js\";\n", "export {\n paperclipConfigSchema,\n configMetaSchema,\n llmConfigSchema,\n databaseBackupConfigSchema,\n databaseConfigSchema,\n loggingConfigSchema,\n serverConfigSchema,\n authConfigSchema,\n telemetryConfigSchema,\n storageConfigSchema,\n storageLocalDiskConfigSchema,\n storageS3ConfigSchema,\n secretsConfigSchema,\n secretsLocalEncryptedConfigSchema,\n type PaperclipConfig,\n type LlmConfig,\n type DatabaseBackupConfig,\n type DatabaseConfig,\n type LoggingConfig,\n type ServerConfig,\n type AuthConfig,\n type TelemetryConfig,\n type StorageConfig,\n type StorageLocalDiskConfig,\n type StorageS3Config,\n type SecretsConfig,\n type SecretsLocalEncryptedConfig,\n type ConfigMeta,\n} from \"../../../packages/shared/src/config-schema.js\";\n", "import os from \"node:os\";\nimport path from \"node:path\";\n\nconst DEFAULT_INSTANCE_ID = \"default\";\nconst INSTANCE_ID_RE = /^[a-zA-Z0-9_-]+$/;\n\nexport function resolvePaperclipHomeDir(): string {\n const envHome = process.env.PAPERCLIP_HOME?.trim();\n if (envHome) return path.resolve(expandHomePrefix(envHome));\n return path.resolve(os.homedir(), \".paperclip\");\n}\n\nexport function resolvePaperclipInstanceId(override?: string): string {\n const raw = override?.trim() || process.env.PAPERCLIP_INSTANCE_ID?.trim() || DEFAULT_INSTANCE_ID;\n if (!INSTANCE_ID_RE.test(raw)) {\n throw new Error(\n `Invalid instance id '${raw}'. Allowed characters: letters, numbers, '_' and '-'.`,\n );\n }\n return raw;\n}\n\nexport function resolvePaperclipInstanceRoot(instanceId?: string): string {\n const id = resolvePaperclipInstanceId(instanceId);\n return path.resolve(resolvePaperclipHomeDir(), \"instances\", id);\n}\n\nexport function resolveDefaultConfigPath(instanceId?: string): string {\n return path.resolve(resolvePaperclipInstanceRoot(instanceId), \"config.json\");\n}\n\nexport function resolveDefaultContextPath(): string {\n return path.resolve(resolvePaperclipHomeDir(), \"context.json\");\n}\n\nexport function resolveDefaultCliAuthPath(): string {\n return path.resolve(resolvePaperclipHomeDir(), \"auth.json\");\n}\n\nexport function resolveDefaultEmbeddedPostgresDir(instanceId?: string): string {\n return path.resolve(resolvePaperclipInstanceRoot(instanceId), \"db\");\n}\n\nexport function resolveDefaultLogsDir(instanceId?: string): string {\n return path.resolve(resolvePaperclipInstanceRoot(instanceId), \"logs\");\n}\n\nexport function resolveDefaultSecretsKeyFilePath(instanceId?: string): string {\n return path.resolve(resolvePaperclipInstanceRoot(instanceId), \"secrets\", \"master.key\");\n}\n\nexport function resolveDefaultStorageDir(instanceId?: string): string {\n return path.resolve(resolvePaperclipInstanceRoot(instanceId), \"data\", \"storage\");\n}\n\nexport function resolveDefaultBackupDir(instanceId?: string): string {\n return path.resolve(resolvePaperclipInstanceRoot(instanceId), \"data\", \"backups\");\n}\n\nexport function expandHomePrefix(value: string): string {\n if (value === \"~\") return os.homedir();\n if (value.startsWith(\"~/\")) return path.resolve(os.homedir(), value.slice(2));\n return value;\n}\n\nexport function describeLocalInstancePaths(instanceId?: string) {\n const resolvedInstanceId = resolvePaperclipInstanceId(instanceId);\n const instanceRoot = resolvePaperclipInstanceRoot(resolvedInstanceId);\n return {\n homeDir: resolvePaperclipHomeDir(),\n instanceId: resolvedInstanceId,\n instanceRoot,\n configPath: resolveDefaultConfigPath(resolvedInstanceId),\n embeddedPostgresDataDir: resolveDefaultEmbeddedPostgresDir(resolvedInstanceId),\n backupDir: resolveDefaultBackupDir(resolvedInstanceId),\n logDir: resolveDefaultLogsDir(resolvedInstanceId),\n secretsKeyFilePath: resolveDefaultSecretsKeyFilePath(resolvedInstanceId),\n storageDir: resolveDefaultStorageDir(resolvedInstanceId),\n };\n}\n", "import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { paperclipConfigSchema, type PaperclipConfig } from \"./schema.js\";\nimport {\n resolveDefaultConfigPath,\n resolvePaperclipInstanceId,\n} from \"./home.js\";\n\nconst DEFAULT_CONFIG_BASENAME = \"config.json\";\n\nfunction findConfigFileFromAncestors(startDir: string): string | null {\n const absoluteStartDir = path.resolve(startDir);\n let currentDir = absoluteStartDir;\n\n while (true) {\n const candidate = path.resolve(currentDir, \".paperclip\", DEFAULT_CONFIG_BASENAME);\n if (fs.existsSync(candidate)) {\n return candidate;\n }\n\n const nextDir = path.resolve(currentDir, \"..\");\n if (nextDir === currentDir) break;\n currentDir = nextDir;\n }\n\n return null;\n}\n\nexport function resolveConfigPath(overridePath?: string): string {\n if (overridePath) return path.resolve(overridePath);\n if (process.env.PAPERCLIP_CONFIG) return path.resolve(process.env.PAPERCLIP_CONFIG);\n return findConfigFileFromAncestors(process.cwd()) ?? resolveDefaultConfigPath(resolvePaperclipInstanceId());\n}\n\nfunction parseJson(filePath: string): unknown {\n try {\n return JSON.parse(fs.readFileSync(filePath, \"utf-8\"));\n } catch (err) {\n throw new Error(`Failed to parse JSON at ${filePath}: ${err instanceof Error ? err.message : String(err)}`);\n }\n}\n\nfunction migrateLegacyConfig(raw: unknown): unknown {\n if (typeof raw !== \"object\" || raw === null || Array.isArray(raw)) return raw;\n const config = { ...(raw as Record<string, unknown>) };\n const databaseRaw = config.database;\n if (typeof databaseRaw !== \"object\" || databaseRaw === null || Array.isArray(databaseRaw)) {\n return config;\n }\n\n const database = { ...(databaseRaw as Record<string, unknown>) };\n if (database.mode === \"pglite\") {\n database.mode = \"embedded-postgres\";\n\n if (typeof database.embeddedPostgresDataDir !== \"string\" && typeof database.pgliteDataDir === \"string\") {\n database.embeddedPostgresDataDir = database.pgliteDataDir;\n }\n if (\n typeof database.embeddedPostgresPort !== \"number\" &&\n typeof database.pglitePort === \"number\" &&\n Number.isFinite(database.pglitePort)\n ) {\n database.embeddedPostgresPort = database.pglitePort;\n }\n }\n\n config.database = database;\n return config;\n}\n\nfunction formatValidationError(err: unknown): string {\n const issues = (err as { issues?: Array<{ path?: unknown; message?: unknown }> })?.issues;\n if (Array.isArray(issues) && issues.length > 0) {\n return issues\n .map((issue) => {\n const pathParts = Array.isArray(issue.path) ? issue.path.map(String) : [];\n const issuePath = pathParts.length > 0 ? pathParts.join(\".\") : \"config\";\n const message = typeof issue.message === \"string\" ? issue.message : \"Invalid value\";\n return `${issuePath}: ${message}`;\n })\n .join(\"; \");\n }\n return err instanceof Error ? err.message : String(err);\n}\n\nexport function readConfig(configPath?: string): PaperclipConfig | null {\n const filePath = resolveConfigPath(configPath);\n if (!fs.existsSync(filePath)) return null;\n const raw = parseJson(filePath);\n const migrated = migrateLegacyConfig(raw);\n const parsed = paperclipConfigSchema.safeParse(migrated);\n if (!parsed.success) {\n throw new Error(`Invalid config at ${filePath}: ${formatValidationError(parsed.error)}`);\n }\n return parsed.data;\n}\n\nexport function writeConfig(\n config: PaperclipConfig,\n configPath?: string,\n): void {\n const filePath = resolveConfigPath(configPath);\n const dir = path.dirname(filePath);\n fs.mkdirSync(dir, { recursive: true });\n\n // Backup existing config before overwriting\n if (fs.existsSync(filePath)) {\n const backupPath = filePath + \".backup\";\n fs.copyFileSync(filePath, backupPath);\n fs.chmodSync(backupPath, 0o600);\n }\n\n fs.writeFileSync(filePath, JSON.stringify(config, null, 2) + \"\\n\", {\n mode: 0o600,\n });\n}\n\nexport function configExists(configPath?: string): boolean {\n return fs.existsSync(resolveConfigPath(configPath));\n}\n", "import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { randomBytes } from \"node:crypto\";\nimport { config as loadDotenv, parse as parseEnvFileContents } from \"dotenv\";\nimport { resolveConfigPath } from \"./store.js\";\n\nconst JWT_SECRET_ENV_KEY = \"PAPERCLIP_AGENT_JWT_SECRET\";\nfunction resolveEnvFilePath(configPath?: string) {\n return path.resolve(path.dirname(resolveConfigPath(configPath)), \".env\");\n}\nconst loadedEnvFiles = new Set<string>();\n\nfunction isNonEmpty(value: unknown): value is string {\n return typeof value === \"string\" && value.trim().length > 0;\n}\n\nfunction parseEnvFile(contents: string) {\n try {\n return parseEnvFileContents(contents);\n } catch {\n return {};\n }\n}\n\nfunction formatEnvValue(value: string): string {\n if (/^[A-Za-z0-9_./:@-]+$/.test(value)) {\n return value;\n }\n return JSON.stringify(value);\n}\n\nfunction renderEnvFile(entries: Record<string, string>) {\n const lines = [\n \"# Relay Control environment variables\",\n \"# Generated by Relay Control CLI commands\",\n ...Object.entries(entries).map(([key, value]) => `${key}=${formatEnvValue(value)}`),\n \"\",\n ];\n return lines.join(\"\\n\");\n}\n\nexport function resolvePaperclipEnvFile(configPath?: string): string {\n return resolveEnvFilePath(configPath);\n}\n\nexport function resolveAgentJwtEnvFile(configPath?: string): string {\n return resolveEnvFilePath(configPath);\n}\n\nexport function loadPaperclipEnvFile(configPath?: string): void {\n loadAgentJwtEnvFile(resolveEnvFilePath(configPath));\n}\n\nexport function loadAgentJwtEnvFile(filePath = resolveEnvFilePath()): void {\n if (loadedEnvFiles.has(filePath)) return;\n\n if (!fs.existsSync(filePath)) return;\n loadedEnvFiles.add(filePath);\n loadDotenv({ path: filePath, override: false, quiet: true });\n}\n\nexport function readAgentJwtSecretFromEnv(configPath?: string): string | null {\n loadAgentJwtEnvFile(resolveEnvFilePath(configPath));\n const raw = process.env[JWT_SECRET_ENV_KEY];\n return isNonEmpty(raw) ? raw!.trim() : null;\n}\n\nexport function readAgentJwtSecretFromEnvFile(filePath = resolveEnvFilePath()): string | null {\n if (!fs.existsSync(filePath)) return null;\n\n const raw = fs.readFileSync(filePath, \"utf-8\");\n const values = parseEnvFile(raw);\n const value = values[JWT_SECRET_ENV_KEY];\n return isNonEmpty(value) ? value!.trim() : null;\n}\n\nexport function ensureAgentJwtSecret(configPath?: string): { secret: string; created: boolean } {\n const existingEnv = readAgentJwtSecretFromEnv(configPath);\n if (existingEnv) {\n return { secret: existingEnv, created: false };\n }\n\n const envFilePath = resolveEnvFilePath(configPath);\n const existingFile = readAgentJwtSecretFromEnvFile(envFilePath);\n const secret = existingFile ?? randomBytes(32).toString(\"hex\");\n const created = !existingFile;\n\n if (!existingFile) {\n writeAgentJwtEnv(secret, envFilePath);\n }\n\n return { secret, created };\n}\n\nexport function writeAgentJwtEnv(secret: string, filePath = resolveEnvFilePath()): void {\n mergePaperclipEnvEntries({ [JWT_SECRET_ENV_KEY]: secret }, filePath);\n}\n\nexport function readPaperclipEnvEntries(filePath = resolveEnvFilePath()): Record<string, string> {\n if (!fs.existsSync(filePath)) return {};\n return parseEnvFile(fs.readFileSync(filePath, \"utf-8\"));\n}\n\nexport function writePaperclipEnvEntries(entries: Record<string, string>, filePath = resolveEnvFilePath()): void {\n const dir = path.dirname(filePath);\n fs.mkdirSync(dir, { recursive: true });\n fs.writeFileSync(filePath, renderEnvFile(entries), {\n mode: 0o600,\n });\n}\n\nexport function mergePaperclipEnvEntries(\n entries: Record<string, string>,\n filePath = resolveEnvFilePath(),\n): Record<string, string> {\n const current = readPaperclipEnvEntries(filePath);\n const next = {\n ...current,\n ...Object.fromEntries(\n Object.entries(entries).filter(([, value]) => typeof value === \"string\" && value.trim().length > 0),\n ),\n };\n writePaperclipEnvEntries(next, filePath);\n return next;\n}\n", "import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { expandHomePrefix } from \"../config/home.js\";\n\nfunction unique(items: string[]): string[] {\n return Array.from(new Set(items));\n}\n\nexport function resolveRuntimeLikePath(value: string, configPath?: string): string {\n const expanded = expandHomePrefix(value);\n if (path.isAbsolute(expanded)) return path.resolve(expanded);\n\n const cwd = process.cwd();\n const configDir = configPath ? path.dirname(configPath) : null;\n const workspaceRoot = configDir ? path.resolve(configDir, \"..\") : cwd;\n\n const candidates = unique([\n ...(configDir ? [path.resolve(configDir, expanded)] : []),\n path.resolve(workspaceRoot, \"server\", expanded),\n path.resolve(workspaceRoot, expanded),\n path.resolve(cwd, expanded),\n ]);\n\n return candidates.find((candidate) => fs.existsSync(candidate)) ?? candidates[0];\n}\n", "import { randomBytes } from \"node:crypto\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { PaperclipConfig } from \"./schema.js\";\nimport { resolveRuntimeLikePath } from \"../utils/path-resolver.js\";\n\nexport type EnsureSecretsKeyResult =\n | { status: \"created\"; path: string }\n | { status: \"existing\"; path: string }\n | { status: \"skipped_env\"; path: null }\n | { status: \"skipped_provider\"; path: null };\n\nexport function ensureLocalSecretsKeyFile(\n config: Pick<PaperclipConfig, \"secrets\">,\n configPath?: string,\n): EnsureSecretsKeyResult {\n if (config.secrets.provider !== \"local_encrypted\") {\n return { status: \"skipped_provider\", path: null };\n }\n\n const envMasterKey = process.env.PAPERCLIP_SECRETS_MASTER_KEY;\n if (envMasterKey && envMasterKey.trim().length > 0) {\n return { status: \"skipped_env\", path: null };\n }\n\n const keyFileOverride = process.env.PAPERCLIP_SECRETS_MASTER_KEY_FILE;\n const configuredPath =\n keyFileOverride && keyFileOverride.trim().length > 0\n ? keyFileOverride.trim()\n : config.secrets.localEncrypted.keyFilePath;\n const keyFilePath = resolveRuntimeLikePath(configuredPath, configPath);\n\n if (fs.existsSync(keyFilePath)) {\n return { status: \"existing\", path: keyFilePath };\n }\n\n fs.mkdirSync(path.dirname(keyFilePath), { recursive: true });\n fs.writeFileSync(keyFilePath, randomBytes(32).toString(\"base64\"), {\n encoding: \"utf8\",\n mode: 0o600,\n });\n try {\n fs.chmodSync(keyFilePath, 0o600);\n } catch {\n // best effort\n }\n return { status: \"created\", path: keyFilePath };\n}\n", "import * as p from \"@clack/prompts\";\nimport type { DatabaseConfig } from \"../config/schema.js\";\nimport {\n resolveDefaultBackupDir,\n resolveDefaultEmbeddedPostgresDir,\n resolvePaperclipInstanceId,\n} from \"../config/home.js\";\n\nexport async function promptDatabase(current?: DatabaseConfig): Promise<DatabaseConfig> {\n const instanceId = resolvePaperclipInstanceId();\n const defaultEmbeddedDir = resolveDefaultEmbeddedPostgresDir(instanceId);\n const defaultBackupDir = resolveDefaultBackupDir(instanceId);\n const base: DatabaseConfig = current ?? {\n mode: \"embedded-postgres\",\n embeddedPostgresDataDir: defaultEmbeddedDir,\n embeddedPostgresPort: 54329,\n backup: {\n enabled: true,\n intervalMinutes: 60,\n retentionDays: 30,\n dir: defaultBackupDir,\n },\n };\n\n const mode = await p.select({\n message: \"Database mode\",\n options: [\n { value: \"embedded-postgres\" as const, label: \"Embedded PostgreSQL (managed locally)\", hint: \"recommended\" },\n { value: \"postgres\" as const, label: \"PostgreSQL (external server)\" },\n ],\n initialValue: base.mode,\n });\n\n if (p.isCancel(mode)) {\n p.cancel(\"Setup cancelled.\");\n process.exit(0);\n }\n\n let connectionString: string | undefined = base.connectionString;\n let embeddedPostgresDataDir = base.embeddedPostgresDataDir || defaultEmbeddedDir;\n let embeddedPostgresPort = base.embeddedPostgresPort || 54329;\n\n if (mode === \"postgres\") {\n const value = await p.text({\n message: \"PostgreSQL connection string\",\n defaultValue: base.connectionString ?? \"\",\n placeholder: \"postgres://user:pass@localhost:5432/paperclip\",\n validate: (val) => {\n if (!val) return \"Connection string is required for PostgreSQL mode\";\n if (!val.startsWith(\"postgres\")) return \"Must be a postgres:// or postgresql:// URL\";\n },\n });\n\n if (p.isCancel(value)) {\n p.cancel(\"Setup cancelled.\");\n process.exit(0);\n }\n\n connectionString = value;\n } else {\n const dataDir = await p.text({\n message: \"Embedded PostgreSQL data directory\",\n defaultValue: base.embeddedPostgresDataDir || defaultEmbeddedDir,\n placeholder: defaultEmbeddedDir,\n });\n\n if (p.isCancel(dataDir)) {\n p.cancel(\"Setup cancelled.\");\n process.exit(0);\n }\n\n embeddedPostgresDataDir = dataDir || defaultEmbeddedDir;\n\n const portValue = await p.text({\n message: \"Embedded PostgreSQL port\",\n defaultValue: String(base.embeddedPostgresPort || 54329),\n placeholder: \"54329\",\n validate: (val) => {\n const n = Number(val);\n if (!Number.isInteger(n) || n < 1 || n > 65535) return \"Port must be an integer between 1 and 65535\";\n },\n });\n\n if (p.isCancel(portValue)) {\n p.cancel(\"Setup cancelled.\");\n process.exit(0);\n }\n\n embeddedPostgresPort = Number(portValue || \"54329\");\n connectionString = undefined;\n }\n\n const backupEnabled = await p.confirm({\n message: \"Enable automatic database backups?\",\n initialValue: base.backup.enabled,\n });\n if (p.isCancel(backupEnabled)) {\n p.cancel(\"Setup cancelled.\");\n process.exit(0);\n }\n\n const backupDirInput = await p.text({\n message: \"Backup directory\",\n defaultValue: base.backup.dir || defaultBackupDir,\n placeholder: defaultBackupDir,\n validate: (val) => (!val || val.trim().length === 0 ? \"Backup directory is required\" : undefined),\n });\n if (p.isCancel(backupDirInput)) {\n p.cancel(\"Setup cancelled.\");\n process.exit(0);\n }\n\n const backupIntervalInput = await p.text({\n message: \"Backup interval (minutes)\",\n defaultValue: String(base.backup.intervalMinutes || 60),\n placeholder: \"60\",\n validate: (val) => {\n const n = Number(val);\n if (!Number.isInteger(n) || n < 1) return \"Interval must be a positive integer\";\n if (n > 10080) return \"Interval must be 10080 minutes (7 days) or less\";\n return undefined;\n },\n });\n if (p.isCancel(backupIntervalInput)) {\n p.cancel(\"Setup cancelled.\");\n process.exit(0);\n }\n\n const backupRetentionInput = await p.text({\n message: \"Backup retention (days)\",\n defaultValue: String(base.backup.retentionDays || 30),\n placeholder: \"30\",\n validate: (val) => {\n const n = Number(val);\n if (!Number.isInteger(n) || n < 1) return \"Retention must be a positive integer\";\n if (n > 3650) return \"Retention must be 3650 days or less\";\n return undefined;\n },\n });\n if (p.isCancel(backupRetentionInput)) {\n p.cancel(\"Setup cancelled.\");\n process.exit(0);\n }\n\n return {\n mode,\n connectionString,\n embeddedPostgresDataDir,\n embeddedPostgresPort,\n backup: {\n enabled: backupEnabled,\n intervalMinutes: Number(backupIntervalInput || \"60\"),\n retentionDays: Number(backupRetentionInput || \"30\"),\n dir: backupDirInput || defaultBackupDir,\n },\n };\n}\n", "import * as p from \"@clack/prompts\";\nimport type { LlmConfig } from \"../config/schema.js\";\n\nexport async function promptLlm(): Promise<LlmConfig | undefined> {\n const configureLlm = await p.confirm({\n message: \"Configure an LLM provider now?\",\n initialValue: false,\n });\n\n if (p.isCancel(configureLlm)) {\n p.cancel(\"Setup cancelled.\");\n process.exit(0);\n }\n\n if (!configureLlm) return undefined;\n\n const provider = await p.select({\n message: \"LLM provider\",\n options: [\n { value: \"claude\" as const, label: \"Claude (Anthropic)\" },\n { value: \"openai\" as const, label: \"OpenAI\" },\n ],\n });\n\n if (p.isCancel(provider)) {\n p.cancel(\"Setup cancelled.\");\n process.exit(0);\n }\n\n const apiKey = await p.password({\n message: `${provider === \"claude\" ? \"Anthropic\" : \"OpenAI\"} API key`,\n validate: (val) => {\n if (!val) return \"API key is required\";\n },\n });\n\n if (p.isCancel(apiKey)) {\n p.cancel(\"Setup cancelled.\");\n process.exit(0);\n }\n\n return { provider, apiKey };\n}\n", "import * as p from \"@clack/prompts\";\nimport type { LoggingConfig } from \"../config/schema.js\";\nimport { resolveDefaultLogsDir, resolvePaperclipInstanceId } from \"../config/home.js\";\n\nexport async function promptLogging(): Promise<LoggingConfig> {\n const defaultLogDir = resolveDefaultLogsDir(resolvePaperclipInstanceId());\n const mode = await p.select({\n message: \"Logging mode\",\n options: [\n { value: \"file\" as const, label: \"File-based logging\", hint: \"recommended\" },\n { value: \"cloud\" as const, label: \"Cloud logging\", hint: \"coming soon\" },\n ],\n });\n\n if (p.isCancel(mode)) {\n p.cancel(\"Setup cancelled.\");\n process.exit(0);\n }\n\n if (mode === \"file\") {\n const logDir = await p.text({\n message: \"Log directory\",\n defaultValue: defaultLogDir,\n placeholder: defaultLogDir,\n });\n\n if (p.isCancel(logDir)) {\n p.cancel(\"Setup cancelled.\");\n process.exit(0);\n }\n\n return { mode: \"file\", logDir: logDir || defaultLogDir };\n }\n\n p.note(\"Cloud logging is coming soon. Using file-based logging for now.\");\n return { mode: \"file\", logDir: defaultLogDir };\n}\n", "import * as p from \"@clack/prompts\";\nimport type { SecretProvider } from \"@paperclipai/shared\";\nimport type { SecretsConfig } from \"../config/schema.js\";\nimport { resolveDefaultSecretsKeyFilePath, resolvePaperclipInstanceId } from \"../config/home.js\";\n\nfunction defaultKeyFilePath(): string {\n return resolveDefaultSecretsKeyFilePath(resolvePaperclipInstanceId());\n}\n\nexport function defaultSecretsConfig(): SecretsConfig {\n const keyFilePath = defaultKeyFilePath();\n return {\n provider: \"local_encrypted\",\n strictMode: false,\n localEncrypted: {\n keyFilePath,\n },\n };\n}\n\nexport async function promptSecrets(current?: SecretsConfig): Promise<SecretsConfig> {\n const base = current ?? defaultSecretsConfig();\n\n const provider = await p.select({\n message: \"Secrets provider\",\n options: [\n {\n value: \"local_encrypted\" as const,\n label: \"Local encrypted (recommended)\",\n hint: \"best for single-developer installs\",\n },\n {\n value: \"aws_secrets_manager\" as const,\n label: \"AWS Secrets Manager\",\n hint: \"requires external adapter integration\",\n },\n {\n value: \"gcp_secret_manager\" as const,\n label: \"GCP Secret Manager\",\n hint: \"requires external adapter integration\",\n },\n {\n value: \"vault\" as const,\n label: \"HashiCorp Vault\",\n hint: \"requires external adapter integration\",\n },\n ],\n initialValue: base.provider,\n });\n\n if (p.isCancel(provider)) {\n p.cancel(\"Setup cancelled.\");\n process.exit(0);\n }\n\n const strictMode = await p.confirm({\n message: \"Require secret refs for sensitive env vars?\",\n initialValue: base.strictMode,\n });\n\n if (p.isCancel(strictMode)) {\n p.cancel(\"Setup cancelled.\");\n process.exit(0);\n }\n\n const fallbackDefault = defaultKeyFilePath();\n let keyFilePath = base.localEncrypted.keyFilePath || fallbackDefault;\n if (provider === \"local_encrypted\") {\n const keyPath = await p.text({\n message: \"Local encrypted key file path\",\n defaultValue: keyFilePath,\n placeholder: fallbackDefault,\n validate: (value) => {\n if (!value || value.trim().length === 0) return \"Key file path is required\";\n },\n });\n\n if (p.isCancel(keyPath)) {\n p.cancel(\"Setup cancelled.\");\n process.exit(0);\n }\n keyFilePath = keyPath.trim();\n }\n\n if (provider !== \"local_encrypted\") {\n p.note(\n `${provider} is not fully wired in this build yet. Keep local_encrypted unless you are actively implementing that adapter.`,\n \"Heads up\",\n );\n }\n\n return {\n provider: provider as SecretProvider,\n strictMode,\n localEncrypted: {\n keyFilePath,\n },\n };\n}\n", "import * as p from \"@clack/prompts\";\nimport type { StorageConfig } from \"../config/schema.js\";\nimport { resolveDefaultStorageDir, resolvePaperclipInstanceId } from \"../config/home.js\";\n\nfunction defaultStorageBaseDir(): string {\n return resolveDefaultStorageDir(resolvePaperclipInstanceId());\n}\n\nexport function defaultStorageConfig(): StorageConfig {\n return {\n provider: \"local_disk\",\n localDisk: {\n baseDir: defaultStorageBaseDir(),\n },\n s3: {\n bucket: \"paperclip\",\n region: \"us-east-1\",\n endpoint: undefined,\n prefix: \"\",\n forcePathStyle: false,\n },\n };\n}\n\nexport async function promptStorage(current?: StorageConfig): Promise<StorageConfig> {\n const base = current ?? defaultStorageConfig();\n\n const provider = await p.select({\n message: \"Storage provider\",\n options: [\n {\n value: \"local_disk\" as const,\n label: \"Local disk (recommended)\",\n hint: \"best for single-user local deployments\",\n },\n {\n value: \"s3\" as const,\n label: \"S3 compatible\",\n hint: \"for cloud/object storage backends\",\n },\n ],\n initialValue: base.provider,\n });\n\n if (p.isCancel(provider)) {\n p.cancel(\"Setup cancelled.\");\n process.exit(0);\n }\n\n if (provider === \"local_disk\") {\n const baseDir = await p.text({\n message: \"Local storage base directory\",\n defaultValue: base.localDisk.baseDir || defaultStorageBaseDir(),\n placeholder: defaultStorageBaseDir(),\n validate: (value) => {\n if (!value || value.trim().length === 0) return \"Storage base directory is required\";\n },\n });\n\n if (p.isCancel(baseDir)) {\n p.cancel(\"Setup cancelled.\");\n process.exit(0);\n }\n\n return {\n provider: \"local_disk\",\n localDisk: {\n baseDir: baseDir.trim(),\n },\n s3: base.s3,\n };\n }\n\n const bucket = await p.text({\n message: \"S3 bucket\",\n defaultValue: base.s3.bucket || \"paperclip\",\n placeholder: \"paperclip\",\n validate: (value) => {\n if (!value || value.trim().length === 0) return \"Bucket is required\";\n },\n });\n\n if (p.isCancel(bucket)) {\n p.cancel(\"Setup cancelled.\");\n process.exit(0);\n }\n\n const region = await p.text({\n message: \"S3 region\",\n defaultValue: base.s3.region || \"us-east-1\",\n placeholder: \"us-east-1\",\n validate: (value) => {\n if (!value || value.trim().length === 0) return \"Region is required\";\n },\n });\n\n if (p.isCancel(region)) {\n p.cancel(\"Setup cancelled.\");\n process.exit(0);\n }\n\n const endpoint = await p.text({\n message: \"S3 endpoint (optional for compatible backends)\",\n defaultValue: base.s3.endpoint ?? \"\",\n placeholder: \"https://s3.amazonaws.com\",\n });\n\n if (p.isCancel(endpoint)) {\n p.cancel(\"Setup cancelled.\");\n process.exit(0);\n }\n\n const prefix = await p.text({\n message: \"Object key prefix (optional)\",\n defaultValue: base.s3.prefix ?? \"\",\n placeholder: \"paperclip/\",\n });\n\n if (p.isCancel(prefix)) {\n p.cancel(\"Setup cancelled.\");\n process.exit(0);\n }\n\n const forcePathStyle = await p.confirm({\n message: \"Use S3 path-style URLs?\",\n initialValue: base.s3.forcePathStyle ?? false,\n });\n\n if (p.isCancel(forcePathStyle)) {\n p.cancel(\"Setup cancelled.\");\n process.exit(0);\n }\n\n return {\n provider: \"s3\",\n localDisk: base.localDisk,\n s3: {\n bucket: bucket.trim(),\n region: region.trim(),\n endpoint: endpoint.trim() || undefined,\n prefix: prefix.trim(),\n forcePathStyle,\n },\n };\n}\n\n", "export function normalizeHostnameInput(raw: string): string {\n const input = raw.trim();\n if (!input) {\n throw new Error(\"Hostname is required\");\n }\n\n try {\n const url = input.includes(\"://\") ? new URL(input) : new URL(`http://${input}`);\n const hostname = url.hostname.trim().toLowerCase();\n if (!hostname) throw new Error(\"Hostname is required\");\n return hostname;\n } catch {\n throw new Error(`Invalid hostname: ${raw}`);\n }\n}\n\nexport function parseHostnameCsv(raw: string): string[] {\n if (!raw.trim()) return [];\n const unique = new Set<string>();\n for (const part of raw.split(\",\")) {\n const hostname = normalizeHostnameInput(part);\n unique.add(hostname);\n }\n return Array.from(unique);\n}\n\n", "import * as p from \"@clack/prompts\";\nimport type { AuthConfig, ServerConfig } from \"../config/schema.js\";\nimport { parseHostnameCsv } from \"../config/hostnames.js\";\n\nexport async function promptServer(opts?: {\n currentServer?: Partial<ServerConfig>;\n currentAuth?: Partial<AuthConfig>;\n}): Promise<{ server: ServerConfig; auth: AuthConfig }> {\n const currentServer = opts?.currentServer;\n const currentAuth = opts?.currentAuth;\n\n const deploymentModeSelection = await p.select({\n message: \"Deployment mode\",\n options: [\n {\n value: \"local_trusted\",\n label: \"Local trusted\",\n hint: \"Easiest for local setup (no login, localhost-only)\",\n },\n {\n value: \"authenticated\",\n label: \"Authenticated\",\n hint: \"Login required; use for private network or public hosting\",\n },\n ],\n initialValue: currentServer?.deploymentMode ?? \"local_trusted\",\n });\n\n if (p.isCancel(deploymentModeSelection)) {\n p.cancel(\"Setup cancelled.\");\n process.exit(0);\n }\n const deploymentMode = deploymentModeSelection as ServerConfig[\"deploymentMode\"];\n\n let exposure: ServerConfig[\"exposure\"] = \"private\";\n if (deploymentMode === \"authenticated\") {\n const exposureSelection = await p.select({\n message: \"Exposure profile\",\n options: [\n {\n value: \"private\",\n label: \"Private network\",\n hint: \"Private access (for example Tailscale), lower setup friction\",\n },\n {\n value: \"public\",\n label: \"Public internet\",\n hint: \"Internet-facing deployment with stricter requirements\",\n },\n ],\n initialValue: currentServer?.exposure ?? \"private\",\n });\n if (p.isCancel(exposureSelection)) {\n p.cancel(\"Setup cancelled.\");\n process.exit(0);\n }\n exposure = exposureSelection as ServerConfig[\"exposure\"];\n }\n\n const hostDefault = deploymentMode === \"local_trusted\" ? \"127.0.0.1\" : \"0.0.0.0\";\n const hostStr = await p.text({\n message: \"Bind host\",\n defaultValue: currentServer?.host ?? hostDefault,\n placeholder: hostDefault,\n validate: (val) => {\n if (!val.trim()) return \"Host is required\";\n },\n });\n\n if (p.isCancel(hostStr)) {\n p.cancel(\"Setup cancelled.\");\n process.exit(0);\n }\n\n const portStr = await p.text({\n message: \"Server port\",\n defaultValue: String(currentServer?.port ?? 3100),\n placeholder: \"3100\",\n validate: (val) => {\n const n = Number(val);\n if (isNaN(n) || n < 1 || n > 65535 || !Number.isInteger(n)) {\n return \"Must be an integer between 1 and 65535\";\n }\n },\n });\n\n if (p.isCancel(portStr)) {\n p.cancel(\"Setup cancelled.\");\n process.exit(0);\n }\n\n let allowedHostnames: string[] = [];\n if (deploymentMode === \"authenticated\" && exposure === \"private\") {\n const allowedHostnamesInput = await p.text({\n message: \"Allowed hostnames (comma-separated, optional)\",\n defaultValue: (currentServer?.allowedHostnames ?? []).join(\", \"),\n placeholder: \"dotta-macbook-pro, your-host.tailnet.ts.net\",\n validate: (val) => {\n try {\n parseHostnameCsv(val);\n return;\n } catch (err) {\n return err instanceof Error ? err.message : \"Invalid hostname list\";\n }\n },\n });\n\n if (p.isCancel(allowedHostnamesInput)) {\n p.cancel(\"Setup cancelled.\");\n process.exit(0);\n }\n allowedHostnames = parseHostnameCsv(allowedHostnamesInput);\n }\n\n const port = Number(portStr) || 3100;\n let auth: AuthConfig = { baseUrlMode: \"auto\", disableSignUp: false };\n if (deploymentMode === \"authenticated\" && exposure === \"public\") {\n const urlInput = await p.text({\n message: \"Public base URL\",\n defaultValue: currentAuth?.publicBaseUrl ?? \"\",\n placeholder: \"https://paperclip.example.com\",\n validate: (val) => {\n const candidate = val.trim();\n if (!candidate) return \"Public base URL is required for public exposure\";\n try {\n const url = new URL(candidate);\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n return \"URL must start with http:// or https://\";\n }\n return;\n } catch {\n return \"Enter a valid URL\";\n }\n },\n });\n if (p.isCancel(urlInput)) {\n p.cancel(\"Setup cancelled.\");\n process.exit(0);\n }\n auth = {\n baseUrlMode: \"explicit\",\n disableSignUp: false,\n publicBaseUrl: urlInput.trim().replace(/\\/+$/, \"\"),\n };\n } else if (currentAuth?.baseUrlMode === \"explicit\" && currentAuth.publicBaseUrl) {\n auth = {\n baseUrlMode: \"explicit\",\n disableSignUp: false,\n publicBaseUrl: currentAuth.publicBaseUrl,\n };\n }\n\n return {\n server: {\n deploymentMode,\n exposure,\n host: hostStr.trim(),\n port,\n allowedHostnames,\n serveUi: currentServer?.serveUi ?? true,\n },\n auth,\n };\n}\n", "import { pgTable, uuid, text, integer, timestamp, boolean, uniqueIndex } from \"drizzle-orm/pg-core\";\n\nexport const companies = pgTable(\n \"companies\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n name: text(\"name\").notNull(),\n description: text(\"description\"),\n status: text(\"status\").notNull().default(\"active\"),\n pauseReason: text(\"pause_reason\"),\n pausedAt: timestamp(\"paused_at\", { withTimezone: true }),\n issuePrefix: text(\"issue_prefix\").notNull().default(\"PAP\"),\n issueCounter: integer(\"issue_counter\").notNull().default(0),\n budgetMonthlyCents: integer(\"budget_monthly_cents\").notNull().default(0),\n spentMonthlyCents: integer(\"spent_monthly_cents\").notNull().default(0),\n requireBoardApprovalForNewAgents: boolean(\"require_board_approval_for_new_agents\")\n .notNull()\n .default(true),\n feedbackDataSharingEnabled: boolean(\"feedback_data_sharing_enabled\")\n .notNull()\n .default(false),\n feedbackDataSharingConsentAt: timestamp(\"feedback_data_sharing_consent_at\", { withTimezone: true }),\n feedbackDataSharingConsentByUserId: text(\"feedback_data_sharing_consent_by_user_id\"),\n feedbackDataSharingTermsVersion: text(\"feedback_data_sharing_terms_version\"),\n brandColor: text(\"brand_color\"),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull().defaultNow(),\n },\n (table) => ({\n issuePrefixUniqueIdx: uniqueIndex(\"companies_issue_prefix_idx\").on(table.issuePrefix),\n }),\n);\n", "import {\n type AnyPgColumn,\n pgTable,\n uuid,\n text,\n integer,\n timestamp,\n jsonb,\n index,\n} from \"drizzle-orm/pg-core\";\nimport { companies } from \"./companies.js\";\n\nexport const agents = pgTable(\n \"agents\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n companyId: uuid(\"company_id\").notNull().references(() => companies.id),\n name: text(\"name\").notNull(),\n role: text(\"role\").notNull().default(\"general\"),\n title: text(\"title\"),\n icon: text(\"icon\"),\n status: text(\"status\").notNull().default(\"idle\"),\n reportsTo: uuid(\"reports_to\").references((): AnyPgColumn => agents.id),\n capabilities: text(\"capabilities\"),\n adapterType: text(\"adapter_type\").notNull().default(\"process\"),\n adapterConfig: jsonb(\"adapter_config\").$type<Record<string, unknown>>().notNull().default({}),\n runtimeConfig: jsonb(\"runtime_config\").$type<Record<string, unknown>>().notNull().default({}),\n budgetMonthlyCents: integer(\"budget_monthly_cents\").notNull().default(0),\n spentMonthlyCents: integer(\"spent_monthly_cents\").notNull().default(0),\n pauseReason: text(\"pause_reason\"),\n pausedAt: timestamp(\"paused_at\", { withTimezone: true }),\n permissions: jsonb(\"permissions\").$type<Record<string, unknown>>().notNull().default({}),\n lastHeartbeatAt: timestamp(\"last_heartbeat_at\", { withTimezone: true }),\n metadata: jsonb(\"metadata\").$type<Record<string, unknown>>(),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull().defaultNow(),\n },\n (table) => ({\n companyStatusIdx: index(\"agents_company_status_idx\").on(table.companyId, table.status),\n companyReportsToIdx: index(\"agents_company_reports_to_idx\").on(table.companyId, table.reportsTo),\n }),\n);\n", "import { pgTable, uuid, text, integer, timestamp, index, uniqueIndex } from \"drizzle-orm/pg-core\";\nimport { companies } from \"./companies.js\";\nimport { agents } from \"./agents.js\";\n\nexport const assets = pgTable(\n \"assets\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n companyId: uuid(\"company_id\").notNull().references(() => companies.id),\n provider: text(\"provider\").notNull(),\n objectKey: text(\"object_key\").notNull(),\n contentType: text(\"content_type\").notNull(),\n byteSize: integer(\"byte_size\").notNull(),\n sha256: text(\"sha256\").notNull(),\n originalFilename: text(\"original_filename\"),\n createdByAgentId: uuid(\"created_by_agent_id\").references(() => agents.id),\n createdByUserId: text(\"created_by_user_id\"),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull().defaultNow(),\n },\n (table) => ({\n companyCreatedIdx: index(\"assets_company_created_idx\").on(table.companyId, table.createdAt),\n companyProviderIdx: index(\"assets_company_provider_idx\").on(table.companyId, table.provider),\n companyObjectKeyUq: uniqueIndex(\"assets_company_object_key_uq\").on(table.companyId, table.objectKey),\n }),\n);\n", "import { pgTable, uuid, timestamp, uniqueIndex } from \"drizzle-orm/pg-core\";\nimport { companies } from \"./companies.js\";\nimport { assets } from \"./assets.js\";\n\nexport const companyLogos = pgTable(\n \"company_logos\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n companyId: uuid(\"company_id\").notNull().references(() => companies.id, { onDelete: \"cascade\" }),\n assetId: uuid(\"asset_id\").notNull().references(() => assets.id, { onDelete: \"cascade\" }),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull().defaultNow(),\n },\n (table) => ({\n companyUq: uniqueIndex(\"company_logos_company_uq\").on(table.companyId),\n assetUq: uniqueIndex(\"company_logos_asset_uq\").on(table.assetId),\n }),\n);\n", "import { pgTable, text, timestamp, boolean } from \"drizzle-orm/pg-core\";\n\nexport const authUsers = pgTable(\"user\", {\n id: text(\"id\").primaryKey(),\n name: text(\"name\").notNull(),\n email: text(\"email\").notNull(),\n emailVerified: boolean(\"email_verified\").notNull().default(false),\n image: text(\"image\"),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull(),\n});\n\nexport const authSessions = pgTable(\"session\", {\n id: text(\"id\").primaryKey(),\n expiresAt: timestamp(\"expires_at\", { withTimezone: true }).notNull(),\n token: text(\"token\").notNull(),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull(),\n ipAddress: text(\"ip_address\"),\n userAgent: text(\"user_agent\"),\n userId: text(\"user_id\").notNull().references(() => authUsers.id, { onDelete: \"cascade\" }),\n});\n\nexport const authAccounts = pgTable(\"account\", {\n id: text(\"id\").primaryKey(),\n accountId: text(\"account_id\").notNull(),\n providerId: text(\"provider_id\").notNull(),\n userId: text(\"user_id\").notNull().references(() => authUsers.id, { onDelete: \"cascade\" }),\n accessToken: text(\"access_token\"),\n refreshToken: text(\"refresh_token\"),\n idToken: text(\"id_token\"),\n accessTokenExpiresAt: timestamp(\"access_token_expires_at\", { withTimezone: true }),\n refreshTokenExpiresAt: timestamp(\"refresh_token_expires_at\", { withTimezone: true }),\n scope: text(\"scope\"),\n password: text(\"password\"),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull(),\n});\n\nexport const authVerifications = pgTable(\"verification\", {\n id: text(\"id\").primaryKey(),\n identifier: text(\"identifier\").notNull(),\n value: text(\"value\").notNull(),\n expiresAt: timestamp(\"expires_at\", { withTimezone: true }).notNull(),\n createdAt: timestamp(\"created_at\", { withTimezone: true }),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }),\n});\n", "import { pgTable, uuid, text, timestamp, jsonb, uniqueIndex } from \"drizzle-orm/pg-core\";\n\nexport const instanceSettings = pgTable(\n \"instance_settings\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n singletonKey: text(\"singleton_key\").notNull().default(\"default\"),\n general: jsonb(\"general\").$type<Record<string, unknown>>().notNull().default({}),\n experimental: jsonb(\"experimental\").$type<Record<string, unknown>>().notNull().default({}),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull().defaultNow(),\n },\n (table) => ({\n singletonKeyIdx: uniqueIndex(\"instance_settings_singleton_key_idx\").on(table.singletonKey),\n }),\n);\n", "import { pgTable, uuid, text, timestamp, uniqueIndex, index } from \"drizzle-orm/pg-core\";\n\nexport const instanceUserRoles = pgTable(\n \"instance_user_roles\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n userId: text(\"user_id\").notNull(),\n role: text(\"role\").notNull().default(\"instance_admin\"),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull().defaultNow(),\n },\n (table) => ({\n userRoleUniqueIdx: uniqueIndex(\"instance_user_roles_user_role_unique_idx\").on(table.userId, table.role),\n roleIdx: index(\"instance_user_roles_role_idx\").on(table.role),\n }),\n);\n", "import { pgTable, uuid, text, timestamp, index, uniqueIndex } from \"drizzle-orm/pg-core\";\nimport { authUsers } from \"./auth.js\";\n\nexport const boardApiKeys = pgTable(\n \"board_api_keys\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n userId: text(\"user_id\").notNull().references(() => authUsers.id, { onDelete: \"cascade\" }),\n name: text(\"name\").notNull(),\n keyHash: text(\"key_hash\").notNull(),\n lastUsedAt: timestamp(\"last_used_at\", { withTimezone: true }),\n revokedAt: timestamp(\"revoked_at\", { withTimezone: true }),\n expiresAt: timestamp(\"expires_at\", { withTimezone: true }),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n },\n (table) => ({\n keyHashIdx: uniqueIndex(\"board_api_keys_key_hash_idx\").on(table.keyHash),\n userIdx: index(\"board_api_keys_user_idx\").on(table.userId),\n }),\n);\n", "import { pgTable, uuid, text, timestamp, index } from \"drizzle-orm/pg-core\";\nimport { authUsers } from \"./auth.js\";\nimport { companies } from \"./companies.js\";\nimport { boardApiKeys } from \"./board_api_keys.js\";\n\nexport const cliAuthChallenges = pgTable(\n \"cli_auth_challenges\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n secretHash: text(\"secret_hash\").notNull(),\n command: text(\"command\").notNull(),\n clientName: text(\"client_name\"),\n requestedAccess: text(\"requested_access\").notNull().default(\"board\"),\n requestedCompanyId: uuid(\"requested_company_id\").references(() => companies.id, { onDelete: \"set null\" }),\n pendingKeyHash: text(\"pending_key_hash\").notNull(),\n pendingKeyName: text(\"pending_key_name\").notNull(),\n approvedByUserId: text(\"approved_by_user_id\").references(() => authUsers.id, { onDelete: \"set null\" }),\n boardApiKeyId: uuid(\"board_api_key_id\").references(() => boardApiKeys.id, { onDelete: \"set null\" }),\n approvedAt: timestamp(\"approved_at\", { withTimezone: true }),\n cancelledAt: timestamp(\"cancelled_at\", { withTimezone: true }),\n expiresAt: timestamp(\"expires_at\", { withTimezone: true }).notNull(),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull().defaultNow(),\n },\n (table) => ({\n secretHashIdx: index(\"cli_auth_challenges_secret_hash_idx\").on(table.secretHash),\n approvedByIdx: index(\"cli_auth_challenges_approved_by_idx\").on(table.approvedByUserId),\n requestedCompanyIdx: index(\"cli_auth_challenges_requested_company_idx\").on(table.requestedCompanyId),\n }),\n);\n", "import { pgTable, uuid, text, timestamp, uniqueIndex, index } from \"drizzle-orm/pg-core\";\nimport { companies } from \"./companies.js\";\n\nexport const companyMemberships = pgTable(\n \"company_memberships\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n companyId: uuid(\"company_id\").notNull().references(() => companies.id),\n principalType: text(\"principal_type\").notNull(),\n principalId: text(\"principal_id\").notNull(),\n status: text(\"status\").notNull().default(\"active\"),\n membershipRole: text(\"membership_role\"),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull().defaultNow(),\n },\n (table) => ({\n companyPrincipalUniqueIdx: uniqueIndex(\"company_memberships_company_principal_unique_idx\").on(\n table.companyId,\n table.principalType,\n table.principalId,\n ),\n principalStatusIdx: index(\"company_memberships_principal_status_idx\").on(\n table.principalType,\n table.principalId,\n table.status,\n ),\n companyStatusIdx: index(\"company_memberships_company_status_idx\").on(table.companyId, table.status),\n }),\n);\n", "import { pgTable, uuid, text, timestamp, jsonb, uniqueIndex, index } from \"drizzle-orm/pg-core\";\nimport { companies } from \"./companies.js\";\n\nexport const principalPermissionGrants = pgTable(\n \"principal_permission_grants\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n companyId: uuid(\"company_id\").notNull().references(() => companies.id),\n principalType: text(\"principal_type\").notNull(),\n principalId: text(\"principal_id\").notNull(),\n permissionKey: text(\"permission_key\").notNull(),\n scope: jsonb(\"scope\").$type<Record<string, unknown> | null>(),\n grantedByUserId: text(\"granted_by_user_id\"),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull().defaultNow(),\n },\n (table) => ({\n uniqueGrantIdx: uniqueIndex(\"principal_permission_grants_unique_idx\").on(\n table.companyId,\n table.principalType,\n table.principalId,\n table.permissionKey,\n ),\n companyPermissionIdx: index(\"principal_permission_grants_company_permission_idx\").on(\n table.companyId,\n table.permissionKey,\n ),\n }),\n);\n", "import { pgTable, uuid, text, timestamp, jsonb, index, uniqueIndex } from \"drizzle-orm/pg-core\";\nimport { companies } from \"./companies.js\";\n\nexport const invites = pgTable(\n \"invites\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n companyId: uuid(\"company_id\").references(() => companies.id),\n inviteType: text(\"invite_type\").notNull().default(\"company_join\"),\n tokenHash: text(\"token_hash\").notNull(),\n allowedJoinTypes: text(\"allowed_join_types\").notNull().default(\"both\"),\n defaultsPayload: jsonb(\"defaults_payload\").$type<Record<string, unknown> | null>(),\n expiresAt: timestamp(\"expires_at\", { withTimezone: true }).notNull(),\n invitedByUserId: text(\"invited_by_user_id\"),\n revokedAt: timestamp(\"revoked_at\", { withTimezone: true }),\n acceptedAt: timestamp(\"accepted_at\", { withTimezone: true }),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull().defaultNow(),\n },\n (table) => ({\n tokenHashUniqueIdx: uniqueIndex(\"invites_token_hash_unique_idx\").on(table.tokenHash),\n companyInviteStateIdx: index(\"invites_company_invite_state_idx\").on(\n table.companyId,\n table.inviteType,\n table.revokedAt,\n table.expiresAt,\n ),\n }),\n);\n", "import { pgTable, uuid, text, timestamp, jsonb, index, uniqueIndex } from \"drizzle-orm/pg-core\";\nimport { companies } from \"./companies.js\";\nimport { invites } from \"./invites.js\";\nimport { agents } from \"./agents.js\";\n\nexport const joinRequests = pgTable(\n \"join_requests\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n inviteId: uuid(\"invite_id\").notNull().references(() => invites.id),\n companyId: uuid(\"company_id\").notNull().references(() => companies.id),\n requestType: text(\"request_type\").notNull(),\n status: text(\"status\").notNull().default(\"pending_approval\"),\n requestIp: text(\"request_ip\").notNull(),\n requestingUserId: text(\"requesting_user_id\"),\n requestEmailSnapshot: text(\"request_email_snapshot\"),\n agentName: text(\"agent_name\"),\n adapterType: text(\"adapter_type\"),\n capabilities: text(\"capabilities\"),\n agentDefaultsPayload: jsonb(\"agent_defaults_payload\").$type<Record<string, unknown> | null>(),\n claimSecretHash: text(\"claim_secret_hash\"),\n claimSecretExpiresAt: timestamp(\"claim_secret_expires_at\", { withTimezone: true }),\n claimSecretConsumedAt: timestamp(\"claim_secret_consumed_at\", { withTimezone: true }),\n createdAgentId: uuid(\"created_agent_id\").references(() => agents.id),\n approvedByUserId: text(\"approved_by_user_id\"),\n approvedAt: timestamp(\"approved_at\", { withTimezone: true }),\n rejectedByUserId: text(\"rejected_by_user_id\"),\n rejectedAt: timestamp(\"rejected_at\", { withTimezone: true }),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull().defaultNow(),\n },\n (table) => ({\n inviteUniqueIdx: uniqueIndex(\"join_requests_invite_unique_idx\").on(table.inviteId),\n companyStatusTypeCreatedIdx: index(\"join_requests_company_status_type_created_idx\").on(\n table.companyId,\n table.status,\n table.requestType,\n table.createdAt,\n ),\n }),\n);\n", "import { boolean, index, integer, pgTable, text, timestamp, uuid, uniqueIndex } from \"drizzle-orm/pg-core\";\nimport { companies } from \"./companies.js\";\n\nexport const budgetPolicies = pgTable(\n \"budget_policies\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n companyId: uuid(\"company_id\").notNull().references(() => companies.id),\n scopeType: text(\"scope_type\").notNull(),\n scopeId: uuid(\"scope_id\").notNull(),\n metric: text(\"metric\").notNull().default(\"billed_cents\"),\n windowKind: text(\"window_kind\").notNull(),\n amount: integer(\"amount\").notNull().default(0),\n warnPercent: integer(\"warn_percent\").notNull().default(80),\n hardStopEnabled: boolean(\"hard_stop_enabled\").notNull().default(true),\n notifyEnabled: boolean(\"notify_enabled\").notNull().default(true),\n isActive: boolean(\"is_active\").notNull().default(true),\n createdByUserId: text(\"created_by_user_id\"),\n updatedByUserId: text(\"updated_by_user_id\"),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull().defaultNow(),\n },\n (table) => ({\n companyScopeActiveIdx: index(\"budget_policies_company_scope_active_idx\").on(\n table.companyId,\n table.scopeType,\n table.scopeId,\n table.isActive,\n ),\n companyWindowIdx: index(\"budget_policies_company_window_idx\").on(\n table.companyId,\n table.windowKind,\n table.metric,\n ),\n companyScopeMetricUniqueIdx: uniqueIndex(\"budget_policies_company_scope_metric_unique_idx\").on(\n table.companyId,\n table.scopeType,\n table.scopeId,\n table.metric,\n table.windowKind,\n ),\n }),\n);\n", "import { pgTable, uuid, text, timestamp, jsonb, index } from \"drizzle-orm/pg-core\";\nimport { companies } from \"./companies.js\";\nimport { agents } from \"./agents.js\";\n\nexport const approvals = pgTable(\n \"approvals\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n companyId: uuid(\"company_id\").notNull().references(() => companies.id),\n type: text(\"type\").notNull(),\n requestedByAgentId: uuid(\"requested_by_agent_id\").references(() => agents.id),\n requestedByUserId: text(\"requested_by_user_id\"),\n status: text(\"status\").notNull().default(\"pending\"),\n payload: jsonb(\"payload\").$type<Record<string, unknown>>().notNull(),\n decisionNote: text(\"decision_note\"),\n decidedByUserId: text(\"decided_by_user_id\"),\n decidedAt: timestamp(\"decided_at\", { withTimezone: true }),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull().defaultNow(),\n },\n (table) => ({\n companyStatusTypeIdx: index(\"approvals_company_status_type_idx\").on(\n table.companyId,\n table.status,\n table.type,\n ),\n }),\n);\n", "import { sql } from \"drizzle-orm\";\nimport { index, integer, pgTable, text, timestamp, uuid, uniqueIndex } from \"drizzle-orm/pg-core\";\nimport { approvals } from \"./approvals.js\";\nimport { budgetPolicies } from \"./budget_policies.js\";\nimport { companies } from \"./companies.js\";\n\nexport const budgetIncidents = pgTable(\n \"budget_incidents\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n companyId: uuid(\"company_id\").notNull().references(() => companies.id),\n policyId: uuid(\"policy_id\").notNull().references(() => budgetPolicies.id),\n scopeType: text(\"scope_type\").notNull(),\n scopeId: uuid(\"scope_id\").notNull(),\n metric: text(\"metric\").notNull(),\n windowKind: text(\"window_kind\").notNull(),\n windowStart: timestamp(\"window_start\", { withTimezone: true }).notNull(),\n windowEnd: timestamp(\"window_end\", { withTimezone: true }).notNull(),\n thresholdType: text(\"threshold_type\").notNull(),\n amountLimit: integer(\"amount_limit\").notNull(),\n amountObserved: integer(\"amount_observed\").notNull(),\n status: text(\"status\").notNull().default(\"open\"),\n approvalId: uuid(\"approval_id\").references(() => approvals.id),\n resolvedAt: timestamp(\"resolved_at\", { withTimezone: true }),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull().defaultNow(),\n },\n (table) => ({\n companyStatusIdx: index(\"budget_incidents_company_status_idx\").on(table.companyId, table.status),\n companyScopeIdx: index(\"budget_incidents_company_scope_idx\").on(\n table.companyId,\n table.scopeType,\n table.scopeId,\n table.status,\n ),\n policyWindowIdx: uniqueIndex(\"budget_incidents_policy_window_threshold_idx\").on(\n table.policyId,\n table.windowStart,\n table.thresholdType,\n ).where(sql`${table.status} <> 'dismissed'`),\n }),\n);\n", "import { pgTable, uuid, text, timestamp, jsonb, index } from \"drizzle-orm/pg-core\";\nimport { companies } from \"./companies.js\";\nimport { agents } from \"./agents.js\";\n\nexport const agentConfigRevisions = pgTable(\n \"agent_config_revisions\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n companyId: uuid(\"company_id\").notNull().references(() => companies.id),\n agentId: uuid(\"agent_id\").notNull().references(() => agents.id, { onDelete: \"cascade\" }),\n createdByAgentId: uuid(\"created_by_agent_id\").references(() => agents.id, { onDelete: \"set null\" }),\n createdByUserId: text(\"created_by_user_id\"),\n source: text(\"source\").notNull().default(\"patch\"),\n rolledBackFromRevisionId: uuid(\"rolled_back_from_revision_id\"),\n changedKeys: jsonb(\"changed_keys\").$type<string[]>().notNull().default([]),\n beforeConfig: jsonb(\"before_config\").$type<Record<string, unknown>>().notNull(),\n afterConfig: jsonb(\"after_config\").$type<Record<string, unknown>>().notNull(),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n },\n (table) => ({\n companyAgentCreatedIdx: index(\"agent_config_revisions_company_agent_created_idx\").on(\n table.companyId,\n table.agentId,\n table.createdAt,\n ),\n agentCreatedIdx: index(\"agent_config_revisions_agent_created_idx\").on(table.agentId, table.createdAt),\n }),\n);\n", "import { pgTable, uuid, text, timestamp, index } from \"drizzle-orm/pg-core\";\nimport { agents } from \"./agents.js\";\nimport { companies } from \"./companies.js\";\n\nexport const agentApiKeys = pgTable(\n \"agent_api_keys\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n agentId: uuid(\"agent_id\").notNull().references(() => agents.id),\n companyId: uuid(\"company_id\").notNull().references(() => companies.id),\n name: text(\"name\").notNull(),\n keyHash: text(\"key_hash\").notNull(),\n lastUsedAt: timestamp(\"last_used_at\", { withTimezone: true }),\n revokedAt: timestamp(\"revoked_at\", { withTimezone: true }),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n },\n (table) => ({\n keyHashIdx: index(\"agent_api_keys_key_hash_idx\").on(table.keyHash),\n companyAgentIdx: index(\"agent_api_keys_company_agent_idx\").on(table.companyId, table.agentId),\n }),\n);\n", "import { pgTable, uuid, text, timestamp, jsonb, bigint, index } from \"drizzle-orm/pg-core\";\nimport { agents } from \"./agents.js\";\nimport { companies } from \"./companies.js\";\n\nexport const agentRuntimeState = pgTable(\n \"agent_runtime_state\",\n {\n agentId: uuid(\"agent_id\").primaryKey().references(() => agents.id),\n companyId: uuid(\"company_id\").notNull().references(() => companies.id),\n adapterType: text(\"adapter_type\").notNull(),\n sessionId: text(\"session_id\"),\n stateJson: jsonb(\"state_json\").$type<Record<string, unknown>>().notNull().default({}),\n lastRunId: uuid(\"last_run_id\"),\n lastRunStatus: text(\"last_run_status\"),\n totalInputTokens: bigint(\"total_input_tokens\", { mode: \"number\" }).notNull().default(0),\n totalOutputTokens: bigint(\"total_output_tokens\", { mode: \"number\" }).notNull().default(0),\n totalCachedInputTokens: bigint(\"total_cached_input_tokens\", { mode: \"number\" }).notNull().default(0),\n totalCostCents: bigint(\"total_cost_cents\", { mode: \"number\" }).notNull().default(0),\n lastError: text(\"last_error\"),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull().defaultNow(),\n },\n (table) => ({\n companyAgentIdx: index(\"agent_runtime_state_company_agent_idx\").on(table.companyId, table.agentId),\n companyUpdatedIdx: index(\"agent_runtime_state_company_updated_idx\").on(table.companyId, table.updatedAt),\n }),\n);\n\n", "import { pgTable, uuid, text, timestamp, jsonb, integer, index } from \"drizzle-orm/pg-core\";\nimport { companies } from \"./companies.js\";\nimport { agents } from \"./agents.js\";\n\nexport const agentWakeupRequests = pgTable(\n \"agent_wakeup_requests\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n companyId: uuid(\"company_id\").notNull().references(() => companies.id),\n agentId: uuid(\"agent_id\").notNull().references(() => agents.id),\n source: text(\"source\").notNull(),\n triggerDetail: text(\"trigger_detail\"),\n reason: text(\"reason\"),\n payload: jsonb(\"payload\").$type<Record<string, unknown>>(),\n status: text(\"status\").notNull().default(\"queued\"),\n coalescedCount: integer(\"coalesced_count\").notNull().default(0),\n requestedByActorType: text(\"requested_by_actor_type\"),\n requestedByActorId: text(\"requested_by_actor_id\"),\n idempotencyKey: text(\"idempotency_key\"),\n runId: uuid(\"run_id\"),\n requestedAt: timestamp(\"requested_at\", { withTimezone: true }).notNull().defaultNow(),\n claimedAt: timestamp(\"claimed_at\", { withTimezone: true }),\n finishedAt: timestamp(\"finished_at\", { withTimezone: true }),\n error: text(\"error\"),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull().defaultNow(),\n },\n (table) => ({\n companyAgentStatusIdx: index(\"agent_wakeup_requests_company_agent_status_idx\").on(\n table.companyId,\n table.agentId,\n table.status,\n ),\n companyRequestedIdx: index(\"agent_wakeup_requests_company_requested_idx\").on(\n table.companyId,\n table.requestedAt,\n ),\n agentRequestedIdx: index(\"agent_wakeup_requests_agent_requested_idx\").on(table.agentId, table.requestedAt),\n }),\n);\n", "import { type AnyPgColumn, pgTable, uuid, text, timestamp, jsonb, index, integer, bigint, boolean } from \"drizzle-orm/pg-core\";\nimport { companies } from \"./companies.js\";\nimport { agents } from \"./agents.js\";\nimport { agentWakeupRequests } from \"./agent_wakeup_requests.js\";\n\nexport const heartbeatRuns = pgTable(\n \"heartbeat_runs\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n companyId: uuid(\"company_id\").notNull().references(() => companies.id),\n agentId: uuid(\"agent_id\").notNull().references(() => agents.id),\n invocationSource: text(\"invocation_source\").notNull().default(\"on_demand\"),\n triggerDetail: text(\"trigger_detail\"),\n status: text(\"status\").notNull().default(\"queued\"),\n startedAt: timestamp(\"started_at\", { withTimezone: true }),\n finishedAt: timestamp(\"finished_at\", { withTimezone: true }),\n error: text(\"error\"),\n wakeupRequestId: uuid(\"wakeup_request_id\").references(() => agentWakeupRequests.id),\n exitCode: integer(\"exit_code\"),\n signal: text(\"signal\"),\n usageJson: jsonb(\"usage_json\").$type<Record<string, unknown>>(),\n resultJson: jsonb(\"result_json\").$type<Record<string, unknown>>(),\n sessionIdBefore: text(\"session_id_before\"),\n sessionIdAfter: text(\"session_id_after\"),\n logStore: text(\"log_store\"),\n logRef: text(\"log_ref\"),\n logBytes: bigint(\"log_bytes\", { mode: \"number\" }),\n logSha256: text(\"log_sha256\"),\n logCompressed: boolean(\"log_compressed\").notNull().default(false),\n stdoutExcerpt: text(\"stdout_excerpt\"),\n stderrExcerpt: text(\"stderr_excerpt\"),\n errorCode: text(\"error_code\"),\n externalRunId: text(\"external_run_id\"),\n processPid: integer(\"process_pid\"),\n processStartedAt: timestamp(\"process_started_at\", { withTimezone: true }),\n retryOfRunId: uuid(\"retry_of_run_id\").references((): AnyPgColumn => heartbeatRuns.id, {\n onDelete: \"set null\",\n }),\n processLossRetryCount: integer(\"process_loss_retry_count\").notNull().default(0),\n contextSnapshot: jsonb(\"context_snapshot\").$type<Record<string, unknown>>(),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull().defaultNow(),\n },\n (table) => ({\n companyAgentStartedIdx: index(\"heartbeat_runs_company_agent_started_idx\").on(\n table.companyId,\n table.agentId,\n table.startedAt,\n ),\n }),\n);\n", "import { pgTable, uuid, text, timestamp, jsonb, index, uniqueIndex } from \"drizzle-orm/pg-core\";\nimport { companies } from \"./companies.js\";\nimport { agents } from \"./agents.js\";\nimport { heartbeatRuns } from \"./heartbeat_runs.js\";\n\nexport const agentTaskSessions = pgTable(\n \"agent_task_sessions\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n companyId: uuid(\"company_id\").notNull().references(() => companies.id),\n agentId: uuid(\"agent_id\").notNull().references(() => agents.id),\n adapterType: text(\"adapter_type\").notNull(),\n taskKey: text(\"task_key\").notNull(),\n sessionParamsJson: jsonb(\"session_params_json\").$type<Record<string, unknown>>(),\n sessionDisplayId: text(\"session_display_id\"),\n lastRunId: uuid(\"last_run_id\").references(() => heartbeatRuns.id),\n lastError: text(\"last_error\"),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull().defaultNow(),\n },\n (table) => ({\n companyAgentTaskUniqueIdx: uniqueIndex(\"agent_task_sessions_company_agent_adapter_task_uniq\").on(\n table.companyId,\n table.agentId,\n table.adapterType,\n table.taskKey,\n ),\n companyAgentUpdatedIdx: index(\"agent_task_sessions_company_agent_updated_idx\").on(\n table.companyId,\n table.agentId,\n table.updatedAt,\n ),\n companyTaskUpdatedIdx: index(\"agent_task_sessions_company_task_updated_idx\").on(\n table.companyId,\n table.taskKey,\n table.updatedAt,\n ),\n }),\n);\n", "import {\n type AnyPgColumn,\n pgTable,\n uuid,\n text,\n timestamp,\n index,\n} from \"drizzle-orm/pg-core\";\nimport { agents } from \"./agents.js\";\nimport { companies } from \"./companies.js\";\n\nexport const goals = pgTable(\n \"goals\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n companyId: uuid(\"company_id\").notNull().references(() => companies.id),\n title: text(\"title\").notNull(),\n description: text(\"description\"),\n level: text(\"level\").notNull().default(\"task\"),\n status: text(\"status\").notNull().default(\"planned\"),\n parentId: uuid(\"parent_id\").references((): AnyPgColumn => goals.id),\n ownerAgentId: uuid(\"owner_agent_id\").references(() => agents.id),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull().defaultNow(),\n },\n (table) => ({\n companyIdx: index(\"goals_company_idx\").on(table.companyId),\n }),\n);\n", "import { pgTable, uuid, text, timestamp, date, index, jsonb } from \"drizzle-orm/pg-core\";\nimport { companies } from \"./companies.js\";\nimport { goals } from \"./goals.js\";\nimport { agents } from \"./agents.js\";\n\nexport const projects = pgTable(\n \"projects\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n companyId: uuid(\"company_id\").notNull().references(() => companies.id),\n goalId: uuid(\"goal_id\").references(() => goals.id),\n name: text(\"name\").notNull(),\n description: text(\"description\"),\n status: text(\"status\").notNull().default(\"backlog\"),\n leadAgentId: uuid(\"lead_agent_id\").references(() => agents.id),\n targetDate: date(\"target_date\"),\n color: text(\"color\"),\n pauseReason: text(\"pause_reason\"),\n pausedAt: timestamp(\"paused_at\", { withTimezone: true }),\n executionWorkspacePolicy: jsonb(\"execution_workspace_policy\").$type<Record<string, unknown>>(),\n archivedAt: timestamp(\"archived_at\", { withTimezone: true }),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull().defaultNow(),\n },\n (table) => ({\n companyIdx: index(\"projects_company_idx\").on(table.companyId),\n }),\n);\n", "import {\n boolean,\n index,\n jsonb,\n pgTable,\n text,\n timestamp,\n uniqueIndex,\n uuid,\n} from \"drizzle-orm/pg-core\";\nimport { companies } from \"./companies.js\";\nimport { projects } from \"./projects.js\";\n\nexport const projectWorkspaces = pgTable(\n \"project_workspaces\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n companyId: uuid(\"company_id\").notNull().references(() => companies.id),\n projectId: uuid(\"project_id\").notNull().references(() => projects.id, { onDelete: \"cascade\" }),\n name: text(\"name\").notNull(),\n sourceType: text(\"source_type\").notNull().default(\"local_path\"),\n cwd: text(\"cwd\"),\n repoUrl: text(\"repo_url\"),\n repoRef: text(\"repo_ref\"),\n defaultRef: text(\"default_ref\"),\n visibility: text(\"visibility\").notNull().default(\"default\"),\n setupCommand: text(\"setup_command\"),\n cleanupCommand: text(\"cleanup_command\"),\n remoteProvider: text(\"remote_provider\"),\n remoteWorkspaceRef: text(\"remote_workspace_ref\"),\n sharedWorkspaceKey: text(\"shared_workspace_key\"),\n metadata: jsonb(\"metadata\").$type<Record<string, unknown>>(),\n isPrimary: boolean(\"is_primary\").notNull().default(false),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull().defaultNow(),\n },\n (table) => ({\n companyProjectIdx: index(\"project_workspaces_company_project_idx\").on(table.companyId, table.projectId),\n projectPrimaryIdx: index(\"project_workspaces_project_primary_idx\").on(table.projectId, table.isPrimary),\n projectSourceTypeIdx: index(\"project_workspaces_project_source_type_idx\").on(table.projectId, table.sourceType),\n companySharedKeyIdx: index(\"project_workspaces_company_shared_key_idx\").on(table.companyId, table.sharedWorkspaceKey),\n projectRemoteRefIdx: uniqueIndex(\"project_workspaces_project_remote_ref_idx\")\n .on(table.projectId, table.remoteProvider, table.remoteWorkspaceRef),\n }),\n);\n", "import { sql } from \"drizzle-orm\";\nimport {\n type AnyPgColumn,\n pgTable,\n uuid,\n text,\n timestamp,\n integer,\n jsonb,\n index,\n uniqueIndex,\n} from \"drizzle-orm/pg-core\";\nimport { agents } from \"./agents.js\";\nimport { projects } from \"./projects.js\";\nimport { goals } from \"./goals.js\";\nimport { companies } from \"./companies.js\";\nimport { heartbeatRuns } from \"./heartbeat_runs.js\";\nimport { projectWorkspaces } from \"./project_workspaces.js\";\nimport { executionWorkspaces } from \"./execution_workspaces.js\";\n\nexport const issues = pgTable(\n \"issues\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n companyId: uuid(\"company_id\").notNull().references(() => companies.id),\n projectId: uuid(\"project_id\").references(() => projects.id),\n projectWorkspaceId: uuid(\"project_workspace_id\").references(() => projectWorkspaces.id, { onDelete: \"set null\" }),\n goalId: uuid(\"goal_id\").references(() => goals.id),\n parentId: uuid(\"parent_id\").references((): AnyPgColumn => issues.id),\n title: text(\"title\").notNull(),\n description: text(\"description\"),\n status: text(\"status\").notNull().default(\"backlog\"),\n priority: text(\"priority\").notNull().default(\"medium\"),\n assigneeAgentId: uuid(\"assignee_agent_id\").references(() => agents.id),\n assigneeUserId: text(\"assignee_user_id\"),\n checkoutRunId: uuid(\"checkout_run_id\").references(() => heartbeatRuns.id, { onDelete: \"set null\" }),\n executionRunId: uuid(\"execution_run_id\").references(() => heartbeatRuns.id, { onDelete: \"set null\" }),\n executionAgentNameKey: text(\"execution_agent_name_key\"),\n executionLockedAt: timestamp(\"execution_locked_at\", { withTimezone: true }),\n createdByAgentId: uuid(\"created_by_agent_id\").references(() => agents.id),\n createdByUserId: text(\"created_by_user_id\"),\n issueNumber: integer(\"issue_number\"),\n identifier: text(\"identifier\"),\n originKind: text(\"origin_kind\").notNull().default(\"manual\"),\n originId: text(\"origin_id\"),\n originRunId: text(\"origin_run_id\"),\n requestDepth: integer(\"request_depth\").notNull().default(0),\n billingCode: text(\"billing_code\"),\n assigneeAdapterOverrides: jsonb(\"assignee_adapter_overrides\").$type<Record<string, unknown>>(),\n executionWorkspaceId: uuid(\"execution_workspace_id\")\n .references((): AnyPgColumn => executionWorkspaces.id, { onDelete: \"set null\" }),\n executionWorkspacePreference: text(\"execution_workspace_preference\"),\n executionWorkspaceSettings: jsonb(\"execution_workspace_settings\").$type<Record<string, unknown>>(),\n startedAt: timestamp(\"started_at\", { withTimezone: true }),\n completedAt: timestamp(\"completed_at\", { withTimezone: true }),\n cancelledAt: timestamp(\"cancelled_at\", { withTimezone: true }),\n hiddenAt: timestamp(\"hidden_at\", { withTimezone: true }),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull().defaultNow(),\n },\n (table) => ({\n companyStatusIdx: index(\"issues_company_status_idx\").on(table.companyId, table.status),\n assigneeStatusIdx: index(\"issues_company_assignee_status_idx\").on(\n table.companyId,\n table.assigneeAgentId,\n table.status,\n ),\n assigneeUserStatusIdx: index(\"issues_company_assignee_user_status_idx\").on(\n table.companyId,\n table.assigneeUserId,\n table.status,\n ),\n parentIdx: index(\"issues_company_parent_idx\").on(table.companyId, table.parentId),\n projectIdx: index(\"issues_company_project_idx\").on(table.companyId, table.projectId),\n originIdx: index(\"issues_company_origin_idx\").on(table.companyId, table.originKind, table.originId),\n projectWorkspaceIdx: index(\"issues_company_project_workspace_idx\").on(table.companyId, table.projectWorkspaceId),\n executionWorkspaceIdx: index(\"issues_company_execution_workspace_idx\").on(table.companyId, table.executionWorkspaceId),\n identifierIdx: uniqueIndex(\"issues_identifier_idx\").on(table.identifier),\n openRoutineExecutionIdx: uniqueIndex(\"issues_open_routine_execution_uq\")\n .on(table.companyId, table.originKind, table.originId)\n .where(\n sql`${table.originKind} = 'routine_execution'\n and ${table.originId} is not null\n and ${table.hiddenAt} is null\n and ${table.executionRunId} is not null\n and ${table.status} in ('backlog', 'todo', 'in_progress', 'in_review', 'blocked')`,\n ),\n }),\n);\n", "import {\n type AnyPgColumn,\n index,\n jsonb,\n pgTable,\n text,\n timestamp,\n uuid,\n} from \"drizzle-orm/pg-core\";\nimport { companies } from \"./companies.js\";\nimport { issues } from \"./issues.js\";\nimport { projectWorkspaces } from \"./project_workspaces.js\";\nimport { projects } from \"./projects.js\";\n\nexport const executionWorkspaces = pgTable(\n \"execution_workspaces\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n companyId: uuid(\"company_id\").notNull().references(() => companies.id),\n projectId: uuid(\"project_id\").notNull().references(() => projects.id, { onDelete: \"cascade\" }),\n projectWorkspaceId: uuid(\"project_workspace_id\").references(() => projectWorkspaces.id, { onDelete: \"set null\" }),\n sourceIssueId: uuid(\"source_issue_id\").references((): AnyPgColumn => issues.id, { onDelete: \"set null\" }),\n mode: text(\"mode\").notNull(),\n strategyType: text(\"strategy_type\").notNull(),\n name: text(\"name\").notNull(),\n status: text(\"status\").notNull().default(\"active\"),\n cwd: text(\"cwd\"),\n repoUrl: text(\"repo_url\"),\n baseRef: text(\"base_ref\"),\n branchName: text(\"branch_name\"),\n providerType: text(\"provider_type\").notNull().default(\"local_fs\"),\n providerRef: text(\"provider_ref\"),\n derivedFromExecutionWorkspaceId: uuid(\"derived_from_execution_workspace_id\")\n .references((): AnyPgColumn => executionWorkspaces.id, { onDelete: \"set null\" }),\n lastUsedAt: timestamp(\"last_used_at\", { withTimezone: true }).notNull().defaultNow(),\n openedAt: timestamp(\"opened_at\", { withTimezone: true }).notNull().defaultNow(),\n closedAt: timestamp(\"closed_at\", { withTimezone: true }),\n cleanupEligibleAt: timestamp(\"cleanup_eligible_at\", { withTimezone: true }),\n cleanupReason: text(\"cleanup_reason\"),\n metadata: jsonb(\"metadata\").$type<Record<string, unknown>>(),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull().defaultNow(),\n },\n (table) => ({\n companyProjectStatusIdx: index(\"execution_workspaces_company_project_status_idx\").on(\n table.companyId,\n table.projectId,\n table.status,\n ),\n companyProjectWorkspaceStatusIdx: index(\"execution_workspaces_company_project_workspace_status_idx\").on(\n table.companyId,\n table.projectWorkspaceId,\n table.status,\n ),\n companySourceIssueIdx: index(\"execution_workspaces_company_source_issue_idx\").on(\n table.companyId,\n table.sourceIssueId,\n ),\n companyLastUsedIdx: index(\"execution_workspaces_company_last_used_idx\").on(\n table.companyId,\n table.lastUsedAt,\n ),\n companyBranchIdx: index(\"execution_workspaces_company_branch_idx\").on(\n table.companyId,\n table.branchName,\n ),\n }),\n);\n", "import {\n bigint,\n boolean,\n index,\n integer,\n jsonb,\n pgTable,\n text,\n timestamp,\n uuid,\n} from \"drizzle-orm/pg-core\";\nimport { companies } from \"./companies.js\";\nimport { executionWorkspaces } from \"./execution_workspaces.js\";\nimport { heartbeatRuns } from \"./heartbeat_runs.js\";\n\nexport const workspaceOperations = pgTable(\n \"workspace_operations\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n companyId: uuid(\"company_id\").notNull().references(() => companies.id),\n executionWorkspaceId: uuid(\"execution_workspace_id\").references(() => executionWorkspaces.id, {\n onDelete: \"set null\",\n }),\n heartbeatRunId: uuid(\"heartbeat_run_id\").references(() => heartbeatRuns.id, {\n onDelete: \"set null\",\n }),\n phase: text(\"phase\").notNull(),\n command: text(\"command\"),\n cwd: text(\"cwd\"),\n status: text(\"status\").notNull().default(\"running\"),\n exitCode: integer(\"exit_code\"),\n logStore: text(\"log_store\"),\n logRef: text(\"log_ref\"),\n logBytes: bigint(\"log_bytes\", { mode: \"number\" }),\n logSha256: text(\"log_sha256\"),\n logCompressed: boolean(\"log_compressed\").notNull().default(false),\n stdoutExcerpt: text(\"stdout_excerpt\"),\n stderrExcerpt: text(\"stderr_excerpt\"),\n metadata: jsonb(\"metadata\").$type<Record<string, unknown>>(),\n startedAt: timestamp(\"started_at\", { withTimezone: true }).notNull().defaultNow(),\n finishedAt: timestamp(\"finished_at\", { withTimezone: true }),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull().defaultNow(),\n },\n (table) => ({\n companyRunStartedIdx: index(\"workspace_operations_company_run_started_idx\").on(\n table.companyId,\n table.heartbeatRunId,\n table.startedAt,\n ),\n companyWorkspaceStartedIdx: index(\"workspace_operations_company_workspace_started_idx\").on(\n table.companyId,\n table.executionWorkspaceId,\n table.startedAt,\n ),\n }),\n);\n", "import {\n index,\n integer,\n jsonb,\n pgTable,\n text,\n timestamp,\n uuid,\n} from \"drizzle-orm/pg-core\";\nimport { companies } from \"./companies.js\";\nimport { projects } from \"./projects.js\";\nimport { projectWorkspaces } from \"./project_workspaces.js\";\nimport { executionWorkspaces } from \"./execution_workspaces.js\";\nimport { issues } from \"./issues.js\";\nimport { agents } from \"./agents.js\";\nimport { heartbeatRuns } from \"./heartbeat_runs.js\";\n\nexport const workspaceRuntimeServices = pgTable(\n \"workspace_runtime_services\",\n {\n id: uuid(\"id\").primaryKey(),\n companyId: uuid(\"company_id\").notNull().references(() => companies.id),\n projectId: uuid(\"project_id\").references(() => projects.id, { onDelete: \"set null\" }),\n projectWorkspaceId: uuid(\"project_workspace_id\").references(() => projectWorkspaces.id, { onDelete: \"set null\" }),\n executionWorkspaceId: uuid(\"execution_workspace_id\").references(() => executionWorkspaces.id, { onDelete: \"set null\" }),\n issueId: uuid(\"issue_id\").references(() => issues.id, { onDelete: \"set null\" }),\n scopeType: text(\"scope_type\").notNull(),\n scopeId: text(\"scope_id\"),\n serviceName: text(\"service_name\").notNull(),\n status: text(\"status\").notNull(),\n lifecycle: text(\"lifecycle\").notNull(),\n reuseKey: text(\"reuse_key\"),\n command: text(\"command\"),\n cwd: text(\"cwd\"),\n port: integer(\"port\"),\n url: text(\"url\"),\n provider: text(\"provider\").notNull(),\n providerRef: text(\"provider_ref\"),\n ownerAgentId: uuid(\"owner_agent_id\").references(() => agents.id, { onDelete: \"set null\" }),\n startedByRunId: uuid(\"started_by_run_id\").references(() => heartbeatRuns.id, { onDelete: \"set null\" }),\n lastUsedAt: timestamp(\"last_used_at\", { withTimezone: true }).notNull().defaultNow(),\n startedAt: timestamp(\"started_at\", { withTimezone: true }).notNull().defaultNow(),\n stoppedAt: timestamp(\"stopped_at\", { withTimezone: true }),\n stopPolicy: jsonb(\"stop_policy\").$type<Record<string, unknown>>(),\n healthStatus: text(\"health_status\").notNull().default(\"unknown\"),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull().defaultNow(),\n },\n (table) => ({\n companyWorkspaceStatusIdx: index(\"workspace_runtime_services_company_workspace_status_idx\").on(\n table.companyId,\n table.projectWorkspaceId,\n table.status,\n ),\n companyExecutionWorkspaceStatusIdx: index(\"workspace_runtime_services_company_execution_workspace_status_idx\").on(\n table.companyId,\n table.executionWorkspaceId,\n table.status,\n ),\n companyProjectStatusIdx: index(\"workspace_runtime_services_company_project_status_idx\").on(\n table.companyId,\n table.projectId,\n table.status,\n ),\n runIdx: index(\"workspace_runtime_services_run_idx\").on(table.startedByRunId),\n companyUpdatedIdx: index(\"workspace_runtime_services_company_updated_idx\").on(\n table.companyId,\n table.updatedAt,\n ),\n }),\n);\n", "import { pgTable, uuid, timestamp, index, primaryKey } from \"drizzle-orm/pg-core\";\nimport { companies } from \"./companies.js\";\nimport { projects } from \"./projects.js\";\nimport { goals } from \"./goals.js\";\n\nexport const projectGoals = pgTable(\n \"project_goals\",\n {\n projectId: uuid(\"project_id\").notNull().references(() => projects.id, { onDelete: \"cascade\" }),\n goalId: uuid(\"goal_id\").notNull().references(() => goals.id, { onDelete: \"cascade\" }),\n companyId: uuid(\"company_id\").notNull().references(() => companies.id),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull().defaultNow(),\n },\n (table) => ({\n pk: primaryKey({ columns: [table.projectId, table.goalId] }),\n projectIdx: index(\"project_goals_project_idx\").on(table.projectId),\n goalIdx: index(\"project_goals_goal_idx\").on(table.goalId),\n companyIdx: index(\"project_goals_company_idx\").on(table.companyId),\n }),\n);\n", "import { pgTable, uuid, text, timestamp, integer, index, uniqueIndex } from \"drizzle-orm/pg-core\";\nimport { companies } from \"./companies.js\";\nimport { agents } from \"./agents.js\";\n\nexport const companySecrets = pgTable(\n \"company_secrets\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n companyId: uuid(\"company_id\").notNull().references(() => companies.id),\n name: text(\"name\").notNull(),\n provider: text(\"provider\").notNull().default(\"local_encrypted\"),\n externalRef: text(\"external_ref\"),\n latestVersion: integer(\"latest_version\").notNull().default(1),\n description: text(\"description\"),\n createdByAgentId: uuid(\"created_by_agent_id\").references(() => agents.id, { onDelete: \"set null\" }),\n createdByUserId: text(\"created_by_user_id\"),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull().defaultNow(),\n },\n (table) => ({\n companyIdx: index(\"company_secrets_company_idx\").on(table.companyId),\n companyProviderIdx: index(\"company_secrets_company_provider_idx\").on(table.companyId, table.provider),\n companyNameUq: uniqueIndex(\"company_secrets_company_name_uq\").on(table.companyId, table.name),\n }),\n);\n", "import {\n boolean,\n index,\n integer,\n jsonb,\n pgTable,\n text,\n timestamp,\n uniqueIndex,\n uuid,\n} from \"drizzle-orm/pg-core\";\nimport { agents } from \"./agents.js\";\nimport { companies } from \"./companies.js\";\nimport { companySecrets } from \"./company_secrets.js\";\nimport { issues } from \"./issues.js\";\nimport { projects } from \"./projects.js\";\nimport { goals } from \"./goals.js\";\nimport type { RoutineVariable } from \"@paperclipai/shared\";\n\nexport const routines = pgTable(\n \"routines\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n companyId: uuid(\"company_id\").notNull().references(() => companies.id, { onDelete: \"cascade\" }),\n projectId: uuid(\"project_id\").notNull().references(() => projects.id, { onDelete: \"cascade\" }),\n goalId: uuid(\"goal_id\").references(() => goals.id, { onDelete: \"set null\" }),\n parentIssueId: uuid(\"parent_issue_id\").references(() => issues.id, { onDelete: \"set null\" }),\n title: text(\"title\").notNull(),\n description: text(\"description\"),\n assigneeAgentId: uuid(\"assignee_agent_id\").notNull().references(() => agents.id),\n priority: text(\"priority\").notNull().default(\"medium\"),\n status: text(\"status\").notNull().default(\"active\"),\n concurrencyPolicy: text(\"concurrency_policy\").notNull().default(\"coalesce_if_active\"),\n catchUpPolicy: text(\"catch_up_policy\").notNull().default(\"skip_missed\"),\n variables: jsonb(\"variables\").$type<RoutineVariable[]>().notNull().default([]),\n createdByAgentId: uuid(\"created_by_agent_id\").references(() => agents.id, { onDelete: \"set null\" }),\n createdByUserId: text(\"created_by_user_id\"),\n updatedByAgentId: uuid(\"updated_by_agent_id\").references(() => agents.id, { onDelete: \"set null\" }),\n updatedByUserId: text(\"updated_by_user_id\"),\n lastTriggeredAt: timestamp(\"last_triggered_at\", { withTimezone: true }),\n lastEnqueuedAt: timestamp(\"last_enqueued_at\", { withTimezone: true }),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull().defaultNow(),\n },\n (table) => ({\n companyStatusIdx: index(\"routines_company_status_idx\").on(table.companyId, table.status),\n companyAssigneeIdx: index(\"routines_company_assignee_idx\").on(table.companyId, table.assigneeAgentId),\n companyProjectIdx: index(\"routines_company_project_idx\").on(table.companyId, table.projectId),\n }),\n);\n\nexport const routineTriggers = pgTable(\n \"routine_triggers\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n companyId: uuid(\"company_id\").notNull().references(() => companies.id, { onDelete: \"cascade\" }),\n routineId: uuid(\"routine_id\").notNull().references(() => routines.id, { onDelete: \"cascade\" }),\n kind: text(\"kind\").notNull(),\n label: text(\"label\"),\n enabled: boolean(\"enabled\").notNull().default(true),\n cronExpression: text(\"cron_expression\"),\n timezone: text(\"timezone\"),\n nextRunAt: timestamp(\"next_run_at\", { withTimezone: true }),\n lastFiredAt: timestamp(\"last_fired_at\", { withTimezone: true }),\n publicId: text(\"public_id\"),\n secretId: uuid(\"secret_id\").references(() => companySecrets.id, { onDelete: \"set null\" }),\n signingMode: text(\"signing_mode\"),\n replayWindowSec: integer(\"replay_window_sec\"),\n lastRotatedAt: timestamp(\"last_rotated_at\", { withTimezone: true }),\n lastResult: text(\"last_result\"),\n createdByAgentId: uuid(\"created_by_agent_id\").references(() => agents.id, { onDelete: \"set null\" }),\n createdByUserId: text(\"created_by_user_id\"),\n updatedByAgentId: uuid(\"updated_by_agent_id\").references(() => agents.id, { onDelete: \"set null\" }),\n updatedByUserId: text(\"updated_by_user_id\"),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull().defaultNow(),\n },\n (table) => ({\n companyRoutineIdx: index(\"routine_triggers_company_routine_idx\").on(table.companyId, table.routineId),\n companyKindIdx: index(\"routine_triggers_company_kind_idx\").on(table.companyId, table.kind),\n nextRunIdx: index(\"routine_triggers_next_run_idx\").on(table.nextRunAt),\n publicIdIdx: index(\"routine_triggers_public_id_idx\").on(table.publicId),\n publicIdUq: uniqueIndex(\"routine_triggers_public_id_uq\").on(table.publicId),\n }),\n);\n\nexport const routineRuns = pgTable(\n \"routine_runs\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n companyId: uuid(\"company_id\").notNull().references(() => companies.id, { onDelete: \"cascade\" }),\n routineId: uuid(\"routine_id\").notNull().references(() => routines.id, { onDelete: \"cascade\" }),\n triggerId: uuid(\"trigger_id\").references(() => routineTriggers.id, { onDelete: \"set null\" }),\n source: text(\"source\").notNull(),\n status: text(\"status\").notNull().default(\"received\"),\n triggeredAt: timestamp(\"triggered_at\", { withTimezone: true }).notNull().defaultNow(),\n idempotencyKey: text(\"idempotency_key\"),\n triggerPayload: jsonb(\"trigger_payload\").$type<Record<string, unknown>>(),\n linkedIssueId: uuid(\"linked_issue_id\").references(() => issues.id, { onDelete: \"set null\" }),\n coalescedIntoRunId: uuid(\"coalesced_into_run_id\"),\n failureReason: text(\"failure_reason\"),\n completedAt: timestamp(\"completed_at\", { withTimezone: true }),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull().defaultNow(),\n },\n (table) => ({\n companyRoutineIdx: index(\"routine_runs_company_routine_idx\").on(table.companyId, table.routineId, table.createdAt),\n triggerIdx: index(\"routine_runs_trigger_idx\").on(table.triggerId, table.createdAt),\n linkedIssueIdx: index(\"routine_runs_linked_issue_idx\").on(table.linkedIssueId),\n idempotencyIdx: index(\"routine_runs_trigger_idempotency_idx\").on(table.triggerId, table.idempotencyKey),\n }),\n);\n", "import {\n boolean,\n index,\n jsonb,\n pgTable,\n text,\n timestamp,\n uuid,\n} from \"drizzle-orm/pg-core\";\nimport { companies } from \"./companies.js\";\nimport { executionWorkspaces } from \"./execution_workspaces.js\";\nimport { heartbeatRuns } from \"./heartbeat_runs.js\";\nimport { issues } from \"./issues.js\";\nimport { projects } from \"./projects.js\";\nimport { workspaceRuntimeServices } from \"./workspace_runtime_services.js\";\n\nexport const issueWorkProducts = pgTable(\n \"issue_work_products\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n companyId: uuid(\"company_id\").notNull().references(() => companies.id),\n projectId: uuid(\"project_id\").references(() => projects.id, { onDelete: \"set null\" }),\n issueId: uuid(\"issue_id\").notNull().references(() => issues.id, { onDelete: \"cascade\" }),\n executionWorkspaceId: uuid(\"execution_workspace_id\")\n .references(() => executionWorkspaces.id, { onDelete: \"set null\" }),\n runtimeServiceId: uuid(\"runtime_service_id\")\n .references(() => workspaceRuntimeServices.id, { onDelete: \"set null\" }),\n type: text(\"type\").notNull(),\n provider: text(\"provider\").notNull(),\n externalId: text(\"external_id\"),\n title: text(\"title\").notNull(),\n url: text(\"url\"),\n status: text(\"status\").notNull(),\n reviewState: text(\"review_state\").notNull().default(\"none\"),\n isPrimary: boolean(\"is_primary\").notNull().default(false),\n healthStatus: text(\"health_status\").notNull().default(\"unknown\"),\n summary: text(\"summary\"),\n metadata: jsonb(\"metadata\").$type<Record<string, unknown>>(),\n createdByRunId: uuid(\"created_by_run_id\").references(() => heartbeatRuns.id, { onDelete: \"set null\" }),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull().defaultNow(),\n },\n (table) => ({\n companyIssueTypeIdx: index(\"issue_work_products_company_issue_type_idx\").on(\n table.companyId,\n table.issueId,\n table.type,\n ),\n companyExecutionWorkspaceTypeIdx: index(\"issue_work_products_company_execution_workspace_type_idx\").on(\n table.companyId,\n table.executionWorkspaceId,\n table.type,\n ),\n companyProviderExternalIdIdx: index(\"issue_work_products_company_provider_external_id_idx\").on(\n table.companyId,\n table.provider,\n table.externalId,\n ),\n companyUpdatedIdx: index(\"issue_work_products_company_updated_idx\").on(\n table.companyId,\n table.updatedAt,\n ),\n }),\n);\n", "import { pgTable, uuid, text, timestamp, index, uniqueIndex } from \"drizzle-orm/pg-core\";\nimport { companies } from \"./companies.js\";\n\nexport const labels = pgTable(\n \"labels\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n companyId: uuid(\"company_id\").notNull().references(() => companies.id, { onDelete: \"cascade\" }),\n name: text(\"name\").notNull(),\n color: text(\"color\").notNull(),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull().defaultNow(),\n },\n (table) => ({\n companyIdx: index(\"labels_company_idx\").on(table.companyId),\n companyNameIdx: uniqueIndex(\"labels_company_name_idx\").on(table.companyId, table.name),\n }),\n);\n", "import { pgTable, uuid, timestamp, index, primaryKey } from \"drizzle-orm/pg-core\";\nimport { companies } from \"./companies.js\";\nimport { issues } from \"./issues.js\";\nimport { labels } from \"./labels.js\";\n\nexport const issueLabels = pgTable(\n \"issue_labels\",\n {\n issueId: uuid(\"issue_id\").notNull().references(() => issues.id, { onDelete: \"cascade\" }),\n labelId: uuid(\"label_id\").notNull().references(() => labels.id, { onDelete: \"cascade\" }),\n companyId: uuid(\"company_id\").notNull().references(() => companies.id, { onDelete: \"cascade\" }),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n },\n (table) => ({\n pk: primaryKey({ columns: [table.issueId, table.labelId], name: \"issue_labels_pk\" }),\n issueIdx: index(\"issue_labels_issue_idx\").on(table.issueId),\n labelIdx: index(\"issue_labels_label_idx\").on(table.labelId),\n companyIdx: index(\"issue_labels_company_idx\").on(table.companyId),\n }),\n);\n", "import { pgTable, uuid, text, timestamp, index, primaryKey } from \"drizzle-orm/pg-core\";\nimport { companies } from \"./companies.js\";\nimport { issues } from \"./issues.js\";\nimport { approvals } from \"./approvals.js\";\nimport { agents } from \"./agents.js\";\n\nexport const issueApprovals = pgTable(\n \"issue_approvals\",\n {\n companyId: uuid(\"company_id\").notNull().references(() => companies.id),\n issueId: uuid(\"issue_id\").notNull().references(() => issues.id, { onDelete: \"cascade\" }),\n approvalId: uuid(\"approval_id\").notNull().references(() => approvals.id, { onDelete: \"cascade\" }),\n linkedByAgentId: uuid(\"linked_by_agent_id\").references(() => agents.id, { onDelete: \"set null\" }),\n linkedByUserId: text(\"linked_by_user_id\"),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n },\n (table) => ({\n pk: primaryKey({ columns: [table.issueId, table.approvalId], name: \"issue_approvals_pk\" }),\n issueIdx: index(\"issue_approvals_issue_idx\").on(table.issueId),\n approvalIdx: index(\"issue_approvals_approval_idx\").on(table.approvalId),\n companyIdx: index(\"issue_approvals_company_idx\").on(table.companyId),\n }),\n);\n", "import { pgTable, uuid, text, timestamp, index } from \"drizzle-orm/pg-core\";\nimport { companies } from \"./companies.js\";\nimport { issues } from \"./issues.js\";\nimport { agents } from \"./agents.js\";\nimport { heartbeatRuns } from \"./heartbeat_runs.js\";\n\nexport const issueComments = pgTable(\n \"issue_comments\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n companyId: uuid(\"company_id\").notNull().references(() => companies.id),\n issueId: uuid(\"issue_id\").notNull().references(() => issues.id),\n authorAgentId: uuid(\"author_agent_id\").references(() => agents.id),\n authorUserId: text(\"author_user_id\"),\n createdByRunId: uuid(\"created_by_run_id\").references(() => heartbeatRuns.id, { onDelete: \"set null\" }),\n body: text(\"body\").notNull(),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull().defaultNow(),\n },\n (table) => ({\n issueIdx: index(\"issue_comments_issue_idx\").on(table.issueId),\n companyIdx: index(\"issue_comments_company_idx\").on(table.companyId),\n companyIssueCreatedAtIdx: index(\"issue_comments_company_issue_created_at_idx\").on(\n table.companyId,\n table.issueId,\n table.createdAt,\n ),\n companyAuthorIssueCreatedAtIdx: index(\"issue_comments_company_author_issue_created_at_idx\").on(\n table.companyId,\n table.authorUserId,\n table.issueId,\n table.createdAt,\n ),\n }),\n);\n", "import { pgTable, uuid, text, timestamp, index, uniqueIndex } from \"drizzle-orm/pg-core\";\nimport { companies } from \"./companies.js\";\nimport { issues } from \"./issues.js\";\n\nexport const issueInboxArchives = pgTable(\n \"issue_inbox_archives\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n companyId: uuid(\"company_id\").notNull().references(() => companies.id),\n issueId: uuid(\"issue_id\").notNull().references(() => issues.id),\n userId: text(\"user_id\").notNull(),\n archivedAt: timestamp(\"archived_at\", { withTimezone: true }).notNull().defaultNow(),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull().defaultNow(),\n },\n (table) => ({\n companyIssueIdx: index(\"issue_inbox_archives_company_issue_idx\").on(table.companyId, table.issueId),\n companyUserIdx: index(\"issue_inbox_archives_company_user_idx\").on(table.companyId, table.userId),\n companyIssueUserUnique: uniqueIndex(\"issue_inbox_archives_company_issue_user_idx\").on(\n table.companyId,\n table.issueId,\n table.userId,\n ),\n }),\n);\n", "import { boolean, index, jsonb, pgTable, text, timestamp, uniqueIndex, uuid } from \"drizzle-orm/pg-core\";\nimport { companies } from \"./companies.js\";\nimport { issues } from \"./issues.js\";\n\nexport const feedbackVotes = pgTable(\n \"feedback_votes\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n companyId: uuid(\"company_id\").notNull().references(() => companies.id),\n issueId: uuid(\"issue_id\").notNull().references(() => issues.id),\n targetType: text(\"target_type\").notNull(),\n targetId: text(\"target_id\").notNull(),\n authorUserId: text(\"author_user_id\").notNull(),\n vote: text(\"vote\").notNull(),\n reason: text(\"reason\"),\n sharedWithLabs: boolean(\"shared_with_labs\").notNull().default(false),\n sharedAt: timestamp(\"shared_at\", { withTimezone: true }),\n consentVersion: text(\"consent_version\"),\n redactionSummary: jsonb(\"redaction_summary\"),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull().defaultNow(),\n },\n (table) => ({\n companyIssueIdx: index(\"feedback_votes_company_issue_idx\").on(table.companyId, table.issueId),\n issueTargetIdx: index(\"feedback_votes_issue_target_idx\").on(table.issueId, table.targetType, table.targetId),\n authorIdx: index(\"feedback_votes_author_idx\").on(table.authorUserId, table.createdAt),\n companyTargetAuthorUniqueIdx: uniqueIndex(\"feedback_votes_company_target_author_idx\").on(\n table.companyId,\n table.targetType,\n table.targetId,\n table.authorUserId,\n ),\n }),\n);\n", "import { index, integer, jsonb, pgTable, text, timestamp, uniqueIndex, uuid } from \"drizzle-orm/pg-core\";\nimport { companies } from \"./companies.js\";\nimport { feedbackVotes } from \"./feedback_votes.js\";\nimport { issues } from \"./issues.js\";\nimport { projects } from \"./projects.js\";\n\nexport const feedbackExports = pgTable(\n \"feedback_exports\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n companyId: uuid(\"company_id\").notNull().references(() => companies.id),\n feedbackVoteId: uuid(\"feedback_vote_id\").notNull().references(() => feedbackVotes.id, { onDelete: \"cascade\" }),\n issueId: uuid(\"issue_id\").notNull().references(() => issues.id, { onDelete: \"cascade\" }),\n projectId: uuid(\"project_id\").references(() => projects.id, { onDelete: \"set null\" }),\n authorUserId: text(\"author_user_id\").notNull(),\n targetType: text(\"target_type\").notNull(),\n targetId: text(\"target_id\").notNull(),\n vote: text(\"vote\").notNull(),\n status: text(\"status\").notNull().default(\"local_only\"),\n destination: text(\"destination\"),\n exportId: text(\"export_id\"),\n consentVersion: text(\"consent_version\"),\n schemaVersion: text(\"schema_version\").notNull().default(\"paperclip-feedback-envelope-v2\"),\n bundleVersion: text(\"bundle_version\").notNull().default(\"paperclip-feedback-bundle-v2\"),\n payloadVersion: text(\"payload_version\").notNull().default(\"paperclip-feedback-v1\"),\n payloadDigest: text(\"payload_digest\"),\n payloadSnapshot: jsonb(\"payload_snapshot\"),\n targetSummary: jsonb(\"target_summary\").notNull(),\n redactionSummary: jsonb(\"redaction_summary\"),\n attemptCount: integer(\"attempt_count\").notNull().default(0),\n lastAttemptedAt: timestamp(\"last_attempted_at\", { withTimezone: true }),\n exportedAt: timestamp(\"exported_at\", { withTimezone: true }),\n failureReason: text(\"failure_reason\"),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull().defaultNow(),\n },\n (table) => ({\n voteUniqueIdx: uniqueIndex(\"feedback_exports_feedback_vote_idx\").on(table.feedbackVoteId),\n companyCreatedIdx: index(\"feedback_exports_company_created_idx\").on(table.companyId, table.createdAt),\n companyStatusIdx: index(\"feedback_exports_company_status_idx\").on(table.companyId, table.status, table.createdAt),\n companyIssueIdx: index(\"feedback_exports_company_issue_idx\").on(table.companyId, table.issueId, table.createdAt),\n companyProjectIdx: index(\"feedback_exports_company_project_idx\").on(table.companyId, table.projectId, table.createdAt),\n companyAuthorIdx: index(\"feedback_exports_company_author_idx\").on(table.companyId, table.authorUserId, table.createdAt),\n }),\n);\n", "import { pgTable, uuid, text, timestamp, index, uniqueIndex } from \"drizzle-orm/pg-core\";\nimport { companies } from \"./companies.js\";\nimport { issues } from \"./issues.js\";\n\nexport const issueReadStates = pgTable(\n \"issue_read_states\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n companyId: uuid(\"company_id\").notNull().references(() => companies.id),\n issueId: uuid(\"issue_id\").notNull().references(() => issues.id),\n userId: text(\"user_id\").notNull(),\n lastReadAt: timestamp(\"last_read_at\", { withTimezone: true }).notNull().defaultNow(),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull().defaultNow(),\n },\n (table) => ({\n companyIssueIdx: index(\"issue_read_states_company_issue_idx\").on(table.companyId, table.issueId),\n companyUserIdx: index(\"issue_read_states_company_user_idx\").on(table.companyId, table.userId),\n companyIssueUserUnique: uniqueIndex(\"issue_read_states_company_issue_user_idx\").on(\n table.companyId,\n table.issueId,\n table.userId,\n ),\n }),\n);\n", "import { pgTable, uuid, timestamp, index, uniqueIndex } from \"drizzle-orm/pg-core\";\nimport { companies } from \"./companies.js\";\nimport { issues } from \"./issues.js\";\nimport { assets } from \"./assets.js\";\nimport { issueComments } from \"./issue_comments.js\";\n\nexport const issueAttachments = pgTable(\n \"issue_attachments\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n companyId: uuid(\"company_id\").notNull().references(() => companies.id),\n issueId: uuid(\"issue_id\").notNull().references(() => issues.id, { onDelete: \"cascade\" }),\n assetId: uuid(\"asset_id\").notNull().references(() => assets.id, { onDelete: \"cascade\" }),\n issueCommentId: uuid(\"issue_comment_id\").references(() => issueComments.id, { onDelete: \"set null\" }),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull().defaultNow(),\n },\n (table) => ({\n companyIssueIdx: index(\"issue_attachments_company_issue_idx\").on(table.companyId, table.issueId),\n issueCommentIdx: index(\"issue_attachments_issue_comment_idx\").on(table.issueCommentId),\n assetUq: uniqueIndex(\"issue_attachments_asset_uq\").on(table.assetId),\n }),\n);\n", "import { pgTable, uuid, text, integer, timestamp, index } from \"drizzle-orm/pg-core\";\nimport { companies } from \"./companies.js\";\nimport { agents } from \"./agents.js\";\n\nexport const documents = pgTable(\n \"documents\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n companyId: uuid(\"company_id\").notNull().references(() => companies.id),\n title: text(\"title\"),\n format: text(\"format\").notNull().default(\"markdown\"),\n latestBody: text(\"latest_body\").notNull(),\n latestRevisionId: uuid(\"latest_revision_id\"),\n latestRevisionNumber: integer(\"latest_revision_number\").notNull().default(1),\n createdByAgentId: uuid(\"created_by_agent_id\").references(() => agents.id, { onDelete: \"set null\" }),\n createdByUserId: text(\"created_by_user_id\"),\n updatedByAgentId: uuid(\"updated_by_agent_id\").references(() => agents.id, { onDelete: \"set null\" }),\n updatedByUserId: text(\"updated_by_user_id\"),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull().defaultNow(),\n },\n (table) => ({\n companyUpdatedIdx: index(\"documents_company_updated_idx\").on(table.companyId, table.updatedAt),\n companyCreatedIdx: index(\"documents_company_created_idx\").on(table.companyId, table.createdAt),\n }),\n);\n", "import { pgTable, uuid, text, integer, timestamp, index, uniqueIndex } from \"drizzle-orm/pg-core\";\nimport { companies } from \"./companies.js\";\nimport { agents } from \"./agents.js\";\nimport { documents } from \"./documents.js\";\nimport { heartbeatRuns } from \"./heartbeat_runs.js\";\n\nexport const documentRevisions = pgTable(\n \"document_revisions\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n companyId: uuid(\"company_id\").notNull().references(() => companies.id),\n documentId: uuid(\"document_id\").notNull().references(() => documents.id, { onDelete: \"cascade\" }),\n revisionNumber: integer(\"revision_number\").notNull(),\n title: text(\"title\"),\n format: text(\"format\").notNull().default(\"markdown\"),\n body: text(\"body\").notNull(),\n changeSummary: text(\"change_summary\"),\n createdByAgentId: uuid(\"created_by_agent_id\").references(() => agents.id, { onDelete: \"set null\" }),\n createdByUserId: text(\"created_by_user_id\"),\n createdByRunId: uuid(\"created_by_run_id\").references(() => heartbeatRuns.id, { onDelete: \"set null\" }),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n },\n (table) => ({\n documentRevisionUq: uniqueIndex(\"document_revisions_document_revision_uq\").on(\n table.documentId,\n table.revisionNumber,\n ),\n companyDocumentCreatedIdx: index(\"document_revisions_company_document_created_idx\").on(\n table.companyId,\n table.documentId,\n table.createdAt,\n ),\n }),\n);\n", "import { pgTable, uuid, text, timestamp, index, uniqueIndex } from \"drizzle-orm/pg-core\";\nimport { companies } from \"./companies.js\";\nimport { issues } from \"./issues.js\";\nimport { documents } from \"./documents.js\";\n\nexport const issueDocuments = pgTable(\n \"issue_documents\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n companyId: uuid(\"company_id\").notNull().references(() => companies.id),\n issueId: uuid(\"issue_id\").notNull().references(() => issues.id, { onDelete: \"cascade\" }),\n documentId: uuid(\"document_id\").notNull().references(() => documents.id, { onDelete: \"cascade\" }),\n key: text(\"key\").notNull(),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull().defaultNow(),\n },\n (table) => ({\n companyIssueKeyUq: uniqueIndex(\"issue_documents_company_issue_key_uq\").on(\n table.companyId,\n table.issueId,\n table.key,\n ),\n documentUq: uniqueIndex(\"issue_documents_document_uq\").on(table.documentId),\n companyIssueUpdatedIdx: index(\"issue_documents_company_issue_updated_idx\").on(\n table.companyId,\n table.issueId,\n table.updatedAt,\n ),\n }),\n);\n", "import { pgTable, uuid, text, timestamp, integer, jsonb, index, bigserial } from \"drizzle-orm/pg-core\";\nimport { companies } from \"./companies.js\";\nimport { agents } from \"./agents.js\";\nimport { heartbeatRuns } from \"./heartbeat_runs.js\";\n\nexport const heartbeatRunEvents = pgTable(\n \"heartbeat_run_events\",\n {\n id: bigserial(\"id\", { mode: \"number\" }).primaryKey(),\n companyId: uuid(\"company_id\").notNull().references(() => companies.id),\n runId: uuid(\"run_id\").notNull().references(() => heartbeatRuns.id),\n agentId: uuid(\"agent_id\").notNull().references(() => agents.id),\n seq: integer(\"seq\").notNull(),\n eventType: text(\"event_type\").notNull(),\n stream: text(\"stream\"),\n level: text(\"level\"),\n color: text(\"color\"),\n message: text(\"message\"),\n payload: jsonb(\"payload\").$type<Record<string, unknown>>(),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n },\n (table) => ({\n runSeqIdx: index(\"heartbeat_run_events_run_seq_idx\").on(table.runId, table.seq),\n companyRunIdx: index(\"heartbeat_run_events_company_run_idx\").on(table.companyId, table.runId),\n companyCreatedIdx: index(\"heartbeat_run_events_company_created_idx\").on(table.companyId, table.createdAt),\n }),\n);\n\n", "import { pgTable, uuid, text, timestamp, integer, index } from \"drizzle-orm/pg-core\";\nimport { companies } from \"./companies.js\";\nimport { agents } from \"./agents.js\";\nimport { issues } from \"./issues.js\";\nimport { projects } from \"./projects.js\";\nimport { goals } from \"./goals.js\";\nimport { heartbeatRuns } from \"./heartbeat_runs.js\";\n\nexport const costEvents = pgTable(\n \"cost_events\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n companyId: uuid(\"company_id\").notNull().references(() => companies.id),\n agentId: uuid(\"agent_id\").notNull().references(() => agents.id),\n issueId: uuid(\"issue_id\").references(() => issues.id),\n projectId: uuid(\"project_id\").references(() => projects.id),\n goalId: uuid(\"goal_id\").references(() => goals.id),\n heartbeatRunId: uuid(\"heartbeat_run_id\").references(() => heartbeatRuns.id),\n billingCode: text(\"billing_code\"),\n provider: text(\"provider\").notNull(),\n biller: text(\"biller\").notNull().default(\"unknown\"),\n billingType: text(\"billing_type\").notNull().default(\"unknown\"),\n model: text(\"model\").notNull(),\n inputTokens: integer(\"input_tokens\").notNull().default(0),\n cachedInputTokens: integer(\"cached_input_tokens\").notNull().default(0),\n outputTokens: integer(\"output_tokens\").notNull().default(0),\n costCents: integer(\"cost_cents\").notNull(),\n occurredAt: timestamp(\"occurred_at\", { withTimezone: true }).notNull(),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n },\n (table) => ({\n companyOccurredIdx: index(\"cost_events_company_occurred_idx\").on(table.companyId, table.occurredAt),\n companyAgentOccurredIdx: index(\"cost_events_company_agent_occurred_idx\").on(\n table.companyId,\n table.agentId,\n table.occurredAt,\n ),\n companyProviderOccurredIdx: index(\"cost_events_company_provider_occurred_idx\").on(\n table.companyId,\n table.provider,\n table.occurredAt,\n ),\n companyBillerOccurredIdx: index(\"cost_events_company_biller_occurred_idx\").on(\n table.companyId,\n table.biller,\n table.occurredAt,\n ),\n companyHeartbeatRunIdx: index(\"cost_events_company_heartbeat_run_idx\").on(\n table.companyId,\n table.heartbeatRunId,\n ),\n }),\n);\n", "import { pgTable, uuid, text, timestamp, integer, index, boolean, jsonb } from \"drizzle-orm/pg-core\";\nimport { companies } from \"./companies.js\";\nimport { agents } from \"./agents.js\";\nimport { issues } from \"./issues.js\";\nimport { projects } from \"./projects.js\";\nimport { goals } from \"./goals.js\";\nimport { heartbeatRuns } from \"./heartbeat_runs.js\";\nimport { costEvents } from \"./cost_events.js\";\n\nexport const financeEvents = pgTable(\n \"finance_events\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n companyId: uuid(\"company_id\").notNull().references(() => companies.id),\n agentId: uuid(\"agent_id\").references(() => agents.id),\n issueId: uuid(\"issue_id\").references(() => issues.id),\n projectId: uuid(\"project_id\").references(() => projects.id),\n goalId: uuid(\"goal_id\").references(() => goals.id),\n heartbeatRunId: uuid(\"heartbeat_run_id\").references(() => heartbeatRuns.id),\n costEventId: uuid(\"cost_event_id\").references(() => costEvents.id),\n billingCode: text(\"billing_code\"),\n description: text(\"description\"),\n eventKind: text(\"event_kind\").notNull(),\n direction: text(\"direction\").notNull().default(\"debit\"),\n biller: text(\"biller\").notNull(),\n provider: text(\"provider\"),\n executionAdapterType: text(\"execution_adapter_type\"),\n pricingTier: text(\"pricing_tier\"),\n region: text(\"region\"),\n model: text(\"model\"),\n quantity: integer(\"quantity\"),\n unit: text(\"unit\"),\n amountCents: integer(\"amount_cents\").notNull(),\n currency: text(\"currency\").notNull().default(\"USD\"),\n estimated: boolean(\"estimated\").notNull().default(false),\n externalInvoiceId: text(\"external_invoice_id\"),\n metadataJson: jsonb(\"metadata_json\").$type<Record<string, unknown> | null>(),\n occurredAt: timestamp(\"occurred_at\", { withTimezone: true }).notNull(),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n },\n (table) => ({\n companyOccurredIdx: index(\"finance_events_company_occurred_idx\").on(table.companyId, table.occurredAt),\n companyBillerOccurredIdx: index(\"finance_events_company_biller_occurred_idx\").on(\n table.companyId,\n table.biller,\n table.occurredAt,\n ),\n companyKindOccurredIdx: index(\"finance_events_company_kind_occurred_idx\").on(\n table.companyId,\n table.eventKind,\n table.occurredAt,\n ),\n companyDirectionOccurredIdx: index(\"finance_events_company_direction_occurred_idx\").on(\n table.companyId,\n table.direction,\n table.occurredAt,\n ),\n companyHeartbeatRunIdx: index(\"finance_events_company_heartbeat_run_idx\").on(\n table.companyId,\n table.heartbeatRunId,\n ),\n companyCostEventIdx: index(\"finance_events_company_cost_event_idx\").on(\n table.companyId,\n table.costEventId,\n ),\n }),\n);\n", "import { pgTable, uuid, text, timestamp, index } from \"drizzle-orm/pg-core\";\nimport { companies } from \"./companies.js\";\nimport { approvals } from \"./approvals.js\";\nimport { agents } from \"./agents.js\";\n\nexport const approvalComments = pgTable(\n \"approval_comments\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n companyId: uuid(\"company_id\").notNull().references(() => companies.id),\n approvalId: uuid(\"approval_id\").notNull().references(() => approvals.id),\n authorAgentId: uuid(\"author_agent_id\").references(() => agents.id),\n authorUserId: text(\"author_user_id\"),\n body: text(\"body\").notNull(),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull().defaultNow(),\n },\n (table) => ({\n companyIdx: index(\"approval_comments_company_idx\").on(table.companyId),\n approvalIdx: index(\"approval_comments_approval_idx\").on(table.approvalId),\n approvalCreatedIdx: index(\"approval_comments_approval_created_idx\").on(\n table.approvalId,\n table.createdAt,\n ),\n }),\n);\n", "import { pgTable, uuid, text, timestamp, jsonb, index } from \"drizzle-orm/pg-core\";\nimport { companies } from \"./companies.js\";\nimport { agents } from \"./agents.js\";\nimport { heartbeatRuns } from \"./heartbeat_runs.js\";\n\nexport const activityLog = pgTable(\n \"activity_log\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n companyId: uuid(\"company_id\").notNull().references(() => companies.id),\n actorType: text(\"actor_type\").notNull().default(\"system\"),\n actorId: text(\"actor_id\").notNull(),\n action: text(\"action\").notNull(),\n entityType: text(\"entity_type\").notNull(),\n entityId: text(\"entity_id\").notNull(),\n agentId: uuid(\"agent_id\").references(() => agents.id),\n runId: uuid(\"run_id\").references(() => heartbeatRuns.id),\n details: jsonb(\"details\").$type<Record<string, unknown>>(),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n },\n (table) => ({\n companyCreatedIdx: index(\"activity_log_company_created_idx\").on(table.companyId, table.createdAt),\n runIdIdx: index(\"activity_log_run_id_idx\").on(table.runId),\n entityIdx: index(\"activity_log_entity_type_id_idx\").on(table.entityType, table.entityId),\n }),\n);\n", "import { pgTable, uuid, text, timestamp, integer, jsonb, index, uniqueIndex } from \"drizzle-orm/pg-core\";\nimport { agents } from \"./agents.js\";\nimport { companySecrets } from \"./company_secrets.js\";\n\nexport const companySecretVersions = pgTable(\n \"company_secret_versions\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n secretId: uuid(\"secret_id\").notNull().references(() => companySecrets.id, { onDelete: \"cascade\" }),\n version: integer(\"version\").notNull(),\n material: jsonb(\"material\").$type<Record<string, unknown>>().notNull(),\n valueSha256: text(\"value_sha256\").notNull(),\n createdByAgentId: uuid(\"created_by_agent_id\").references(() => agents.id, { onDelete: \"set null\" }),\n createdByUserId: text(\"created_by_user_id\"),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n revokedAt: timestamp(\"revoked_at\", { withTimezone: true }),\n },\n (table) => ({\n secretIdx: index(\"company_secret_versions_secret_idx\").on(table.secretId, table.createdAt),\n valueHashIdx: index(\"company_secret_versions_value_sha256_idx\").on(table.valueSha256),\n secretVersionUq: uniqueIndex(\"company_secret_versions_secret_version_uq\").on(table.secretId, table.version),\n }),\n);\n", "import {\n pgTable,\n uuid,\n text,\n timestamp,\n jsonb,\n index,\n uniqueIndex,\n} from \"drizzle-orm/pg-core\";\nimport { companies } from \"./companies.js\";\n\nexport const companySkills = pgTable(\n \"company_skills\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n companyId: uuid(\"company_id\").notNull().references(() => companies.id),\n key: text(\"key\").notNull(),\n slug: text(\"slug\").notNull(),\n name: text(\"name\").notNull(),\n description: text(\"description\"),\n markdown: text(\"markdown\").notNull(),\n sourceType: text(\"source_type\").notNull().default(\"local_path\"),\n sourceLocator: text(\"source_locator\"),\n sourceRef: text(\"source_ref\"),\n trustLevel: text(\"trust_level\").notNull().default(\"markdown_only\"),\n compatibility: text(\"compatibility\").notNull().default(\"compatible\"),\n fileInventory: jsonb(\"file_inventory\").$type<Array<Record<string, unknown>>>().notNull().default([]),\n metadata: jsonb(\"metadata\").$type<Record<string, unknown>>(),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull().defaultNow(),\n },\n (table) => ({\n companyKeyUniqueIdx: uniqueIndex(\"company_skills_company_key_idx\").on(table.companyId, table.key),\n companyNameIdx: index(\"company_skills_company_name_idx\").on(table.companyId, table.name),\n }),\n);\n", "import {\n pgTable,\n uuid,\n text,\n integer,\n timestamp,\n jsonb,\n index,\n uniqueIndex,\n} from \"drizzle-orm/pg-core\";\nimport type { PluginCategory, PluginStatus, PaperclipPluginManifestV1 } from \"@paperclipai/shared\";\n\n/**\n * `plugins` table \u2014 stores one row per installed plugin.\n *\n * Each plugin is uniquely identified by `plugin_key` (derived from\n * the manifest `id`). The full manifest is persisted as JSONB in\n * `manifest_json` so the host can reconstruct capability and UI\n * slot information without loading the plugin package.\n *\n * @see PLUGIN_SPEC.md \u00A721.3\n */\nexport const plugins = pgTable(\n \"plugins\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n pluginKey: text(\"plugin_key\").notNull(),\n packageName: text(\"package_name\").notNull(),\n version: text(\"version\").notNull(),\n apiVersion: integer(\"api_version\").notNull().default(1),\n categories: jsonb(\"categories\").$type<PluginCategory[]>().notNull().default([]),\n manifestJson: jsonb(\"manifest_json\").$type<PaperclipPluginManifestV1>().notNull(),\n status: text(\"status\").$type<PluginStatus>().notNull().default(\"installed\"),\n installOrder: integer(\"install_order\"),\n /** Resolved package path for local-path installs; used to find worker entrypoint. */\n packagePath: text(\"package_path\"),\n lastError: text(\"last_error\"),\n installedAt: timestamp(\"installed_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull().defaultNow(),\n },\n (table) => ({\n pluginKeyIdx: uniqueIndex(\"plugins_plugin_key_idx\").on(table.pluginKey),\n statusIdx: index(\"plugins_status_idx\").on(table.status),\n }),\n);\n", "import { pgTable, uuid, text, timestamp, jsonb, uniqueIndex } from \"drizzle-orm/pg-core\";\nimport { plugins } from \"./plugins.js\";\n\n/**\n * `plugin_config` table \u2014 stores operator-provided instance configuration\n * for each plugin (one row per plugin, enforced by a unique index on\n * `plugin_id`).\n *\n * The `config_json` column holds the values that the operator enters in the\n * plugin settings UI. These values are validated at runtime against the\n * plugin's `instanceConfigSchema` from the manifest.\n *\n * @see PLUGIN_SPEC.md \u00A721.3\n */\nexport const pluginConfig = pgTable(\n \"plugin_config\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n pluginId: uuid(\"plugin_id\")\n .notNull()\n .references(() => plugins.id, { onDelete: \"cascade\" }),\n configJson: jsonb(\"config_json\").$type<Record<string, unknown>>().notNull().default({}),\n lastError: text(\"last_error\"),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull().defaultNow(),\n },\n (table) => ({\n pluginIdIdx: uniqueIndex(\"plugin_config_plugin_id_idx\").on(table.pluginId),\n }),\n);\n", "import { pgTable, uuid, text, timestamp, jsonb, index, uniqueIndex, boolean } from \"drizzle-orm/pg-core\";\nimport { companies } from \"./companies.js\";\nimport { plugins } from \"./plugins.js\";\n\n/**\n * `plugin_company_settings` table \u2014 stores operator-managed plugin settings\n * scoped to a specific company.\n *\n * This is distinct from `plugin_config`, which stores instance-wide plugin\n * configuration. Each company can have at most one settings row per plugin.\n *\n * Rows represent explicit overrides from the default company behavior:\n * - no row => plugin is enabled for the company by default\n * - row with `enabled = false` => plugin is disabled for that company\n * - row with `enabled = true` => plugin remains enabled and stores company settings\n */\nexport const pluginCompanySettings = pgTable(\n \"plugin_company_settings\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n companyId: uuid(\"company_id\")\n .notNull()\n .references(() => companies.id, { onDelete: \"cascade\" }),\n pluginId: uuid(\"plugin_id\")\n .notNull()\n .references(() => plugins.id, { onDelete: \"cascade\" }),\n enabled: boolean(\"enabled\").notNull().default(true),\n settingsJson: jsonb(\"settings_json\").$type<Record<string, unknown>>().notNull().default({}),\n lastError: text(\"last_error\"),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull().defaultNow(),\n },\n (table) => ({\n companyIdx: index(\"plugin_company_settings_company_idx\").on(table.companyId),\n pluginIdx: index(\"plugin_company_settings_plugin_idx\").on(table.pluginId),\n companyPluginUq: uniqueIndex(\"plugin_company_settings_company_plugin_uq\").on(\n table.companyId,\n table.pluginId,\n ),\n }),\n);\n", "import {\n pgTable,\n uuid,\n text,\n timestamp,\n jsonb,\n index,\n unique,\n} from \"drizzle-orm/pg-core\";\nimport type { PluginStateScopeKind } from \"@paperclipai/shared\";\nimport { plugins } from \"./plugins.js\";\n\n/**\n * `plugin_state` table \u2014 scoped key-value storage for plugin workers.\n *\n * Each row stores a single JSON value identified by\n * `(plugin_id, scope_kind, scope_id, namespace, state_key)`. Plugins use\n * this table through `ctx.state.get()`, `ctx.state.set()`, and\n * `ctx.state.delete()` in the SDK.\n *\n * Scope kinds determine the granularity of isolation:\n * - `instance` \u2014 one value shared across the whole Paperclip instance\n * - `company` \u2014 one value per company\n * - `project` \u2014 one value per project\n * - `project_workspace` \u2014 one value per project workspace\n * - `agent` \u2014 one value per agent\n * - `issue` \u2014 one value per issue\n * - `goal` \u2014 one value per goal\n * - `run` \u2014 one value per agent run\n *\n * The `namespace` column defaults to `\"default\"` and can be used to\n * logically group keys without polluting the root namespace.\n *\n * @see PLUGIN_SPEC.md \u00A721.3 \u2014 `plugin_state`\n */\nexport const pluginState = pgTable(\n \"plugin_state\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n /** FK to the owning plugin. Cascades on delete. */\n pluginId: uuid(\"plugin_id\")\n .notNull()\n .references(() => plugins.id, { onDelete: \"cascade\" }),\n /** Granularity of the scope (e.g. `\"instance\"`, `\"project\"`, `\"issue\"`). */\n scopeKind: text(\"scope_kind\").$type<PluginStateScopeKind>().notNull(),\n /**\n * UUID or text identifier for the scoped object.\n * Null for `instance` scope (which has no associated entity).\n */\n scopeId: text(\"scope_id\"),\n /**\n * Sub-namespace to avoid key collisions within a scope.\n * Defaults to `\"default\"` if the plugin does not specify one.\n */\n namespace: text(\"namespace\").notNull().default(\"default\"),\n /** The key identifying this state entry within the namespace. */\n stateKey: text(\"state_key\").notNull(),\n /** JSON-serializable value stored by the plugin. */\n valueJson: jsonb(\"value_json\").notNull(),\n /** Timestamp of the most recent write. */\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull().defaultNow(),\n },\n (table) => ({\n /**\n * Unique constraint enforces that there is at most one value per\n * (plugin, scope kind, scope id, namespace, key) tuple.\n *\n * `nullsNotDistinct()` is required so that `scope_id IS NULL` entries\n * (used by `instance` scope) are treated as equal by PostgreSQL rather\n * than as distinct nulls \u2014 otherwise the upsert target in `set()` would\n * fail to match existing rows and create duplicates.\n *\n * Requires PostgreSQL 15+.\n */\n uniqueEntry: unique(\"plugin_state_unique_entry_idx\")\n .on(\n table.pluginId,\n table.scopeKind,\n table.scopeId,\n table.namespace,\n table.stateKey,\n )\n .nullsNotDistinct(),\n /** Speed up lookups by plugin + scope kind (most common access pattern). */\n pluginScopeIdx: index(\"plugin_state_plugin_scope_idx\").on(\n table.pluginId,\n table.scopeKind,\n ),\n }),\n);\n", "import {\n pgTable,\n uuid,\n text,\n timestamp,\n jsonb,\n index,\n uniqueIndex,\n} from \"drizzle-orm/pg-core\";\nimport { plugins } from \"./plugins.js\";\nimport type { PluginStateScopeKind } from \"@paperclipai/shared\";\n\n/**\n * `plugin_entities` table \u2014 persistent high-level mapping between Paperclip\n * objects and external plugin-defined entities.\n *\n * This table is used by plugins (e.g. `linear`, `github`) to store pointers\n * to their respective external IDs for projects, issues, etc. and to store\n * their custom data.\n *\n * Unlike `plugin_state`, which is for raw K-V persistence, `plugin_entities`\n * is intended for structured object mappings that the host can understand\n * and query for cross-plugin UI integration.\n *\n * @see PLUGIN_SPEC.md \u00A721.3\n */\nexport const pluginEntities = pgTable(\n \"plugin_entities\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n pluginId: uuid(\"plugin_id\")\n .notNull()\n .references(() => plugins.id, { onDelete: \"cascade\" }),\n entityType: text(\"entity_type\").notNull(),\n scopeKind: text(\"scope_kind\").$type<PluginStateScopeKind>().notNull(),\n scopeId: text(\"scope_id\"), // NULL for global scope (text to match plugin_state.scope_id)\n externalId: text(\"external_id\"), // ID in the external system\n title: text(\"title\"),\n status: text(\"status\"),\n data: jsonb(\"data\").$type<Record<string, unknown>>().notNull().default({}),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull().defaultNow(),\n },\n (table) => ({\n pluginIdx: index(\"plugin_entities_plugin_idx\").on(table.pluginId),\n typeIdx: index(\"plugin_entities_type_idx\").on(table.entityType),\n scopeIdx: index(\"plugin_entities_scope_idx\").on(table.scopeKind, table.scopeId),\n externalIdx: uniqueIndex(\"plugin_entities_external_idx\").on(\n table.pluginId,\n table.entityType,\n table.externalId,\n ),\n }),\n);\n", "import {\n pgTable,\n uuid,\n text,\n integer,\n timestamp,\n jsonb,\n index,\n uniqueIndex,\n} from \"drizzle-orm/pg-core\";\nimport { plugins } from \"./plugins.js\";\nimport type { PluginJobStatus, PluginJobRunStatus, PluginJobRunTrigger } from \"@paperclipai/shared\";\n\n/**\n * `plugin_jobs` table \u2014 registration and runtime configuration for\n * scheduled jobs declared by plugins in their manifests.\n *\n * Each row represents one scheduled job entry for a plugin. The\n * `job_key` matches the key declared in the manifest's `jobs` array.\n * The `schedule` column stores the cron expression or interval string\n * used by the job scheduler to decide when to fire the job.\n *\n * Status values:\n * - `active` \u2014 job is enabled and will run on schedule\n * - `paused` \u2014 job is temporarily disabled by the operator\n * - `error` \u2014 job has been disabled due to repeated failures\n *\n * @see PLUGIN_SPEC.md \u00A721.3 \u2014 `plugin_jobs`\n */\nexport const pluginJobs = pgTable(\n \"plugin_jobs\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n /** FK to the owning plugin. Cascades on delete. */\n pluginId: uuid(\"plugin_id\")\n .notNull()\n .references(() => plugins.id, { onDelete: \"cascade\" }),\n /** Identifier matching the key in the plugin manifest's `jobs` array. */\n jobKey: text(\"job_key\").notNull(),\n /** Cron expression (e.g. `\"0 * * * *\"`) or interval string. */\n schedule: text(\"schedule\").notNull(),\n /** Current scheduling state. */\n status: text(\"status\").$type<PluginJobStatus>().notNull().default(\"active\"),\n /** Timestamp of the most recent successful execution. */\n lastRunAt: timestamp(\"last_run_at\", { withTimezone: true }),\n /** Pre-computed timestamp of the next scheduled execution. */\n nextRunAt: timestamp(\"next_run_at\", { withTimezone: true }),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull().defaultNow(),\n },\n (table) => ({\n pluginIdx: index(\"plugin_jobs_plugin_idx\").on(table.pluginId),\n nextRunIdx: index(\"plugin_jobs_next_run_idx\").on(table.nextRunAt),\n uniqueJobIdx: uniqueIndex(\"plugin_jobs_unique_idx\").on(table.pluginId, table.jobKey),\n }),\n);\n\n/**\n * `plugin_job_runs` table \u2014 immutable execution history for plugin-owned jobs.\n *\n * Each row is created when a job run begins and updated when it completes.\n * Rows are never modified after `status` reaches a terminal value\n * (`succeeded` | `failed` | `cancelled`).\n *\n * Trigger values:\n * - `scheduled` \u2014 fired automatically by the cron/interval scheduler\n * - `manual` \u2014 triggered by an operator via the admin UI or API\n *\n * @see PLUGIN_SPEC.md \u00A721.3 \u2014 `plugin_job_runs`\n */\nexport const pluginJobRuns = pgTable(\n \"plugin_job_runs\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n /** FK to the parent job definition. Cascades on delete. */\n jobId: uuid(\"job_id\")\n .notNull()\n .references(() => pluginJobs.id, { onDelete: \"cascade\" }),\n /** Denormalized FK to the owning plugin for efficient querying. Cascades on delete. */\n pluginId: uuid(\"plugin_id\")\n .notNull()\n .references(() => plugins.id, { onDelete: \"cascade\" }),\n /** What caused this run to start (`\"scheduled\"` or `\"manual\"`). */\n trigger: text(\"trigger\").$type<PluginJobRunTrigger>().notNull(),\n /** Current lifecycle state of this run. */\n status: text(\"status\").$type<PluginJobRunStatus>().notNull().default(\"pending\"),\n /** Wall-clock duration in milliseconds. Null until the run finishes. */\n durationMs: integer(\"duration_ms\"),\n /** Error message if `status === \"failed\"`. */\n error: text(\"error\"),\n /** Ordered list of log lines emitted during this run. */\n logs: jsonb(\"logs\").$type<string[]>().notNull().default([]),\n startedAt: timestamp(\"started_at\", { withTimezone: true }),\n finishedAt: timestamp(\"finished_at\", { withTimezone: true }),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n },\n (table) => ({\n jobIdx: index(\"plugin_job_runs_job_idx\").on(table.jobId),\n pluginIdx: index(\"plugin_job_runs_plugin_idx\").on(table.pluginId),\n statusIdx: index(\"plugin_job_runs_status_idx\").on(table.status),\n }),\n);\n", "import {\n pgTable,\n uuid,\n text,\n integer,\n timestamp,\n jsonb,\n index,\n} from \"drizzle-orm/pg-core\";\nimport { plugins } from \"./plugins.js\";\nimport type { PluginWebhookDeliveryStatus } from \"@paperclipai/shared\";\n\n/**\n * `plugin_webhook_deliveries` table \u2014 inbound webhook delivery history for plugins.\n *\n * When an external system sends an HTTP POST to a plugin's registered webhook\n * endpoint (e.g. `/api/plugins/:pluginKey/webhooks/:webhookKey`), the server\n * creates a row in this table before dispatching the payload to the plugin\n * worker. This provides an auditable log of every delivery attempt.\n *\n * The `webhook_key` matches the key declared in the plugin manifest's\n * `webhooks` array. `external_id` is an optional identifier supplied by the\n * remote system (e.g. a GitHub delivery GUID) that can be used to detect\n * and reject duplicate deliveries.\n *\n * Status values:\n * - `pending` \u2014 received but not yet dispatched to the worker\n * - `processing` \u2014 currently being handled by the plugin worker\n * - `succeeded` \u2014 worker processed the payload successfully\n * - `failed` \u2014 worker returned an error or timed out\n *\n * @see PLUGIN_SPEC.md \u00A721.3 \u2014 `plugin_webhook_deliveries`\n */\nexport const pluginWebhookDeliveries = pgTable(\n \"plugin_webhook_deliveries\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n /** FK to the owning plugin. Cascades on delete. */\n pluginId: uuid(\"plugin_id\")\n .notNull()\n .references(() => plugins.id, { onDelete: \"cascade\" }),\n /** Identifier matching the key in the plugin manifest's `webhooks` array. */\n webhookKey: text(\"webhook_key\").notNull(),\n /** Optional de-duplication ID provided by the external system. */\n externalId: text(\"external_id\"),\n /** Current delivery state. */\n status: text(\"status\").$type<PluginWebhookDeliveryStatus>().notNull().default(\"pending\"),\n /** Wall-clock processing duration in milliseconds. Null until delivery finishes. */\n durationMs: integer(\"duration_ms\"),\n /** Error message if `status === \"failed\"`. */\n error: text(\"error\"),\n /** Raw JSON body of the inbound HTTP request. */\n payload: jsonb(\"payload\").$type<Record<string, unknown>>().notNull(),\n /** Relevant HTTP headers from the inbound request (e.g. signature headers). */\n headers: jsonb(\"headers\").$type<Record<string, string>>().notNull().default({}),\n startedAt: timestamp(\"started_at\", { withTimezone: true }),\n finishedAt: timestamp(\"finished_at\", { withTimezone: true }),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n },\n (table) => ({\n pluginIdx: index(\"plugin_webhook_deliveries_plugin_idx\").on(table.pluginId),\n statusIdx: index(\"plugin_webhook_deliveries_status_idx\").on(table.status),\n keyIdx: index(\"plugin_webhook_deliveries_key_idx\").on(table.webhookKey),\n }),\n);\n", "import {\n pgTable,\n uuid,\n text,\n timestamp,\n jsonb,\n index,\n} from \"drizzle-orm/pg-core\";\nimport { plugins } from \"./plugins.js\";\n\n/**\n * `plugin_logs` table \u2014 structured log storage for plugin workers.\n *\n * Each row stores a single log entry emitted by a plugin worker via\n * `ctx.logger.info(...)` etc. Logs are queryable by plugin, level, and\n * time range to support the operator logs panel and debugging workflows.\n *\n * Rows are inserted by the host when handling `log` notifications from\n * the worker process. A capped retention policy can be applied via\n * periodic cleanup (e.g. delete rows older than 7 days).\n *\n * @see PLUGIN_SPEC.md \u00A726 \u2014 Observability\n */\nexport const pluginLogs = pgTable(\n \"plugin_logs\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n pluginId: uuid(\"plugin_id\")\n .notNull()\n .references(() => plugins.id, { onDelete: \"cascade\" }),\n level: text(\"level\").notNull().default(\"info\"),\n message: text(\"message\").notNull(),\n meta: jsonb(\"meta\").$type<Record<string, unknown>>(),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n },\n (table) => ({\n pluginTimeIdx: index(\"plugin_logs_plugin_time_idx\").on(\n table.pluginId,\n table.createdAt,\n ),\n levelIdx: index(\"plugin_logs_level_idx\").on(table.level),\n }),\n);\n", "import {\n pgTable,\n uuid,\n text,\n boolean,\n timestamp,\n jsonb,\n index,\n customType,\n} from \"drizzle-orm/pg-core\";\nimport { sql } from \"drizzle-orm\";\nimport { companies } from \"./companies.js\";\nimport { agents } from \"./agents.js\";\n\nconst tsvector = customType<{ data: string }>({\n dataType() {\n return \"tsvector\";\n },\n});\n\nexport const knowledgeEntries = pgTable(\n \"knowledge_entries\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n companyId: uuid(\"company_id\")\n .notNull()\n .references(() => companies.id),\n agentId: uuid(\"agent_id\").references(() => agents.id, {\n onDelete: \"set null\",\n }),\n title: text(\"title\").notNull(),\n content: text(\"content\").notNull(),\n category: text(\"category\"),\n tags: text(\"tags\")\n .array()\n .notNull()\n .default(sql`'{}'::text[]`),\n pinned: boolean(\"pinned\").notNull().default(false),\n sourceType: text(\"source_type\").notNull().default(\"manual\"),\n sourceRef: text(\"source_ref\"),\n searchVector: tsvector(\"search_vector\"),\n metadata: jsonb(\"metadata\").$type<Record<string, unknown>>(),\n createdAt: timestamp(\"created_at\", { withTimezone: true })\n .notNull()\n .defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true })\n .notNull()\n .defaultNow(),\n },\n (table) => ({\n companyIdx: index(\"knowledge_entries_company_idx\").on(table.companyId),\n companyAgentIdx: index(\"knowledge_entries_company_agent_idx\").on(\n table.companyId,\n table.agentId,\n ),\n companyPinnedIdx: index(\"knowledge_entries_company_pinned_idx\").on(\n table.companyId,\n table.pinned,\n ),\n companyCategoryIdx: index(\"knowledge_entries_company_category_idx\").on(\n table.companyId,\n table.category,\n ),\n searchVectorIdx: index(\"knowledge_entries_search_vector_idx\").using(\n \"gin\",\n table.searchVector,\n ),\n }),\n);\n", "import { pgTable, uuid, timestamp, index } from \"drizzle-orm/pg-core\";\nimport { companies } from \"./companies.js\";\nimport { agents } from \"./agents.js\";\nimport { knowledgeEntries } from \"./knowledge_entries.js\";\nimport { heartbeatRuns } from \"./heartbeat_runs.js\";\n\nexport const knowledgeInjections = pgTable(\n \"knowledge_injections\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n knowledgeEntryId: uuid(\"knowledge_entry_id\")\n .notNull()\n .references(() => knowledgeEntries.id, { onDelete: \"cascade\" }),\n runId: uuid(\"run_id\")\n .notNull()\n .references(() => heartbeatRuns.id, { onDelete: \"cascade\" }),\n agentId: uuid(\"agent_id\")\n .notNull()\n .references(() => agents.id, { onDelete: \"cascade\" }),\n companyId: uuid(\"company_id\")\n .notNull()\n .references(() => companies.id),\n injectedAt: timestamp(\"injected_at\", { withTimezone: true })\n .notNull()\n .defaultNow(),\n },\n (table) => ({\n runIdx: index(\"knowledge_injections_run_idx\").on(table.runId),\n entryIdx: index(\"knowledge_injections_entry_idx\").on(\n table.knowledgeEntryId,\n ),\n companyAgentIdx: index(\"knowledge_injections_company_agent_idx\").on(\n table.companyId,\n table.agentId,\n ),\n }),\n);\n", "import { pgTable, uuid, text, timestamp, integer, jsonb, index } from \"drizzle-orm/pg-core\";\nimport { companies } from \"./companies.js\";\nimport { agents } from \"./agents.js\";\n\nexport const costRecommendations = pgTable(\n \"cost_recommendations\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n companyId: uuid(\"company_id\").notNull().references(() => companies.id),\n agentId: uuid(\"agent_id\").references(() => agents.id),\n type: text(\"type\").notNull(), // downgrade_model | pause_idle | switch_adapter | high_failure_rate | budget_underutilized\n severity: text(\"severity\").notNull(), // low | medium | high\n estimatedSavingsCents: integer(\"estimated_savings_cents\").notNull().default(0),\n status: text(\"status\").notNull().default(\"pending\"), // pending | accepted | dismissed\n details: jsonb(\"details\").$type<Record<string, unknown>>(),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull().defaultNow(),\n },\n (table) => ({\n companyIdx: index(\"cost_recommendations_company_idx\").on(table.companyId),\n companyStatusIdx: index(\"cost_recommendations_company_status_idx\").on(table.companyId, table.status),\n }),\n);\n", "import {\n index,\n integer,\n jsonb,\n pgTable,\n text,\n timestamp,\n uuid,\n} from \"drizzle-orm/pg-core\";\nimport { agents } from \"./agents.js\";\nimport { companies } from \"./companies.js\";\nimport { issues } from \"./issues.js\";\n\nexport const pipelines = pgTable(\n \"pipelines\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n companyId: uuid(\"company_id\")\n .notNull()\n .references(() => companies.id, { onDelete: \"cascade\" }),\n name: text(\"name\").notNull(),\n description: text(\"description\"),\n status: text(\"status\").notNull().default(\"draft\"),\n metadata: jsonb(\"metadata\").$type<Record<string, unknown>>().notNull().default({}),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull().defaultNow(),\n },\n (table) => ({\n companyStatusIdx: index(\"pipelines_company_status_idx\").on(table.companyId, table.status),\n }),\n);\n\nexport const pipelineSteps = pgTable(\n \"pipeline_steps\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n pipelineId: uuid(\"pipeline_id\")\n .notNull()\n .references(() => pipelines.id, { onDelete: \"cascade\" }),\n name: text(\"name\").notNull(),\n agentId: uuid(\"agent_id\").references(() => agents.id, { onDelete: \"set null\" }),\n dependsOn: uuid(\"depends_on\").array().notNull().default([]),\n config: jsonb(\"config\").$type<Record<string, unknown>>().notNull().default({}),\n position: integer(\"position\").notNull().default(0),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull().defaultNow(),\n },\n (table) => ({\n pipelineIdx: index(\"pipeline_steps_pipeline_idx\").on(table.pipelineId),\n }),\n);\n\nexport const pipelineRuns = pgTable(\n \"pipeline_runs\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n pipelineId: uuid(\"pipeline_id\")\n .notNull()\n .references(() => pipelines.id, { onDelete: \"cascade\" }),\n companyId: uuid(\"company_id\")\n .notNull()\n .references(() => companies.id, { onDelete: \"cascade\" }),\n projectId: uuid(\"project_id\"),\n status: text(\"status\").notNull().default(\"running\"),\n triggeredBy: text(\"triggered_by\"),\n startedAt: timestamp(\"started_at\", { withTimezone: true }),\n completedAt: timestamp(\"completed_at\", { withTimezone: true }),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull().defaultNow(),\n },\n (table) => ({\n pipelineCreatedIdx: index(\"pipeline_runs_pipeline_created_idx\").on(\n table.pipelineId,\n table.createdAt,\n ),\n companyStatusIdx: index(\"pipeline_runs_company_status_idx\").on(\n table.companyId,\n table.status,\n ),\n }),\n);\n\nexport const pipelineRunSteps = pgTable(\n \"pipeline_run_steps\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n pipelineRunId: uuid(\"pipeline_run_id\")\n .notNull()\n .references(() => pipelineRuns.id, { onDelete: \"cascade\" }),\n pipelineStepId: uuid(\"pipeline_step_id\")\n .notNull()\n .references(() => pipelineSteps.id, { onDelete: \"cascade\" }),\n issueId: uuid(\"issue_id\").references(() => issues.id, { onDelete: \"set null\" }),\n status: text(\"status\").notNull().default(\"pending\"),\n startedAt: timestamp(\"started_at\", { withTimezone: true }),\n completedAt: timestamp(\"completed_at\", { withTimezone: true }),\n error: text(\"error\"),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull().defaultNow(),\n },\n (table) => ({\n runIdx: index(\"pipeline_run_steps_run_idx\").on(table.pipelineRunId),\n issueIdx: index(\"pipeline_run_steps_issue_idx\").on(table.issueId),\n stepIdx: index(\"pipeline_run_steps_step_idx\").on(table.pipelineStepId),\n }),\n);\n", "export { companies } from \"./companies.js\";\nexport { companyLogos } from \"./company_logos.js\";\nexport { authUsers, authSessions, authAccounts, authVerifications } from \"./auth.js\";\nexport { instanceSettings } from \"./instance_settings.js\";\nexport { instanceUserRoles } from \"./instance_user_roles.js\";\nexport { agents } from \"./agents.js\";\nexport { boardApiKeys } from \"./board_api_keys.js\";\nexport { cliAuthChallenges } from \"./cli_auth_challenges.js\";\nexport { companyMemberships } from \"./company_memberships.js\";\nexport { principalPermissionGrants } from \"./principal_permission_grants.js\";\nexport { invites } from \"./invites.js\";\nexport { joinRequests } from \"./join_requests.js\";\nexport { budgetPolicies } from \"./budget_policies.js\";\nexport { budgetIncidents } from \"./budget_incidents.js\";\nexport { agentConfigRevisions } from \"./agent_config_revisions.js\";\nexport { agentApiKeys } from \"./agent_api_keys.js\";\nexport { agentRuntimeState } from \"./agent_runtime_state.js\";\nexport { agentTaskSessions } from \"./agent_task_sessions.js\";\nexport { agentWakeupRequests } from \"./agent_wakeup_requests.js\";\nexport { projects } from \"./projects.js\";\nexport { projectWorkspaces } from \"./project_workspaces.js\";\nexport { executionWorkspaces } from \"./execution_workspaces.js\";\nexport { workspaceOperations } from \"./workspace_operations.js\";\nexport { workspaceRuntimeServices } from \"./workspace_runtime_services.js\";\nexport { projectGoals } from \"./project_goals.js\";\nexport { goals } from \"./goals.js\";\nexport { issues } from \"./issues.js\";\nexport { routines, routineTriggers, routineRuns } from \"./routines.js\";\nexport { issueWorkProducts } from \"./issue_work_products.js\";\nexport { labels } from \"./labels.js\";\nexport { issueLabels } from \"./issue_labels.js\";\nexport { issueApprovals } from \"./issue_approvals.js\";\nexport { issueComments } from \"./issue_comments.js\";\nexport { issueInboxArchives } from \"./issue_inbox_archives.js\";\nexport { feedbackVotes } from \"./feedback_votes.js\";\nexport { feedbackExports } from \"./feedback_exports.js\";\nexport { issueReadStates } from \"./issue_read_states.js\";\nexport { assets } from \"./assets.js\";\nexport { issueAttachments } from \"./issue_attachments.js\";\nexport { documents } from \"./documents.js\";\nexport { documentRevisions } from \"./document_revisions.js\";\nexport { issueDocuments } from \"./issue_documents.js\";\nexport { heartbeatRuns } from \"./heartbeat_runs.js\";\nexport { heartbeatRunEvents } from \"./heartbeat_run_events.js\";\nexport { costEvents } from \"./cost_events.js\";\nexport { financeEvents } from \"./finance_events.js\";\nexport { approvals } from \"./approvals.js\";\nexport { approvalComments } from \"./approval_comments.js\";\nexport { activityLog } from \"./activity_log.js\";\nexport { companySecrets } from \"./company_secrets.js\";\nexport { companySecretVersions } from \"./company_secret_versions.js\";\nexport { companySkills } from \"./company_skills.js\";\nexport { plugins } from \"./plugins.js\";\nexport { pluginConfig } from \"./plugin_config.js\";\nexport { pluginCompanySettings } from \"./plugin_company_settings.js\";\nexport { pluginState } from \"./plugin_state.js\";\nexport { pluginEntities } from \"./plugin_entities.js\";\nexport { pluginJobs, pluginJobRuns } from \"./plugin_jobs.js\";\nexport { pluginWebhookDeliveries } from \"./plugin_webhooks.js\";\nexport { pluginLogs } from \"./plugin_logs.js\";\nexport { knowledgeEntries } from \"./knowledge_entries.js\";\nexport { knowledgeInjections } from \"./knowledge_injections.js\";\nexport { costRecommendations } from \"./cost_recommendations.js\";\nexport { pipelines, pipelineSteps, pipelineRuns, pipelineRunSteps } from \"./pipelines.js\";\n", "import { createHash } from \"node:crypto\";\nimport { drizzle as drizzlePg } from \"drizzle-orm/postgres-js\";\nimport { migrate as migratePg } from \"drizzle-orm/postgres-js/migrator\";\nimport { readFile, readdir } from \"node:fs/promises\";\nimport { fileURLToPath } from \"node:url\";\nimport postgres from \"postgres\";\nimport * as schema from \"./schema/index.js\";\n\nconst MIGRATIONS_FOLDER = fileURLToPath(new URL(\"./migrations\", import.meta.url));\nconst DRIZZLE_MIGRATIONS_TABLE = \"__drizzle_migrations\";\nconst MIGRATIONS_JOURNAL_JSON = fileURLToPath(new URL(\"./migrations/meta/_journal.json\", import.meta.url));\n\nfunction createUtilitySql(url: string) {\n return postgres(url, { max: 1, onnotice: () => {} });\n}\n\nfunction isSafeIdentifier(value: string): boolean {\n return /^[A-Za-z_][A-Za-z0-9_]*$/.test(value);\n}\n\nfunction quoteIdentifier(value: string): string {\n if (!isSafeIdentifier(value)) throw new Error(`Unsafe SQL identifier: ${value}`);\n return `\"${value.replaceAll(\"\\\"\", \"\\\"\\\"\")}\"`;\n}\n\nfunction quoteLiteral(value: string): string {\n return `'${value.replaceAll(\"'\", \"''\")}'`;\n}\n\nfunction splitMigrationStatements(content: string): string[] {\n return content\n .split(\"--> statement-breakpoint\")\n .map((statement) => statement.trim())\n .filter((statement) => statement.length > 0);\n}\n\nexport type MigrationState =\n | { status: \"upToDate\"; tableCount: number; availableMigrations: string[]; appliedMigrations: string[] }\n | {\n status: \"needsMigrations\";\n tableCount: number;\n availableMigrations: string[];\n appliedMigrations: string[];\n pendingMigrations: string[];\n reason: \"no-migration-journal-empty-db\" | \"no-migration-journal-non-empty-db\" | \"pending-migrations\";\n };\n\nexport function createDb(url: string) {\n const sql = postgres(url, { max: 10 });\n return drizzlePg(sql, { schema });\n}\n\nexport async function getPostgresDataDirectory(url: string): Promise<string | null> {\n const sql = createUtilitySql(url);\n try {\n const rows = await sql<{ data_directory: string | null }[]>`\n SELECT current_setting('data_directory', true) AS data_directory\n `;\n const actual = rows[0]?.data_directory;\n return typeof actual === \"string\" && actual.length > 0 ? actual : null;\n } catch {\n return null;\n } finally {\n await sql.end();\n }\n}\n\nasync function listMigrationFiles(): Promise<string[]> {\n const entries = await readdir(MIGRATIONS_FOLDER, { withFileTypes: true });\n return entries\n .filter((entry) => entry.isFile() && entry.name.endsWith(\".sql\"))\n .map((entry) => entry.name)\n .sort((a, b) => a.localeCompare(b));\n}\n\ntype MigrationJournalFile = {\n entries?: Array<{ idx?: number; tag?: string; when?: number }>;\n};\n\ntype JournalMigrationEntry = {\n fileName: string;\n folderMillis: number;\n order: number;\n};\n\nasync function listJournalMigrationEntries(): Promise<JournalMigrationEntry[]> {\n try {\n const raw = await readFile(MIGRATIONS_JOURNAL_JSON, \"utf8\");\n const parsed = JSON.parse(raw) as MigrationJournalFile;\n if (!Array.isArray(parsed.entries)) return [];\n return parsed.entries\n .map((entry, entryIndex) => {\n if (typeof entry?.tag !== \"string\") return null;\n if (typeof entry?.when !== \"number\" || !Number.isFinite(entry.when)) return null;\n const order = Number.isInteger(entry.idx) ? Number(entry.idx) : entryIndex;\n return { fileName: `${entry.tag}.sql`, folderMillis: entry.when, order };\n })\n .filter((entry): entry is JournalMigrationEntry => entry !== null);\n } catch {\n return [];\n }\n}\n\nasync function listJournalMigrationFiles(): Promise<string[]> {\n const entries = await listJournalMigrationEntries();\n return entries.map((entry) => entry.fileName);\n}\n\nasync function readMigrationFileContent(migrationFile: string): Promise<string> {\n return readFile(new URL(`./migrations/${migrationFile}`, import.meta.url), \"utf8\");\n}\n\nasync function orderMigrationsByJournal(migrationFiles: string[]): Promise<string[]> {\n const journalEntries = await listJournalMigrationEntries();\n const orderByFileName = new Map(journalEntries.map((entry) => [entry.fileName, entry.order]));\n return [...migrationFiles].sort((left, right) => {\n const leftOrder = orderByFileName.get(left);\n const rightOrder = orderByFileName.get(right);\n if (leftOrder === undefined && rightOrder === undefined) return left.localeCompare(right);\n if (leftOrder === undefined) return 1;\n if (rightOrder === undefined) return -1;\n if (leftOrder === rightOrder) return left.localeCompare(right);\n return leftOrder - rightOrder;\n });\n}\n\ntype SqlExecutor = Pick<ReturnType<typeof postgres>, \"unsafe\">;\n\nasync function runInTransaction(sql: SqlExecutor, action: () => Promise<void>): Promise<void> {\n await sql.unsafe(\"BEGIN\");\n try {\n await action();\n await sql.unsafe(\"COMMIT\");\n } catch (error) {\n try {\n await sql.unsafe(\"ROLLBACK\");\n } catch {\n // Ignore rollback failures and surface the original error.\n }\n throw error;\n }\n}\n\nasync function latestMigrationCreatedAt(\n sql: SqlExecutor,\n qualifiedTable: string,\n): Promise<number | null> {\n const rows = await sql.unsafe<{ created_at: string | number | null }[]>(\n `SELECT created_at FROM ${qualifiedTable} ORDER BY created_at DESC NULLS LAST LIMIT 1`,\n );\n const value = Number(rows[0]?.created_at ?? Number.NaN);\n return Number.isFinite(value) ? value : null;\n}\n\nfunction normalizeFolderMillis(value: number | null | undefined): number {\n if (typeof value === \"number\" && Number.isFinite(value) && value >= 0) {\n return Math.trunc(value);\n }\n return Date.now();\n}\n\nasync function ensureMigrationJournalTable(\n sql: ReturnType<typeof postgres>,\n): Promise<{ migrationTableSchema: string; columnNames: Set<string> }> {\n let migrationTableSchema = await discoverMigrationTableSchema(sql);\n if (!migrationTableSchema) {\n const drizzleSchema = quoteIdentifier(\"drizzle\");\n const migrationTable = quoteIdentifier(DRIZZLE_MIGRATIONS_TABLE);\n await sql.unsafe(`CREATE SCHEMA IF NOT EXISTS ${drizzleSchema}`);\n await sql.unsafe(\n `CREATE TABLE IF NOT EXISTS ${drizzleSchema}.${migrationTable} (id SERIAL PRIMARY KEY, hash text NOT NULL, created_at bigint)`,\n );\n migrationTableSchema = (await discoverMigrationTableSchema(sql)) ?? \"drizzle\";\n }\n\n const columnNames = await getMigrationTableColumnNames(sql, migrationTableSchema);\n return { migrationTableSchema, columnNames };\n}\n\nasync function migrationHistoryEntryExists(\n sql: SqlExecutor,\n qualifiedTable: string,\n columnNames: Set<string>,\n migrationFile: string,\n hash: string,\n): Promise<boolean> {\n const predicates: string[] = [];\n if (columnNames.has(\"hash\")) predicates.push(`hash = ${quoteLiteral(hash)}`);\n if (columnNames.has(\"name\")) predicates.push(`name = ${quoteLiteral(migrationFile)}`);\n if (predicates.length === 0) return false;\n\n const rows = await sql.unsafe<{ one: number }[]>(\n `SELECT 1 AS one FROM ${qualifiedTable} WHERE ${predicates.join(\" OR \")} LIMIT 1`,\n );\n return rows.length > 0;\n}\n\nasync function recordMigrationHistoryEntry(\n sql: SqlExecutor,\n qualifiedTable: string,\n columnNames: Set<string>,\n migrationFile: string,\n hash: string,\n folderMillis: number,\n): Promise<void> {\n const insertColumns: string[] = [];\n const insertValues: string[] = [];\n\n if (columnNames.has(\"hash\")) {\n insertColumns.push(quoteIdentifier(\"hash\"));\n insertValues.push(quoteLiteral(hash));\n }\n if (columnNames.has(\"name\")) {\n insertColumns.push(quoteIdentifier(\"name\"));\n insertValues.push(quoteLiteral(migrationFile));\n }\n if (columnNames.has(\"created_at\")) {\n const latestCreatedAt = await latestMigrationCreatedAt(sql, qualifiedTable);\n const createdAt = latestCreatedAt === null\n ? normalizeFolderMillis(folderMillis)\n : Math.max(latestCreatedAt + 1, normalizeFolderMillis(folderMillis));\n insertColumns.push(quoteIdentifier(\"created_at\"));\n insertValues.push(quoteLiteral(String(createdAt)));\n }\n\n if (insertColumns.length === 0) return;\n\n await sql.unsafe(\n `INSERT INTO ${qualifiedTable} (${insertColumns.join(\", \")}) VALUES (${insertValues.join(\", \")})`,\n );\n}\n\nasync function applyPendingMigrationsManually(\n url: string,\n pendingMigrations: string[],\n): Promise<void> {\n if (pendingMigrations.length === 0) return;\n\n const orderedPendingMigrations = await orderMigrationsByJournal(pendingMigrations);\n const journalEntries = await listJournalMigrationEntries();\n const folderMillisByFileName = new Map(\n journalEntries.map((entry) => [entry.fileName, normalizeFolderMillis(entry.folderMillis)]),\n );\n\n const sql = createUtilitySql(url);\n try {\n const { migrationTableSchema, columnNames } = await ensureMigrationJournalTable(sql);\n const qualifiedTable = `${quoteIdentifier(migrationTableSchema)}.${quoteIdentifier(DRIZZLE_MIGRATIONS_TABLE)}`;\n\n for (const migrationFile of orderedPendingMigrations) {\n const migrationContent = await readMigrationFileContent(migrationFile);\n const hash = createHash(\"sha256\").update(migrationContent).digest(\"hex\");\n const existingEntry = await migrationHistoryEntryExists(\n sql,\n qualifiedTable,\n columnNames,\n migrationFile,\n hash,\n );\n if (existingEntry) continue;\n\n await runInTransaction(sql, async () => {\n for (const statement of splitMigrationStatements(migrationContent)) {\n await sql.unsafe(statement);\n }\n\n await recordMigrationHistoryEntry(\n sql,\n qualifiedTable,\n columnNames,\n migrationFile,\n hash,\n folderMillisByFileName.get(migrationFile) ?? Date.now(),\n );\n });\n }\n } finally {\n await sql.end();\n }\n}\n\nasync function mapHashesToMigrationFiles(migrationFiles: string[]): Promise<Map<string, string>> {\n const mapped = new Map<string, string>();\n\n await Promise.all(\n migrationFiles.map(async (migrationFile) => {\n const content = await readMigrationFileContent(migrationFile);\n const hash = createHash(\"sha256\").update(content).digest(\"hex\");\n mapped.set(hash, migrationFile);\n }),\n );\n\n return mapped;\n}\n\nasync function getMigrationTableColumnNames(\n sql: ReturnType<typeof postgres>,\n migrationTableSchema: string,\n): Promise<Set<string>> {\n const columns = await sql.unsafe<{ column_name: string }[]>(\n `\n SELECT column_name\n FROM information_schema.columns\n WHERE table_schema = ${quoteLiteral(migrationTableSchema)}\n AND table_name = ${quoteLiteral(DRIZZLE_MIGRATIONS_TABLE)}\n `,\n );\n return new Set(columns.map((column) => column.column_name));\n}\n\nasync function tableExists(\n sql: ReturnType<typeof postgres>,\n tableName: string,\n): Promise<boolean> {\n const rows = await sql<{ exists: boolean }[]>`\n SELECT EXISTS (\n SELECT 1\n FROM information_schema.tables\n WHERE table_schema = 'public'\n AND table_name = ${tableName}\n ) AS exists\n `;\n return rows[0]?.exists ?? false;\n}\n\nasync function columnExists(\n sql: ReturnType<typeof postgres>,\n tableName: string,\n columnName: string,\n): Promise<boolean> {\n const rows = await sql<{ exists: boolean }[]>`\n SELECT EXISTS (\n SELECT 1\n FROM information_schema.columns\n WHERE table_schema = 'public'\n AND table_name = ${tableName}\n AND column_name = ${columnName}\n ) AS exists\n `;\n return rows[0]?.exists ?? false;\n}\n\nasync function indexExists(\n sql: ReturnType<typeof postgres>,\n indexName: string,\n): Promise<boolean> {\n const rows = await sql<{ exists: boolean }[]>`\n SELECT EXISTS (\n SELECT 1\n FROM pg_class c\n JOIN pg_namespace n ON n.oid = c.relnamespace\n WHERE n.nspname = 'public'\n AND c.relkind = 'i'\n AND c.relname = ${indexName}\n ) AS exists\n `;\n return rows[0]?.exists ?? false;\n}\n\nasync function constraintExists(\n sql: ReturnType<typeof postgres>,\n constraintName: string,\n): Promise<boolean> {\n const rows = await sql<{ exists: boolean }[]>`\n SELECT EXISTS (\n SELECT 1\n FROM pg_constraint c\n JOIN pg_namespace n ON n.oid = c.connamespace\n WHERE n.nspname = 'public'\n AND c.conname = ${constraintName}\n ) AS exists\n `;\n return rows[0]?.exists ?? false;\n}\n\nasync function migrationStatementAlreadyApplied(\n sql: ReturnType<typeof postgres>,\n statement: string,\n): Promise<boolean> {\n const normalized = statement.replace(/\\s+/g, \" \").trim();\n\n const createTableMatch = normalized.match(/^CREATE TABLE(?: IF NOT EXISTS)? \"([^\"]+)\"/i);\n if (createTableMatch) {\n return tableExists(sql, createTableMatch[1]);\n }\n\n const addColumnMatch = normalized.match(\n /^ALTER TABLE \"([^\"]+)\" ADD COLUMN(?: IF NOT EXISTS)? \"([^\"]+)\"/i,\n );\n if (addColumnMatch) {\n return columnExists(sql, addColumnMatch[1], addColumnMatch[2]);\n }\n\n const createIndexMatch = normalized.match(/^CREATE (?:UNIQUE )?INDEX(?: IF NOT EXISTS)? \"([^\"]+)\"/i);\n if (createIndexMatch) {\n return indexExists(sql, createIndexMatch[1]);\n }\n\n const addConstraintMatch = normalized.match(/^ALTER TABLE \"([^\"]+)\" ADD CONSTRAINT \"([^\"]+)\"/i);\n if (addConstraintMatch) {\n return constraintExists(sql, addConstraintMatch[2]);\n }\n\n // If we cannot reason about a statement safely, require manual migration.\n return false;\n}\n\nasync function migrationContentAlreadyApplied(\n sql: ReturnType<typeof postgres>,\n migrationContent: string,\n): Promise<boolean> {\n const statements = splitMigrationStatements(migrationContent);\n if (statements.length === 0) return false;\n\n for (const statement of statements) {\n const applied = await migrationStatementAlreadyApplied(sql, statement);\n if (!applied) return false;\n }\n\n return true;\n}\n\nasync function loadAppliedMigrations(\n sql: ReturnType<typeof postgres>,\n migrationTableSchema: string,\n availableMigrations: string[],\n): Promise<string[]> {\n const quotedSchema = quoteIdentifier(migrationTableSchema);\n const qualifiedTable = `${quotedSchema}.${quoteIdentifier(DRIZZLE_MIGRATIONS_TABLE)}`;\n const columnNames = await getMigrationTableColumnNames(sql, migrationTableSchema);\n\n if (columnNames.has(\"name\")) {\n const rows = await sql.unsafe<{ name: string }[]>(`SELECT name FROM ${qualifiedTable} ORDER BY id`);\n return rows.map((row) => row.name).filter((name): name is string => Boolean(name));\n }\n\n if (columnNames.has(\"hash\")) {\n const rows = await sql.unsafe<{ hash: string }[]>(`SELECT hash FROM ${qualifiedTable} ORDER BY id`);\n const hashesToMigrationFiles = await mapHashesToMigrationFiles(availableMigrations);\n const appliedFromHashes = rows\n .map((row) => hashesToMigrationFiles.get(row.hash))\n .filter((name): name is string => Boolean(name));\n\n if (appliedFromHashes.length > 0) {\n // Best-effort: when all hashes resolve, this is authoritative.\n if (appliedFromHashes.length === rows.length) return appliedFromHashes;\n\n // Partial hash resolution can happen when files have changed; return what we can trust.\n return appliedFromHashes;\n }\n\n // Fallback only when hashes are unavailable/unresolved.\n if (columnNames.has(\"created_at\")) {\n const journalEntries = await listJournalMigrationEntries();\n if (journalEntries.length > 0) {\n const lastDbRows = await sql.unsafe<{ created_at: string | number | null }[]>(\n `SELECT created_at FROM ${qualifiedTable} ORDER BY created_at DESC LIMIT 1`,\n );\n const lastCreatedAt = Number(lastDbRows[0]?.created_at ?? -1);\n if (Number.isFinite(lastCreatedAt) && lastCreatedAt >= 0) {\n return journalEntries\n .filter((entry) => availableMigrations.includes(entry.fileName))\n .filter((entry) => entry.folderMillis <= lastCreatedAt)\n .map((entry) => entry.fileName)\n .slice(0, rows.length);\n }\n }\n }\n }\n\n const rows = await sql.unsafe<{ id: number }[]>(`SELECT id FROM ${qualifiedTable} ORDER BY id`);\n const journalMigrationFiles = await listJournalMigrationFiles();\n const appliedFromIds = rows\n .map((row) => journalMigrationFiles[row.id - 1])\n .filter((name): name is string => Boolean(name));\n if (appliedFromIds.length > 0) return appliedFromIds;\n\n return availableMigrations.slice(0, Math.max(0, rows.length));\n}\n\nexport type MigrationHistoryReconcileResult = {\n repairedMigrations: string[];\n remainingMigrations: string[];\n};\n\nexport async function reconcilePendingMigrationHistory(\n url: string,\n): Promise<MigrationHistoryReconcileResult> {\n const state = await inspectMigrations(url);\n if (state.status !== \"needsMigrations\" || state.reason !== \"pending-migrations\") {\n return { repairedMigrations: [], remainingMigrations: [] };\n }\n\n const sql = createUtilitySql(url);\n const repairedMigrations: string[] = [];\n\n try {\n const journalEntries = await listJournalMigrationEntries();\n const folderMillisByFile = new Map(journalEntries.map((entry) => [entry.fileName, entry.folderMillis]));\n const migrationTableSchema = await discoverMigrationTableSchema(sql);\n if (!migrationTableSchema) {\n return { repairedMigrations, remainingMigrations: state.pendingMigrations };\n }\n\n const columnNames = await getMigrationTableColumnNames(sql, migrationTableSchema);\n const qualifiedTable = `${quoteIdentifier(migrationTableSchema)}.${quoteIdentifier(DRIZZLE_MIGRATIONS_TABLE)}`;\n\n for (const migrationFile of state.pendingMigrations) {\n const migrationContent = await readMigrationFileContent(migrationFile);\n const alreadyApplied = await migrationContentAlreadyApplied(sql, migrationContent);\n if (!alreadyApplied) break;\n\n const hash = createHash(\"sha256\").update(migrationContent).digest(\"hex\");\n const folderMillis = folderMillisByFile.get(migrationFile) ?? Date.now();\n const existingByHash = columnNames.has(\"hash\")\n ? await sql.unsafe<{ created_at: string | number | null }[]>(\n `SELECT created_at FROM ${qualifiedTable} WHERE hash = ${quoteLiteral(hash)} ORDER BY created_at DESC LIMIT 1`,\n )\n : [];\n const existingByName = columnNames.has(\"name\")\n ? await sql.unsafe<{ created_at: string | number | null }[]>(\n `SELECT created_at FROM ${qualifiedTable} WHERE name = ${quoteLiteral(migrationFile)} ORDER BY created_at DESC LIMIT 1`,\n )\n : [];\n if (existingByHash.length > 0 || existingByName.length > 0) {\n if (columnNames.has(\"created_at\")) {\n const existingHashCreatedAt = Number(existingByHash[0]?.created_at ?? -1);\n if (existingByHash.length > 0 && Number.isFinite(existingHashCreatedAt) && existingHashCreatedAt < folderMillis) {\n await sql.unsafe(\n `UPDATE ${qualifiedTable} SET created_at = ${quoteLiteral(String(folderMillis))} WHERE hash = ${quoteLiteral(hash)} AND created_at < ${quoteLiteral(String(folderMillis))}`,\n );\n }\n\n const existingNameCreatedAt = Number(existingByName[0]?.created_at ?? -1);\n if (existingByName.length > 0 && Number.isFinite(existingNameCreatedAt) && existingNameCreatedAt < folderMillis) {\n await sql.unsafe(\n `UPDATE ${qualifiedTable} SET created_at = ${quoteLiteral(String(folderMillis))} WHERE name = ${quoteLiteral(migrationFile)} AND created_at < ${quoteLiteral(String(folderMillis))}`,\n );\n }\n }\n\n repairedMigrations.push(migrationFile);\n continue;\n }\n\n const insertColumns: string[] = [];\n const insertValues: string[] = [];\n\n if (columnNames.has(\"hash\")) {\n insertColumns.push(quoteIdentifier(\"hash\"));\n insertValues.push(quoteLiteral(hash));\n }\n if (columnNames.has(\"name\")) {\n insertColumns.push(quoteIdentifier(\"name\"));\n insertValues.push(quoteLiteral(migrationFile));\n }\n if (columnNames.has(\"created_at\")) {\n insertColumns.push(quoteIdentifier(\"created_at\"));\n insertValues.push(quoteLiteral(String(folderMillis)));\n }\n\n if (insertColumns.length === 0) break;\n\n await sql.unsafe(\n `INSERT INTO ${qualifiedTable} (${insertColumns.join(\", \")}) VALUES (${insertValues.join(\", \")})`,\n );\n repairedMigrations.push(migrationFile);\n }\n } finally {\n await sql.end();\n }\n\n const refreshed = await inspectMigrations(url);\n return {\n repairedMigrations,\n remainingMigrations:\n refreshed.status === \"needsMigrations\" ? refreshed.pendingMigrations : [],\n };\n}\n\nasync function discoverMigrationTableSchema(sql: ReturnType<typeof postgres>): Promise<string | null> {\n const rows = await sql<{ schemaName: string }[]>`\n SELECT n.nspname AS \"schemaName\"\n FROM pg_class c\n JOIN pg_namespace n ON n.oid = c.relnamespace\n WHERE c.relname = ${DRIZZLE_MIGRATIONS_TABLE} AND c.relkind = 'r'\n `;\n\n if (rows.length === 0) return null;\n\n const drizzleSchema = rows.find(({ schemaName }) => schemaName === \"drizzle\");\n if (drizzleSchema) return drizzleSchema.schemaName;\n\n const publicSchema = rows.find(({ schemaName }) => schemaName === \"public\");\n if (publicSchema) return publicSchema.schemaName;\n\n return rows[0]?.schemaName ?? null;\n}\n\nexport async function inspectMigrations(url: string): Promise<MigrationState> {\n const sql = createUtilitySql(url);\n\n try {\n const availableMigrations = await listMigrationFiles();\n const tableCountResult = await sql<{ count: number }[]>`\n select count(*)::int as count\n from information_schema.tables\n where table_schema = 'public'\n and table_type = 'BASE TABLE'\n `;\n const tableCount = tableCountResult[0]?.count ?? 0;\n\n const migrationTableSchema = await discoverMigrationTableSchema(sql);\n if (!migrationTableSchema) {\n if (tableCount > 0) {\n return {\n status: \"needsMigrations\",\n tableCount,\n availableMigrations,\n appliedMigrations: [],\n pendingMigrations: availableMigrations,\n reason: \"no-migration-journal-non-empty-db\",\n };\n }\n\n return {\n status: \"needsMigrations\",\n tableCount,\n availableMigrations,\n appliedMigrations: [],\n pendingMigrations: availableMigrations,\n reason: \"no-migration-journal-empty-db\",\n };\n }\n\n const appliedMigrations = await loadAppliedMigrations(sql, migrationTableSchema, availableMigrations);\n const pendingMigrations = availableMigrations.filter((name) => !appliedMigrations.includes(name));\n if (pendingMigrations.length === 0) {\n return {\n status: \"upToDate\",\n tableCount,\n availableMigrations,\n appliedMigrations,\n };\n }\n\n return {\n status: \"needsMigrations\",\n tableCount,\n availableMigrations,\n appliedMigrations,\n pendingMigrations,\n reason: \"pending-migrations\",\n };\n } finally {\n await sql.end();\n }\n}\n\nexport async function applyPendingMigrations(url: string): Promise<void> {\n const initialState = await inspectMigrations(url);\n if (initialState.status === \"upToDate\") return;\n\n if (initialState.reason === \"no-migration-journal-empty-db\") {\n const sql = createUtilitySql(url);\n try {\n const db = drizzlePg(sql);\n await migratePg(db, { migrationsFolder: MIGRATIONS_FOLDER });\n } finally {\n await sql.end();\n }\n\n let bootstrappedState = await inspectMigrations(url);\n if (bootstrappedState.status === \"upToDate\") return;\n if (bootstrappedState.reason === \"pending-migrations\") {\n const repair = await reconcilePendingMigrationHistory(url);\n if (repair.repairedMigrations.length > 0) {\n bootstrappedState = await inspectMigrations(url);\n }\n if (bootstrappedState.status === \"needsMigrations\" && bootstrappedState.reason === \"pending-migrations\") {\n await applyPendingMigrationsManually(url, bootstrappedState.pendingMigrations);\n bootstrappedState = await inspectMigrations(url);\n }\n }\n if (bootstrappedState.status === \"upToDate\") return;\n throw new Error(\n `Failed to bootstrap migrations: ${bootstrappedState.pendingMigrations.join(\", \")}`,\n );\n }\n\n if (initialState.reason === \"no-migration-journal-non-empty-db\") {\n throw new Error(\n \"Database has tables but no migration journal; automatic migration is unsafe. Initialize migration history manually.\",\n );\n }\n\n let state = await inspectMigrations(url);\n if (state.status === \"upToDate\") return;\n\n const repair = await reconcilePendingMigrationHistory(url);\n if (repair.repairedMigrations.length > 0) {\n state = await inspectMigrations(url);\n if (state.status === \"upToDate\") return;\n }\n\n if (state.status !== \"needsMigrations\" || state.reason !== \"pending-migrations\") {\n throw new Error(\"Migrations are still pending after migration-history reconciliation; run inspectMigrations for details.\");\n }\n\n await applyPendingMigrationsManually(url, state.pendingMigrations);\n\n const finalState = await inspectMigrations(url);\n if (finalState.status !== \"upToDate\") {\n throw new Error(\n `Failed to apply pending migrations: ${finalState.pendingMigrations.join(\", \")}`,\n );\n }\n}\n\nexport type MigrationBootstrapResult =\n | { migrated: true; reason: \"migrated-empty-db\"; tableCount: 0 }\n | { migrated: false; reason: \"already-migrated\"; tableCount: number }\n | { migrated: false; reason: \"not-empty-no-migration-journal\"; tableCount: number };\n\nexport async function migratePostgresIfEmpty(url: string): Promise<MigrationBootstrapResult> {\n const sql = createUtilitySql(url);\n\n try {\n const migrationTableSchema = await discoverMigrationTableSchema(sql);\n\n const tableCountResult = await sql<{ count: number }[]>`\n select count(*)::int as count\n from information_schema.tables\n where table_schema = 'public'\n and table_type = 'BASE TABLE'\n `;\n\n const tableCount = tableCountResult[0]?.count ?? 0;\n\n if (migrationTableSchema) {\n return { migrated: false, reason: \"already-migrated\", tableCount };\n }\n\n if (tableCount > 0) {\n return { migrated: false, reason: \"not-empty-no-migration-journal\", tableCount };\n }\n\n const db = drizzlePg(sql);\n await migratePg(db, { migrationsFolder: MIGRATIONS_FOLDER });\n\n return { migrated: true, reason: \"migrated-empty-db\", tableCount: 0 };\n } finally {\n await sql.end();\n }\n}\n\nexport async function ensurePostgresDatabase(\n url: string,\n databaseName: string,\n): Promise<\"created\" | \"exists\"> {\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(databaseName)) {\n throw new Error(`Unsafe database name: ${databaseName}`);\n }\n\n const sql = createUtilitySql(url);\n try {\n const existing = await sql<{ one: number }[]>`\n select 1 as one from pg_database where datname = ${databaseName} limit 1\n `;\n if (existing.length > 0) return \"exists\";\n\n await sql.unsafe(`create database \"${databaseName}\" encoding 'UTF8' lc_collate 'C' lc_ctype 'C' template template0`);\n return \"created\";\n } finally {\n await sql.end();\n }\n}\n\nexport type Db = ReturnType<typeof createDb>;\n", "import fs from \"node:fs\";\nimport net from \"node:net\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { applyPendingMigrations, ensurePostgresDatabase } from \"./client.js\";\n\ntype EmbeddedPostgresInstance = {\n initialise(): Promise<void>;\n start(): Promise<void>;\n stop(): Promise<void>;\n};\n\ntype EmbeddedPostgresCtor = new (opts: {\n databaseDir: string;\n user: string;\n password: string;\n port: number;\n persistent: boolean;\n initdbFlags?: string[];\n onLog?: (message: unknown) => void;\n onError?: (message: unknown) => void;\n}) => EmbeddedPostgresInstance;\n\nexport type EmbeddedPostgresTestSupport = {\n supported: boolean;\n reason?: string;\n};\n\nexport type EmbeddedPostgresTestDatabase = {\n connectionString: string;\n cleanup(): Promise<void>;\n};\n\nlet embeddedPostgresSupportPromise: Promise<EmbeddedPostgresTestSupport> | null = null;\n\nasync function getEmbeddedPostgresCtor(): Promise<EmbeddedPostgresCtor> {\n const mod = await import(\"embedded-postgres\");\n return mod.default as EmbeddedPostgresCtor;\n}\n\nasync function getAvailablePort(): Promise<number> {\n return await new Promise((resolve, reject) => {\n const server = net.createServer();\n server.unref();\n server.on(\"error\", reject);\n server.listen(0, \"127.0.0.1\", () => {\n const address = server.address();\n if (!address || typeof address === \"string\") {\n server.close(() => reject(new Error(\"Failed to allocate test port\")));\n return;\n }\n const { port } = address;\n server.close((error) => {\n if (error) reject(error);\n else resolve(port);\n });\n });\n });\n}\n\nfunction formatEmbeddedPostgresError(error: unknown): string {\n if (error instanceof Error && error.message.length > 0) return error.message;\n if (typeof error === \"string\" && error.length > 0) return error;\n return \"embedded Postgres startup failed\";\n}\n\nasync function probeEmbeddedPostgresSupport(): Promise<EmbeddedPostgresTestSupport> {\n const dataDir = fs.mkdtempSync(path.join(os.tmpdir(), \"paperclip-embedded-postgres-probe-\"));\n const port = await getAvailablePort();\n const EmbeddedPostgres = await getEmbeddedPostgresCtor();\n const instance = new EmbeddedPostgres({\n databaseDir: dataDir,\n user: \"paperclip\",\n password: \"paperclip\",\n port,\n persistent: true,\n initdbFlags: [\"--encoding=UTF8\", \"--locale=C\", \"--lc-messages=C\"],\n onLog: () => {},\n onError: () => {},\n });\n\n try {\n await instance.initialise();\n await instance.start();\n return { supported: true };\n } catch (error) {\n return {\n supported: false,\n reason: formatEmbeddedPostgresError(error),\n };\n } finally {\n await instance.stop().catch(() => {});\n fs.rmSync(dataDir, { recursive: true, force: true });\n }\n}\n\nexport async function getEmbeddedPostgresTestSupport(): Promise<EmbeddedPostgresTestSupport> {\n if (!embeddedPostgresSupportPromise) {\n embeddedPostgresSupportPromise = probeEmbeddedPostgresSupport();\n }\n return await embeddedPostgresSupportPromise;\n}\n\nexport async function startEmbeddedPostgresTestDatabase(\n tempDirPrefix: string,\n): Promise<EmbeddedPostgresTestDatabase> {\n const dataDir = fs.mkdtempSync(path.join(os.tmpdir(), tempDirPrefix));\n const port = await getAvailablePort();\n const EmbeddedPostgres = await getEmbeddedPostgresCtor();\n const instance = new EmbeddedPostgres({\n databaseDir: dataDir,\n user: \"paperclip\",\n password: \"paperclip\",\n port,\n persistent: true,\n initdbFlags: [\"--encoding=UTF8\", \"--locale=C\", \"--lc-messages=C\"],\n onLog: () => {},\n onError: () => {},\n });\n\n try {\n await instance.initialise();\n await instance.start();\n\n const adminConnectionString = `postgres://paperclip:paperclip@127.0.0.1:${port}/postgres`;\n await ensurePostgresDatabase(adminConnectionString, \"paperclip\");\n const connectionString = `postgres://paperclip:paperclip@127.0.0.1:${port}/paperclip`;\n await applyPendingMigrations(connectionString);\n\n return {\n connectionString,\n cleanup: async () => {\n await instance.stop().catch(() => {});\n fs.rmSync(dataDir, { recursive: true, force: true });\n },\n };\n } catch (error) {\n await instance.stop().catch(() => {});\n fs.rmSync(dataDir, { recursive: true, force: true });\n throw new Error(\n `Failed to start embedded PostgreSQL test database: ${formatEmbeddedPostgresError(error)}`,\n );\n }\n}\n", "import { createWriteStream, existsSync, mkdirSync, readdirSync, statSync, unlinkSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport { basename, resolve } from \"node:path\";\nimport postgres from \"postgres\";\n\nexport type RunDatabaseBackupOptions = {\n connectionString: string;\n backupDir: string;\n retentionDays: number;\n filenamePrefix?: string;\n connectTimeoutSeconds?: number;\n includeMigrationJournal?: boolean;\n excludeTables?: string[];\n nullifyColumns?: Record<string, string[]>;\n};\n\nexport type RunDatabaseBackupResult = {\n backupFile: string;\n sizeBytes: number;\n prunedCount: number;\n};\n\nexport type RunDatabaseRestoreOptions = {\n connectionString: string;\n backupFile: string;\n connectTimeoutSeconds?: number;\n};\n\ntype SequenceDefinition = {\n sequence_schema: string;\n sequence_name: string;\n data_type: string;\n start_value: string;\n minimum_value: string;\n maximum_value: string;\n increment: string;\n cycle_option: \"YES\" | \"NO\";\n owner_schema: string | null;\n owner_table: string | null;\n owner_column: string | null;\n};\n\ntype TableDefinition = {\n schema_name: string;\n tablename: string;\n};\n\nconst DRIZZLE_SCHEMA = \"drizzle\";\nconst DRIZZLE_MIGRATIONS_TABLE = \"__drizzle_migrations\";\nconst DEFAULT_BACKUP_WRITE_BUFFER_BYTES = 1024 * 1024;\n\nconst STATEMENT_BREAKPOINT = \"-- paperclip statement breakpoint 69f6f3f1-42fd-46a6-bf17-d1d85f8f3900\";\n\nfunction sanitizeRestoreErrorMessage(error: unknown): string {\n if (error && typeof error === \"object\") {\n const record = error as Record<string, unknown>;\n const firstLine = typeof record.message === \"string\"\n ? record.message.split(/\\r?\\n/, 1)[0]?.trim()\n : \"\";\n const detail = typeof record.detail === \"string\" ? record.detail.trim() : \"\";\n const severity = typeof record.severity === \"string\" ? record.severity.trim() : \"\";\n const message = firstLine || detail || (error instanceof Error ? error.message : String(error));\n return severity ? `${severity}: ${message}` : message;\n }\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction timestamp(date: Date = new Date()): string {\n const pad = (n: number) => String(n).padStart(2, \"0\");\n return `${date.getFullYear()}${pad(date.getMonth() + 1)}${pad(date.getDate())}-${pad(date.getHours())}${pad(date.getMinutes())}${pad(date.getSeconds())}`;\n}\n\nfunction pruneOldBackups(backupDir: string, retentionDays: number, filenamePrefix: string): number {\n if (!existsSync(backupDir)) return 0;\n const safeRetention = Math.max(1, Math.trunc(retentionDays));\n const cutoff = Date.now() - safeRetention * 24 * 60 * 60 * 1000;\n let pruned = 0;\n\n for (const name of readdirSync(backupDir)) {\n if (!name.startsWith(`${filenamePrefix}-`) || !name.endsWith(\".sql\")) continue;\n const fullPath = resolve(backupDir, name);\n const stat = statSync(fullPath);\n if (stat.mtimeMs < cutoff) {\n unlinkSync(fullPath);\n pruned++;\n }\n }\n\n return pruned;\n}\n\nfunction formatBackupSize(sizeBytes: number): string {\n if (sizeBytes < 1024) return `${sizeBytes}B`;\n if (sizeBytes < 1024 * 1024) return `${(sizeBytes / 1024).toFixed(1)}K`;\n return `${(sizeBytes / (1024 * 1024)).toFixed(1)}M`;\n}\n\nfunction formatSqlLiteral(value: string): string {\n const sanitized = value.replace(/\\u0000/g, \"\");\n let tag = \"$paperclip$\";\n while (sanitized.includes(tag)) {\n tag = `$paperclip_${Math.random().toString(36).slice(2, 8)}$`;\n }\n return `${tag}${sanitized}${tag}`;\n}\n\nfunction normalizeTableNameSet(values: string[] | undefined): Set<string> {\n return new Set(\n (values ?? [])\n .map((value) => value.trim())\n .filter((value) => value.length > 0),\n );\n}\n\nfunction normalizeNullifyColumnMap(values: Record<string, string[]> | undefined): Map<string, Set<string>> {\n const out = new Map<string, Set<string>>();\n if (!values) return out;\n for (const [tableName, columns] of Object.entries(values)) {\n const normalizedTable = tableName.trim();\n if (normalizedTable.length === 0) continue;\n const normalizedColumns = new Set(\n columns\n .map((column) => column.trim())\n .filter((column) => column.length > 0),\n );\n if (normalizedColumns.size > 0) {\n out.set(normalizedTable, normalizedColumns);\n }\n }\n return out;\n}\n\nfunction quoteIdentifier(value: string): string {\n return `\"${value.replaceAll(\"\\\"\", \"\\\"\\\"\")}\"`;\n}\n\nfunction quoteQualifiedName(schemaName: string, objectName: string): string {\n return `${quoteIdentifier(schemaName)}.${quoteIdentifier(objectName)}`;\n}\n\nfunction tableKey(schemaName: string, tableName: string): string {\n return `${schemaName}.${tableName}`;\n}\n\nexport function createBufferedTextFileWriter(filePath: string, maxBufferedBytes = DEFAULT_BACKUP_WRITE_BUFFER_BYTES) {\n const stream = createWriteStream(filePath, { encoding: \"utf8\" });\n const flushThreshold = Math.max(1, Math.trunc(maxBufferedBytes));\n let bufferedLines: string[] = [];\n let bufferedBytes = 0;\n let firstChunk = true;\n let closed = false;\n let streamError: Error | null = null;\n let pendingWrite = Promise.resolve();\n\n stream.on(\"error\", (error) => {\n streamError = error;\n });\n\n const writeChunk = async (chunk: string): Promise<void> => {\n if (streamError) throw streamError;\n const canContinue = stream.write(chunk);\n if (!canContinue) {\n await new Promise<void>((resolve, reject) => {\n const handleDrain = () => {\n cleanup();\n resolve();\n };\n const handleError = (error: Error) => {\n cleanup();\n reject(error);\n };\n const cleanup = () => {\n stream.off(\"drain\", handleDrain);\n stream.off(\"error\", handleError);\n };\n stream.once(\"drain\", handleDrain);\n stream.once(\"error\", handleError);\n });\n }\n if (streamError) throw streamError;\n };\n\n const flushBufferedLines = () => {\n if (bufferedLines.length === 0) return;\n const linesToWrite = bufferedLines;\n bufferedLines = [];\n bufferedBytes = 0;\n const chunkBody = linesToWrite.join(\"\\n\");\n const chunk = firstChunk ? chunkBody : `\\n${chunkBody}`;\n firstChunk = false;\n pendingWrite = pendingWrite.then(() => writeChunk(chunk));\n };\n\n return {\n emit(line: string) {\n if (closed) {\n throw new Error(`Cannot write to closed backup file: ${filePath}`);\n }\n if (streamError) throw streamError;\n bufferedLines.push(line);\n bufferedBytes += Buffer.byteLength(line, \"utf8\") + 1;\n if (bufferedBytes >= flushThreshold) {\n flushBufferedLines();\n }\n },\n async close() {\n if (closed) return;\n closed = true;\n flushBufferedLines();\n await pendingWrite;\n await new Promise<void>((resolve, reject) => {\n if (streamError) {\n reject(streamError);\n return;\n }\n stream.end((error?: Error | null) => {\n if (error) reject(error);\n else resolve();\n });\n });\n if (streamError) throw streamError;\n },\n async abort() {\n if (closed) return;\n closed = true;\n bufferedLines = [];\n bufferedBytes = 0;\n stream.destroy();\n await pendingWrite.catch(() => {});\n if (existsSync(filePath)) {\n try {\n unlinkSync(filePath);\n } catch {\n // Preserve the original backup failure if temporary file cleanup also fails.\n }\n }\n },\n };\n}\n\nexport async function runDatabaseBackup(opts: RunDatabaseBackupOptions): Promise<RunDatabaseBackupResult> {\n const filenamePrefix = opts.filenamePrefix ?? \"paperclip\";\n const retentionDays = Math.max(1, Math.trunc(opts.retentionDays));\n const connectTimeout = Math.max(1, Math.trunc(opts.connectTimeoutSeconds ?? 5));\n const includeMigrationJournal = opts.includeMigrationJournal === true;\n const excludedTableNames = normalizeTableNameSet(opts.excludeTables);\n const nullifiedColumnsByTable = normalizeNullifyColumnMap(opts.nullifyColumns);\n const sql = postgres(opts.connectionString, { max: 1, connect_timeout: connectTimeout });\n mkdirSync(opts.backupDir, { recursive: true });\n const backupFile = resolve(opts.backupDir, `${filenamePrefix}-${timestamp()}.sql`);\n const writer = createBufferedTextFileWriter(backupFile);\n\n try {\n await sql`SELECT 1`;\n\n const emit = (line: string) => writer.emit(line);\n const emitStatement = (statement: string) => {\n emit(statement);\n emit(STATEMENT_BREAKPOINT);\n };\n const emitStatementBoundary = () => {\n emit(STATEMENT_BREAKPOINT);\n };\n\n emit(\"-- Paperclip database backup\");\n emit(`-- Created: ${new Date().toISOString()}`);\n emit(\"\");\n emitStatement(\"BEGIN;\");\n emitStatement(\"SET LOCAL session_replication_role = replica;\");\n emitStatement(\"SET LOCAL client_min_messages = warning;\");\n emit(\"\");\n\n const allTables = await sql<TableDefinition[]>`\n SELECT table_schema AS schema_name, table_name AS tablename\n FROM information_schema.tables\n WHERE table_type = 'BASE TABLE'\n AND (\n table_schema = 'public'\n OR (${includeMigrationJournal}::boolean AND table_schema = ${DRIZZLE_SCHEMA} AND table_name = ${DRIZZLE_MIGRATIONS_TABLE})\n )\n ORDER BY table_schema, table_name\n `;\n const tables = allTables;\n const includedTableNames = new Set(tables.map(({ schema_name, tablename }) => tableKey(schema_name, tablename)));\n\n // Get all enums\n const enums = await sql<{ typname: string; labels: string[] }[]>`\n SELECT t.typname, array_agg(e.enumlabel ORDER BY e.enumsortorder) AS labels\n FROM pg_type t\n JOIN pg_enum e ON t.oid = e.enumtypid\n JOIN pg_namespace n ON t.typnamespace = n.oid\n WHERE n.nspname = 'public'\n GROUP BY t.typname\n ORDER BY t.typname\n `;\n\n for (const e of enums) {\n const labels = e.labels.map((l) => `'${l.replace(/'/g, \"''\")}'`).join(\", \");\n emitStatement(`CREATE TYPE \"public\".\"${e.typname}\" AS ENUM (${labels});`);\n }\n if (enums.length > 0) emit(\"\");\n\n const allSequences = await sql<SequenceDefinition[]>`\n SELECT\n s.sequence_schema,\n s.sequence_name,\n s.data_type,\n s.start_value,\n s.minimum_value,\n s.maximum_value,\n s.increment,\n s.cycle_option,\n tblns.nspname AS owner_schema,\n tbl.relname AS owner_table,\n attr.attname AS owner_column\n FROM information_schema.sequences s\n JOIN pg_class seq ON seq.relname = s.sequence_name\n JOIN pg_namespace n ON n.oid = seq.relnamespace AND n.nspname = s.sequence_schema\n LEFT JOIN pg_depend dep ON dep.objid = seq.oid AND dep.deptype = 'a'\n LEFT JOIN pg_class tbl ON tbl.oid = dep.refobjid\n LEFT JOIN pg_namespace tblns ON tblns.oid = tbl.relnamespace\n LEFT JOIN pg_attribute attr ON attr.attrelid = tbl.oid AND attr.attnum = dep.refobjsubid\n WHERE s.sequence_schema = 'public'\n OR (${includeMigrationJournal}::boolean AND s.sequence_schema = ${DRIZZLE_SCHEMA})\n ORDER BY s.sequence_schema, s.sequence_name\n `;\n const sequences = allSequences.filter(\n (seq) => !seq.owner_table || includedTableNames.has(tableKey(seq.owner_schema ?? \"public\", seq.owner_table)),\n );\n\n const schemas = new Set<string>();\n for (const table of tables) schemas.add(table.schema_name);\n for (const seq of sequences) schemas.add(seq.sequence_schema);\n const extraSchemas = [...schemas].filter((schemaName) => schemaName !== \"public\");\n if (extraSchemas.length > 0) {\n emit(\"-- Schemas\");\n for (const schemaName of extraSchemas) {\n emitStatement(`CREATE SCHEMA IF NOT EXISTS ${quoteIdentifier(schemaName)};`);\n }\n emit(\"\");\n }\n\n if (sequences.length > 0) {\n emit(\"-- Sequences\");\n for (const seq of sequences) {\n const qualifiedSequenceName = quoteQualifiedName(seq.sequence_schema, seq.sequence_name);\n emitStatement(`DROP SEQUENCE IF EXISTS ${qualifiedSequenceName} CASCADE;`);\n emitStatement(\n `CREATE SEQUENCE ${qualifiedSequenceName} AS ${seq.data_type} INCREMENT BY ${seq.increment} MINVALUE ${seq.minimum_value} MAXVALUE ${seq.maximum_value} START WITH ${seq.start_value}${seq.cycle_option === \"YES\" ? \" CYCLE\" : \" NO CYCLE\"};`,\n );\n }\n emit(\"\");\n }\n\n // Get full CREATE TABLE DDL via column info\n for (const { schema_name, tablename } of tables) {\n const qualifiedTableName = quoteQualifiedName(schema_name, tablename);\n const columns = await sql<{\n column_name: string;\n data_type: string;\n udt_name: string;\n is_nullable: string;\n column_default: string | null;\n character_maximum_length: number | null;\n numeric_precision: number | null;\n numeric_scale: number | null;\n }[]>`\n SELECT column_name, data_type, udt_name, is_nullable, column_default,\n character_maximum_length, numeric_precision, numeric_scale\n FROM information_schema.columns\n WHERE table_schema = ${schema_name} AND table_name = ${tablename}\n ORDER BY ordinal_position\n `;\n\n emit(`-- Table: ${schema_name}.${tablename}`);\n emitStatement(`DROP TABLE IF EXISTS ${qualifiedTableName} CASCADE;`);\n\n const colDefs: string[] = [];\n for (const col of columns) {\n let typeStr: string;\n if (col.data_type === \"USER-DEFINED\") {\n typeStr = `\"${col.udt_name}\"`;\n } else if (col.data_type === \"ARRAY\") {\n typeStr = `${col.udt_name.replace(/^_/, \"\")}[]`;\n } else if (col.data_type === \"character varying\") {\n typeStr = col.character_maximum_length\n ? `varchar(${col.character_maximum_length})`\n : \"varchar\";\n } else if (col.data_type === \"numeric\" && col.numeric_precision != null) {\n typeStr =\n col.numeric_scale != null\n ? `numeric(${col.numeric_precision}, ${col.numeric_scale})`\n : `numeric(${col.numeric_precision})`;\n } else {\n typeStr = col.data_type;\n }\n\n let def = ` \"${col.column_name}\" ${typeStr}`;\n if (col.column_default != null) def += ` DEFAULT ${col.column_default}`;\n if (col.is_nullable === \"NO\") def += \" NOT NULL\";\n colDefs.push(def);\n }\n\n // Primary key\n const pk = await sql<{ constraint_name: string; column_names: string[] }[]>`\n SELECT c.conname AS constraint_name,\n array_agg(a.attname ORDER BY array_position(c.conkey, a.attnum)) AS column_names\n FROM pg_constraint c\n JOIN pg_class t ON t.oid = c.conrelid\n JOIN pg_namespace n ON n.oid = t.relnamespace\n JOIN pg_attribute a ON a.attrelid = t.oid AND a.attnum = ANY(c.conkey)\n WHERE n.nspname = ${schema_name} AND t.relname = ${tablename} AND c.contype = 'p'\n GROUP BY c.conname\n `;\n for (const p of pk) {\n const cols = p.column_names.map((c) => `\"${c}\"`).join(\", \");\n colDefs.push(` CONSTRAINT \"${p.constraint_name}\" PRIMARY KEY (${cols})`);\n }\n\n emit(`CREATE TABLE ${qualifiedTableName} (`);\n emit(colDefs.join(\",\\n\"));\n emit(\");\");\n emitStatementBoundary();\n emit(\"\");\n }\n\n const ownedSequences = sequences.filter((seq) => seq.owner_table && seq.owner_column);\n if (ownedSequences.length > 0) {\n emit(\"-- Sequence ownership\");\n for (const seq of ownedSequences) {\n emitStatement(\n `ALTER SEQUENCE ${quoteQualifiedName(seq.sequence_schema, seq.sequence_name)} OWNED BY ${quoteQualifiedName(seq.owner_schema ?? \"public\", seq.owner_table!)}.${quoteIdentifier(seq.owner_column!)};`,\n );\n }\n emit(\"\");\n }\n\n // Foreign keys (after all tables created)\n const allForeignKeys = await sql<{\n constraint_name: string;\n source_schema: string;\n source_table: string;\n source_columns: string[];\n target_schema: string;\n target_table: string;\n target_columns: string[];\n update_rule: string;\n delete_rule: string;\n }[]>`\n SELECT\n c.conname AS constraint_name,\n srcn.nspname AS source_schema,\n src.relname AS source_table,\n array_agg(sa.attname ORDER BY array_position(c.conkey, sa.attnum)) AS source_columns,\n tgtn.nspname AS target_schema,\n tgt.relname AS target_table,\n array_agg(ta.attname ORDER BY array_position(c.confkey, ta.attnum)) AS target_columns,\n CASE c.confupdtype WHEN 'a' THEN 'NO ACTION' WHEN 'r' THEN 'RESTRICT' WHEN 'c' THEN 'CASCADE' WHEN 'n' THEN 'SET NULL' WHEN 'd' THEN 'SET DEFAULT' END AS update_rule,\n CASE c.confdeltype WHEN 'a' THEN 'NO ACTION' WHEN 'r' THEN 'RESTRICT' WHEN 'c' THEN 'CASCADE' WHEN 'n' THEN 'SET NULL' WHEN 'd' THEN 'SET DEFAULT' END AS delete_rule\n FROM pg_constraint c\n JOIN pg_class src ON src.oid = c.conrelid\n JOIN pg_namespace srcn ON srcn.oid = src.relnamespace\n JOIN pg_class tgt ON tgt.oid = c.confrelid\n JOIN pg_namespace tgtn ON tgtn.oid = tgt.relnamespace\n JOIN pg_attribute sa ON sa.attrelid = src.oid AND sa.attnum = ANY(c.conkey)\n JOIN pg_attribute ta ON ta.attrelid = tgt.oid AND ta.attnum = ANY(c.confkey)\n WHERE c.contype = 'f' AND (\n srcn.nspname = 'public'\n OR (${includeMigrationJournal}::boolean AND srcn.nspname = ${DRIZZLE_SCHEMA})\n )\n GROUP BY c.conname, srcn.nspname, src.relname, tgtn.nspname, tgt.relname, c.confupdtype, c.confdeltype\n ORDER BY srcn.nspname, src.relname, c.conname\n `;\n const fks = allForeignKeys.filter(\n (fk) => includedTableNames.has(tableKey(fk.source_schema, fk.source_table))\n && includedTableNames.has(tableKey(fk.target_schema, fk.target_table)),\n );\n\n if (fks.length > 0) {\n emit(\"-- Foreign keys\");\n for (const fk of fks) {\n const srcCols = fk.source_columns.map((c) => `\"${c}\"`).join(\", \");\n const tgtCols = fk.target_columns.map((c) => `\"${c}\"`).join(\", \");\n emitStatement(\n `ALTER TABLE ${quoteQualifiedName(fk.source_schema, fk.source_table)} ADD CONSTRAINT \"${fk.constraint_name}\" FOREIGN KEY (${srcCols}) REFERENCES ${quoteQualifiedName(fk.target_schema, fk.target_table)} (${tgtCols}) ON UPDATE ${fk.update_rule} ON DELETE ${fk.delete_rule};`,\n );\n }\n emit(\"\");\n }\n\n // Unique constraints\n const allUniqueConstraints = await sql<{\n constraint_name: string;\n schema_name: string;\n tablename: string;\n column_names: string[];\n }[]>`\n SELECT c.conname AS constraint_name,\n n.nspname AS schema_name,\n t.relname AS tablename,\n array_agg(a.attname ORDER BY array_position(c.conkey, a.attnum)) AS column_names\n FROM pg_constraint c\n JOIN pg_class t ON t.oid = c.conrelid\n JOIN pg_namespace n ON n.oid = t.relnamespace\n JOIN pg_attribute a ON a.attrelid = t.oid AND a.attnum = ANY(c.conkey)\n WHERE c.contype = 'u' AND (\n n.nspname = 'public'\n OR (${includeMigrationJournal}::boolean AND n.nspname = ${DRIZZLE_SCHEMA})\n )\n GROUP BY c.conname, n.nspname, t.relname\n ORDER BY n.nspname, t.relname, c.conname\n `;\n const uniques = allUniqueConstraints.filter((entry) => includedTableNames.has(tableKey(entry.schema_name, entry.tablename)));\n\n if (uniques.length > 0) {\n emit(\"-- Unique constraints\");\n for (const u of uniques) {\n const cols = u.column_names.map((c) => `\"${c}\"`).join(\", \");\n emitStatement(`ALTER TABLE ${quoteQualifiedName(u.schema_name, u.tablename)} ADD CONSTRAINT \"${u.constraint_name}\" UNIQUE (${cols});`);\n }\n emit(\"\");\n }\n\n // Indexes (non-primary, non-unique-constraint)\n const allIndexes = await sql<{ schema_name: string; tablename: string; indexdef: string }[]>`\n SELECT schemaname AS schema_name, tablename, indexdef\n FROM pg_indexes\n WHERE (\n schemaname = 'public'\n OR (${includeMigrationJournal}::boolean AND schemaname = ${DRIZZLE_SCHEMA})\n )\n AND indexname NOT IN (\n SELECT conname FROM pg_constraint c\n JOIN pg_namespace n ON n.oid = c.connamespace\n WHERE n.nspname = pg_indexes.schemaname\n )\n ORDER BY schemaname, tablename, indexname\n `;\n const indexes = allIndexes.filter((entry) => includedTableNames.has(tableKey(entry.schema_name, entry.tablename)));\n\n if (indexes.length > 0) {\n emit(\"-- Indexes\");\n for (const idx of indexes) {\n emitStatement(`${idx.indexdef};`);\n }\n emit(\"\");\n }\n\n // Dump data for each table\n for (const { schema_name, tablename } of tables) {\n const qualifiedTableName = quoteQualifiedName(schema_name, tablename);\n const count = await sql.unsafe<{ n: number }[]>(`SELECT count(*)::int AS n FROM ${qualifiedTableName}`);\n if (excludedTableNames.has(tablename) || (count[0]?.n ?? 0) === 0) continue;\n\n // Get column info for this table\n const cols = await sql<{ column_name: string; data_type: string }[]>`\n SELECT column_name, data_type\n FROM information_schema.columns\n WHERE table_schema = ${schema_name} AND table_name = ${tablename}\n ORDER BY ordinal_position\n `;\n const colNames = cols.map((c) => `\"${c.column_name}\"`).join(\", \");\n\n emit(`-- Data for: ${schema_name}.${tablename} (${count[0]!.n} rows)`);\n\n const rows = await sql.unsafe(`SELECT * FROM ${qualifiedTableName}`).values();\n const nullifiedColumns = nullifiedColumnsByTable.get(tablename) ?? new Set<string>();\n for (const row of rows) {\n const values = row.map((rawValue: unknown, index) => {\n const columnName = cols[index]?.column_name;\n const val = columnName && nullifiedColumns.has(columnName) ? null : rawValue;\n if (val === null || val === undefined) return \"NULL\";\n if (typeof val === \"boolean\") return val ? \"true\" : \"false\";\n if (typeof val === \"number\") return String(val);\n if (val instanceof Date) return formatSqlLiteral(val.toISOString());\n if (typeof val === \"object\") return formatSqlLiteral(JSON.stringify(val));\n return formatSqlLiteral(String(val));\n });\n emitStatement(`INSERT INTO ${qualifiedTableName} (${colNames}) VALUES (${values.join(\", \")});`);\n }\n emit(\"\");\n }\n\n // Sequence values\n if (sequences.length > 0) {\n emit(\"-- Sequence values\");\n for (const seq of sequences) {\n const qualifiedSequenceName = quoteQualifiedName(seq.sequence_schema, seq.sequence_name);\n const val = await sql.unsafe<{ last_value: string; is_called: boolean }[]>(\n `SELECT last_value::text, is_called FROM ${qualifiedSequenceName}`,\n );\n const skipSequenceValue =\n seq.owner_table !== null\n && excludedTableNames.has(seq.owner_table);\n if (val[0] && !skipSequenceValue) {\n emitStatement(`SELECT setval('${qualifiedSequenceName.replaceAll(\"'\", \"''\")}', ${val[0].last_value}, ${val[0].is_called ? \"true\" : \"false\"});`);\n }\n }\n emit(\"\");\n }\n\n emitStatement(\"COMMIT;\");\n emit(\"\");\n\n await writer.close();\n\n const sizeBytes = statSync(backupFile).size;\n const prunedCount = pruneOldBackups(opts.backupDir, retentionDays, filenamePrefix);\n\n return {\n backupFile,\n sizeBytes,\n prunedCount,\n };\n } catch (error) {\n await writer.abort();\n throw error;\n } finally {\n await sql.end();\n }\n}\n\nexport async function runDatabaseRestore(opts: RunDatabaseRestoreOptions): Promise<void> {\n const connectTimeout = Math.max(1, Math.trunc(opts.connectTimeoutSeconds ?? 5));\n const sql = postgres(opts.connectionString, { max: 1, connect_timeout: connectTimeout });\n\n try {\n await sql`SELECT 1`;\n const contents = await readFile(opts.backupFile, \"utf8\");\n const statements = contents\n .split(STATEMENT_BREAKPOINT)\n .map((statement) => statement.trim())\n .filter((statement) => statement.length > 0);\n\n for (const statement of statements) {\n await sql.unsafe(statement).execute();\n }\n } catch (error) {\n const statementPreview = typeof error === \"object\" && error !== null && typeof (error as Record<string, unknown>).query === \"string\"\n ? String((error as Record<string, unknown>).query)\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .find((line) => line.length > 0 && !line.startsWith(\"--\"))\n : null;\n throw new Error(\n `Failed to restore ${basename(opts.backupFile)}: ${sanitizeRestoreErrorMessage(error)}${statementPreview ? ` [statement: ${statementPreview.slice(0, 120)}]` : \"\"}`,\n );\n } finally {\n await sql.end();\n }\n}\n\nexport function formatDatabaseBackupResult(result: RunDatabaseBackupResult): string {\n const size = formatBackupSize(result.sizeBytes);\n const pruned = result.prunedCount > 0 ? `; pruned ${result.prunedCount} old backup(s)` : \"\";\n return `${result.backupFile} (${size}${pruned})`;\n}\n", "const DEFAULT_RECENT_LOG_LIMIT = 40;\nconst RECENT_LOG_SUMMARY_LINES = 8;\n\nfunction toError(error: unknown, fallbackMessage: string): Error {\n if (error instanceof Error) return error;\n if (error === undefined) return new Error(fallbackMessage);\n if (typeof error === \"string\") return new Error(`${fallbackMessage}: ${error}`);\n\n try {\n return new Error(`${fallbackMessage}: ${JSON.stringify(error)}`);\n } catch {\n return new Error(`${fallbackMessage}: ${String(error)}`);\n }\n}\n\nfunction summarizeRecentLogs(recentLogs: string[]): string | null {\n if (recentLogs.length === 0) return null;\n return recentLogs\n .slice(-RECENT_LOG_SUMMARY_LINES)\n .map((line) => line.trim())\n .filter((line) => line.length > 0)\n .join(\" | \");\n}\n\nfunction detectEmbeddedPostgresHint(recentLogs: string[]): string | null {\n const haystack = recentLogs.join(\"\\n\").toLowerCase();\n if (!haystack.includes(\"could not create shared memory segment\")) {\n return null;\n }\n\n return (\n \"Embedded PostgreSQL bootstrap could not allocate shared memory. \" +\n \"On macOS, this usually means the host's kern.sysv.shm* limits are too low for another local PostgreSQL cluster. \" +\n \"Stop other local PostgreSQL servers or raise the shared-memory sysctls, then retry.\"\n );\n}\n\nexport function createEmbeddedPostgresLogBuffer(limit = DEFAULT_RECENT_LOG_LIMIT): {\n append(message: unknown): void;\n getRecentLogs(): string[];\n} {\n const recentLogs: string[] = [];\n\n return {\n append(message: unknown) {\n const text =\n typeof message === \"string\"\n ? message\n : message instanceof Error\n ? message.message\n : String(message ?? \"\");\n\n for (const rawLine of text.split(/\\r?\\n/)) {\n const line = rawLine.trim();\n if (!line) continue;\n recentLogs.push(line);\n if (recentLogs.length > limit) {\n recentLogs.splice(0, recentLogs.length - limit);\n }\n }\n },\n getRecentLogs() {\n return [...recentLogs];\n },\n };\n}\n\nexport function formatEmbeddedPostgresError(\n error: unknown,\n input: {\n fallbackMessage: string;\n recentLogs?: string[];\n },\n): Error {\n const baseError = toError(error, input.fallbackMessage);\n const recentLogs = input.recentLogs ?? [];\n const parts = [baseError.message];\n const hint = detectEmbeddedPostgresHint(recentLogs);\n const recentSummary = summarizeRecentLogs(recentLogs);\n\n if (hint) {\n parts.push(hint);\n }\n if (recentSummary) {\n parts.push(`Recent embedded Postgres logs: ${recentSummary}`);\n }\n\n return new Error(parts.join(\" \"));\n}\n", "export {\n createDb,\n getPostgresDataDirectory,\n ensurePostgresDatabase,\n inspectMigrations,\n applyPendingMigrations,\n reconcilePendingMigrationHistory,\n type MigrationState,\n type MigrationHistoryReconcileResult,\n migratePostgresIfEmpty,\n type MigrationBootstrapResult,\n type Db,\n} from \"./client.js\";\nexport {\n getEmbeddedPostgresTestSupport,\n startEmbeddedPostgresTestDatabase,\n type EmbeddedPostgresTestDatabase,\n type EmbeddedPostgresTestSupport,\n} from \"./test-embedded-postgres.js\";\nexport {\n runDatabaseBackup,\n runDatabaseRestore,\n formatDatabaseBackupResult,\n type RunDatabaseBackupOptions,\n type RunDatabaseBackupResult,\n type RunDatabaseRestoreOptions,\n} from \"./backup-lib.js\";\nexport {\n createEmbeddedPostgresLogBuffer,\n formatEmbeddedPostgresError,\n} from \"./embedded-postgres-error.js\";\nexport * from \"./schema/index.js\";\n", "import { createHash, randomBytes } from \"node:crypto\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { and, eq, gt, isNull } from \"drizzle-orm\";\nimport { createDb, instanceUserRoles, invites } from \"@paperclipai/db\";\nimport { loadPaperclipEnvFile } from \"../config/env.js\";\nimport { readConfig, resolveConfigPath } from \"../config/store.js\";\n\nfunction hashToken(token: string) {\n return createHash(\"sha256\").update(token).digest(\"hex\");\n}\n\nfunction createInviteToken() {\n return `pcp_bootstrap_${randomBytes(24).toString(\"hex\")}`;\n}\n\nfunction resolveDbUrl(configPath?: string, explicitDbUrl?: string) {\n if (explicitDbUrl) return explicitDbUrl;\n const config = readConfig(configPath);\n if (process.env.DATABASE_URL) return process.env.DATABASE_URL;\n if (config?.database.mode === \"postgres\" && config.database.connectionString) {\n return config.database.connectionString;\n }\n if (config?.database.mode === \"embedded-postgres\") {\n const port = config.database.embeddedPostgresPort ?? 54329;\n return `postgres://paperclip:paperclip@127.0.0.1:${port}/paperclip`;\n }\n return null;\n}\n\nfunction resolveBaseUrl(configPath?: string, explicitBaseUrl?: string) {\n if (explicitBaseUrl) return explicitBaseUrl.replace(/\\/+$/, \"\");\n const fromEnv =\n process.env.PAPERCLIP_PUBLIC_URL ??\n process.env.PAPERCLIP_AUTH_PUBLIC_BASE_URL ??\n process.env.BETTER_AUTH_URL ??\n process.env.BETTER_AUTH_BASE_URL;\n if (fromEnv?.trim()) return fromEnv.trim().replace(/\\/+$/, \"\");\n const config = readConfig(configPath);\n if (config?.auth.baseUrlMode === \"explicit\" && config.auth.publicBaseUrl) {\n return config.auth.publicBaseUrl.replace(/\\/+$/, \"\");\n }\n const host = config?.server.host ?? \"localhost\";\n const port = config?.server.port ?? 3100;\n const publicHost = host === \"0.0.0.0\" ? \"localhost\" : host;\n return `http://${publicHost}:${port}`;\n}\n\nexport async function bootstrapCeoInvite(opts: {\n config?: string;\n force?: boolean;\n expiresHours?: number;\n baseUrl?: string;\n dbUrl?: string;\n}) {\n const configPath = resolveConfigPath(opts.config);\n loadPaperclipEnvFile(configPath);\n const config = readConfig(configPath);\n if (!config) {\n p.log.error(`No config found at ${configPath}. Run ${pc.cyan(\"paperclip onboard\")} first.`);\n return;\n }\n\n if (config.server.deploymentMode !== \"authenticated\") {\n p.log.info(\"Deployment mode is local_trusted. Bootstrap CEO invite is only required for authenticated mode.\");\n return;\n }\n\n const dbUrl = resolveDbUrl(configPath, opts.dbUrl);\n if (!dbUrl) {\n p.log.error(\n \"Could not resolve database connection for bootstrap.\",\n );\n return;\n }\n\n const db = createDb(dbUrl);\n const closableDb = db as typeof db & {\n $client?: {\n end?: (options?: { timeout?: number }) => Promise<void>;\n };\n };\n try {\n const existingAdminCount = await db\n .select()\n .from(instanceUserRoles)\n .where(eq(instanceUserRoles.role, \"instance_admin\"))\n .then((rows) => rows.length);\n\n if (existingAdminCount > 0 && !opts.force) {\n p.log.info(\"Instance already has an admin user. Use --force to generate a new bootstrap invite.\");\n return;\n }\n\n const now = new Date();\n await db\n .update(invites)\n .set({ revokedAt: now, updatedAt: now })\n .where(\n and(\n eq(invites.inviteType, \"bootstrap_ceo\"),\n isNull(invites.revokedAt),\n isNull(invites.acceptedAt),\n gt(invites.expiresAt, now),\n ),\n );\n\n const token = createInviteToken();\n const expiresHours = Math.max(1, Math.min(24 * 30, opts.expiresHours ?? 72));\n const created = await db\n .insert(invites)\n .values({\n inviteType: \"bootstrap_ceo\",\n tokenHash: hashToken(token),\n allowedJoinTypes: \"human\",\n expiresAt: new Date(Date.now() + expiresHours * 60 * 60 * 1000),\n invitedByUserId: \"system\",\n })\n .returning()\n .then((rows) => rows[0]);\n\n const baseUrl = resolveBaseUrl(configPath, opts.baseUrl);\n const inviteUrl = `${baseUrl}/invite/${token}`;\n p.log.success(\"Created bootstrap CEO invite.\");\n p.log.message(`Invite URL: ${pc.cyan(inviteUrl)}`);\n p.log.message(`Expires: ${pc.dim(created.expiresAt.toISOString())}`);\n } catch (err) {\n p.log.error(`Could not create bootstrap invite: ${err instanceof Error ? err.message : String(err)}`);\n p.log.info(\"If using embedded-postgres, start the Relay Control server and run this command again.\");\n } finally {\n await closableDb.$client?.end?.({ timeout: 5 }).catch(() => undefined);\n }\n}\n", "import pc from \"picocolors\";\n\nconst RELAY_CONTROL_ART = [\n \"\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557\",\n \"\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u255A\u2588\u2588\u2557 \u2588\u2588\u2554\u255D\",\n \"\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551 \u255A\u2588\u2588\u2588\u2588\u2554\u255D \",\n \"\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u255D \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2551 \u255A\u2588\u2588\u2554\u255D \",\n \"\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \",\n \"\u255A\u2550\u255D \u255A\u2550\u255D\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \",\n \" \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2557 \u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \",\n \"\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551\u255A\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255D\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2551 \",\n \"\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2554\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551 \",\n \"\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551\u255A\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551 \",\n \"\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2551 \u255A\u2588\u2588\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\",\n \" \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D\",\n] as const;\n\nconst TAGLINE = \"Open-source orchestration for zero-human companies\";\n\nexport function printPaperclipCliBanner(): void {\n const lines = [\n \"\",\n ...RELAY_CONTROL_ART.map((line) => pc.cyan(line)),\n pc.blue(\" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\"),\n pc.bold(pc.white(` ${TAGLINE}`)),\n \"\",\n ];\n\n console.log(lines.join(\"\\n\"));\n}\n", "import { createHash } from \"node:crypto\";\nimport type {\n TelemetryConfig,\n TelemetryEvent,\n TelemetryEventName,\n TelemetryState,\n} from \"./types.js\";\n\nconst DEFAULT_ENDPOINT = \"https://telemetry.paperclip.ing/ingest\";\nconst BATCH_SIZE = 50;\nconst SEND_TIMEOUT_MS = 5_000;\n\nexport class TelemetryClient {\n private queue: TelemetryEvent[] = [];\n private readonly config: TelemetryConfig;\n private readonly stateFactory: () => TelemetryState;\n private readonly version: string;\n private state: TelemetryState | null = null;\n private flushInterval: ReturnType<typeof setInterval> | null = null;\n\n constructor(config: TelemetryConfig, stateFactory: () => TelemetryState, version: string) {\n this.config = config;\n this.stateFactory = stateFactory;\n this.version = version;\n }\n\n track(eventName: TelemetryEventName, dimensions?: Record<string, string | number | boolean>): void {\n if (!this.config.enabled) return;\n this.getState(); // ensure state is initialised (side-effect: creates state file on first call)\n\n this.queue.push({\n name: eventName,\n occurredAt: new Date().toISOString(),\n dimensions: dimensions ?? {},\n });\n\n if (this.queue.length >= BATCH_SIZE) {\n void this.flush();\n }\n }\n\n async flush(): Promise<void> {\n if (!this.config.enabled || this.queue.length === 0) return;\n\n const events = this.queue.splice(0);\n const state = this.getState();\n const endpoint = this.config.endpoint ?? DEFAULT_ENDPOINT;\n const app = this.config.app ?? \"paperclip\";\n const schemaVersion = this.config.schemaVersion ?? \"1\";\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), SEND_TIMEOUT_MS);\n try {\n await fetch(endpoint, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n app,\n schemaVersion,\n installId: state.installId,\n events,\n }),\n signal: controller.signal,\n });\n } catch {\n // Fire-and-forget: silent failure, no retries\n } finally {\n clearTimeout(timer);\n }\n }\n\n startPeriodicFlush(intervalMs: number = 60_000): void {\n if (this.flushInterval) return;\n this.flushInterval = setInterval(() => {\n void this.flush();\n }, intervalMs);\n // Allow the process to exit even if the interval is still active\n if (typeof this.flushInterval === \"object\" && \"unref\" in this.flushInterval) {\n this.flushInterval.unref();\n }\n }\n\n stop(): void {\n if (this.flushInterval) {\n clearInterval(this.flushInterval);\n this.flushInterval = null;\n }\n }\n\n hashPrivateRef(value: string): string {\n const state = this.getState();\n return createHash(\"sha256\")\n .update(state.salt + value)\n .digest(\"hex\")\n .slice(0, 16);\n }\n\n private getState(): TelemetryState {\n if (!this.state) {\n this.state = this.stateFactory();\n }\n return this.state;\n }\n}\n", "import type { TelemetryConfig } from \"./types.js\";\n\nconst CI_ENV_VARS = [\"CI\", \"CONTINUOUS_INTEGRATION\", \"BUILD_NUMBER\", \"GITHUB_ACTIONS\", \"GITLAB_CI\"];\n\nfunction isCI(): boolean {\n return CI_ENV_VARS.some((key) => process.env[key] === \"true\" || process.env[key] === \"1\");\n}\n\nexport function resolveTelemetryConfig(fileConfig?: { enabled?: boolean }): TelemetryConfig {\n if (process.env.PAPERCLIP_TELEMETRY_DISABLED === \"1\") {\n return { enabled: false };\n }\n if (process.env.DO_NOT_TRACK === \"1\") {\n return { enabled: false };\n }\n if (isCI()) {\n return { enabled: false };\n }\n if (fileConfig?.enabled === false) {\n return { enabled: false };\n }\n\n const endpoint = process.env.PAPERCLIP_TELEMETRY_ENDPOINT || undefined;\n return { enabled: true, endpoint };\n}\n", "import { randomUUID, randomBytes } from \"node:crypto\";\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport type { TelemetryState } from \"./types.js\";\n\nexport function loadOrCreateState(stateDir: string, version: string): TelemetryState {\n const filePath = path.join(stateDir, \"state.json\");\n\n if (existsSync(filePath)) {\n try {\n const raw = readFileSync(filePath, \"utf-8\");\n const parsed = JSON.parse(raw) as TelemetryState;\n if (parsed.installId && parsed.salt) {\n return parsed;\n }\n } catch {\n // Corrupted state file \u2014 recreate\n }\n }\n\n const state: TelemetryState = {\n installId: randomUUID(),\n salt: randomBytes(32).toString(\"hex\"),\n createdAt: new Date().toISOString(),\n firstSeenVersion: version,\n };\n\n mkdirSync(stateDir, { recursive: true });\n writeFileSync(filePath, JSON.stringify(state, null, 2) + \"\\n\", \"utf-8\");\n return state;\n}\n", "import type { TelemetryClient } from \"./client.js\";\n\nexport function trackInstallStarted(client: TelemetryClient): void {\n client.track(\"install.started\");\n}\n\nexport function trackInstallCompleted(\n client: TelemetryClient,\n dims: { adapterType: string },\n): void {\n client.track(\"install.completed\", { adapter_type: dims.adapterType });\n}\n\nexport function trackCompanyImported(\n client: TelemetryClient,\n dims: { sourceType: string; sourceRef: string; isPrivate: boolean },\n): void {\n const ref = dims.isPrivate ? client.hashPrivateRef(dims.sourceRef) : dims.sourceRef;\n client.track(\"company.imported\", {\n source_type: dims.sourceType,\n source_ref: ref,\n source_ref_hashed: dims.isPrivate,\n });\n}\n\nexport function trackAgentFirstHeartbeat(\n client: TelemetryClient,\n dims: { agentRole: string },\n): void {\n client.track(\"agent.first_heartbeat\", { agent_role: dims.agentRole });\n}\n\nexport function trackAgentTaskCompleted(\n client: TelemetryClient,\n dims: { agentRole: string },\n): void {\n client.track(\"agent.task_completed\", { agent_role: dims.agentRole });\n}\n\nexport function trackErrorHandlerCrash(\n client: TelemetryClient,\n dims: { errorCode: string },\n): void {\n client.track(\"error.handler_crash\", { error_code: dims.errorCode });\n}\n", "export { TelemetryClient } from \"./client.js\";\nexport { resolveTelemetryConfig } from \"./config.js\";\nexport { loadOrCreateState } from \"./state.js\";\nexport {\n trackInstallStarted,\n trackInstallCompleted,\n trackCompanyImported,\n trackAgentFirstHeartbeat,\n trackAgentTaskCompleted,\n trackErrorHandlerCrash,\n} from \"./events.js\";\nexport type {\n TelemetryConfig,\n TelemetryState,\n TelemetryEvent,\n TelemetryEventEnvelope,\n TelemetryEventName,\n} from \"./types.js\";\n", "import { createRequire } from \"node:module\";\n\ntype PackageJson = {\n version?: string;\n};\n\nconst require = createRequire(import.meta.url);\nconst pkg = require(\"../package.json\") as PackageJson;\n\nexport const cliVersion = pkg.version ?? \"0.0.0\";\n", "import path from \"node:path\";\nimport {\n TelemetryClient,\n resolveTelemetryConfig,\n loadOrCreateState,\n trackInstallStarted,\n trackInstallCompleted,\n trackCompanyImported,\n} from \"../../packages/shared/src/telemetry/index.js\";\nimport { resolvePaperclipInstanceRoot } from \"./config/home.js\";\nimport { readConfig } from \"./config/store.js\";\nimport { cliVersion } from \"./version.js\";\n\nlet client: TelemetryClient | null = null;\n\nexport function initTelemetry(fileConfig?: { enabled?: boolean }): TelemetryClient | null {\n if (client) return client;\n\n const config = resolveTelemetryConfig(fileConfig);\n if (!config.enabled) return null;\n\n const stateDir = path.join(resolvePaperclipInstanceRoot(), \"telemetry\");\n client = new TelemetryClient(config, () => loadOrCreateState(stateDir, cliVersion), cliVersion);\n return client;\n}\n\nexport function initTelemetryFromConfigFile(configPath?: string): TelemetryClient | null {\n try {\n return initTelemetry(readConfig(configPath)?.telemetry);\n } catch {\n return initTelemetry();\n }\n}\n\nexport function getTelemetryClient(): TelemetryClient | null {\n return client;\n}\n\nexport async function flushTelemetry(): Promise<void> {\n if (client) {\n await client.flush();\n }\n}\n\nexport {\n trackInstallStarted,\n trackInstallCompleted,\n trackCompanyImported,\n};\n", "import {\n ensureAgentJwtSecret,\n readAgentJwtSecretFromEnv,\n readAgentJwtSecretFromEnvFile,\n resolveAgentJwtEnvFile,\n} from \"../config/env.js\";\nimport type { CheckResult } from \"./index.js\";\n\nexport function agentJwtSecretCheck(configPath?: string): CheckResult {\n if (readAgentJwtSecretFromEnv(configPath)) {\n return {\n name: \"Agent JWT secret\",\n status: \"pass\",\n message: \"PAPERCLIP_AGENT_JWT_SECRET is set in environment\",\n };\n }\n\n const envPath = resolveAgentJwtEnvFile(configPath);\n const fileSecret = readAgentJwtSecretFromEnvFile(envPath);\n\n if (fileSecret) {\n return {\n name: \"Agent JWT secret\",\n status: \"warn\",\n message: `PAPERCLIP_AGENT_JWT_SECRET is present in ${envPath} but not loaded into environment`,\n repairHint: `Set the value from ${envPath} in your shell before starting the Paperclip server`,\n };\n }\n\n return {\n name: \"Agent JWT secret\",\n status: \"fail\",\n message: `PAPERCLIP_AGENT_JWT_SECRET missing from environment and ${envPath}`,\n canRepair: true,\n repair: () => {\n ensureAgentJwtSecret(configPath);\n },\n repairHint: `Run with --repair to create ${envPath} containing PAPERCLIP_AGENT_JWT_SECRET`,\n };\n}\n", "import { readConfig, configExists, resolveConfigPath } from \"../config/store.js\";\nimport type { CheckResult } from \"./index.js\";\n\nexport function configCheck(configPath?: string): CheckResult {\n const filePath = resolveConfigPath(configPath);\n\n if (!configExists(configPath)) {\n return {\n name: \"Config file\",\n status: \"fail\",\n message: `Config file not found at ${filePath}`,\n canRepair: false,\n repairHint: \"Run `relaycontrol onboard` to create one\",\n };\n }\n\n try {\n readConfig(configPath);\n return {\n name: \"Config file\",\n status: \"pass\",\n message: `Valid config at ${filePath}`,\n };\n } catch (err) {\n return {\n name: \"Config file\",\n status: \"fail\",\n message: `Invalid config: ${err instanceof Error ? err.message : String(err)}`,\n canRepair: false,\n repairHint: \"Run `relaycontrol configure --section database` (or `relaycontrol onboard` to recreate)\",\n };\n }\n}\n", "import type { PaperclipConfig } from \"../config/schema.js\";\nimport type { CheckResult } from \"./index.js\";\n\nfunction isLoopbackHost(host: string) {\n const normalized = host.trim().toLowerCase();\n return normalized === \"127.0.0.1\" || normalized === \"localhost\" || normalized === \"::1\";\n}\n\nexport function deploymentAuthCheck(config: PaperclipConfig): CheckResult {\n const mode = config.server.deploymentMode;\n const exposure = config.server.exposure;\n const auth = config.auth;\n\n if (mode === \"local_trusted\") {\n if (!isLoopbackHost(config.server.host)) {\n return {\n name: \"Deployment/auth mode\",\n status: \"fail\",\n message: `local_trusted requires loopback host binding (found ${config.server.host})`,\n canRepair: false,\n repairHint: \"Run `relaycontrol configure --section server` and set host to 127.0.0.1\",\n };\n }\n return {\n name: \"Deployment/auth mode\",\n status: \"pass\",\n message: \"local_trusted mode is configured for loopback-only access\",\n };\n }\n\n const secret =\n process.env.BETTER_AUTH_SECRET?.trim() ??\n process.env.PAPERCLIP_AGENT_JWT_SECRET?.trim();\n if (!secret) {\n return {\n name: \"Deployment/auth mode\",\n status: \"fail\",\n message: \"authenticated mode requires BETTER_AUTH_SECRET (or PAPERCLIP_AGENT_JWT_SECRET)\",\n canRepair: false,\n repairHint: \"Set BETTER_AUTH_SECRET before starting Relay Control\",\n };\n }\n\n if (auth.baseUrlMode === \"explicit\" && !auth.publicBaseUrl) {\n return {\n name: \"Deployment/auth mode\",\n status: \"fail\",\n message: \"auth.baseUrlMode=explicit requires auth.publicBaseUrl\",\n canRepair: false,\n repairHint: \"Run `relaycontrol configure --section server` and provide a base URL\",\n };\n }\n\n if (exposure === \"public\") {\n if (auth.baseUrlMode !== \"explicit\" || !auth.publicBaseUrl) {\n return {\n name: \"Deployment/auth mode\",\n status: \"fail\",\n message: \"authenticated/public requires explicit auth.publicBaseUrl\",\n canRepair: false,\n repairHint: \"Run `relaycontrol configure --section server` and select public exposure\",\n };\n }\n try {\n const url = new URL(auth.publicBaseUrl);\n if (url.protocol !== \"https:\") {\n return {\n name: \"Deployment/auth mode\",\n status: \"warn\",\n message: \"Public exposure should use an https:// auth.publicBaseUrl\",\n canRepair: false,\n repairHint: \"Use HTTPS in production for secure session cookies\",\n };\n }\n } catch {\n return {\n name: \"Deployment/auth mode\",\n status: \"fail\",\n message: \"auth.publicBaseUrl is not a valid URL\",\n canRepair: false,\n repairHint: \"Run `relaycontrol configure --section server` and provide a valid URL\",\n };\n }\n }\n\n return {\n name: \"Deployment/auth mode\",\n status: \"pass\",\n message: `Mode ${mode}/${exposure} with auth URL mode ${auth.baseUrlMode}`,\n };\n}\n", "export { resolveRuntimeLikePath } from \"../utils/path-resolver.js\";\n", "import fs from \"node:fs\";\nimport type { PaperclipConfig } from \"../config/schema.js\";\nimport type { CheckResult } from \"./index.js\";\nimport { resolveRuntimeLikePath } from \"./path-resolver.js\";\n\nexport async function databaseCheck(config: PaperclipConfig, configPath?: string): Promise<CheckResult> {\n if (config.database.mode === \"postgres\") {\n if (!config.database.connectionString) {\n return {\n name: \"Database\",\n status: \"fail\",\n message: \"PostgreSQL mode selected but no connection string configured\",\n canRepair: false,\n repairHint: \"Run `relaycontrol configure --section database`\",\n };\n }\n\n try {\n const { createDb } = await import(\"@paperclipai/db\");\n const db = createDb(config.database.connectionString);\n await db.execute(\"SELECT 1\");\n return {\n name: \"Database\",\n status: \"pass\",\n message: \"PostgreSQL connection successful\",\n };\n } catch (err) {\n return {\n name: \"Database\",\n status: \"fail\",\n message: `Cannot connect to PostgreSQL: ${err instanceof Error ? err.message : String(err)}`,\n canRepair: false,\n repairHint: \"Check your connection string and ensure PostgreSQL is running\",\n };\n }\n }\n\n if (config.database.mode === \"embedded-postgres\") {\n const dataDir = resolveRuntimeLikePath(config.database.embeddedPostgresDataDir, configPath);\n const reportedPath = dataDir;\n if (!fs.existsSync(dataDir)) {\n fs.mkdirSync(reportedPath, { recursive: true });\n }\n\n return {\n name: \"Database\",\n status: \"pass\",\n message: `Embedded PostgreSQL configured at ${dataDir} (port ${config.database.embeddedPostgresPort})`,\n };\n }\n\n return {\n name: \"Database\",\n status: \"fail\",\n message: `Unknown database mode: ${String(config.database.mode)}`,\n canRepair: false,\n repairHint: \"Run `relaycontrol configure --section database`\",\n };\n}\n", "import type { PaperclipConfig } from \"../config/schema.js\";\nimport type { CheckResult } from \"./index.js\";\n\nexport async function llmCheck(config: PaperclipConfig): Promise<CheckResult> {\n if (!config.llm) {\n return {\n name: \"LLM provider\",\n status: \"pass\",\n message: \"No LLM provider configured (optional)\",\n };\n }\n\n if (!config.llm.apiKey) {\n return {\n name: \"LLM provider\",\n status: \"pass\",\n message: `${config.llm.provider} configured but no API key set (optional)`,\n };\n }\n\n try {\n if (config.llm.provider === \"claude\") {\n const res = await fetch(\"https://api.anthropic.com/v1/messages\", {\n method: \"POST\",\n headers: {\n \"x-api-key\": config.llm.apiKey,\n \"anthropic-version\": \"2023-06-01\",\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({\n model: \"claude-sonnet-4-5-20250929\",\n max_tokens: 1,\n messages: [{ role: \"user\", content: \"hi\" }],\n }),\n });\n if (res.ok || res.status === 400) {\n return { name: \"LLM provider\", status: \"pass\", message: \"Claude API key is valid\" };\n }\n if (res.status === 401) {\n return {\n name: \"LLM provider\",\n status: \"fail\",\n message: \"Claude API key is invalid (401)\",\n canRepair: false,\n repairHint: \"Run `relaycontrol configure --section llm`\",\n };\n }\n return {\n name: \"LLM provider\",\n status: \"warn\",\n message: `Claude API returned status ${res.status}`,\n };\n } else {\n const res = await fetch(\"https://api.openai.com/v1/models\", {\n headers: { Authorization: `Bearer ${config.llm.apiKey}` },\n });\n if (res.ok) {\n return { name: \"LLM provider\", status: \"pass\", message: \"OpenAI API key is valid\" };\n }\n if (res.status === 401) {\n return {\n name: \"LLM provider\",\n status: \"fail\",\n message: \"OpenAI API key is invalid (401)\",\n canRepair: false,\n repairHint: \"Run `relaycontrol configure --section llm`\",\n };\n }\n return {\n name: \"LLM provider\",\n status: \"warn\",\n message: `OpenAI API returned status ${res.status}`,\n };\n }\n } catch {\n return {\n name: \"LLM provider\",\n status: \"warn\",\n message: \"Could not reach API to validate key\",\n };\n }\n}\n", "import fs from \"node:fs\";\nimport type { PaperclipConfig } from \"../config/schema.js\";\nimport type { CheckResult } from \"./index.js\";\nimport { resolveRuntimeLikePath } from \"./path-resolver.js\";\n\nexport function logCheck(config: PaperclipConfig, configPath?: string): CheckResult {\n const logDir = resolveRuntimeLikePath(config.logging.logDir, configPath);\n const reportedDir = logDir;\n\n if (!fs.existsSync(logDir)) {\n fs.mkdirSync(reportedDir, { recursive: true });\n }\n\n try {\n fs.accessSync(reportedDir, fs.constants.W_OK);\n return {\n name: \"Log directory\",\n status: \"pass\",\n message: `Log directory is writable: ${reportedDir}`,\n };\n } catch {\n return {\n name: \"Log directory\",\n status: \"fail\",\n message: `Log directory is not writable: ${logDir}`,\n canRepair: false,\n repairHint: \"Check file permissions on the log directory\",\n };\n }\n}\n", "import net from \"node:net\";\n\nexport function checkPort(port: number): Promise<{ available: boolean; error?: string }> {\n return new Promise((resolve) => {\n const server = net.createServer();\n server.once(\"error\", (err: NodeJS.ErrnoException) => {\n if (err.code === \"EADDRINUSE\") {\n resolve({ available: false, error: `Port ${port} is already in use` });\n } else {\n resolve({ available: false, error: err.message });\n }\n });\n server.once(\"listening\", () => {\n server.close(() => resolve({ available: true }));\n });\n server.listen(port, \"127.0.0.1\");\n });\n}\n", "import type { PaperclipConfig } from \"../config/schema.js\";\nimport { checkPort } from \"../utils/net.js\";\nimport type { CheckResult } from \"./index.js\";\n\nexport async function portCheck(config: PaperclipConfig): Promise<CheckResult> {\n const port = config.server.port;\n const result = await checkPort(port);\n\n if (result.available) {\n return {\n name: \"Server port\",\n status: \"pass\",\n message: `Port ${port} is available`,\n };\n }\n\n return {\n name: \"Server port\",\n status: \"warn\",\n message: result.error ?? `Port ${port} is not available`,\n canRepair: false,\n repairHint: `Check what's using port ${port} with: lsof -i :${port}`,\n };\n}\n", "import { randomBytes } from \"node:crypto\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { PaperclipConfig } from \"../config/schema.js\";\nimport type { CheckResult } from \"./index.js\";\nimport { resolveRuntimeLikePath } from \"./path-resolver.js\";\n\nfunction decodeMasterKey(raw: string): Buffer | null {\n const trimmed = raw.trim();\n if (!trimmed) return null;\n\n if (/^[A-Fa-f0-9]{64}$/.test(trimmed)) {\n return Buffer.from(trimmed, \"hex\");\n }\n\n try {\n const decoded = Buffer.from(trimmed, \"base64\");\n if (decoded.length === 32) return decoded;\n } catch {\n // ignored\n }\n\n if (Buffer.byteLength(trimmed, \"utf8\") === 32) {\n return Buffer.from(trimmed, \"utf8\");\n }\n return null;\n}\n\nfunction withStrictModeNote(\n base: Pick<CheckResult, \"name\" | \"status\" | \"message\" | \"canRepair\" | \"repair\" | \"repairHint\">,\n config: PaperclipConfig,\n): CheckResult {\n const strictModeDisabledInDeployedSetup =\n config.database.mode === \"postgres\" && config.secrets.strictMode === false;\n if (!strictModeDisabledInDeployedSetup) return base;\n\n if (base.status === \"fail\") return base;\n return {\n ...base,\n status: \"warn\",\n message: `${base.message}; strict secret mode is disabled for postgres deployment`,\n repairHint: base.repairHint\n ? `${base.repairHint}. Consider enabling secrets.strictMode`\n : \"Consider enabling secrets.strictMode\",\n };\n}\n\nexport function secretsCheck(config: PaperclipConfig, configPath?: string): CheckResult {\n const provider = config.secrets.provider;\n if (provider !== \"local_encrypted\") {\n return {\n name: \"Secrets adapter\",\n status: \"fail\",\n message: `${provider} is configured, but this build only supports local_encrypted`,\n canRepair: false,\n repairHint: \"Run `relaycontrol configure --section secrets` and set provider to local_encrypted\",\n };\n }\n\n const envMasterKey = process.env.PAPERCLIP_SECRETS_MASTER_KEY;\n if (envMasterKey && envMasterKey.trim().length > 0) {\n if (!decodeMasterKey(envMasterKey)) {\n return {\n name: \"Secrets adapter\",\n status: \"fail\",\n message:\n \"PAPERCLIP_SECRETS_MASTER_KEY is invalid (expected 32-byte base64, 64-char hex, or raw 32-char string)\",\n canRepair: false,\n repairHint: \"Set PAPERCLIP_SECRETS_MASTER_KEY to a valid key or unset it to use a key file\",\n };\n }\n\n return withStrictModeNote(\n {\n name: \"Secrets adapter\",\n status: \"pass\",\n message: \"Local encrypted provider configured via PAPERCLIP_SECRETS_MASTER_KEY\",\n },\n config,\n );\n }\n\n const keyFileOverride = process.env.PAPERCLIP_SECRETS_MASTER_KEY_FILE;\n const configuredPath =\n keyFileOverride && keyFileOverride.trim().length > 0\n ? keyFileOverride.trim()\n : config.secrets.localEncrypted.keyFilePath;\n const keyFilePath = resolveRuntimeLikePath(configuredPath, configPath);\n\n if (!fs.existsSync(keyFilePath)) {\n return withStrictModeNote(\n {\n name: \"Secrets adapter\",\n status: \"warn\",\n message: `Secrets key file does not exist yet: ${keyFilePath}`,\n canRepair: true,\n repair: () => {\n fs.mkdirSync(path.dirname(keyFilePath), { recursive: true });\n fs.writeFileSync(keyFilePath, randomBytes(32).toString(\"base64\"), {\n encoding: \"utf8\",\n mode: 0o600,\n });\n try {\n fs.chmodSync(keyFilePath, 0o600);\n } catch {\n // best effort\n }\n },\n repairHint: \"Run with --repair to create a local encrypted secrets key file\",\n },\n config,\n );\n }\n\n let raw: string;\n try {\n raw = fs.readFileSync(keyFilePath, \"utf8\");\n } catch (err) {\n return {\n name: \"Secrets adapter\",\n status: \"fail\",\n message: `Could not read secrets key file: ${err instanceof Error ? err.message : String(err)}`,\n canRepair: false,\n repairHint: \"Check file permissions or set PAPERCLIP_SECRETS_MASTER_KEY\",\n };\n }\n\n if (!decodeMasterKey(raw)) {\n return {\n name: \"Secrets adapter\",\n status: \"fail\",\n message: `Invalid key material in ${keyFilePath}`,\n canRepair: false,\n repairHint: \"Replace with valid key material or delete it and run doctor --repair\",\n };\n }\n\n return withStrictModeNote(\n {\n name: \"Secrets adapter\",\n status: \"pass\",\n message: `Local encrypted provider configured with key file ${keyFilePath}`,\n },\n config,\n );\n}\n", "import fs from \"node:fs\";\nimport type { PaperclipConfig } from \"../config/schema.js\";\nimport type { CheckResult } from \"./index.js\";\nimport { resolveRuntimeLikePath } from \"./path-resolver.js\";\n\nexport function storageCheck(config: PaperclipConfig, configPath?: string): CheckResult {\n if (config.storage.provider === \"local_disk\") {\n const baseDir = resolveRuntimeLikePath(config.storage.localDisk.baseDir, configPath);\n if (!fs.existsSync(baseDir)) {\n fs.mkdirSync(baseDir, { recursive: true });\n }\n\n try {\n fs.accessSync(baseDir, fs.constants.W_OK);\n return {\n name: \"Storage\",\n status: \"pass\",\n message: `Local disk storage is writable: ${baseDir}`,\n };\n } catch {\n return {\n name: \"Storage\",\n status: \"fail\",\n message: `Local storage directory is not writable: ${baseDir}`,\n canRepair: false,\n repairHint: \"Check file permissions for storage.localDisk.baseDir\",\n };\n }\n }\n\n const bucket = config.storage.s3.bucket.trim();\n const region = config.storage.s3.region.trim();\n if (!bucket || !region) {\n return {\n name: \"Storage\",\n status: \"fail\",\n message: \"S3 storage requires non-empty bucket and region\",\n canRepair: false,\n repairHint: \"Run `relaycontrol configure --section storage`\",\n };\n }\n\n return {\n name: \"Storage\",\n status: \"warn\",\n message: `S3 storage configured (bucket=${bucket}, region=${region}). Reachability check is skipped in doctor.`,\n canRepair: false,\n repairHint: \"Verify credentials and endpoint in deployment environment\",\n };\n}\n\n", "export interface CheckResult {\n name: string;\n status: \"pass\" | \"warn\" | \"fail\";\n message: string;\n canRepair?: boolean;\n repair?: () => void | Promise<void>;\n repairHint?: string;\n}\n\nexport { agentJwtSecretCheck } from \"./agent-jwt-secret-check.js\";\nexport { configCheck } from \"./config-check.js\";\nexport { deploymentAuthCheck } from \"./deployment-auth-check.js\";\nexport { databaseCheck } from \"./database-check.js\";\nexport { llmCheck } from \"./llm-check.js\";\nexport { logCheck } from \"./log-check.js\";\nexport { portCheck } from \"./port-check.js\";\nexport { secretsCheck } from \"./secrets-check.js\";\nexport { storageCheck } from \"./storage-check.js\";\n", "import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport type { PaperclipConfig } from \"../config/schema.js\";\nimport { readConfig, resolveConfigPath } from \"../config/store.js\";\nimport {\n agentJwtSecretCheck,\n configCheck,\n databaseCheck,\n deploymentAuthCheck,\n llmCheck,\n logCheck,\n portCheck,\n secretsCheck,\n storageCheck,\n type CheckResult,\n} from \"../checks/index.js\";\nimport { loadPaperclipEnvFile } from \"../config/env.js\";\nimport { printPaperclipCliBanner } from \"../utils/banner.js\";\n\nconst STATUS_ICON = {\n pass: pc.green(\"\u2713\"),\n warn: pc.yellow(\"!\"),\n fail: pc.red(\"\u2717\"),\n} as const;\n\nexport async function doctor(opts: {\n config?: string;\n repair?: boolean;\n yes?: boolean;\n}): Promise<{ passed: number; warned: number; failed: number }> {\n printPaperclipCliBanner();\n p.intro(pc.bgCyan(pc.black(\" paperclip doctor \")));\n\n const configPath = resolveConfigPath(opts.config);\n loadPaperclipEnvFile(configPath);\n const results: CheckResult[] = [];\n\n // 1. Config check (must pass before others)\n const cfgResult = configCheck(opts.config);\n results.push(cfgResult);\n printResult(cfgResult);\n\n if (cfgResult.status === \"fail\") {\n return printSummary(results);\n }\n\n let config: PaperclipConfig;\n try {\n config = readConfig(opts.config)!;\n } catch (err) {\n const readResult: CheckResult = {\n name: \"Config file\",\n status: \"fail\",\n message: `Could not read config: ${err instanceof Error ? err.message : String(err)}`,\n canRepair: false,\n repairHint: \"Run `relaycontrol configure --section database` or `relaycontrol onboard`\",\n };\n results.push(readResult);\n printResult(readResult);\n return printSummary(results);\n }\n\n // 2. Deployment/auth mode check\n const deploymentAuthResult = deploymentAuthCheck(config);\n results.push(deploymentAuthResult);\n printResult(deploymentAuthResult);\n\n // 3. Agent JWT check\n results.push(\n await runRepairableCheck({\n run: () => agentJwtSecretCheck(opts.config),\n configPath,\n opts,\n }),\n );\n\n // 4. Secrets adapter check\n results.push(\n await runRepairableCheck({\n run: () => secretsCheck(config, configPath),\n configPath,\n opts,\n }),\n );\n\n // 5. Storage check\n results.push(\n await runRepairableCheck({\n run: () => storageCheck(config, configPath),\n configPath,\n opts,\n }),\n );\n\n // 6. Database check\n results.push(\n await runRepairableCheck({\n run: () => databaseCheck(config, configPath),\n configPath,\n opts,\n }),\n );\n\n // 7. LLM check\n const llmResult = await llmCheck(config);\n results.push(llmResult);\n printResult(llmResult);\n\n // 8. Log directory check\n results.push(\n await runRepairableCheck({\n run: () => logCheck(config, configPath),\n configPath,\n opts,\n }),\n );\n\n // 9. Port check\n const portResult = await portCheck(config);\n results.push(portResult);\n printResult(portResult);\n\n // Summary\n return printSummary(results);\n}\n\nfunction printResult(result: CheckResult): void {\n const icon = STATUS_ICON[result.status];\n p.log.message(`${icon} ${pc.bold(result.name)}: ${result.message}`);\n if (result.status !== \"pass\" && result.repairHint) {\n p.log.message(` ${pc.dim(result.repairHint)}`);\n }\n}\n\nasync function maybeRepair(\n result: CheckResult,\n opts: { repair?: boolean; yes?: boolean },\n): Promise<boolean> {\n if (result.status === \"pass\" || !result.canRepair || !result.repair) return false;\n if (!opts.repair) return false;\n\n let shouldRepair = opts.yes;\n if (!shouldRepair) {\n const answer = await p.confirm({\n message: `Repair \"${result.name}\"?`,\n initialValue: true,\n });\n if (p.isCancel(answer)) return false;\n shouldRepair = answer;\n }\n\n if (shouldRepair) {\n try {\n await result.repair();\n p.log.success(`Repaired: ${result.name}`);\n return true;\n } catch (err) {\n p.log.error(`Repair failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n return false;\n}\n\nasync function runRepairableCheck(input: {\n run: () => CheckResult | Promise<CheckResult>;\n configPath: string;\n opts: { repair?: boolean; yes?: boolean };\n}): Promise<CheckResult> {\n let result = await input.run();\n printResult(result);\n\n const repaired = await maybeRepair(result, input.opts);\n if (!repaired) return result;\n\n // Repairs may create/update the adjacent .env file or other local resources.\n loadPaperclipEnvFile(input.configPath);\n result = await input.run();\n printResult(result);\n return result;\n}\n\nfunction printSummary(results: CheckResult[]): { passed: number; warned: number; failed: number } {\n const passed = results.filter((r) => r.status === \"pass\").length;\n const warned = results.filter((r) => r.status === \"warn\").length;\n const failed = results.filter((r) => r.status === \"fail\").length;\n\n const parts: string[] = [];\n parts.push(pc.green(`${passed} passed`));\n if (warned) parts.push(pc.yellow(`${warned} warnings`));\n if (failed) parts.push(pc.red(`${failed} failed`));\n\n p.note(parts.join(\", \"), \"Summary\");\n\n if (failed > 0) {\n p.outro(pc.red(\"Some checks failed. Fix the issues above and re-run doctor.\"));\n } else if (warned > 0) {\n p.outro(pc.yellow(\"All critical checks passed with some warnings.\"));\n } else {\n p.outro(pc.green(\"All checks passed!\"));\n }\n\n return { passed, warned, failed };\n}\n", "import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { bootstrapCeoInvite } from \"./auth-bootstrap-ceo.js\";\nimport { onboard } from \"./onboard.js\";\nimport { doctor } from \"./doctor.js\";\nimport { loadPaperclipEnvFile } from \"../config/env.js\";\nimport { configExists, resolveConfigPath } from \"../config/store.js\";\nimport type { PaperclipConfig } from \"../config/schema.js\";\nimport { readConfig } from \"../config/store.js\";\nimport {\n describeLocalInstancePaths,\n resolvePaperclipHomeDir,\n resolvePaperclipInstanceId,\n} from \"../config/home.js\";\n\ninterface RunOptions {\n config?: string;\n instance?: string;\n repair?: boolean;\n yes?: boolean;\n}\n\ninterface StartedServer {\n apiUrl: string;\n databaseUrl: string;\n host: string;\n listenPort: number;\n}\n\nexport async function runCommand(opts: RunOptions): Promise<void> {\n const instanceId = resolvePaperclipInstanceId(opts.instance);\n process.env.PAPERCLIP_INSTANCE_ID = instanceId;\n\n const homeDir = resolvePaperclipHomeDir();\n fs.mkdirSync(homeDir, { recursive: true });\n\n const paths = describeLocalInstancePaths(instanceId);\n fs.mkdirSync(paths.instanceRoot, { recursive: true });\n\n const configPath = resolveConfigPath(opts.config);\n process.env.PAPERCLIP_CONFIG = configPath;\n loadPaperclipEnvFile(configPath);\n\n p.intro(pc.bgCyan(pc.black(\" relaycontrol run \")));\n p.log.message(pc.dim(`Home: ${paths.homeDir}`));\n p.log.message(pc.dim(`Instance: ${paths.instanceId}`));\n p.log.message(pc.dim(`Config: ${configPath}`));\n\n if (!configExists(configPath)) {\n if (!process.stdin.isTTY || !process.stdout.isTTY) {\n p.log.error(\"No config found and terminal is non-interactive.\");\n p.log.message(`Run ${pc.cyan(\"relaycontrol onboard\")} once, then retry ${pc.cyan(\"relaycontrol run\")}.`);\n process.exit(1);\n }\n\n p.log.step(\"No config found. Starting onboarding...\");\n await onboard({ config: configPath, invokedByRun: true });\n }\n\n p.log.step(\"Running doctor checks...\");\n const summary = await doctor({\n config: configPath,\n repair: opts.repair ?? true,\n yes: opts.yes ?? true,\n });\n\n if (summary.failed > 0) {\n p.log.error(\"Doctor found blocking issues. Not starting server.\");\n process.exit(1);\n }\n\n const config = readConfig(configPath);\n if (!config) {\n p.log.error(`No config found at ${configPath}.`);\n process.exit(1);\n }\n\n p.log.step(\"Starting Relay Control server...\");\n const startedServer = await importServerEntry();\n\n if (shouldGenerateBootstrapInviteAfterStart(config)) {\n p.log.step(\"Generating bootstrap CEO invite\");\n await bootstrapCeoInvite({\n config: configPath,\n dbUrl: startedServer.databaseUrl,\n baseUrl: resolveBootstrapInviteBaseUrl(config, startedServer),\n });\n }\n}\n\nfunction resolveBootstrapInviteBaseUrl(\n config: PaperclipConfig,\n startedServer: StartedServer,\n): string {\n const explicitBaseUrl =\n process.env.PAPERCLIP_PUBLIC_URL ??\n process.env.PAPERCLIP_AUTH_PUBLIC_BASE_URL ??\n process.env.BETTER_AUTH_URL ??\n process.env.BETTER_AUTH_BASE_URL ??\n (config.auth.baseUrlMode === \"explicit\" ? config.auth.publicBaseUrl : undefined);\n\n if (typeof explicitBaseUrl === \"string\" && explicitBaseUrl.trim().length > 0) {\n return explicitBaseUrl.trim().replace(/\\/+$/, \"\");\n }\n\n return startedServer.apiUrl.replace(/\\/api$/, \"\");\n}\n\nfunction formatError(err: unknown): string {\n if (err instanceof Error) {\n if (err.message && err.message.trim().length > 0) return err.message;\n return err.name;\n }\n if (typeof err === \"string\") return err;\n try {\n return JSON.stringify(err);\n } catch {\n return String(err);\n }\n}\n\nfunction isModuleNotFoundError(err: unknown): boolean {\n if (!(err instanceof Error)) return false;\n const code = (err as { code?: unknown }).code;\n if (code === \"ERR_MODULE_NOT_FOUND\") return true;\n return err.message.includes(\"Cannot find module\");\n}\n\nfunction getMissingModuleSpecifier(err: unknown): string | null {\n if (!(err instanceof Error)) return null;\n const packageMatch = err.message.match(/Cannot find package '([^']+)' imported from/);\n if (packageMatch?.[1]) return packageMatch[1];\n const moduleMatch = err.message.match(/Cannot find module '([^']+)'/);\n if (moduleMatch?.[1]) return moduleMatch[1];\n return null;\n}\n\nfunction maybeEnableUiDevMiddleware(entrypoint: string): void {\n if (process.env.PAPERCLIP_UI_DEV_MIDDLEWARE !== undefined) return;\n const normalized = entrypoint.replaceAll(\"\\\\\", \"/\");\n if (normalized.endsWith(\"/server/src/index.ts\") || normalized.endsWith(\"@paperclipai/server/src/index.ts\")) {\n process.env.PAPERCLIP_UI_DEV_MIDDLEWARE = \"true\";\n }\n}\n\nasync function importServerEntry(): Promise<StartedServer> {\n // Dev mode: try local workspace path (monorepo with tsx)\n const projectRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), \"../../..\");\n const devEntry = path.resolve(projectRoot, \"server/src/index.ts\");\n if (fs.existsSync(devEntry)) {\n maybeEnableUiDevMiddleware(devEntry);\n const mod = await import(pathToFileURL(devEntry).href);\n return await startServerFromModule(mod, devEntry);\n }\n\n // Production mode: import the published @paperclipai/server package\n try {\n const mod = await import(\"@paperclipai/server\");\n return await startServerFromModule(mod, \"@paperclipai/server\");\n } catch (err) {\n const missingSpecifier = getMissingModuleSpecifier(err);\n const missingServerEntrypoint = !missingSpecifier || missingSpecifier === \"@paperclipai/server\";\n if (isModuleNotFoundError(err) && missingServerEntrypoint) {\n throw new Error(\n `Could not locate a Relay Control server entrypoint.\\n` +\n `Tried: ${devEntry}, @paperclipai/server\\n` +\n `${formatError(err)}`,\n );\n }\n throw new Error(\n `Relay Control server failed to start.\\n` +\n `${formatError(err)}`,\n );\n }\n}\n\nfunction shouldGenerateBootstrapInviteAfterStart(config: PaperclipConfig): boolean {\n return config.server.deploymentMode === \"authenticated\" && config.database.mode === \"embedded-postgres\";\n}\n\nasync function startServerFromModule(mod: unknown, label: string): Promise<StartedServer> {\n const startServer = (mod as { startServer?: () => Promise<StartedServer> }).startServer;\n if (typeof startServer !== \"function\") {\n throw new Error(`Relay Control server entrypoint did not export startServer(): ${label}`);\n }\n return await startServer();\n}\n", "import * as p from \"@clack/prompts\";\nimport path from \"node:path\";\nimport pc from \"picocolors\";\nimport {\n AUTH_BASE_URL_MODES,\n DEPLOYMENT_EXPOSURES,\n DEPLOYMENT_MODES,\n SECRET_PROVIDERS,\n STORAGE_PROVIDERS,\n type AuthBaseUrlMode,\n type DeploymentExposure,\n type DeploymentMode,\n type SecretProvider,\n type StorageProvider,\n} from \"@paperclipai/shared\";\nimport { configExists, readConfig, resolveConfigPath, writeConfig } from \"../config/store.js\";\nimport type { PaperclipConfig } from \"../config/schema.js\";\nimport { ensureAgentJwtSecret, resolveAgentJwtEnvFile } from \"../config/env.js\";\nimport { ensureLocalSecretsKeyFile } from \"../config/secrets-key.js\";\nimport { promptDatabase } from \"../prompts/database.js\";\nimport { promptLlm } from \"../prompts/llm.js\";\nimport { promptLogging } from \"../prompts/logging.js\";\nimport { defaultSecretsConfig } from \"../prompts/secrets.js\";\nimport { defaultStorageConfig, promptStorage } from \"../prompts/storage.js\";\nimport { promptServer } from \"../prompts/server.js\";\nimport {\n describeLocalInstancePaths,\n expandHomePrefix,\n resolveDefaultBackupDir,\n resolveDefaultEmbeddedPostgresDir,\n resolveDefaultLogsDir,\n resolvePaperclipInstanceId,\n} from \"../config/home.js\";\nimport { bootstrapCeoInvite } from \"./auth-bootstrap-ceo.js\";\nimport { printPaperclipCliBanner } from \"../utils/banner.js\";\nimport {\n getTelemetryClient,\n trackInstallStarted,\n trackInstallCompleted,\n} from \"../telemetry.js\";\n\ntype SetupMode = \"quickstart\" | \"advanced\";\n\ntype OnboardOptions = {\n config?: string;\n run?: boolean;\n yes?: boolean;\n invokedByRun?: boolean;\n};\n\ntype OnboardDefaults = Pick<PaperclipConfig, \"database\" | \"logging\" | \"server\" | \"auth\" | \"storage\" | \"secrets\">;\n\nconst ONBOARD_ENV_KEYS = [\n \"PAPERCLIP_PUBLIC_URL\",\n \"DATABASE_URL\",\n \"PAPERCLIP_DB_BACKUP_ENABLED\",\n \"PAPERCLIP_DB_BACKUP_INTERVAL_MINUTES\",\n \"PAPERCLIP_DB_BACKUP_RETENTION_DAYS\",\n \"PAPERCLIP_DB_BACKUP_DIR\",\n \"PAPERCLIP_DEPLOYMENT_MODE\",\n \"PAPERCLIP_DEPLOYMENT_EXPOSURE\",\n \"HOST\",\n \"PORT\",\n \"SERVE_UI\",\n \"PAPERCLIP_ALLOWED_HOSTNAMES\",\n \"PAPERCLIP_AUTH_BASE_URL_MODE\",\n \"PAPERCLIP_AUTH_PUBLIC_BASE_URL\",\n \"BETTER_AUTH_URL\",\n \"BETTER_AUTH_BASE_URL\",\n \"PAPERCLIP_STORAGE_PROVIDER\",\n \"PAPERCLIP_STORAGE_LOCAL_DIR\",\n \"PAPERCLIP_STORAGE_S3_BUCKET\",\n \"PAPERCLIP_STORAGE_S3_REGION\",\n \"PAPERCLIP_STORAGE_S3_ENDPOINT\",\n \"PAPERCLIP_STORAGE_S3_PREFIX\",\n \"PAPERCLIP_STORAGE_S3_FORCE_PATH_STYLE\",\n \"PAPERCLIP_SECRETS_PROVIDER\",\n \"PAPERCLIP_SECRETS_STRICT_MODE\",\n \"PAPERCLIP_SECRETS_MASTER_KEY_FILE\",\n] as const;\n\nfunction parseBooleanFromEnv(rawValue: string | undefined): boolean | null {\n if (rawValue === undefined) return null;\n const lower = rawValue.trim().toLowerCase();\n if (lower === \"true\" || lower === \"1\" || lower === \"yes\") return true;\n if (lower === \"false\" || lower === \"0\" || lower === \"no\") return false;\n return null;\n}\n\nfunction parseNumberFromEnv(rawValue: string | undefined): number | null {\n if (!rawValue) return null;\n const parsed = Number(rawValue);\n if (!Number.isFinite(parsed)) return null;\n return parsed;\n}\n\nfunction parseEnumFromEnv<T extends string>(rawValue: string | undefined, allowedValues: readonly T[]): T | null {\n if (!rawValue) return null;\n return allowedValues.includes(rawValue as T) ? (rawValue as T) : null;\n}\n\nfunction resolvePathFromEnv(rawValue: string | undefined): string | null {\n if (!rawValue || rawValue.trim().length === 0) return null;\n return path.resolve(expandHomePrefix(rawValue.trim()));\n}\n\nfunction quickstartDefaultsFromEnv(): {\n defaults: OnboardDefaults;\n usedEnvKeys: string[];\n ignoredEnvKeys: Array<{ key: string; reason: string }>;\n} {\n const instanceId = resolvePaperclipInstanceId();\n const defaultStorage = defaultStorageConfig();\n const defaultSecrets = defaultSecretsConfig();\n const databaseUrl = process.env.DATABASE_URL?.trim() || undefined;\n const publicUrl =\n process.env.PAPERCLIP_PUBLIC_URL?.trim() ||\n process.env.PAPERCLIP_AUTH_PUBLIC_BASE_URL?.trim() ||\n process.env.BETTER_AUTH_URL?.trim() ||\n process.env.BETTER_AUTH_BASE_URL?.trim() ||\n undefined;\n const deploymentMode =\n parseEnumFromEnv<DeploymentMode>(process.env.PAPERCLIP_DEPLOYMENT_MODE, DEPLOYMENT_MODES) ?? \"local_trusted\";\n const deploymentExposureFromEnv = parseEnumFromEnv<DeploymentExposure>(\n process.env.PAPERCLIP_DEPLOYMENT_EXPOSURE,\n DEPLOYMENT_EXPOSURES,\n );\n const deploymentExposure =\n deploymentMode === \"local_trusted\" ? \"private\" : (deploymentExposureFromEnv ?? \"private\");\n const authPublicBaseUrl = publicUrl;\n const authBaseUrlModeFromEnv = parseEnumFromEnv<AuthBaseUrlMode>(\n process.env.PAPERCLIP_AUTH_BASE_URL_MODE,\n AUTH_BASE_URL_MODES,\n );\n const authBaseUrlMode = authBaseUrlModeFromEnv ?? (authPublicBaseUrl ? \"explicit\" : \"auto\");\n const allowedHostnamesFromEnv = process.env.PAPERCLIP_ALLOWED_HOSTNAMES\n ? process.env.PAPERCLIP_ALLOWED_HOSTNAMES\n .split(\",\")\n .map((value) => value.trim().toLowerCase())\n .filter((value) => value.length > 0)\n : [];\n const hostnameFromPublicUrl = publicUrl\n ? (() => {\n try {\n return new URL(publicUrl).hostname.trim().toLowerCase();\n } catch {\n return null;\n }\n })()\n : null;\n const storageProvider =\n parseEnumFromEnv<StorageProvider>(process.env.PAPERCLIP_STORAGE_PROVIDER, STORAGE_PROVIDERS) ??\n defaultStorage.provider;\n const secretsProvider =\n parseEnumFromEnv<SecretProvider>(process.env.PAPERCLIP_SECRETS_PROVIDER, SECRET_PROVIDERS) ??\n defaultSecrets.provider;\n const databaseBackupEnabled = parseBooleanFromEnv(process.env.PAPERCLIP_DB_BACKUP_ENABLED) ?? true;\n const databaseBackupIntervalMinutes = Math.max(\n 1,\n parseNumberFromEnv(process.env.PAPERCLIP_DB_BACKUP_INTERVAL_MINUTES) ?? 60,\n );\n const databaseBackupRetentionDays = Math.max(\n 1,\n parseNumberFromEnv(process.env.PAPERCLIP_DB_BACKUP_RETENTION_DAYS) ?? 30,\n );\n const defaults: OnboardDefaults = {\n database: {\n mode: databaseUrl ? \"postgres\" : \"embedded-postgres\",\n ...(databaseUrl ? { connectionString: databaseUrl } : {}),\n embeddedPostgresDataDir: resolveDefaultEmbeddedPostgresDir(instanceId),\n embeddedPostgresPort: 54329,\n backup: {\n enabled: databaseBackupEnabled,\n intervalMinutes: databaseBackupIntervalMinutes,\n retentionDays: databaseBackupRetentionDays,\n dir: resolvePathFromEnv(process.env.PAPERCLIP_DB_BACKUP_DIR) ?? resolveDefaultBackupDir(instanceId),\n },\n },\n logging: {\n mode: \"file\",\n logDir: resolveDefaultLogsDir(instanceId),\n },\n server: {\n deploymentMode,\n exposure: deploymentExposure,\n host: process.env.HOST ?? \"127.0.0.1\",\n port: Number(process.env.PORT) || 3100,\n allowedHostnames: Array.from(new Set([...allowedHostnamesFromEnv, ...(hostnameFromPublicUrl ? [hostnameFromPublicUrl] : [])])),\n serveUi: parseBooleanFromEnv(process.env.SERVE_UI) ?? true,\n },\n auth: {\n baseUrlMode: authBaseUrlMode,\n disableSignUp: false,\n ...(authPublicBaseUrl ? { publicBaseUrl: authPublicBaseUrl } : {}),\n },\n storage: {\n provider: storageProvider,\n localDisk: {\n baseDir:\n resolvePathFromEnv(process.env.PAPERCLIP_STORAGE_LOCAL_DIR) ?? defaultStorage.localDisk.baseDir,\n },\n s3: {\n bucket: process.env.PAPERCLIP_STORAGE_S3_BUCKET ?? defaultStorage.s3.bucket,\n region: process.env.PAPERCLIP_STORAGE_S3_REGION ?? defaultStorage.s3.region,\n endpoint: process.env.PAPERCLIP_STORAGE_S3_ENDPOINT ?? defaultStorage.s3.endpoint,\n prefix: process.env.PAPERCLIP_STORAGE_S3_PREFIX ?? defaultStorage.s3.prefix,\n forcePathStyle:\n parseBooleanFromEnv(process.env.PAPERCLIP_STORAGE_S3_FORCE_PATH_STYLE) ??\n defaultStorage.s3.forcePathStyle,\n },\n },\n secrets: {\n provider: secretsProvider,\n strictMode: parseBooleanFromEnv(process.env.PAPERCLIP_SECRETS_STRICT_MODE) ?? defaultSecrets.strictMode,\n localEncrypted: {\n keyFilePath:\n resolvePathFromEnv(process.env.PAPERCLIP_SECRETS_MASTER_KEY_FILE) ??\n defaultSecrets.localEncrypted.keyFilePath,\n },\n },\n };\n const ignoredEnvKeys: Array<{ key: string; reason: string }> = [];\n if (deploymentMode === \"local_trusted\" && process.env.PAPERCLIP_DEPLOYMENT_EXPOSURE !== undefined) {\n ignoredEnvKeys.push({\n key: \"PAPERCLIP_DEPLOYMENT_EXPOSURE\",\n reason: \"Ignored because deployment mode local_trusted always forces private exposure\",\n });\n }\n\n const ignoredKeySet = new Set(ignoredEnvKeys.map((entry) => entry.key));\n const usedEnvKeys = ONBOARD_ENV_KEYS.filter(\n (key) => process.env[key] !== undefined && !ignoredKeySet.has(key),\n );\n return { defaults, usedEnvKeys, ignoredEnvKeys };\n}\n\nfunction canCreateBootstrapInviteImmediately(config: Pick<PaperclipConfig, \"database\" | \"server\">): boolean {\n return config.server.deploymentMode === \"authenticated\" && config.database.mode !== \"embedded-postgres\";\n}\n\nexport async function onboard(opts: OnboardOptions): Promise<void> {\n printPaperclipCliBanner();\n p.intro(pc.bgCyan(pc.black(\" relaycontrol onboard \")));\n const configPath = resolveConfigPath(opts.config);\n const instance = describeLocalInstancePaths(resolvePaperclipInstanceId());\n p.log.message(\n pc.dim(\n `Local home: ${instance.homeDir} | instance: ${instance.instanceId} | config: ${configPath}`,\n ),\n );\n\n let existingConfig: PaperclipConfig | null = null;\n if (configExists(opts.config)) {\n p.log.message(pc.dim(`${configPath} exists`));\n\n try {\n existingConfig = readConfig(opts.config);\n } catch (err) {\n p.log.message(\n pc.yellow(\n `Existing config appears invalid and will be updated.\\n${err instanceof Error ? err.message : String(err)}`,\n ),\n );\n }\n }\n\n if (existingConfig) {\n p.log.message(\n pc.dim(\"Existing Relay Control install detected; keeping the current configuration unchanged.\"),\n );\n p.log.message(pc.dim(`Use ${pc.cyan(\"relaycontrol configure\")} if you want to change settings.`));\n\n const jwtSecret = ensureAgentJwtSecret(configPath);\n const envFilePath = resolveAgentJwtEnvFile(configPath);\n if (jwtSecret.created) {\n p.log.success(`Created ${pc.cyan(\"PAPERCLIP_AGENT_JWT_SECRET\")} in ${pc.dim(envFilePath)}`);\n } else if (process.env.PAPERCLIP_AGENT_JWT_SECRET?.trim()) {\n p.log.info(`Using existing ${pc.cyan(\"PAPERCLIP_AGENT_JWT_SECRET\")} from environment`);\n } else {\n p.log.info(`Using existing ${pc.cyan(\"PAPERCLIP_AGENT_JWT_SECRET\")} in ${pc.dim(envFilePath)}`);\n }\n\n const keyResult = ensureLocalSecretsKeyFile(existingConfig, configPath);\n if (keyResult.status === \"created\") {\n p.log.success(`Created local secrets key file at ${pc.dim(keyResult.path)}`);\n } else if (keyResult.status === \"existing\") {\n p.log.message(pc.dim(`Using existing local secrets key file at ${keyResult.path}`));\n }\n\n p.note(\n [\n \"Existing config preserved\",\n `Database: ${existingConfig.database.mode}`,\n existingConfig.llm ? `LLM: ${existingConfig.llm.provider}` : \"LLM: not configured\",\n `Logging: ${existingConfig.logging.mode} -> ${existingConfig.logging.logDir}`,\n `Server: ${existingConfig.server.deploymentMode}/${existingConfig.server.exposure} @ ${existingConfig.server.host}:${existingConfig.server.port}`,\n `Allowed hosts: ${existingConfig.server.allowedHostnames.length > 0 ? existingConfig.server.allowedHostnames.join(\", \") : \"(loopback only)\"}`,\n `Auth URL mode: ${existingConfig.auth.baseUrlMode}${existingConfig.auth.publicBaseUrl ? ` (${existingConfig.auth.publicBaseUrl})` : \"\"}`,\n `Storage: ${existingConfig.storage.provider}`,\n `Secrets: ${existingConfig.secrets.provider} (strict mode ${existingConfig.secrets.strictMode ? \"on\" : \"off\"})`,\n \"Agent auth: PAPERCLIP_AGENT_JWT_SECRET configured\",\n ].join(\"\\n\"),\n \"Configuration ready\",\n );\n\n p.note(\n [\n `Run: ${pc.cyan(\"relaycontrol run\")}`,\n `Reconfigure later: ${pc.cyan(\"relaycontrol configure\")}`,\n `Diagnose setup: ${pc.cyan(\"relaycontrol doctor\")}`,\n ].join(\"\\n\"),\n \"Next commands\",\n );\n\n let shouldRunNow = opts.run === true || opts.yes === true;\n if (!shouldRunNow && !opts.invokedByRun && process.stdin.isTTY && process.stdout.isTTY) {\n const answer = await p.confirm({\n message: \"Start Relay Control now?\",\n initialValue: true,\n });\n if (!p.isCancel(answer)) {\n shouldRunNow = answer;\n }\n }\n\n if (shouldRunNow && !opts.invokedByRun) {\n process.env.PAPERCLIP_OPEN_ON_LISTEN = \"true\";\n const { runCommand } = await import(\"./run.js\");\n await runCommand({ config: configPath, repair: true, yes: true });\n return;\n }\n\n p.outro(\"Existing Relay Control setup is ready.\");\n return;\n }\n\n let setupMode: SetupMode = \"quickstart\";\n if (opts.yes) {\n p.log.message(pc.dim(\"`--yes` enabled: using Quickstart defaults.\"));\n } else {\n const setupModeChoice = await p.select({\n message: \"Choose setup path\",\n options: [\n {\n value: \"quickstart\" as const,\n label: \"Quickstart\",\n hint: \"Recommended: local defaults + ready to run\",\n },\n {\n value: \"advanced\" as const,\n label: \"Advanced setup\",\n hint: \"Customize database, server, storage, and more\",\n },\n ],\n initialValue: \"quickstart\",\n });\n if (p.isCancel(setupModeChoice)) {\n p.cancel(\"Setup cancelled.\");\n return;\n }\n setupMode = setupModeChoice as SetupMode;\n }\n\n const tc = getTelemetryClient();\n if (tc) trackInstallStarted(tc);\n\n let llm: PaperclipConfig[\"llm\"] | undefined;\n const { defaults: derivedDefaults, usedEnvKeys, ignoredEnvKeys } = quickstartDefaultsFromEnv();\n let {\n database,\n logging,\n server,\n auth,\n storage,\n secrets,\n } = derivedDefaults;\n\n if (setupMode === \"advanced\") {\n p.log.step(pc.bold(\"Database\"));\n database = await promptDatabase(database);\n\n if (database.mode === \"postgres\" && database.connectionString) {\n const s = p.spinner();\n s.start(\"Testing database connection...\");\n try {\n const { createDb } = await import(\"@paperclipai/db\");\n const db = createDb(database.connectionString);\n await db.execute(\"SELECT 1\");\n s.stop(\"Database connection successful\");\n } catch {\n s.stop(pc.yellow(\"Could not connect to database \u2014 you can fix this later with `relaycontrol doctor`\"));\n }\n }\n\n p.log.step(pc.bold(\"LLM Provider\"));\n llm = await promptLlm();\n\n if (llm?.apiKey) {\n const s = p.spinner();\n s.start(\"Validating API key...\");\n try {\n if (llm.provider === \"claude\") {\n const res = await fetch(\"https://api.anthropic.com/v1/messages\", {\n method: \"POST\",\n headers: {\n \"x-api-key\": llm.apiKey,\n \"anthropic-version\": \"2023-06-01\",\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({\n model: \"claude-sonnet-4-5-20250929\",\n max_tokens: 1,\n messages: [{ role: \"user\", content: \"hi\" }],\n }),\n });\n if (res.ok || res.status === 400) {\n s.stop(\"API key is valid\");\n } else if (res.status === 401) {\n s.stop(pc.yellow(\"API key appears invalid \u2014 you can update it later\"));\n } else {\n s.stop(pc.yellow(\"Could not validate API key \u2014 continuing anyway\"));\n }\n } else {\n const res = await fetch(\"https://api.openai.com/v1/models\", {\n headers: { Authorization: `Bearer ${llm.apiKey}` },\n });\n if (res.ok) {\n s.stop(\"API key is valid\");\n } else if (res.status === 401) {\n s.stop(pc.yellow(\"API key appears invalid \u2014 you can update it later\"));\n } else {\n s.stop(pc.yellow(\"Could not validate API key \u2014 continuing anyway\"));\n }\n }\n } catch {\n s.stop(pc.yellow(\"Could not reach API \u2014 continuing anyway\"));\n }\n }\n\n p.log.step(pc.bold(\"Logging\"));\n logging = await promptLogging();\n\n p.log.step(pc.bold(\"Server\"));\n ({ server, auth } = await promptServer({ currentServer: server, currentAuth: auth }));\n\n p.log.step(pc.bold(\"Storage\"));\n storage = await promptStorage(storage);\n\n p.log.step(pc.bold(\"Secrets\"));\n const secretsDefaults = defaultSecretsConfig();\n secrets = {\n provider: secrets.provider ?? secretsDefaults.provider,\n strictMode: secrets.strictMode ?? secretsDefaults.strictMode,\n localEncrypted: {\n keyFilePath: secrets.localEncrypted?.keyFilePath ?? secretsDefaults.localEncrypted.keyFilePath,\n },\n };\n p.log.message(\n pc.dim(\n `Using defaults: provider=${secrets.provider}, strictMode=${secrets.strictMode}, keyFile=${secrets.localEncrypted.keyFilePath}`,\n ),\n );\n } else {\n p.log.step(pc.bold(\"Quickstart\"));\n p.log.message(pc.dim(\"Using quickstart defaults.\"));\n if (usedEnvKeys.length > 0) {\n p.log.message(pc.dim(`Environment-aware defaults active (${usedEnvKeys.length} env var(s) detected).`));\n } else {\n p.log.message(\n pc.dim(\"No environment overrides detected: embedded database, file storage, local encrypted secrets.\"),\n );\n }\n for (const ignored of ignoredEnvKeys) {\n p.log.message(pc.dim(`Ignored ${ignored.key}: ${ignored.reason}`));\n }\n }\n\n const jwtSecret = ensureAgentJwtSecret(configPath);\n const envFilePath = resolveAgentJwtEnvFile(configPath);\n if (jwtSecret.created) {\n p.log.success(`Created ${pc.cyan(\"PAPERCLIP_AGENT_JWT_SECRET\")} in ${pc.dim(envFilePath)}`);\n } else if (process.env.PAPERCLIP_AGENT_JWT_SECRET?.trim()) {\n p.log.info(`Using existing ${pc.cyan(\"PAPERCLIP_AGENT_JWT_SECRET\")} from environment`);\n } else {\n p.log.info(`Using existing ${pc.cyan(\"PAPERCLIP_AGENT_JWT_SECRET\")} in ${pc.dim(envFilePath)}`);\n }\n\n const config: PaperclipConfig = {\n $meta: {\n version: 1,\n updatedAt: new Date().toISOString(),\n source: \"onboard\",\n },\n ...(llm && { llm }),\n database,\n logging,\n server,\n auth,\n telemetry: {\n enabled: true,\n },\n storage,\n secrets,\n };\n\n const keyResult = ensureLocalSecretsKeyFile(config, configPath);\n if (keyResult.status === \"created\") {\n p.log.success(`Created local secrets key file at ${pc.dim(keyResult.path)}`);\n } else if (keyResult.status === \"existing\") {\n p.log.message(pc.dim(`Using existing local secrets key file at ${keyResult.path}`));\n }\n\n writeConfig(config, opts.config);\n\n if (tc) trackInstallCompleted(tc, {\n adapterType: server.deploymentMode,\n });\n\n p.note(\n [\n `Database: ${database.mode}`,\n llm ? `LLM: ${llm.provider}` : \"LLM: not configured\",\n `Logging: ${logging.mode} -> ${logging.logDir}`,\n `Server: ${server.deploymentMode}/${server.exposure} @ ${server.host}:${server.port}`,\n `Allowed hosts: ${server.allowedHostnames.length > 0 ? server.allowedHostnames.join(\", \") : \"(loopback only)\"}`,\n `Auth URL mode: ${auth.baseUrlMode}${auth.publicBaseUrl ? ` (${auth.publicBaseUrl})` : \"\"}`,\n `Storage: ${storage.provider}`,\n `Secrets: ${secrets.provider} (strict mode ${secrets.strictMode ? \"on\" : \"off\"})`,\n \"Agent auth: PAPERCLIP_AGENT_JWT_SECRET configured\",\n ].join(\"\\n\"),\n \"Configuration saved\",\n );\n\n p.note(\n [\n `Run: ${pc.cyan(\"relaycontrol run\")}`,\n `Reconfigure later: ${pc.cyan(\"relaycontrol configure\")}`,\n `Diagnose setup: ${pc.cyan(\"relaycontrol doctor\")}`,\n ].join(\"\\n\"),\n \"Next commands\",\n );\n\n if (canCreateBootstrapInviteImmediately({ database, server })) {\n p.log.step(\"Generating bootstrap CEO invite\");\n await bootstrapCeoInvite({ config: configPath });\n }\n\n let shouldRunNow = opts.run === true || opts.yes === true;\n if (!shouldRunNow && !opts.invokedByRun && process.stdin.isTTY && process.stdout.isTTY) {\n const answer = await p.confirm({\n message: \"Start Relay Control now?\",\n initialValue: true,\n });\n if (!p.isCancel(answer)) {\n shouldRunNow = answer;\n }\n }\n\n if (shouldRunNow && !opts.invokedByRun) {\n process.env.PAPERCLIP_OPEN_ON_LISTEN = \"true\";\n const { runCommand } = await import(\"./run.js\");\n await runCommand({ config: configPath, repair: true, yes: true });\n return;\n }\n\n if (server.deploymentMode === \"authenticated\" && database.mode === \"embedded-postgres\") {\n p.log.info(\n [\n \"Bootstrap CEO invite will be created after the server starts.\",\n `Next: ${pc.cyan(\"relaycontrol run\")}`,\n `Then: ${pc.cyan(\"relaycontrol auth bootstrap-ceo\")}`,\n ].join(\"\\n\"),\n );\n }\n\n p.outro(\"You're all set!\");\n}\n", "import { Command } from \"commander\";\nimport { onboard } from \"./commands/onboard.js\";\nimport { doctor } from \"./commands/doctor.js\";\nimport { envCommand } from \"./commands/env.js\";\nimport { configure } from \"./commands/configure.js\";\nimport { addAllowedHostname } from \"./commands/allowed-hostname.js\";\nimport { heartbeatRun } from \"./commands/heartbeat-run.js\";\nimport { runCommand } from \"./commands/run.js\";\nimport { bootstrapCeoInvite } from \"./commands/auth-bootstrap-ceo.js\";\nimport { dbBackupCommand } from \"./commands/db-backup.js\";\nimport { registerContextCommands } from \"./commands/client/context.js\";\nimport { registerCompanyCommands } from \"./commands/client/company.js\";\nimport { registerIssueCommands } from \"./commands/client/issue.js\";\nimport { registerAgentCommands } from \"./commands/client/agent.js\";\nimport { registerApprovalCommands } from \"./commands/client/approval.js\";\nimport { registerActivityCommands } from \"./commands/client/activity.js\";\nimport { registerDashboardCommands } from \"./commands/client/dashboard.js\";\nimport { registerRoutineCommands } from \"./commands/routines.js\";\nimport { registerFeedbackCommands } from \"./commands/client/feedback.js\";\nimport { applyDataDirOverride, type DataDirOptionLike } from \"./config/data-dir.js\";\nimport { loadPaperclipEnvFile } from \"./config/env.js\";\nimport { initTelemetryFromConfigFile, flushTelemetry } from \"./telemetry.js\";\nimport { registerWorktreeCommands } from \"./commands/worktree.js\";\nimport { registerPluginCommands } from \"./commands/client/plugin.js\";\nimport { registerClientAuthCommands } from \"./commands/client/auth.js\";\nimport { registerConnectCommand } from \"./commands/connect.js\";\nimport { registerRunnerCommands } from \"./commands/runner.js\";\nimport { cliVersion } from \"./version.js\";\n\nconst program = new Command();\nconst DATA_DIR_OPTION_HELP =\n \"Relay Control data directory root (isolates state from ~/.relaycontrol)\";\n\nprogram\n .name(\"relaycontrol\")\n .description(\"Relay Control CLI \u2014 setup, diagnose, and configure your instance\")\n .version(cliVersion);\n\nprogram.hook(\"preAction\", (_thisCommand, actionCommand) => {\n const options = actionCommand.optsWithGlobals() as DataDirOptionLike;\n const optionNames = new Set(actionCommand.options.map((option) => option.attributeName()));\n applyDataDirOverride(options, {\n hasConfigOption: optionNames.has(\"config\"),\n hasContextOption: optionNames.has(\"context\"),\n });\n loadPaperclipEnvFile(options.config);\n initTelemetryFromConfigFile(options.config);\n});\n\nprogram\n .command(\"onboard\")\n .description(\"Interactive first-run setup wizard\")\n .option(\"-c, --config <path>\", \"Path to config file\")\n .option(\"-d, --data-dir <path>\", DATA_DIR_OPTION_HELP)\n .option(\"-y, --yes\", \"Accept defaults (quickstart + start immediately)\", false)\n .option(\"--run\", \"Start Relay Control immediately after saving config\", false)\n .action(onboard);\n\nprogram\n .command(\"doctor\")\n .description(\"Run diagnostic checks on your Relay Control setup\")\n .option(\"-c, --config <path>\", \"Path to config file\")\n .option(\"-d, --data-dir <path>\", DATA_DIR_OPTION_HELP)\n .option(\"--repair\", \"Attempt to repair issues automatically\")\n .alias(\"--fix\")\n .option(\"-y, --yes\", \"Skip repair confirmation prompts\")\n .action(async (opts) => {\n await doctor(opts);\n });\n\nprogram\n .command(\"env\")\n .description(\"Print environment variables for deployment\")\n .option(\"-c, --config <path>\", \"Path to config file\")\n .option(\"-d, --data-dir <path>\", DATA_DIR_OPTION_HELP)\n .action(envCommand);\n\nprogram\n .command(\"configure\")\n .description(\"Update configuration sections\")\n .option(\"-c, --config <path>\", \"Path to config file\")\n .option(\"-d, --data-dir <path>\", DATA_DIR_OPTION_HELP)\n .option(\"-s, --section <section>\", \"Section to configure (llm, database, logging, server, storage, secrets)\")\n .action(configure);\n\nprogram\n .command(\"db:backup\")\n .description(\"Create a one-off database backup using current config\")\n .option(\"-c, --config <path>\", \"Path to config file\")\n .option(\"-d, --data-dir <path>\", DATA_DIR_OPTION_HELP)\n .option(\"--dir <path>\", \"Backup output directory (overrides config)\")\n .option(\"--retention-days <days>\", \"Retention window used for pruning\", (value) => Number(value))\n .option(\"--filename-prefix <prefix>\", \"Backup filename prefix\", \"paperclip\")\n .option(\"--json\", \"Print backup metadata as JSON\")\n .action(async (opts) => {\n await dbBackupCommand(opts);\n });\n\nprogram\n .command(\"allowed-hostname\")\n .description(\"Allow a hostname for authenticated/private mode access\")\n .argument(\"<host>\", \"Hostname to allow (for example dotta-macbook-pro)\")\n .option(\"-c, --config <path>\", \"Path to config file\")\n .option(\"-d, --data-dir <path>\", DATA_DIR_OPTION_HELP)\n .action(addAllowedHostname);\n\nprogram\n .command(\"run\")\n .description(\"Bootstrap local setup (onboard + doctor) and run Relay Control\")\n .option(\"-c, --config <path>\", \"Path to config file\")\n .option(\"-d, --data-dir <path>\", DATA_DIR_OPTION_HELP)\n .option(\"-i, --instance <id>\", \"Local instance id (default: default)\")\n .option(\"--repair\", \"Attempt automatic repairs during doctor\", true)\n .option(\"--no-repair\", \"Disable automatic repairs during doctor\")\n .action(runCommand);\n\nconst heartbeat = program.command(\"heartbeat\").description(\"Heartbeat utilities\");\n\nheartbeat\n .command(\"run\")\n .description(\"Run one agent heartbeat and stream live logs\")\n .requiredOption(\"-a, --agent-id <agentId>\", \"Agent ID to invoke\")\n .option(\"-c, --config <path>\", \"Path to config file\")\n .option(\"-d, --data-dir <path>\", DATA_DIR_OPTION_HELP)\n .option(\"--context <path>\", \"Path to CLI context file\")\n .option(\"--profile <name>\", \"CLI context profile name\")\n .option(\"--api-base <url>\", \"Base URL for the Relay Control server API\")\n .option(\"--api-key <token>\", \"Bearer token for agent-authenticated calls\")\n .option(\n \"--source <source>\",\n \"Invocation source (timer | assignment | on_demand | automation)\",\n \"on_demand\",\n )\n .option(\"--trigger <trigger>\", \"Trigger detail (manual | ping | callback | system)\", \"manual\")\n .option(\"--timeout-ms <ms>\", \"Max time to wait before giving up\", \"0\")\n .option(\"--json\", \"Output raw JSON where applicable\")\n .option(\"--debug\", \"Show raw adapter stdout/stderr JSON chunks\")\n .action(heartbeatRun);\n\nregisterContextCommands(program);\nregisterCompanyCommands(program);\nregisterIssueCommands(program);\nregisterAgentCommands(program);\nregisterApprovalCommands(program);\nregisterActivityCommands(program);\nregisterDashboardCommands(program);\nregisterRoutineCommands(program);\nregisterFeedbackCommands(program);\nregisterWorktreeCommands(program);\nregisterPluginCommands(program);\nregisterConnectCommand(program);\nregisterRunnerCommands(program);\n\nconst auth = program.command(\"auth\").description(\"Authentication and bootstrap utilities\");\n\nauth\n .command(\"bootstrap-ceo\")\n .description(\"Create a one-time bootstrap invite URL for first instance admin\")\n .option(\"-c, --config <path>\", \"Path to config file\")\n .option(\"-d, --data-dir <path>\", DATA_DIR_OPTION_HELP)\n .option(\"--force\", \"Create new invite even if admin already exists\", false)\n .option(\"--expires-hours <hours>\", \"Invite expiration window in hours\", (value) => Number(value))\n .option(\"--base-url <url>\", \"Public base URL used to print invite link\")\n .action(bootstrapCeoInvite);\n\nregisterClientAuthCommands(auth);\n\nasync function main(): Promise<void> {\n let failed = false;\n try {\n await program.parseAsync();\n } catch (err) {\n failed = true;\n console.error(err instanceof Error ? err.message : String(err));\n } finally {\n await flushTelemetry();\n }\n\n if (failed) {\n process.exit(1);\n }\n}\n\nvoid main();\n", "import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport type { PaperclipConfig } from \"../config/schema.js\";\nimport { configExists, readConfig, resolveConfigPath } from \"../config/store.js\";\nimport {\n readAgentJwtSecretFromEnv,\n readAgentJwtSecretFromEnvFile,\n resolveAgentJwtEnvFile,\n} from \"../config/env.js\";\nimport {\n resolveDefaultSecretsKeyFilePath,\n resolveDefaultStorageDir,\n resolvePaperclipInstanceId,\n} from \"../config/home.js\";\n\ntype EnvSource = \"env\" | \"config\" | \"file\" | \"default\" | \"missing\";\n\ntype EnvVarRow = {\n key: string;\n value: string;\n source: EnvSource;\n required: boolean;\n note: string;\n};\n\nconst DEFAULT_AGENT_JWT_TTL_SECONDS = \"172800\";\nconst DEFAULT_AGENT_JWT_ISSUER = \"paperclip\";\nconst DEFAULT_AGENT_JWT_AUDIENCE = \"paperclip-api\";\nconst DEFAULT_HEARTBEAT_SCHEDULER_INTERVAL_MS = \"30000\";\nconst DEFAULT_SECRETS_PROVIDER = \"local_encrypted\";\nconst DEFAULT_STORAGE_PROVIDER = \"local_disk\";\nfunction defaultSecretsKeyFilePath(): string {\n return resolveDefaultSecretsKeyFilePath(resolvePaperclipInstanceId());\n}\nfunction defaultStorageBaseDir(): string {\n return resolveDefaultStorageDir(resolvePaperclipInstanceId());\n}\n\nexport async function envCommand(opts: { config?: string }): Promise<void> {\n p.intro(pc.bgCyan(pc.black(\" paperclip env \")));\n\n const configPath = resolveConfigPath(opts.config);\n let config: PaperclipConfig | null = null;\n let configReadError: string | null = null;\n\n if (configExists(opts.config)) {\n p.log.message(pc.dim(`Config file: ${configPath}`));\n try {\n config = readConfig(opts.config);\n } catch (err) {\n configReadError = err instanceof Error ? err.message : String(err);\n p.log.message(pc.yellow(`Could not parse config: ${configReadError}`));\n }\n } else {\n p.log.message(pc.dim(`Config file missing: ${configPath}`));\n }\n\n const rows = collectDeploymentEnvRows(config, configPath);\n const missingRequired = rows.filter((row) => row.required && row.source === \"missing\");\n const sortedRows = rows.sort((a, b) => Number(b.required) - Number(a.required) || a.key.localeCompare(b.key));\n\n const requiredRows = sortedRows.filter((row) => row.required);\n const optionalRows = sortedRows.filter((row) => !row.required);\n\n const formatSection = (title: string, entries: EnvVarRow[]) => {\n if (entries.length === 0) return;\n\n p.log.message(pc.bold(title));\n for (const entry of entries) {\n const status = entry.source === \"missing\" ? pc.red(\"missing\") : entry.source === \"default\" ? pc.yellow(\"default\") : pc.green(\"set\");\n const sourceNote = {\n env: \"environment\",\n config: \"config\",\n file: \"file\",\n default: \"default\",\n missing: \"missing\",\n }[entry.source];\n p.log.message(\n `${pc.cyan(entry.key)} ${status.padEnd(7)} ${pc.dim(`[${sourceNote}] ${entry.note}`)}${entry.source === \"missing\" ? \"\" : ` ${pc.dim(\"=>\")} ${pc.white(quoteShellValue(entry.value))}`}`,\n );\n }\n };\n\n formatSection(\"Required environment variables\", requiredRows);\n formatSection(\"Optional environment variables\", optionalRows);\n\n const exportRows = rows.map((row) => (row.source === \"missing\" ? { ...row, value: \"<set-this-value>\" } : row));\n const uniqueRows = uniqueByKey(exportRows);\n const exportBlock = uniqueRows.map((row) => `export ${row.key}=${quoteShellValue(row.value)}`).join(\"\\n\");\n\n if (configReadError) {\n p.log.error(`Could not load config cleanly: ${configReadError}`);\n }\n\n p.note(\n exportBlock || \"No values detected. Set required variables manually.\",\n \"Deployment export block\",\n );\n\n if (missingRequired.length > 0) {\n p.log.message(\n pc.yellow(\n `Missing required values: ${missingRequired.map((row) => row.key).join(\", \")}. Set these before deployment.`,\n ),\n );\n } else {\n p.log.message(pc.green(\"All required deployment variables are present.\"));\n }\n p.outro(\"Done\");\n}\n\nfunction collectDeploymentEnvRows(config: PaperclipConfig | null, configPath: string): EnvVarRow[] {\n const agentJwtEnvFile = resolveAgentJwtEnvFile(configPath);\n const jwtEnv = readAgentJwtSecretFromEnv(configPath);\n const jwtFile = jwtEnv ? null : readAgentJwtSecretFromEnvFile(agentJwtEnvFile);\n const jwtSource = jwtEnv ? \"env\" : jwtFile ? \"file\" : \"missing\";\n\n const dbUrl = process.env.DATABASE_URL ?? config?.database?.connectionString ?? \"\";\n const databaseMode = config?.database?.mode ?? \"embedded-postgres\";\n const dbUrlSource: EnvSource = process.env.DATABASE_URL ? \"env\" : config?.database?.connectionString ? \"config\" : \"missing\";\n const publicUrl =\n process.env.PAPERCLIP_PUBLIC_URL ??\n process.env.PAPERCLIP_AUTH_PUBLIC_BASE_URL ??\n process.env.BETTER_AUTH_URL ??\n process.env.BETTER_AUTH_BASE_URL ??\n config?.auth?.publicBaseUrl ??\n \"\";\n const publicUrlSource: EnvSource =\n process.env.PAPERCLIP_PUBLIC_URL\n ? \"env\"\n : process.env.PAPERCLIP_AUTH_PUBLIC_BASE_URL || process.env.BETTER_AUTH_URL || process.env.BETTER_AUTH_BASE_URL\n ? \"env\"\n : config?.auth?.publicBaseUrl\n ? \"config\"\n : \"missing\";\n let trustedOriginsDefault = \"\";\n if (publicUrl) {\n try {\n trustedOriginsDefault = new URL(publicUrl).origin;\n } catch {\n trustedOriginsDefault = \"\";\n }\n }\n\n const heartbeatInterval = process.env.HEARTBEAT_SCHEDULER_INTERVAL_MS ?? DEFAULT_HEARTBEAT_SCHEDULER_INTERVAL_MS;\n const heartbeatEnabled = process.env.HEARTBEAT_SCHEDULER_ENABLED ?? \"true\";\n const secretsProvider =\n process.env.PAPERCLIP_SECRETS_PROVIDER ??\n config?.secrets?.provider ??\n DEFAULT_SECRETS_PROVIDER;\n const secretsStrictMode =\n process.env.PAPERCLIP_SECRETS_STRICT_MODE ??\n String(config?.secrets?.strictMode ?? false);\n const secretsKeyFilePath =\n process.env.PAPERCLIP_SECRETS_MASTER_KEY_FILE ??\n config?.secrets?.localEncrypted?.keyFilePath ??\n defaultSecretsKeyFilePath();\n const storageProvider =\n process.env.PAPERCLIP_STORAGE_PROVIDER ??\n config?.storage?.provider ??\n DEFAULT_STORAGE_PROVIDER;\n const storageLocalDir =\n process.env.PAPERCLIP_STORAGE_LOCAL_DIR ??\n config?.storage?.localDisk?.baseDir ??\n defaultStorageBaseDir();\n const storageS3Bucket =\n process.env.PAPERCLIP_STORAGE_S3_BUCKET ??\n config?.storage?.s3?.bucket ??\n \"paperclip\";\n const storageS3Region =\n process.env.PAPERCLIP_STORAGE_S3_REGION ??\n config?.storage?.s3?.region ??\n \"us-east-1\";\n const storageS3Endpoint =\n process.env.PAPERCLIP_STORAGE_S3_ENDPOINT ??\n config?.storage?.s3?.endpoint ??\n \"\";\n const storageS3Prefix =\n process.env.PAPERCLIP_STORAGE_S3_PREFIX ??\n config?.storage?.s3?.prefix ??\n \"\";\n const storageS3ForcePathStyle =\n process.env.PAPERCLIP_STORAGE_S3_FORCE_PATH_STYLE ??\n String(config?.storage?.s3?.forcePathStyle ?? false);\n\n const rows: EnvVarRow[] = [\n {\n key: \"PAPERCLIP_AGENT_JWT_SECRET\",\n value: jwtEnv ?? jwtFile ?? \"\",\n source: jwtSource,\n required: true,\n note:\n jwtSource === \"missing\"\n ? \"Generate during onboard or set manually (required for local adapter authentication)\"\n : jwtSource === \"env\"\n ? \"Set in process environment\"\n : `Set in ${agentJwtEnvFile}`,\n },\n {\n key: \"DATABASE_URL\",\n value: dbUrl,\n source: dbUrlSource,\n required: true,\n note:\n databaseMode === \"postgres\"\n ? \"Configured for postgres mode (required)\"\n : \"Required for live deployment with managed PostgreSQL\",\n },\n {\n key: \"PORT\",\n value:\n process.env.PORT ??\n (config?.server?.port !== undefined ? String(config.server.port) : \"3100\"),\n source: process.env.PORT ? \"env\" : config?.server?.port !== undefined ? \"config\" : \"default\",\n required: false,\n note: \"HTTP listen port\",\n },\n {\n key: \"PAPERCLIP_PUBLIC_URL\",\n value: publicUrl,\n source: publicUrlSource,\n required: false,\n note: \"Canonical public URL for auth/callback/invite origin wiring\",\n },\n {\n key: \"BETTER_AUTH_TRUSTED_ORIGINS\",\n value: process.env.BETTER_AUTH_TRUSTED_ORIGINS ?? trustedOriginsDefault,\n source: process.env.BETTER_AUTH_TRUSTED_ORIGINS\n ? \"env\"\n : trustedOriginsDefault\n ? \"default\"\n : \"missing\",\n required: false,\n note: \"Comma-separated auth origin allowlist (auto-derived from PAPERCLIP_PUBLIC_URL when possible)\",\n },\n {\n key: \"PAPERCLIP_AGENT_JWT_TTL_SECONDS\",\n value: process.env.PAPERCLIP_AGENT_JWT_TTL_SECONDS ?? DEFAULT_AGENT_JWT_TTL_SECONDS,\n source: process.env.PAPERCLIP_AGENT_JWT_TTL_SECONDS ? \"env\" : \"default\",\n required: false,\n note: \"JWT lifetime in seconds\",\n },\n {\n key: \"PAPERCLIP_AGENT_JWT_ISSUER\",\n value: process.env.PAPERCLIP_AGENT_JWT_ISSUER ?? DEFAULT_AGENT_JWT_ISSUER,\n source: process.env.PAPERCLIP_AGENT_JWT_ISSUER ? \"env\" : \"default\",\n required: false,\n note: \"JWT issuer\",\n },\n {\n key: \"PAPERCLIP_AGENT_JWT_AUDIENCE\",\n value: process.env.PAPERCLIP_AGENT_JWT_AUDIENCE ?? DEFAULT_AGENT_JWT_AUDIENCE,\n source: process.env.PAPERCLIP_AGENT_JWT_AUDIENCE ? \"env\" : \"default\",\n required: false,\n note: \"JWT audience\",\n },\n {\n key: \"HEARTBEAT_SCHEDULER_INTERVAL_MS\",\n value: heartbeatInterval,\n source: process.env.HEARTBEAT_SCHEDULER_INTERVAL_MS ? \"env\" : \"default\",\n required: false,\n note: \"Heartbeat worker interval in ms\",\n },\n {\n key: \"HEARTBEAT_SCHEDULER_ENABLED\",\n value: heartbeatEnabled,\n source: process.env.HEARTBEAT_SCHEDULER_ENABLED ? \"env\" : \"default\",\n required: false,\n note: \"Set to `false` to disable timer scheduling\",\n },\n {\n key: \"PAPERCLIP_SECRETS_PROVIDER\",\n value: secretsProvider,\n source: process.env.PAPERCLIP_SECRETS_PROVIDER\n ? \"env\"\n : config?.secrets?.provider\n ? \"config\"\n : \"default\",\n required: false,\n note: \"Default provider for new secrets\",\n },\n {\n key: \"PAPERCLIP_SECRETS_STRICT_MODE\",\n value: secretsStrictMode,\n source: process.env.PAPERCLIP_SECRETS_STRICT_MODE\n ? \"env\"\n : config?.secrets?.strictMode !== undefined\n ? \"config\"\n : \"default\",\n required: false,\n note: \"Require secret refs for sensitive env keys\",\n },\n {\n key: \"PAPERCLIP_SECRETS_MASTER_KEY_FILE\",\n value: secretsKeyFilePath,\n source: process.env.PAPERCLIP_SECRETS_MASTER_KEY_FILE\n ? \"env\"\n : config?.secrets?.localEncrypted?.keyFilePath\n ? \"config\"\n : \"default\",\n required: false,\n note: \"Path to local encrypted secrets key file\",\n },\n {\n key: \"PAPERCLIP_STORAGE_PROVIDER\",\n value: storageProvider,\n source: process.env.PAPERCLIP_STORAGE_PROVIDER\n ? \"env\"\n : config?.storage?.provider\n ? \"config\"\n : \"default\",\n required: false,\n note: \"Storage provider (local_disk or s3)\",\n },\n {\n key: \"PAPERCLIP_STORAGE_LOCAL_DIR\",\n value: storageLocalDir,\n source: process.env.PAPERCLIP_STORAGE_LOCAL_DIR\n ? \"env\"\n : config?.storage?.localDisk?.baseDir\n ? \"config\"\n : \"default\",\n required: false,\n note: \"Local storage base directory for local_disk provider\",\n },\n {\n key: \"PAPERCLIP_STORAGE_S3_BUCKET\",\n value: storageS3Bucket,\n source: process.env.PAPERCLIP_STORAGE_S3_BUCKET\n ? \"env\"\n : config?.storage?.s3?.bucket\n ? \"config\"\n : \"default\",\n required: false,\n note: \"S3 bucket name for s3 provider\",\n },\n {\n key: \"PAPERCLIP_STORAGE_S3_REGION\",\n value: storageS3Region,\n source: process.env.PAPERCLIP_STORAGE_S3_REGION\n ? \"env\"\n : config?.storage?.s3?.region\n ? \"config\"\n : \"default\",\n required: false,\n note: \"S3 region for s3 provider\",\n },\n {\n key: \"PAPERCLIP_STORAGE_S3_ENDPOINT\",\n value: storageS3Endpoint,\n source: process.env.PAPERCLIP_STORAGE_S3_ENDPOINT\n ? \"env\"\n : config?.storage?.s3?.endpoint\n ? \"config\"\n : \"default\",\n required: false,\n note: \"Optional custom endpoint for S3-compatible providers\",\n },\n {\n key: \"PAPERCLIP_STORAGE_S3_PREFIX\",\n value: storageS3Prefix,\n source: process.env.PAPERCLIP_STORAGE_S3_PREFIX\n ? \"env\"\n : config?.storage?.s3?.prefix\n ? \"config\"\n : \"default\",\n required: false,\n note: \"Optional object key prefix\",\n },\n {\n key: \"PAPERCLIP_STORAGE_S3_FORCE_PATH_STYLE\",\n value: storageS3ForcePathStyle,\n source: process.env.PAPERCLIP_STORAGE_S3_FORCE_PATH_STYLE\n ? \"env\"\n : config?.storage?.s3?.forcePathStyle !== undefined\n ? \"config\"\n : \"default\",\n required: false,\n note: \"Set true for path-style access on compatible providers\",\n },\n ];\n\n const defaultConfigPath = resolveConfigPath();\n if (process.env.PAPERCLIP_CONFIG || configPath !== defaultConfigPath) {\n rows.push({\n key: \"PAPERCLIP_CONFIG\",\n value: process.env.PAPERCLIP_CONFIG ?? configPath,\n source: process.env.PAPERCLIP_CONFIG ? \"env\" : \"default\",\n required: false,\n note: \"Optional path override for config file\",\n });\n }\n\n return rows;\n}\n\nfunction uniqueByKey(rows: EnvVarRow[]): EnvVarRow[] {\n const seen = new Set<string>();\n const result: EnvVarRow[] = [];\n for (const row of rows) {\n if (seen.has(row.key)) continue;\n seen.add(row.key);\n result.push(row);\n }\n return result;\n}\n\nfunction quoteShellValue(value: string): string {\n if (value === \"\") return \"\\\"\\\"\";\n return `'${value.replaceAll(\"'\", \"'\\\\''\")}'`;\n}\n", "import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { readConfig, writeConfig, configExists, resolveConfigPath } from \"../config/store.js\";\nimport type { PaperclipConfig } from \"../config/schema.js\";\nimport { ensureLocalSecretsKeyFile } from \"../config/secrets-key.js\";\nimport { promptDatabase } from \"../prompts/database.js\";\nimport { promptLlm } from \"../prompts/llm.js\";\nimport { promptLogging } from \"../prompts/logging.js\";\nimport { defaultSecretsConfig, promptSecrets } from \"../prompts/secrets.js\";\nimport { defaultStorageConfig, promptStorage } from \"../prompts/storage.js\";\nimport { promptServer } from \"../prompts/server.js\";\nimport {\n resolveDefaultBackupDir,\n resolveDefaultEmbeddedPostgresDir,\n resolveDefaultLogsDir,\n resolvePaperclipInstanceId,\n} from \"../config/home.js\";\nimport { printPaperclipCliBanner } from \"../utils/banner.js\";\n\ntype Section = \"llm\" | \"database\" | \"logging\" | \"server\" | \"storage\" | \"secrets\";\n\nconst SECTION_LABELS: Record<Section, string> = {\n llm: \"LLM Provider\",\n database: \"Database\",\n logging: \"Logging\",\n server: \"Server\",\n storage: \"Storage\",\n secrets: \"Secrets\",\n};\n\nfunction defaultConfig(): PaperclipConfig {\n const instanceId = resolvePaperclipInstanceId();\n return {\n $meta: {\n version: 1,\n updatedAt: new Date().toISOString(),\n source: \"configure\",\n },\n database: {\n mode: \"embedded-postgres\",\n embeddedPostgresDataDir: resolveDefaultEmbeddedPostgresDir(instanceId),\n embeddedPostgresPort: 54329,\n backup: {\n enabled: true,\n intervalMinutes: 60,\n retentionDays: 30,\n dir: resolveDefaultBackupDir(instanceId),\n },\n },\n logging: {\n mode: \"file\",\n logDir: resolveDefaultLogsDir(instanceId),\n },\n server: {\n deploymentMode: \"local_trusted\",\n exposure: \"private\",\n host: \"127.0.0.1\",\n port: 3100,\n allowedHostnames: [],\n serveUi: true,\n },\n auth: {\n baseUrlMode: \"auto\",\n disableSignUp: false,\n },\n telemetry: {\n enabled: true,\n },\n storage: defaultStorageConfig(),\n secrets: defaultSecretsConfig(),\n };\n}\n\nexport async function configure(opts: {\n config?: string;\n section?: string;\n}): Promise<void> {\n printPaperclipCliBanner();\n p.intro(pc.bgCyan(pc.black(\" paperclip configure \")));\n const configPath = resolveConfigPath(opts.config);\n\n if (!configExists(opts.config)) {\n p.log.error(\"No config file found. Run `relaycontrol onboard` first.\");\n p.outro(\"\");\n return;\n }\n\n let config: PaperclipConfig;\n try {\n config = readConfig(opts.config) ?? defaultConfig();\n } catch (err) {\n p.log.message(\n pc.yellow(\n `Existing config is invalid. Loading defaults so you can repair it now.\\n${err instanceof Error ? err.message : String(err)}`,\n ),\n );\n config = defaultConfig();\n }\n\n let section: Section | undefined = opts.section as Section | undefined;\n\n if (section && !SECTION_LABELS[section]) {\n p.log.error(`Unknown section: ${section}. Choose from: ${Object.keys(SECTION_LABELS).join(\", \")}`);\n p.outro(\"\");\n return;\n }\n\n // Section selection loop\n let continueLoop = true;\n while (continueLoop) {\n if (!section) {\n const choice = await p.select({\n message: \"Which section do you want to configure?\",\n options: Object.entries(SECTION_LABELS).map(([value, label]) => ({\n value: value as Section,\n label,\n })),\n });\n\n if (p.isCancel(choice)) {\n p.cancel(\"Configuration cancelled.\");\n return;\n }\n\n section = choice;\n }\n\n p.log.step(pc.bold(SECTION_LABELS[section]));\n\n switch (section) {\n case \"database\":\n config.database = await promptDatabase(config.database);\n break;\n case \"llm\": {\n const llm = await promptLlm();\n if (llm) {\n config.llm = llm;\n } else {\n delete config.llm;\n }\n break;\n }\n case \"logging\":\n config.logging = await promptLogging();\n break;\n case \"server\":\n {\n const { server, auth } = await promptServer({\n currentServer: config.server,\n currentAuth: config.auth,\n });\n config.server = server;\n config.auth = auth;\n }\n break;\n case \"storage\":\n config.storage = await promptStorage(config.storage);\n break;\n case \"secrets\":\n config.secrets = await promptSecrets(config.secrets);\n {\n const keyResult = ensureLocalSecretsKeyFile(config, configPath);\n if (keyResult.status === \"created\") {\n p.log.success(`Created local secrets key file at ${pc.dim(keyResult.path)}`);\n } else if (keyResult.status === \"existing\") {\n p.log.message(pc.dim(`Using existing local secrets key file at ${keyResult.path}`));\n } else if (keyResult.status === \"skipped_provider\") {\n p.log.message(pc.dim(\"Skipping local key file management for non-local provider\"));\n } else {\n p.log.message(pc.dim(\"Skipping local key file management because PAPERCLIP_SECRETS_MASTER_KEY is set\"));\n }\n }\n break;\n }\n\n config.$meta.updatedAt = new Date().toISOString();\n config.$meta.source = \"configure\";\n\n writeConfig(config, opts.config);\n p.log.success(`${SECTION_LABELS[section]} configuration updated.`);\n\n // If section was provided via CLI flag, don't loop\n if (opts.section) {\n continueLoop = false;\n } else {\n const another = await p.confirm({\n message: \"Configure another section?\",\n initialValue: false,\n });\n\n if (p.isCancel(another) || !another) {\n continueLoop = false;\n } else {\n section = undefined; // Reset to show picker again\n }\n }\n }\n\n p.outro(\"Configuration saved.\");\n}\n", "import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { normalizeHostnameInput } from \"../config/hostnames.js\";\nimport { readConfig, resolveConfigPath, writeConfig } from \"../config/store.js\";\n\nexport async function addAllowedHostname(host: string, opts: { config?: string }): Promise<void> {\n const configPath = resolveConfigPath(opts.config);\n const config = readConfig(opts.config);\n\n if (!config) {\n p.log.error(`No config found at ${configPath}. Run ${pc.cyan(\"paperclip onboard\")} first.`);\n return;\n }\n\n const normalized = normalizeHostnameInput(host);\n const current = new Set((config.server.allowedHostnames ?? []).map((value) => value.trim().toLowerCase()).filter(Boolean));\n const existed = current.has(normalized);\n current.add(normalized);\n\n config.server.allowedHostnames = Array.from(current).sort();\n config.$meta.updatedAt = new Date().toISOString();\n config.$meta.source = \"configure\";\n writeConfig(config, opts.config);\n\n if (existed) {\n p.log.info(`Hostname ${pc.cyan(normalized)} is already allowed.`);\n } else {\n p.log.success(`Added allowed hostname: ${pc.cyan(normalized)}`);\n p.log.message(\n pc.dim(\"Restart the Relay Control server for this change to take effect.\"),\n );\n }\n\n if (!(config.server.deploymentMode === \"authenticated\" && config.server.exposure === \"private\")) {\n p.log.message(\n pc.dim(\"Note: allowed hostnames are enforced only in authenticated/private mode.\"),\n );\n }\n}\n\n", "import { setTimeout as delay } from \"node:timers/promises\";\nimport pc from \"picocolors\";\nimport type { Agent, HeartbeatRun, HeartbeatRunEvent, HeartbeatRunStatus } from \"@paperclipai/shared\";\nimport { getCLIAdapter } from \"../adapters/index.js\";\nimport { resolveCommandContext } from \"./client/common.js\";\n\nconst HEARTBEAT_SOURCES = [\"timer\", \"assignment\", \"on_demand\", \"automation\"] as const;\nconst HEARTBEAT_TRIGGERS = [\"manual\", \"ping\", \"callback\", \"system\"] as const;\nconst TERMINAL_STATUSES = new Set<HeartbeatRunStatus>([\"succeeded\", \"failed\", \"cancelled\", \"timed_out\"]);\nconst POLL_INTERVAL_MS = 200;\n\ntype HeartbeatSource = (typeof HEARTBEAT_SOURCES)[number];\ntype HeartbeatTrigger = (typeof HEARTBEAT_TRIGGERS)[number];\ntype InvokedHeartbeat = HeartbeatRun | { status: \"skipped\" };\ninterface HeartbeatRunEventRecord extends HeartbeatRunEvent {\n type?: string | null;\n}\n\ninterface HeartbeatRunOptions {\n config?: string;\n context?: string;\n profile?: string;\n agentId: string;\n apiBase?: string;\n apiKey?: string;\n source: string;\n trigger: string;\n timeoutMs: string;\n debug?: boolean;\n json?: boolean;\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null;\n}\n\nfunction asErrorText(value: unknown): string {\n if (typeof value === \"string\") return value;\n const obj = asRecord(value);\n if (!obj) return \"\";\n const message =\n (typeof obj.message === \"string\" && obj.message) ||\n (typeof obj.error === \"string\" && obj.error) ||\n (typeof obj.code === \"string\" && obj.code) ||\n \"\";\n if (message) return message;\n try {\n return JSON.stringify(obj);\n } catch {\n return \"\";\n }\n}\n\ntype AdapterType = string;\n\nexport async function heartbeatRun(opts: HeartbeatRunOptions): Promise<void> {\n const debug = Boolean(opts.debug);\n const parsedTimeout = Number.parseInt(opts.timeoutMs, 10);\n const timeoutMs = Number.isFinite(parsedTimeout) ? parsedTimeout : 0;\n const source = HEARTBEAT_SOURCES.includes(opts.source as HeartbeatSource)\n ? (opts.source as HeartbeatSource)\n : \"on_demand\";\n const triggerDetail = HEARTBEAT_TRIGGERS.includes(opts.trigger as HeartbeatTrigger)\n ? (opts.trigger as HeartbeatTrigger)\n : \"manual\";\n\n const ctx = resolveCommandContext({\n config: opts.config,\n context: opts.context,\n profile: opts.profile,\n apiBase: opts.apiBase,\n apiKey: opts.apiKey,\n json: opts.json,\n });\n const api = ctx.api;\n\n const agent = await api.get<Agent>(`/api/agents/${opts.agentId}`);\n if (!agent || typeof agent !== \"object\" || !agent.id) {\n console.error(pc.red(`Agent not found: ${opts.agentId}`));\n return;\n }\n\n const invokeRes = await api.post<InvokedHeartbeat>(\n `/api/agents/${opts.agentId}/wakeup`,\n {\n source: source,\n triggerDetail: triggerDetail,\n },\n );\n if (!invokeRes) {\n console.error(pc.red(\"Failed to invoke heartbeat\"));\n return;\n }\n if ((invokeRes as { status?: string }).status === \"skipped\") {\n console.log(pc.yellow(\"Heartbeat invocation was skipped\"));\n return;\n }\n\n const run = invokeRes as HeartbeatRun;\n console.log(pc.cyan(`Invoked heartbeat run ${run.id} for agent ${agent.name} (${agent.id})`));\n\n const runId = run.id;\n let activeRunId: string | null = null;\n let lastEventSeq = 0;\n let logOffset = 0;\n let stdoutJsonBuffer = \"\";\n\n const printRawChunk = (stream: \"stdout\" | \"stderr\" | \"system\", chunk: string) => {\n if (stream === \"stdout\") process.stdout.write(pc.green(\"[stdout] \") + chunk);\n else if (stream === \"stderr\") process.stdout.write(pc.red(\"[stderr] \") + chunk);\n else process.stdout.write(pc.yellow(\"[system] \") + chunk);\n };\n\n const printAdapterInvoke = (payload: Record<string, unknown>) => {\n const adapterType = typeof payload.adapterType === \"string\" ? payload.adapterType : \"unknown\";\n const command = typeof payload.command === \"string\" ? payload.command : \"\";\n const cwd = typeof payload.cwd === \"string\" ? payload.cwd : \"\";\n const args =\n Array.isArray(payload.commandArgs) &&\n (payload.commandArgs as unknown[]).every((v) => typeof v === \"string\")\n ? (payload.commandArgs as string[])\n : [];\n const env =\n typeof payload.env === \"object\" && payload.env !== null && !Array.isArray(payload.env)\n ? (payload.env as Record<string, unknown>)\n : null;\n const prompt = typeof payload.prompt === \"string\" ? payload.prompt : \"\";\n const context =\n typeof payload.context === \"object\" && payload.context !== null && !Array.isArray(payload.context)\n ? (payload.context as Record<string, unknown>)\n : null;\n\n console.log(pc.cyan(`Adapter: ${adapterType}`));\n if (cwd) console.log(pc.cyan(`Working dir: ${cwd}`));\n if (command) {\n const rendered = args.length > 0 ? `${command} ${args.join(\" \")}` : command;\n console.log(pc.cyan(`Command: ${rendered}`));\n }\n if (env) {\n console.log(pc.cyan(\"Env:\"));\n console.log(pc.gray(JSON.stringify(env, null, 2)));\n }\n if (context) {\n console.log(pc.cyan(\"Context:\"));\n console.log(pc.gray(JSON.stringify(context, null, 2)));\n }\n if (prompt) {\n console.log(pc.cyan(\"Prompt:\"));\n console.log(prompt);\n }\n };\n\n const adapterType: AdapterType = agent.adapterType ?? \"claude_local\";\n const cliAdapter = getCLIAdapter(adapterType);\n\n const handleStreamChunk = (stream: \"stdout\" | \"stderr\" | \"system\", chunk: string) => {\n if (debug) {\n printRawChunk(stream, chunk);\n return;\n }\n\n if (stream !== \"stdout\") {\n printRawChunk(stream, chunk);\n return;\n }\n\n const combined = stdoutJsonBuffer + chunk;\n const lines = combined.split(/\\r?\\n/);\n stdoutJsonBuffer = lines.pop() ?? \"\";\n for (const line of lines) {\n cliAdapter.formatStdoutEvent(line, debug);\n }\n };\n\n const handleEvent = (event: HeartbeatRunEventRecord) => {\n const payload = normalizePayload(event.payload);\n if (event.runId !== runId) return;\n const eventType = typeof event.eventType === \"string\"\n ? event.eventType\n : typeof event.type === \"string\"\n ? event.type\n : \"\";\n\n if (eventType === \"heartbeat.run.status\") {\n const status = typeof payload.status === \"string\" ? payload.status : null;\n if (status) {\n console.log(pc.blue(`[status] ${status}`));\n }\n } else if (eventType === \"adapter.invoke\") {\n printAdapterInvoke(payload);\n } else if (eventType === \"heartbeat.run.log\") {\n const stream = typeof payload.stream === \"string\" ? payload.stream : \"system\";\n const chunk = typeof payload.chunk === \"string\" ? payload.chunk : \"\";\n if (!chunk) return;\n if (stream === \"stdout\" || stream === \"stderr\" || stream === \"system\") {\n handleStreamChunk(stream, chunk);\n }\n } else if (typeof event.message === \"string\") {\n console.log(pc.gray(`[event] ${eventType || \"heartbeat.run.event\"}: ${event.message}`));\n }\n\n lastEventSeq = Math.max(lastEventSeq, event.seq ?? 0);\n };\n\n activeRunId = runId;\n let finalStatus: string | null = null;\n let finalError: string | null = null;\n let finalRun: HeartbeatRun | null = null;\n\n const deadline = timeoutMs > 0 ? Date.now() + timeoutMs : null;\n if (!activeRunId) {\n console.error(pc.red(\"Failed to capture heartbeat run id\"));\n return;\n }\n\n while (true) {\n const events = await api.get<HeartbeatRunEvent[]>(\n `/api/heartbeat-runs/${activeRunId}/events?afterSeq=${lastEventSeq}&limit=100`,\n );\n for (const event of Array.isArray(events) ? (events as HeartbeatRunEventRecord[]) : []) {\n handleEvent(event);\n }\n\n const runList = (await api.get<(HeartbeatRun | null)[]>(\n `/api/companies/${agent.companyId}/heartbeat-runs?agentId=${agent.id}`,\n )) || [];\n const currentRun = runList.find((r) => r && r.id === activeRunId) ?? null;\n\n if (!currentRun) {\n console.error(pc.red(\"Heartbeat run disappeared\"));\n break;\n }\n\n const currentStatus = currentRun.status as HeartbeatRunStatus | undefined;\n if (currentStatus !== finalStatus && currentStatus) {\n finalStatus = currentStatus;\n console.log(pc.blue(`Status: ${currentStatus}`));\n }\n\n if (currentStatus && TERMINAL_STATUSES.has(currentStatus)) {\n finalStatus = currentRun.status;\n finalError = currentRun.error;\n finalRun = currentRun;\n break;\n }\n\n if (deadline && Date.now() >= deadline) {\n finalError = `CLI timed out after ${timeoutMs}ms`;\n finalStatus = \"timed_out\";\n console.error(pc.yellow(finalError));\n break;\n }\n\n const logResult = await api.get<{ content: string; nextOffset?: number }>(\n `/api/heartbeat-runs/${activeRunId}/log?offset=${logOffset}&limitBytes=16384`,\n { ignoreNotFound: true },\n );\n if (logResult && logResult.content) {\n for (const chunk of logResult.content.split(/\\r?\\n/)) {\n if (!chunk) continue;\n const parsed = safeParseLogLine(chunk);\n if (!parsed) continue;\n handleStreamChunk(parsed.stream, parsed.chunk);\n }\n if (typeof logResult.nextOffset === \"number\") {\n logOffset = logResult.nextOffset;\n } else if (logResult.content) {\n logOffset += Buffer.byteLength(logResult.content, \"utf8\");\n }\n }\n\n await delay(POLL_INTERVAL_MS);\n }\n\n if (finalStatus) {\n if (!debug && stdoutJsonBuffer.trim()) {\n cliAdapter.formatStdoutEvent(stdoutJsonBuffer, debug);\n stdoutJsonBuffer = \"\";\n }\n const label = `Run ${activeRunId} completed with status ${finalStatus}`;\n if (finalStatus === \"succeeded\") {\n console.log(pc.green(label));\n return;\n }\n\n console.log(pc.red(label));\n if (finalError) {\n console.log(pc.red(`Error: ${finalError}`));\n }\n if (finalRun) {\n const resultObj = asRecord(finalRun.resultJson);\n if (resultObj) {\n const subtype = typeof resultObj.subtype === \"string\" ? resultObj.subtype : \"\";\n const isError = resultObj.is_error === true;\n const errors = Array.isArray(resultObj.errors) ? resultObj.errors.map(asErrorText).filter(Boolean) : [];\n const resultText = typeof resultObj.result === \"string\" ? resultObj.result.trim() : \"\";\n if (subtype || isError || errors.length > 0 || resultText) {\n console.log(pc.red(\"Claude result details:\"));\n if (subtype) console.log(pc.red(` subtype: ${subtype}`));\n if (isError) console.log(pc.red(\" is_error: true\"));\n if (errors.length > 0) console.log(pc.red(` errors: ${errors.join(\" | \")}`));\n if (resultText) console.log(pc.red(` result: ${resultText}`));\n }\n }\n\n const stderrExcerpt = typeof finalRun.stderrExcerpt === \"string\" ? finalRun.stderrExcerpt.trim() : \"\";\n const stdoutExcerpt = typeof finalRun.stdoutExcerpt === \"string\" ? finalRun.stdoutExcerpt.trim() : \"\";\n if (stderrExcerpt) {\n console.log(pc.red(\"stderr excerpt:\"));\n console.log(stderrExcerpt);\n }\n if (stdoutExcerpt && (debug || !stderrExcerpt)) {\n console.log(pc.gray(\"stdout excerpt:\"));\n console.log(stdoutExcerpt);\n }\n }\n process.exitCode = 1;\n } else {\n process.exitCode = 1;\n console.log(pc.gray(\"Heartbeat stream ended without terminal status\"));\n }\n}\n\nfunction normalizePayload(payload: unknown): Record<string, unknown> {\n return typeof payload === \"object\" && payload !== null ? (payload as Record<string, unknown>) : {};\n}\n\nfunction safeParseLogLine(line: string): { stream: \"stdout\" | \"stderr\" | \"system\"; chunk: string } | null {\n try {\n const parsed = JSON.parse(line) as { stream?: unknown; chunk?: unknown };\n const stream =\n parsed.stream === \"stdout\" || parsed.stream === \"stderr\" || parsed.stream === \"system\"\n ? parsed.stream\n : \"system\";\n const chunk = typeof parsed.chunk === \"string\" ? parsed.chunk : \"\";\n\n if (!chunk) return null;\n return { stream, chunk };\n } catch {\n return null;\n }\n}\n", "import pc from \"picocolors\";\n\nfunction asErrorText(value: unknown): string {\n if (typeof value === \"string\") return value;\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return \"\";\n const obj = value as Record<string, unknown>;\n const message =\n (typeof obj.message === \"string\" && obj.message) ||\n (typeof obj.error === \"string\" && obj.error) ||\n (typeof obj.code === \"string\" && obj.code) ||\n \"\";\n if (message) return message;\n try {\n return JSON.stringify(obj);\n } catch {\n return \"\";\n }\n}\n\nfunction printToolResult(block: Record<string, unknown>): void {\n const isError = block.is_error === true;\n let text = \"\";\n if (typeof block.content === \"string\") {\n text = block.content;\n } else if (Array.isArray(block.content)) {\n const parts: string[] = [];\n for (const part of block.content) {\n if (typeof part !== \"object\" || part === null || Array.isArray(part)) continue;\n const record = part as Record<string, unknown>;\n if (typeof record.text === \"string\") parts.push(record.text);\n }\n text = parts.join(\"\\n\");\n }\n\n console.log((isError ? pc.red : pc.cyan)(`tool_result${isError ? \" (error)\" : \"\"}`));\n if (text) {\n console.log((isError ? pc.red : pc.gray)(text));\n }\n}\n\nexport function printClaudeStreamEvent(raw: string, debug: boolean): void {\n const line = raw.trim();\n if (!line) return;\n\n let parsed: Record<string, unknown> | null = null;\n try {\n parsed = JSON.parse(line) as Record<string, unknown>;\n } catch {\n console.log(line);\n return;\n }\n\n const type = typeof parsed.type === \"string\" ? parsed.type : \"\";\n\n if (type === \"system\" && parsed.subtype === \"init\") {\n const model = typeof parsed.model === \"string\" ? parsed.model : \"unknown\";\n const sessionId = typeof parsed.session_id === \"string\" ? parsed.session_id : \"\";\n console.log(pc.blue(`Claude initialized (model: ${model}${sessionId ? `, session: ${sessionId}` : \"\"})`));\n return;\n }\n\n if (type === \"assistant\") {\n const message =\n typeof parsed.message === \"object\" && parsed.message !== null && !Array.isArray(parsed.message)\n ? (parsed.message as Record<string, unknown>)\n : {};\n const content = Array.isArray(message.content) ? message.content : [];\n for (const blockRaw of content) {\n if (typeof blockRaw !== \"object\" || blockRaw === null || Array.isArray(blockRaw)) continue;\n const block = blockRaw as Record<string, unknown>;\n const blockType = typeof block.type === \"string\" ? block.type : \"\";\n if (blockType === \"text\") {\n const text = typeof block.text === \"string\" ? block.text : \"\";\n if (text) console.log(pc.green(`assistant: ${text}`));\n } else if (blockType === \"thinking\") {\n const text = typeof block.thinking === \"string\" ? block.thinking : \"\";\n if (text) console.log(pc.gray(`thinking: ${text}`));\n } else if (blockType === \"tool_use\") {\n const name = typeof block.name === \"string\" ? block.name : \"unknown\";\n console.log(pc.yellow(`tool_call: ${name}`));\n if (block.input !== undefined) {\n console.log(pc.gray(JSON.stringify(block.input, null, 2)));\n }\n }\n }\n return;\n }\n\n if (type === \"user\") {\n const message =\n typeof parsed.message === \"object\" && parsed.message !== null && !Array.isArray(parsed.message)\n ? (parsed.message as Record<string, unknown>)\n : {};\n const content = Array.isArray(message.content) ? message.content : [];\n for (const blockRaw of content) {\n if (typeof blockRaw !== \"object\" || blockRaw === null || Array.isArray(blockRaw)) continue;\n const block = blockRaw as Record<string, unknown>;\n if (typeof block.type === \"string\" && block.type === \"tool_result\") {\n printToolResult(block);\n }\n }\n return;\n }\n\n if (type === \"result\") {\n const usage =\n typeof parsed.usage === \"object\" && parsed.usage !== null && !Array.isArray(parsed.usage)\n ? (parsed.usage as Record<string, unknown>)\n : {};\n const input = Number(usage.input_tokens ?? 0);\n const output = Number(usage.output_tokens ?? 0);\n const cached = Number(usage.cache_read_input_tokens ?? 0);\n const cost = Number(parsed.total_cost_usd ?? 0);\n const subtype = typeof parsed.subtype === \"string\" ? parsed.subtype : \"\";\n const isError = parsed.is_error === true;\n const resultText = typeof parsed.result === \"string\" ? parsed.result : \"\";\n if (resultText) {\n console.log(pc.green(\"result:\"));\n console.log(resultText);\n }\n const errors = Array.isArray(parsed.errors) ? parsed.errors.map(asErrorText).filter(Boolean) : [];\n if (subtype.startsWith(\"error\") || isError || errors.length > 0) {\n console.log(pc.red(`claude_result: subtype=${subtype || \"unknown\"} is_error=${isError ? \"true\" : \"false\"}`));\n if (errors.length > 0) {\n console.log(pc.red(`claude_errors: ${errors.join(\" | \")}`));\n }\n }\n console.log(\n pc.blue(\n `tokens: in=${Number.isFinite(input) ? input : 0} out=${Number.isFinite(output) ? output : 0} cached=${Number.isFinite(cached) ? cached : 0} cost=$${Number.isFinite(cost) ? cost.toFixed(6) : \"0.000000\"}`,\n ),\n );\n return;\n }\n\n if (debug) {\n console.log(pc.gray(line));\n }\n}\n", "import pc from \"picocolors\";\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return null;\n return value as Record<string, unknown>;\n}\n\nfunction asString(value: unknown, fallback = \"\"): string {\n return typeof value === \"string\" ? value : fallback;\n}\n\nfunction asNumber(value: unknown, fallback = 0): number {\n return typeof value === \"number\" && Number.isFinite(value) ? value : fallback;\n}\n\nfunction errorText(value: unknown): string {\n if (typeof value === \"string\") return value;\n const rec = asRecord(value);\n if (!rec) return \"\";\n const msg =\n (typeof rec.message === \"string\" && rec.message) ||\n (typeof rec.error === \"string\" && rec.error) ||\n (typeof rec.code === \"string\" && rec.code) ||\n \"\";\n if (msg) return msg;\n try {\n return JSON.stringify(rec);\n } catch {\n return \"\";\n }\n}\n\nfunction printItemStarted(item: Record<string, unknown>): boolean {\n const itemType = asString(item.type);\n if (itemType === \"command_execution\") {\n const command = asString(item.command);\n console.log(pc.yellow(\"tool_call: command_execution\"));\n if (command) console.log(pc.gray(command));\n return true;\n }\n\n if (itemType === \"tool_use\") {\n const name = asString(item.name, \"unknown\");\n console.log(pc.yellow(`tool_call: ${name}`));\n if (item.input !== undefined) {\n try {\n console.log(pc.gray(JSON.stringify(item.input, null, 2)));\n } catch {\n console.log(pc.gray(String(item.input)));\n }\n }\n return true;\n }\n\n return false;\n}\n\nfunction printItemCompleted(item: Record<string, unknown>): boolean {\n const itemType = asString(item.type);\n\n if (itemType === \"agent_message\") {\n const text = asString(item.text);\n if (text) console.log(pc.green(`assistant: ${text}`));\n return true;\n }\n\n if (itemType === \"reasoning\") {\n const text = asString(item.text);\n if (text) console.log(pc.gray(`thinking: ${text}`));\n return true;\n }\n\n if (itemType === \"tool_use\") {\n const name = asString(item.name, \"unknown\");\n console.log(pc.yellow(`tool_call: ${name}`));\n if (item.input !== undefined) {\n try {\n console.log(pc.gray(JSON.stringify(item.input, null, 2)));\n } catch {\n console.log(pc.gray(String(item.input)));\n }\n }\n return true;\n }\n\n if (itemType === \"command_execution\") {\n const command = asString(item.command);\n const status = asString(item.status);\n const exitCode = typeof item.exit_code === \"number\" && Number.isFinite(item.exit_code) ? item.exit_code : null;\n const output = asString(item.aggregated_output).replace(/\\s+$/, \"\");\n const isError =\n (exitCode !== null && exitCode !== 0) ||\n status === \"failed\" ||\n status === \"errored\" ||\n status === \"error\" ||\n status === \"cancelled\";\n\n const summaryParts = [\n \"tool_result: command_execution\",\n command ? `command=\"${command}\"` : \"\",\n status ? `status=${status}` : \"\",\n exitCode !== null ? `exit_code=${exitCode}` : \"\",\n ].filter(Boolean);\n console.log((isError ? pc.red : pc.cyan)(summaryParts.join(\" \")));\n if (output) console.log((isError ? pc.red : pc.gray)(output));\n return true;\n }\n\n if (itemType === \"file_change\") {\n const changes = Array.isArray(item.changes) ? item.changes : [];\n const entries = changes\n .map((changeRaw) => asRecord(changeRaw))\n .filter((change): change is Record<string, unknown> => Boolean(change))\n .map((change) => {\n const kind = asString(change.kind, \"update\");\n const path = asString(change.path, \"unknown\");\n return `${kind} ${path}`;\n });\n const preview = entries.length > 0 ? entries.slice(0, 6).join(\", \") : \"none\";\n const more = entries.length > 6 ? ` (+${entries.length - 6} more)` : \"\";\n console.log(pc.cyan(`file_change: ${preview}${more}`));\n return true;\n }\n\n if (itemType === \"error\") {\n const message = errorText(item.message ?? item.error ?? item);\n if (message) console.log(pc.red(`error: ${message}`));\n return true;\n }\n\n if (itemType === \"tool_result\") {\n const isError = item.is_error === true || asString(item.status) === \"error\";\n const text = asString(item.content) || asString(item.result) || asString(item.output);\n console.log((isError ? pc.red : pc.cyan)(`tool_result${isError ? \" (error)\" : \"\"}`));\n if (text) console.log((isError ? pc.red : pc.gray)(text));\n return true;\n }\n\n return false;\n}\n\nexport function printCodexStreamEvent(raw: string, _debug: boolean): void {\n const line = raw.trim();\n if (!line) return;\n\n let parsed: Record<string, unknown> | null = null;\n try {\n parsed = JSON.parse(line) as Record<string, unknown>;\n } catch {\n console.log(line);\n return;\n }\n\n const type = asString(parsed.type);\n\n if (type === \"thread.started\") {\n const threadId = asString(parsed.thread_id);\n const model = asString(parsed.model);\n const details = [threadId ? `session: ${threadId}` : \"\", model ? `model: ${model}` : \"\"].filter(Boolean).join(\", \");\n console.log(pc.blue(`Codex thread started${details ? ` (${details})` : \"\"}`));\n return;\n }\n\n if (type === \"turn.started\") {\n console.log(pc.blue(\"turn started\"));\n return;\n }\n\n if (type === \"item.started\" || type === \"item.completed\") {\n const item = asRecord(parsed.item);\n if (item) {\n const handled =\n type === \"item.started\"\n ? printItemStarted(item)\n : printItemCompleted(item);\n if (!handled) {\n const itemType = asString(item.type, \"unknown\");\n const id = asString(item.id);\n const status = asString(item.status);\n const meta = [id ? `id=${id}` : \"\", status ? `status=${status}` : \"\"].filter(Boolean).join(\" \");\n console.log(pc.gray(`${type}: ${itemType}${meta ? ` (${meta})` : \"\"}`));\n }\n } else {\n console.log(pc.gray(type));\n }\n return;\n }\n\n if (type === \"turn.completed\") {\n const usage = asRecord(parsed.usage);\n const input = asNumber(usage?.input_tokens);\n const output = asNumber(usage?.output_tokens);\n const cached = asNumber(usage?.cached_input_tokens, asNumber(usage?.cache_read_input_tokens));\n const cost = asNumber(parsed.total_cost_usd);\n const isError = parsed.is_error === true;\n const subtype = asString(parsed.subtype);\n const errors = Array.isArray(parsed.errors) ? parsed.errors.map(errorText).filter(Boolean) : [];\n\n console.log(\n pc.blue(`tokens: in=${input} out=${output} cached=${cached} cost=$${cost.toFixed(6)}`),\n );\n if (subtype || isError || errors.length > 0) {\n console.log(\n pc.red(`result: subtype=${subtype || \"unknown\"} is_error=${isError ? \"true\" : \"false\"}`),\n );\n if (errors.length > 0) console.log(pc.red(`errors: ${errors.join(\" | \")}`));\n }\n return;\n }\n\n if (type === \"turn.failed\") {\n const usage = asRecord(parsed.usage);\n const input = asNumber(usage?.input_tokens);\n const output = asNumber(usage?.output_tokens);\n const cached = asNumber(usage?.cached_input_tokens, asNumber(usage?.cache_read_input_tokens));\n const message = errorText(parsed.error ?? parsed.message);\n console.log(pc.red(`turn failed${message ? `: ${message}` : \"\"}`));\n console.log(pc.blue(`tokens: in=${input} out=${output} cached=${cached}`));\n return;\n }\n\n if (type === \"error\") {\n const message = errorText(parsed.message ?? parsed.error ?? parsed);\n if (message) console.log(pc.red(`error: ${message}`));\n return;\n }\n\n console.log(line);\n}\n", "import pc from \"picocolors\";\nimport { normalizeCursorStreamLine } from \"../shared/stream.js\";\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return null;\n return value as Record<string, unknown>;\n}\n\nfunction asString(value: unknown, fallback = \"\"): string {\n return typeof value === \"string\" ? value : fallback;\n}\n\nfunction asNumber(value: unknown, fallback = 0): number {\n return typeof value === \"number\" && Number.isFinite(value) ? value : fallback;\n}\n\nfunction stringifyUnknown(value: unknown): string {\n if (typeof value === \"string\") return value;\n if (value === null || value === undefined) return \"\";\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n\nfunction printUserMessage(messageRaw: unknown): void {\n if (typeof messageRaw === \"string\") {\n const text = messageRaw.trim();\n if (text) console.log(pc.gray(`user: ${text}`));\n return;\n }\n\n const message = asRecord(messageRaw);\n if (!message) return;\n\n const directText = asString(message.text).trim();\n if (directText) console.log(pc.gray(`user: ${directText}`));\n\n const content = Array.isArray(message.content) ? message.content : [];\n for (const partRaw of content) {\n const part = asRecord(partRaw);\n if (!part) continue;\n const type = asString(part.type).trim();\n if (type !== \"output_text\" && type !== \"text\") continue;\n const text = asString(part.text).trim();\n if (text) console.log(pc.gray(`user: ${text}`));\n }\n}\n\nfunction printAssistantMessage(messageRaw: unknown): void {\n if (typeof messageRaw === \"string\") {\n const text = messageRaw.trim();\n if (text) console.log(pc.green(`assistant: ${text}`));\n return;\n }\n\n const message = asRecord(messageRaw);\n if (!message) return;\n\n const directText = asString(message.text).trim();\n if (directText) console.log(pc.green(`assistant: ${directText}`));\n\n const content = Array.isArray(message.content) ? message.content : [];\n for (const partRaw of content) {\n const part = asRecord(partRaw);\n if (!part) continue;\n const type = asString(part.type).trim();\n\n if (type === \"output_text\" || type === \"text\") {\n const text = asString(part.text).trim();\n if (text) console.log(pc.green(`assistant: ${text}`));\n continue;\n }\n\n if (type === \"thinking\") {\n const text = asString(part.text).trim();\n if (text) console.log(pc.gray(`thinking: ${text}`));\n continue;\n }\n\n if (type === \"tool_call\") {\n const name = asString(part.name, asString(part.tool, \"tool\"));\n console.log(pc.yellow(`tool_call: ${name}`));\n const input = part.input ?? part.arguments ?? part.args;\n if (input !== undefined) {\n try {\n console.log(pc.gray(JSON.stringify(input, null, 2)));\n } catch {\n console.log(pc.gray(String(input)));\n }\n }\n continue;\n }\n\n if (type === \"tool_result\") {\n const isError = part.is_error === true || asString(part.status).toLowerCase() === \"error\";\n const contentText =\n asString(part.output) ||\n asString(part.text) ||\n asString(part.result) ||\n stringifyUnknown(part.output ?? part.result ?? part.text ?? part);\n console.log((isError ? pc.red : pc.cyan)(`tool_result${isError ? \" (error)\" : \"\"}`));\n if (contentText) console.log((isError ? pc.red : pc.gray)(contentText));\n }\n }\n}\n\nfunction printToolCallEventTopLevel(parsed: Record<string, unknown>): void {\n const subtype = asString(parsed.subtype).trim().toLowerCase();\n const callId = asString(parsed.call_id, asString(parsed.callId, asString(parsed.id, \"\")));\n const toolCall = asRecord(parsed.tool_call ?? parsed.toolCall);\n if (!toolCall) {\n console.log(pc.yellow(`tool_call${subtype ? `: ${subtype}` : \"\"}`));\n return;\n }\n\n const [toolName] = Object.keys(toolCall);\n if (!toolName) {\n console.log(pc.yellow(`tool_call${subtype ? `: ${subtype}` : \"\"}`));\n return;\n }\n const payload = asRecord(toolCall[toolName]) ?? {};\n const args = payload.args ?? asRecord(payload.function)?.arguments;\n const result =\n payload.result ??\n payload.output ??\n payload.error ??\n asRecord(payload.function)?.result ??\n asRecord(payload.function)?.output;\n const isError =\n parsed.is_error === true ||\n payload.is_error === true ||\n subtype === \"failed\" ||\n subtype === \"error\" ||\n subtype === \"cancelled\" ||\n payload.error !== undefined;\n\n if (subtype === \"started\" || subtype === \"start\") {\n console.log(pc.yellow(`tool_call: ${toolName}${callId ? ` (${callId})` : \"\"}`));\n if (args !== undefined) {\n console.log(pc.gray(stringifyUnknown(args)));\n }\n return;\n }\n\n if (subtype === \"completed\" || subtype === \"complete\" || subtype === \"finished\") {\n const header = `tool_result${isError ? \" (error)\" : \"\"}${callId ? ` (${callId})` : \"\"}`;\n console.log((isError ? pc.red : pc.cyan)(header));\n if (result !== undefined) {\n console.log((isError ? pc.red : pc.gray)(stringifyUnknown(result)));\n }\n return;\n }\n\n console.log(pc.yellow(`tool_call: ${toolName}${subtype ? ` (${subtype})` : \"\"}`));\n}\n\nfunction printLegacyToolEvent(part: Record<string, unknown>): void {\n const tool = asString(part.tool, \"tool\");\n const callId = asString(part.callID, asString(part.id, \"\"));\n const state = asRecord(part.state);\n const status = asString(state?.status);\n const input = state?.input;\n const output = asString(state?.output).replace(/\\s+$/, \"\");\n const metadata = asRecord(state?.metadata);\n const exit = asNumber(metadata?.exit, NaN);\n const isError =\n status === \"failed\" ||\n status === \"error\" ||\n status === \"cancelled\" ||\n (Number.isFinite(exit) && exit !== 0);\n\n console.log(pc.yellow(`tool_call: ${tool}${callId ? ` (${callId})` : \"\"}`));\n if (input !== undefined) {\n try {\n console.log(pc.gray(JSON.stringify(input, null, 2)));\n } catch {\n console.log(pc.gray(String(input)));\n }\n }\n\n if (status || output) {\n const summary = [\n \"tool_result\",\n status ? `status=${status}` : \"\",\n Number.isFinite(exit) ? `exit=${exit}` : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n console.log((isError ? pc.red : pc.cyan)(summary));\n if (output) {\n console.log((isError ? pc.red : pc.gray)(output));\n }\n }\n}\n\nexport function printCursorStreamEvent(raw: string, _debug: boolean): void {\n const line = normalizeCursorStreamLine(raw).line;\n if (!line) return;\n\n let parsed: Record<string, unknown> | null = null;\n try {\n parsed = JSON.parse(line) as Record<string, unknown>;\n } catch {\n console.log(line);\n return;\n }\n\n const type = asString(parsed.type);\n\n if (type === \"system\") {\n const subtype = asString(parsed.subtype);\n if (subtype === \"init\") {\n const sessionId =\n asString(parsed.session_id) ||\n asString(parsed.sessionId) ||\n asString(parsed.sessionID);\n const model = asString(parsed.model);\n const details = [sessionId ? `session: ${sessionId}` : \"\", model ? `model: ${model}` : \"\"]\n .filter(Boolean)\n .join(\", \");\n console.log(pc.blue(`Cursor init${details ? ` (${details})` : \"\"}`));\n return;\n }\n console.log(pc.blue(`system: ${subtype || \"event\"}`));\n return;\n }\n\n if (type === \"assistant\") {\n printAssistantMessage(parsed.message);\n return;\n }\n\n if (type === \"user\") {\n printUserMessage(parsed.message);\n return;\n }\n\n if (type === \"thinking\") {\n const text = asString(parsed.text).trim() || asString(asRecord(parsed.delta)?.text).trim();\n if (text) console.log(pc.gray(`thinking: ${text}`));\n return;\n }\n\n if (type === \"tool_call\") {\n printToolCallEventTopLevel(parsed);\n return;\n }\n\n if (type === \"result\") {\n const usage = asRecord(parsed.usage);\n const input = asNumber(usage?.input_tokens, asNumber(usage?.inputTokens));\n const output = asNumber(usage?.output_tokens, asNumber(usage?.outputTokens));\n const cached = asNumber(\n usage?.cached_input_tokens,\n asNumber(usage?.cachedInputTokens, asNumber(usage?.cache_read_input_tokens)),\n );\n const cost = asNumber(parsed.total_cost_usd, asNumber(parsed.cost_usd, asNumber(parsed.cost)));\n const subtype = asString(parsed.subtype, \"result\");\n const isError = parsed.is_error === true || subtype === \"error\" || subtype === \"failed\";\n\n console.log(pc.blue(`result: subtype=${subtype}`));\n console.log(pc.blue(`tokens: in=${input} out=${output} cached=${cached} cost=$${cost.toFixed(6)}`));\n const resultText = asString(parsed.result).trim();\n if (resultText) console.log((isError ? pc.red : pc.green)(`assistant: ${resultText}`));\n const errors = Array.isArray(parsed.errors) ? parsed.errors.map((value) => stringifyUnknown(value)).filter(Boolean) : [];\n if (errors.length > 0) console.log(pc.red(`errors: ${errors.join(\" | \")}`));\n return;\n }\n\n if (type === \"error\") {\n const message = asString(parsed.message) || stringifyUnknown(parsed.error ?? parsed.detail) || line;\n console.log(pc.red(`error: ${message}`));\n return;\n }\n\n // Compatibility with older stream-json event shapes.\n if (type === \"step_start\") {\n const sessionId = asString(parsed.sessionID);\n console.log(pc.blue(`step started${sessionId ? ` (session: ${sessionId})` : \"\"}`));\n return;\n }\n\n if (type === \"text\") {\n const part = asRecord(parsed.part);\n const text = asString(part?.text);\n if (text) console.log(pc.green(`assistant: ${text}`));\n return;\n }\n\n if (type === \"tool_use\") {\n const part = asRecord(parsed.part);\n if (part) {\n printLegacyToolEvent(part);\n } else {\n console.log(pc.yellow(\"tool_use\"));\n }\n return;\n }\n\n if (type === \"step_finish\") {\n const part = asRecord(parsed.part);\n const tokens = asRecord(part?.tokens);\n const cache = asRecord(tokens?.cache);\n const reason = asString(part?.reason, \"step_finish\");\n const input = asNumber(tokens?.input);\n const output = asNumber(tokens?.output);\n const cached = asNumber(cache?.read);\n const cost = asNumber(part?.cost);\n console.log(pc.blue(`step finished: reason=${reason}`));\n console.log(pc.blue(`tokens: in=${input} out=${output} cached=${cached} cost=$${cost.toFixed(6)}`));\n return;\n }\n\n console.log(line);\n}\n", "export function normalizeCursorStreamLine(rawLine: string): {\n stream: \"stdout\" | \"stderr\" | null;\n line: string;\n} {\n const trimmed = rawLine.trim();\n if (!trimmed) return { stream: null, line: \"\" };\n\n const prefixed = trimmed.match(/^(stdout|stderr)\\s*[:=]?\\s*([\\[{].*)$/i);\n if (!prefixed) {\n return { stream: null, line: trimmed };\n }\n\n const stream = prefixed[1]?.toLowerCase() === \"stderr\" ? \"stderr\" : \"stdout\";\n const line = (prefixed[2] ?? \"\").trim();\n return { stream, line };\n}\n", "import pc from \"picocolors\";\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return null;\n return value as Record<string, unknown>;\n}\n\nfunction asString(value: unknown, fallback = \"\"): string {\n return typeof value === \"string\" ? value : fallback;\n}\n\nfunction asNumber(value: unknown, fallback = 0): number {\n return typeof value === \"number\" && Number.isFinite(value) ? value : fallback;\n}\n\nfunction stringifyUnknown(value: unknown): string {\n if (typeof value === \"string\") return value;\n if (value === null || value === undefined) return \"\";\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n\nfunction errorText(value: unknown): string {\n if (typeof value === \"string\") return value;\n const rec = asRecord(value);\n if (!rec) return \"\";\n const msg =\n (typeof rec.message === \"string\" && rec.message) ||\n (typeof rec.error === \"string\" && rec.error) ||\n (typeof rec.code === \"string\" && rec.code) ||\n \"\";\n if (msg) return msg;\n try {\n return JSON.stringify(rec);\n } catch {\n return \"\";\n }\n}\n\nfunction printTextMessage(prefix: string, colorize: (text: string) => string, messageRaw: unknown): void {\n if (typeof messageRaw === \"string\") {\n const text = messageRaw.trim();\n if (text) console.log(colorize(`${prefix}: ${text}`));\n return;\n }\n\n const message = asRecord(messageRaw);\n if (!message) return;\n\n const directText = asString(message.text).trim();\n if (directText) console.log(colorize(`${prefix}: ${directText}`));\n\n const content = Array.isArray(message.content) ? message.content : [];\n for (const partRaw of content) {\n const part = asRecord(partRaw);\n if (!part) continue;\n const type = asString(part.type).trim();\n\n if (type === \"output_text\" || type === \"text\" || type === \"content\") {\n const text = asString(part.text).trim() || asString(part.content).trim();\n if (text) console.log(colorize(`${prefix}: ${text}`));\n continue;\n }\n\n if (type === \"thinking\") {\n const text = asString(part.text).trim();\n if (text) console.log(pc.gray(`thinking: ${text}`));\n continue;\n }\n\n if (type === \"tool_call\") {\n const name = asString(part.name, asString(part.tool, \"tool\"));\n console.log(pc.yellow(`tool_call: ${name}`));\n const input = part.input ?? part.arguments ?? part.args;\n if (input !== undefined) console.log(pc.gray(stringifyUnknown(input)));\n continue;\n }\n\n if (type === \"tool_result\" || type === \"tool_response\") {\n const isError = part.is_error === true || asString(part.status).toLowerCase() === \"error\";\n const contentText =\n asString(part.output) ||\n asString(part.text) ||\n asString(part.result) ||\n stringifyUnknown(part.output ?? part.result ?? part.text ?? part.response);\n console.log((isError ? pc.red : pc.cyan)(`tool_result${isError ? \" (error)\" : \"\"}`));\n if (contentText) console.log((isError ? pc.red : pc.gray)(contentText));\n }\n }\n}\n\nfunction printUsage(parsed: Record<string, unknown>) {\n const usage = asRecord(parsed.usage) ?? asRecord(parsed.usageMetadata);\n const usageMetadata = asRecord(usage?.usageMetadata);\n const source = usageMetadata ?? usage ?? {};\n const input = asNumber(source.input_tokens, asNumber(source.inputTokens, asNumber(source.promptTokenCount)));\n const output = asNumber(source.output_tokens, asNumber(source.outputTokens, asNumber(source.candidatesTokenCount)));\n const cached = asNumber(\n source.cached_input_tokens,\n asNumber(source.cachedInputTokens, asNumber(source.cachedContentTokenCount)),\n );\n const cost = asNumber(parsed.total_cost_usd, asNumber(parsed.cost_usd, asNumber(parsed.cost)));\n console.log(pc.blue(`tokens: in=${input} out=${output} cached=${cached} cost=$${cost.toFixed(6)}`));\n}\n\nexport function printGeminiStreamEvent(raw: string, _debug: boolean): void {\n const line = raw.trim();\n if (!line) return;\n\n let parsed: Record<string, unknown> | null = null;\n try {\n parsed = JSON.parse(line) as Record<string, unknown>;\n } catch {\n console.log(line);\n return;\n }\n\n const type = asString(parsed.type);\n\n if (type === \"system\") {\n const subtype = asString(parsed.subtype);\n if (subtype === \"init\") {\n const sessionId =\n asString(parsed.session_id) ||\n asString(parsed.sessionId) ||\n asString(parsed.sessionID) ||\n asString(parsed.checkpoint_id);\n const model = asString(parsed.model);\n const details = [sessionId ? `session: ${sessionId}` : \"\", model ? `model: ${model}` : \"\"]\n .filter(Boolean)\n .join(\", \");\n console.log(pc.blue(`Gemini init${details ? ` (${details})` : \"\"}`));\n return;\n }\n if (subtype === \"error\") {\n const text = errorText(parsed.error ?? parsed.message ?? parsed.detail);\n if (text) console.log(pc.red(`error: ${text}`));\n return;\n }\n console.log(pc.blue(`system: ${subtype || \"event\"}`));\n return;\n }\n\n if (type === \"assistant\") {\n printTextMessage(\"assistant\", pc.green, parsed.message);\n return;\n }\n\n if (type === \"user\") {\n printTextMessage(\"user\", pc.gray, parsed.message);\n return;\n }\n\n if (type === \"thinking\") {\n const text = asString(parsed.text).trim() || asString(asRecord(parsed.delta)?.text).trim();\n if (text) console.log(pc.gray(`thinking: ${text}`));\n return;\n }\n\n if (type === \"tool_call\") {\n const subtype = asString(parsed.subtype).trim().toLowerCase();\n const toolCall = asRecord(parsed.tool_call ?? parsed.toolCall);\n const [toolName] = toolCall ? Object.keys(toolCall) : [];\n if (!toolCall || !toolName) {\n console.log(pc.yellow(`tool_call${subtype ? `: ${subtype}` : \"\"}`));\n return;\n }\n const payload = asRecord(toolCall[toolName]) ?? {};\n if (subtype === \"started\" || subtype === \"start\") {\n console.log(pc.yellow(`tool_call: ${toolName}`));\n console.log(pc.gray(stringifyUnknown(payload.args ?? payload.input ?? payload.arguments ?? payload)));\n return;\n }\n if (subtype === \"completed\" || subtype === \"complete\" || subtype === \"finished\") {\n const isError =\n parsed.is_error === true ||\n payload.is_error === true ||\n payload.error !== undefined ||\n asString(payload.status).toLowerCase() === \"error\";\n console.log((isError ? pc.red : pc.cyan)(`tool_result${isError ? \" (error)\" : \"\"}`));\n console.log((isError ? pc.red : pc.gray)(stringifyUnknown(payload.result ?? payload.output ?? payload.error)));\n return;\n }\n console.log(pc.yellow(`tool_call: ${toolName}${subtype ? ` (${subtype})` : \"\"}`));\n return;\n }\n\n if (type === \"result\") {\n printUsage(parsed);\n const subtype = asString(parsed.subtype, \"result\");\n const isError = parsed.is_error === true;\n if (subtype || isError) {\n console.log((isError ? pc.red : pc.blue)(`result: subtype=${subtype} is_error=${isError ? \"true\" : \"false\"}`));\n }\n return;\n }\n\n if (type === \"error\") {\n const text = errorText(parsed.error ?? parsed.message ?? parsed.detail);\n if (text) console.log(pc.red(`error: ${text}`));\n return;\n }\n\n console.log(line);\n}\n", "import pc from \"picocolors\";\n\nfunction safeJsonParse(text: string): unknown {\n try {\n return JSON.parse(text);\n } catch {\n return null;\n }\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return null;\n return value as Record<string, unknown>;\n}\n\nfunction asString(value: unknown, fallback = \"\"): string {\n return typeof value === \"string\" ? value : fallback;\n}\n\nfunction asNumber(value: unknown, fallback = 0): number {\n return typeof value === \"number\" && Number.isFinite(value) ? value : fallback;\n}\n\nfunction errorText(value: unknown): string {\n if (typeof value === \"string\") return value;\n const rec = asRecord(value);\n if (!rec) return \"\";\n const data = asRecord(rec.data);\n const message =\n asString(rec.message) ||\n asString(data?.message) ||\n asString(rec.name) ||\n \"\";\n if (message) return message;\n try {\n return JSON.stringify(rec);\n } catch {\n return \"\";\n }\n}\n\nexport function printOpenCodeStreamEvent(raw: string, _debug: boolean): void {\n const line = raw.trim();\n if (!line) return;\n\n const parsed = asRecord(safeJsonParse(line));\n if (!parsed) {\n console.log(line);\n return;\n }\n\n const type = asString(parsed.type);\n\n if (type === \"step_start\") {\n const sessionId = asString(parsed.sessionID);\n console.log(pc.blue(`step started${sessionId ? ` (session: ${sessionId})` : \"\"}`));\n return;\n }\n\n if (type === \"text\") {\n const part = asRecord(parsed.part);\n const text = asString(part?.text).trim();\n if (text) console.log(pc.green(`assistant: ${text}`));\n return;\n }\n\n if (type === \"reasoning\") {\n const part = asRecord(parsed.part);\n const text = asString(part?.text).trim();\n if (text) console.log(pc.gray(`thinking: ${text}`));\n return;\n }\n\n if (type === \"tool_use\") {\n const part = asRecord(parsed.part);\n const tool = asString(part?.tool, \"tool\");\n const callID = asString(part?.callID);\n const state = asRecord(part?.state);\n const status = asString(state?.status);\n const isError = status === \"error\";\n const metadata = asRecord(state?.metadata);\n\n console.log(pc.yellow(`tool_call: ${tool}${callID ? ` (${callID})` : \"\"}`));\n\n if (status) {\n const metaParts = [`status=${status}`];\n if (metadata) {\n for (const [key, value] of Object.entries(metadata)) {\n if (value !== undefined && value !== null) metaParts.push(`${key}=${value}`);\n }\n }\n console.log((isError ? pc.red : pc.gray)(`tool_result ${metaParts.join(\" \")}`));\n }\n\n const output = (asString(state?.output) || asString(state?.error)).trim();\n if (output) console.log((isError ? pc.red : pc.gray)(output));\n return;\n }\n\n if (type === \"step_finish\") {\n const part = asRecord(parsed.part);\n const tokens = asRecord(part?.tokens);\n const cache = asRecord(tokens?.cache);\n const input = asNumber(tokens?.input, 0);\n const output = asNumber(tokens?.output, 0) + asNumber(tokens?.reasoning, 0);\n const cached = asNumber(cache?.read, 0);\n const cost = asNumber(part?.cost, 0);\n const reason = asString(part?.reason, \"step\");\n console.log(pc.blue(`step finished: reason=${reason}`));\n console.log(pc.blue(`tokens: in=${input} out=${output} cached=${cached} cost=$${cost.toFixed(6)}`));\n return;\n }\n\n if (type === \"error\") {\n const message = errorText(parsed.error ?? parsed.message);\n if (message) console.log(pc.red(`error: ${message}`));\n return;\n }\n\n console.log(line);\n}\n", "import pc from \"picocolors\";\n\nfunction safeJsonParse(text: string): unknown {\n try {\n return JSON.parse(text);\n } catch {\n return null;\n }\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return null;\n return value as Record<string, unknown>;\n}\n\nfunction asString(value: unknown, fallback = \"\"): string {\n return typeof value === \"string\" ? value : fallback;\n}\n\nfunction extractTextContent(content: string | Array<{ type: string; text?: string }>): string {\n if (typeof content === \"string\") return content;\n if (!Array.isArray(content)) return \"\";\n return content\n .filter((c) => c.type === \"text\" && c.text)\n .map((c) => c.text!)\n .join(\"\");\n}\n\nexport function printPiStreamEvent(raw: string, _debug: boolean): void {\n const line = raw.trim();\n if (!line) return;\n\n const parsed = asRecord(safeJsonParse(line));\n if (!parsed) {\n console.log(line);\n return;\n }\n\n const type = asString(parsed.type);\n\n if (type === \"agent_start\") {\n console.log(pc.blue(\"Pi agent started\"));\n return;\n }\n\n if (type === \"agent_end\") {\n console.log(pc.blue(\"Pi agent finished\"));\n return;\n }\n\n if (type === \"turn_start\") {\n console.log(pc.blue(\"Turn started\"));\n return;\n }\n\n if (type === \"turn_end\") {\n const message = asRecord(parsed.message);\n if (message) {\n const content = message.content as string | Array<{ type: string; text?: string }>;\n const text = extractTextContent(content);\n if (text) {\n console.log(pc.green(`assistant: ${text}`));\n }\n }\n return;\n }\n\n if (type === \"message_update\") {\n const assistantEvent = asRecord(parsed.assistantMessageEvent);\n if (assistantEvent) {\n const msgType = asString(assistantEvent.type);\n if (msgType === \"text_delta\") {\n const delta = asString(assistantEvent.delta);\n if (delta) {\n console.log(pc.green(delta));\n }\n }\n }\n return;\n }\n\n if (type === \"tool_execution_start\") {\n const toolName = asString(parsed.toolName);\n const args = parsed.args;\n console.log(pc.yellow(`tool_start: ${toolName}`));\n if (args !== undefined) {\n try {\n console.log(pc.gray(JSON.stringify(args, null, 2)));\n } catch {\n console.log(pc.gray(String(args)));\n }\n }\n return;\n }\n\n if (type === \"tool_execution_end\") {\n const result = parsed.result;\n const isError = parsed.isError === true;\n const output = typeof result === \"string\" ? result : JSON.stringify(result);\n if (output) {\n console.log((isError ? pc.red : pc.gray)(output));\n }\n return;\n }\n\n console.log(line);\n}\n", "import pc from \"picocolors\";\n\nexport function printOpenClawGatewayStreamEvent(raw: string, debug: boolean): void {\n const line = raw.trim();\n if (!line) return;\n\n if (!debug) {\n console.log(line);\n return;\n }\n\n if (line.startsWith(\"[openclaw-gateway:event]\")) {\n console.log(pc.cyan(line));\n return;\n }\n\n if (line.startsWith(\"[openclaw-gateway]\")) {\n console.log(pc.blue(line));\n return;\n }\n\n console.log(pc.gray(line));\n}\n", "export function printProcessStdoutEvent(raw: string, _debug: boolean): void {\n const line = raw.trim();\n if (line) console.log(line);\n}\n", "import type { CLIAdapterModule } from \"@paperclipai/adapter-utils\";\nimport { printProcessStdoutEvent } from \"./format-event.js\";\n\nexport const processCLIAdapter: CLIAdapterModule = {\n type: \"process\",\n formatStdoutEvent: printProcessStdoutEvent,\n};\n", "export function printHttpStdoutEvent(raw: string, _debug: boolean): void {\n const line = raw.trim();\n if (line) console.log(line);\n}\n", "import type { CLIAdapterModule } from \"@paperclipai/adapter-utils\";\nimport { printHttpStdoutEvent } from \"./format-event.js\";\n\nexport const httpCLIAdapter: CLIAdapterModule = {\n type: \"http\",\n formatStdoutEvent: printHttpStdoutEvent,\n};\n", "import type { CLIAdapterModule } from \"@paperclipai/adapter-utils\";\nimport { printClaudeStreamEvent } from \"@paperclipai/adapter-claude-local/cli\";\nimport { printCodexStreamEvent } from \"@paperclipai/adapter-codex-local/cli\";\nimport { printCursorStreamEvent } from \"@paperclipai/adapter-cursor-local/cli\";\nimport { printGeminiStreamEvent } from \"@paperclipai/adapter-gemini-local/cli\";\nimport { printOpenCodeStreamEvent } from \"@paperclipai/adapter-opencode-local/cli\";\nimport { printPiStreamEvent } from \"@paperclipai/adapter-pi-local/cli\";\nimport { printOpenClawGatewayStreamEvent } from \"@paperclipai/adapter-openclaw-gateway/cli\";\nimport { processCLIAdapter } from \"./process/index.js\";\nimport { httpCLIAdapter } from \"./http/index.js\";\n\nconst claudeLocalCLIAdapter: CLIAdapterModule = {\n type: \"claude_local\",\n formatStdoutEvent: printClaudeStreamEvent,\n};\n\nconst codexLocalCLIAdapter: CLIAdapterModule = {\n type: \"codex_local\",\n formatStdoutEvent: printCodexStreamEvent,\n};\n\nconst openCodeLocalCLIAdapter: CLIAdapterModule = {\n type: \"opencode_local\",\n formatStdoutEvent: printOpenCodeStreamEvent,\n};\n\nconst piLocalCLIAdapter: CLIAdapterModule = {\n type: \"pi_local\",\n formatStdoutEvent: printPiStreamEvent,\n};\n\nconst cursorLocalCLIAdapter: CLIAdapterModule = {\n type: \"cursor\",\n formatStdoutEvent: printCursorStreamEvent,\n};\n\nconst geminiLocalCLIAdapter: CLIAdapterModule = {\n type: \"gemini_local\",\n formatStdoutEvent: printGeminiStreamEvent,\n};\n\nconst openclawGatewayCLIAdapter: CLIAdapterModule = {\n type: \"openclaw_gateway\",\n formatStdoutEvent: printOpenClawGatewayStreamEvent,\n};\n\nconst adaptersByType = new Map<string, CLIAdapterModule>(\n [\n claudeLocalCLIAdapter,\n codexLocalCLIAdapter,\n openCodeLocalCLIAdapter,\n piLocalCLIAdapter,\n cursorLocalCLIAdapter,\n geminiLocalCLIAdapter,\n openclawGatewayCLIAdapter,\n processCLIAdapter,\n httpCLIAdapter,\n ].map((a) => [a.type, a]),\n);\n\nexport function getCLIAdapter(type: string): CLIAdapterModule {\n return adaptersByType.get(type) ?? processCLIAdapter;\n}\n", "import pc from \"picocolors\";\nimport type { Command } from \"commander\";\nimport { getStoredBoardCredential, loginBoardCli } from \"../../client/board-auth.js\";\nimport { buildCliCommandLabel } from \"../../client/command-label.js\";\nimport { readConfig } from \"../../config/store.js\";\nimport { readContext, resolveProfile, type ClientContextProfile } from \"../../client/context.js\";\nimport { ApiRequestError, PaperclipApiClient } from \"../../client/http.js\";\n\nexport interface BaseClientOptions {\n config?: string;\n dataDir?: string;\n context?: string;\n profile?: string;\n apiBase?: string;\n apiKey?: string;\n companyId?: string;\n json?: boolean;\n}\n\nexport interface ResolvedClientContext {\n api: PaperclipApiClient;\n companyId?: string;\n profileName: string;\n profile: ClientContextProfile;\n json: boolean;\n}\n\nexport function addCommonClientOptions(command: Command, opts?: { includeCompany?: boolean }): Command {\n command\n .option(\"-c, --config <path>\", \"Path to Relay Control config file\")\n .option(\"-d, --data-dir <path>\", \"Relay Control data directory root (isolates state from ~/.relaycontrol)\")\n .option(\"--context <path>\", \"Path to CLI context file\")\n .option(\"--profile <name>\", \"CLI context profile name\")\n .option(\"--api-base <url>\", \"Base URL for the Relay Control API\")\n .option(\"--api-key <token>\", \"Bearer token for agent-authenticated calls\")\n .option(\"--json\", \"Output raw JSON\");\n\n if (opts?.includeCompany) {\n command.option(\"-C, --company-id <id>\", \"Company ID (overrides context default)\");\n }\n\n return command;\n}\n\nexport function resolveCommandContext(\n options: BaseClientOptions,\n opts?: { requireCompany?: boolean },\n): ResolvedClientContext {\n const context = readContext(options.context);\n const { name: profileName, profile } = resolveProfile(context, options.profile);\n\n const apiBase =\n options.apiBase?.trim() ||\n process.env.PAPERCLIP_API_URL?.trim() ||\n profile.apiBase ||\n inferApiBaseFromConfig(options.config);\n\n const explicitApiKey =\n options.apiKey?.trim() ||\n process.env.PAPERCLIP_API_KEY?.trim() ||\n readKeyFromProfileEnv(profile);\n const storedBoardCredential = explicitApiKey ? null : getStoredBoardCredential(apiBase);\n const apiKey = explicitApiKey || storedBoardCredential?.token;\n\n const companyId =\n options.companyId?.trim() ||\n process.env.PAPERCLIP_COMPANY_ID?.trim() ||\n profile.companyId;\n\n if (opts?.requireCompany && !companyId) {\n throw new Error(\n \"Company ID is required. Pass --company-id, set PAPERCLIP_COMPANY_ID, or set context profile companyId via `relaycontrol context set`.\",\n );\n }\n\n const api = new PaperclipApiClient({\n apiBase,\n apiKey,\n recoverAuth: explicitApiKey || !canAttemptInteractiveBoardAuth()\n ? undefined\n : async ({ error }) => {\n const requestedAccess = error.message.includes(\"Instance admin required\")\n ? \"instance_admin_required\"\n : \"board\";\n if (!shouldRecoverBoardAuth(error)) {\n return null;\n }\n const login = await loginBoardCli({\n apiBase,\n requestedAccess,\n requestedCompanyId: companyId ?? null,\n command: buildCliCommandLabel(),\n });\n return login.token;\n },\n });\n return {\n api,\n companyId,\n profileName,\n profile,\n json: Boolean(options.json),\n };\n}\n\nfunction shouldRecoverBoardAuth(error: ApiRequestError): boolean {\n if (error.status === 401) return true;\n if (error.status !== 403) return false;\n return error.message.includes(\"Board access required\") || error.message.includes(\"Instance admin required\");\n}\n\nfunction canAttemptInteractiveBoardAuth(): boolean {\n return Boolean(process.stdin.isTTY && process.stdout.isTTY);\n}\n\nexport function printOutput(data: unknown, opts: { json?: boolean; label?: string } = {}): void {\n if (opts.json) {\n console.log(JSON.stringify(data, null, 2));\n return;\n }\n\n if (opts.label) {\n console.log(pc.bold(opts.label));\n }\n\n if (Array.isArray(data)) {\n if (data.length === 0) {\n console.log(pc.dim(\"(empty)\"));\n return;\n }\n for (const item of data) {\n if (typeof item === \"object\" && item !== null) {\n console.log(formatInlineRecord(item as Record<string, unknown>));\n } else {\n console.log(String(item));\n }\n }\n return;\n }\n\n if (typeof data === \"object\" && data !== null) {\n console.log(JSON.stringify(data, null, 2));\n return;\n }\n\n if (data === undefined || data === null) {\n console.log(pc.dim(\"(null)\"));\n return;\n }\n\n console.log(String(data));\n}\n\nexport function formatInlineRecord(record: Record<string, unknown>): string {\n const keyOrder = [\"identifier\", \"id\", \"name\", \"status\", \"priority\", \"title\", \"action\"];\n const seen = new Set<string>();\n const parts: string[] = [];\n\n for (const key of keyOrder) {\n if (!(key in record)) continue;\n parts.push(`${key}=${renderValue(record[key])}`);\n seen.add(key);\n }\n\n for (const [key, value] of Object.entries(record)) {\n if (seen.has(key)) continue;\n if (typeof value === \"object\") continue;\n parts.push(`${key}=${renderValue(value)}`);\n }\n\n return parts.join(\" \");\n}\n\nfunction renderValue(value: unknown): string {\n if (value === null || value === undefined) return \"-\";\n if (typeof value === \"string\") {\n const compact = value.replace(/\\s+/g, \" \").trim();\n return compact.length > 90 ? `${compact.slice(0, 87)}...` : compact;\n }\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n return \"[object]\";\n}\n\nfunction inferApiBaseFromConfig(configPath?: string): string {\n const envHost = process.env.PAPERCLIP_SERVER_HOST?.trim() || \"localhost\";\n let port = Number(process.env.PAPERCLIP_SERVER_PORT || \"\");\n\n if (!Number.isFinite(port) || port <= 0) {\n try {\n const config = readConfig(configPath);\n port = Number(config?.server?.port ?? 3100);\n } catch {\n port = 3100;\n }\n }\n\n if (!Number.isFinite(port) || port <= 0) {\n port = 3100;\n }\n\n return `http://${envHost}:${port}`;\n}\n\nfunction readKeyFromProfileEnv(profile: ClientContextProfile): string | undefined {\n if (!profile.apiKeyEnvVarName) return undefined;\n return process.env[profile.apiKeyEnvVarName]?.trim() || undefined;\n}\n\nexport function handleCommandError(error: unknown): never {\n if (error instanceof ApiRequestError) {\n const detailSuffix = error.details !== undefined ? ` details=${JSON.stringify(error.details)}` : \"\";\n console.error(pc.red(`API error ${error.status}: ${error.message}${detailSuffix}`));\n process.exit(1);\n }\n\n const message = error instanceof Error ? error.message : String(error);\n console.error(pc.red(message));\n process.exit(1);\n}\n", "import { spawn } from \"node:child_process\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport pc from \"picocolors\";\nimport { buildCliCommandLabel } from \"./command-label.js\";\nimport { resolveDefaultCliAuthPath } from \"../config/home.js\";\n\ntype RequestedAccess = \"board\" | \"instance_admin_required\";\n\ninterface BoardAuthCredential {\n apiBase: string;\n token: string;\n createdAt: string;\n updatedAt: string;\n userId?: string | null;\n}\n\ninterface BoardAuthStore {\n version: 1;\n credentials: Record<string, BoardAuthCredential>;\n}\n\ninterface CreateChallengeResponse {\n id: string;\n token: string;\n boardApiToken: string;\n approvalPath: string;\n approvalUrl: string | null;\n pollPath: string;\n expiresAt: string;\n suggestedPollIntervalMs: number;\n}\n\ninterface ChallengeStatusResponse {\n id: string;\n status: \"pending\" | \"approved\" | \"cancelled\" | \"expired\";\n command: string;\n clientName: string | null;\n requestedAccess: RequestedAccess;\n requestedCompanyId: string | null;\n requestedCompanyName: string | null;\n approvedAt: string | null;\n cancelledAt: string | null;\n expiresAt: string;\n approvedByUser: { id: string; name: string; email: string } | null;\n}\n\nfunction defaultBoardAuthStore(): BoardAuthStore {\n return {\n version: 1,\n credentials: {},\n };\n}\n\nfunction toStringOrNull(value: unknown): string | null {\n return typeof value === \"string\" && value.trim().length > 0 ? value.trim() : null;\n}\n\nfunction normalizeApiBase(apiBase: string): string {\n return apiBase.trim().replace(/\\/+$/, \"\");\n}\n\nexport function resolveBoardAuthStorePath(overridePath?: string): string {\n if (overridePath?.trim()) return path.resolve(overridePath.trim());\n if (process.env.PAPERCLIP_AUTH_STORE?.trim()) return path.resolve(process.env.PAPERCLIP_AUTH_STORE.trim());\n return resolveDefaultCliAuthPath();\n}\n\nexport function readBoardAuthStore(storePath?: string): BoardAuthStore {\n const filePath = resolveBoardAuthStorePath(storePath);\n if (!fs.existsSync(filePath)) return defaultBoardAuthStore();\n\n const raw = JSON.parse(fs.readFileSync(filePath, \"utf8\")) as Partial<BoardAuthStore> | null;\n const credentials = raw?.credentials && typeof raw.credentials === \"object\" ? raw.credentials : {};\n const normalized: Record<string, BoardAuthCredential> = {};\n\n for (const [key, value] of Object.entries(credentials)) {\n if (typeof value !== \"object\" || value === null) continue;\n const record = value as unknown as Record<string, unknown>;\n const apiBase = toStringOrNull(record.apiBase);\n const token = toStringOrNull(record.token);\n const createdAt = toStringOrNull(record.createdAt);\n const updatedAt = toStringOrNull(record.updatedAt);\n if (!apiBase || !token || !createdAt || !updatedAt) continue;\n normalized[normalizeApiBase(key)] = {\n apiBase,\n token,\n createdAt,\n updatedAt,\n userId: toStringOrNull(record.userId),\n };\n }\n\n return {\n version: 1,\n credentials: normalized,\n };\n}\n\nexport function writeBoardAuthStore(store: BoardAuthStore, storePath?: string): void {\n const filePath = resolveBoardAuthStorePath(storePath);\n fs.mkdirSync(path.dirname(filePath), { recursive: true });\n fs.writeFileSync(filePath, `${JSON.stringify(store, null, 2)}\\n`, { mode: 0o600 });\n}\n\nexport function getStoredBoardCredential(apiBase: string, storePath?: string): BoardAuthCredential | null {\n const store = readBoardAuthStore(storePath);\n return store.credentials[normalizeApiBase(apiBase)] ?? null;\n}\n\nexport function setStoredBoardCredential(input: {\n apiBase: string;\n token: string;\n userId?: string | null;\n storePath?: string;\n}): BoardAuthCredential {\n const normalizedApiBase = normalizeApiBase(input.apiBase);\n const store = readBoardAuthStore(input.storePath);\n const now = new Date().toISOString();\n const existing = store.credentials[normalizedApiBase];\n const credential: BoardAuthCredential = {\n apiBase: normalizedApiBase,\n token: input.token.trim(),\n createdAt: existing?.createdAt ?? now,\n updatedAt: now,\n userId: input.userId ?? existing?.userId ?? null,\n };\n store.credentials[normalizedApiBase] = credential;\n writeBoardAuthStore(store, input.storePath);\n return credential;\n}\n\nexport function removeStoredBoardCredential(apiBase: string, storePath?: string): boolean {\n const normalizedApiBase = normalizeApiBase(apiBase);\n const store = readBoardAuthStore(storePath);\n if (!store.credentials[normalizedApiBase]) return false;\n delete store.credentials[normalizedApiBase];\n writeBoardAuthStore(store, storePath);\n return true;\n}\n\nfunction sleep(ms: number) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nasync function requestJson<T>(url: string, init?: RequestInit): Promise<T> {\n const headers = new Headers(init?.headers ?? undefined);\n if (init?.body !== undefined && !headers.has(\"content-type\")) {\n headers.set(\"content-type\", \"application/json\");\n }\n if (!headers.has(\"accept\")) {\n headers.set(\"accept\", \"application/json\");\n }\n\n const response = await fetch(url, {\n ...init,\n headers,\n });\n\n if (!response.ok) {\n const body = await response.json().catch(() => null);\n const message =\n body && typeof body === \"object\" && typeof (body as { error?: unknown }).error === \"string\"\n ? (body as { error: string }).error\n : `Request failed: ${response.status}`;\n throw new Error(message);\n }\n\n return response.json() as Promise<T>;\n}\n\nexport function openUrl(url: string): boolean {\n const platform = process.platform;\n try {\n if (platform === \"darwin\") {\n const child = spawn(\"open\", [url], { detached: true, stdio: \"ignore\" });\n child.unref();\n return true;\n }\n if (platform === \"win32\") {\n const child = spawn(\"cmd\", [\"/c\", \"start\", \"\", url], { detached: true, stdio: \"ignore\" });\n child.unref();\n return true;\n }\n const child = spawn(\"xdg-open\", [url], { detached: true, stdio: \"ignore\" });\n child.unref();\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function loginBoardCli(params: {\n apiBase: string;\n requestedAccess: RequestedAccess;\n requestedCompanyId?: string | null;\n clientName?: string | null;\n command?: string;\n storePath?: string;\n print?: boolean;\n}): Promise<{ token: string; approvalUrl: string; userId?: string | null }> {\n const apiBase = normalizeApiBase(params.apiBase);\n const createUrl = `${apiBase}/api/cli-auth/challenges`;\n const command = params.command?.trim() || buildCliCommandLabel();\n\n const challenge = await requestJson<CreateChallengeResponse>(createUrl, {\n method: \"POST\",\n body: JSON.stringify({\n command,\n clientName: params.clientName?.trim() || \"relaycontrol cli\",\n requestedAccess: params.requestedAccess,\n requestedCompanyId: params.requestedCompanyId?.trim() || null,\n }),\n });\n\n const approvalUrl = challenge.approvalUrl ?? `${apiBase}${challenge.approvalPath}`;\n if (params.print !== false) {\n console.error(pc.bold(\"Board authentication required\"));\n console.error(`Open this URL in your browser to approve CLI access:\\n${approvalUrl}`);\n }\n\n const opened = openUrl(approvalUrl);\n if (params.print !== false && opened) {\n console.error(pc.dim(\"Opened the approval page in your browser.\"));\n }\n\n const expiresAtMs = Date.parse(challenge.expiresAt);\n const pollMs = Math.max(500, challenge.suggestedPollIntervalMs || 1000);\n\n while (Number.isFinite(expiresAtMs) ? Date.now() < expiresAtMs : true) {\n const status = await requestJson<ChallengeStatusResponse>(\n `${apiBase}/api${challenge.pollPath}?token=${encodeURIComponent(challenge.token)}`,\n );\n\n if (status.status === \"approved\") {\n const me = await requestJson<{ userId: string; user?: { id: string } | null }>(\n `${apiBase}/api/cli-auth/me`,\n {\n headers: {\n authorization: `Bearer ${challenge.boardApiToken}`,\n },\n },\n );\n setStoredBoardCredential({\n apiBase,\n token: challenge.boardApiToken,\n userId: me.userId ?? me.user?.id ?? null,\n storePath: params.storePath,\n });\n return {\n token: challenge.boardApiToken,\n approvalUrl,\n userId: me.userId ?? me.user?.id ?? null,\n };\n }\n\n if (status.status === \"cancelled\") {\n throw new Error(\"CLI auth challenge was cancelled.\");\n }\n if (status.status === \"expired\") {\n throw new Error(\"CLI auth challenge expired before approval.\");\n }\n\n await sleep(pollMs);\n }\n\n throw new Error(\"CLI auth challenge expired before approval.\");\n}\n\nexport async function revokeStoredBoardCredential(params: {\n apiBase: string;\n token: string;\n}): Promise<void> {\n const apiBase = normalizeApiBase(params.apiBase);\n await requestJson<{ revoked: boolean }>(`${apiBase}/api/cli-auth/revoke-current`, {\n method: \"POST\",\n headers: {\n authorization: `Bearer ${params.token}`,\n },\n body: JSON.stringify({}),\n });\n}\n", "export function buildCliCommandLabel(): string {\n const args = process.argv.slice(2);\n return args.length > 0 ? `relaycontrol ${args.join(\" \")}` : \"relaycontrol\";\n}\n", "import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { resolveDefaultContextPath } from \"../config/home.js\";\n\nconst DEFAULT_CONTEXT_BASENAME = \"context.json\";\nconst DEFAULT_PROFILE = \"default\";\n\nexport interface ClientContextProfile {\n apiBase?: string;\n companyId?: string;\n apiKeyEnvVarName?: string;\n}\n\nexport interface ClientContext {\n version: 1;\n currentProfile: string;\n profiles: Record<string, ClientContextProfile>;\n}\n\nfunction findContextFileFromAncestors(startDir: string): string | null {\n const absoluteStartDir = path.resolve(startDir);\n let currentDir = absoluteStartDir;\n\n while (true) {\n const candidate = path.resolve(currentDir, \".paperclip\", DEFAULT_CONTEXT_BASENAME);\n if (fs.existsSync(candidate)) {\n return candidate;\n }\n\n const nextDir = path.resolve(currentDir, \"..\");\n if (nextDir === currentDir) break;\n currentDir = nextDir;\n }\n\n return null;\n}\n\nexport function resolveContextPath(overridePath?: string): string {\n if (overridePath) return path.resolve(overridePath);\n if (process.env.PAPERCLIP_CONTEXT) return path.resolve(process.env.PAPERCLIP_CONTEXT);\n return findContextFileFromAncestors(process.cwd()) ?? resolveDefaultContextPath();\n}\n\nexport function defaultClientContext(): ClientContext {\n return {\n version: 1,\n currentProfile: DEFAULT_PROFILE,\n profiles: {\n [DEFAULT_PROFILE]: {},\n },\n };\n}\n\nfunction parseJson(filePath: string): unknown {\n try {\n return JSON.parse(fs.readFileSync(filePath, \"utf-8\"));\n } catch (err) {\n throw new Error(`Failed to parse JSON at ${filePath}: ${err instanceof Error ? err.message : String(err)}`);\n }\n}\n\nfunction toStringOrUndefined(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim().length > 0 ? value.trim() : undefined;\n}\n\nfunction normalizeProfile(value: unknown): ClientContextProfile {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return {};\n const profile = value as Record<string, unknown>;\n\n return {\n apiBase: toStringOrUndefined(profile.apiBase),\n companyId: toStringOrUndefined(profile.companyId),\n apiKeyEnvVarName: toStringOrUndefined(profile.apiKeyEnvVarName),\n };\n}\n\nfunction normalizeContext(raw: unknown): ClientContext {\n if (typeof raw !== \"object\" || raw === null || Array.isArray(raw)) {\n return defaultClientContext();\n }\n\n const record = raw as Record<string, unknown>;\n const version = record.version === 1 ? 1 : 1;\n const currentProfile = toStringOrUndefined(record.currentProfile) ?? DEFAULT_PROFILE;\n\n const rawProfiles = record.profiles;\n const profiles: Record<string, ClientContextProfile> = {};\n\n if (typeof rawProfiles === \"object\" && rawProfiles !== null && !Array.isArray(rawProfiles)) {\n for (const [name, profile] of Object.entries(rawProfiles as Record<string, unknown>)) {\n if (!name.trim()) continue;\n profiles[name] = normalizeProfile(profile);\n }\n }\n\n if (!profiles[currentProfile]) {\n profiles[currentProfile] = {};\n }\n\n if (Object.keys(profiles).length === 0) {\n profiles[DEFAULT_PROFILE] = {};\n }\n\n return {\n version,\n currentProfile,\n profiles,\n };\n}\n\nexport function readContext(contextPath?: string): ClientContext {\n const filePath = resolveContextPath(contextPath);\n if (!fs.existsSync(filePath)) {\n return defaultClientContext();\n }\n\n const raw = parseJson(filePath);\n return normalizeContext(raw);\n}\n\nexport function writeContext(context: ClientContext, contextPath?: string): void {\n const filePath = resolveContextPath(contextPath);\n const dir = path.dirname(filePath);\n fs.mkdirSync(dir, { recursive: true });\n\n const normalized = normalizeContext(context);\n fs.writeFileSync(filePath, `${JSON.stringify(normalized, null, 2)}\\n`, { mode: 0o600 });\n}\n\nexport function upsertProfile(\n profileName: string,\n patch: Partial<ClientContextProfile>,\n contextPath?: string,\n): ClientContext {\n const context = readContext(contextPath);\n const existing = context.profiles[profileName] ?? {};\n const merged: ClientContextProfile = {\n ...existing,\n ...patch,\n };\n\n if (patch.apiBase !== undefined && patch.apiBase.trim().length === 0) {\n delete merged.apiBase;\n }\n if (patch.companyId !== undefined && patch.companyId.trim().length === 0) {\n delete merged.companyId;\n }\n if (patch.apiKeyEnvVarName !== undefined && patch.apiKeyEnvVarName.trim().length === 0) {\n delete merged.apiKeyEnvVarName;\n }\n\n context.profiles[profileName] = merged;\n context.currentProfile = context.currentProfile || profileName;\n writeContext(context, contextPath);\n return context;\n}\n\nexport function setCurrentProfile(profileName: string, contextPath?: string): ClientContext {\n const context = readContext(contextPath);\n if (!context.profiles[profileName]) {\n context.profiles[profileName] = {};\n }\n context.currentProfile = profileName;\n writeContext(context, contextPath);\n return context;\n}\n\nexport function resolveProfile(\n context: ClientContext,\n profileName?: string,\n): { name: string; profile: ClientContextProfile } {\n const name = profileName?.trim() || context.currentProfile || DEFAULT_PROFILE;\n const profile = context.profiles[name] ?? {};\n return { name, profile };\n}\n", "import { URL } from \"node:url\";\n\nexport class ApiRequestError extends Error {\n status: number;\n details?: unknown;\n body?: unknown;\n\n constructor(status: number, message: string, details?: unknown, body?: unknown) {\n super(message);\n this.status = status;\n this.details = details;\n this.body = body;\n }\n}\n\nexport class ApiConnectionError extends Error {\n url: string;\n method: string;\n causeMessage?: string;\n\n constructor(input: {\n apiBase: string;\n path: string;\n method: string;\n cause?: unknown;\n }) {\n const url = buildUrl(input.apiBase, input.path);\n const causeMessage = formatConnectionCause(input.cause);\n super(buildConnectionErrorMessage({ apiBase: input.apiBase, url, method: input.method, causeMessage }));\n this.url = url;\n this.method = input.method;\n this.causeMessage = causeMessage;\n }\n}\n\ninterface RequestOptions {\n ignoreNotFound?: boolean;\n}\n\ninterface RecoverAuthInput {\n path: string;\n method: string;\n error: ApiRequestError;\n}\n\ninterface ApiClientOptions {\n apiBase: string;\n apiKey?: string;\n runId?: string;\n recoverAuth?: (input: RecoverAuthInput) => Promise<string | null>;\n}\n\nexport class PaperclipApiClient {\n readonly apiBase: string;\n apiKey?: string;\n readonly runId?: string;\n readonly recoverAuth?: (input: RecoverAuthInput) => Promise<string | null>;\n\n constructor(opts: ApiClientOptions) {\n this.apiBase = opts.apiBase.replace(/\\/+$/, \"\");\n this.apiKey = opts.apiKey?.trim() || undefined;\n this.runId = opts.runId?.trim() || undefined;\n this.recoverAuth = opts.recoverAuth;\n }\n\n get<T>(path: string, opts?: RequestOptions): Promise<T | null> {\n return this.request<T>(path, { method: \"GET\" }, opts);\n }\n\n post<T>(path: string, body?: unknown, opts?: RequestOptions): Promise<T | null> {\n return this.request<T>(path, {\n method: \"POST\",\n body: body === undefined ? undefined : JSON.stringify(body),\n }, opts);\n }\n\n patch<T>(path: string, body?: unknown, opts?: RequestOptions): Promise<T | null> {\n return this.request<T>(path, {\n method: \"PATCH\",\n body: body === undefined ? undefined : JSON.stringify(body),\n }, opts);\n }\n\n delete<T>(path: string, opts?: RequestOptions): Promise<T | null> {\n return this.request<T>(path, { method: \"DELETE\" }, opts);\n }\n\n setApiKey(apiKey: string | undefined) {\n this.apiKey = apiKey?.trim() || undefined;\n }\n\n private async request<T>(\n path: string,\n init: RequestInit,\n opts?: RequestOptions,\n hasRetriedAuth = false,\n ): Promise<T | null> {\n const url = buildUrl(this.apiBase, path);\n const method = String(init.method ?? \"GET\").toUpperCase();\n\n const headers: Record<string, string> = {\n accept: \"application/json\",\n ...toStringRecord(init.headers),\n };\n\n if (init.body !== undefined) {\n headers[\"content-type\"] = headers[\"content-type\"] ?? \"application/json\";\n }\n\n if (this.apiKey) {\n headers.authorization = `Bearer ${this.apiKey}`;\n }\n\n if (this.runId) {\n headers[\"x-paperclip-run-id\"] = this.runId;\n }\n\n let response: Response;\n try {\n response = await fetch(url, {\n ...init,\n headers,\n });\n } catch (error) {\n throw new ApiConnectionError({\n apiBase: this.apiBase,\n path,\n method,\n cause: error,\n });\n }\n\n if (opts?.ignoreNotFound && response.status === 404) {\n return null;\n }\n\n if (!response.ok) {\n const apiError = await toApiError(response);\n if (!hasRetriedAuth && this.recoverAuth) {\n const recoveredToken = await this.recoverAuth({\n path,\n method,\n error: apiError,\n });\n if (recoveredToken) {\n this.setApiKey(recoveredToken);\n return this.request<T>(path, init, opts, true);\n }\n }\n throw apiError;\n }\n\n if (response.status === 204) {\n return null;\n }\n\n const text = await response.text();\n if (!text.trim()) {\n return null;\n }\n\n return safeParseJson(text) as T;\n }\n}\n\nfunction buildUrl(apiBase: string, path: string): string {\n const normalizedPath = path.startsWith(\"/\") ? path : `/${path}`;\n const [pathname, query] = normalizedPath.split(\"?\");\n const url = new URL(apiBase);\n url.pathname = `${url.pathname.replace(/\\/+$/, \"\")}${pathname}`;\n if (query) url.search = query;\n return url.toString();\n}\n\nfunction safeParseJson(text: string): unknown {\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n}\n\nasync function toApiError(response: Response): Promise<ApiRequestError> {\n const text = await response.text();\n const parsed = safeParseJson(text);\n\n if (typeof parsed === \"object\" && parsed !== null && !Array.isArray(parsed)) {\n const body = parsed as Record<string, unknown>;\n const message =\n (typeof body.error === \"string\" && body.error.trim()) ||\n (typeof body.message === \"string\" && body.message.trim()) ||\n `Request failed with status ${response.status}`;\n\n return new ApiRequestError(response.status, message, body.details, parsed);\n }\n\n return new ApiRequestError(response.status, `Request failed with status ${response.status}`, undefined, parsed);\n}\n\nfunction buildConnectionErrorMessage(input: {\n apiBase: string;\n url: string;\n method: string;\n causeMessage?: string;\n}): string {\n const healthUrl = buildHealthCheckUrl(input.url);\n const lines = [\n \"Could not reach the Relay Control API.\",\n \"\",\n `Request: ${input.method} ${input.url}`,\n ];\n if (input.causeMessage) {\n lines.push(`Cause: ${input.causeMessage}`);\n }\n lines.push(\n \"\",\n \"This usually means the Relay Control server is not running, the configured URL is wrong, or the request is being blocked before it reaches Relay Control.\",\n \"\",\n \"Try:\",\n \"- Start Relay Control with `pnpm dev` or `pnpm relaycontrol run`.\",\n `- Verify the server is reachable with \\`curl ${healthUrl}\\`.`,\n `- If Relay Control is running elsewhere, pass \\`--api-base ${input.apiBase.replace(/\\/+$/, \"\")}\\` or set \\`PAPERCLIP_API_URL\\`.`,\n );\n return lines.join(\"\\n\");\n}\n\nfunction buildHealthCheckUrl(requestUrl: string): string {\n const url = new URL(requestUrl);\n url.pathname = `${url.pathname.replace(/\\/+$/, \"\").replace(/\\/api(?:\\/.*)?$/, \"\")}/api/health`;\n url.search = \"\";\n url.hash = \"\";\n return url.toString();\n}\n\nfunction formatConnectionCause(error: unknown): string | undefined {\n if (!error) return undefined;\n if (error instanceof Error) {\n return error.message.trim() || error.name;\n }\n const message = String(error).trim();\n return message || undefined;\n}\n\nfunction toStringRecord(headers: HeadersInit | undefined): Record<string, string> {\n if (!headers) return {};\n if (Array.isArray(headers)) {\n return Object.fromEntries(headers.map(([key, value]) => [key, String(value)]));\n }\n if (headers instanceof Headers) {\n return Object.fromEntries(headers.entries());\n }\n return Object.fromEntries(\n Object.entries(headers).map(([key, value]) => [key, String(value)]),\n );\n}\n", "import path from \"node:path\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { formatDatabaseBackupResult, runDatabaseBackup } from \"@paperclipai/db\";\nimport {\n expandHomePrefix,\n resolveDefaultBackupDir,\n resolvePaperclipInstanceId,\n} from \"../config/home.js\";\nimport { readConfig, resolveConfigPath } from \"../config/store.js\";\nimport { printPaperclipCliBanner } from \"../utils/banner.js\";\n\ntype DbBackupOptions = {\n config?: string;\n dir?: string;\n retentionDays?: number;\n filenamePrefix?: string;\n json?: boolean;\n};\n\nfunction resolveConnectionString(configPath?: string): { value: string; source: string } {\n const envUrl = process.env.DATABASE_URL?.trim();\n if (envUrl) return { value: envUrl, source: \"DATABASE_URL\" };\n\n const config = readConfig(configPath);\n if (config?.database.mode === \"postgres\" && config.database.connectionString?.trim()) {\n return { value: config.database.connectionString.trim(), source: \"config.database.connectionString\" };\n }\n\n const port = config?.database.embeddedPostgresPort ?? 54329;\n return {\n value: `postgres://paperclip:paperclip@127.0.0.1:${port}/paperclip`,\n source: `embedded-postgres@${port}`,\n };\n}\n\nfunction normalizeRetentionDays(value: number | undefined, fallback: number): number {\n const candidate = value ?? fallback;\n if (!Number.isInteger(candidate) || candidate < 1) {\n throw new Error(`Invalid retention days '${String(candidate)}'. Use a positive integer.`);\n }\n return candidate;\n}\n\nfunction resolveBackupDir(raw: string): string {\n return path.resolve(expandHomePrefix(raw.trim()));\n}\n\nexport async function dbBackupCommand(opts: DbBackupOptions): Promise<void> {\n printPaperclipCliBanner();\n p.intro(pc.bgCyan(pc.black(\" paperclip db:backup \")));\n\n const configPath = resolveConfigPath(opts.config);\n const config = readConfig(opts.config);\n const connection = resolveConnectionString(opts.config);\n const defaultDir = resolveDefaultBackupDir(resolvePaperclipInstanceId());\n const configuredDir = opts.dir?.trim() || config?.database.backup.dir || defaultDir;\n const backupDir = resolveBackupDir(configuredDir);\n const retentionDays = normalizeRetentionDays(\n opts.retentionDays,\n config?.database.backup.retentionDays ?? 30,\n );\n const filenamePrefix = opts.filenamePrefix?.trim() || \"paperclip\";\n\n p.log.message(pc.dim(`Config: ${configPath}`));\n p.log.message(pc.dim(`Connection source: ${connection.source}`));\n p.log.message(pc.dim(`Backup dir: ${backupDir}`));\n p.log.message(pc.dim(`Retention: ${retentionDays} day(s)`));\n\n const spinner = p.spinner();\n spinner.start(\"Creating database backup...\");\n try {\n const result = await runDatabaseBackup({\n connectionString: connection.value,\n backupDir,\n retentionDays,\n filenamePrefix,\n });\n spinner.stop(`Backup saved: ${formatDatabaseBackupResult(result)}`);\n\n if (opts.json) {\n console.log(\n JSON.stringify(\n {\n backupFile: result.backupFile,\n sizeBytes: result.sizeBytes,\n prunedCount: result.prunedCount,\n backupDir,\n retentionDays,\n connectionSource: connection.source,\n },\n null,\n 2,\n ),\n );\n }\n p.outro(pc.green(\"Backup completed.\"));\n } catch (err) {\n spinner.stop(pc.red(\"Backup failed.\"));\n throw err;\n }\n}\n", "import { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport {\n readContext,\n resolveContextPath,\n resolveProfile,\n setCurrentProfile,\n upsertProfile,\n} from \"../../client/context.js\";\nimport { printOutput } from \"./common.js\";\n\ninterface ContextOptions {\n dataDir?: string;\n context?: string;\n profile?: string;\n json?: boolean;\n}\n\ninterface ContextSetOptions extends ContextOptions {\n apiBase?: string;\n companyId?: string;\n apiKeyEnvVarName?: string;\n use?: boolean;\n}\n\nexport function registerContextCommands(program: Command): void {\n const context = program.command(\"context\").description(\"Manage CLI client context profiles\");\n\n context\n .command(\"show\")\n .description(\"Show current context and active profile\")\n .option(\"-d, --data-dir <path>\", \"Relay Control data directory root (isolates state from ~/.relaycontrol)\")\n .option(\"--context <path>\", \"Path to CLI context file\")\n .option(\"--profile <name>\", \"Profile to inspect\")\n .option(\"--json\", \"Output raw JSON\")\n .action((opts: ContextOptions) => {\n const contextPath = resolveContextPath(opts.context);\n const store = readContext(opts.context);\n const resolved = resolveProfile(store, opts.profile);\n const payload = {\n contextPath,\n currentProfile: store.currentProfile,\n profileName: resolved.name,\n profile: resolved.profile,\n profiles: store.profiles,\n };\n printOutput(payload, { json: opts.json });\n });\n\n context\n .command(\"list\")\n .description(\"List available context profiles\")\n .option(\"-d, --data-dir <path>\", \"Relay Control data directory root (isolates state from ~/.relaycontrol)\")\n .option(\"--context <path>\", \"Path to CLI context file\")\n .option(\"--json\", \"Output raw JSON\")\n .action((opts: ContextOptions) => {\n const store = readContext(opts.context);\n const rows = Object.entries(store.profiles).map(([name, profile]) => ({\n name,\n current: name === store.currentProfile,\n apiBase: profile.apiBase ?? null,\n companyId: profile.companyId ?? null,\n apiKeyEnvVarName: profile.apiKeyEnvVarName ?? null,\n }));\n printOutput(rows, { json: opts.json });\n });\n\n context\n .command(\"use\")\n .description(\"Set active context profile\")\n .argument(\"<profile>\", \"Profile name\")\n .option(\"-d, --data-dir <path>\", \"Relay Control data directory root (isolates state from ~/.relaycontrol)\")\n .option(\"--context <path>\", \"Path to CLI context file\")\n .action((profile: string, opts: ContextOptions) => {\n setCurrentProfile(profile, opts.context);\n console.log(pc.green(`Active profile set to '${profile}'.`));\n });\n\n context\n .command(\"set\")\n .description(\"Set values on a profile\")\n .option(\"-d, --data-dir <path>\", \"Relay Control data directory root (isolates state from ~/.relaycontrol)\")\n .option(\"--context <path>\", \"Path to CLI context file\")\n .option(\"--profile <name>\", \"Profile name (default: current profile)\")\n .option(\"--api-base <url>\", \"Default API base URL\")\n .option(\"--company-id <id>\", \"Default company ID\")\n .option(\"--api-key-env-var-name <name>\", \"Env var containing API key (recommended)\")\n .option(\"--use\", \"Set this profile as active\")\n .option(\"--json\", \"Output raw JSON\")\n .action((opts: ContextSetOptions) => {\n const existing = readContext(opts.context);\n const targetProfile = opts.profile?.trim() || existing.currentProfile || \"default\";\n\n upsertProfile(\n targetProfile,\n {\n apiBase: opts.apiBase,\n companyId: opts.companyId,\n apiKeyEnvVarName: opts.apiKeyEnvVarName,\n },\n opts.context,\n );\n\n if (opts.use) {\n setCurrentProfile(targetProfile, opts.context);\n }\n\n const updated = readContext(opts.context);\n const resolved = resolveProfile(updated, targetProfile);\n const payload = {\n contextPath: resolveContextPath(opts.context),\n currentProfile: updated.currentProfile,\n profileName: resolved.name,\n profile: resolved.profile,\n };\n\n if (!opts.json) {\n console.log(pc.green(`Updated profile '${targetProfile}'.`));\n if (opts.use) {\n console.log(pc.green(`Set '${targetProfile}' as active profile.`));\n }\n }\n printOutput(payload, { json: opts.json });\n });\n}\n", "import { Command } from \"commander\";\nimport { mkdir, readdir, readFile, stat, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport type {\n Company,\n FeedbackTrace,\n CompanyPortabilityFileEntry,\n CompanyPortabilityExportResult,\n CompanyPortabilityInclude,\n CompanyPortabilityPreviewResult,\n CompanyPortabilityImportResult,\n} from \"@paperclipai/shared\";\nimport { getTelemetryClient, trackCompanyImported } from \"../../telemetry.js\";\nimport { ApiRequestError } from \"../../client/http.js\";\nimport { openUrl } from \"../../client/board-auth.js\";\nimport { binaryContentTypeByExtension, readZipArchive } from \"./zip.js\";\nimport {\n addCommonClientOptions,\n formatInlineRecord,\n handleCommandError,\n printOutput,\n resolveCommandContext,\n type BaseClientOptions,\n} from \"./common.js\";\nimport {\n buildFeedbackTraceQuery,\n normalizeFeedbackTraceExportFormat,\n serializeFeedbackTraces,\n} from \"./feedback.js\";\n\ninterface CompanyCommandOptions extends BaseClientOptions {}\ntype CompanyDeleteSelectorMode = \"auto\" | \"id\" | \"prefix\";\ntype CompanyImportTargetMode = \"new\" | \"existing\";\ntype CompanyCollisionMode = \"rename\" | \"skip\" | \"replace\";\n\ninterface CompanyDeleteOptions extends BaseClientOptions {\n by?: CompanyDeleteSelectorMode;\n yes?: boolean;\n confirm?: string;\n}\n\ninterface CompanyExportOptions extends BaseClientOptions {\n out?: string;\n include?: string;\n skills?: string;\n projects?: string;\n issues?: string;\n projectIssues?: string;\n expandReferencedSkills?: boolean;\n}\n\ninterface CompanyFeedbackOptions extends BaseClientOptions {\n targetType?: string;\n vote?: string;\n status?: string;\n projectId?: string;\n issueId?: string;\n from?: string;\n to?: string;\n sharedOnly?: boolean;\n includePayload?: boolean;\n out?: string;\n format?: string;\n}\n\ninterface CompanyImportOptions extends BaseClientOptions {\n include?: string;\n target?: CompanyImportTargetMode;\n companyId?: string;\n newCompanyName?: string;\n agents?: string;\n collision?: CompanyCollisionMode;\n ref?: string;\n paperclipUrl?: string;\n yes?: boolean;\n dryRun?: boolean;\n}\n\nconst DEFAULT_EXPORT_INCLUDE: CompanyPortabilityInclude = {\n company: true,\n agents: true,\n projects: false,\n issues: false,\n skills: false,\n};\n\nconst DEFAULT_IMPORT_INCLUDE: CompanyPortabilityInclude = {\n company: true,\n agents: true,\n projects: true,\n issues: true,\n skills: true,\n};\n\nconst IMPORT_INCLUDE_OPTIONS: Array<{\n value: keyof CompanyPortabilityInclude;\n label: string;\n hint: string;\n}> = [\n { value: \"company\", label: \"Company\", hint: \"name, branding, and company settings\" },\n { value: \"projects\", label: \"Projects\", hint: \"projects and workspace metadata\" },\n { value: \"issues\", label: \"Tasks\", hint: \"tasks and recurring routines\" },\n { value: \"agents\", label: \"Agents\", hint: \"agent records and org structure\" },\n { value: \"skills\", label: \"Skills\", hint: \"company skill packages and references\" },\n];\n\nconst IMPORT_PREVIEW_SAMPLE_LIMIT = 6;\n\ntype ImportSelectableGroup = \"projects\" | \"issues\" | \"agents\" | \"skills\";\n\ntype ImportSelectionCatalog = {\n company: {\n includedByDefault: boolean;\n files: string[];\n };\n projects: Array<{ key: string; label: string; hint?: string; files: string[] }>;\n issues: Array<{ key: string; label: string; hint?: string; files: string[] }>;\n agents: Array<{ key: string; label: string; hint?: string; files: string[] }>;\n skills: Array<{ key: string; label: string; hint?: string; files: string[] }>;\n extensionPath: string | null;\n};\n\ntype ImportSelectionState = {\n company: boolean;\n projects: Set<string>;\n issues: Set<string>;\n agents: Set<string>;\n skills: Set<string>;\n};\n\nfunction readPortableFileEntry(filePath: string, contents: Buffer): CompanyPortabilityFileEntry {\n const contentType = binaryContentTypeByExtension[path.extname(filePath).toLowerCase()];\n if (!contentType) return contents.toString(\"utf8\");\n return {\n encoding: \"base64\",\n data: contents.toString(\"base64\"),\n contentType,\n };\n}\n\nfunction portableFileEntryToWriteValue(entry: CompanyPortabilityFileEntry): string | Uint8Array {\n if (typeof entry === \"string\") return entry;\n return Buffer.from(entry.data, \"base64\");\n}\n\nfunction isUuidLike(value: string): boolean {\n return /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(value);\n}\n\nfunction normalizeSelector(input: string): string {\n return input.trim();\n}\n\nfunction parseInclude(\n input: string | undefined,\n fallback: CompanyPortabilityInclude = DEFAULT_EXPORT_INCLUDE,\n): CompanyPortabilityInclude {\n if (!input || !input.trim()) return { ...fallback };\n const values = input.split(\",\").map((part) => part.trim().toLowerCase()).filter(Boolean);\n const include = {\n company: values.includes(\"company\"),\n agents: values.includes(\"agents\"),\n projects: values.includes(\"projects\"),\n issues: values.includes(\"issues\") || values.includes(\"tasks\"),\n skills: values.includes(\"skills\"),\n };\n if (!include.company && !include.agents && !include.projects && !include.issues && !include.skills) {\n throw new Error(\"Invalid --include value. Use one or more of: company,agents,projects,issues,tasks,skills\");\n }\n return include;\n}\n\nfunction parseAgents(input: string | undefined): \"all\" | string[] {\n if (!input || !input.trim()) return \"all\";\n const normalized = input.trim().toLowerCase();\n if (normalized === \"all\") return \"all\";\n const values = input.split(\",\").map((part) => part.trim()).filter(Boolean);\n if (values.length === 0) return \"all\";\n return Array.from(new Set(values));\n}\n\nfunction parseCsvValues(input: string | undefined): string[] {\n if (!input || !input.trim()) return [];\n return Array.from(new Set(input.split(\",\").map((part) => part.trim()).filter(Boolean)));\n}\n\nfunction isInteractiveTerminal(): boolean {\n return Boolean(process.stdin.isTTY && process.stdout.isTTY);\n}\n\nfunction resolveImportInclude(input: string | undefined): CompanyPortabilityInclude {\n return parseInclude(input, DEFAULT_IMPORT_INCLUDE);\n}\n\nfunction normalizePortablePath(filePath: string): string {\n return filePath.replace(/\\\\/g, \"/\");\n}\n\nfunction shouldIncludePortableFile(filePath: string): boolean {\n const baseName = path.basename(filePath);\n const isMarkdown = baseName.endsWith(\".md\");\n const isPaperclipYaml = baseName === \".paperclip.yaml\" || baseName === \".paperclip.yml\";\n const contentType = binaryContentTypeByExtension[path.extname(baseName).toLowerCase()];\n return isMarkdown || isPaperclipYaml || Boolean(contentType);\n}\n\nfunction findPortableExtensionPath(files: Record<string, CompanyPortabilityFileEntry>): string | null {\n if (files[\".paperclip.yaml\"] !== undefined) return \".paperclip.yaml\";\n if (files[\".paperclip.yml\"] !== undefined) return \".paperclip.yml\";\n return Object.keys(files).find((entry) => entry.endsWith(\"/.paperclip.yaml\") || entry.endsWith(\"/.paperclip.yml\")) ?? null;\n}\n\nfunction collectFilesUnderDirectory(\n files: Record<string, CompanyPortabilityFileEntry>,\n directory: string,\n opts?: { excludePrefixes?: string[] },\n): string[] {\n const normalizedDirectory = normalizePortablePath(directory).replace(/\\/+$/, \"\");\n if (!normalizedDirectory) return [];\n const prefix = `${normalizedDirectory}/`;\n const excluded = (opts?.excludePrefixes ?? []).map((entry) => normalizePortablePath(entry).replace(/\\/+$/, \"\")).filter(Boolean);\n return Object.keys(files)\n .map(normalizePortablePath)\n .filter((filePath) => filePath.startsWith(prefix))\n .filter((filePath) => !excluded.some((excludePrefix) => filePath.startsWith(`${excludePrefix}/`)))\n .sort((left, right) => left.localeCompare(right));\n}\n\nfunction collectEntityFiles(\n files: Record<string, CompanyPortabilityFileEntry>,\n entryPath: string,\n opts?: { excludePrefixes?: string[] },\n): string[] {\n const normalizedPath = normalizePortablePath(entryPath);\n const directory = normalizedPath.includes(\"/\") ? normalizedPath.slice(0, normalizedPath.lastIndexOf(\"/\")) : \"\";\n const selected = new Set<string>([normalizedPath]);\n if (directory) {\n for (const filePath of collectFilesUnderDirectory(files, directory, opts)) {\n selected.add(filePath);\n }\n }\n return Array.from(selected).sort((left, right) => left.localeCompare(right));\n}\n\nexport function buildImportSelectionCatalog(preview: CompanyPortabilityPreviewResult): ImportSelectionCatalog {\n const selectedAgentSlugs = new Set(preview.selectedAgentSlugs);\n const companyFiles = new Set<string>();\n const companyPath = preview.manifest.company?.path ? normalizePortablePath(preview.manifest.company.path) : null;\n if (companyPath) {\n companyFiles.add(companyPath);\n }\n const readmePath = Object.keys(preview.files).find((entry) => normalizePortablePath(entry) === \"README.md\");\n if (readmePath) {\n companyFiles.add(normalizePortablePath(readmePath));\n }\n const logoPath = preview.manifest.company?.logoPath ? normalizePortablePath(preview.manifest.company.logoPath) : null;\n if (logoPath && preview.files[logoPath] !== undefined) {\n companyFiles.add(logoPath);\n }\n\n return {\n company: {\n includedByDefault: preview.include.company && preview.manifest.company !== null,\n files: Array.from(companyFiles).sort((left, right) => left.localeCompare(right)),\n },\n projects: preview.manifest.projects.map((project) => {\n const projectPath = normalizePortablePath(project.path);\n const projectDir = projectPath.includes(\"/\") ? projectPath.slice(0, projectPath.lastIndexOf(\"/\")) : \"\";\n return {\n key: project.slug,\n label: project.name,\n hint: project.slug,\n files: collectEntityFiles(preview.files, projectPath, {\n excludePrefixes: projectDir ? [`${projectDir}/issues`] : [],\n }),\n };\n }),\n issues: preview.manifest.issues.map((issue) => ({\n key: issue.slug,\n label: issue.title,\n hint: issue.identifier ?? issue.slug,\n files: collectEntityFiles(preview.files, normalizePortablePath(issue.path)),\n })),\n agents: preview.manifest.agents\n .filter((agent) => selectedAgentSlugs.size === 0 || selectedAgentSlugs.has(agent.slug))\n .map((agent) => ({\n key: agent.slug,\n label: agent.name,\n hint: agent.slug,\n files: collectEntityFiles(preview.files, normalizePortablePath(agent.path)),\n })),\n skills: preview.manifest.skills.map((skill) => ({\n key: skill.slug,\n label: skill.name,\n hint: skill.slug,\n files: collectEntityFiles(preview.files, normalizePortablePath(skill.path)),\n })),\n extensionPath: findPortableExtensionPath(preview.files),\n };\n}\n\nfunction toKeySet(items: Array<{ key: string }>): Set<string> {\n return new Set(items.map((item) => item.key));\n}\n\nexport function buildDefaultImportSelectionState(catalog: ImportSelectionCatalog): ImportSelectionState {\n return {\n company: catalog.company.includedByDefault,\n projects: toKeySet(catalog.projects),\n issues: toKeySet(catalog.issues),\n agents: toKeySet(catalog.agents),\n skills: toKeySet(catalog.skills),\n };\n}\n\nfunction countSelected(state: ImportSelectionState, group: ImportSelectableGroup): number {\n return state[group].size;\n}\n\nfunction countTotal(catalog: ImportSelectionCatalog, group: ImportSelectableGroup): number {\n return catalog[group].length;\n}\n\nfunction summarizeGroupSelection(catalog: ImportSelectionCatalog, state: ImportSelectionState, group: ImportSelectableGroup): string {\n return `${countSelected(state, group)}/${countTotal(catalog, group)} selected`;\n}\n\nfunction getGroupLabel(group: ImportSelectableGroup): string {\n switch (group) {\n case \"projects\":\n return \"Projects\";\n case \"issues\":\n return \"Tasks\";\n case \"agents\":\n return \"Agents\";\n case \"skills\":\n return \"Skills\";\n }\n}\n\nexport function buildSelectedFilesFromImportSelection(\n catalog: ImportSelectionCatalog,\n state: ImportSelectionState,\n): string[] {\n const selected = new Set<string>();\n\n if (state.company) {\n for (const filePath of catalog.company.files) {\n selected.add(normalizePortablePath(filePath));\n }\n }\n\n for (const group of [\"projects\", \"issues\", \"agents\", \"skills\"] as const) {\n const selectedKeys = state[group];\n for (const item of catalog[group]) {\n if (!selectedKeys.has(item.key)) continue;\n for (const filePath of item.files) {\n selected.add(normalizePortablePath(filePath));\n }\n }\n }\n\n if (selected.size > 0 && catalog.extensionPath) {\n selected.add(normalizePortablePath(catalog.extensionPath));\n }\n\n return Array.from(selected).sort((left, right) => left.localeCompare(right));\n}\n\nexport function buildDefaultImportAdapterOverrides(\n preview: Pick<CompanyPortabilityPreviewResult, \"manifest\" | \"selectedAgentSlugs\">,\n): Record<string, { adapterType: string }> | undefined {\n const selectedAgentSlugs = new Set(preview.selectedAgentSlugs);\n const overrides = Object.fromEntries(\n preview.manifest.agents\n .filter((agent) => selectedAgentSlugs.size === 0 || selectedAgentSlugs.has(agent.slug))\n .filter((agent) => agent.adapterType === \"process\")\n .map((agent) => [\n agent.slug,\n {\n // TODO: replace this temporary claude_local fallback with adapter selection in the import TUI.\n adapterType: \"claude_local\",\n },\n ]),\n );\n return Object.keys(overrides).length > 0 ? overrides : undefined;\n}\n\nfunction buildDefaultImportAdapterMessages(\n overrides: Record<string, { adapterType: string }> | undefined,\n): string[] {\n if (!overrides) return [];\n const adapterTypes = Array.from(new Set(Object.values(overrides).map((override) => override.adapterType)))\n .map((adapterType) => adapterType.replace(/_/g, \"-\"));\n const agentCount = Object.keys(overrides).length;\n return [\n `Using ${adapterTypes.join(\", \")} adapter${adapterTypes.length === 1 ? \"\" : \"s\"} for ${agentCount} imported ${pluralize(agentCount, \"agent\")} without an explicit adapter.`,\n ];\n}\n\nasync function promptForImportSelection(preview: CompanyPortabilityPreviewResult): Promise<string[]> {\n const catalog = buildImportSelectionCatalog(preview);\n const state = buildDefaultImportSelectionState(catalog);\n\n while (true) {\n const choice = await p.select<ImportSelectableGroup | \"company\" | \"confirm\">({\n message: \"Select what Relay Control should import\",\n options: [\n {\n value: \"company\",\n label: state.company ? \"Company: included\" : \"Company: skipped\",\n hint: catalog.company.files.length > 0 ? \"toggle company metadata\" : \"no company metadata in package\",\n },\n {\n value: \"projects\",\n label: \"Select Projects\",\n hint: summarizeGroupSelection(catalog, state, \"projects\"),\n },\n {\n value: \"issues\",\n label: \"Select Tasks\",\n hint: summarizeGroupSelection(catalog, state, \"issues\"),\n },\n {\n value: \"agents\",\n label: \"Select Agents\",\n hint: summarizeGroupSelection(catalog, state, \"agents\"),\n },\n {\n value: \"skills\",\n label: \"Select Skills\",\n hint: summarizeGroupSelection(catalog, state, \"skills\"),\n },\n {\n value: \"confirm\",\n label: \"Confirm\",\n hint: `${buildSelectedFilesFromImportSelection(catalog, state).length} files selected`,\n },\n ],\n initialValue: \"confirm\",\n });\n\n if (p.isCancel(choice)) {\n p.cancel(\"Import cancelled.\");\n process.exit(0);\n }\n\n if (choice === \"confirm\") {\n const selectedFiles = buildSelectedFilesFromImportSelection(catalog, state);\n if (selectedFiles.length === 0) {\n p.note(\"Select at least one import target before confirming.\", \"Nothing selected\");\n continue;\n }\n return selectedFiles;\n }\n\n if (choice === \"company\") {\n if (catalog.company.files.length === 0) {\n p.note(\"This package does not include company metadata to toggle.\", \"No company metadata\");\n continue;\n }\n state.company = !state.company;\n continue;\n }\n\n const group = choice;\n const groupItems = catalog[group];\n if (groupItems.length === 0) {\n p.note(`This package does not include any ${getGroupLabel(group).toLowerCase()}.`, `No ${getGroupLabel(group)}`);\n continue;\n }\n\n const selection = await p.multiselect<string>({\n message: `${getGroupLabel(group)} to import. Space toggles, enter returns to the main menu.`,\n options: groupItems.map((item) => ({\n value: item.key,\n label: item.label,\n hint: item.hint,\n })),\n initialValues: Array.from(state[group]),\n });\n\n if (p.isCancel(selection)) {\n p.cancel(\"Import cancelled.\");\n process.exit(0);\n }\n\n state[group] = new Set(selection);\n }\n}\n\nfunction summarizeInclude(include: CompanyPortabilityInclude): string {\n const labels = IMPORT_INCLUDE_OPTIONS\n .filter((option) => include[option.value])\n .map((option) => option.label.toLowerCase());\n return labels.length > 0 ? labels.join(\", \") : \"nothing selected\";\n}\n\nfunction formatSourceLabel(source: { type: \"inline\"; rootPath?: string | null } | { type: \"github\"; url: string }): string {\n if (source.type === \"github\") {\n return `GitHub: ${source.url}`;\n }\n return `Local package: ${source.rootPath?.trim() || \"(current folder)\"}`;\n}\n\nfunction formatTargetLabel(\n target: { mode: \"existing_company\"; companyId?: string | null } | { mode: \"new_company\"; newCompanyName?: string | null },\n preview?: CompanyPortabilityPreviewResult,\n): string {\n if (target.mode === \"existing_company\") {\n const targetName = preview?.targetCompanyName?.trim();\n const targetId = preview?.targetCompanyId?.trim() || target.companyId?.trim() || \"unknown-company\";\n return targetName ? `${targetName} (${targetId})` : targetId;\n }\n return target.newCompanyName?.trim() || preview?.manifest.company?.name || \"new company\";\n}\n\nfunction pluralize(count: number, singular: string, plural = `${singular}s`): string {\n return count === 1 ? singular : plural;\n}\n\nfunction summarizePlanCounts(\n plans: Array<{ action: \"create\" | \"update\" | \"skip\" }>,\n noun: string,\n): string {\n if (plans.length === 0) return `0 ${pluralize(0, noun)} selected`;\n const createCount = plans.filter((plan) => plan.action === \"create\").length;\n const updateCount = plans.filter((plan) => plan.action === \"update\").length;\n const skipCount = plans.filter((plan) => plan.action === \"skip\").length;\n const parts: string[] = [];\n if (createCount > 0) parts.push(`${createCount} create`);\n if (updateCount > 0) parts.push(`${updateCount} update`);\n if (skipCount > 0) parts.push(`${skipCount} skip`);\n return `${plans.length} ${pluralize(plans.length, noun)} total (${parts.join(\", \")})`;\n}\n\nfunction summarizeImportAgentResults(agents: CompanyPortabilityImportResult[\"agents\"]): string {\n if (agents.length === 0) return \"0 agents changed\";\n const created = agents.filter((agent) => agent.action === \"created\").length;\n const updated = agents.filter((agent) => agent.action === \"updated\").length;\n const skipped = agents.filter((agent) => agent.action === \"skipped\").length;\n const parts: string[] = [];\n if (created > 0) parts.push(`${created} created`);\n if (updated > 0) parts.push(`${updated} updated`);\n if (skipped > 0) parts.push(`${skipped} skipped`);\n return `${agents.length} ${pluralize(agents.length, \"agent\")} total (${parts.join(\", \")})`;\n}\n\nfunction summarizeImportProjectResults(projects: CompanyPortabilityImportResult[\"projects\"]): string {\n if (projects.length === 0) return \"0 projects changed\";\n const created = projects.filter((project) => project.action === \"created\").length;\n const updated = projects.filter((project) => project.action === \"updated\").length;\n const skipped = projects.filter((project) => project.action === \"skipped\").length;\n const parts: string[] = [];\n if (created > 0) parts.push(`${created} created`);\n if (updated > 0) parts.push(`${updated} updated`);\n if (skipped > 0) parts.push(`${skipped} skipped`);\n return `${projects.length} ${pluralize(projects.length, \"project\")} total (${parts.join(\", \")})`;\n}\n\nfunction actionChip(action: string): string {\n switch (action) {\n case \"create\":\n case \"created\":\n return pc.green(action);\n case \"update\":\n case \"updated\":\n return pc.yellow(action);\n case \"skip\":\n case \"skipped\":\n case \"none\":\n case \"unchanged\":\n return pc.dim(action);\n default:\n return action;\n }\n}\n\nfunction appendPreviewExamples(\n lines: string[],\n title: string,\n entries: Array<{ action: string; label: string; reason?: string | null }>,\n): void {\n if (entries.length === 0) return;\n lines.push(\"\");\n lines.push(pc.bold(title));\n const shown = entries.slice(0, IMPORT_PREVIEW_SAMPLE_LIMIT);\n for (const entry of shown) {\n const reason = entry.reason?.trim() ? pc.dim(` (${entry.reason.trim()})`) : \"\";\n lines.push(`- ${actionChip(entry.action)} ${entry.label}${reason}`);\n }\n if (entries.length > shown.length) {\n lines.push(pc.dim(`- +${entries.length - shown.length} more`));\n }\n}\n\nfunction appendMessageBlock(lines: string[], title: string, messages: string[]): void {\n if (messages.length === 0) return;\n lines.push(\"\");\n lines.push(pc.bold(title));\n for (const message of messages) {\n lines.push(`- ${message}`);\n }\n}\n\nexport function renderCompanyImportPreview(\n preview: CompanyPortabilityPreviewResult,\n meta: {\n sourceLabel: string;\n targetLabel: string;\n infoMessages?: string[];\n },\n): string {\n const lines: string[] = [\n `${pc.bold(\"Source\")} ${meta.sourceLabel}`,\n `${pc.bold(\"Target\")} ${meta.targetLabel}`,\n `${pc.bold(\"Include\")} ${summarizeInclude(preview.include)}`,\n `${pc.bold(\"Mode\")} ${preview.collisionStrategy} collisions`,\n \"\",\n pc.bold(\"Package\"),\n `- company: ${preview.manifest.company?.name ?? preview.manifest.source?.companyName ?? \"not included\"}`,\n `- agents: ${preview.manifest.agents.length}`,\n `- projects: ${preview.manifest.projects.length}`,\n `- tasks: ${preview.manifest.issues.length}`,\n `- skills: ${preview.manifest.skills.length}`,\n ];\n\n if (preview.envInputs.length > 0) {\n const requiredCount = preview.envInputs.filter((item) => item.requirement === \"required\").length;\n lines.push(`- env inputs: ${preview.envInputs.length} (${requiredCount} required)`);\n }\n\n lines.push(\"\");\n lines.push(pc.bold(\"Plan\"));\n lines.push(`- company: ${actionChip(preview.plan.companyAction === \"none\" ? \"unchanged\" : preview.plan.companyAction)}`);\n lines.push(`- agents: ${summarizePlanCounts(preview.plan.agentPlans, \"agent\")}`);\n lines.push(`- projects: ${summarizePlanCounts(preview.plan.projectPlans, \"project\")}`);\n lines.push(`- tasks: ${summarizePlanCounts(preview.plan.issuePlans, \"task\")}`);\n if (preview.include.skills) {\n lines.push(`- skills: ${preview.manifest.skills.length} ${pluralize(preview.manifest.skills.length, \"skill\")} packaged`);\n }\n\n appendPreviewExamples(\n lines,\n \"Agent examples\",\n preview.plan.agentPlans.map((plan) => ({\n action: plan.action,\n label: `${plan.slug} -> ${plan.plannedName}`,\n reason: plan.reason,\n })),\n );\n appendPreviewExamples(\n lines,\n \"Project examples\",\n preview.plan.projectPlans.map((plan) => ({\n action: plan.action,\n label: `${plan.slug} -> ${plan.plannedName}`,\n reason: plan.reason,\n })),\n );\n appendPreviewExamples(\n lines,\n \"Task examples\",\n preview.plan.issuePlans.map((plan) => ({\n action: plan.action,\n label: `${plan.slug} -> ${plan.plannedTitle}`,\n reason: plan.reason,\n })),\n );\n\n appendMessageBlock(lines, pc.cyan(\"Info\"), meta.infoMessages ?? []);\n appendMessageBlock(lines, pc.yellow(\"Warnings\"), preview.warnings);\n appendMessageBlock(lines, pc.red(\"Errors\"), preview.errors);\n\n return lines.join(\"\\n\");\n}\n\nexport function renderCompanyImportResult(\n result: CompanyPortabilityImportResult,\n meta: { targetLabel: string; companyUrl?: string; infoMessages?: string[] },\n): string {\n const lines: string[] = [\n `${pc.bold(\"Target\")} ${meta.targetLabel}`,\n `${pc.bold(\"Company\")} ${result.company.name} (${actionChip(result.company.action)})`,\n `${pc.bold(\"Agents\")} ${summarizeImportAgentResults(result.agents)}`,\n `${pc.bold(\"Projects\")} ${summarizeImportProjectResults(result.projects)}`,\n ];\n\n if (meta.companyUrl) {\n lines.splice(1, 0, `${pc.bold(\"URL\")} ${meta.companyUrl}`);\n }\n\n appendPreviewExamples(\n lines,\n \"Agent results\",\n result.agents.map((agent) => ({\n action: agent.action,\n label: `${agent.slug} -> ${agent.name}`,\n reason: agent.reason,\n })),\n );\n appendPreviewExamples(\n lines,\n \"Project results\",\n result.projects.map((project) => ({\n action: project.action,\n label: `${project.slug} -> ${project.name}`,\n reason: project.reason,\n })),\n );\n\n if (result.envInputs.length > 0) {\n lines.push(\"\");\n lines.push(pc.bold(\"Env inputs\"));\n lines.push(\n `- ${result.envInputs.length} ${pluralize(result.envInputs.length, \"input\")} may need values after import`,\n );\n }\n\n appendMessageBlock(lines, pc.cyan(\"Info\"), meta.infoMessages ?? []);\n appendMessageBlock(lines, pc.yellow(\"Warnings\"), result.warnings);\n\n return lines.join(\"\\n\");\n}\n\nfunction printCompanyImportView(title: string, body: string, opts?: { interactive?: boolean }): void {\n if (opts?.interactive) {\n p.note(body, title);\n return;\n }\n console.log(pc.bold(title));\n console.log(body);\n}\n\nexport function resolveCompanyImportApiPath(input: {\n dryRun: boolean;\n targetMode: \"new_company\" | \"existing_company\";\n companyId?: string | null;\n}): string {\n if (input.targetMode === \"existing_company\") {\n const companyId = input.companyId?.trim();\n if (!companyId) {\n throw new Error(\"Existing-company imports require a companyId to resolve the API route.\");\n }\n return input.dryRun\n ? `/api/companies/${companyId}/imports/preview`\n : `/api/companies/${companyId}/imports/apply`;\n }\n\n return input.dryRun ? \"/api/companies/import/preview\" : \"/api/companies/import\";\n}\n\nexport function buildCompanyDashboardUrl(apiBase: string, issuePrefix: string): string {\n const url = new URL(apiBase);\n const normalizedPrefix = issuePrefix.trim().replace(/^\\/+|\\/+$/g, \"\");\n url.pathname = `${url.pathname.replace(/\\/+$/, \"\")}/${normalizedPrefix}/dashboard`;\n url.search = \"\";\n url.hash = \"\";\n return url.toString();\n}\n\nexport function resolveCompanyImportApplyConfirmationMode(input: {\n yes?: boolean;\n interactive: boolean;\n json: boolean;\n}): \"skip\" | \"prompt\" {\n if (input.yes) {\n return \"skip\";\n }\n if (input.json) {\n throw new Error(\n \"Applying a company import with --json requires --yes. Use --dry-run first to inspect the preview.\",\n );\n }\n if (!input.interactive) {\n throw new Error(\n \"Applying a company import from a non-interactive terminal requires --yes. Use --dry-run first to inspect the preview.\",\n );\n }\n return \"prompt\";\n}\n\nexport function isHttpUrl(input: string): boolean {\n return /^https?:\\/\\//i.test(input.trim());\n}\n\nexport function looksLikeRepoUrl(input: string): boolean {\n try {\n const url = new URL(input.trim());\n if (url.protocol !== \"https:\") return false;\n const segments = url.pathname.split(\"/\").filter(Boolean);\n return segments.length >= 2;\n } catch {\n return false;\n }\n}\n\nfunction isGithubSegment(input: string): boolean {\n return /^[A-Za-z0-9._-]+$/.test(input);\n}\n\nexport function isGithubShorthand(input: string): boolean {\n const trimmed = input.trim();\n if (!trimmed || isHttpUrl(trimmed)) return false;\n if (\n trimmed.startsWith(\".\") ||\n trimmed.startsWith(\"/\") ||\n trimmed.startsWith(\"~\") ||\n trimmed.includes(\"\\\\\") ||\n /^[A-Za-z]:/.test(trimmed)\n ) {\n return false;\n }\n\n const segments = trimmed.split(\"/\").filter(Boolean);\n return segments.length >= 2 && segments.every(isGithubSegment);\n}\n\nfunction normalizeGithubImportPath(input: string | null | undefined): string | null {\n if (!input) return null;\n const trimmed = input.trim().replace(/^\\/+|\\/+$/g, \"\");\n return trimmed || null;\n}\n\nfunction buildGithubImportUrl(input: {\n hostname?: string;\n owner: string;\n repo: string;\n ref?: string | null;\n path?: string | null;\n companyPath?: string | null;\n}): string {\n const host = input.hostname || \"github.com\";\n const url = new URL(`https://${host}/${input.owner}/${input.repo.replace(/\\.git$/i, \"\")}`);\n const ref = input.ref?.trim();\n if (ref) {\n url.searchParams.set(\"ref\", ref);\n }\n const companyPath = normalizeGithubImportPath(input.companyPath);\n if (companyPath) {\n url.searchParams.set(\"companyPath\", companyPath);\n return url.toString();\n }\n const sourcePath = normalizeGithubImportPath(input.path);\n if (sourcePath) {\n url.searchParams.set(\"path\", sourcePath);\n }\n return url.toString();\n}\n\nexport function normalizeGithubImportSource(input: string, refOverride?: string): string {\n const trimmed = input.trim();\n const ref = refOverride?.trim();\n\n if (isGithubShorthand(trimmed)) {\n const [owner, repo, ...repoPath] = trimmed.split(\"/\").filter(Boolean);\n return buildGithubImportUrl({\n owner: owner!,\n repo: repo!,\n ref: ref || \"main\",\n path: repoPath.join(\"/\"),\n });\n }\n\n if (!looksLikeRepoUrl(trimmed)) {\n throw new Error(\"GitHub source must be a GitHub or GitHub Enterprise URL, or owner/repo[/path] shorthand.\");\n }\n if (!ref) {\n return trimmed;\n }\n\n const url = new URL(trimmed);\n const hostname = url.hostname;\n const parts = url.pathname.split(\"/\").filter(Boolean);\n if (parts.length < 2) {\n throw new Error(\"Invalid GitHub URL.\");\n }\n\n const owner = parts[0]!;\n const repo = parts[1]!;\n const existingPath = normalizeGithubImportPath(url.searchParams.get(\"path\"));\n const existingCompanyPath = normalizeGithubImportPath(url.searchParams.get(\"companyPath\"));\n if (existingCompanyPath) {\n return buildGithubImportUrl({ hostname, owner, repo, ref, companyPath: existingCompanyPath });\n }\n if (existingPath) {\n return buildGithubImportUrl({ hostname, owner, repo, ref, path: existingPath });\n }\n if (parts[2] === \"tree\") {\n return buildGithubImportUrl({ hostname, owner, repo, ref, path: parts.slice(4).join(\"/\") });\n }\n if (parts[2] === \"blob\") {\n return buildGithubImportUrl({ hostname, owner, repo, ref, companyPath: parts.slice(4).join(\"/\") });\n }\n return buildGithubImportUrl({ hostname, owner, repo, ref });\n}\n\nasync function pathExists(inputPath: string): Promise<boolean> {\n try {\n await stat(path.resolve(inputPath));\n return true;\n } catch {\n return false;\n }\n}\n\nasync function collectPackageFiles(\n root: string,\n current: string,\n files: Record<string, CompanyPortabilityFileEntry>,\n): Promise<void> {\n const entries = await readdir(current, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.name.startsWith(\".git\")) continue;\n const absolutePath = path.join(current, entry.name);\n if (entry.isDirectory()) {\n await collectPackageFiles(root, absolutePath, files);\n continue;\n }\n if (!entry.isFile()) continue;\n const relativePath = path.relative(root, absolutePath).replace(/\\\\/g, \"/\");\n if (!shouldIncludePortableFile(relativePath)) continue;\n files[relativePath] = readPortableFileEntry(relativePath, await readFile(absolutePath));\n }\n}\n\nexport async function resolveInlineSourceFromPath(inputPath: string): Promise<{\n rootPath: string;\n files: Record<string, CompanyPortabilityFileEntry>;\n}> {\n const resolved = path.resolve(inputPath);\n const resolvedStat = await stat(resolved);\n if (resolvedStat.isFile() && path.extname(resolved).toLowerCase() === \".zip\") {\n const archive = await readZipArchive(await readFile(resolved));\n const filteredFiles = Object.fromEntries(\n Object.entries(archive.files).filter(([relativePath]) => shouldIncludePortableFile(relativePath)),\n );\n return {\n rootPath: archive.rootPath ?? path.basename(resolved, \".zip\"),\n files: filteredFiles,\n };\n }\n\n const rootDir = resolvedStat.isDirectory() ? resolved : path.dirname(resolved);\n const files: Record<string, CompanyPortabilityFileEntry> = {};\n await collectPackageFiles(rootDir, rootDir, files);\n return {\n rootPath: path.basename(rootDir),\n files,\n };\n}\n\nasync function writeExportToFolder(outDir: string, exported: CompanyPortabilityExportResult): Promise<void> {\n const root = path.resolve(outDir);\n await mkdir(root, { recursive: true });\n for (const [relativePath, content] of Object.entries(exported.files)) {\n const normalized = relativePath.replace(/\\\\/g, \"/\");\n const filePath = path.join(root, normalized);\n await mkdir(path.dirname(filePath), { recursive: true });\n const writeValue = portableFileEntryToWriteValue(content);\n if (typeof writeValue === \"string\") {\n await writeFile(filePath, writeValue, \"utf8\");\n } else {\n await writeFile(filePath, writeValue);\n }\n }\n}\n\nasync function confirmOverwriteExportDirectory(outDir: string): Promise<void> {\n const root = path.resolve(outDir);\n const stats = await stat(root).catch(() => null);\n if (!stats) return;\n if (!stats.isDirectory()) {\n throw new Error(`Export output path ${root} exists and is not a directory.`);\n }\n\n const entries = await readdir(root);\n if (entries.length === 0) return;\n\n if (!process.stdin.isTTY || !process.stdout.isTTY) {\n throw new Error(`Export output directory ${root} already contains files. Re-run interactively or choose an empty directory.`);\n }\n\n const confirmed = await p.confirm({\n message: `Overwrite existing files in ${root}?`,\n initialValue: false,\n });\n\n if (p.isCancel(confirmed) || !confirmed) {\n throw new Error(\"Export cancelled.\");\n }\n}\n\nfunction matchesPrefix(company: Company, selector: string): boolean {\n return company.issuePrefix.toUpperCase() === selector.toUpperCase();\n}\n\nexport function resolveCompanyForDeletion(\n companies: Company[],\n selectorRaw: string,\n by: CompanyDeleteSelectorMode = \"auto\",\n): Company {\n const selector = normalizeSelector(selectorRaw);\n if (!selector) {\n throw new Error(\"Company selector is required.\");\n }\n\n const idMatch = companies.find((company) => company.id === selector);\n const prefixMatch = companies.find((company) => matchesPrefix(company, selector));\n\n if (by === \"id\") {\n if (!idMatch) {\n throw new Error(`No company found by ID '${selector}'.`);\n }\n return idMatch;\n }\n\n if (by === \"prefix\") {\n if (!prefixMatch) {\n throw new Error(`No company found by shortname/prefix '${selector}'.`);\n }\n return prefixMatch;\n }\n\n if (idMatch && prefixMatch && idMatch.id !== prefixMatch.id) {\n throw new Error(\n `Selector '${selector}' is ambiguous (matches both an ID and a shortname). Re-run with --by id or --by prefix.`,\n );\n }\n\n if (idMatch) return idMatch;\n if (prefixMatch) return prefixMatch;\n\n throw new Error(\n `No company found for selector '${selector}'. Use company ID or issue prefix (for example PAP).`,\n );\n}\n\nexport function assertDeleteConfirmation(company: Company, opts: CompanyDeleteOptions): void {\n if (!opts.yes) {\n throw new Error(\"Deletion requires --yes.\");\n }\n\n const confirm = opts.confirm?.trim();\n if (!confirm) {\n throw new Error(\n \"Deletion requires --confirm <value> where value matches the company ID or issue prefix.\",\n );\n }\n\n const confirmsById = confirm === company.id;\n const confirmsByPrefix = confirm.toUpperCase() === company.issuePrefix.toUpperCase();\n if (!confirmsById && !confirmsByPrefix) {\n throw new Error(\n `Confirmation '${confirm}' does not match target company. Expected ID '${company.id}' or prefix '${company.issuePrefix}'.`,\n );\n }\n}\n\nfunction assertDeleteFlags(opts: CompanyDeleteOptions): void {\n if (!opts.yes) {\n throw new Error(\"Deletion requires --yes.\");\n }\n if (!opts.confirm?.trim()) {\n throw new Error(\n \"Deletion requires --confirm <value> where value matches the company ID or issue prefix.\",\n );\n }\n}\n\nexport function registerCompanyCommands(program: Command): void {\n const company = program.command(\"company\").description(\"Company operations\");\n\n addCommonClientOptions(\n company\n .command(\"list\")\n .description(\"List companies\")\n .action(async (opts: CompanyCommandOptions) => {\n try {\n const ctx = resolveCommandContext(opts);\n const rows = (await ctx.api.get<Company[]>(\"/api/companies\")) ?? [];\n if (ctx.json) {\n printOutput(rows, { json: true });\n return;\n }\n\n if (rows.length === 0) {\n printOutput([], { json: false });\n return;\n }\n\n const formatted = rows.map((row) => ({\n id: row.id,\n name: row.name,\n status: row.status,\n budgetMonthlyCents: row.budgetMonthlyCents,\n spentMonthlyCents: row.spentMonthlyCents,\n requireBoardApprovalForNewAgents: row.requireBoardApprovalForNewAgents,\n }));\n for (const row of formatted) {\n console.log(formatInlineRecord(row));\n }\n } catch (err) {\n handleCommandError(err);\n }\n }),\n );\n\n addCommonClientOptions(\n company\n .command(\"get\")\n .description(\"Get one company\")\n .argument(\"<companyId>\", \"Company ID\")\n .action(async (companyId: string, opts: CompanyCommandOptions) => {\n try {\n const ctx = resolveCommandContext(opts);\n const row = await ctx.api.get<Company>(`/api/companies/${companyId}`);\n printOutput(row, { json: ctx.json });\n } catch (err) {\n handleCommandError(err);\n }\n }),\n );\n\n addCommonClientOptions(\n company\n .command(\"feedback:list\")\n .description(\"List feedback traces for a company\")\n .requiredOption(\"-C, --company-id <id>\", \"Company ID\")\n .option(\"--target-type <type>\", \"Filter by target type\")\n .option(\"--vote <vote>\", \"Filter by vote value\")\n .option(\"--status <status>\", \"Filter by trace status\")\n .option(\"--project-id <id>\", \"Filter by project ID\")\n .option(\"--issue-id <id>\", \"Filter by issue ID\")\n .option(\"--from <iso8601>\", \"Only include traces created at or after this timestamp\")\n .option(\"--to <iso8601>\", \"Only include traces created at or before this timestamp\")\n .option(\"--shared-only\", \"Only include traces eligible for sharing/export\")\n .option(\"--include-payload\", \"Include stored payload snapshots in the response\")\n .action(async (opts: CompanyFeedbackOptions) => {\n try {\n const ctx = resolveCommandContext(opts, { requireCompany: true });\n const traces = (await ctx.api.get<FeedbackTrace[]>(\n `/api/companies/${ctx.companyId}/feedback-traces${buildFeedbackTraceQuery(opts)}`,\n )) ?? [];\n if (ctx.json) {\n printOutput(traces, { json: true });\n return;\n }\n printOutput(\n traces.map((trace) => ({\n id: trace.id,\n issue: trace.issueIdentifier ?? trace.issueId,\n vote: trace.vote,\n status: trace.status,\n targetType: trace.targetType,\n target: trace.targetSummary.label,\n })),\n { json: false },\n );\n } catch (err) {\n handleCommandError(err);\n }\n }),\n { includeCompany: false },\n );\n\n addCommonClientOptions(\n company\n .command(\"feedback:export\")\n .description(\"Export feedback traces for a company\")\n .requiredOption(\"-C, --company-id <id>\", \"Company ID\")\n .option(\"--target-type <type>\", \"Filter by target type\")\n .option(\"--vote <vote>\", \"Filter by vote value\")\n .option(\"--status <status>\", \"Filter by trace status\")\n .option(\"--project-id <id>\", \"Filter by project ID\")\n .option(\"--issue-id <id>\", \"Filter by issue ID\")\n .option(\"--from <iso8601>\", \"Only include traces created at or after this timestamp\")\n .option(\"--to <iso8601>\", \"Only include traces created at or before this timestamp\")\n .option(\"--shared-only\", \"Only include traces eligible for sharing/export\")\n .option(\"--include-payload\", \"Include stored payload snapshots in the export\")\n .option(\"--out <path>\", \"Write export to a file path instead of stdout\")\n .option(\"--format <format>\", \"Export format: json or ndjson\", \"ndjson\")\n .action(async (opts: CompanyFeedbackOptions) => {\n try {\n const ctx = resolveCommandContext(opts, { requireCompany: true });\n const traces = (await ctx.api.get<FeedbackTrace[]>(\n `/api/companies/${ctx.companyId}/feedback-traces${buildFeedbackTraceQuery(opts, opts.includePayload ?? true)}`,\n )) ?? [];\n const serialized = serializeFeedbackTraces(traces, opts.format);\n if (opts.out?.trim()) {\n await writeFile(opts.out, serialized, \"utf8\");\n if (ctx.json) {\n printOutput(\n { out: opts.out, count: traces.length, format: normalizeFeedbackTraceExportFormat(opts.format) },\n { json: true },\n );\n return;\n }\n console.log(`Wrote ${traces.length} feedback trace(s) to ${opts.out}`);\n return;\n }\n process.stdout.write(`${serialized}${serialized.endsWith(\"\\n\") ? \"\" : \"\\n\"}`);\n } catch (err) {\n handleCommandError(err);\n }\n }),\n { includeCompany: false },\n );\n\n addCommonClientOptions(\n company\n .command(\"export\")\n .description(\"Export a company into a portable markdown package\")\n .argument(\"<companyId>\", \"Company ID\")\n .requiredOption(\"--out <path>\", \"Output directory\")\n .option(\"--include <values>\", \"Comma-separated include set: company,agents,projects,issues,tasks,skills\", \"company,agents\")\n .option(\"--skills <values>\", \"Comma-separated skill slugs/keys to export\")\n .option(\"--projects <values>\", \"Comma-separated project shortnames/ids to export\")\n .option(\"--issues <values>\", \"Comma-separated issue identifiers/ids to export\")\n .option(\"--project-issues <values>\", \"Comma-separated project shortnames/ids whose issues should be exported\")\n .option(\"--expand-referenced-skills\", \"Vendor skill contents instead of exporting upstream references\", false)\n .action(async (companyId: string, opts: CompanyExportOptions) => {\n try {\n const ctx = resolveCommandContext(opts);\n const include = parseInclude(opts.include);\n const exported = await ctx.api.post<CompanyPortabilityExportResult>(\n `/api/companies/${companyId}/export`,\n {\n include,\n skills: parseCsvValues(opts.skills),\n projects: parseCsvValues(opts.projects),\n issues: parseCsvValues(opts.issues),\n projectIssues: parseCsvValues(opts.projectIssues),\n expandReferencedSkills: Boolean(opts.expandReferencedSkills),\n },\n );\n if (!exported) {\n throw new Error(\"Export request returned no data\");\n }\n await confirmOverwriteExportDirectory(opts.out!);\n await writeExportToFolder(opts.out!, exported);\n printOutput(\n {\n ok: true,\n out: path.resolve(opts.out!),\n rootPath: exported.rootPath,\n filesWritten: Object.keys(exported.files).length,\n paperclipExtensionPath: exported.paperclipExtensionPath,\n warningCount: exported.warnings.length,\n },\n { json: ctx.json },\n );\n if (!ctx.json && exported.warnings.length > 0) {\n for (const warning of exported.warnings) {\n console.log(`warning=${warning}`);\n }\n }\n } catch (err) {\n handleCommandError(err);\n }\n }),\n );\n\n addCommonClientOptions(\n company\n .command(\"import\")\n .description(\"Import a portable markdown company package from local path, URL, or GitHub\")\n .argument(\"<fromPathOrUrl>\", \"Source path or URL\")\n .option(\"--include <values>\", \"Comma-separated include set: company,agents,projects,issues,tasks,skills\")\n .option(\"--target <mode>\", \"Target mode: new | existing\")\n .option(\"-C, --company-id <id>\", \"Existing target company ID\")\n .option(\"--new-company-name <name>\", \"Name override for --target new\")\n .option(\"--agents <list>\", \"Comma-separated agent slugs to import, or all\", \"all\")\n .option(\"--collision <mode>\", \"Collision strategy: rename | skip | replace\", \"rename\")\n .option(\"--ref <value>\", \"Git ref to use for GitHub imports (branch, tag, or commit)\")\n .option(\"--paperclip-url <url>\", \"Alias for --api-base on this command\")\n .option(\"--yes\", \"Accept default selection and skip the pre-import confirmation prompt\", false)\n .option(\"--dry-run\", \"Run preview only without applying\", false)\n .action(async (fromPathOrUrl: string, opts: CompanyImportOptions) => {\n try {\n if (!opts.apiBase?.trim() && opts.paperclipUrl?.trim()) {\n opts.apiBase = opts.paperclipUrl.trim();\n }\n const ctx = resolveCommandContext(opts);\n const interactiveView = isInteractiveTerminal() && !ctx.json;\n const from = fromPathOrUrl.trim();\n if (!from) {\n throw new Error(\"Source path or URL is required.\");\n }\n\n const include = resolveImportInclude(opts.include);\n const agents = parseAgents(opts.agents);\n const collision = (opts.collision ?? \"rename\").toLowerCase() as CompanyCollisionMode;\n if (![\"rename\", \"skip\", \"replace\"].includes(collision)) {\n throw new Error(\"Invalid --collision value. Use: rename, skip, replace\");\n }\n\n const inferredTarget = opts.target ?? (opts.companyId || ctx.companyId ? \"existing\" : \"new\");\n const target = inferredTarget.toLowerCase() as CompanyImportTargetMode;\n if (![\"new\", \"existing\"].includes(target)) {\n throw new Error(\"Invalid --target value. Use: new | existing\");\n }\n\n const existingTargetCompanyId = opts.companyId?.trim() || ctx.companyId;\n const targetPayload =\n target === \"existing\"\n ? {\n mode: \"existing_company\" as const,\n companyId: existingTargetCompanyId,\n }\n : {\n mode: \"new_company\" as const,\n newCompanyName: opts.newCompanyName?.trim() || null,\n };\n\n if (targetPayload.mode === \"existing_company\" && !targetPayload.companyId) {\n throw new Error(\"Target existing company requires --company-id (or context default companyId).\");\n }\n\n let sourcePayload:\n | { type: \"inline\"; rootPath?: string | null; files: Record<string, CompanyPortabilityFileEntry> }\n | { type: \"github\"; url: string };\n\n const treatAsLocalPath = !isHttpUrl(from) && await pathExists(from);\n const isGithubSource = looksLikeRepoUrl(from) || (isGithubShorthand(from) && !treatAsLocalPath);\n\n if (isHttpUrl(from) || isGithubSource) {\n if (!looksLikeRepoUrl(from) && !isGithubShorthand(from)) {\n throw new Error(\n \"Only GitHub URLs and local paths are supported for import. \" +\n \"Generic HTTP URLs are not supported. Use a GitHub or GitHub Enterprise URL (https://github.com/... or https://ghe.example.com/...) or a local directory path.\",\n );\n }\n sourcePayload = { type: \"github\", url: normalizeGithubImportSource(from, opts.ref) };\n } else {\n if (opts.ref?.trim()) {\n throw new Error(\"--ref is only supported for GitHub import sources.\");\n }\n const inline = await resolveInlineSourceFromPath(from);\n sourcePayload = {\n type: \"inline\",\n rootPath: inline.rootPath,\n files: inline.files,\n };\n }\n\n const sourceLabel = formatSourceLabel(sourcePayload);\n const targetLabel = formatTargetLabel(targetPayload);\n const previewApiPath = resolveCompanyImportApiPath({\n dryRun: true,\n targetMode: targetPayload.mode,\n companyId: targetPayload.mode === \"existing_company\" ? targetPayload.companyId : null,\n });\n\n let selectedFiles: string[] | undefined;\n if (interactiveView && !opts.yes && !opts.include?.trim()) {\n const initialPreview = await ctx.api.post<CompanyPortabilityPreviewResult>(previewApiPath, {\n source: sourcePayload,\n include,\n target: targetPayload,\n agents,\n collisionStrategy: collision,\n });\n if (!initialPreview) {\n throw new Error(\"Import preview returned no data.\");\n }\n selectedFiles = await promptForImportSelection(initialPreview);\n }\n\n const previewPayload = {\n source: sourcePayload,\n include,\n target: targetPayload,\n agents,\n collisionStrategy: collision,\n selectedFiles,\n };\n const preview = await ctx.api.post<CompanyPortabilityPreviewResult>(previewApiPath, previewPayload);\n if (!preview) {\n throw new Error(\"Import preview returned no data.\");\n }\n const adapterOverrides = buildDefaultImportAdapterOverrides(preview);\n const adapterMessages = buildDefaultImportAdapterMessages(adapterOverrides);\n\n if (opts.dryRun) {\n if (ctx.json) {\n printOutput(preview, { json: true });\n } else {\n printCompanyImportView(\n \"Import Preview\",\n renderCompanyImportPreview(preview, {\n sourceLabel,\n targetLabel: formatTargetLabel(targetPayload, preview),\n infoMessages: adapterMessages,\n }),\n { interactive: interactiveView },\n );\n }\n return;\n }\n\n if (!ctx.json) {\n printCompanyImportView(\n \"Import Preview\",\n renderCompanyImportPreview(preview, {\n sourceLabel,\n targetLabel: formatTargetLabel(targetPayload, preview),\n infoMessages: adapterMessages,\n }),\n { interactive: interactiveView },\n );\n }\n\n const confirmationMode = resolveCompanyImportApplyConfirmationMode({\n yes: opts.yes,\n interactive: interactiveView,\n json: ctx.json,\n });\n if (confirmationMode === \"prompt\") {\n const confirmed = await p.confirm({\n message: \"Apply this import? (y/N)\",\n initialValue: false,\n });\n if (p.isCancel(confirmed) || !confirmed) {\n p.log.warn(\"Import cancelled.\");\n return;\n }\n }\n\n const importApiPath = resolveCompanyImportApiPath({\n dryRun: false,\n targetMode: targetPayload.mode,\n companyId: targetPayload.mode === \"existing_company\" ? targetPayload.companyId : null,\n });\n const imported = await ctx.api.post<CompanyPortabilityImportResult>(importApiPath, {\n ...previewPayload,\n adapterOverrides,\n });\n if (!imported) {\n throw new Error(\"Import request returned no data.\");\n }\n const tc = getTelemetryClient();\n if (tc) {\n const isPrivate = sourcePayload.type !== \"github\";\n const sourceRef = sourcePayload.type === \"github\" ? sourcePayload.url : from;\n trackCompanyImported(tc, { sourceType: sourcePayload.type, sourceRef, isPrivate });\n }\n let companyUrl: string | undefined;\n if (!ctx.json) {\n try {\n const importedCompany = await ctx.api.get<Company>(`/api/companies/${imported.company.id}`);\n const issuePrefix = importedCompany?.issuePrefix?.trim();\n if (issuePrefix) {\n companyUrl = buildCompanyDashboardUrl(ctx.api.apiBase, issuePrefix);\n }\n } catch {\n companyUrl = undefined;\n }\n }\n if (ctx.json) {\n printOutput(imported, { json: true });\n } else {\n printCompanyImportView(\n \"Import Result\",\n renderCompanyImportResult(imported, {\n targetLabel,\n companyUrl,\n infoMessages: adapterMessages,\n }),\n { interactive: interactiveView },\n );\n if (interactiveView && companyUrl) {\n const openImportedCompany = await p.confirm({\n message: \"Open the imported company in your browser?\",\n initialValue: true,\n });\n if (!p.isCancel(openImportedCompany) && openImportedCompany) {\n if (openUrl(companyUrl)) {\n p.log.info(`Opened ${companyUrl}`);\n } else {\n p.log.warn(`Could not open your browser automatically. Open this URL manually:\\n${companyUrl}`);\n }\n }\n }\n }\n } catch (err) {\n handleCommandError(err);\n }\n }),\n );\n\n addCommonClientOptions(\n company\n .command(\"delete\")\n .description(\"Delete a company by ID or shortname/prefix (destructive)\")\n .argument(\"<selector>\", \"Company ID or issue prefix (for example PAP)\")\n .option(\n \"--by <mode>\",\n \"Selector mode: auto | id | prefix\",\n \"auto\",\n )\n .option(\"--yes\", \"Required safety flag to confirm destructive action\", false)\n .option(\n \"--confirm <value>\",\n \"Required safety value: target company ID or shortname/prefix\",\n )\n .action(async (selector: string, opts: CompanyDeleteOptions) => {\n try {\n const by = (opts.by ?? \"auto\").trim().toLowerCase() as CompanyDeleteSelectorMode;\n if (![\"auto\", \"id\", \"prefix\"].includes(by)) {\n throw new Error(`Invalid --by mode '${opts.by}'. Expected one of: auto, id, prefix.`);\n }\n\n const ctx = resolveCommandContext(opts);\n const normalizedSelector = normalizeSelector(selector);\n assertDeleteFlags(opts);\n\n let target: Company | null = null;\n const shouldTryIdLookup = by === \"id\" || (by === \"auto\" && isUuidLike(normalizedSelector));\n if (shouldTryIdLookup) {\n const byId = await ctx.api.get<Company>(`/api/companies/${normalizedSelector}`, { ignoreNotFound: true });\n if (byId) {\n target = byId;\n } else if (by === \"id\") {\n throw new Error(`No company found by ID '${normalizedSelector}'.`);\n }\n }\n\n if (!target && ctx.companyId) {\n const scoped = await ctx.api.get<Company>(`/api/companies/${ctx.companyId}`, { ignoreNotFound: true });\n if (scoped) {\n try {\n target = resolveCompanyForDeletion([scoped], normalizedSelector, by);\n } catch {\n // Fallback to board-wide lookup below.\n }\n }\n }\n\n if (!target) {\n try {\n const companies = (await ctx.api.get<Company[]>(\"/api/companies\")) ?? [];\n target = resolveCompanyForDeletion(companies, normalizedSelector, by);\n } catch (error) {\n if (error instanceof ApiRequestError && error.status === 403 && error.message.includes(\"Board access required\")) {\n throw new Error(\n \"Board access is required to resolve companies across the instance. Use a company ID/prefix for your current company, or run with board authentication.\",\n );\n }\n throw error;\n }\n }\n\n if (!target) {\n throw new Error(`No company found for selector '${normalizedSelector}'.`);\n }\n\n assertDeleteConfirmation(target, opts);\n\n await ctx.api.delete<{ ok: true }>(`/api/companies/${target.id}`);\n\n printOutput(\n {\n ok: true,\n deletedCompanyId: target.id,\n deletedCompanyName: target.name,\n deletedCompanyPrefix: target.issuePrefix,\n },\n { json: ctx.json },\n );\n } catch (err) {\n handleCommandError(err);\n }\n }),\n );\n}\n", "import { inflateRawSync } from \"node:zlib\";\nimport path from \"node:path\";\nimport type { CompanyPortabilityFileEntry } from \"@paperclipai/shared\";\n\nconst textDecoder = new TextDecoder();\n\nexport const binaryContentTypeByExtension: Record<string, string> = {\n \".gif\": \"image/gif\",\n \".jpeg\": \"image/jpeg\",\n \".jpg\": \"image/jpeg\",\n \".png\": \"image/png\",\n \".svg\": \"image/svg+xml\",\n \".webp\": \"image/webp\",\n};\n\nfunction normalizeArchivePath(pathValue: string) {\n return pathValue\n .replace(/\\\\/g, \"/\")\n .split(\"/\")\n .filter(Boolean)\n .join(\"/\");\n}\n\nfunction readUint16(source: Uint8Array, offset: number) {\n return source[offset]! | (source[offset + 1]! << 8);\n}\n\nfunction readUint32(source: Uint8Array, offset: number) {\n return (\n source[offset]! |\n (source[offset + 1]! << 8) |\n (source[offset + 2]! << 16) |\n (source[offset + 3]! << 24)\n ) >>> 0;\n}\n\nfunction sharedArchiveRoot(paths: string[]) {\n if (paths.length === 0) return null;\n const firstSegments = paths\n .map((entry) => normalizeArchivePath(entry).split(\"/\").filter(Boolean))\n .filter((parts) => parts.length > 0);\n if (firstSegments.length === 0) return null;\n const candidate = firstSegments[0]![0]!;\n return firstSegments.every((parts) => parts.length > 1 && parts[0] === candidate)\n ? candidate\n : null;\n}\n\nfunction bytesToPortableFileEntry(pathValue: string, bytes: Uint8Array): CompanyPortabilityFileEntry {\n const contentType = binaryContentTypeByExtension[path.extname(pathValue).toLowerCase()];\n if (!contentType) return textDecoder.decode(bytes);\n return {\n encoding: \"base64\",\n data: Buffer.from(bytes).toString(\"base64\"),\n contentType,\n };\n}\n\nasync function inflateZipEntry(compressionMethod: number, bytes: Uint8Array) {\n if (compressionMethod === 0) return bytes;\n if (compressionMethod !== 8) {\n throw new Error(\"Unsupported zip archive: only STORE and DEFLATE entries are supported.\");\n }\n return new Uint8Array(inflateRawSync(bytes));\n}\n\nexport async function readZipArchive(source: ArrayBuffer | Uint8Array): Promise<{\n rootPath: string | null;\n files: Record<string, CompanyPortabilityFileEntry>;\n}> {\n const bytes = source instanceof Uint8Array ? source : new Uint8Array(source);\n const entries: Array<{ path: string; body: CompanyPortabilityFileEntry }> = [];\n let offset = 0;\n\n while (offset + 4 <= bytes.length) {\n const signature = readUint32(bytes, offset);\n if (signature === 0x02014b50 || signature === 0x06054b50) break;\n if (signature !== 0x04034b50) {\n throw new Error(\"Invalid zip archive: unsupported local file header.\");\n }\n\n if (offset + 30 > bytes.length) {\n throw new Error(\"Invalid zip archive: truncated local file header.\");\n }\n\n const generalPurposeFlag = readUint16(bytes, offset + 6);\n const compressionMethod = readUint16(bytes, offset + 8);\n const compressedSize = readUint32(bytes, offset + 18);\n const fileNameLength = readUint16(bytes, offset + 26);\n const extraFieldLength = readUint16(bytes, offset + 28);\n\n if ((generalPurposeFlag & 0x0008) !== 0) {\n throw new Error(\"Unsupported zip archive: data descriptors are not supported.\");\n }\n\n const nameOffset = offset + 30;\n const bodyOffset = nameOffset + fileNameLength + extraFieldLength;\n const bodyEnd = bodyOffset + compressedSize;\n if (bodyEnd > bytes.length) {\n throw new Error(\"Invalid zip archive: truncated file contents.\");\n }\n\n const rawArchivePath = textDecoder.decode(bytes.slice(nameOffset, nameOffset + fileNameLength));\n const archivePath = normalizeArchivePath(rawArchivePath);\n const isDirectoryEntry = /\\/$/.test(rawArchivePath.replace(/\\\\/g, \"/\"));\n if (archivePath && !isDirectoryEntry) {\n const entryBytes = await inflateZipEntry(compressionMethod, bytes.slice(bodyOffset, bodyEnd));\n entries.push({\n path: archivePath,\n body: bytesToPortableFileEntry(archivePath, entryBytes),\n });\n }\n\n offset = bodyEnd;\n }\n\n const rootPath = sharedArchiveRoot(entries.map((entry) => entry.path));\n const files: Record<string, CompanyPortabilityFileEntry> = {};\n for (const entry of entries) {\n const normalizedPath =\n rootPath && entry.path.startsWith(`${rootPath}/`)\n ? entry.path.slice(rootPath.length + 1)\n : entry.path;\n if (!normalizedPath) continue;\n files[normalizedPath] = entry.body;\n }\n\n return { rootPath, files };\n}\n", "import { mkdir, readdir, readFile, stat, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport pc from \"picocolors\";\nimport { Command } from \"commander\";\nimport type { Company, FeedbackTrace, FeedbackTraceBundle } from \"@paperclipai/shared\";\nimport {\n addCommonClientOptions,\n handleCommandError,\n printOutput,\n resolveCommandContext,\n type BaseClientOptions,\n type ResolvedClientContext,\n} from \"./common.js\";\n\ninterface FeedbackFilterOptions extends BaseClientOptions {\n targetType?: string;\n vote?: string;\n status?: string;\n projectId?: string;\n issueId?: string;\n from?: string;\n to?: string;\n sharedOnly?: boolean;\n}\n\nexport interface FeedbackTraceQueryOptions {\n targetType?: string;\n vote?: string;\n status?: string;\n projectId?: string;\n issueId?: string;\n from?: string;\n to?: string;\n sharedOnly?: boolean;\n}\n\ninterface FeedbackReportOptions extends FeedbackFilterOptions {\n payloads?: boolean;\n}\n\ninterface FeedbackExportOptions extends FeedbackFilterOptions {\n out?: string;\n}\n\ninterface FeedbackSummary {\n total: number;\n thumbsUp: number;\n thumbsDown: number;\n withReason: number;\n statuses: Record<string, number>;\n}\n\ninterface FeedbackExportManifest {\n exportedAt: string;\n serverUrl: string;\n companyId: string;\n summary: FeedbackSummary & {\n uniqueIssues: number;\n issues: string[];\n };\n files: {\n votes: string[];\n traces: string[];\n fullTraces: string[];\n zip: string;\n };\n}\n\ninterface FeedbackExportResult {\n outputDir: string;\n zipPath: string;\n manifest: FeedbackExportManifest;\n}\n\nexport function registerFeedbackCommands(program: Command): void {\n const feedback = program.command(\"feedback\").description(\"Inspect and export local feedback traces\");\n\n addCommonClientOptions(\n feedback\n .command(\"report\")\n .description(\"Render a terminal report for company feedback traces\")\n .option(\"-C, --company-id <id>\", \"Company ID (overrides context default)\")\n .option(\"--target-type <type>\", \"Filter by target type\")\n .option(\"--vote <vote>\", \"Filter by vote value\")\n .option(\"--status <status>\", \"Filter by trace status\")\n .option(\"--project-id <id>\", \"Filter by project ID\")\n .option(\"--issue-id <id>\", \"Filter by issue ID\")\n .option(\"--from <iso8601>\", \"Only include traces created at or after this timestamp\")\n .option(\"--to <iso8601>\", \"Only include traces created at or before this timestamp\")\n .option(\"--shared-only\", \"Only include traces eligible for sharing/export\")\n .option(\"--payloads\", \"Include raw payload dumps in the terminal report\", false)\n .action(async (opts: FeedbackReportOptions) => {\n try {\n const ctx = resolveCommandContext(opts);\n const companyId = await resolveFeedbackCompanyId(ctx, opts.companyId);\n const traces = await fetchCompanyFeedbackTraces(ctx, companyId, opts);\n const summary = summarizeFeedbackTraces(traces);\n if (ctx.json) {\n printOutput(\n {\n apiBase: ctx.api.apiBase,\n companyId,\n summary,\n traces,\n },\n { json: true },\n );\n return;\n }\n console.log(renderFeedbackReport({\n apiBase: ctx.api.apiBase,\n companyId,\n traces,\n summary,\n includePayloads: Boolean(opts.payloads),\n }));\n } catch (err) {\n handleCommandError(err);\n }\n }),\n { includeCompany: false },\n );\n\n addCommonClientOptions(\n feedback\n .command(\"export\")\n .description(\"Export feedback votes and raw trace bundles into a folder plus zip archive\")\n .option(\"-C, --company-id <id>\", \"Company ID (overrides context default)\")\n .option(\"--target-type <type>\", \"Filter by target type\")\n .option(\"--vote <vote>\", \"Filter by vote value\")\n .option(\"--status <status>\", \"Filter by trace status\")\n .option(\"--project-id <id>\", \"Filter by project ID\")\n .option(\"--issue-id <id>\", \"Filter by issue ID\")\n .option(\"--from <iso8601>\", \"Only include traces created at or after this timestamp\")\n .option(\"--to <iso8601>\", \"Only include traces created at or before this timestamp\")\n .option(\"--shared-only\", \"Only include traces eligible for sharing/export\")\n .option(\"--out <path>\", \"Output directory (default: ./feedback-export-<timestamp>)\")\n .action(async (opts: FeedbackExportOptions) => {\n try {\n const ctx = resolveCommandContext(opts);\n const companyId = await resolveFeedbackCompanyId(ctx, opts.companyId);\n const traces = await fetchCompanyFeedbackTraces(ctx, companyId, opts);\n const outputDir = path.resolve(opts.out?.trim() || defaultFeedbackExportDirName());\n const exported = await writeFeedbackExportBundle({\n apiBase: ctx.api.apiBase,\n companyId,\n traces,\n outputDir,\n traceBundleFetcher: (trace) => fetchFeedbackTraceBundle(ctx, trace.id),\n });\n if (ctx.json) {\n printOutput(\n {\n companyId,\n outputDir: exported.outputDir,\n zipPath: exported.zipPath,\n summary: exported.manifest.summary,\n },\n { json: true },\n );\n return;\n }\n console.log(renderFeedbackExportSummary(exported));\n } catch (err) {\n handleCommandError(err);\n }\n }),\n { includeCompany: false },\n );\n}\n\nexport async function resolveFeedbackCompanyId(\n ctx: ResolvedClientContext,\n explicitCompanyId?: string,\n): Promise<string> {\n const direct = explicitCompanyId?.trim() || ctx.companyId?.trim();\n if (direct) return direct;\n const companies = (await ctx.api.get<Company[]>(\"/api/companies\")) ?? [];\n const companyId = companies[0]?.id?.trim();\n if (!companyId) {\n throw new Error(\n \"Company ID is required. Pass --company-id, set PAPERCLIP_COMPANY_ID, or configure a CLI context default.\",\n );\n }\n return companyId;\n}\n\nexport function buildFeedbackTraceQuery(opts: FeedbackTraceQueryOptions, includePayload = true): string {\n const params = new URLSearchParams();\n if (opts.targetType) params.set(\"targetType\", opts.targetType);\n if (opts.vote) params.set(\"vote\", opts.vote);\n if (opts.status) params.set(\"status\", opts.status);\n if (opts.projectId) params.set(\"projectId\", opts.projectId);\n if (opts.issueId) params.set(\"issueId\", opts.issueId);\n if (opts.from) params.set(\"from\", opts.from);\n if (opts.to) params.set(\"to\", opts.to);\n if (opts.sharedOnly) params.set(\"sharedOnly\", \"true\");\n if (includePayload) params.set(\"includePayload\", \"true\");\n const query = params.toString();\n return query ? `?${query}` : \"\";\n}\n\nexport function normalizeFeedbackTraceExportFormat(value: string | undefined): \"json\" | \"ndjson\" {\n if (!value || value === \"ndjson\") return \"ndjson\";\n if (value === \"json\") return \"json\";\n throw new Error(`Unsupported export format: ${value}`);\n}\n\nexport function serializeFeedbackTraces(traces: FeedbackTrace[], format: string | undefined): string {\n if (normalizeFeedbackTraceExportFormat(format) === \"json\") {\n return JSON.stringify(traces, null, 2);\n }\n return traces.map((trace) => JSON.stringify(trace)).join(\"\\n\");\n}\n\nexport async function fetchCompanyFeedbackTraces(\n ctx: ResolvedClientContext,\n companyId: string,\n opts: FeedbackFilterOptions,\n): Promise<FeedbackTrace[]> {\n return (\n (await ctx.api.get<FeedbackTrace[]>(\n `/api/companies/${companyId}/feedback-traces${buildFeedbackTraceQuery(opts, true)}`,\n )) ?? []\n );\n}\n\nexport async function fetchFeedbackTraceBundle(\n ctx: ResolvedClientContext,\n traceId: string,\n): Promise<FeedbackTraceBundle> {\n const bundle = await ctx.api.get<FeedbackTraceBundle>(`/api/feedback-traces/${traceId}/bundle`);\n if (!bundle) {\n throw new Error(`Feedback trace bundle ${traceId} not found`);\n }\n return bundle;\n}\n\nexport function summarizeFeedbackTraces(traces: FeedbackTrace[]): FeedbackSummary {\n const statuses: Record<string, number> = {};\n let thumbsUp = 0;\n let thumbsDown = 0;\n let withReason = 0;\n\n for (const trace of traces) {\n if (trace.vote === \"up\") thumbsUp += 1;\n if (trace.vote === \"down\") thumbsDown += 1;\n if (readFeedbackReason(trace)) withReason += 1;\n statuses[trace.status] = (statuses[trace.status] ?? 0) + 1;\n }\n\n return {\n total: traces.length,\n thumbsUp,\n thumbsDown,\n withReason,\n statuses,\n };\n}\n\nexport function renderFeedbackReport(input: {\n apiBase: string;\n companyId: string;\n traces: FeedbackTrace[];\n summary: FeedbackSummary;\n includePayloads: boolean;\n}): string {\n const lines: string[] = [];\n lines.push(\"\");\n lines.push(pc.bold(pc.magenta(\"Relay Control Feedback Report\")));\n lines.push(pc.dim(new Date().toISOString()));\n lines.push(horizontalRule());\n lines.push(`${pc.dim(\"Server:\")} ${input.apiBase}`);\n lines.push(`${pc.dim(\"Company:\")} ${input.companyId}`);\n lines.push(\"\");\n\n if (input.traces.length === 0) {\n lines.push(pc.yellow(\"[!!] No feedback traces found.\"));\n lines.push(\"\");\n return lines.join(\"\\n\");\n }\n\n lines.push(pc.bold(pc.cyan(\"Summary\")));\n lines.push(horizontalRule());\n lines.push(` ${pc.green(pc.bold(String(input.summary.thumbsUp)))} thumbs up`);\n lines.push(` ${pc.red(pc.bold(String(input.summary.thumbsDown)))} thumbs down`);\n lines.push(` ${pc.yellow(pc.bold(String(input.summary.withReason)))} downvotes with a reason`);\n lines.push(` ${pc.bold(String(input.summary.total))} total traces`);\n lines.push(\"\");\n lines.push(pc.dim(\"Export status:\"));\n for (const status of [\"pending\", \"sent\", \"local_only\", \"failed\"]) {\n lines.push(` ${padRight(status, 10)} ${input.summary.statuses[status] ?? 0}`);\n }\n lines.push(\"\");\n lines.push(pc.bold(pc.cyan(\"Trace Details\")));\n lines.push(horizontalRule());\n\n for (const trace of input.traces) {\n const voteColor = trace.vote === \"up\" ? pc.green : pc.red;\n const voteIcon = trace.vote === \"up\" ? \"^\" : \"v\";\n const issueRef = trace.issueIdentifier ?? trace.issueId;\n const label = trace.targetSummary.label?.trim() || trace.targetType;\n const excerpt = compactText(trace.targetSummary.excerpt);\n const reason = readFeedbackReason(trace);\n lines.push(\n ` ${voteColor(voteIcon)} ${pc.bold(issueRef)} ${pc.dim(compactText(trace.issueTitle, 64))}`,\n );\n lines.push(\n ` ${pc.dim(\"Trace:\")} ${trace.id.slice(0, 8)} ${pc.dim(\"Status:\")} ${trace.status} ${pc.dim(\"Date:\")} ${formatTimestamp(trace.createdAt)}`,\n );\n lines.push(` ${pc.dim(\"Target:\")} ${label}`);\n if (excerpt) {\n lines.push(` ${pc.dim(\"Excerpt:\")} ${excerpt}`);\n }\n if (reason) {\n lines.push(` ${pc.yellow(pc.bold(\"Reason:\"))} ${pc.yellow(reason)}`);\n }\n lines.push(\"\");\n }\n\n if (input.includePayloads) {\n lines.push(pc.bold(pc.cyan(\"Raw Payloads\")));\n lines.push(horizontalRule());\n for (const trace of input.traces) {\n if (!trace.payloadSnapshot) continue;\n const issueRef = trace.issueIdentifier ?? trace.issueId;\n lines.push(` ${pc.bold(`${issueRef} (${trace.id.slice(0, 8)})`)}`);\n const body = JSON.stringify(trace.payloadSnapshot, null, 2)?.split(\"\\n\") ?? [];\n for (const line of body) {\n lines.push(` ${pc.dim(line)}`);\n }\n lines.push(\"\");\n }\n }\n\n lines.push(horizontalRule());\n lines.push(pc.dim(`Report complete. ${input.traces.length} trace(s) displayed.`));\n lines.push(\"\");\n return lines.join(\"\\n\");\n}\n\nexport async function writeFeedbackExportBundle(input: {\n apiBase: string;\n companyId: string;\n traces: FeedbackTrace[];\n outputDir: string;\n traceBundleFetcher?: (trace: FeedbackTrace) => Promise<FeedbackTraceBundle>;\n}): Promise<FeedbackExportResult> {\n await ensureEmptyOutputDirectory(input.outputDir);\n await mkdir(path.join(input.outputDir, \"votes\"), { recursive: true });\n await mkdir(path.join(input.outputDir, \"traces\"), { recursive: true });\n await mkdir(path.join(input.outputDir, \"full-traces\"), { recursive: true });\n\n const summary = summarizeFeedbackTraces(input.traces);\n const voteFiles: string[] = [];\n const traceFiles: string[] = [];\n const fullTraceDirs: string[] = [];\n const fullTraceFiles: string[] = [];\n const issueSet = new Set<string>();\n\n for (const trace of input.traces) {\n const issueRef = sanitizeFileSegment(trace.issueIdentifier ?? trace.issueId);\n const voteRecord = buildFeedbackVoteRecord(trace);\n const voteFileName = `${issueRef}-${trace.feedbackVoteId.slice(0, 8)}.json`;\n const traceFileName = `${issueRef}-${trace.id.slice(0, 8)}.json`;\n voteFiles.push(voteFileName);\n traceFiles.push(traceFileName);\n issueSet.add(trace.issueIdentifier ?? trace.issueId);\n await writeFile(\n path.join(input.outputDir, \"votes\", voteFileName),\n `${JSON.stringify(voteRecord, null, 2)}\\n`,\n \"utf8\",\n );\n await writeFile(\n path.join(input.outputDir, \"traces\", traceFileName),\n `${JSON.stringify(trace, null, 2)}\\n`,\n \"utf8\",\n );\n\n if (input.traceBundleFetcher) {\n const bundle = await input.traceBundleFetcher(trace);\n const bundleDirName = `${issueRef}-${trace.id.slice(0, 8)}`;\n const bundleDir = path.join(input.outputDir, \"full-traces\", bundleDirName);\n await mkdir(bundleDir, { recursive: true });\n fullTraceDirs.push(bundleDirName);\n await writeFile(\n path.join(bundleDir, \"bundle.json\"),\n `${JSON.stringify(bundle, null, 2)}\\n`,\n \"utf8\",\n );\n fullTraceFiles.push(path.posix.join(\"full-traces\", bundleDirName, \"bundle.json\"));\n for (const file of bundle.files) {\n const targetPath = path.join(bundleDir, file.path);\n await mkdir(path.dirname(targetPath), { recursive: true });\n await writeFile(targetPath, file.contents, \"utf8\");\n fullTraceFiles.push(path.posix.join(\"full-traces\", bundleDirName, file.path.replace(/\\\\/g, \"/\")));\n }\n }\n }\n\n const zipPath = `${input.outputDir}.zip`;\n const manifest: FeedbackExportManifest = {\n exportedAt: new Date().toISOString(),\n serverUrl: input.apiBase,\n companyId: input.companyId,\n summary: {\n ...summary,\n uniqueIssues: issueSet.size,\n issues: Array.from(issueSet).sort((left, right) => left.localeCompare(right)),\n },\n files: {\n votes: voteFiles.slice().sort((left, right) => left.localeCompare(right)),\n traces: traceFiles.slice().sort((left, right) => left.localeCompare(right)),\n fullTraces: fullTraceDirs.slice().sort((left, right) => left.localeCompare(right)),\n zip: path.basename(zipPath),\n },\n };\n\n await writeFile(\n path.join(input.outputDir, \"index.json\"),\n `${JSON.stringify(manifest, null, 2)}\\n`,\n \"utf8\",\n );\n const archiveFiles = await collectJsonFilesForArchive(input.outputDir, [\n \"index.json\",\n ...manifest.files.votes.map((file) => path.posix.join(\"votes\", file)),\n ...manifest.files.traces.map((file) => path.posix.join(\"traces\", file)),\n ...fullTraceFiles,\n ]);\n await writeFile(zipPath, createStoredZipArchive(archiveFiles, path.basename(input.outputDir)));\n\n return {\n outputDir: input.outputDir,\n zipPath,\n manifest,\n };\n}\n\nexport function renderFeedbackExportSummary(exported: FeedbackExportResult): string {\n const lines: string[] = [];\n lines.push(\"\");\n lines.push(pc.bold(pc.magenta(\"Paperclip Feedback Export\")));\n lines.push(pc.dim(exported.manifest.exportedAt));\n lines.push(horizontalRule());\n lines.push(`${pc.dim(\"Company:\")} ${exported.manifest.companyId}`);\n lines.push(`${pc.dim(\"Output:\")} ${exported.outputDir}`);\n lines.push(`${pc.dim(\"Archive:\")} ${exported.zipPath}`);\n lines.push(\"\");\n lines.push(pc.bold(\"Export Summary\"));\n lines.push(horizontalRule());\n lines.push(` ${pc.green(pc.bold(String(exported.manifest.summary.thumbsUp)))} thumbs up`);\n lines.push(` ${pc.red(pc.bold(String(exported.manifest.summary.thumbsDown)))} thumbs down`);\n lines.push(` ${pc.yellow(pc.bold(String(exported.manifest.summary.withReason)))} with reason`);\n lines.push(` ${pc.bold(String(exported.manifest.summary.uniqueIssues))} unique issues`);\n lines.push(\"\");\n lines.push(pc.dim(\"Files:\"));\n lines.push(` ${path.join(exported.outputDir, \"index.json\")}`);\n lines.push(` ${path.join(exported.outputDir, \"votes\")} (${exported.manifest.files.votes.length} files)`);\n lines.push(` ${path.join(exported.outputDir, \"traces\")} (${exported.manifest.files.traces.length} files)`);\n lines.push(` ${path.join(exported.outputDir, \"full-traces\")} (${exported.manifest.files.fullTraces.length} bundles)`);\n lines.push(` ${exported.zipPath}`);\n lines.push(\"\");\n return lines.join(\"\\n\");\n}\n\nfunction readFeedbackReason(trace: FeedbackTrace): string | null {\n const payload = asRecord(trace.payloadSnapshot);\n const vote = asRecord(payload?.vote);\n const reason = vote?.reason;\n return typeof reason === \"string\" && reason.trim() ? reason.trim() : null;\n}\n\nfunction buildFeedbackVoteRecord(trace: FeedbackTrace) {\n return {\n voteId: trace.feedbackVoteId,\n traceId: trace.id,\n issueId: trace.issueId,\n issueIdentifier: trace.issueIdentifier,\n issueTitle: trace.issueTitle,\n vote: trace.vote,\n targetType: trace.targetType,\n targetId: trace.targetId,\n targetSummary: trace.targetSummary,\n status: trace.status,\n consentVersion: trace.consentVersion,\n createdAt: trace.createdAt,\n updatedAt: trace.updatedAt,\n reason: readFeedbackReason(trace),\n };\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n return value as Record<string, unknown>;\n}\n\nfunction compactText(value: string | null | undefined, maxLength = 88): string | null {\n if (!value) return null;\n const compact = value.replace(/\\s+/g, \" \").trim();\n if (!compact) return null;\n if (compact.length <= maxLength) return compact;\n return `${compact.slice(0, maxLength - 3)}...`;\n}\n\nfunction formatTimestamp(value: unknown): string {\n if (value instanceof Date) return value.toISOString().slice(0, 19).replace(\"T\", \" \");\n if (typeof value === \"string\") return value.slice(0, 19).replace(\"T\", \" \");\n return \"-\";\n}\n\nfunction horizontalRule(): string {\n return pc.dim(\"-\".repeat(72));\n}\n\nfunction padRight(value: string, width: number): string {\n return `${value}${\" \".repeat(Math.max(0, width - value.length))}`;\n}\n\nfunction defaultFeedbackExportDirName(): string {\n const iso = new Date().toISOString().replace(/[-:]/g, \"\").replace(/\\.\\d{3}Z$/, \"Z\");\n return `feedback-export-${iso}`;\n}\n\nasync function ensureEmptyOutputDirectory(outputDir: string): Promise<void> {\n try {\n const info = await stat(outputDir);\n if (!info.isDirectory()) {\n throw new Error(`Output path already exists and is not a directory: ${outputDir}`);\n }\n const entries = await readdir(outputDir);\n if (entries.length > 0) {\n throw new Error(`Output directory already exists and is not empty: ${outputDir}`);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : \"\";\n if (/ENOENT/.test(message)) {\n await mkdir(outputDir, { recursive: true });\n return;\n }\n throw error;\n }\n}\n\nasync function collectJsonFilesForArchive(\n outputDir: string,\n relativePaths: string[],\n): Promise<Record<string, string>> {\n const files: Record<string, string> = {};\n for (const relativePath of relativePaths) {\n const normalized = relativePath.replace(/\\\\/g, \"/\");\n files[normalized] = await readFile(path.join(outputDir, normalized), \"utf8\");\n }\n return files;\n}\n\nfunction sanitizeFileSegment(value: string): string {\n return value.replace(/[^a-zA-Z0-9._-]+/g, \"-\").replace(/^-+|-+$/g, \"\") || \"feedback\";\n}\n\nfunction writeUint16(target: Uint8Array, offset: number, value: number) {\n target[offset] = value & 0xff;\n target[offset + 1] = (value >>> 8) & 0xff;\n}\n\nfunction writeUint32(target: Uint8Array, offset: number, value: number) {\n target[offset] = value & 0xff;\n target[offset + 1] = (value >>> 8) & 0xff;\n target[offset + 2] = (value >>> 16) & 0xff;\n target[offset + 3] = (value >>> 24) & 0xff;\n}\n\nfunction crc32(bytes: Uint8Array) {\n let crc = 0xffffffff;\n for (const byte of bytes) {\n crc ^= byte;\n for (let bit = 0; bit < 8; bit += 1) {\n crc = (crc & 1) === 1 ? (crc >>> 1) ^ 0xedb88320 : crc >>> 1;\n }\n }\n return (crc ^ 0xffffffff) >>> 0;\n}\n\nfunction createStoredZipArchive(files: Record<string, string>, rootPath: string): Uint8Array {\n const encoder = new TextEncoder();\n const localChunks: Uint8Array[] = [];\n const centralChunks: Uint8Array[] = [];\n let localOffset = 0;\n let entryCount = 0;\n\n for (const [relativePath, content] of Object.entries(files).sort(([left], [right]) => left.localeCompare(right))) {\n const fileName = encoder.encode(`${rootPath}/${relativePath}`);\n const body = encoder.encode(content);\n const checksum = crc32(body);\n\n const localHeader = new Uint8Array(30 + fileName.length);\n writeUint32(localHeader, 0, 0x04034b50);\n writeUint16(localHeader, 4, 20);\n writeUint16(localHeader, 6, 0x0800);\n writeUint16(localHeader, 8, 0);\n writeUint32(localHeader, 14, checksum);\n writeUint32(localHeader, 18, body.length);\n writeUint32(localHeader, 22, body.length);\n writeUint16(localHeader, 26, fileName.length);\n localHeader.set(fileName, 30);\n\n const centralHeader = new Uint8Array(46 + fileName.length);\n writeUint32(centralHeader, 0, 0x02014b50);\n writeUint16(centralHeader, 4, 20);\n writeUint16(centralHeader, 6, 20);\n writeUint16(centralHeader, 8, 0x0800);\n writeUint16(centralHeader, 10, 0);\n writeUint32(centralHeader, 16, checksum);\n writeUint32(centralHeader, 20, body.length);\n writeUint32(centralHeader, 24, body.length);\n writeUint16(centralHeader, 28, fileName.length);\n writeUint32(centralHeader, 42, localOffset);\n centralHeader.set(fileName, 46);\n\n localChunks.push(localHeader, body);\n centralChunks.push(centralHeader);\n localOffset += localHeader.length + body.length;\n entryCount += 1;\n }\n\n const centralDirectoryLength = centralChunks.reduce((sum, chunk) => sum + chunk.length, 0);\n const archive = new Uint8Array(\n localChunks.reduce((sum, chunk) => sum + chunk.length, 0) + centralDirectoryLength + 22,\n );\n let offset = 0;\n for (const chunk of localChunks) {\n archive.set(chunk, offset);\n offset += chunk.length;\n }\n const centralDirectoryOffset = offset;\n for (const chunk of centralChunks) {\n archive.set(chunk, offset);\n offset += chunk.length;\n }\n writeUint32(archive, offset, 0x06054b50);\n writeUint16(archive, offset + 8, entryCount);\n writeUint16(archive, offset + 10, entryCount);\n writeUint32(archive, offset + 12, centralDirectoryLength);\n writeUint32(archive, offset + 16, centralDirectoryOffset);\n return archive;\n}\n", "import { Command } from \"commander\";\nimport { writeFile } from \"node:fs/promises\";\nimport {\n addIssueCommentSchema,\n checkoutIssueSchema,\n createIssueSchema,\n type FeedbackTrace,\n updateIssueSchema,\n type Issue,\n type IssueComment,\n} from \"@paperclipai/shared\";\nimport {\n addCommonClientOptions,\n formatInlineRecord,\n handleCommandError,\n printOutput,\n resolveCommandContext,\n type BaseClientOptions,\n} from \"./common.js\";\nimport {\n buildFeedbackTraceQuery,\n normalizeFeedbackTraceExportFormat,\n serializeFeedbackTraces,\n} from \"./feedback.js\";\n\ninterface IssueBaseOptions extends BaseClientOptions {\n status?: string;\n assigneeAgentId?: string;\n projectId?: string;\n match?: string;\n}\n\ninterface IssueCreateOptions extends BaseClientOptions {\n title: string;\n description?: string;\n status?: string;\n priority?: string;\n assigneeAgentId?: string;\n projectId?: string;\n goalId?: string;\n parentId?: string;\n requestDepth?: string;\n billingCode?: string;\n}\n\ninterface IssueUpdateOptions extends BaseClientOptions {\n title?: string;\n description?: string;\n status?: string;\n priority?: string;\n assigneeAgentId?: string;\n projectId?: string;\n goalId?: string;\n parentId?: string;\n requestDepth?: string;\n billingCode?: string;\n comment?: string;\n hiddenAt?: string;\n}\n\ninterface IssueCommentOptions extends BaseClientOptions {\n body: string;\n reopen?: boolean;\n}\n\ninterface IssueCheckoutOptions extends BaseClientOptions {\n agentId: string;\n expectedStatuses?: string;\n}\n\ninterface IssueFeedbackOptions extends BaseClientOptions {\n targetType?: string;\n vote?: string;\n status?: string;\n from?: string;\n to?: string;\n sharedOnly?: boolean;\n includePayload?: boolean;\n out?: string;\n format?: string;\n}\n\nexport function registerIssueCommands(program: Command): void {\n const issue = program.command(\"issue\").description(\"Issue operations\");\n\n addCommonClientOptions(\n issue\n .command(\"list\")\n .description(\"List issues for a company\")\n .option(\"-C, --company-id <id>\", \"Company ID\")\n .option(\"--status <csv>\", \"Comma-separated statuses\")\n .option(\"--assignee-agent-id <id>\", \"Filter by assignee agent ID\")\n .option(\"--project-id <id>\", \"Filter by project ID\")\n .option(\"--match <text>\", \"Local text match on identifier/title/description\")\n .action(async (opts: IssueBaseOptions) => {\n try {\n const ctx = resolveCommandContext(opts, { requireCompany: true });\n const params = new URLSearchParams();\n if (opts.status) params.set(\"status\", opts.status);\n if (opts.assigneeAgentId) params.set(\"assigneeAgentId\", opts.assigneeAgentId);\n if (opts.projectId) params.set(\"projectId\", opts.projectId);\n\n const query = params.toString();\n const path = `/api/companies/${ctx.companyId}/issues${query ? `?${query}` : \"\"}`;\n const rows = (await ctx.api.get<Issue[]>(path)) ?? [];\n\n const filtered = filterIssueRows(rows, opts.match);\n if (ctx.json) {\n printOutput(filtered, { json: true });\n return;\n }\n\n if (filtered.length === 0) {\n printOutput([], { json: false });\n return;\n }\n\n for (const item of filtered) {\n console.log(\n formatInlineRecord({\n identifier: item.identifier,\n id: item.id,\n status: item.status,\n priority: item.priority,\n assigneeAgentId: item.assigneeAgentId,\n title: item.title,\n projectId: item.projectId,\n }),\n );\n }\n } catch (err) {\n handleCommandError(err);\n }\n }),\n { includeCompany: false },\n );\n\n addCommonClientOptions(\n issue\n .command(\"get\")\n .description(\"Get an issue by UUID or identifier (e.g. PC-12)\")\n .argument(\"<idOrIdentifier>\", \"Issue ID or identifier\")\n .action(async (idOrIdentifier: string, opts: BaseClientOptions) => {\n try {\n const ctx = resolveCommandContext(opts);\n const row = await ctx.api.get<Issue>(`/api/issues/${idOrIdentifier}`);\n printOutput(row, { json: ctx.json });\n } catch (err) {\n handleCommandError(err);\n }\n }),\n );\n\n addCommonClientOptions(\n issue\n .command(\"create\")\n .description(\"Create an issue\")\n .requiredOption(\"-C, --company-id <id>\", \"Company ID\")\n .requiredOption(\"--title <title>\", \"Issue title\")\n .option(\"--description <text>\", \"Issue description\")\n .option(\"--status <status>\", \"Issue status\")\n .option(\"--priority <priority>\", \"Issue priority\")\n .option(\"--assignee-agent-id <id>\", \"Assignee agent ID\")\n .option(\"--project-id <id>\", \"Project ID\")\n .option(\"--goal-id <id>\", \"Goal ID\")\n .option(\"--parent-id <id>\", \"Parent issue ID\")\n .option(\"--request-depth <n>\", \"Request depth integer\")\n .option(\"--billing-code <code>\", \"Billing code\")\n .action(async (opts: IssueCreateOptions) => {\n try {\n const ctx = resolveCommandContext(opts, { requireCompany: true });\n const payload = createIssueSchema.parse({\n title: opts.title,\n description: opts.description,\n status: opts.status,\n priority: opts.priority,\n assigneeAgentId: opts.assigneeAgentId,\n projectId: opts.projectId,\n goalId: opts.goalId,\n parentId: opts.parentId,\n requestDepth: parseOptionalInt(opts.requestDepth),\n billingCode: opts.billingCode,\n });\n\n const created = await ctx.api.post<Issue>(`/api/companies/${ctx.companyId}/issues`, payload);\n printOutput(created, { json: ctx.json });\n } catch (err) {\n handleCommandError(err);\n }\n }),\n { includeCompany: false },\n );\n\n addCommonClientOptions(\n issue\n .command(\"update\")\n .description(\"Update an issue\")\n .argument(\"<issueId>\", \"Issue ID\")\n .option(\"--title <title>\", \"Issue title\")\n .option(\"--description <text>\", \"Issue description\")\n .option(\"--status <status>\", \"Issue status\")\n .option(\"--priority <priority>\", \"Issue priority\")\n .option(\"--assignee-agent-id <id>\", \"Assignee agent ID\")\n .option(\"--project-id <id>\", \"Project ID\")\n .option(\"--goal-id <id>\", \"Goal ID\")\n .option(\"--parent-id <id>\", \"Parent issue ID\")\n .option(\"--request-depth <n>\", \"Request depth integer\")\n .option(\"--billing-code <code>\", \"Billing code\")\n .option(\"--comment <text>\", \"Optional comment to add with update\")\n .option(\"--hidden-at <iso8601|null>\", \"Set hiddenAt timestamp or literal 'null'\")\n .action(async (issueId: string, opts: IssueUpdateOptions) => {\n try {\n const ctx = resolveCommandContext(opts);\n const payload = updateIssueSchema.parse({\n title: opts.title,\n description: opts.description,\n status: opts.status,\n priority: opts.priority,\n assigneeAgentId: opts.assigneeAgentId,\n projectId: opts.projectId,\n goalId: opts.goalId,\n parentId: opts.parentId,\n requestDepth: parseOptionalInt(opts.requestDepth),\n billingCode: opts.billingCode,\n comment: opts.comment,\n hiddenAt: parseHiddenAt(opts.hiddenAt),\n });\n\n const updated = await ctx.api.patch<Issue & { comment?: IssueComment | null }>(`/api/issues/${issueId}`, payload);\n printOutput(updated, { json: ctx.json });\n } catch (err) {\n handleCommandError(err);\n }\n }),\n );\n\n addCommonClientOptions(\n issue\n .command(\"comment\")\n .description(\"Add comment to issue\")\n .argument(\"<issueId>\", \"Issue ID\")\n .requiredOption(\"--body <text>\", \"Comment body\")\n .option(\"--reopen\", \"Reopen if issue is done/cancelled\")\n .action(async (issueId: string, opts: IssueCommentOptions) => {\n try {\n const ctx = resolveCommandContext(opts);\n const payload = addIssueCommentSchema.parse({\n body: opts.body,\n reopen: opts.reopen,\n });\n const comment = await ctx.api.post<IssueComment>(`/api/issues/${issueId}/comments`, payload);\n printOutput(comment, { json: ctx.json });\n } catch (err) {\n handleCommandError(err);\n }\n }),\n );\n\n addCommonClientOptions(\n issue\n .command(\"feedback:list\")\n .description(\"List feedback traces for an issue\")\n .argument(\"<issueId>\", \"Issue ID\")\n .option(\"--target-type <type>\", \"Filter by target type\")\n .option(\"--vote <vote>\", \"Filter by vote value\")\n .option(\"--status <status>\", \"Filter by trace status\")\n .option(\"--from <iso8601>\", \"Only include traces created at or after this timestamp\")\n .option(\"--to <iso8601>\", \"Only include traces created at or before this timestamp\")\n .option(\"--shared-only\", \"Only include traces eligible for sharing/export\")\n .option(\"--include-payload\", \"Include stored payload snapshots in the response\")\n .action(async (issueId: string, opts: IssueFeedbackOptions) => {\n try {\n const ctx = resolveCommandContext(opts);\n const traces = (await ctx.api.get<FeedbackTrace[]>(\n `/api/issues/${issueId}/feedback-traces${buildFeedbackTraceQuery(opts)}`,\n )) ?? [];\n if (ctx.json) {\n printOutput(traces, { json: true });\n return;\n }\n printOutput(\n traces.map((trace) => ({\n id: trace.id,\n issue: trace.issueIdentifier ?? trace.issueId,\n vote: trace.vote,\n status: trace.status,\n targetType: trace.targetType,\n target: trace.targetSummary.label,\n })),\n { json: false },\n );\n } catch (err) {\n handleCommandError(err);\n }\n }),\n );\n\n addCommonClientOptions(\n issue\n .command(\"feedback:export\")\n .description(\"Export feedback traces for an issue\")\n .argument(\"<issueId>\", \"Issue ID\")\n .option(\"--target-type <type>\", \"Filter by target type\")\n .option(\"--vote <vote>\", \"Filter by vote value\")\n .option(\"--status <status>\", \"Filter by trace status\")\n .option(\"--from <iso8601>\", \"Only include traces created at or after this timestamp\")\n .option(\"--to <iso8601>\", \"Only include traces created at or before this timestamp\")\n .option(\"--shared-only\", \"Only include traces eligible for sharing/export\")\n .option(\"--include-payload\", \"Include stored payload snapshots in the export\")\n .option(\"--out <path>\", \"Write export to a file path instead of stdout\")\n .option(\"--format <format>\", \"Export format: json or ndjson\", \"ndjson\")\n .action(async (issueId: string, opts: IssueFeedbackOptions) => {\n try {\n const ctx = resolveCommandContext(opts);\n const traces = (await ctx.api.get<FeedbackTrace[]>(\n `/api/issues/${issueId}/feedback-traces${buildFeedbackTraceQuery(opts, opts.includePayload ?? true)}`,\n )) ?? [];\n const serialized = serializeFeedbackTraces(traces, opts.format);\n if (opts.out?.trim()) {\n await writeFile(opts.out, serialized, \"utf8\");\n if (ctx.json) {\n printOutput(\n { out: opts.out, count: traces.length, format: normalizeFeedbackTraceExportFormat(opts.format) },\n { json: true },\n );\n return;\n }\n console.log(`Wrote ${traces.length} feedback trace(s) to ${opts.out}`);\n return;\n }\n process.stdout.write(`${serialized}${serialized.endsWith(\"\\n\") ? \"\" : \"\\n\"}`);\n } catch (err) {\n handleCommandError(err);\n }\n }),\n );\n\n addCommonClientOptions(\n issue\n .command(\"checkout\")\n .description(\"Checkout issue for an agent\")\n .argument(\"<issueId>\", \"Issue ID\")\n .requiredOption(\"--agent-id <id>\", \"Agent ID\")\n .option(\n \"--expected-statuses <csv>\",\n \"Expected current statuses\",\n \"todo,backlog,blocked\",\n )\n .action(async (issueId: string, opts: IssueCheckoutOptions) => {\n try {\n const ctx = resolveCommandContext(opts);\n const payload = checkoutIssueSchema.parse({\n agentId: opts.agentId,\n expectedStatuses: parseCsv(opts.expectedStatuses),\n });\n const updated = await ctx.api.post<Issue>(`/api/issues/${issueId}/checkout`, payload);\n printOutput(updated, { json: ctx.json });\n } catch (err) {\n handleCommandError(err);\n }\n }),\n );\n\n addCommonClientOptions(\n issue\n .command(\"release\")\n .description(\"Release issue back to todo and clear assignee\")\n .argument(\"<issueId>\", \"Issue ID\")\n .action(async (issueId: string, opts: BaseClientOptions) => {\n try {\n const ctx = resolveCommandContext(opts);\n const updated = await ctx.api.post<Issue>(`/api/issues/${issueId}/release`, {});\n printOutput(updated, { json: ctx.json });\n } catch (err) {\n handleCommandError(err);\n }\n }),\n );\n}\n\nfunction parseCsv(value: string | undefined): string[] {\n if (!value) return [];\n return value.split(\",\").map((v) => v.trim()).filter(Boolean);\n}\n\nfunction parseOptionalInt(value: string | undefined): number | undefined {\n if (value === undefined) return undefined;\n const parsed = Number.parseInt(value, 10);\n if (!Number.isFinite(parsed)) {\n throw new Error(`Invalid integer value: ${value}`);\n }\n return parsed;\n}\n\nfunction parseHiddenAt(value: string | undefined): string | null | undefined {\n if (value === undefined) return undefined;\n if (value.trim().toLowerCase() === \"null\") return null;\n return value;\n}\n\nfunction filterIssueRows(rows: Issue[], match: string | undefined): Issue[] {\n if (!match?.trim()) return rows;\n const needle = match.trim().toLowerCase();\n return rows.filter((row) => {\n const text = [row.identifier, row.title, row.description]\n .filter((part): part is string => Boolean(part))\n .join(\"\\n\")\n .toLowerCase();\n return text.includes(needle);\n });\n}\n", "import { spawn, type ChildProcess } from \"node:child_process\";\nimport { constants as fsConstants, promises as fs, type Dirent } from \"node:fs\";\nimport path from \"node:path\";\nimport type {\n AdapterSkillEntry,\n AdapterSkillSnapshot,\n} from \"./types.js\";\n\nexport interface RunProcessResult {\n exitCode: number | null;\n signal: string | null;\n timedOut: boolean;\n stdout: string;\n stderr: string;\n pid: number | null;\n startedAt: string | null;\n}\n\ninterface RunningProcess {\n child: ChildProcess;\n graceSec: number;\n}\n\ninterface SpawnTarget {\n command: string;\n args: string[];\n}\n\ntype ChildProcessWithEvents = ChildProcess & {\n on(event: \"error\", listener: (err: Error) => void): ChildProcess;\n on(\n event: \"close\",\n listener: (code: number | null, signal: NodeJS.Signals | null) => void,\n ): ChildProcess;\n};\n\nexport const runningProcesses = new Map<string, RunningProcess>();\nexport const MAX_CAPTURE_BYTES = 4 * 1024 * 1024;\nexport const MAX_EXCERPT_BYTES = 32 * 1024;\nconst SENSITIVE_ENV_KEY = /(key|token|secret|password|passwd|authorization|cookie)/i;\nconst PAPERCLIP_SKILL_ROOT_RELATIVE_CANDIDATES = [\n \"../../skills\",\n \"../../../../../skills\",\n];\n\nexport interface PaperclipSkillEntry {\n key: string;\n runtimeName: string;\n source: string;\n required?: boolean;\n requiredReason?: string | null;\n}\n\nexport interface InstalledSkillTarget {\n targetPath: string | null;\n kind: \"symlink\" | \"directory\" | \"file\";\n}\n\ninterface PersistentSkillSnapshotOptions {\n adapterType: string;\n availableEntries: PaperclipSkillEntry[];\n desiredSkills: string[];\n installed: Map<string, InstalledSkillTarget>;\n skillsHome: string;\n locationLabel?: string | null;\n installedDetail?: string | null;\n missingDetail: string;\n externalConflictDetail: string;\n externalDetail: string;\n warnings?: string[];\n}\n\nfunction normalizePathSlashes(value: string): string {\n return value.replaceAll(\"\\\\\", \"/\");\n}\n\nfunction isMaintainerOnlySkillTarget(candidate: string): boolean {\n return normalizePathSlashes(candidate).includes(\"/.agents/skills/\");\n}\n\nfunction skillLocationLabel(value: string | null | undefined): string | null {\n if (typeof value !== \"string\") return null;\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : null;\n}\n\nfunction buildManagedSkillOrigin(entry: { required?: boolean }): Pick<\n AdapterSkillEntry,\n \"origin\" | \"originLabel\" | \"readOnly\"\n> {\n if (entry.required) {\n return {\n origin: \"paperclip_required\",\n originLabel: \"Required by Paperclip\",\n readOnly: false,\n };\n }\n return {\n origin: \"company_managed\",\n originLabel: \"Managed by Paperclip\",\n readOnly: false,\n };\n}\n\nfunction resolveInstalledEntryTarget(\n skillsHome: string,\n entryName: string,\n dirent: Dirent,\n linkedPath: string | null,\n): InstalledSkillTarget {\n const fullPath = path.join(skillsHome, entryName);\n if (dirent.isSymbolicLink()) {\n return {\n targetPath: linkedPath ? path.resolve(path.dirname(fullPath), linkedPath) : null,\n kind: \"symlink\",\n };\n }\n if (dirent.isDirectory()) {\n return { targetPath: fullPath, kind: \"directory\" };\n }\n return { targetPath: fullPath, kind: \"file\" };\n}\n\nexport function parseObject(value: unknown): Record<string, unknown> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return {};\n }\n return value as Record<string, unknown>;\n}\n\nexport function asString(value: unknown, fallback: string): string {\n return typeof value === \"string\" && value.length > 0 ? value : fallback;\n}\n\nexport function asNumber(value: unknown, fallback: number): number {\n return typeof value === \"number\" && Number.isFinite(value) ? value : fallback;\n}\n\nexport function asBoolean(value: unknown, fallback: boolean): boolean {\n return typeof value === \"boolean\" ? value : fallback;\n}\n\nexport function asStringArray(value: unknown): string[] {\n return Array.isArray(value) ? value.filter((item): item is string => typeof item === \"string\") : [];\n}\n\nexport function parseJson(value: string): Record<string, unknown> | null {\n try {\n return JSON.parse(value) as Record<string, unknown>;\n } catch {\n return null;\n }\n}\n\nexport function appendWithCap(prev: string, chunk: string, cap = MAX_CAPTURE_BYTES) {\n const combined = prev + chunk;\n return combined.length > cap ? combined.slice(combined.length - cap) : combined;\n}\n\nexport function resolvePathValue(obj: Record<string, unknown>, dottedPath: string) {\n const parts = dottedPath.split(\".\");\n let cursor: unknown = obj;\n\n for (const part of parts) {\n if (typeof cursor !== \"object\" || cursor === null || Array.isArray(cursor)) {\n return \"\";\n }\n cursor = (cursor as Record<string, unknown>)[part];\n }\n\n if (cursor === null || cursor === undefined) return \"\";\n if (typeof cursor === \"string\") return cursor;\n if (typeof cursor === \"number\" || typeof cursor === \"boolean\") return String(cursor);\n\n try {\n return JSON.stringify(cursor);\n } catch {\n return \"\";\n }\n}\n\nexport function renderTemplate(template: string, data: Record<string, unknown>) {\n return template.replace(/{{\\s*([a-zA-Z0-9_.-]+)\\s*}}/g, (_, path) => resolvePathValue(data, path));\n}\n\nexport function joinPromptSections(\n sections: Array<string | null | undefined>,\n separator = \"\\n\\n\",\n) {\n return sections\n .map((value) => (typeof value === \"string\" ? value.trim() : \"\"))\n .filter(Boolean)\n .join(separator);\n}\n\nexport function redactEnvForLogs(env: Record<string, string>): Record<string, string> {\n const redacted: Record<string, string> = {};\n for (const [key, value] of Object.entries(env)) {\n redacted[key] = SENSITIVE_ENV_KEY.test(key) ? \"***REDACTED***\" : value;\n }\n return redacted;\n}\n\nexport function buildInvocationEnvForLogs(\n env: Record<string, string>,\n options: {\n runtimeEnv?: NodeJS.ProcessEnv | Record<string, string>;\n includeRuntimeKeys?: string[];\n resolvedCommand?: string | null;\n resolvedCommandEnvKey?: string;\n } = {},\n): Record<string, string> {\n const merged: Record<string, string> = { ...env };\n const runtimeEnv = options.runtimeEnv ?? {};\n\n for (const key of options.includeRuntimeKeys ?? []) {\n if (key in merged) continue;\n const value = runtimeEnv[key];\n if (typeof value !== \"string\" || value.length === 0) continue;\n merged[key] = value;\n }\n\n const resolvedCommand = options.resolvedCommand?.trim();\n if (resolvedCommand) {\n merged[options.resolvedCommandEnvKey ?? \"PAPERCLIP_RESOLVED_COMMAND\"] = resolvedCommand;\n }\n\n return redactEnvForLogs(merged);\n}\n\nexport function buildPaperclipEnv(agent: { id: string; companyId: string }): Record<string, string> {\n const resolveHostForUrl = (rawHost: string): string => {\n const host = rawHost.trim();\n if (!host || host === \"0.0.0.0\" || host === \"::\") return \"localhost\";\n if (host.includes(\":\") && !host.startsWith(\"[\") && !host.endsWith(\"]\")) return `[${host}]`;\n return host;\n };\n const vars: Record<string, string> = {\n PAPERCLIP_AGENT_ID: agent.id,\n PAPERCLIP_COMPANY_ID: agent.companyId,\n };\n const runtimeHost = resolveHostForUrl(\n process.env.PAPERCLIP_LISTEN_HOST ?? process.env.HOST ?? \"localhost\",\n );\n const runtimePort = process.env.PAPERCLIP_LISTEN_PORT ?? process.env.PORT ?? \"3100\";\n const apiUrl = process.env.PAPERCLIP_API_URL ?? `http://${runtimeHost}:${runtimePort}`;\n vars.PAPERCLIP_API_URL = apiUrl;\n return vars;\n}\n\nexport function defaultPathForPlatform() {\n if (process.platform === \"win32\") {\n return \"C:\\\\Windows\\\\System32;C:\\\\Windows;C:\\\\Windows\\\\System32\\\\Wbem\";\n }\n return \"/usr/local/bin:/opt/homebrew/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin\";\n}\n\nfunction windowsPathExts(env: NodeJS.ProcessEnv): string[] {\n return (env.PATHEXT ?? \".EXE;.CMD;.BAT;.COM\").split(\";\").filter(Boolean);\n}\n\nasync function pathExists(candidate: string) {\n try {\n await fs.access(candidate, process.platform === \"win32\" ? fsConstants.F_OK : fsConstants.X_OK);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function resolveCommandPath(command: string, cwd: string, env: NodeJS.ProcessEnv): Promise<string | null> {\n const hasPathSeparator = command.includes(\"/\") || command.includes(\"\\\\\");\n if (hasPathSeparator) {\n const absolute = path.isAbsolute(command) ? command : path.resolve(cwd, command);\n return (await pathExists(absolute)) ? absolute : null;\n }\n\n const pathValue = env.PATH ?? env.Path ?? \"\";\n const delimiter = process.platform === \"win32\" ? \";\" : \":\";\n const dirs = pathValue.split(delimiter).filter(Boolean);\n const exts = process.platform === \"win32\" ? windowsPathExts(env) : [\"\"];\n const hasExtension = process.platform === \"win32\" && path.extname(command).length > 0;\n\n for (const dir of dirs) {\n const candidates =\n process.platform === \"win32\"\n ? hasExtension\n ? [path.join(dir, command)]\n : exts.map((ext) => path.join(dir, `${command}${ext}`))\n : [path.join(dir, command)];\n for (const candidate of candidates) {\n if (await pathExists(candidate)) return candidate;\n }\n }\n\n return null;\n}\n\nexport async function resolveCommandForLogs(command: string, cwd: string, env: NodeJS.ProcessEnv): Promise<string> {\n return (await resolveCommandPath(command, cwd, env)) ?? command;\n}\n\nfunction quoteForCmd(arg: string) {\n if (!arg.length) return '\"\"';\n const escaped = arg.replace(/\"/g, '\"\"');\n return /[\\s\"&<>|^()]/.test(escaped) ? `\"${escaped}\"` : escaped;\n}\n\nasync function resolveSpawnTarget(\n command: string,\n args: string[],\n cwd: string,\n env: NodeJS.ProcessEnv,\n): Promise<SpawnTarget> {\n const resolved = await resolveCommandPath(command, cwd, env);\n const executable = resolved ?? command;\n\n if (process.platform !== \"win32\") {\n return { command: executable, args };\n }\n\n if (/\\.(cmd|bat)$/i.test(executable)) {\n const shell = env.ComSpec || process.env.ComSpec || \"cmd.exe\";\n const commandLine = [quoteForCmd(executable), ...args.map(quoteForCmd)].join(\" \");\n return {\n command: shell,\n args: [\"/d\", \"/s\", \"/c\", commandLine],\n };\n }\n\n return { command: executable, args };\n}\n\nexport function ensurePathInEnv(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\n if (typeof env.PATH === \"string\" && env.PATH.length > 0) return env;\n if (typeof env.Path === \"string\" && env.Path.length > 0) return env;\n return { ...env, PATH: defaultPathForPlatform() };\n}\n\nexport async function ensureAbsoluteDirectory(\n cwd: string,\n opts: { createIfMissing?: boolean } = {},\n) {\n if (!path.isAbsolute(cwd)) {\n throw new Error(`Working directory must be an absolute path: \"${cwd}\"`);\n }\n\n const assertDirectory = async () => {\n const stats = await fs.stat(cwd);\n if (!stats.isDirectory()) {\n throw new Error(`Working directory is not a directory: \"${cwd}\"`);\n }\n };\n\n try {\n await assertDirectory();\n return;\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (!opts.createIfMissing || code !== \"ENOENT\") {\n if (code === \"ENOENT\") {\n throw new Error(`Working directory does not exist: \"${cwd}\"`);\n }\n throw err instanceof Error ? err : new Error(String(err));\n }\n }\n\n try {\n await fs.mkdir(cwd, { recursive: true });\n await assertDirectory();\n } catch (err) {\n const reason = err instanceof Error ? err.message : String(err);\n throw new Error(`Could not create working directory \"${cwd}\": ${reason}`);\n }\n}\n\nexport async function resolvePaperclipSkillsDir(\n moduleDir: string,\n additionalCandidates: string[] = [],\n): Promise<string | null> {\n const candidates = [\n ...PAPERCLIP_SKILL_ROOT_RELATIVE_CANDIDATES.map((relativePath) => path.resolve(moduleDir, relativePath)),\n ...additionalCandidates.map((candidate) => path.resolve(candidate)),\n ];\n const seenRoots = new Set<string>();\n\n for (const root of candidates) {\n if (seenRoots.has(root)) continue;\n seenRoots.add(root);\n const isDirectory = await fs.stat(root).then((stats) => stats.isDirectory()).catch(() => false);\n if (isDirectory) return root;\n }\n\n return null;\n}\n\nexport async function listPaperclipSkillEntries(\n moduleDir: string,\n additionalCandidates: string[] = [],\n): Promise<PaperclipSkillEntry[]> {\n const root = await resolvePaperclipSkillsDir(moduleDir, additionalCandidates);\n if (!root) return [];\n\n try {\n const entries = await fs.readdir(root, { withFileTypes: true });\n return entries\n .filter((entry) => entry.isDirectory())\n .map((entry) => ({\n key: `paperclipai/paperclip/${entry.name}`,\n runtimeName: entry.name,\n source: path.join(root, entry.name),\n required: true,\n requiredReason: \"Bundled Paperclip skills are always available for local adapters.\",\n }));\n } catch {\n return [];\n }\n}\n\nexport async function readInstalledSkillTargets(skillsHome: string): Promise<Map<string, InstalledSkillTarget>> {\n const entries = await fs.readdir(skillsHome, { withFileTypes: true }).catch(() => []);\n const out = new Map<string, InstalledSkillTarget>();\n for (const entry of entries) {\n const fullPath = path.join(skillsHome, entry.name);\n const linkedPath = entry.isSymbolicLink() ? await fs.readlink(fullPath).catch(() => null) : null;\n out.set(entry.name, resolveInstalledEntryTarget(skillsHome, entry.name, entry, linkedPath));\n }\n return out;\n}\n\nexport function buildPersistentSkillSnapshot(\n options: PersistentSkillSnapshotOptions,\n): AdapterSkillSnapshot {\n const {\n adapterType,\n availableEntries,\n desiredSkills,\n installed,\n skillsHome,\n locationLabel,\n installedDetail,\n missingDetail,\n externalConflictDetail,\n externalDetail,\n } = options;\n const availableByKey = new Map(availableEntries.map((entry) => [entry.key, entry]));\n const desiredSet = new Set(desiredSkills);\n const entries: AdapterSkillEntry[] = [];\n const warnings = [...(options.warnings ?? [])];\n\n for (const available of availableEntries) {\n const installedEntry = installed.get(available.runtimeName) ?? null;\n const desired = desiredSet.has(available.key);\n let state: AdapterSkillEntry[\"state\"] = \"available\";\n let managed = false;\n let detail: string | null = null;\n\n if (installedEntry?.targetPath === available.source) {\n managed = true;\n state = desired ? \"installed\" : \"stale\";\n detail = installedDetail ?? null;\n } else if (installedEntry) {\n state = \"external\";\n detail = desired ? externalConflictDetail : externalDetail;\n } else if (desired) {\n state = \"missing\";\n detail = missingDetail;\n }\n\n entries.push({\n key: available.key,\n runtimeName: available.runtimeName,\n desired,\n managed,\n state,\n sourcePath: available.source,\n targetPath: path.join(skillsHome, available.runtimeName),\n detail,\n required: Boolean(available.required),\n requiredReason: available.requiredReason ?? null,\n ...buildManagedSkillOrigin(available),\n });\n }\n\n for (const desiredSkill of desiredSkills) {\n if (availableByKey.has(desiredSkill)) continue;\n warnings.push(`Desired skill \"${desiredSkill}\" is not available from the Paperclip skills directory.`);\n entries.push({\n key: desiredSkill,\n runtimeName: null,\n desired: true,\n managed: true,\n state: \"missing\",\n sourcePath: null,\n targetPath: null,\n detail: \"Paperclip cannot find this skill in the local runtime skills directory.\",\n origin: \"external_unknown\",\n originLabel: \"External or unavailable\",\n readOnly: false,\n });\n }\n\n for (const [name, installedEntry] of installed.entries()) {\n if (availableEntries.some((entry) => entry.runtimeName === name)) continue;\n entries.push({\n key: name,\n runtimeName: name,\n desired: false,\n managed: false,\n state: \"external\",\n origin: \"user_installed\",\n originLabel: \"User-installed\",\n locationLabel: skillLocationLabel(locationLabel),\n readOnly: true,\n sourcePath: null,\n targetPath: installedEntry.targetPath ?? path.join(skillsHome, name),\n detail: externalDetail,\n });\n }\n\n entries.sort((left, right) => left.key.localeCompare(right.key));\n\n return {\n adapterType,\n supported: true,\n mode: \"persistent\",\n desiredSkills,\n entries,\n warnings,\n };\n}\n\nfunction normalizeConfiguredPaperclipRuntimeSkills(value: unknown): PaperclipSkillEntry[] {\n if (!Array.isArray(value)) return [];\n const out: PaperclipSkillEntry[] = [];\n for (const rawEntry of value) {\n const entry = parseObject(rawEntry);\n const key = asString(entry.key, asString(entry.name, \"\")).trim();\n const runtimeName = asString(entry.runtimeName, asString(entry.name, \"\")).trim();\n const source = asString(entry.source, \"\").trim();\n if (!key || !runtimeName || !source) continue;\n out.push({\n key,\n runtimeName,\n source,\n required: asBoolean(entry.required, false),\n requiredReason:\n typeof entry.requiredReason === \"string\" && entry.requiredReason.trim().length > 0\n ? entry.requiredReason.trim()\n : null,\n });\n }\n return out;\n}\n\nexport async function readPaperclipRuntimeSkillEntries(\n config: Record<string, unknown>,\n moduleDir: string,\n additionalCandidates: string[] = [],\n): Promise<PaperclipSkillEntry[]> {\n const configuredEntries = normalizeConfiguredPaperclipRuntimeSkills(config.paperclipRuntimeSkills);\n if (configuredEntries.length > 0) return configuredEntries;\n return listPaperclipSkillEntries(moduleDir, additionalCandidates);\n}\n\nexport async function readPaperclipSkillMarkdown(\n moduleDir: string,\n skillKey: string,\n): Promise<string | null> {\n const normalized = skillKey.trim().toLowerCase();\n if (!normalized) return null;\n\n const entries = await listPaperclipSkillEntries(moduleDir);\n const match = entries.find((entry) => entry.key === normalized);\n if (!match) return null;\n\n try {\n return await fs.readFile(path.join(match.source, \"SKILL.md\"), \"utf8\");\n } catch {\n return null;\n }\n}\n\nexport function readPaperclipSkillSyncPreference(config: Record<string, unknown>): {\n explicit: boolean;\n desiredSkills: string[];\n} {\n const raw = config.paperclipSkillSync;\n if (typeof raw !== \"object\" || raw === null || Array.isArray(raw)) {\n return { explicit: false, desiredSkills: [] };\n }\n const syncConfig = raw as Record<string, unknown>;\n const desiredValues = syncConfig.desiredSkills;\n const desired = Array.isArray(desiredValues)\n ? desiredValues\n .filter((value): value is string => typeof value === \"string\")\n .map((value) => value.trim())\n .filter(Boolean)\n : [];\n return {\n explicit: Object.prototype.hasOwnProperty.call(raw, \"desiredSkills\"),\n desiredSkills: Array.from(new Set(desired)),\n };\n}\n\nfunction canonicalizeDesiredPaperclipSkillReference(\n reference: string,\n availableEntries: Array<{ key: string; runtimeName?: string | null }>,\n): string {\n const normalizedReference = reference.trim().toLowerCase();\n if (!normalizedReference) return \"\";\n\n const exactKey = availableEntries.find((entry) => entry.key.trim().toLowerCase() === normalizedReference);\n if (exactKey) return exactKey.key;\n\n const byRuntimeName = availableEntries.filter((entry) =>\n typeof entry.runtimeName === \"string\" && entry.runtimeName.trim().toLowerCase() === normalizedReference,\n );\n if (byRuntimeName.length === 1) return byRuntimeName[0]!.key;\n\n const slugMatches = availableEntries.filter((entry) =>\n entry.key.trim().toLowerCase().split(\"/\").pop() === normalizedReference,\n );\n if (slugMatches.length === 1) return slugMatches[0]!.key;\n\n return normalizedReference;\n}\n\nexport function resolvePaperclipDesiredSkillNames(\n config: Record<string, unknown>,\n availableEntries: Array<{ key: string; runtimeName?: string | null; required?: boolean }>,\n): string[] {\n const preference = readPaperclipSkillSyncPreference(config);\n const requiredSkills = availableEntries\n .filter((entry) => entry.required)\n .map((entry) => entry.key);\n if (!preference.explicit) {\n return Array.from(new Set(requiredSkills));\n }\n const desiredSkills = preference.desiredSkills\n .map((reference) => canonicalizeDesiredPaperclipSkillReference(reference, availableEntries))\n .filter(Boolean);\n return Array.from(new Set([...requiredSkills, ...desiredSkills]));\n}\n\nexport function writePaperclipSkillSyncPreference(\n config: Record<string, unknown>,\n desiredSkills: string[],\n): Record<string, unknown> {\n const next = { ...config };\n const raw = next.paperclipSkillSync;\n const current =\n typeof raw === \"object\" && raw !== null && !Array.isArray(raw)\n ? { ...(raw as Record<string, unknown>) }\n : {};\n current.desiredSkills = Array.from(\n new Set(\n desiredSkills\n .map((value) => value.trim())\n .filter(Boolean),\n ),\n );\n next.paperclipSkillSync = current;\n return next;\n}\n\nexport async function ensurePaperclipSkillSymlink(\n source: string,\n target: string,\n linkSkill: (source: string, target: string) => Promise<void> = (linkSource, linkTarget) =>\n fs.symlink(linkSource, linkTarget),\n): Promise<\"created\" | \"repaired\" | \"skipped\"> {\n const existing = await fs.lstat(target).catch(() => null);\n if (!existing) {\n await linkSkill(source, target);\n return \"created\";\n }\n\n if (!existing.isSymbolicLink()) {\n return \"skipped\";\n }\n\n const linkedPath = await fs.readlink(target).catch(() => null);\n if (!linkedPath) return \"skipped\";\n\n const resolvedLinkedPath = path.resolve(path.dirname(target), linkedPath);\n if (resolvedLinkedPath === source) {\n return \"skipped\";\n }\n\n const linkedPathExists = await fs.stat(resolvedLinkedPath).then(() => true).catch(() => false);\n if (linkedPathExists) {\n return \"skipped\";\n }\n\n await fs.unlink(target);\n await linkSkill(source, target);\n return \"repaired\";\n}\n\nexport async function removeMaintainerOnlySkillSymlinks(\n skillsHome: string,\n allowedSkillNames: Iterable<string>,\n): Promise<string[]> {\n const allowed = new Set(Array.from(allowedSkillNames));\n try {\n const entries = await fs.readdir(skillsHome, { withFileTypes: true });\n const removed: string[] = [];\n for (const entry of entries) {\n if (allowed.has(entry.name)) continue;\n\n const target = path.join(skillsHome, entry.name);\n const existing = await fs.lstat(target).catch(() => null);\n if (!existing?.isSymbolicLink()) continue;\n\n const linkedPath = await fs.readlink(target).catch(() => null);\n if (!linkedPath) continue;\n\n const resolvedLinkedPath = path.isAbsolute(linkedPath)\n ? linkedPath\n : path.resolve(path.dirname(target), linkedPath);\n if (\n !isMaintainerOnlySkillTarget(linkedPath) &&\n !isMaintainerOnlySkillTarget(resolvedLinkedPath)\n ) {\n continue;\n }\n\n await fs.unlink(target);\n removed.push(entry.name);\n }\n\n return removed;\n } catch {\n return [];\n }\n}\n\nexport async function ensureCommandResolvable(command: string, cwd: string, env: NodeJS.ProcessEnv) {\n const resolved = await resolveCommandPath(command, cwd, env);\n if (resolved) return;\n if (command.includes(\"/\") || command.includes(\"\\\\\")) {\n const absolute = path.isAbsolute(command) ? command : path.resolve(cwd, command);\n throw new Error(`Command is not executable: \"${command}\" (resolved: \"${absolute}\")`);\n }\n throw new Error(`Command not found in PATH: \"${command}\"`);\n}\n\nexport async function runChildProcess(\n runId: string,\n command: string,\n args: string[],\n opts: {\n cwd: string;\n env: Record<string, string>;\n timeoutSec: number;\n graceSec: number;\n onLog: (stream: \"stdout\" | \"stderr\", chunk: string) => Promise<void>;\n onLogError?: (err: unknown, runId: string, message: string) => void;\n onSpawn?: (meta: { pid: number; startedAt: string }) => Promise<void>;\n stdin?: string;\n },\n): Promise<RunProcessResult> {\n const onLogError = opts.onLogError ?? ((err, id, msg) => console.warn({ err, runId: id }, msg));\n\n return new Promise<RunProcessResult>((resolve, reject) => {\n const rawMerged: NodeJS.ProcessEnv = { ...process.env, ...opts.env };\n\n // Strip Claude Code nesting-guard env vars so spawned `claude` processes\n // don't refuse to start with \"cannot be launched inside another session\".\n // These vars leak in when the Paperclip server itself is started from\n // within a Claude Code session (e.g. `npx paperclipai run` in a terminal\n // owned by Claude Code) or when cron inherits a contaminated shell env.\n const CLAUDE_CODE_NESTING_VARS = [\n \"CLAUDECODE\",\n \"CLAUDE_CODE_ENTRYPOINT\",\n \"CLAUDE_CODE_SESSION\",\n \"CLAUDE_CODE_PARENT_SESSION\",\n ] as const;\n for (const key of CLAUDE_CODE_NESTING_VARS) {\n delete rawMerged[key];\n }\n\n const mergedEnv = ensurePathInEnv(rawMerged);\n void resolveSpawnTarget(command, args, opts.cwd, mergedEnv)\n .then((target) => {\n const child = spawn(target.command, target.args, {\n cwd: opts.cwd,\n env: mergedEnv,\n shell: false,\n stdio: [opts.stdin != null ? \"pipe\" : \"ignore\", \"pipe\", \"pipe\"],\n }) as ChildProcessWithEvents;\n const startedAt = new Date().toISOString();\n\n if (opts.stdin != null && child.stdin) {\n child.stdin.write(opts.stdin);\n child.stdin.end();\n }\n\n if (typeof child.pid === \"number\" && child.pid > 0 && opts.onSpawn) {\n void opts.onSpawn({ pid: child.pid, startedAt }).catch((err) => {\n onLogError(err, runId, \"failed to record child process metadata\");\n });\n }\n\n runningProcesses.set(runId, { child, graceSec: opts.graceSec });\n\n let timedOut = false;\n let stdout = \"\";\n let stderr = \"\";\n let logChain: Promise<void> = Promise.resolve();\n\n const timeout =\n opts.timeoutSec > 0\n ? setTimeout(() => {\n timedOut = true;\n child.kill(\"SIGTERM\");\n setTimeout(() => {\n if (!child.killed) {\n child.kill(\"SIGKILL\");\n }\n }, Math.max(1, opts.graceSec) * 1000);\n }, opts.timeoutSec * 1000)\n : null;\n\n child.stdout?.on(\"data\", (chunk: unknown) => {\n const text = String(chunk);\n stdout = appendWithCap(stdout, text);\n logChain = logChain\n .then(() => opts.onLog(\"stdout\", text))\n .catch((err) => onLogError(err, runId, \"failed to append stdout log chunk\"));\n });\n\n child.stderr?.on(\"data\", (chunk: unknown) => {\n const text = String(chunk);\n stderr = appendWithCap(stderr, text);\n logChain = logChain\n .then(() => opts.onLog(\"stderr\", text))\n .catch((err) => onLogError(err, runId, \"failed to append stderr log chunk\"));\n });\n\n child.on(\"error\", (err: Error) => {\n if (timeout) clearTimeout(timeout);\n runningProcesses.delete(runId);\n const errno = (err as NodeJS.ErrnoException).code;\n const pathValue = mergedEnv.PATH ?? mergedEnv.Path ?? \"\";\n const msg =\n errno === \"ENOENT\"\n ? `Failed to start command \"${command}\" in \"${opts.cwd}\". Verify adapter command, working directory, and PATH (${pathValue}).`\n : `Failed to start command \"${command}\" in \"${opts.cwd}\": ${err.message}`;\n reject(new Error(msg));\n });\n\n child.on(\"close\", (code: number | null, signal: NodeJS.Signals | null) => {\n if (timeout) clearTimeout(timeout);\n runningProcesses.delete(runId);\n void logChain.finally(() => {\n resolve({\n exitCode: code,\n signal,\n timedOut,\n stdout,\n stderr,\n pid: child.pid ?? null,\n startedAt,\n });\n });\n });\n })\n .catch(reject);\n });\n}\n", "import { Command } from \"commander\";\nimport type { Agent } from \"@paperclipai/shared\";\nimport {\n removeMaintainerOnlySkillSymlinks,\n resolvePaperclipSkillsDir,\n} from \"@paperclipai/adapter-utils/server-utils\";\nimport fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport {\n addCommonClientOptions,\n formatInlineRecord,\n handleCommandError,\n printOutput,\n resolveCommandContext,\n type BaseClientOptions,\n} from \"./common.js\";\n\ninterface AgentListOptions extends BaseClientOptions {\n companyId?: string;\n}\n\ninterface AgentLocalCliOptions extends BaseClientOptions {\n companyId?: string;\n keyName?: string;\n installSkills?: boolean;\n}\n\ninterface CreatedAgentKey {\n id: string;\n name: string;\n token: string;\n createdAt: string;\n}\n\ninterface SkillsInstallSummary {\n tool: \"codex\" | \"claude\";\n target: string;\n linked: string[];\n removed: string[];\n skipped: string[];\n failed: Array<{ name: string; error: string }>;\n}\n\nconst __moduleDir = path.dirname(fileURLToPath(import.meta.url));\n\nfunction codexSkillsHome(): string {\n const fromEnv = process.env.CODEX_HOME?.trim();\n const base = fromEnv && fromEnv.length > 0 ? fromEnv : path.join(os.homedir(), \".codex\");\n return path.join(base, \"skills\");\n}\n\nfunction claudeSkillsHome(): string {\n const fromEnv = process.env.CLAUDE_HOME?.trim();\n const base = fromEnv && fromEnv.length > 0 ? fromEnv : path.join(os.homedir(), \".claude\");\n return path.join(base, \"skills\");\n}\n\nasync function installSkillsForTarget(\n sourceSkillsDir: string,\n targetSkillsDir: string,\n tool: \"codex\" | \"claude\",\n): Promise<SkillsInstallSummary> {\n const summary: SkillsInstallSummary = {\n tool,\n target: targetSkillsDir,\n linked: [],\n removed: [],\n skipped: [],\n failed: [],\n };\n\n await fs.mkdir(targetSkillsDir, { recursive: true });\n const entries = await fs.readdir(sourceSkillsDir, { withFileTypes: true });\n summary.removed = await removeMaintainerOnlySkillSymlinks(\n targetSkillsDir,\n entries.filter((entry) => entry.isDirectory()).map((entry) => entry.name),\n );\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n const source = path.join(sourceSkillsDir, entry.name);\n const target = path.join(targetSkillsDir, entry.name);\n const existing = await fs.lstat(target).catch(() => null);\n if (existing) {\n if (existing.isSymbolicLink()) {\n let linkedPath: string | null = null;\n try {\n linkedPath = await fs.readlink(target);\n } catch (err) {\n await fs.unlink(target);\n try {\n await fs.symlink(source, target);\n summary.linked.push(entry.name);\n continue;\n } catch (linkErr) {\n summary.failed.push({\n name: entry.name,\n error:\n err instanceof Error && linkErr instanceof Error\n ? `${err.message}; then ${linkErr.message}`\n : err instanceof Error\n ? err.message\n : `Failed to recover broken symlink: ${String(err)}`,\n });\n continue;\n }\n }\n\n const resolvedLinkedPath = path.isAbsolute(linkedPath)\n ? linkedPath\n : path.resolve(path.dirname(target), linkedPath);\n const linkedTargetExists = await fs\n .stat(resolvedLinkedPath)\n .then(() => true)\n .catch(() => false);\n\n if (!linkedTargetExists) {\n await fs.unlink(target);\n } else {\n summary.skipped.push(entry.name);\n continue;\n }\n } else {\n summary.skipped.push(entry.name);\n continue;\n }\n }\n\n try {\n await fs.symlink(source, target);\n summary.linked.push(entry.name);\n } catch (err) {\n summary.failed.push({\n name: entry.name,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n return summary;\n}\n\nfunction buildAgentEnvExports(input: {\n apiBase: string;\n companyId: string;\n agentId: string;\n apiKey: string;\n}): string {\n const escaped = (value: string) => value.replace(/'/g, \"'\\\"'\\\"'\");\n return [\n `export PAPERCLIP_API_URL='${escaped(input.apiBase)}'`,\n `export PAPERCLIP_COMPANY_ID='${escaped(input.companyId)}'`,\n `export PAPERCLIP_AGENT_ID='${escaped(input.agentId)}'`,\n `export PAPERCLIP_API_KEY='${escaped(input.apiKey)}'`,\n ].join(\"\\n\");\n}\n\nexport function registerAgentCommands(program: Command): void {\n const agent = program.command(\"agent\").description(\"Agent operations\");\n\n addCommonClientOptions(\n agent\n .command(\"list\")\n .description(\"List agents for a company\")\n .requiredOption(\"-C, --company-id <id>\", \"Company ID\")\n .action(async (opts: AgentListOptions) => {\n try {\n const ctx = resolveCommandContext(opts, { requireCompany: true });\n const rows = (await ctx.api.get<Agent[]>(`/api/companies/${ctx.companyId}/agents`)) ?? [];\n\n if (ctx.json) {\n printOutput(rows, { json: true });\n return;\n }\n\n if (rows.length === 0) {\n printOutput([], { json: false });\n return;\n }\n\n for (const row of rows) {\n console.log(\n formatInlineRecord({\n id: row.id,\n name: row.name,\n role: row.role,\n status: row.status,\n reportsTo: row.reportsTo,\n budgetMonthlyCents: row.budgetMonthlyCents,\n spentMonthlyCents: row.spentMonthlyCents,\n }),\n );\n }\n } catch (err) {\n handleCommandError(err);\n }\n }),\n { includeCompany: false },\n );\n\n addCommonClientOptions(\n agent\n .command(\"get\")\n .description(\"Get one agent\")\n .argument(\"<agentId>\", \"Agent ID\")\n .action(async (agentId: string, opts: BaseClientOptions) => {\n try {\n const ctx = resolveCommandContext(opts);\n const row = await ctx.api.get<Agent>(`/api/agents/${agentId}`);\n printOutput(row, { json: ctx.json });\n } catch (err) {\n handleCommandError(err);\n }\n }),\n );\n\n addCommonClientOptions(\n agent\n .command(\"local-cli\")\n .description(\n \"Create an agent API key, install local Relay Control skills for Codex/Claude, and print shell exports\",\n )\n .argument(\"<agentRef>\", \"Agent ID or shortname/url-key\")\n .requiredOption(\"-C, --company-id <id>\", \"Company ID\")\n .option(\"--key-name <name>\", \"API key label\", \"local-cli\")\n .option(\n \"--no-install-skills\",\n \"Skip installing Relay Control skills into ~/.codex/skills and ~/.claude/skills\",\n )\n .action(async (agentRef: string, opts: AgentLocalCliOptions) => {\n try {\n const ctx = resolveCommandContext(opts, { requireCompany: true });\n const query = new URLSearchParams({ companyId: ctx.companyId ?? \"\" });\n const agentRow = await ctx.api.get<Agent>(\n `/api/agents/${encodeURIComponent(agentRef)}?${query.toString()}`,\n );\n if (!agentRow) {\n throw new Error(`Agent not found: ${agentRef}`);\n }\n\n const now = new Date().toISOString().replaceAll(\":\", \"-\");\n const keyName = opts.keyName?.trim() ? opts.keyName.trim() : `local-cli-${now}`;\n const key = await ctx.api.post<CreatedAgentKey>(`/api/agents/${agentRow.id}/keys`, { name: keyName });\n if (!key) {\n throw new Error(\"Failed to create API key\");\n }\n\n const installSummaries: SkillsInstallSummary[] = [];\n if (opts.installSkills !== false) {\n const skillsDir = await resolvePaperclipSkillsDir(__moduleDir, [path.resolve(process.cwd(), \"skills\")]);\n if (!skillsDir) {\n throw new Error(\n \"Could not locate local Relay Control skills directory. Expected ./skills in the repo checkout.\",\n );\n }\n\n installSummaries.push(\n await installSkillsForTarget(skillsDir, codexSkillsHome(), \"codex\"),\n await installSkillsForTarget(skillsDir, claudeSkillsHome(), \"claude\"),\n );\n }\n\n const exportsText = buildAgentEnvExports({\n apiBase: ctx.api.apiBase,\n companyId: agentRow.companyId,\n agentId: agentRow.id,\n apiKey: key.token,\n });\n\n if (ctx.json) {\n printOutput(\n {\n agent: {\n id: agentRow.id,\n name: agentRow.name,\n urlKey: agentRow.urlKey,\n companyId: agentRow.companyId,\n },\n key: {\n id: key.id,\n name: key.name,\n createdAt: key.createdAt,\n token: key.token,\n },\n skills: installSummaries,\n exports: exportsText,\n },\n { json: true },\n );\n return;\n }\n\n console.log(`Agent: ${agentRow.name} (${agentRow.id})`);\n console.log(`API key created: ${key.name} (${key.id})`);\n if (installSummaries.length > 0) {\n for (const summary of installSummaries) {\n console.log(\n `${summary.tool}: linked=${summary.linked.length} removed=${summary.removed.length} skipped=${summary.skipped.length} failed=${summary.failed.length} target=${summary.target}`,\n );\n for (const failed of summary.failed) {\n console.log(` failed ${failed.name}: ${failed.error}`);\n }\n }\n }\n console.log(\"\");\n console.log(\"# Run this in your shell before launching codex/claude:\");\n console.log(exportsText);\n } catch (err) {\n handleCommandError(err);\n }\n }),\n { includeCompany: false },\n );\n}\n", "import { Command } from \"commander\";\nimport {\n createApprovalSchema,\n requestApprovalRevisionSchema,\n resolveApprovalSchema,\n resubmitApprovalSchema,\n type Approval,\n type ApprovalComment,\n} from \"@paperclipai/shared\";\nimport {\n addCommonClientOptions,\n formatInlineRecord,\n handleCommandError,\n printOutput,\n resolveCommandContext,\n type BaseClientOptions,\n} from \"./common.js\";\n\ninterface ApprovalListOptions extends BaseClientOptions {\n companyId?: string;\n status?: string;\n}\n\ninterface ApprovalDecisionOptions extends BaseClientOptions {\n decisionNote?: string;\n decidedByUserId?: string;\n}\n\ninterface ApprovalCreateOptions extends BaseClientOptions {\n companyId?: string;\n type: string;\n requestedByAgentId?: string;\n payload: string;\n issueIds?: string;\n}\n\ninterface ApprovalResubmitOptions extends BaseClientOptions {\n payload?: string;\n}\n\ninterface ApprovalCommentOptions extends BaseClientOptions {\n body: string;\n}\n\nexport function registerApprovalCommands(program: Command): void {\n const approval = program.command(\"approval\").description(\"Approval operations\");\n\n addCommonClientOptions(\n approval\n .command(\"list\")\n .description(\"List approvals for a company\")\n .requiredOption(\"-C, --company-id <id>\", \"Company ID\")\n .option(\"--status <status>\", \"Status filter\")\n .action(async (opts: ApprovalListOptions) => {\n try {\n const ctx = resolveCommandContext(opts, { requireCompany: true });\n const params = new URLSearchParams();\n if (opts.status) params.set(\"status\", opts.status);\n const query = params.toString();\n const rows =\n (await ctx.api.get<Approval[]>(\n `/api/companies/${ctx.companyId}/approvals${query ? `?${query}` : \"\"}`,\n )) ?? [];\n\n if (ctx.json) {\n printOutput(rows, { json: true });\n return;\n }\n\n if (rows.length === 0) {\n printOutput([], { json: false });\n return;\n }\n\n for (const row of rows) {\n console.log(\n formatInlineRecord({\n id: row.id,\n type: row.type,\n status: row.status,\n requestedByAgentId: row.requestedByAgentId,\n requestedByUserId: row.requestedByUserId,\n }),\n );\n }\n } catch (err) {\n handleCommandError(err);\n }\n }),\n { includeCompany: false },\n );\n\n addCommonClientOptions(\n approval\n .command(\"get\")\n .description(\"Get one approval\")\n .argument(\"<approvalId>\", \"Approval ID\")\n .action(async (approvalId: string, opts: BaseClientOptions) => {\n try {\n const ctx = resolveCommandContext(opts);\n const row = await ctx.api.get<Approval>(`/api/approvals/${approvalId}`);\n printOutput(row, { json: ctx.json });\n } catch (err) {\n handleCommandError(err);\n }\n }),\n );\n\n addCommonClientOptions(\n approval\n .command(\"create\")\n .description(\"Create an approval request\")\n .requiredOption(\"-C, --company-id <id>\", \"Company ID\")\n .requiredOption(\"--type <type>\", \"Approval type (hire_agent|approve_ceo_strategy)\")\n .requiredOption(\"--payload <json>\", \"Approval payload as JSON object\")\n .option(\"--requested-by-agent-id <id>\", \"Requesting agent ID\")\n .option(\"--issue-ids <csv>\", \"Comma-separated linked issue IDs\")\n .action(async (opts: ApprovalCreateOptions) => {\n try {\n const ctx = resolveCommandContext(opts, { requireCompany: true });\n const payloadJson = parseJsonObject(opts.payload, \"payload\");\n const payload = createApprovalSchema.parse({\n type: opts.type,\n payload: payloadJson,\n requestedByAgentId: opts.requestedByAgentId,\n issueIds: parseCsv(opts.issueIds),\n });\n const created = await ctx.api.post<Approval>(`/api/companies/${ctx.companyId}/approvals`, payload);\n printOutput(created, { json: ctx.json });\n } catch (err) {\n handleCommandError(err);\n }\n }),\n { includeCompany: false },\n );\n\n addCommonClientOptions(\n approval\n .command(\"approve\")\n .description(\"Approve an approval request\")\n .argument(\"<approvalId>\", \"Approval ID\")\n .option(\"--decision-note <text>\", \"Decision note\")\n .option(\"--decided-by-user-id <id>\", \"Decision actor user ID\")\n .action(async (approvalId: string, opts: ApprovalDecisionOptions) => {\n try {\n const ctx = resolveCommandContext(opts);\n const payload = resolveApprovalSchema.parse({\n decisionNote: opts.decisionNote,\n decidedByUserId: opts.decidedByUserId,\n });\n const updated = await ctx.api.post<Approval>(`/api/approvals/${approvalId}/approve`, payload);\n printOutput(updated, { json: ctx.json });\n } catch (err) {\n handleCommandError(err);\n }\n }),\n );\n\n addCommonClientOptions(\n approval\n .command(\"reject\")\n .description(\"Reject an approval request\")\n .argument(\"<approvalId>\", \"Approval ID\")\n .option(\"--decision-note <text>\", \"Decision note\")\n .option(\"--decided-by-user-id <id>\", \"Decision actor user ID\")\n .action(async (approvalId: string, opts: ApprovalDecisionOptions) => {\n try {\n const ctx = resolveCommandContext(opts);\n const payload = resolveApprovalSchema.parse({\n decisionNote: opts.decisionNote,\n decidedByUserId: opts.decidedByUserId,\n });\n const updated = await ctx.api.post<Approval>(`/api/approvals/${approvalId}/reject`, payload);\n printOutput(updated, { json: ctx.json });\n } catch (err) {\n handleCommandError(err);\n }\n }),\n );\n\n addCommonClientOptions(\n approval\n .command(\"request-revision\")\n .description(\"Request revision for an approval\")\n .argument(\"<approvalId>\", \"Approval ID\")\n .option(\"--decision-note <text>\", \"Decision note\")\n .option(\"--decided-by-user-id <id>\", \"Decision actor user ID\")\n .action(async (approvalId: string, opts: ApprovalDecisionOptions) => {\n try {\n const ctx = resolveCommandContext(opts);\n const payload = requestApprovalRevisionSchema.parse({\n decisionNote: opts.decisionNote,\n decidedByUserId: opts.decidedByUserId,\n });\n const updated = await ctx.api.post<Approval>(`/api/approvals/${approvalId}/request-revision`, payload);\n printOutput(updated, { json: ctx.json });\n } catch (err) {\n handleCommandError(err);\n }\n }),\n );\n\n addCommonClientOptions(\n approval\n .command(\"resubmit\")\n .description(\"Resubmit an approval (optionally with new payload)\")\n .argument(\"<approvalId>\", \"Approval ID\")\n .option(\"--payload <json>\", \"Payload JSON object\")\n .action(async (approvalId: string, opts: ApprovalResubmitOptions) => {\n try {\n const ctx = resolveCommandContext(opts);\n const payload = resubmitApprovalSchema.parse({\n payload: opts.payload ? parseJsonObject(opts.payload, \"payload\") : undefined,\n });\n const updated = await ctx.api.post<Approval>(`/api/approvals/${approvalId}/resubmit`, payload);\n printOutput(updated, { json: ctx.json });\n } catch (err) {\n handleCommandError(err);\n }\n }),\n );\n\n addCommonClientOptions(\n approval\n .command(\"comment\")\n .description(\"Add comment to an approval\")\n .argument(\"<approvalId>\", \"Approval ID\")\n .requiredOption(\"--body <text>\", \"Comment body\")\n .action(async (approvalId: string, opts: ApprovalCommentOptions) => {\n try {\n const ctx = resolveCommandContext(opts);\n const created = await ctx.api.post<ApprovalComment>(`/api/approvals/${approvalId}/comments`, {\n body: opts.body,\n });\n printOutput(created, { json: ctx.json });\n } catch (err) {\n handleCommandError(err);\n }\n }),\n );\n}\n\nfunction parseCsv(value: string | undefined): string[] | undefined {\n if (!value) return undefined;\n const rows = value.split(\",\").map((v) => v.trim()).filter(Boolean);\n return rows.length > 0 ? rows : undefined;\n}\n\nfunction parseJsonObject(value: string, name: string): Record<string, unknown> {\n try {\n const parsed = JSON.parse(value) as unknown;\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n throw new Error(`${name} must be a JSON object`);\n }\n return parsed as Record<string, unknown>;\n } catch (err) {\n throw new Error(`Invalid ${name} JSON: ${err instanceof Error ? err.message : String(err)}`);\n }\n}\n", "import { Command } from \"commander\";\nimport type { ActivityEvent } from \"@paperclipai/shared\";\nimport {\n addCommonClientOptions,\n formatInlineRecord,\n handleCommandError,\n printOutput,\n resolveCommandContext,\n type BaseClientOptions,\n} from \"./common.js\";\n\ninterface ActivityListOptions extends BaseClientOptions {\n companyId?: string;\n agentId?: string;\n entityType?: string;\n entityId?: string;\n}\n\nexport function registerActivityCommands(program: Command): void {\n const activity = program.command(\"activity\").description(\"Activity log operations\");\n\n addCommonClientOptions(\n activity\n .command(\"list\")\n .description(\"List company activity log entries\")\n .requiredOption(\"-C, --company-id <id>\", \"Company ID\")\n .option(\"--agent-id <id>\", \"Filter by agent ID\")\n .option(\"--entity-type <type>\", \"Filter by entity type\")\n .option(\"--entity-id <id>\", \"Filter by entity ID\")\n .action(async (opts: ActivityListOptions) => {\n try {\n const ctx = resolveCommandContext(opts, { requireCompany: true });\n const params = new URLSearchParams();\n if (opts.agentId) params.set(\"agentId\", opts.agentId);\n if (opts.entityType) params.set(\"entityType\", opts.entityType);\n if (opts.entityId) params.set(\"entityId\", opts.entityId);\n\n const query = params.toString();\n const path = `/api/companies/${ctx.companyId}/activity${query ? `?${query}` : \"\"}`;\n const rows = (await ctx.api.get<ActivityEvent[]>(path)) ?? [];\n\n if (ctx.json) {\n printOutput(rows, { json: true });\n return;\n }\n\n if (rows.length === 0) {\n printOutput([], { json: false });\n return;\n }\n\n for (const row of rows) {\n console.log(\n formatInlineRecord({\n id: row.id,\n action: row.action,\n actorType: row.actorType,\n actorId: row.actorId,\n entityType: row.entityType,\n entityId: row.entityId,\n createdAt: String(row.createdAt),\n }),\n );\n }\n } catch (err) {\n handleCommandError(err);\n }\n }),\n { includeCompany: false },\n );\n}\n", "import { Command } from \"commander\";\nimport type { DashboardSummary } from \"@paperclipai/shared\";\nimport {\n addCommonClientOptions,\n handleCommandError,\n printOutput,\n resolveCommandContext,\n type BaseClientOptions,\n} from \"./common.js\";\n\ninterface DashboardGetOptions extends BaseClientOptions {\n companyId?: string;\n}\n\nexport function registerDashboardCommands(program: Command): void {\n const dashboard = program.command(\"dashboard\").description(\"Dashboard summary operations\");\n\n addCommonClientOptions(\n dashboard\n .command(\"get\")\n .description(\"Get dashboard summary for a company\")\n .requiredOption(\"-C, --company-id <id>\", \"Company ID\")\n .action(async (opts: DashboardGetOptions) => {\n try {\n const ctx = resolveCommandContext(opts, { requireCompany: true });\n const row = await ctx.api.get<DashboardSummary>(`/api/companies/${ctx.companyId}/dashboard`);\n printOutput(row, { json: ctx.json });\n } catch (err) {\n handleCommandError(err);\n }\n }),\n { includeCompany: false },\n );\n}\n", "import fs from \"node:fs\";\nimport net from \"node:net\";\nimport path from \"node:path\";\nimport { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport {\n applyPendingMigrations,\n createDb,\n createEmbeddedPostgresLogBuffer,\n ensurePostgresDatabase,\n formatEmbeddedPostgresError,\n routines,\n} from \"@paperclipai/db\";\nimport { eq, inArray } from \"drizzle-orm\";\nimport { loadPaperclipEnvFile } from \"../config/env.js\";\nimport { readConfig, resolveConfigPath } from \"../config/store.js\";\n\ntype RoutinesDisableAllOptions = {\n config?: string;\n dataDir?: string;\n companyId?: string;\n json?: boolean;\n};\n\ntype DisableAllRoutinesResult = {\n companyId: string;\n totalRoutines: number;\n pausedCount: number;\n alreadyPausedCount: number;\n archivedCount: number;\n};\n\ntype EmbeddedPostgresInstance = {\n initialise(): Promise<void>;\n start(): Promise<void>;\n stop(): Promise<void>;\n};\n\ntype EmbeddedPostgresCtor = new (opts: {\n databaseDir: string;\n user: string;\n password: string;\n port: number;\n persistent: boolean;\n initdbFlags?: string[];\n onLog?: (message: unknown) => void;\n onError?: (message: unknown) => void;\n}) => EmbeddedPostgresInstance;\n\ntype EmbeddedPostgresHandle = {\n port: number;\n startedByThisProcess: boolean;\n stop: () => Promise<void>;\n};\n\ntype ClosableDb = ReturnType<typeof createDb> & {\n $client?: {\n end?: (options?: { timeout?: number }) => Promise<void>;\n };\n};\n\nfunction nonEmpty(value: string | null | undefined): string | null {\n return typeof value === \"string\" && value.trim().length > 0 ? value.trim() : null;\n}\n\nasync function isPortAvailable(port: number): Promise<boolean> {\n return await new Promise<boolean>((resolve) => {\n const server = net.createServer();\n server.unref();\n server.once(\"error\", () => resolve(false));\n server.listen(port, \"127.0.0.1\", () => {\n server.close(() => resolve(true));\n });\n });\n}\n\nasync function findAvailablePort(preferredPort: number): Promise<number> {\n let port = Math.max(1, Math.trunc(preferredPort));\n while (!(await isPortAvailable(port))) {\n port += 1;\n }\n return port;\n}\n\nfunction readPidFilePort(postmasterPidFile: string): number | null {\n if (!fs.existsSync(postmasterPidFile)) return null;\n try {\n const lines = fs.readFileSync(postmasterPidFile, \"utf8\").split(\"\\n\");\n const port = Number(lines[3]?.trim());\n return Number.isInteger(port) && port > 0 ? port : null;\n } catch {\n return null;\n }\n}\n\nfunction readRunningPostmasterPid(postmasterPidFile: string): number | null {\n if (!fs.existsSync(postmasterPidFile)) return null;\n try {\n const pid = Number(fs.readFileSync(postmasterPidFile, \"utf8\").split(\"\\n\")[0]?.trim());\n if (!Number.isInteger(pid) || pid <= 0) return null;\n process.kill(pid, 0);\n return pid;\n } catch {\n return null;\n }\n}\n\nasync function ensureEmbeddedPostgres(dataDir: string, preferredPort: number): Promise<EmbeddedPostgresHandle> {\n const moduleName = \"embedded-postgres\";\n let EmbeddedPostgres: EmbeddedPostgresCtor;\n try {\n const mod = await import(moduleName);\n EmbeddedPostgres = mod.default as EmbeddedPostgresCtor;\n } catch {\n throw new Error(\n \"Embedded PostgreSQL support requires dependency `embedded-postgres`. Reinstall dependencies and try again.\",\n );\n }\n\n const postmasterPidFile = path.resolve(dataDir, \"postmaster.pid\");\n const runningPid = readRunningPostmasterPid(postmasterPidFile);\n if (runningPid) {\n return {\n port: readPidFilePort(postmasterPidFile) ?? preferredPort,\n startedByThisProcess: false,\n stop: async () => {},\n };\n }\n\n const port = await findAvailablePort(preferredPort);\n const logBuffer = createEmbeddedPostgresLogBuffer();\n const instance = new EmbeddedPostgres({\n databaseDir: dataDir,\n user: \"paperclip\",\n password: \"paperclip\",\n port,\n persistent: true,\n initdbFlags: [\"--encoding=UTF8\", \"--locale=C\", \"--lc-messages=C\"],\n onLog: logBuffer.append,\n onError: logBuffer.append,\n });\n\n if (!fs.existsSync(path.resolve(dataDir, \"PG_VERSION\"))) {\n try {\n await instance.initialise();\n } catch (error) {\n throw formatEmbeddedPostgresError(error, {\n fallbackMessage: `Failed to initialize embedded PostgreSQL cluster in ${dataDir} on port ${port}`,\n recentLogs: logBuffer.getRecentLogs(),\n });\n }\n }\n\n if (fs.existsSync(postmasterPidFile)) {\n fs.rmSync(postmasterPidFile, { force: true });\n }\n\n try {\n await instance.start();\n } catch (error) {\n throw formatEmbeddedPostgresError(error, {\n fallbackMessage: `Failed to start embedded PostgreSQL on port ${port}`,\n recentLogs: logBuffer.getRecentLogs(),\n });\n }\n\n return {\n port,\n startedByThisProcess: true,\n stop: async () => {\n await instance.stop();\n },\n };\n}\n\nasync function closeDb(db: ClosableDb): Promise<void> {\n await db.$client?.end?.({ timeout: 5 }).catch(() => undefined);\n}\n\nasync function openConfiguredDb(configPath: string): Promise<{\n db: ClosableDb;\n stop: () => Promise<void>;\n}> {\n const config = readConfig(configPath);\n if (!config) {\n throw new Error(`Config not found at ${configPath}.`);\n }\n\n let embeddedHandle: EmbeddedPostgresHandle | null = null;\n try {\n if (config.database.mode === \"embedded-postgres\") {\n embeddedHandle = await ensureEmbeddedPostgres(\n config.database.embeddedPostgresDataDir,\n config.database.embeddedPostgresPort,\n );\n const adminConnectionString = `postgres://paperclip:paperclip@127.0.0.1:${embeddedHandle.port}/postgres`;\n await ensurePostgresDatabase(adminConnectionString, \"paperclip\");\n const connectionString = `postgres://paperclip:paperclip@127.0.0.1:${embeddedHandle.port}/paperclip`;\n await applyPendingMigrations(connectionString);\n const db = createDb(connectionString) as ClosableDb;\n return {\n db,\n stop: async () => {\n await closeDb(db);\n if (embeddedHandle?.startedByThisProcess) {\n await embeddedHandle.stop().catch(() => undefined);\n }\n },\n };\n }\n\n const connectionString = nonEmpty(config.database.connectionString);\n if (!connectionString) {\n throw new Error(`Config at ${configPath} does not define a database connection string.`);\n }\n\n await applyPendingMigrations(connectionString);\n const db = createDb(connectionString) as ClosableDb;\n return {\n db,\n stop: async () => {\n await closeDb(db);\n },\n };\n } catch (error) {\n if (embeddedHandle?.startedByThisProcess) {\n await embeddedHandle.stop().catch(() => undefined);\n }\n throw error;\n }\n}\n\nexport async function disableAllRoutinesInConfig(\n options: Pick<RoutinesDisableAllOptions, \"config\" | \"companyId\">,\n): Promise<DisableAllRoutinesResult> {\n const configPath = resolveConfigPath(options.config);\n loadPaperclipEnvFile(configPath);\n const companyId =\n nonEmpty(options.companyId)\n ?? nonEmpty(process.env.PAPERCLIP_COMPANY_ID)\n ?? null;\n if (!companyId) {\n throw new Error(\"Company ID is required. Pass --company-id or set PAPERCLIP_COMPANY_ID.\");\n }\n\n const config = readConfig(configPath);\n if (!config) {\n throw new Error(`Config not found at ${configPath}.`);\n }\n\n let embeddedHandle: EmbeddedPostgresHandle | null = null;\n let db: ClosableDb | null = null;\n try {\n if (config.database.mode === \"embedded-postgres\") {\n embeddedHandle = await ensureEmbeddedPostgres(\n config.database.embeddedPostgresDataDir,\n config.database.embeddedPostgresPort,\n );\n const adminConnectionString = `postgres://paperclip:paperclip@127.0.0.1:${embeddedHandle.port}/postgres`;\n await ensurePostgresDatabase(adminConnectionString, \"paperclip\");\n const connectionString = `postgres://paperclip:paperclip@127.0.0.1:${embeddedHandle.port}/paperclip`;\n await applyPendingMigrations(connectionString);\n db = createDb(connectionString) as ClosableDb;\n } else {\n const connectionString = nonEmpty(config.database.connectionString);\n if (!connectionString) {\n throw new Error(`Config at ${configPath} does not define a database connection string.`);\n }\n await applyPendingMigrations(connectionString);\n db = createDb(connectionString) as ClosableDb;\n }\n\n const existing = await db\n .select({\n id: routines.id,\n status: routines.status,\n })\n .from(routines)\n .where(eq(routines.companyId, companyId));\n\n const alreadyPausedCount = existing.filter((routine) => routine.status === \"paused\").length;\n const archivedCount = existing.filter((routine) => routine.status === \"archived\").length;\n const idsToPause = existing\n .filter((routine) => routine.status !== \"paused\" && routine.status !== \"archived\")\n .map((routine) => routine.id);\n\n if (idsToPause.length > 0) {\n await db\n .update(routines)\n .set({\n status: \"paused\",\n updatedAt: new Date(),\n })\n .where(inArray(routines.id, idsToPause));\n }\n\n return {\n companyId,\n totalRoutines: existing.length,\n pausedCount: idsToPause.length,\n alreadyPausedCount,\n archivedCount,\n };\n } finally {\n if (db) {\n await closeDb(db);\n }\n if (embeddedHandle?.startedByThisProcess) {\n await embeddedHandle.stop().catch(() => undefined);\n }\n }\n}\n\nexport async function disableAllRoutinesCommand(options: RoutinesDisableAllOptions): Promise<void> {\n const result = await disableAllRoutinesInConfig(options);\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n if (result.totalRoutines === 0) {\n console.log(pc.dim(`No routines found for company ${result.companyId}.`));\n return;\n }\n\n console.log(\n `Paused ${result.pausedCount} routine(s) for company ${result.companyId} ` +\n `(${result.alreadyPausedCount} already paused, ${result.archivedCount} archived).`,\n );\n}\n\nexport function registerRoutineCommands(program: Command): void {\n const routinesCommand = program.command(\"routines\").description(\"Local routine maintenance commands\");\n\n routinesCommand\n .command(\"disable-all\")\n .description(\"Pause all non-archived routines in the configured local instance for one company\")\n .option(\"-c, --config <path>\", \"Path to config file\")\n .option(\"-d, --data-dir <path>\", \"Relay Control data directory root (isolates state from ~/.relaycontrol)\")\n .option(\"-C, --company-id <id>\", \"Company ID\")\n .option(\"--json\", \"Output raw JSON\")\n .action(async (opts: RoutinesDisableAllOptions) => {\n try {\n await disableAllRoutinesCommand(opts);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(pc.red(message));\n process.exit(1);\n }\n });\n}\n", "import path from \"node:path\";\nimport {\n expandHomePrefix,\n resolveDefaultConfigPath,\n resolveDefaultContextPath,\n resolvePaperclipInstanceId,\n} from \"./home.js\";\n\nexport interface DataDirOptionLike {\n dataDir?: string;\n config?: string;\n context?: string;\n instance?: string;\n}\n\nexport interface DataDirCommandSupport {\n hasConfigOption?: boolean;\n hasContextOption?: boolean;\n}\n\nexport function applyDataDirOverride(\n options: DataDirOptionLike,\n support: DataDirCommandSupport = {},\n): string | null {\n const rawDataDir = options.dataDir?.trim();\n if (!rawDataDir) return null;\n\n const resolvedDataDir = path.resolve(expandHomePrefix(rawDataDir));\n process.env.PAPERCLIP_HOME = resolvedDataDir;\n\n if (support.hasConfigOption) {\n const hasConfigOverride = Boolean(options.config?.trim()) || Boolean(process.env.PAPERCLIP_CONFIG?.trim());\n if (!hasConfigOverride) {\n const instanceId = resolvePaperclipInstanceId(options.instance);\n process.env.PAPERCLIP_INSTANCE_ID = instanceId;\n process.env.PAPERCLIP_CONFIG = resolveDefaultConfigPath(instanceId);\n }\n }\n\n if (support.hasContextOption) {\n const hasContextOverride = Boolean(options.context?.trim()) || Boolean(process.env.PAPERCLIP_CONTEXT?.trim());\n if (!hasContextOverride) {\n process.env.PAPERCLIP_CONTEXT = resolveDefaultContextPath();\n }\n }\n\n return resolvedDataDir;\n}\n", "import {\n chmodSync,\n copyFileSync,\n existsSync,\n mkdirSync,\n promises as fsPromises,\n readdirSync,\n readFileSync,\n readlinkSync,\n rmSync,\n statSync,\n symlinkSync,\n writeFileSync,\n} from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { execFileSync } from \"node:child_process\";\nimport { createServer } from \"node:net\";\nimport { Readable } from \"node:stream\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { and, eq, inArray, sql } from \"drizzle-orm\";\nimport {\n applyPendingMigrations,\n agents,\n assets,\n companies,\n createDb,\n documentRevisions,\n documents,\n ensurePostgresDatabase,\n formatDatabaseBackupResult,\n goals,\n heartbeatRuns,\n inspectMigrations,\n issueAttachments,\n issueComments,\n issueDocuments,\n issues,\n projectWorkspaces,\n projects,\n runDatabaseBackup,\n runDatabaseRestore,\n createEmbeddedPostgresLogBuffer,\n formatEmbeddedPostgresError,\n} from \"@paperclipai/db\";\nimport type { Command } from \"commander\";\nimport { ensureAgentJwtSecret, loadPaperclipEnvFile, mergePaperclipEnvEntries, readPaperclipEnvEntries, resolvePaperclipEnvFile } from \"../config/env.js\";\nimport { expandHomePrefix } from \"../config/home.js\";\nimport type { PaperclipConfig } from \"../config/schema.js\";\nimport { readConfig, resolveConfigPath, writeConfig } from \"../config/store.js\";\nimport { printPaperclipCliBanner } from \"../utils/banner.js\";\nimport { resolveRuntimeLikePath } from \"../utils/path-resolver.js\";\nimport {\n buildWorktreeConfig,\n buildWorktreeEnvEntries,\n DEFAULT_WORKTREE_HOME,\n formatShellExports,\n generateWorktreeColor,\n isWorktreeSeedMode,\n resolveSuggestedWorktreeName,\n resolveWorktreeSeedPlan,\n resolveWorktreeLocalPaths,\n sanitizeWorktreeInstanceId,\n type WorktreeSeedMode,\n type WorktreeLocalPaths,\n} from \"./worktree-lib.js\";\nimport {\n buildWorktreeMergePlan,\n parseWorktreeMergeScopes,\n type IssueAttachmentRow,\n type IssueDocumentRow,\n type DocumentRevisionRow,\n type PlannedAttachmentInsert,\n type PlannedCommentInsert,\n type PlannedIssueDocumentInsert,\n type PlannedIssueDocumentMerge,\n type PlannedIssueInsert,\n} from \"./worktree-merge-history-lib.js\";\n\ntype WorktreeInitOptions = {\n name?: string;\n instance?: string;\n home?: string;\n fromConfig?: string;\n fromDataDir?: string;\n fromInstance?: string;\n sourceConfigPathOverride?: string;\n serverPort?: number;\n dbPort?: number;\n seed?: boolean;\n seedMode?: string;\n force?: boolean;\n};\n\ntype WorktreeMakeOptions = WorktreeInitOptions & {\n startPoint?: string;\n};\n\ntype WorktreeEnvOptions = {\n config?: string;\n json?: boolean;\n};\n\ntype WorktreeListOptions = {\n json?: boolean;\n};\n\ntype WorktreeMergeHistoryOptions = {\n from?: string;\n to?: string;\n company?: string;\n scope?: string;\n apply?: boolean;\n dry?: boolean;\n yes?: boolean;\n};\n\ntype EmbeddedPostgresInstance = {\n initialise(): Promise<void>;\n start(): Promise<void>;\n stop(): Promise<void>;\n};\n\ntype EmbeddedPostgresCtor = new (opts: {\n databaseDir: string;\n user: string;\n password: string;\n port: number;\n persistent: boolean;\n initdbFlags?: string[];\n onLog?: (message: unknown) => void;\n onError?: (message: unknown) => void;\n}) => EmbeddedPostgresInstance;\n\ntype EmbeddedPostgresHandle = {\n port: number;\n startedByThisProcess: boolean;\n stop: () => Promise<void>;\n};\n\ntype GitWorkspaceInfo = {\n root: string;\n commonDir: string;\n gitDir: string;\n hooksPath: string;\n};\n\ntype CopiedGitHooksResult = {\n sourceHooksPath: string;\n targetHooksPath: string;\n copied: boolean;\n};\n\ntype SeedWorktreeDatabaseResult = {\n backupSummary: string;\n reboundWorkspaces: Array<{\n name: string;\n fromCwd: string;\n toCwd: string;\n }>;\n};\n\nfunction nonEmpty(value: string | null | undefined): string | null {\n return typeof value === \"string\" && value.trim().length > 0 ? value.trim() : null;\n}\n\nfunction isCurrentSourceConfigPath(sourceConfigPath: string): boolean {\n const currentConfigPath = process.env.PAPERCLIP_CONFIG;\n if (!currentConfigPath || currentConfigPath.trim().length === 0) {\n return false;\n }\n return path.resolve(currentConfigPath) === path.resolve(sourceConfigPath);\n}\n\nconst WORKTREE_NAME_PREFIX = \"paperclip-\";\n\nfunction resolveWorktreeMakeName(name: string): string {\n const value = nonEmpty(name);\n if (!value) {\n throw new Error(\"Worktree name is required.\");\n }\n if (!/^[A-Za-z0-9._-]+$/.test(value)) {\n throw new Error(\n \"Worktree name must contain only letters, numbers, dots, underscores, or dashes.\",\n );\n }\n return value.startsWith(WORKTREE_NAME_PREFIX) ? value : `${WORKTREE_NAME_PREFIX}${value}`;\n}\n\nfunction resolveWorktreeHome(explicit?: string): string {\n return explicit ?? process.env.PAPERCLIP_WORKTREES_DIR ?? DEFAULT_WORKTREE_HOME;\n}\n\nfunction resolveWorktreeStartPoint(explicit?: string): string | undefined {\n return explicit ?? nonEmpty(process.env.PAPERCLIP_WORKTREE_START_POINT) ?? undefined;\n}\n\ntype ConfiguredStorage = {\n getObject(companyId: string, objectKey: string): Promise<Buffer>;\n putObject(companyId: string, objectKey: string, body: Buffer, contentType: string): Promise<void>;\n};\n\nfunction assertStorageCompanyPrefix(companyId: string, objectKey: string): void {\n if (!objectKey.startsWith(`${companyId}/`) || objectKey.includes(\"..\")) {\n throw new Error(`Invalid object key for company ${companyId}.`);\n }\n}\n\nfunction normalizeStorageObjectKey(objectKey: string): string {\n const normalized = objectKey.replace(/\\\\/g, \"/\").trim();\n if (!normalized || normalized.startsWith(\"/\")) {\n throw new Error(\"Invalid object key.\");\n }\n const parts = normalized.split(\"/\").filter((part) => part.length > 0);\n if (parts.length === 0 || parts.some((part) => part === \".\" || part === \"..\")) {\n throw new Error(\"Invalid object key.\");\n }\n return parts.join(\"/\");\n}\n\nfunction resolveLocalStoragePath(baseDir: string, objectKey: string): string {\n const resolved = path.resolve(baseDir, normalizeStorageObjectKey(objectKey));\n const root = path.resolve(baseDir);\n if (resolved !== root && !resolved.startsWith(`${root}${path.sep}`)) {\n throw new Error(\"Invalid object key path.\");\n }\n return resolved;\n}\n\nasync function s3BodyToBuffer(body: unknown): Promise<Buffer> {\n if (!body) {\n throw new Error(\"Object not found.\");\n }\n if (Buffer.isBuffer(body)) {\n return body;\n }\n if (body instanceof Readable) {\n return await streamToBuffer(body);\n }\n\n const candidate = body as {\n transformToWebStream?: () => ReadableStream<Uint8Array>;\n arrayBuffer?: () => Promise<ArrayBuffer>;\n };\n if (typeof candidate.transformToWebStream === \"function\") {\n const webStream = candidate.transformToWebStream();\n const reader = webStream.getReader();\n const chunks: Uint8Array[] = [];\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n if (value) chunks.push(value);\n }\n return Buffer.concat(chunks.map((chunk) => Buffer.from(chunk)));\n }\n if (typeof candidate.arrayBuffer === \"function\") {\n return Buffer.from(await candidate.arrayBuffer());\n }\n\n throw new Error(\"Unsupported storage response body.\");\n}\n\nfunction normalizeS3Prefix(prefix: string | undefined): string {\n if (!prefix) return \"\";\n return prefix.trim().replace(/^\\/+/, \"\").replace(/\\/+$/, \"\");\n}\n\nfunction buildS3ObjectKey(prefix: string, objectKey: string): string {\n return prefix ? `${prefix}/${objectKey}` : objectKey;\n}\n\nconst dynamicImport = new Function(\"specifier\", \"return import(specifier);\") as (specifier: string) => Promise<any>;\n\nfunction createConfiguredStorageFromPaperclipConfig(config: PaperclipConfig): ConfiguredStorage {\n if (config.storage.provider === \"local_disk\") {\n const baseDir = expandHomePrefix(config.storage.localDisk.baseDir);\n return {\n async getObject(companyId: string, objectKey: string) {\n assertStorageCompanyPrefix(companyId, objectKey);\n return await fsPromises.readFile(resolveLocalStoragePath(baseDir, objectKey));\n },\n async putObject(companyId: string, objectKey: string, body: Buffer) {\n assertStorageCompanyPrefix(companyId, objectKey);\n const filePath = resolveLocalStoragePath(baseDir, objectKey);\n await fsPromises.mkdir(path.dirname(filePath), { recursive: true });\n await fsPromises.writeFile(filePath, body);\n },\n };\n }\n\n const prefix = normalizeS3Prefix(config.storage.s3.prefix);\n let s3ClientPromise: Promise<any> | null = null;\n async function getS3Client() {\n if (!s3ClientPromise) {\n s3ClientPromise = (async () => {\n const sdk = await dynamicImport(\"@aws-sdk/client-s3\");\n return {\n sdk,\n client: new sdk.S3Client({\n region: config.storage.s3.region,\n endpoint: config.storage.s3.endpoint,\n forcePathStyle: config.storage.s3.forcePathStyle,\n }),\n };\n })();\n }\n return await s3ClientPromise;\n }\n const bucket = config.storage.s3.bucket;\n return {\n async getObject(companyId: string, objectKey: string) {\n assertStorageCompanyPrefix(companyId, objectKey);\n const { sdk, client } = await getS3Client();\n const response = await client.send(\n new sdk.GetObjectCommand({\n Bucket: bucket,\n Key: buildS3ObjectKey(prefix, objectKey),\n }),\n );\n return await s3BodyToBuffer(response.Body);\n },\n async putObject(companyId: string, objectKey: string, body: Buffer, contentType: string) {\n assertStorageCompanyPrefix(companyId, objectKey);\n const { sdk, client } = await getS3Client();\n await client.send(\n new sdk.PutObjectCommand({\n Bucket: bucket,\n Key: buildS3ObjectKey(prefix, objectKey),\n Body: body,\n ContentType: contentType,\n ContentLength: body.length,\n }),\n );\n },\n };\n}\n\nfunction openConfiguredStorage(configPath: string): ConfiguredStorage {\n const config = readConfig(configPath);\n if (!config) {\n throw new Error(`Config not found at ${configPath}.`);\n }\n return createConfiguredStorageFromPaperclipConfig(config);\n}\n\nasync function streamToBuffer(stream: NodeJS.ReadableStream): Promise<Buffer> {\n const chunks: Buffer[] = [];\n for await (const chunk of stream) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n return Buffer.concat(chunks);\n}\n\nexport function isMissingStorageObjectError(error: unknown): boolean {\n if (!error || typeof error !== \"object\") return false;\n const candidate = error as { code?: unknown; status?: unknown; name?: unknown; message?: unknown };\n return candidate.code === \"ENOENT\"\n || candidate.status === 404\n || candidate.name === \"NoSuchKey\"\n || candidate.name === \"NotFound\"\n || candidate.message === \"Object not found.\";\n}\n\nexport async function readSourceAttachmentBody(\n sourceStorages: Array<Pick<ConfiguredStorage, \"getObject\">>,\n companyId: string,\n objectKey: string,\n): Promise<Buffer | null> {\n for (const sourceStorage of sourceStorages) {\n try {\n return await sourceStorage.getObject(companyId, objectKey);\n } catch (error) {\n if (isMissingStorageObjectError(error)) {\n continue;\n }\n throw error;\n }\n }\n return null;\n}\n\nexport function resolveWorktreeMakeTargetPath(name: string): string {\n return path.resolve(os.homedir(), resolveWorktreeMakeName(name));\n}\n\nfunction extractExecSyncErrorMessage(error: unknown): string | null {\n if (!error || typeof error !== \"object\") {\n return error instanceof Error ? error.message : null;\n }\n\n const stderr = \"stderr\" in error ? error.stderr : null;\n if (typeof stderr === \"string\") {\n return nonEmpty(stderr);\n }\n if (stderr instanceof Buffer) {\n return nonEmpty(stderr.toString(\"utf8\"));\n }\n\n return error instanceof Error ? nonEmpty(error.message) : null;\n}\n\nfunction localBranchExists(cwd: string, branchName: string): boolean {\n try {\n execFileSync(\"git\", [\"show-ref\", \"--verify\", \"--quiet\", `refs/heads/${branchName}`], {\n cwd,\n stdio: \"ignore\",\n });\n return true;\n } catch {\n return false;\n }\n}\n\nexport function resolveGitWorktreeAddArgs(input: {\n branchName: string;\n targetPath: string;\n branchExists: boolean;\n startPoint?: string;\n}): string[] {\n if (input.branchExists && !input.startPoint) {\n return [\"worktree\", \"add\", input.targetPath, input.branchName];\n }\n const commitish = input.startPoint ?? \"HEAD\";\n return [\"worktree\", \"add\", \"-b\", input.branchName, input.targetPath, commitish];\n}\n\nfunction readPidFilePort(postmasterPidFile: string): number | null {\n if (!existsSync(postmasterPidFile)) return null;\n try {\n const lines = readFileSync(postmasterPidFile, \"utf8\").split(\"\\n\");\n const port = Number(lines[3]?.trim());\n return Number.isInteger(port) && port > 0 ? port : null;\n } catch {\n return null;\n }\n}\n\nfunction readRunningPostmasterPid(postmasterPidFile: string): number | null {\n if (!existsSync(postmasterPidFile)) return null;\n try {\n const pid = Number(readFileSync(postmasterPidFile, \"utf8\").split(\"\\n\")[0]?.trim());\n if (!Number.isInteger(pid) || pid <= 0) return null;\n process.kill(pid, 0);\n return pid;\n } catch {\n return null;\n }\n}\n\nasync function isPortAvailable(port: number): Promise<boolean> {\n return await new Promise<boolean>((resolve) => {\n const server = createServer();\n server.unref();\n server.once(\"error\", () => resolve(false));\n server.listen(port, \"127.0.0.1\", () => {\n server.close(() => resolve(true));\n });\n });\n}\n\nasync function findAvailablePort(preferredPort: number, reserved = new Set<number>()): Promise<number> {\n let port = Math.max(1, Math.trunc(preferredPort));\n while (reserved.has(port) || !(await isPortAvailable(port))) {\n port += 1;\n }\n return port;\n}\n\nfunction resolveRepoManagedWorktreesRoot(cwd: string): string | null {\n const normalized = path.resolve(cwd);\n const marker = `${path.sep}.paperclip${path.sep}worktrees${path.sep}`;\n const index = normalized.indexOf(marker);\n if (index === -1) return null;\n const repoRoot = normalized.slice(0, index);\n return path.resolve(repoRoot, \".paperclip\", \"worktrees\");\n}\n\nfunction collectClaimedWorktreePorts(homeDir: string, currentInstanceId: string, cwd: string): {\n serverPorts: Set<number>;\n databasePorts: Set<number>;\n} {\n const serverPorts = new Set<number>();\n const databasePorts = new Set<number>();\n const configPaths = new Set<string>();\n const instancesDir = path.resolve(homeDir, \"instances\");\n if (existsSync(instancesDir)) {\n for (const entry of readdirSync(instancesDir, { withFileTypes: true })) {\n if (!entry.isDirectory() || entry.name === currentInstanceId) continue;\n\n const configPath = path.resolve(instancesDir, entry.name, \"config.json\");\n if (existsSync(configPath)) {\n configPaths.add(configPath);\n }\n }\n }\n\n const repoManagedWorktreesRoot = resolveRepoManagedWorktreesRoot(cwd);\n if (repoManagedWorktreesRoot && existsSync(repoManagedWorktreesRoot)) {\n for (const entry of readdirSync(repoManagedWorktreesRoot, { withFileTypes: true })) {\n if (!entry.isDirectory()) continue;\n const configPath = path.resolve(repoManagedWorktreesRoot, entry.name, \".paperclip\", \"config.json\");\n if (existsSync(configPath)) {\n configPaths.add(configPath);\n }\n }\n }\n\n for (const configPath of configPaths) {\n try {\n const config = readConfig(configPath);\n if (config?.server.port) {\n serverPorts.add(config.server.port);\n }\n if (config?.database.mode === \"embedded-postgres\") {\n databasePorts.add(config.database.embeddedPostgresPort);\n }\n } catch {\n // Ignore malformed sibling configs.\n }\n }\n\n return { serverPorts, databasePorts };\n}\n\nfunction detectGitBranchName(cwd: string): string | null {\n try {\n const value = execFileSync(\"git\", [\"branch\", \"--show-current\"], {\n cwd,\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n }).trim();\n return nonEmpty(value);\n } catch {\n return null;\n }\n}\n\nfunction detectGitWorkspaceInfo(cwd: string): GitWorkspaceInfo | null {\n try {\n const root = execFileSync(\"git\", [\"rev-parse\", \"--show-toplevel\"], {\n cwd,\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n }).trim();\n const commonDirRaw = execFileSync(\"git\", [\"rev-parse\", \"--git-common-dir\"], {\n cwd: root,\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n }).trim();\n const gitDirRaw = execFileSync(\"git\", [\"rev-parse\", \"--git-dir\"], {\n cwd: root,\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n }).trim();\n const hooksPathRaw = execFileSync(\"git\", [\"rev-parse\", \"--git-path\", \"hooks\"], {\n cwd: root,\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n }).trim();\n return {\n root: path.resolve(root),\n commonDir: path.resolve(root, commonDirRaw),\n gitDir: path.resolve(root, gitDirRaw),\n hooksPath: path.resolve(root, hooksPathRaw),\n };\n } catch {\n return null;\n }\n}\n\nfunction copyDirectoryContents(sourceDir: string, targetDir: string): boolean {\n if (!existsSync(sourceDir)) return false;\n\n const entries = readdirSync(sourceDir, { withFileTypes: true });\n if (entries.length === 0) return false;\n\n mkdirSync(targetDir, { recursive: true });\n\n let copied = false;\n for (const entry of entries) {\n const sourcePath = path.resolve(sourceDir, entry.name);\n const targetPath = path.resolve(targetDir, entry.name);\n\n if (entry.isDirectory()) {\n mkdirSync(targetPath, { recursive: true });\n copyDirectoryContents(sourcePath, targetPath);\n copied = true;\n continue;\n }\n\n if (entry.isSymbolicLink()) {\n rmSync(targetPath, { recursive: true, force: true });\n symlinkSync(readlinkSync(sourcePath), targetPath);\n copied = true;\n continue;\n }\n\n copyFileSync(sourcePath, targetPath);\n try {\n chmodSync(targetPath, statSync(sourcePath).mode & 0o777);\n } catch {\n // best effort\n }\n copied = true;\n }\n\n return copied;\n}\n\nexport function copyGitHooksToWorktreeGitDir(cwd: string): CopiedGitHooksResult | null {\n const workspace = detectGitWorkspaceInfo(cwd);\n if (!workspace) return null;\n\n const sourceHooksPath = workspace.hooksPath;\n const targetHooksPath = path.resolve(workspace.gitDir, \"hooks\");\n\n if (sourceHooksPath === targetHooksPath) {\n return {\n sourceHooksPath,\n targetHooksPath,\n copied: false,\n };\n }\n\n return {\n sourceHooksPath,\n targetHooksPath,\n copied: copyDirectoryContents(sourceHooksPath, targetHooksPath),\n };\n}\n\nexport function rebindWorkspaceCwd(input: {\n sourceRepoRoot: string;\n targetRepoRoot: string;\n workspaceCwd: string;\n}): string | null {\n const sourceRepoRoot = path.resolve(input.sourceRepoRoot);\n const targetRepoRoot = path.resolve(input.targetRepoRoot);\n const workspaceCwd = path.resolve(input.workspaceCwd);\n const relative = path.relative(sourceRepoRoot, workspaceCwd);\n if (!relative || relative === \"\") {\n return targetRepoRoot;\n }\n if (relative.startsWith(\"..\") || path.isAbsolute(relative)) {\n return null;\n }\n return path.resolve(targetRepoRoot, relative);\n}\n\nasync function rebindSeededProjectWorkspaces(input: {\n targetConnectionString: string;\n currentCwd: string;\n}): Promise<SeedWorktreeDatabaseResult[\"reboundWorkspaces\"]> {\n const targetRepo = detectGitWorkspaceInfo(input.currentCwd);\n if (!targetRepo) return [];\n\n const db = createDb(input.targetConnectionString);\n const closableDb = db as typeof db & {\n $client?: { end?: (opts?: { timeout?: number }) => Promise<void> };\n };\n\n try {\n const rows = await db\n .select({\n id: projectWorkspaces.id,\n name: projectWorkspaces.name,\n cwd: projectWorkspaces.cwd,\n })\n .from(projectWorkspaces);\n\n const rebound: SeedWorktreeDatabaseResult[\"reboundWorkspaces\"] = [];\n for (const row of rows) {\n const workspaceCwd = nonEmpty(row.cwd);\n if (!workspaceCwd) continue;\n\n const sourceRepo = detectGitWorkspaceInfo(workspaceCwd);\n if (!sourceRepo) continue;\n if (sourceRepo.commonDir !== targetRepo.commonDir) continue;\n\n const reboundCwd = rebindWorkspaceCwd({\n sourceRepoRoot: sourceRepo.root,\n targetRepoRoot: targetRepo.root,\n workspaceCwd,\n });\n if (!reboundCwd) continue;\n\n const normalizedCurrent = path.resolve(workspaceCwd);\n if (reboundCwd === normalizedCurrent) continue;\n if (!existsSync(reboundCwd)) continue;\n\n await db\n .update(projectWorkspaces)\n .set({\n cwd: reboundCwd,\n updatedAt: new Date(),\n })\n .where(eq(projectWorkspaces.id, row.id));\n\n rebound.push({\n name: row.name,\n fromCwd: normalizedCurrent,\n toCwd: reboundCwd,\n });\n }\n\n return rebound;\n } finally {\n await closableDb.$client?.end?.({ timeout: 5 }).catch(() => undefined);\n }\n}\n\nexport function resolveSourceConfigPath(opts: WorktreeInitOptions): string {\n if (opts.sourceConfigPathOverride) return path.resolve(opts.sourceConfigPathOverride);\n if (opts.fromConfig) return path.resolve(opts.fromConfig);\n if (!opts.fromDataDir && !opts.fromInstance) {\n return resolveConfigPath();\n }\n const sourceHome = path.resolve(expandHomePrefix(opts.fromDataDir ?? \"~/.paperclip\"));\n const sourceInstanceId = sanitizeWorktreeInstanceId(opts.fromInstance ?? \"default\");\n return path.resolve(sourceHome, \"instances\", sourceInstanceId, \"config.json\");\n}\n\nfunction resolveSourceConnectionString(config: PaperclipConfig, envEntries: Record<string, string>, portOverride?: number): string {\n if (config.database.mode === \"postgres\") {\n const connectionString = nonEmpty(envEntries.DATABASE_URL) ?? nonEmpty(config.database.connectionString);\n if (!connectionString) {\n throw new Error(\n \"Source instance uses postgres mode but has no connection string in config or adjacent .env.\",\n );\n }\n return connectionString;\n }\n\n const port = portOverride ?? config.database.embeddedPostgresPort;\n return `postgres://paperclip:paperclip@127.0.0.1:${port}/paperclip`;\n}\n\nexport function copySeededSecretsKey(input: {\n sourceConfigPath: string;\n sourceConfig: PaperclipConfig;\n sourceEnvEntries: Record<string, string>;\n targetKeyFilePath: string;\n}): void {\n if (input.sourceConfig.secrets.provider !== \"local_encrypted\") {\n return;\n }\n\n mkdirSync(path.dirname(input.targetKeyFilePath), { recursive: true });\n\n const allowProcessEnvFallback = isCurrentSourceConfigPath(input.sourceConfigPath);\n const sourceInlineMasterKey =\n nonEmpty(input.sourceEnvEntries.PAPERCLIP_SECRETS_MASTER_KEY) ??\n (allowProcessEnvFallback ? nonEmpty(process.env.PAPERCLIP_SECRETS_MASTER_KEY) : null);\n if (sourceInlineMasterKey) {\n writeFileSync(input.targetKeyFilePath, sourceInlineMasterKey, {\n encoding: \"utf8\",\n mode: 0o600,\n });\n try {\n chmodSync(input.targetKeyFilePath, 0o600);\n } catch {\n // best effort\n }\n return;\n }\n\n const sourceKeyFileOverride =\n nonEmpty(input.sourceEnvEntries.PAPERCLIP_SECRETS_MASTER_KEY_FILE) ??\n (allowProcessEnvFallback ? nonEmpty(process.env.PAPERCLIP_SECRETS_MASTER_KEY_FILE) : null);\n const sourceConfiguredKeyPath = sourceKeyFileOverride ?? input.sourceConfig.secrets.localEncrypted.keyFilePath;\n const sourceKeyFilePath = resolveRuntimeLikePath(sourceConfiguredKeyPath, input.sourceConfigPath);\n\n if (!existsSync(sourceKeyFilePath)) {\n throw new Error(\n `Cannot seed worktree database because source local_encrypted secrets key was not found at ${sourceKeyFilePath}.`,\n );\n }\n\n copyFileSync(sourceKeyFilePath, input.targetKeyFilePath);\n try {\n chmodSync(input.targetKeyFilePath, 0o600);\n } catch {\n // best effort\n }\n}\n\nasync function ensureEmbeddedPostgres(dataDir: string, preferredPort: number): Promise<EmbeddedPostgresHandle> {\n const moduleName = \"embedded-postgres\";\n let EmbeddedPostgres: EmbeddedPostgresCtor;\n try {\n const mod = await import(moduleName);\n EmbeddedPostgres = mod.default as EmbeddedPostgresCtor;\n } catch {\n throw new Error(\n \"Embedded PostgreSQL support requires dependency `embedded-postgres`. Reinstall dependencies and try again.\",\n );\n }\n\n const postmasterPidFile = path.resolve(dataDir, \"postmaster.pid\");\n const runningPid = readRunningPostmasterPid(postmasterPidFile);\n if (runningPid) {\n return {\n port: readPidFilePort(postmasterPidFile) ?? preferredPort,\n startedByThisProcess: false,\n stop: async () => {},\n };\n }\n\n const port = await findAvailablePort(preferredPort);\n const logBuffer = createEmbeddedPostgresLogBuffer();\n const instance = new EmbeddedPostgres({\n databaseDir: dataDir,\n user: \"paperclip\",\n password: \"paperclip\",\n port,\n persistent: true,\n initdbFlags: [\"--encoding=UTF8\", \"--locale=C\", \"--lc-messages=C\"],\n onLog: logBuffer.append,\n onError: logBuffer.append,\n });\n\n if (!existsSync(path.resolve(dataDir, \"PG_VERSION\"))) {\n try {\n await instance.initialise();\n } catch (error) {\n throw formatEmbeddedPostgresError(error, {\n fallbackMessage: `Failed to initialize embedded PostgreSQL cluster in ${dataDir} on port ${port}`,\n recentLogs: logBuffer.getRecentLogs(),\n });\n }\n }\n if (existsSync(postmasterPidFile)) {\n rmSync(postmasterPidFile, { force: true });\n }\n try {\n await instance.start();\n } catch (error) {\n throw formatEmbeddedPostgresError(error, {\n fallbackMessage: `Failed to start embedded PostgreSQL on port ${port}`,\n recentLogs: logBuffer.getRecentLogs(),\n });\n }\n\n return {\n port,\n startedByThisProcess: true,\n stop: async () => {\n await instance.stop();\n },\n };\n}\n\nasync function seedWorktreeDatabase(input: {\n sourceConfigPath: string;\n sourceConfig: PaperclipConfig;\n targetConfig: PaperclipConfig;\n targetPaths: WorktreeLocalPaths;\n instanceId: string;\n seedMode: WorktreeSeedMode;\n}): Promise<SeedWorktreeDatabaseResult> {\n const seedPlan = resolveWorktreeSeedPlan(input.seedMode);\n const sourceEnvFile = resolvePaperclipEnvFile(input.sourceConfigPath);\n const sourceEnvEntries = readPaperclipEnvEntries(sourceEnvFile);\n copySeededSecretsKey({\n sourceConfigPath: input.sourceConfigPath,\n sourceConfig: input.sourceConfig,\n sourceEnvEntries,\n targetKeyFilePath: input.targetPaths.secretsKeyFilePath,\n });\n let sourceHandle: EmbeddedPostgresHandle | null = null;\n let targetHandle: EmbeddedPostgresHandle | null = null;\n\n try {\n if (input.sourceConfig.database.mode === \"embedded-postgres\") {\n sourceHandle = await ensureEmbeddedPostgres(\n input.sourceConfig.database.embeddedPostgresDataDir,\n input.sourceConfig.database.embeddedPostgresPort,\n );\n }\n const sourceConnectionString = resolveSourceConnectionString(\n input.sourceConfig,\n sourceEnvEntries,\n sourceHandle?.port,\n );\n const backup = await runDatabaseBackup({\n connectionString: sourceConnectionString,\n backupDir: path.resolve(input.targetPaths.backupDir, \"seed\"),\n retentionDays: 7,\n filenamePrefix: `${input.instanceId}-seed`,\n includeMigrationJournal: true,\n excludeTables: seedPlan.excludedTables,\n nullifyColumns: seedPlan.nullifyColumns,\n });\n\n targetHandle = await ensureEmbeddedPostgres(\n input.targetConfig.database.embeddedPostgresDataDir,\n input.targetConfig.database.embeddedPostgresPort,\n );\n\n const adminConnectionString = `postgres://paperclip:paperclip@127.0.0.1:${targetHandle.port}/postgres`;\n await ensurePostgresDatabase(adminConnectionString, \"paperclip\");\n const targetConnectionString = `postgres://paperclip:paperclip@127.0.0.1:${targetHandle.port}/paperclip`;\n await runDatabaseRestore({\n connectionString: targetConnectionString,\n backupFile: backup.backupFile,\n });\n await applyPendingMigrations(targetConnectionString);\n const reboundWorkspaces = await rebindSeededProjectWorkspaces({\n targetConnectionString,\n currentCwd: input.targetPaths.cwd,\n });\n\n return {\n backupSummary: formatDatabaseBackupResult(backup),\n reboundWorkspaces,\n };\n } finally {\n if (targetHandle?.startedByThisProcess) {\n await targetHandle.stop();\n }\n if (sourceHandle?.startedByThisProcess) {\n await sourceHandle.stop();\n }\n }\n}\n\nasync function runWorktreeInit(opts: WorktreeInitOptions): Promise<void> {\n const cwd = process.cwd();\n const worktreeName = resolveSuggestedWorktreeName(\n cwd,\n opts.name ?? detectGitBranchName(cwd) ?? undefined,\n );\n const seedMode = opts.seedMode ?? \"minimal\";\n if (!isWorktreeSeedMode(seedMode)) {\n throw new Error(`Unsupported seed mode \"${seedMode}\". Expected one of: minimal, full.`);\n }\n const instanceId = sanitizeWorktreeInstanceId(opts.instance ?? worktreeName);\n const paths = resolveWorktreeLocalPaths({\n cwd,\n homeDir: resolveWorktreeHome(opts.home),\n instanceId,\n });\n const branding = {\n name: worktreeName,\n color: generateWorktreeColor(),\n };\n const sourceConfigPath = resolveSourceConfigPath(opts);\n const sourceConfig = existsSync(sourceConfigPath) ? readConfig(sourceConfigPath) : null;\n\n if ((existsSync(paths.configPath) || existsSync(paths.instanceRoot)) && !opts.force) {\n throw new Error(\n `Worktree config already exists at ${paths.configPath} or instance data exists at ${paths.instanceRoot}. Re-run with --force to replace it.`,\n );\n }\n\n if (opts.force) {\n rmSync(paths.repoConfigDir, { recursive: true, force: true });\n rmSync(paths.instanceRoot, { recursive: true, force: true });\n }\n\n const claimedPorts = collectClaimedWorktreePorts(paths.homeDir, paths.instanceId, paths.cwd);\n const preferredServerPort = opts.serverPort ?? ((sourceConfig?.server.port ?? 3100) + 1);\n const serverPort = await findAvailablePort(preferredServerPort, claimedPorts.serverPorts);\n const preferredDbPort = opts.dbPort ?? ((sourceConfig?.database.embeddedPostgresPort ?? 54329) + 1);\n const databasePort = await findAvailablePort(\n preferredDbPort,\n new Set([...claimedPorts.databasePorts, serverPort]),\n );\n const targetConfig = buildWorktreeConfig({\n sourceConfig,\n paths,\n serverPort,\n databasePort,\n });\n\n writeConfig(targetConfig, paths.configPath);\n const sourceEnvEntries = readPaperclipEnvEntries(resolvePaperclipEnvFile(sourceConfigPath));\n const existingAgentJwtSecret =\n nonEmpty(sourceEnvEntries.PAPERCLIP_AGENT_JWT_SECRET) ??\n nonEmpty(process.env.PAPERCLIP_AGENT_JWT_SECRET);\n mergePaperclipEnvEntries(\n {\n ...buildWorktreeEnvEntries(paths, branding),\n ...(existingAgentJwtSecret ? { PAPERCLIP_AGENT_JWT_SECRET: existingAgentJwtSecret } : {}),\n },\n paths.envPath,\n );\n ensureAgentJwtSecret(paths.configPath);\n loadPaperclipEnvFile(paths.configPath);\n const copiedGitHooks = copyGitHooksToWorktreeGitDir(cwd);\n\n let seedSummary: string | null = null;\n let reboundWorkspaceSummary: SeedWorktreeDatabaseResult[\"reboundWorkspaces\"] = [];\n if (opts.seed !== false) {\n if (!sourceConfig) {\n throw new Error(\n `Cannot seed worktree database because source config was not found at ${sourceConfigPath}. Use --no-seed or provide --from-config.`,\n );\n }\n const spinner = p.spinner();\n spinner.start(`Seeding isolated worktree database from source instance (${seedMode})...`);\n try {\n const seeded = await seedWorktreeDatabase({\n sourceConfigPath,\n sourceConfig,\n targetConfig,\n targetPaths: paths,\n instanceId,\n seedMode,\n });\n seedSummary = seeded.backupSummary;\n reboundWorkspaceSummary = seeded.reboundWorkspaces;\n spinner.stop(`Seeded isolated worktree database (${seedMode}).`);\n } catch (error) {\n spinner.stop(pc.red(\"Failed to seed worktree database.\"));\n throw error;\n }\n }\n\n p.log.message(pc.dim(`Repo config: ${paths.configPath}`));\n p.log.message(pc.dim(`Repo env: ${paths.envPath}`));\n p.log.message(pc.dim(`Isolated home: ${paths.homeDir}`));\n p.log.message(pc.dim(`Instance: ${paths.instanceId}`));\n p.log.message(pc.dim(`Worktree badge: ${branding.name} (${branding.color})`));\n p.log.message(pc.dim(`Server port: ${serverPort} | DB port: ${databasePort}`));\n if (copiedGitHooks?.copied) {\n p.log.message(\n pc.dim(`Mirrored git hooks: ${copiedGitHooks.sourceHooksPath} -> ${copiedGitHooks.targetHooksPath}`),\n );\n }\n if (seedSummary) {\n p.log.message(pc.dim(`Seed mode: ${seedMode}`));\n p.log.message(pc.dim(`Seed snapshot: ${seedSummary}`));\n for (const rebound of reboundWorkspaceSummary) {\n p.log.message(\n pc.dim(`Rebound workspace ${rebound.name}: ${rebound.fromCwd} -> ${rebound.toCwd}`),\n );\n }\n }\n p.outro(\n pc.green(\n `Worktree ready. Run Relay Control inside this repo and the CLI/server will use ${paths.instanceId} automatically.`,\n ),\n );\n}\n\nexport async function worktreeInitCommand(opts: WorktreeInitOptions): Promise<void> {\n printPaperclipCliBanner();\n p.intro(pc.bgCyan(pc.black(\" relaycontrol worktree init \")));\n await runWorktreeInit(opts);\n}\n\nexport async function worktreeMakeCommand(nameArg: string, opts: WorktreeMakeOptions): Promise<void> {\n printPaperclipCliBanner();\n p.intro(pc.bgCyan(pc.black(\" relaycontrol worktree:make \")));\n\n const name = resolveWorktreeMakeName(nameArg);\n const startPoint = resolveWorktreeStartPoint(opts.startPoint);\n const sourceCwd = process.cwd();\n const sourceConfigPath = resolveSourceConfigPath(opts);\n const targetPath = resolveWorktreeMakeTargetPath(name);\n if (existsSync(targetPath)) {\n throw new Error(`Target path already exists: ${targetPath}`);\n }\n\n mkdirSync(path.dirname(targetPath), { recursive: true });\n if (startPoint) {\n const [remote] = startPoint.split(\"/\", 1);\n try {\n execFileSync(\"git\", [\"fetch\", remote], {\n cwd: sourceCwd,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n } catch (error) {\n throw new Error(\n `Failed to fetch from remote \"${remote}\": ${extractExecSyncErrorMessage(error) ?? String(error)}`,\n );\n }\n }\n\n const worktreeArgs = resolveGitWorktreeAddArgs({\n branchName: name,\n targetPath,\n branchExists: !startPoint && localBranchExists(sourceCwd, name),\n startPoint,\n });\n\n const spinner = p.spinner();\n spinner.start(`Creating git worktree at ${targetPath}...`);\n try {\n execFileSync(\"git\", worktreeArgs, {\n cwd: sourceCwd,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n spinner.stop(`Created git worktree at ${targetPath}.`);\n } catch (error) {\n spinner.stop(pc.red(\"Failed to create git worktree.\"));\n throw new Error(extractExecSyncErrorMessage(error) ?? String(error));\n }\n\n const installSpinner = p.spinner();\n installSpinner.start(\"Installing dependencies...\");\n try {\n execFileSync(\"pnpm\", [\"install\"], {\n cwd: targetPath,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n installSpinner.stop(\"Installed dependencies.\");\n } catch (error) {\n installSpinner.stop(pc.yellow(\"Failed to install dependencies (continuing anyway).\"));\n p.log.warning(extractExecSyncErrorMessage(error) ?? String(error));\n }\n\n const originalCwd = process.cwd();\n try {\n process.chdir(targetPath);\n await runWorktreeInit({\n ...opts,\n name,\n sourceConfigPathOverride: sourceConfigPath,\n });\n } catch (error) {\n throw error;\n } finally {\n process.chdir(originalCwd);\n }\n}\n\ntype WorktreeCleanupOptions = {\n instance?: string;\n home?: string;\n force?: boolean;\n};\n\ntype GitWorktreeListEntry = {\n worktree: string;\n branch: string | null;\n bare: boolean;\n detached: boolean;\n};\n\ntype MergeSourceChoice = {\n worktree: string;\n branch: string | null;\n branchLabel: string;\n hasPaperclipConfig: boolean;\n isCurrent: boolean;\n};\n\ntype ResolvedWorktreeEndpoint = {\n rootPath: string;\n configPath: string;\n label: string;\n isCurrent: boolean;\n};\n\nfunction parseGitWorktreeList(cwd: string): GitWorktreeListEntry[] {\n const raw = execFileSync(\"git\", [\"worktree\", \"list\", \"--porcelain\"], {\n cwd,\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n const entries: GitWorktreeListEntry[] = [];\n let current: Partial<GitWorktreeListEntry> = {};\n for (const line of raw.split(\"\\n\")) {\n if (line.startsWith(\"worktree \")) {\n current = { worktree: line.slice(\"worktree \".length) };\n } else if (line.startsWith(\"branch \")) {\n current.branch = line.slice(\"branch \".length);\n } else if (line === \"bare\") {\n current.bare = true;\n } else if (line === \"detached\") {\n current.detached = true;\n } else if (line === \"\" && current.worktree) {\n entries.push({\n worktree: current.worktree,\n branch: current.branch ?? null,\n bare: current.bare ?? false,\n detached: current.detached ?? false,\n });\n current = {};\n }\n }\n if (current.worktree) {\n entries.push({\n worktree: current.worktree,\n branch: current.branch ?? null,\n bare: current.bare ?? false,\n detached: current.detached ?? false,\n });\n }\n return entries;\n}\n\nfunction toMergeSourceChoices(cwd: string): MergeSourceChoice[] {\n const currentCwd = path.resolve(cwd);\n return parseGitWorktreeList(cwd).map((entry) => {\n const branchLabel = entry.branch?.replace(/^refs\\/heads\\//, \"\") ?? \"(detached)\";\n const worktreePath = path.resolve(entry.worktree);\n return {\n worktree: worktreePath,\n branch: entry.branch,\n branchLabel,\n hasPaperclipConfig: existsSync(path.resolve(worktreePath, \".paperclip\", \"config.json\")),\n isCurrent: worktreePath === currentCwd,\n };\n });\n}\n\nfunction branchHasUniqueCommits(cwd: string, branchName: string): boolean {\n try {\n const output = execFileSync(\n \"git\",\n [\"log\", \"--oneline\", branchName, \"--not\", \"--remotes\", \"--exclude\", `refs/heads/${branchName}`, \"--branches\"],\n { cwd, encoding: \"utf8\", stdio: [\"ignore\", \"pipe\", \"pipe\"] },\n ).trim();\n return output.length > 0;\n } catch {\n return false;\n }\n}\n\nfunction branchExistsOnAnyRemote(cwd: string, branchName: string): boolean {\n try {\n const output = execFileSync(\n \"git\",\n [\"branch\", \"-r\", \"--list\", `*/${branchName}`],\n { cwd, encoding: \"utf8\", stdio: [\"ignore\", \"pipe\", \"pipe\"] },\n ).trim();\n return output.length > 0;\n } catch {\n return false;\n }\n}\n\nfunction worktreePathHasUncommittedChanges(worktreePath: string): boolean {\n try {\n const output = execFileSync(\n \"git\",\n [\"status\", \"--porcelain\"],\n { cwd: worktreePath, encoding: \"utf8\", stdio: [\"ignore\", \"pipe\", \"pipe\"] },\n ).trim();\n return output.length > 0;\n } catch {\n return false;\n }\n}\n\nexport async function worktreeCleanupCommand(nameArg: string, opts: WorktreeCleanupOptions): Promise<void> {\n printPaperclipCliBanner();\n p.intro(pc.bgCyan(pc.black(\" relaycontrol worktree:cleanup \")));\n\n const name = resolveWorktreeMakeName(nameArg);\n const sourceCwd = process.cwd();\n const targetPath = resolveWorktreeMakeTargetPath(name);\n const instanceId = sanitizeWorktreeInstanceId(opts.instance ?? name);\n const homeDir = path.resolve(expandHomePrefix(resolveWorktreeHome(opts.home)));\n const instanceRoot = path.resolve(homeDir, \"instances\", instanceId);\n\n // \u2500\u2500 1. Assess current state \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n const hasBranch = localBranchExists(sourceCwd, name);\n const hasTargetDir = existsSync(targetPath);\n const hasInstanceData = existsSync(instanceRoot);\n\n const worktrees = parseGitWorktreeList(sourceCwd);\n const linkedWorktree = worktrees.find(\n (wt) => wt.branch === `refs/heads/${name}` || path.resolve(wt.worktree) === path.resolve(targetPath),\n );\n\n if (!hasBranch && !hasTargetDir && !hasInstanceData && !linkedWorktree) {\n p.log.info(\"Nothing to clean up \u2014 no branch, worktree directory, or instance data found.\");\n p.outro(pc.green(\"Already clean.\"));\n return;\n }\n\n // \u2500\u2500 2. Safety checks \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n const problems: string[] = [];\n\n if (hasBranch && branchHasUniqueCommits(sourceCwd, name)) {\n const onRemote = branchExistsOnAnyRemote(sourceCwd, name);\n if (onRemote) {\n p.log.info(\n `Branch \"${name}\" has unique local commits, but the branch also exists on a remote \u2014 safe to delete locally.`,\n );\n } else {\n problems.push(\n `Branch \"${name}\" has commits not found on any other branch or remote. ` +\n `Deleting it will lose work. Push it first, or use --force.`,\n );\n }\n }\n\n if (hasTargetDir && worktreePathHasUncommittedChanges(targetPath)) {\n problems.push(\n `Worktree directory ${targetPath} has uncommitted changes. Commit or stash first, or use --force.`,\n );\n }\n\n if (problems.length > 0 && !opts.force) {\n for (const problem of problems) {\n p.log.error(problem);\n }\n throw new Error(\"Safety checks failed. Resolve the issues above or re-run with --force.\");\n }\n if (problems.length > 0 && opts.force) {\n for (const problem of problems) {\n p.log.warning(`Overridden by --force: ${problem}`);\n }\n }\n\n // \u2500\u2500 3. Clean up (idempotent steps) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n // 3a. Remove the git worktree registration\n if (linkedWorktree) {\n const worktreeDirExists = existsSync(linkedWorktree.worktree);\n const spinner = p.spinner();\n if (worktreeDirExists) {\n spinner.start(`Removing git worktree at ${linkedWorktree.worktree}...`);\n try {\n const removeArgs = [\"worktree\", \"remove\", linkedWorktree.worktree];\n if (opts.force) removeArgs.push(\"--force\");\n execFileSync(\"git\", removeArgs, {\n cwd: sourceCwd,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n spinner.stop(`Removed git worktree at ${linkedWorktree.worktree}.`);\n } catch (error) {\n spinner.stop(pc.yellow(`Could not remove worktree cleanly, will prune instead.`));\n p.log.warning(extractExecSyncErrorMessage(error) ?? String(error));\n }\n } else {\n spinner.start(\"Pruning stale worktree entry...\");\n execFileSync(\"git\", [\"worktree\", \"prune\"], {\n cwd: sourceCwd,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n spinner.stop(\"Pruned stale worktree entry.\");\n }\n } else {\n // Even without a linked worktree, prune to clean up any orphaned entries\n execFileSync(\"git\", [\"worktree\", \"prune\"], {\n cwd: sourceCwd,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n }\n\n // 3b. Remove the worktree directory if it still exists (e.g. partial creation)\n if (existsSync(targetPath)) {\n const spinner = p.spinner();\n spinner.start(`Removing worktree directory ${targetPath}...`);\n rmSync(targetPath, { recursive: true, force: true });\n spinner.stop(`Removed worktree directory ${targetPath}.`);\n }\n\n // 3c. Delete the local branch (now safe \u2014 worktree is gone)\n if (localBranchExists(sourceCwd, name)) {\n const spinner = p.spinner();\n spinner.start(`Deleting local branch \"${name}\"...`);\n try {\n const deleteFlag = opts.force ? \"-D\" : \"-d\";\n execFileSync(\"git\", [\"branch\", deleteFlag, name], {\n cwd: sourceCwd,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n spinner.stop(`Deleted local branch \"${name}\".`);\n } catch (error) {\n spinner.stop(pc.yellow(`Could not delete branch \"${name}\".`));\n p.log.warning(extractExecSyncErrorMessage(error) ?? String(error));\n }\n }\n\n // 3d. Remove instance data\n if (existsSync(instanceRoot)) {\n const spinner = p.spinner();\n spinner.start(`Removing instance data at ${instanceRoot}...`);\n rmSync(instanceRoot, { recursive: true, force: true });\n spinner.stop(`Removed instance data at ${instanceRoot}.`);\n }\n\n p.outro(pc.green(\"Cleanup complete.\"));\n}\n\nexport async function worktreeEnvCommand(opts: WorktreeEnvOptions): Promise<void> {\n const configPath = resolveConfigPath(opts.config);\n const envPath = resolvePaperclipEnvFile(configPath);\n const envEntries = readPaperclipEnvEntries(envPath);\n const out = {\n PAPERCLIP_CONFIG: configPath,\n ...(envEntries.PAPERCLIP_HOME ? { PAPERCLIP_HOME: envEntries.PAPERCLIP_HOME } : {}),\n ...(envEntries.PAPERCLIP_INSTANCE_ID ? { PAPERCLIP_INSTANCE_ID: envEntries.PAPERCLIP_INSTANCE_ID } : {}),\n ...(envEntries.PAPERCLIP_CONTEXT ? { PAPERCLIP_CONTEXT: envEntries.PAPERCLIP_CONTEXT } : {}),\n ...envEntries,\n };\n\n if (opts.json) {\n console.log(JSON.stringify(out, null, 2));\n return;\n }\n\n console.log(formatShellExports(out));\n}\n\ntype ClosableDb = ReturnType<typeof createDb> & {\n $client?: { end?: (opts?: { timeout?: number }) => Promise<void> };\n};\n\ntype OpenDbHandle = {\n db: ClosableDb;\n stop: () => Promise<void>;\n};\n\ntype ResolvedMergeCompany = {\n id: string;\n name: string;\n issuePrefix: string;\n};\n\nasync function closeDb(db: ClosableDb): Promise<void> {\n await db.$client?.end?.({ timeout: 5 }).catch(() => undefined);\n}\n\nfunction resolveCurrentEndpoint(): ResolvedWorktreeEndpoint {\n return {\n rootPath: path.resolve(process.cwd()),\n configPath: resolveConfigPath(),\n label: \"current\",\n isCurrent: true,\n };\n}\n\nfunction resolveAttachmentLookupStorages(input: {\n sourceEndpoint: ResolvedWorktreeEndpoint;\n targetEndpoint: ResolvedWorktreeEndpoint;\n}): ConfiguredStorage[] {\n const orderedConfigPaths = [\n input.sourceEndpoint.configPath,\n resolveCurrentEndpoint().configPath,\n input.targetEndpoint.configPath,\n ...toMergeSourceChoices(process.cwd())\n .filter((choice) => choice.hasPaperclipConfig)\n .map((choice) => path.resolve(choice.worktree, \".paperclip\", \"config.json\")),\n ];\n const seen = new Set<string>();\n const storages: ConfiguredStorage[] = [];\n for (const configPath of orderedConfigPaths) {\n const resolved = path.resolve(configPath);\n if (seen.has(resolved) || !existsSync(resolved)) continue;\n seen.add(resolved);\n storages.push(openConfiguredStorage(resolved));\n }\n return storages;\n}\n\nasync function openConfiguredDb(configPath: string): Promise<OpenDbHandle> {\n const config = readConfig(configPath);\n if (!config) {\n throw new Error(`Config not found at ${configPath}.`);\n }\n const envEntries = readPaperclipEnvEntries(resolvePaperclipEnvFile(configPath));\n let embeddedHandle: EmbeddedPostgresHandle | null = null;\n\n try {\n if (config.database.mode === \"embedded-postgres\") {\n embeddedHandle = await ensureEmbeddedPostgres(\n config.database.embeddedPostgresDataDir,\n config.database.embeddedPostgresPort,\n );\n }\n const connectionString = resolveSourceConnectionString(config, envEntries, embeddedHandle?.port);\n const migrationState = await inspectMigrations(connectionString);\n if (migrationState.status !== \"upToDate\") {\n const pending =\n migrationState.reason === \"pending-migrations\"\n ? ` Pending migrations: ${migrationState.pendingMigrations.join(\", \")}.`\n : \"\";\n throw new Error(\n `Database for ${configPath} is not up to date.${pending} Run \\`pnpm db:migrate\\` (or start Relay Control once) before using worktree merge history.`,\n );\n }\n const db = createDb(connectionString) as ClosableDb;\n return {\n db,\n stop: async () => {\n await closeDb(db);\n if (embeddedHandle?.startedByThisProcess) {\n await embeddedHandle.stop();\n }\n },\n };\n } catch (error) {\n if (embeddedHandle?.startedByThisProcess) {\n await embeddedHandle.stop().catch(() => undefined);\n }\n throw error;\n }\n}\n\nasync function resolveMergeCompany(input: {\n sourceDb: ClosableDb;\n targetDb: ClosableDb;\n selector?: string;\n}): Promise<ResolvedMergeCompany> {\n const [sourceCompanies, targetCompanies] = await Promise.all([\n input.sourceDb\n .select({\n id: companies.id,\n name: companies.name,\n issuePrefix: companies.issuePrefix,\n })\n .from(companies),\n input.targetDb\n .select({\n id: companies.id,\n name: companies.name,\n issuePrefix: companies.issuePrefix,\n })\n .from(companies),\n ]);\n\n const targetById = new Map(targetCompanies.map((company) => [company.id, company]));\n const shared = sourceCompanies.filter((company) => targetById.has(company.id));\n const selector = nonEmpty(input.selector);\n if (selector) {\n const matched = shared.find(\n (company) => company.id === selector || company.issuePrefix.toLowerCase() === selector.toLowerCase(),\n );\n if (!matched) {\n throw new Error(`Could not resolve company \"${selector}\" in both source and target databases.`);\n }\n return matched;\n }\n\n if (shared.length === 1) {\n return shared[0];\n }\n\n if (shared.length === 0) {\n throw new Error(\"Source and target databases do not share a company id. Pass --company explicitly once both sides match.\");\n }\n\n const options = shared\n .map((company) => `${company.issuePrefix} (${company.name})`)\n .join(\", \");\n throw new Error(`Multiple shared companies found. Re-run with --company <id-or-prefix>. Options: ${options}`);\n}\n\nfunction renderMergePlan(plan: Awaited<ReturnType<typeof collectMergePlan>>[\"plan\"], extras: {\n sourcePath: string;\n targetPath: string;\n unsupportedRunCount: number;\n}): string {\n const terminalWidth = Math.max(60, process.stdout.columns ?? 100);\n const oneLine = (value: string) => value.replace(/\\s+/g, \" \").trim();\n const truncateToWidth = (value: string, maxWidth: number) => {\n if (maxWidth <= 1) return \"\";\n if (value.length <= maxWidth) return value;\n return `${value.slice(0, Math.max(0, maxWidth - 1)).trimEnd()}\u2026`;\n };\n const lines = [\n `Mode: preview`,\n `Source: ${extras.sourcePath}`,\n `Target: ${extras.targetPath}`,\n `Company: ${plan.companyName} (${plan.issuePrefix})`,\n \"\",\n \"Projects\",\n `- import: ${plan.counts.projectsToImport}`,\n \"\",\n \"Issues\",\n `- insert: ${plan.counts.issuesToInsert}`,\n `- already present: ${plan.counts.issuesExisting}`,\n `- shared/imported issues with drift: ${plan.counts.issueDrift}`,\n ];\n\n if (plan.projectImports.length > 0) {\n lines.push(\"\");\n lines.push(\"Planned project imports\");\n for (const project of plan.projectImports) {\n lines.push(\n `- ${project.source.name} (${project.workspaces.length} workspace${project.workspaces.length === 1 ? \"\" : \"s\"})`,\n );\n }\n }\n\n const issueInserts = plan.issuePlans.filter((item): item is PlannedIssueInsert => item.action === \"insert\");\n if (issueInserts.length > 0) {\n lines.push(\"\");\n lines.push(\"Planned issue imports\");\n for (const issue of issueInserts) {\n const projectNote =\n (issue.projectResolution === \"mapped\" || issue.projectResolution === \"imported\")\n && issue.mappedProjectName\n ? ` project->${issue.projectResolution === \"imported\" ? \"import:\" : \"\"}${issue.mappedProjectName}`\n : \"\";\n const adjustments = issue.adjustments.length > 0 ? ` [${issue.adjustments.join(\", \")}]` : \"\";\n const prefix = `- ${issue.source.identifier ?? issue.source.id} -> ${issue.previewIdentifier} (${issue.targetStatus}${projectNote})`;\n const title = oneLine(issue.source.title);\n const suffix = `${adjustments}${title ? ` ${title}` : \"\"}`;\n lines.push(\n `${prefix}${truncateToWidth(suffix, Math.max(8, terminalWidth - prefix.length))}`,\n );\n }\n }\n\n if (plan.scopes.includes(\"comments\")) {\n lines.push(\"\");\n lines.push(\"Comments\");\n lines.push(`- insert: ${plan.counts.commentsToInsert}`);\n lines.push(`- already present: ${plan.counts.commentsExisting}`);\n lines.push(`- skipped (missing parent): ${plan.counts.commentsMissingParent}`);\n }\n\n lines.push(\"\");\n lines.push(\"Documents\");\n lines.push(`- insert: ${plan.counts.documentsToInsert}`);\n lines.push(`- merge existing: ${plan.counts.documentsToMerge}`);\n lines.push(`- already present: ${plan.counts.documentsExisting}`);\n lines.push(`- skipped (conflicting key): ${plan.counts.documentsConflictingKey}`);\n lines.push(`- skipped (missing parent): ${plan.counts.documentsMissingParent}`);\n lines.push(`- revisions insert: ${plan.counts.documentRevisionsToInsert}`);\n\n lines.push(\"\");\n lines.push(\"Attachments\");\n lines.push(`- insert: ${plan.counts.attachmentsToInsert}`);\n lines.push(`- already present: ${plan.counts.attachmentsExisting}`);\n lines.push(`- skipped (missing parent): ${plan.counts.attachmentsMissingParent}`);\n\n lines.push(\"\");\n lines.push(\"Adjustments\");\n lines.push(`- cleared assignee agents: ${plan.adjustments.clear_assignee_agent}`);\n lines.push(`- cleared projects: ${plan.adjustments.clear_project}`);\n lines.push(`- cleared project workspaces: ${plan.adjustments.clear_project_workspace}`);\n lines.push(`- cleared goals: ${plan.adjustments.clear_goal}`);\n lines.push(`- cleared comment author agents: ${plan.adjustments.clear_author_agent}`);\n lines.push(`- cleared document agents: ${plan.adjustments.clear_document_agent}`);\n lines.push(`- cleared document revision agents: ${plan.adjustments.clear_document_revision_agent}`);\n lines.push(`- cleared attachment author agents: ${plan.adjustments.clear_attachment_agent}`);\n lines.push(`- coerced in_progress to todo: ${plan.adjustments.coerce_in_progress_to_todo}`);\n\n lines.push(\"\");\n lines.push(\"Not imported in this phase\");\n lines.push(`- heartbeat runs: ${extras.unsupportedRunCount}`);\n lines.push(\"\");\n lines.push(\"Identifiers shown above are provisional preview values. `--apply` reserves fresh issue numbers at write time.\");\n\n return lines.join(\"\\n\");\n}\n\nasync function collectMergePlan(input: {\n sourceDb: ClosableDb;\n targetDb: ClosableDb;\n company: ResolvedMergeCompany;\n scopes: ReturnType<typeof parseWorktreeMergeScopes>;\n importProjectIds?: Iterable<string>;\n projectIdOverrides?: Record<string, string | null | undefined>;\n}) {\n const companyId = input.company.id;\n const [\n targetCompanyRow,\n sourceIssuesRows,\n targetIssuesRows,\n sourceCommentsRows,\n targetCommentsRows,\n sourceIssueDocumentsRows,\n targetIssueDocumentsRows,\n sourceDocumentRevisionRows,\n targetDocumentRevisionRows,\n sourceAttachmentRows,\n targetAttachmentRows,\n sourceProjectsRows,\n sourceProjectWorkspaceRows,\n targetProjectsRows,\n targetAgentsRows,\n targetProjectWorkspaceRows,\n targetGoalsRows,\n runCountRows,\n ] = await Promise.all([\n input.targetDb\n .select({\n issueCounter: companies.issueCounter,\n })\n .from(companies)\n .where(eq(companies.id, companyId))\n .then((rows) => rows[0] ?? null),\n input.sourceDb\n .select()\n .from(issues)\n .where(eq(issues.companyId, companyId)),\n input.targetDb\n .select()\n .from(issues)\n .where(eq(issues.companyId, companyId)),\n input.scopes.includes(\"comments\")\n ? input.sourceDb\n .select()\n .from(issueComments)\n .where(eq(issueComments.companyId, companyId))\n : Promise.resolve([]),\n input.targetDb\n .select()\n .from(issueComments)\n .where(eq(issueComments.companyId, companyId)),\n input.sourceDb\n .select({\n id: issueDocuments.id,\n companyId: issueDocuments.companyId,\n issueId: issueDocuments.issueId,\n documentId: issueDocuments.documentId,\n key: issueDocuments.key,\n linkCreatedAt: issueDocuments.createdAt,\n linkUpdatedAt: issueDocuments.updatedAt,\n title: documents.title,\n format: documents.format,\n latestBody: documents.latestBody,\n latestRevisionId: documents.latestRevisionId,\n latestRevisionNumber: documents.latestRevisionNumber,\n createdByAgentId: documents.createdByAgentId,\n createdByUserId: documents.createdByUserId,\n updatedByAgentId: documents.updatedByAgentId,\n updatedByUserId: documents.updatedByUserId,\n documentCreatedAt: documents.createdAt,\n documentUpdatedAt: documents.updatedAt,\n })\n .from(issueDocuments)\n .innerJoin(documents, eq(issueDocuments.documentId, documents.id))\n .innerJoin(issues, eq(issueDocuments.issueId, issues.id))\n .where(eq(issues.companyId, companyId)),\n input.targetDb\n .select({\n id: issueDocuments.id,\n companyId: issueDocuments.companyId,\n issueId: issueDocuments.issueId,\n documentId: issueDocuments.documentId,\n key: issueDocuments.key,\n linkCreatedAt: issueDocuments.createdAt,\n linkUpdatedAt: issueDocuments.updatedAt,\n title: documents.title,\n format: documents.format,\n latestBody: documents.latestBody,\n latestRevisionId: documents.latestRevisionId,\n latestRevisionNumber: documents.latestRevisionNumber,\n createdByAgentId: documents.createdByAgentId,\n createdByUserId: documents.createdByUserId,\n updatedByAgentId: documents.updatedByAgentId,\n updatedByUserId: documents.updatedByUserId,\n documentCreatedAt: documents.createdAt,\n documentUpdatedAt: documents.updatedAt,\n })\n .from(issueDocuments)\n .innerJoin(documents, eq(issueDocuments.documentId, documents.id))\n .innerJoin(issues, eq(issueDocuments.issueId, issues.id))\n .where(eq(issues.companyId, companyId)),\n input.sourceDb\n .select({\n id: documentRevisions.id,\n companyId: documentRevisions.companyId,\n documentId: documentRevisions.documentId,\n revisionNumber: documentRevisions.revisionNumber,\n body: documentRevisions.body,\n changeSummary: documentRevisions.changeSummary,\n createdByAgentId: documentRevisions.createdByAgentId,\n createdByUserId: documentRevisions.createdByUserId,\n createdAt: documentRevisions.createdAt,\n })\n .from(documentRevisions)\n .innerJoin(issueDocuments, eq(documentRevisions.documentId, issueDocuments.documentId))\n .innerJoin(issues, eq(issueDocuments.issueId, issues.id))\n .where(eq(issues.companyId, companyId)),\n input.targetDb\n .select({\n id: documentRevisions.id,\n companyId: documentRevisions.companyId,\n documentId: documentRevisions.documentId,\n revisionNumber: documentRevisions.revisionNumber,\n body: documentRevisions.body,\n changeSummary: documentRevisions.changeSummary,\n createdByAgentId: documentRevisions.createdByAgentId,\n createdByUserId: documentRevisions.createdByUserId,\n createdAt: documentRevisions.createdAt,\n })\n .from(documentRevisions)\n .innerJoin(issueDocuments, eq(documentRevisions.documentId, issueDocuments.documentId))\n .innerJoin(issues, eq(issueDocuments.issueId, issues.id))\n .where(eq(issues.companyId, companyId)),\n input.sourceDb\n .select({\n id: issueAttachments.id,\n companyId: issueAttachments.companyId,\n issueId: issueAttachments.issueId,\n issueCommentId: issueAttachments.issueCommentId,\n assetId: issueAttachments.assetId,\n provider: assets.provider,\n objectKey: assets.objectKey,\n contentType: assets.contentType,\n byteSize: assets.byteSize,\n sha256: assets.sha256,\n originalFilename: assets.originalFilename,\n createdByAgentId: assets.createdByAgentId,\n createdByUserId: assets.createdByUserId,\n assetCreatedAt: assets.createdAt,\n assetUpdatedAt: assets.updatedAt,\n attachmentCreatedAt: issueAttachments.createdAt,\n attachmentUpdatedAt: issueAttachments.updatedAt,\n })\n .from(issueAttachments)\n .innerJoin(assets, eq(issueAttachments.assetId, assets.id))\n .innerJoin(issues, eq(issueAttachments.issueId, issues.id))\n .where(eq(issues.companyId, companyId)),\n input.targetDb\n .select({\n id: issueAttachments.id,\n companyId: issueAttachments.companyId,\n issueId: issueAttachments.issueId,\n issueCommentId: issueAttachments.issueCommentId,\n assetId: issueAttachments.assetId,\n provider: assets.provider,\n objectKey: assets.objectKey,\n contentType: assets.contentType,\n byteSize: assets.byteSize,\n sha256: assets.sha256,\n originalFilename: assets.originalFilename,\n createdByAgentId: assets.createdByAgentId,\n createdByUserId: assets.createdByUserId,\n assetCreatedAt: assets.createdAt,\n assetUpdatedAt: assets.updatedAt,\n attachmentCreatedAt: issueAttachments.createdAt,\n attachmentUpdatedAt: issueAttachments.updatedAt,\n })\n .from(issueAttachments)\n .innerJoin(assets, eq(issueAttachments.assetId, assets.id))\n .innerJoin(issues, eq(issueAttachments.issueId, issues.id))\n .where(eq(issues.companyId, companyId)),\n input.sourceDb\n .select()\n .from(projects)\n .where(eq(projects.companyId, companyId)),\n input.sourceDb\n .select()\n .from(projectWorkspaces)\n .where(eq(projectWorkspaces.companyId, companyId)),\n input.targetDb\n .select()\n .from(projects)\n .where(eq(projects.companyId, companyId)),\n input.targetDb\n .select()\n .from(agents)\n .where(eq(agents.companyId, companyId)),\n input.targetDb\n .select()\n .from(projectWorkspaces)\n .where(eq(projectWorkspaces.companyId, companyId)),\n input.targetDb\n .select()\n .from(goals)\n .where(eq(goals.companyId, companyId)),\n input.sourceDb\n .select({ count: sql<number>`count(*)::int` })\n .from(heartbeatRuns)\n .where(eq(heartbeatRuns.companyId, companyId)),\n ]);\n\n if (!targetCompanyRow) {\n throw new Error(`Target company ${companyId} was not found.`);\n }\n\n const plan = buildWorktreeMergePlan({\n companyId,\n companyName: input.company.name,\n issuePrefix: input.company.issuePrefix,\n previewIssueCounterStart: targetCompanyRow.issueCounter,\n scopes: input.scopes,\n sourceIssues: sourceIssuesRows,\n targetIssues: targetIssuesRows,\n sourceComments: sourceCommentsRows,\n targetComments: targetCommentsRows,\n sourceProjects: sourceProjectsRows,\n sourceProjectWorkspaces: sourceProjectWorkspaceRows,\n sourceDocuments: sourceIssueDocumentsRows as IssueDocumentRow[],\n targetDocuments: targetIssueDocumentsRows as IssueDocumentRow[],\n sourceDocumentRevisions: sourceDocumentRevisionRows as DocumentRevisionRow[],\n targetDocumentRevisions: targetDocumentRevisionRows as DocumentRevisionRow[],\n sourceAttachments: sourceAttachmentRows as IssueAttachmentRow[],\n targetAttachments: targetAttachmentRows as IssueAttachmentRow[],\n targetAgents: targetAgentsRows,\n targetProjects: targetProjectsRows,\n targetProjectWorkspaces: targetProjectWorkspaceRows,\n targetGoals: targetGoalsRows,\n importProjectIds: input.importProjectIds,\n projectIdOverrides: input.projectIdOverrides,\n });\n\n return {\n plan,\n sourceProjects: sourceProjectsRows,\n targetProjects: targetProjectsRows,\n unsupportedRunCount: runCountRows[0]?.count ?? 0,\n };\n}\n\ntype ProjectMappingSelections = {\n importProjectIds: string[];\n projectIdOverrides: Record<string, string | null>;\n};\n\nasync function promptForProjectMappings(input: {\n plan: Awaited<ReturnType<typeof collectMergePlan>>[\"plan\"];\n sourceProjects: Awaited<ReturnType<typeof collectMergePlan>>[\"sourceProjects\"];\n targetProjects: Awaited<ReturnType<typeof collectMergePlan>>[\"targetProjects\"];\n}): Promise<ProjectMappingSelections> {\n const missingProjectIds = [\n ...new Set(\n input.plan.issuePlans\n .filter((plan): plan is PlannedIssueInsert => plan.action === \"insert\")\n .filter((plan) => !!plan.source.projectId && plan.projectResolution === \"cleared\")\n .map((plan) => plan.source.projectId as string),\n ),\n ];\n if (missingProjectIds.length === 0) {\n return {\n importProjectIds: [],\n projectIdOverrides: {},\n };\n }\n\n const sourceProjectsById = new Map(input.sourceProjects.map((project) => [project.id, project]));\n const targetChoices = [...input.targetProjects]\n .sort((left, right) => left.name.localeCompare(right.name))\n .map((project) => ({\n value: project.id,\n label: project.name,\n hint: project.status,\n }));\n\n const mappings: Record<string, string | null> = {};\n const importProjectIds = new Set<string>();\n for (const sourceProjectId of missingProjectIds) {\n const sourceProject = sourceProjectsById.get(sourceProjectId);\n if (!sourceProject) continue;\n const nameMatch = input.targetProjects.find(\n (project) => project.name.trim().toLowerCase() === sourceProject.name.trim().toLowerCase(),\n );\n const importSelectionValue = `__import__:${sourceProjectId}`;\n const selection = await p.select<string | null>({\n message: `Project \"${sourceProject.name}\" is missing in target. How should ${input.plan.issuePrefix} imports handle it?`,\n options: [\n {\n value: importSelectionValue,\n label: `Import ${sourceProject.name}`,\n hint: \"Create the project and copy its workspace settings\",\n },\n ...(nameMatch\n ? [{\n value: nameMatch.id,\n label: `Map to ${nameMatch.name}`,\n hint: \"Recommended: exact name match\",\n }]\n : []),\n {\n value: null,\n label: \"Leave unset\",\n hint: \"Keep imported issues without a project\",\n },\n ...targetChoices.filter((choice) => choice.value !== nameMatch?.id),\n ],\n initialValue: nameMatch?.id ?? null,\n });\n if (p.isCancel(selection)) {\n throw new Error(\"Project mapping cancelled.\");\n }\n if (selection === importSelectionValue) {\n importProjectIds.add(sourceProjectId);\n continue;\n }\n mappings[sourceProjectId] = selection;\n }\n\n return {\n importProjectIds: [...importProjectIds],\n projectIdOverrides: mappings,\n };\n}\n\nexport async function worktreeListCommand(opts: WorktreeListOptions): Promise<void> {\n const choices = toMergeSourceChoices(process.cwd());\n if (opts.json) {\n console.log(JSON.stringify(choices, null, 2));\n return;\n }\n\n for (const choice of choices) {\n const flags = [\n choice.isCurrent ? \"current\" : null,\n choice.hasPaperclipConfig ? \"paperclip\" : \"no-paperclip-config\",\n ].filter((value): value is string => value !== null);\n p.log.message(`${choice.branchLabel} ${choice.worktree} [${flags.join(\", \")}]`);\n }\n}\n\nfunction resolveEndpointFromChoice(choice: MergeSourceChoice): ResolvedWorktreeEndpoint {\n if (choice.isCurrent) {\n return resolveCurrentEndpoint();\n }\n return {\n rootPath: choice.worktree,\n configPath: path.resolve(choice.worktree, \".paperclip\", \"config.json\"),\n label: choice.branchLabel,\n isCurrent: false,\n };\n}\n\nfunction resolveWorktreeEndpointFromSelector(\n selector: string,\n opts?: { allowCurrent?: boolean },\n): ResolvedWorktreeEndpoint {\n const trimmed = selector.trim();\n const allowCurrent = opts?.allowCurrent !== false;\n if (trimmed.length === 0) {\n throw new Error(\"Worktree selector cannot be empty.\");\n }\n\n const currentEndpoint = resolveCurrentEndpoint();\n if (allowCurrent && trimmed === \"current\") {\n return currentEndpoint;\n }\n\n const choices = toMergeSourceChoices(process.cwd());\n const directPath = path.resolve(trimmed);\n if (existsSync(directPath)) {\n if (allowCurrent && directPath === currentEndpoint.rootPath) {\n return currentEndpoint;\n }\n const configPath = path.resolve(directPath, \".paperclip\", \"config.json\");\n if (!existsSync(configPath)) {\n throw new Error(`Resolved worktree path ${directPath} does not contain .paperclip/config.json.`);\n }\n return {\n rootPath: directPath,\n configPath,\n label: path.basename(directPath),\n isCurrent: false,\n };\n }\n\n const matched = choices.find((choice) =>\n (allowCurrent || !choice.isCurrent)\n && (choice.worktree === directPath\n || path.basename(choice.worktree) === trimmed\n || choice.branchLabel === trimmed),\n );\n if (!matched) {\n throw new Error(\n `Could not resolve worktree \"${selector}\". Use a path, a listed worktree directory name, branch name, or \"current\".`,\n );\n }\n if (!matched.hasPaperclipConfig && !matched.isCurrent) {\n throw new Error(`Resolved worktree \"${selector}\" does not look like a Relay Control worktree.`);\n }\n return resolveEndpointFromChoice(matched);\n}\n\nasync function promptForSourceEndpoint(excludeWorktreePath?: string): Promise<ResolvedWorktreeEndpoint> {\n const excluded = excludeWorktreePath ? path.resolve(excludeWorktreePath) : null;\n const currentEndpoint = resolveCurrentEndpoint();\n const choices = toMergeSourceChoices(process.cwd())\n .filter((choice) => choice.hasPaperclipConfig || choice.isCurrent)\n .filter((choice) => path.resolve(choice.worktree) !== excluded)\n .map((choice) => ({\n value: choice.isCurrent ? \"__current__\" : choice.worktree,\n label: choice.branchLabel,\n hint: `${choice.worktree}${choice.isCurrent ? \" (current)\" : \"\"}`,\n }));\n if (choices.length === 0) {\n throw new Error(\"No Relay Control worktrees were found. Run `relaycontrol worktree:list` to inspect the repo worktrees.\");\n }\n const selection = await p.select<string>({\n message: \"Choose the source worktree to import from\",\n options: choices,\n });\n if (p.isCancel(selection)) {\n throw new Error(\"Source worktree selection cancelled.\");\n }\n if (selection === \"__current__\") {\n return currentEndpoint;\n }\n return resolveWorktreeEndpointFromSelector(selection, { allowCurrent: true });\n}\n\nasync function applyMergePlan(input: {\n sourceStorages: ConfiguredStorage[];\n targetStorage: ConfiguredStorage;\n targetDb: ClosableDb;\n company: ResolvedMergeCompany;\n plan: Awaited<ReturnType<typeof collectMergePlan>>[\"plan\"];\n}) {\n const companyId = input.company.id;\n\n return await input.targetDb.transaction(async (tx) => {\n const importedProjectIds = input.plan.projectImports.map((project) => project.source.id);\n const existingImportedProjectIds = importedProjectIds.length > 0\n ? new Set(\n (await tx\n .select({ id: projects.id })\n .from(projects)\n .where(inArray(projects.id, importedProjectIds)))\n .map((row) => row.id),\n )\n : new Set<string>();\n const projectImports = input.plan.projectImports.filter((project) => !existingImportedProjectIds.has(project.source.id));\n const importedWorkspaceIds = projectImports.flatMap((project) => project.workspaces.map((workspace) => workspace.id));\n const existingImportedWorkspaceIds = importedWorkspaceIds.length > 0\n ? new Set(\n (await tx\n .select({ id: projectWorkspaces.id })\n .from(projectWorkspaces)\n .where(inArray(projectWorkspaces.id, importedWorkspaceIds)))\n .map((row) => row.id),\n )\n : new Set<string>();\n\n let insertedProjects = 0;\n let insertedProjectWorkspaces = 0;\n for (const project of projectImports) {\n await tx.insert(projects).values({\n id: project.source.id,\n companyId,\n goalId: project.targetGoalId,\n name: project.source.name,\n description: project.source.description,\n status: project.source.status,\n leadAgentId: project.targetLeadAgentId,\n targetDate: project.source.targetDate,\n color: project.source.color,\n pauseReason: project.source.pauseReason,\n pausedAt: project.source.pausedAt,\n executionWorkspacePolicy: project.source.executionWorkspacePolicy,\n archivedAt: project.source.archivedAt,\n createdAt: project.source.createdAt,\n updatedAt: project.source.updatedAt,\n });\n insertedProjects += 1;\n\n for (const workspace of project.workspaces) {\n if (existingImportedWorkspaceIds.has(workspace.id)) continue;\n await tx.insert(projectWorkspaces).values({\n id: workspace.id,\n companyId,\n projectId: project.source.id,\n name: workspace.name,\n sourceType: workspace.sourceType,\n cwd: workspace.cwd,\n repoUrl: workspace.repoUrl,\n repoRef: workspace.repoRef,\n defaultRef: workspace.defaultRef,\n visibility: workspace.visibility,\n setupCommand: workspace.setupCommand,\n cleanupCommand: workspace.cleanupCommand,\n remoteProvider: workspace.remoteProvider,\n remoteWorkspaceRef: workspace.remoteWorkspaceRef,\n sharedWorkspaceKey: workspace.sharedWorkspaceKey,\n metadata: workspace.metadata,\n isPrimary: workspace.isPrimary,\n createdAt: workspace.createdAt,\n updatedAt: workspace.updatedAt,\n });\n insertedProjectWorkspaces += 1;\n }\n }\n\n const issueCandidates = input.plan.issuePlans.filter(\n (plan): plan is PlannedIssueInsert => plan.action === \"insert\",\n );\n const issueCandidateIds = issueCandidates.map((issue) => issue.source.id);\n const existingIssueIds = issueCandidateIds.length > 0\n ? new Set(\n (await tx\n .select({ id: issues.id })\n .from(issues)\n .where(inArray(issues.id, issueCandidateIds)))\n .map((row) => row.id),\n )\n : new Set<string>();\n const issueInserts = issueCandidates.filter((issue) => !existingIssueIds.has(issue.source.id));\n\n let nextIssueNumber = 0;\n if (issueInserts.length > 0) {\n const [companyRow] = await tx\n .update(companies)\n .set({ issueCounter: sql`${companies.issueCounter} + ${issueInserts.length}` })\n .where(eq(companies.id, companyId))\n .returning({ issueCounter: companies.issueCounter });\n nextIssueNumber = companyRow.issueCounter - issueInserts.length + 1;\n }\n\n const insertedIssueIdentifiers = new Map<string, string>();\n let insertedIssues = 0;\n for (const issue of issueInserts) {\n const issueNumber = nextIssueNumber;\n nextIssueNumber += 1;\n const identifier = `${input.company.issuePrefix}-${issueNumber}`;\n insertedIssueIdentifiers.set(issue.source.id, identifier);\n await tx.insert(issues).values({\n id: issue.source.id,\n companyId,\n projectId: issue.targetProjectId,\n projectWorkspaceId: issue.targetProjectWorkspaceId,\n goalId: issue.targetGoalId,\n parentId: issue.source.parentId,\n title: issue.source.title,\n description: issue.source.description,\n status: issue.targetStatus,\n priority: issue.source.priority,\n assigneeAgentId: issue.targetAssigneeAgentId,\n assigneeUserId: issue.source.assigneeUserId,\n checkoutRunId: null,\n executionRunId: null,\n executionAgentNameKey: null,\n executionLockedAt: null,\n createdByAgentId: issue.targetCreatedByAgentId,\n createdByUserId: issue.source.createdByUserId,\n issueNumber,\n identifier,\n requestDepth: issue.source.requestDepth,\n billingCode: issue.source.billingCode,\n assigneeAdapterOverrides: issue.targetAssigneeAgentId ? issue.source.assigneeAdapterOverrides : null,\n executionWorkspaceId: null,\n executionWorkspacePreference: null,\n executionWorkspaceSettings: null,\n startedAt: issue.source.startedAt,\n completedAt: issue.source.completedAt,\n cancelledAt: issue.source.cancelledAt,\n hiddenAt: issue.source.hiddenAt,\n createdAt: issue.source.createdAt,\n updatedAt: issue.source.updatedAt,\n });\n insertedIssues += 1;\n }\n\n const commentCandidates = input.plan.commentPlans.filter(\n (plan): plan is PlannedCommentInsert => plan.action === \"insert\",\n );\n const commentCandidateIds = commentCandidates.map((comment) => comment.source.id);\n const existingCommentIds = commentCandidateIds.length > 0\n ? new Set(\n (await tx\n .select({ id: issueComments.id })\n .from(issueComments)\n .where(inArray(issueComments.id, commentCandidateIds)))\n .map((row) => row.id),\n )\n : new Set<string>();\n\n let insertedComments = 0;\n for (const comment of commentCandidates) {\n if (existingCommentIds.has(comment.source.id)) continue;\n const parentExists = await tx\n .select({ id: issues.id })\n .from(issues)\n .where(and(eq(issues.id, comment.source.issueId), eq(issues.companyId, companyId)))\n .then((rows) => rows[0] ?? null);\n if (!parentExists) continue;\n await tx.insert(issueComments).values({\n id: comment.source.id,\n companyId,\n issueId: comment.source.issueId,\n authorAgentId: comment.targetAuthorAgentId,\n authorUserId: comment.source.authorUserId,\n body: comment.source.body,\n createdAt: comment.source.createdAt,\n updatedAt: comment.source.updatedAt,\n });\n insertedComments += 1;\n }\n\n const documentCandidates = input.plan.documentPlans.filter(\n (plan): plan is PlannedIssueDocumentInsert | PlannedIssueDocumentMerge =>\n plan.action === \"insert\" || plan.action === \"merge_existing\",\n );\n let insertedDocuments = 0;\n let mergedDocuments = 0;\n let insertedDocumentRevisions = 0;\n for (const documentPlan of documentCandidates) {\n const parentExists = await tx\n .select({ id: issues.id })\n .from(issues)\n .where(and(eq(issues.id, documentPlan.source.issueId), eq(issues.companyId, companyId)))\n .then((rows) => rows[0] ?? null);\n if (!parentExists) continue;\n\n const conflictingKeyDocument = await tx\n .select({ documentId: issueDocuments.documentId })\n .from(issueDocuments)\n .where(and(eq(issueDocuments.issueId, documentPlan.source.issueId), eq(issueDocuments.key, documentPlan.source.key)))\n .then((rows) => rows[0] ?? null);\n if (\n conflictingKeyDocument\n && conflictingKeyDocument.documentId !== documentPlan.source.documentId\n ) {\n continue;\n }\n\n const existingDocument = await tx\n .select({ id: documents.id })\n .from(documents)\n .where(eq(documents.id, documentPlan.source.documentId))\n .then((rows) => rows[0] ?? null);\n\n if (!existingDocument) {\n await tx.insert(documents).values({\n id: documentPlan.source.documentId,\n companyId,\n title: documentPlan.source.title,\n format: documentPlan.source.format,\n latestBody: documentPlan.source.latestBody,\n latestRevisionId: documentPlan.latestRevisionId,\n latestRevisionNumber: documentPlan.latestRevisionNumber,\n createdByAgentId: documentPlan.targetCreatedByAgentId,\n createdByUserId: documentPlan.source.createdByUserId,\n updatedByAgentId: documentPlan.targetUpdatedByAgentId,\n updatedByUserId: documentPlan.source.updatedByUserId,\n createdAt: documentPlan.source.documentCreatedAt,\n updatedAt: documentPlan.source.documentUpdatedAt,\n });\n await tx.insert(issueDocuments).values({\n id: documentPlan.source.id,\n companyId,\n issueId: documentPlan.source.issueId,\n documentId: documentPlan.source.documentId,\n key: documentPlan.source.key,\n createdAt: documentPlan.source.linkCreatedAt,\n updatedAt: documentPlan.source.linkUpdatedAt,\n });\n insertedDocuments += 1;\n } else {\n const existingLink = await tx\n .select({ id: issueDocuments.id })\n .from(issueDocuments)\n .where(eq(issueDocuments.documentId, documentPlan.source.documentId))\n .then((rows) => rows[0] ?? null);\n if (!existingLink) {\n await tx.insert(issueDocuments).values({\n id: documentPlan.source.id,\n companyId,\n issueId: documentPlan.source.issueId,\n documentId: documentPlan.source.documentId,\n key: documentPlan.source.key,\n createdAt: documentPlan.source.linkCreatedAt,\n updatedAt: documentPlan.source.linkUpdatedAt,\n });\n } else {\n await tx\n .update(issueDocuments)\n .set({\n issueId: documentPlan.source.issueId,\n key: documentPlan.source.key,\n updatedAt: documentPlan.source.linkUpdatedAt,\n })\n .where(eq(issueDocuments.documentId, documentPlan.source.documentId));\n }\n\n await tx\n .update(documents)\n .set({\n title: documentPlan.source.title,\n format: documentPlan.source.format,\n latestBody: documentPlan.source.latestBody,\n latestRevisionId: documentPlan.latestRevisionId,\n latestRevisionNumber: documentPlan.latestRevisionNumber,\n updatedByAgentId: documentPlan.targetUpdatedByAgentId,\n updatedByUserId: documentPlan.source.updatedByUserId,\n updatedAt: documentPlan.source.documentUpdatedAt,\n })\n .where(eq(documents.id, documentPlan.source.documentId));\n mergedDocuments += 1;\n }\n\n const existingRevisionIds = new Set(\n (\n await tx\n .select({ id: documentRevisions.id })\n .from(documentRevisions)\n .where(eq(documentRevisions.documentId, documentPlan.source.documentId))\n ).map((row) => row.id),\n );\n for (const revisionPlan of documentPlan.revisionsToInsert) {\n if (existingRevisionIds.has(revisionPlan.source.id)) continue;\n await tx.insert(documentRevisions).values({\n id: revisionPlan.source.id,\n companyId,\n documentId: documentPlan.source.documentId,\n revisionNumber: revisionPlan.targetRevisionNumber,\n body: revisionPlan.source.body,\n changeSummary: revisionPlan.source.changeSummary,\n createdByAgentId: revisionPlan.targetCreatedByAgentId,\n createdByUserId: revisionPlan.source.createdByUserId,\n createdAt: revisionPlan.source.createdAt,\n });\n insertedDocumentRevisions += 1;\n }\n }\n\n const attachmentCandidates = input.plan.attachmentPlans.filter(\n (plan): plan is PlannedAttachmentInsert => plan.action === \"insert\",\n );\n const existingAttachmentIds = new Set(\n (\n await tx\n .select({ id: issueAttachments.id })\n .from(issueAttachments)\n .where(eq(issueAttachments.companyId, companyId))\n ).map((row) => row.id),\n );\n let insertedAttachments = 0;\n let skippedMissingAttachmentObjects = 0;\n for (const attachment of attachmentCandidates) {\n if (existingAttachmentIds.has(attachment.source.id)) continue;\n const parentExists = await tx\n .select({ id: issues.id })\n .from(issues)\n .where(and(eq(issues.id, attachment.source.issueId), eq(issues.companyId, companyId)))\n .then((rows) => rows[0] ?? null);\n if (!parentExists) continue;\n\n const body = await readSourceAttachmentBody(\n input.sourceStorages,\n companyId,\n attachment.source.objectKey,\n );\n if (!body) {\n skippedMissingAttachmentObjects += 1;\n continue;\n }\n await input.targetStorage.putObject(\n companyId,\n attachment.source.objectKey,\n body,\n attachment.source.contentType,\n );\n\n await tx.insert(assets).values({\n id: attachment.source.assetId,\n companyId,\n provider: attachment.source.provider,\n objectKey: attachment.source.objectKey,\n contentType: attachment.source.contentType,\n byteSize: attachment.source.byteSize,\n sha256: attachment.source.sha256,\n originalFilename: attachment.source.originalFilename,\n createdByAgentId: attachment.targetCreatedByAgentId,\n createdByUserId: attachment.source.createdByUserId,\n createdAt: attachment.source.assetCreatedAt,\n updatedAt: attachment.source.assetUpdatedAt,\n });\n\n await tx.insert(issueAttachments).values({\n id: attachment.source.id,\n companyId,\n issueId: attachment.source.issueId,\n assetId: attachment.source.assetId,\n issueCommentId: attachment.targetIssueCommentId,\n createdAt: attachment.source.attachmentCreatedAt,\n updatedAt: attachment.source.attachmentUpdatedAt,\n });\n insertedAttachments += 1;\n }\n\n return {\n insertedProjects,\n insertedProjectWorkspaces,\n insertedIssues,\n insertedComments,\n insertedDocuments,\n mergedDocuments,\n insertedDocumentRevisions,\n insertedAttachments,\n skippedMissingAttachmentObjects,\n insertedIssueIdentifiers,\n };\n });\n}\n\nexport async function worktreeMergeHistoryCommand(sourceArg: string | undefined, opts: WorktreeMergeHistoryOptions): Promise<void> {\n if (opts.apply && opts.dry) {\n throw new Error(\"Use either --apply or --dry, not both.\");\n }\n\n if (sourceArg && opts.from) {\n throw new Error(\"Use either the positional source argument or --from, not both.\");\n }\n\n const targetEndpoint = opts.to\n ? resolveWorktreeEndpointFromSelector(opts.to, { allowCurrent: true })\n : resolveCurrentEndpoint();\n const sourceEndpoint = opts.from\n ? resolveWorktreeEndpointFromSelector(opts.from, { allowCurrent: true })\n : sourceArg\n ? resolveWorktreeEndpointFromSelector(sourceArg, { allowCurrent: true })\n : await promptForSourceEndpoint(targetEndpoint.rootPath);\n\n if (path.resolve(sourceEndpoint.configPath) === path.resolve(targetEndpoint.configPath)) {\n throw new Error(\"Source and target Relay Control configs are the same. Choose different --from/--to worktrees.\");\n }\n\n const scopes = parseWorktreeMergeScopes(opts.scope);\n const sourceHandle = await openConfiguredDb(sourceEndpoint.configPath);\n const targetHandle = await openConfiguredDb(targetEndpoint.configPath);\n const sourceStorages = resolveAttachmentLookupStorages({\n sourceEndpoint,\n targetEndpoint,\n });\n const targetStorage = openConfiguredStorage(targetEndpoint.configPath);\n\n try {\n const company = await resolveMergeCompany({\n sourceDb: sourceHandle.db,\n targetDb: targetHandle.db,\n selector: opts.company,\n });\n let collected = await collectMergePlan({\n sourceDb: sourceHandle.db,\n targetDb: targetHandle.db,\n company,\n scopes,\n });\n if (!opts.yes) {\n const projectSelections = await promptForProjectMappings({\n plan: collected.plan,\n sourceProjects: collected.sourceProjects,\n targetProjects: collected.targetProjects,\n });\n if (\n projectSelections.importProjectIds.length > 0\n || Object.keys(projectSelections.projectIdOverrides).length > 0\n ) {\n collected = await collectMergePlan({\n sourceDb: sourceHandle.db,\n targetDb: targetHandle.db,\n company,\n scopes,\n importProjectIds: projectSelections.importProjectIds,\n projectIdOverrides: projectSelections.projectIdOverrides,\n });\n }\n }\n\n console.log(renderMergePlan(collected.plan, {\n sourcePath: `${sourceEndpoint.label} (${sourceEndpoint.rootPath})`,\n targetPath: `${targetEndpoint.label} (${targetEndpoint.rootPath})`,\n unsupportedRunCount: collected.unsupportedRunCount,\n }));\n\n if (!opts.apply) {\n return;\n }\n\n const confirmed = opts.yes\n ? true\n : await p.confirm({\n message: `Import ${collected.plan.counts.issuesToInsert} issues and ${collected.plan.counts.commentsToInsert} comments from ${sourceEndpoint.label} into ${targetEndpoint.label}?`,\n initialValue: false,\n });\n if (p.isCancel(confirmed) || !confirmed) {\n p.log.warn(\"Import cancelled.\");\n return;\n }\n\n const applied = await applyMergePlan({\n sourceStorages,\n targetStorage,\n targetDb: targetHandle.db,\n company,\n plan: collected.plan,\n });\n if (applied.skippedMissingAttachmentObjects > 0) {\n p.log.warn(\n `Skipped ${applied.skippedMissingAttachmentObjects} attachments whose source files were missing from storage.`,\n );\n }\n p.outro(\n pc.green(\n `Imported ${applied.insertedProjects} projects (${applied.insertedProjectWorkspaces} workspaces), ${applied.insertedIssues} issues, ${applied.insertedComments} comments, ${applied.insertedDocuments} documents (${applied.insertedDocumentRevisions} revisions, ${applied.mergedDocuments} merged), and ${applied.insertedAttachments} attachments into ${company.issuePrefix}.`,\n ),\n );\n } finally {\n await targetHandle.stop();\n await sourceHandle.stop();\n }\n}\n\nexport function registerWorktreeCommands(program: Command): void {\n const worktree = program.command(\"worktree\").description(\"Worktree-local Relay Control instance helpers\");\n\n program\n .command(\"worktree:make\")\n .description(\"Create ~/NAME as a git worktree, then initialize an isolated Relay Control instance inside it\")\n .argument(\"<name>\", \"Worktree name \u2014 auto-prefixed with paperclip- if needed (created at ~/paperclip-NAME)\")\n .option(\"--start-point <ref>\", \"Remote ref to base the new branch on (env: PAPERCLIP_WORKTREE_START_POINT)\")\n .option(\"--instance <id>\", \"Explicit isolated instance id\")\n .option(\"--home <path>\", `Home root for worktree instances (env: PAPERCLIP_WORKTREES_DIR, default: ${DEFAULT_WORKTREE_HOME})`)\n .option(\"--from-config <path>\", \"Source config.json to seed from\")\n .option(\"--from-data-dir <path>\", \"Source PAPERCLIP_HOME used when deriving the source config\")\n .option(\"--from-instance <id>\", \"Source instance id when deriving the source config\", \"default\")\n .option(\"--server-port <port>\", \"Preferred server port\", (value) => Number(value))\n .option(\"--db-port <port>\", \"Preferred embedded Postgres port\", (value) => Number(value))\n .option(\"--seed-mode <mode>\", \"Seed profile: minimal or full (default: minimal)\", \"minimal\")\n .option(\"--no-seed\", \"Skip database seeding from the source instance\")\n .option(\"--force\", \"Replace existing repo-local config and isolated instance data\", false)\n .action(worktreeMakeCommand);\n\n worktree\n .command(\"init\")\n .description(\"Create repo-local config/env and an isolated instance for this worktree\")\n .option(\"--name <name>\", \"Display name used to derive the instance id\")\n .option(\"--instance <id>\", \"Explicit isolated instance id\")\n .option(\"--home <path>\", `Home root for worktree instances (env: PAPERCLIP_WORKTREES_DIR, default: ${DEFAULT_WORKTREE_HOME})`)\n .option(\"--from-config <path>\", \"Source config.json to seed from\")\n .option(\"--from-data-dir <path>\", \"Source PAPERCLIP_HOME used when deriving the source config\")\n .option(\"--from-instance <id>\", \"Source instance id when deriving the source config\", \"default\")\n .option(\"--server-port <port>\", \"Preferred server port\", (value) => Number(value))\n .option(\"--db-port <port>\", \"Preferred embedded Postgres port\", (value) => Number(value))\n .option(\"--seed-mode <mode>\", \"Seed profile: minimal or full (default: minimal)\", \"minimal\")\n .option(\"--no-seed\", \"Skip database seeding from the source instance\")\n .option(\"--force\", \"Replace existing repo-local config and isolated instance data\", false)\n .action(worktreeInitCommand);\n\n worktree\n .command(\"env\")\n .description(\"Print shell exports for the current worktree-local Relay Control instance\")\n .option(\"-c, --config <path>\", \"Path to config file\")\n .option(\"--json\", \"Print JSON instead of shell exports\")\n .action(worktreeEnvCommand);\n\n program\n .command(\"worktree:list\")\n .description(\"List git worktrees visible from this repo and whether they look like Relay Control worktrees\")\n .option(\"--json\", \"Print JSON instead of text output\")\n .action(worktreeListCommand);\n\n program\n .command(\"worktree:merge-history\")\n .description(\"Preview or import issue/comment history from another worktree into the current instance\")\n .argument(\"[source]\", \"Optional source worktree path, directory name, or branch name (back-compat alias for --from)\")\n .option(\"--from <worktree>\", \"Source worktree path, directory name, branch name, or current\")\n .option(\"--to <worktree>\", \"Target worktree path, directory name, branch name, or current (defaults to current)\")\n .option(\"--company <id-or-prefix>\", \"Shared company id or issue prefix inside the chosen source/target instances\")\n .option(\"--scope <items>\", \"Comma-separated scopes to import (issues, comments)\", \"issues,comments\")\n .option(\"--apply\", \"Apply the import after previewing the plan\", false)\n .option(\"--dry\", \"Preview only and do not import anything\", false)\n .option(\"--yes\", \"Skip the interactive confirmation prompt when applying\", false)\n .action(worktreeMergeHistoryCommand);\n\n program\n .command(\"worktree:cleanup\")\n .description(\"Safely remove a worktree, its branch, and its isolated instance data\")\n .argument(\"<name>\", \"Worktree name \u2014 auto-prefixed with paperclip- if needed\")\n .option(\"--instance <id>\", \"Explicit instance id (if different from the worktree name)\")\n .option(\"--home <path>\", `Home root for worktree instances (env: PAPERCLIP_WORKTREES_DIR, default: ${DEFAULT_WORKTREE_HOME})`)\n .option(\"--force\", \"Bypass safety checks (uncommitted changes, unique commits)\", false)\n .action(worktreeCleanupCommand);\n}\n", "import { randomInt } from \"node:crypto\";\nimport path from \"node:path\";\nimport type { PaperclipConfig } from \"../config/schema.js\";\nimport { expandHomePrefix } from \"../config/home.js\";\n\nexport const DEFAULT_WORKTREE_HOME = \"~/.paperclip-worktrees\";\nexport const WORKTREE_SEED_MODES = [\"minimal\", \"full\"] as const;\n\nexport type WorktreeSeedMode = (typeof WORKTREE_SEED_MODES)[number];\n\nexport type WorktreeSeedPlan = {\n mode: WorktreeSeedMode;\n excludedTables: string[];\n nullifyColumns: Record<string, string[]>;\n};\n\nconst MINIMAL_WORKTREE_EXCLUDED_TABLES = [\n \"activity_log\",\n \"agent_runtime_state\",\n \"agent_task_sessions\",\n \"agent_wakeup_requests\",\n \"cost_events\",\n \"heartbeat_run_events\",\n \"heartbeat_runs\",\n \"workspace_runtime_services\",\n];\n\nconst MINIMAL_WORKTREE_NULLIFIED_COLUMNS: Record<string, string[]> = {\n issues: [\"checkout_run_id\", \"execution_run_id\"],\n};\n\nexport type WorktreeLocalPaths = {\n cwd: string;\n repoConfigDir: string;\n configPath: string;\n envPath: string;\n homeDir: string;\n instanceId: string;\n instanceRoot: string;\n contextPath: string;\n embeddedPostgresDataDir: string;\n backupDir: string;\n logDir: string;\n secretsKeyFilePath: string;\n storageDir: string;\n};\n\nexport type WorktreeUiBranding = {\n name: string;\n color: string;\n};\n\nexport function isWorktreeSeedMode(value: string): value is WorktreeSeedMode {\n return (WORKTREE_SEED_MODES as readonly string[]).includes(value);\n}\n\nexport function resolveWorktreeSeedPlan(mode: WorktreeSeedMode): WorktreeSeedPlan {\n if (mode === \"full\") {\n return {\n mode,\n excludedTables: [],\n nullifyColumns: {},\n };\n }\n return {\n mode,\n excludedTables: [...MINIMAL_WORKTREE_EXCLUDED_TABLES],\n nullifyColumns: {\n ...MINIMAL_WORKTREE_NULLIFIED_COLUMNS,\n },\n };\n}\n\nfunction nonEmpty(value: string | null | undefined): string | null {\n return typeof value === \"string\" && value.trim().length > 0 ? value.trim() : null;\n}\n\nfunction isLoopbackHost(hostname: string): boolean {\n const value = hostname.trim().toLowerCase();\n return value === \"127.0.0.1\" || value === \"localhost\" || value === \"::1\";\n}\n\nexport function sanitizeWorktreeInstanceId(rawValue: string): string {\n const trimmed = rawValue.trim().toLowerCase();\n const normalized = trimmed\n .replace(/[^a-z0-9_-]+/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^[-_]+|[-_]+$/g, \"\");\n return normalized || \"worktree\";\n}\n\nexport function resolveSuggestedWorktreeName(cwd: string, explicitName?: string): string {\n return nonEmpty(explicitName) ?? path.basename(path.resolve(cwd));\n}\n\nfunction hslComponentToHex(n: number): string {\n return Math.round(Math.max(0, Math.min(255, n)))\n .toString(16)\n .padStart(2, \"0\");\n}\n\nfunction hslToHex(hue: number, saturation: number, lightness: number): string {\n const s = Math.max(0, Math.min(100, saturation)) / 100;\n const l = Math.max(0, Math.min(100, lightness)) / 100;\n const c = (1 - Math.abs((2 * l) - 1)) * s;\n const h = ((hue % 360) + 360) % 360;\n const x = c * (1 - Math.abs(((h / 60) % 2) - 1));\n const m = l - (c / 2);\n\n let r = 0;\n let g = 0;\n let b = 0;\n\n if (h < 60) {\n r = c;\n g = x;\n } else if (h < 120) {\n r = x;\n g = c;\n } else if (h < 180) {\n g = c;\n b = x;\n } else if (h < 240) {\n g = x;\n b = c;\n } else if (h < 300) {\n r = x;\n b = c;\n } else {\n r = c;\n b = x;\n }\n\n return `#${hslComponentToHex((r + m) * 255)}${hslComponentToHex((g + m) * 255)}${hslComponentToHex((b + m) * 255)}`;\n}\n\nexport function generateWorktreeColor(): string {\n return hslToHex(randomInt(0, 360), 68, 56);\n}\n\nexport function resolveWorktreeLocalPaths(opts: {\n cwd: string;\n homeDir?: string;\n instanceId: string;\n}): WorktreeLocalPaths {\n const cwd = path.resolve(opts.cwd);\n const homeDir = path.resolve(expandHomePrefix(opts.homeDir ?? DEFAULT_WORKTREE_HOME));\n const instanceRoot = path.resolve(homeDir, \"instances\", opts.instanceId);\n const repoConfigDir = path.resolve(cwd, \".paperclip\");\n return {\n cwd,\n repoConfigDir,\n configPath: path.resolve(repoConfigDir, \"config.json\"),\n envPath: path.resolve(repoConfigDir, \".env\"),\n homeDir,\n instanceId: opts.instanceId,\n instanceRoot,\n contextPath: path.resolve(homeDir, \"context.json\"),\n embeddedPostgresDataDir: path.resolve(instanceRoot, \"db\"),\n backupDir: path.resolve(instanceRoot, \"data\", \"backups\"),\n logDir: path.resolve(instanceRoot, \"logs\"),\n secretsKeyFilePath: path.resolve(instanceRoot, \"secrets\", \"master.key\"),\n storageDir: path.resolve(instanceRoot, \"data\", \"storage\"),\n };\n}\n\nexport function rewriteLocalUrlPort(rawUrl: string | undefined, port: number): string | undefined {\n if (!rawUrl) return undefined;\n try {\n const parsed = new URL(rawUrl);\n if (!isLoopbackHost(parsed.hostname)) return rawUrl;\n parsed.port = String(port);\n return parsed.toString();\n } catch {\n return rawUrl;\n }\n}\n\nexport function buildWorktreeConfig(input: {\n sourceConfig: PaperclipConfig | null;\n paths: WorktreeLocalPaths;\n serverPort: number;\n databasePort: number;\n now?: Date;\n}): PaperclipConfig {\n const { sourceConfig, paths, serverPort, databasePort } = input;\n const nowIso = (input.now ?? new Date()).toISOString();\n\n const source = sourceConfig;\n const authPublicBaseUrl = rewriteLocalUrlPort(source?.auth.publicBaseUrl, serverPort);\n\n return {\n $meta: {\n version: 1,\n updatedAt: nowIso,\n source: \"configure\",\n },\n ...(source?.llm ? { llm: source.llm } : {}),\n database: {\n mode: \"embedded-postgres\",\n embeddedPostgresDataDir: paths.embeddedPostgresDataDir,\n embeddedPostgresPort: databasePort,\n backup: {\n enabled: source?.database.backup.enabled ?? true,\n intervalMinutes: source?.database.backup.intervalMinutes ?? 60,\n retentionDays: source?.database.backup.retentionDays ?? 30,\n dir: paths.backupDir,\n },\n },\n logging: {\n mode: source?.logging.mode ?? \"file\",\n logDir: paths.logDir,\n },\n server: {\n deploymentMode: source?.server.deploymentMode ?? \"local_trusted\",\n exposure: source?.server.exposure ?? \"private\",\n host: source?.server.host ?? \"127.0.0.1\",\n port: serverPort,\n allowedHostnames: source?.server.allowedHostnames ?? [],\n serveUi: source?.server.serveUi ?? true,\n },\n auth: {\n baseUrlMode: source?.auth.baseUrlMode ?? \"auto\",\n ...(authPublicBaseUrl ? { publicBaseUrl: authPublicBaseUrl } : {}),\n disableSignUp: source?.auth.disableSignUp ?? false,\n },\n telemetry: {\n enabled: source?.telemetry?.enabled ?? true,\n },\n storage: {\n provider: source?.storage.provider ?? \"local_disk\",\n localDisk: {\n baseDir: paths.storageDir,\n },\n s3: {\n bucket: source?.storage.s3.bucket ?? \"paperclip\",\n region: source?.storage.s3.region ?? \"us-east-1\",\n endpoint: source?.storage.s3.endpoint,\n prefix: source?.storage.s3.prefix ?? \"\",\n forcePathStyle: source?.storage.s3.forcePathStyle ?? false,\n },\n },\n secrets: {\n provider: source?.secrets.provider ?? \"local_encrypted\",\n strictMode: source?.secrets.strictMode ?? false,\n localEncrypted: {\n keyFilePath: paths.secretsKeyFilePath,\n },\n },\n };\n}\n\nexport function buildWorktreeEnvEntries(\n paths: WorktreeLocalPaths,\n branding?: WorktreeUiBranding,\n): Record<string, string> {\n return {\n PAPERCLIP_HOME: paths.homeDir,\n PAPERCLIP_INSTANCE_ID: paths.instanceId,\n PAPERCLIP_CONFIG: paths.configPath,\n PAPERCLIP_CONTEXT: paths.contextPath,\n PAPERCLIP_IN_WORKTREE: \"true\",\n ...(branding?.name ? { PAPERCLIP_WORKTREE_NAME: branding.name } : {}),\n ...(branding?.color ? { PAPERCLIP_WORKTREE_COLOR: branding.color } : {}),\n };\n}\n\nfunction shellEscape(value: string): string {\n return `'${value.replaceAll(\"'\", `'\\\"'\\\"'`)}'`;\n}\n\nexport function formatShellExports(entries: Record<string, string>): string {\n return Object.entries(entries)\n .filter(([, value]) => typeof value === \"string\" && value.trim().length > 0)\n .map(([key, value]) => `export ${key}=${shellEscape(value)}`)\n .join(\"\\n\");\n}\n", "import {\n agents,\n assets,\n documentRevisions,\n goals,\n issueAttachments,\n issueComments,\n issueDocuments,\n issues,\n projects,\n projectWorkspaces,\n} from \"@paperclipai/db\";\n\ntype IssueRow = typeof issues.$inferSelect;\ntype CommentRow = typeof issueComments.$inferSelect;\ntype AgentRow = typeof agents.$inferSelect;\ntype ProjectRow = typeof projects.$inferSelect;\ntype ProjectWorkspaceRow = typeof projectWorkspaces.$inferSelect;\ntype GoalRow = typeof goals.$inferSelect;\ntype IssueDocumentLinkRow = typeof issueDocuments.$inferSelect;\ntype DocumentRevisionTableRow = typeof documentRevisions.$inferSelect;\ntype IssueAttachmentTableRow = typeof issueAttachments.$inferSelect;\ntype AssetRow = typeof assets.$inferSelect;\n\nexport const WORKTREE_MERGE_SCOPES = [\"issues\", \"comments\"] as const;\nexport type WorktreeMergeScope = (typeof WORKTREE_MERGE_SCOPES)[number];\n\nexport type ImportAdjustment =\n | \"clear_assignee_agent\"\n | \"clear_project\"\n | \"clear_project_workspace\"\n | \"clear_goal\"\n | \"clear_author_agent\"\n | \"coerce_in_progress_to_todo\"\n | \"clear_document_agent\"\n | \"clear_document_revision_agent\"\n | \"clear_attachment_agent\";\n\nexport type IssueMergeAction = \"skip_existing\" | \"insert\";\nexport type CommentMergeAction = \"skip_existing\" | \"skip_missing_parent\" | \"insert\";\n\nexport type PlannedIssueInsert = {\n source: IssueRow;\n action: \"insert\";\n previewIssueNumber: number;\n previewIdentifier: string;\n targetStatus: string;\n targetAssigneeAgentId: string | null;\n targetCreatedByAgentId: string | null;\n targetProjectId: string | null;\n targetProjectWorkspaceId: string | null;\n targetGoalId: string | null;\n projectResolution: \"preserved\" | \"cleared\" | \"mapped\" | \"imported\";\n mappedProjectName: string | null;\n adjustments: ImportAdjustment[];\n};\n\nexport type PlannedIssueSkip = {\n source: IssueRow;\n action: \"skip_existing\";\n driftKeys: string[];\n};\n\nexport type PlannedCommentInsert = {\n source: CommentRow;\n action: \"insert\";\n targetAuthorAgentId: string | null;\n adjustments: ImportAdjustment[];\n};\n\nexport type PlannedCommentSkip = {\n source: CommentRow;\n action: \"skip_existing\" | \"skip_missing_parent\";\n};\n\nexport type IssueDocumentRow = {\n id: IssueDocumentLinkRow[\"id\"];\n companyId: IssueDocumentLinkRow[\"companyId\"];\n issueId: IssueDocumentLinkRow[\"issueId\"];\n documentId: IssueDocumentLinkRow[\"documentId\"];\n key: IssueDocumentLinkRow[\"key\"];\n linkCreatedAt: IssueDocumentLinkRow[\"createdAt\"];\n linkUpdatedAt: IssueDocumentLinkRow[\"updatedAt\"];\n title: string | null;\n format: string;\n latestBody: string;\n latestRevisionId: string | null;\n latestRevisionNumber: number;\n createdByAgentId: string | null;\n createdByUserId: string | null;\n updatedByAgentId: string | null;\n updatedByUserId: string | null;\n documentCreatedAt: Date;\n documentUpdatedAt: Date;\n};\n\nexport type DocumentRevisionRow = {\n id: DocumentRevisionTableRow[\"id\"];\n companyId: DocumentRevisionTableRow[\"companyId\"];\n documentId: DocumentRevisionTableRow[\"documentId\"];\n revisionNumber: DocumentRevisionTableRow[\"revisionNumber\"];\n body: DocumentRevisionTableRow[\"body\"];\n changeSummary: DocumentRevisionTableRow[\"changeSummary\"];\n createdByAgentId: string | null;\n createdByUserId: string | null;\n createdAt: Date;\n};\n\nexport type IssueAttachmentRow = {\n id: IssueAttachmentTableRow[\"id\"];\n companyId: IssueAttachmentTableRow[\"companyId\"];\n issueId: IssueAttachmentTableRow[\"issueId\"];\n issueCommentId: IssueAttachmentTableRow[\"issueCommentId\"];\n assetId: IssueAttachmentTableRow[\"assetId\"];\n provider: AssetRow[\"provider\"];\n objectKey: AssetRow[\"objectKey\"];\n contentType: AssetRow[\"contentType\"];\n byteSize: AssetRow[\"byteSize\"];\n sha256: AssetRow[\"sha256\"];\n originalFilename: AssetRow[\"originalFilename\"];\n createdByAgentId: string | null;\n createdByUserId: string | null;\n assetCreatedAt: Date;\n assetUpdatedAt: Date;\n attachmentCreatedAt: Date;\n attachmentUpdatedAt: Date;\n};\n\nexport type PlannedDocumentRevisionInsert = {\n source: DocumentRevisionRow;\n targetRevisionNumber: number;\n targetCreatedByAgentId: string | null;\n adjustments: ImportAdjustment[];\n};\n\nexport type PlannedIssueDocumentInsert = {\n source: IssueDocumentRow;\n action: \"insert\";\n targetCreatedByAgentId: string | null;\n targetUpdatedByAgentId: string | null;\n latestRevisionId: string | null;\n latestRevisionNumber: number;\n revisionsToInsert: PlannedDocumentRevisionInsert[];\n adjustments: ImportAdjustment[];\n};\n\nexport type PlannedIssueDocumentMerge = {\n source: IssueDocumentRow;\n action: \"merge_existing\";\n targetCreatedByAgentId: string | null;\n targetUpdatedByAgentId: string | null;\n latestRevisionId: string | null;\n latestRevisionNumber: number;\n revisionsToInsert: PlannedDocumentRevisionInsert[];\n adjustments: ImportAdjustment[];\n};\n\nexport type PlannedIssueDocumentSkip = {\n source: IssueDocumentRow;\n action: \"skip_existing\" | \"skip_missing_parent\" | \"skip_conflicting_key\";\n};\n\nexport type PlannedAttachmentInsert = {\n source: IssueAttachmentRow;\n action: \"insert\";\n targetIssueCommentId: string | null;\n targetCreatedByAgentId: string | null;\n adjustments: ImportAdjustment[];\n};\n\nexport type PlannedAttachmentSkip = {\n source: IssueAttachmentRow;\n action: \"skip_existing\" | \"skip_missing_parent\";\n};\n\nexport type PlannedProjectImport = {\n source: ProjectRow;\n targetLeadAgentId: string | null;\n targetGoalId: string | null;\n workspaces: ProjectWorkspaceRow[];\n};\n\nexport type WorktreeMergePlan = {\n companyId: string;\n companyName: string;\n issuePrefix: string;\n previewIssueCounterStart: number;\n scopes: WorktreeMergeScope[];\n projectImports: PlannedProjectImport[];\n issuePlans: Array<PlannedIssueInsert | PlannedIssueSkip>;\n commentPlans: Array<PlannedCommentInsert | PlannedCommentSkip>;\n documentPlans: Array<PlannedIssueDocumentInsert | PlannedIssueDocumentMerge | PlannedIssueDocumentSkip>;\n attachmentPlans: Array<PlannedAttachmentInsert | PlannedAttachmentSkip>;\n counts: {\n projectsToImport: number;\n issuesToInsert: number;\n issuesExisting: number;\n issueDrift: number;\n commentsToInsert: number;\n commentsExisting: number;\n commentsMissingParent: number;\n documentsToInsert: number;\n documentsToMerge: number;\n documentsExisting: number;\n documentsConflictingKey: number;\n documentsMissingParent: number;\n documentRevisionsToInsert: number;\n attachmentsToInsert: number;\n attachmentsExisting: number;\n attachmentsMissingParent: number;\n };\n adjustments: Record<ImportAdjustment, number>;\n};\n\nfunction compareIssueCoreFields(source: IssueRow, target: IssueRow): string[] {\n const driftKeys: string[] = [];\n if (source.title !== target.title) driftKeys.push(\"title\");\n if ((source.description ?? null) !== (target.description ?? null)) driftKeys.push(\"description\");\n if (source.status !== target.status) driftKeys.push(\"status\");\n if (source.priority !== target.priority) driftKeys.push(\"priority\");\n if ((source.parentId ?? null) !== (target.parentId ?? null)) driftKeys.push(\"parentId\");\n if ((source.projectId ?? null) !== (target.projectId ?? null)) driftKeys.push(\"projectId\");\n if ((source.projectWorkspaceId ?? null) !== (target.projectWorkspaceId ?? null)) driftKeys.push(\"projectWorkspaceId\");\n if ((source.goalId ?? null) !== (target.goalId ?? null)) driftKeys.push(\"goalId\");\n if ((source.assigneeAgentId ?? null) !== (target.assigneeAgentId ?? null)) driftKeys.push(\"assigneeAgentId\");\n if ((source.assigneeUserId ?? null) !== (target.assigneeUserId ?? null)) driftKeys.push(\"assigneeUserId\");\n return driftKeys;\n}\n\nfunction incrementAdjustment(\n counts: Record<ImportAdjustment, number>,\n adjustment: ImportAdjustment,\n): void {\n counts[adjustment] += 1;\n}\n\nfunction groupBy<T>(rows: T[], keyFor: (row: T) => string): Map<string, T[]> {\n const out = new Map<string, T[]>();\n for (const row of rows) {\n const key = keyFor(row);\n const existing = out.get(key);\n if (existing) {\n existing.push(row);\n } else {\n out.set(key, [row]);\n }\n }\n return out;\n}\n\nfunction sameDate(left: Date, right: Date): boolean {\n return left.getTime() === right.getTime();\n}\n\nfunction sortDocumentRows(rows: IssueDocumentRow[]): IssueDocumentRow[] {\n return [...rows].sort((left, right) => {\n const createdDelta = left.documentCreatedAt.getTime() - right.documentCreatedAt.getTime();\n if (createdDelta !== 0) return createdDelta;\n const linkDelta = left.linkCreatedAt.getTime() - right.linkCreatedAt.getTime();\n if (linkDelta !== 0) return linkDelta;\n return left.documentId.localeCompare(right.documentId);\n });\n}\n\nfunction sortDocumentRevisions(rows: DocumentRevisionRow[]): DocumentRevisionRow[] {\n return [...rows].sort((left, right) => {\n const revisionDelta = left.revisionNumber - right.revisionNumber;\n if (revisionDelta !== 0) return revisionDelta;\n const createdDelta = left.createdAt.getTime() - right.createdAt.getTime();\n if (createdDelta !== 0) return createdDelta;\n return left.id.localeCompare(right.id);\n });\n}\n\nfunction sortAttachments(rows: IssueAttachmentRow[]): IssueAttachmentRow[] {\n return [...rows].sort((left, right) => {\n const createdDelta = left.attachmentCreatedAt.getTime() - right.attachmentCreatedAt.getTime();\n if (createdDelta !== 0) return createdDelta;\n return left.id.localeCompare(right.id);\n });\n}\n\nfunction sortIssuesForImport(sourceIssues: IssueRow[]): IssueRow[] {\n const byId = new Map(sourceIssues.map((issue) => [issue.id, issue]));\n const memoDepth = new Map<string, number>();\n\n const depthFor = (issue: IssueRow, stack = new Set<string>()): number => {\n const memoized = memoDepth.get(issue.id);\n if (memoized !== undefined) return memoized;\n if (!issue.parentId) {\n memoDepth.set(issue.id, 0);\n return 0;\n }\n if (stack.has(issue.id)) {\n memoDepth.set(issue.id, 0);\n return 0;\n }\n const parent = byId.get(issue.parentId);\n if (!parent) {\n memoDepth.set(issue.id, 0);\n return 0;\n }\n stack.add(issue.id);\n const depth = depthFor(parent, stack) + 1;\n stack.delete(issue.id);\n memoDepth.set(issue.id, depth);\n return depth;\n };\n\n return [...sourceIssues].sort((left, right) => {\n const depthDelta = depthFor(left) - depthFor(right);\n if (depthDelta !== 0) return depthDelta;\n const createdDelta = left.createdAt.getTime() - right.createdAt.getTime();\n if (createdDelta !== 0) return createdDelta;\n return left.id.localeCompare(right.id);\n });\n}\n\nexport function parseWorktreeMergeScopes(rawValue: string | undefined): WorktreeMergeScope[] {\n if (!rawValue || rawValue.trim().length === 0) {\n return [\"issues\", \"comments\"];\n }\n\n const parsed = rawValue\n .split(\",\")\n .map((value) => value.trim().toLowerCase())\n .filter((value): value is WorktreeMergeScope =>\n (WORKTREE_MERGE_SCOPES as readonly string[]).includes(value),\n );\n\n if (parsed.length === 0) {\n throw new Error(\n `Invalid scope \"${rawValue}\". Expected a comma-separated list of: ${WORKTREE_MERGE_SCOPES.join(\", \")}.`,\n );\n }\n\n return [...new Set(parsed)];\n}\n\nexport function buildWorktreeMergePlan(input: {\n companyId: string;\n companyName: string;\n issuePrefix: string;\n previewIssueCounterStart: number;\n scopes: WorktreeMergeScope[];\n sourceIssues: IssueRow[];\n targetIssues: IssueRow[];\n sourceComments: CommentRow[];\n targetComments: CommentRow[];\n sourceProjects?: ProjectRow[];\n sourceProjectWorkspaces?: ProjectWorkspaceRow[];\n sourceDocuments?: IssueDocumentRow[];\n targetDocuments?: IssueDocumentRow[];\n sourceDocumentRevisions?: DocumentRevisionRow[];\n targetDocumentRevisions?: DocumentRevisionRow[];\n sourceAttachments?: IssueAttachmentRow[];\n targetAttachments?: IssueAttachmentRow[];\n targetAgents: AgentRow[];\n targetProjects: ProjectRow[];\n targetProjectWorkspaces: ProjectWorkspaceRow[];\n targetGoals: GoalRow[];\n importProjectIds?: Iterable<string>;\n projectIdOverrides?: Record<string, string | null | undefined>;\n}): WorktreeMergePlan {\n const targetIssuesById = new Map(input.targetIssues.map((issue) => [issue.id, issue]));\n const targetCommentIds = new Set(input.targetComments.map((comment) => comment.id));\n const targetAgentIds = new Set(input.targetAgents.map((agent) => agent.id));\n const targetProjectIds = new Set(input.targetProjects.map((project) => project.id));\n const targetProjectsById = new Map(input.targetProjects.map((project) => [project.id, project]));\n const targetProjectWorkspaceIds = new Set(input.targetProjectWorkspaces.map((workspace) => workspace.id));\n const targetGoalIds = new Set(input.targetGoals.map((goal) => goal.id));\n const sourceProjectsById = new Map((input.sourceProjects ?? []).map((project) => [project.id, project]));\n const sourceProjectWorkspaces = input.sourceProjectWorkspaces ?? [];\n const sourceProjectWorkspacesByProjectId = groupBy(sourceProjectWorkspaces, (workspace) => workspace.projectId);\n const importProjectIds = new Set(input.importProjectIds ?? []);\n const scopes = new Set(input.scopes);\n\n const adjustmentCounts: Record<ImportAdjustment, number> = {\n clear_assignee_agent: 0,\n clear_project: 0,\n clear_project_workspace: 0,\n clear_goal: 0,\n clear_author_agent: 0,\n coerce_in_progress_to_todo: 0,\n clear_document_agent: 0,\n clear_document_revision_agent: 0,\n clear_attachment_agent: 0,\n };\n\n const projectImports: PlannedProjectImport[] = [];\n for (const projectId of importProjectIds) {\n if (targetProjectIds.has(projectId)) continue;\n const sourceProject = sourceProjectsById.get(projectId);\n if (!sourceProject) continue;\n projectImports.push({\n source: sourceProject,\n targetLeadAgentId:\n sourceProject.leadAgentId && targetAgentIds.has(sourceProject.leadAgentId)\n ? sourceProject.leadAgentId\n : null,\n targetGoalId:\n sourceProject.goalId && targetGoalIds.has(sourceProject.goalId)\n ? sourceProject.goalId\n : null,\n workspaces: [...(sourceProjectWorkspacesByProjectId.get(projectId) ?? [])].sort((left, right) => {\n const primaryDelta = Number(right.isPrimary) - Number(left.isPrimary);\n if (primaryDelta !== 0) return primaryDelta;\n const createdDelta = left.createdAt.getTime() - right.createdAt.getTime();\n if (createdDelta !== 0) return createdDelta;\n return left.id.localeCompare(right.id);\n }),\n });\n }\n const importedProjectWorkspaceIds = new Set(\n projectImports.flatMap((project) => project.workspaces.map((workspace) => workspace.id)),\n );\n\n const issuePlans: Array<PlannedIssueInsert | PlannedIssueSkip> = [];\n let nextPreviewIssueNumber = input.previewIssueCounterStart;\n for (const issue of sortIssuesForImport(input.sourceIssues)) {\n const existing = targetIssuesById.get(issue.id);\n if (existing) {\n issuePlans.push({\n source: issue,\n action: \"skip_existing\",\n driftKeys: compareIssueCoreFields(issue, existing),\n });\n continue;\n }\n\n nextPreviewIssueNumber += 1;\n const adjustments: ImportAdjustment[] = [];\n const targetAssigneeAgentId =\n issue.assigneeAgentId && targetAgentIds.has(issue.assigneeAgentId) ? issue.assigneeAgentId : null;\n if (issue.assigneeAgentId && !targetAssigneeAgentId) {\n adjustments.push(\"clear_assignee_agent\");\n incrementAdjustment(adjustmentCounts, \"clear_assignee_agent\");\n }\n\n const targetCreatedByAgentId =\n issue.createdByAgentId && targetAgentIds.has(issue.createdByAgentId) ? issue.createdByAgentId : null;\n\n let targetProjectId =\n issue.projectId && targetProjectIds.has(issue.projectId) ? issue.projectId : null;\n let projectResolution: PlannedIssueInsert[\"projectResolution\"] = targetProjectId ? \"preserved\" : \"cleared\";\n let mappedProjectName: string | null = null;\n const overrideProjectId =\n issue.projectId && input.projectIdOverrides\n ? input.projectIdOverrides[issue.projectId] ?? null\n : null;\n if (!targetProjectId && overrideProjectId && targetProjectIds.has(overrideProjectId)) {\n targetProjectId = overrideProjectId;\n projectResolution = \"mapped\";\n mappedProjectName = targetProjectsById.get(overrideProjectId)?.name ?? null;\n }\n if (!targetProjectId && issue.projectId && importProjectIds.has(issue.projectId)) {\n const sourceProject = sourceProjectsById.get(issue.projectId);\n if (sourceProject) {\n targetProjectId = sourceProject.id;\n projectResolution = \"imported\";\n mappedProjectName = sourceProject.name;\n }\n }\n if (issue.projectId && !targetProjectId) {\n adjustments.push(\"clear_project\");\n incrementAdjustment(adjustmentCounts, \"clear_project\");\n }\n\n const targetProjectWorkspaceId =\n targetProjectId\n && targetProjectId === issue.projectId\n && issue.projectWorkspaceId\n && (targetProjectWorkspaceIds.has(issue.projectWorkspaceId)\n || importedProjectWorkspaceIds.has(issue.projectWorkspaceId))\n ? issue.projectWorkspaceId\n : null;\n if (issue.projectWorkspaceId && !targetProjectWorkspaceId) {\n adjustments.push(\"clear_project_workspace\");\n incrementAdjustment(adjustmentCounts, \"clear_project_workspace\");\n }\n\n const targetGoalId =\n issue.goalId && targetGoalIds.has(issue.goalId) ? issue.goalId : null;\n if (issue.goalId && !targetGoalId) {\n adjustments.push(\"clear_goal\");\n incrementAdjustment(adjustmentCounts, \"clear_goal\");\n }\n\n let targetStatus = issue.status;\n if (\n targetStatus === \"in_progress\"\n && !targetAssigneeAgentId\n && !(issue.assigneeUserId && issue.assigneeUserId.trim().length > 0)\n ) {\n targetStatus = \"todo\";\n adjustments.push(\"coerce_in_progress_to_todo\");\n incrementAdjustment(adjustmentCounts, \"coerce_in_progress_to_todo\");\n }\n\n issuePlans.push({\n source: issue,\n action: \"insert\",\n previewIssueNumber: nextPreviewIssueNumber,\n previewIdentifier: `${input.issuePrefix}-${nextPreviewIssueNumber}`,\n targetStatus,\n targetAssigneeAgentId,\n targetCreatedByAgentId,\n targetProjectId,\n targetProjectWorkspaceId,\n targetGoalId,\n projectResolution,\n mappedProjectName,\n adjustments,\n });\n }\n\n const issueIdsAvailableAfterImport = new Set<string>([\n ...input.targetIssues.map((issue) => issue.id),\n ...issuePlans.filter((plan): plan is PlannedIssueInsert => plan.action === \"insert\").map((plan) => plan.source.id),\n ]);\n\n const commentPlans: Array<PlannedCommentInsert | PlannedCommentSkip> = [];\n if (scopes.has(\"comments\")) {\n const sortedComments = [...input.sourceComments].sort((left, right) => {\n const createdDelta = left.createdAt.getTime() - right.createdAt.getTime();\n if (createdDelta !== 0) return createdDelta;\n return left.id.localeCompare(right.id);\n });\n\n for (const comment of sortedComments) {\n if (targetCommentIds.has(comment.id)) {\n commentPlans.push({ source: comment, action: \"skip_existing\" });\n continue;\n }\n if (!issueIdsAvailableAfterImport.has(comment.issueId)) {\n commentPlans.push({ source: comment, action: \"skip_missing_parent\" });\n continue;\n }\n\n const adjustments: ImportAdjustment[] = [];\n const targetAuthorAgentId =\n comment.authorAgentId && targetAgentIds.has(comment.authorAgentId) ? comment.authorAgentId : null;\n if (comment.authorAgentId && !targetAuthorAgentId) {\n adjustments.push(\"clear_author_agent\");\n incrementAdjustment(adjustmentCounts, \"clear_author_agent\");\n }\n\n commentPlans.push({\n source: comment,\n action: \"insert\",\n targetAuthorAgentId,\n adjustments,\n });\n }\n }\n\n const sourceDocuments = input.sourceDocuments ?? [];\n const targetDocuments = input.targetDocuments ?? [];\n const sourceDocumentRevisions = input.sourceDocumentRevisions ?? [];\n const targetDocumentRevisions = input.targetDocumentRevisions ?? [];\n\n const targetDocumentsById = new Map(targetDocuments.map((document) => [document.documentId, document]));\n const targetDocumentsByIssueKey = new Map(targetDocuments.map((document) => [`${document.issueId}:${document.key}`, document]));\n const sourceRevisionsByDocumentId = groupBy(sourceDocumentRevisions, (revision) => revision.documentId);\n const targetRevisionsByDocumentId = groupBy(targetDocumentRevisions, (revision) => revision.documentId);\n const commentIdsAvailableAfterImport = new Set<string>([\n ...input.targetComments.map((comment) => comment.id),\n ...commentPlans.filter((plan): plan is PlannedCommentInsert => plan.action === \"insert\").map((plan) => plan.source.id),\n ]);\n\n const documentPlans: Array<PlannedIssueDocumentInsert | PlannedIssueDocumentMerge | PlannedIssueDocumentSkip> = [];\n for (const document of sortDocumentRows(sourceDocuments)) {\n if (!issueIdsAvailableAfterImport.has(document.issueId)) {\n documentPlans.push({ source: document, action: \"skip_missing_parent\" });\n continue;\n }\n\n const existingDocument = targetDocumentsById.get(document.documentId);\n const conflictingIssueKeyDocument = targetDocumentsByIssueKey.get(`${document.issueId}:${document.key}`);\n if (!existingDocument && conflictingIssueKeyDocument && conflictingIssueKeyDocument.documentId !== document.documentId) {\n documentPlans.push({ source: document, action: \"skip_conflicting_key\" });\n continue;\n }\n\n const adjustments: ImportAdjustment[] = [];\n const targetCreatedByAgentId =\n document.createdByAgentId && targetAgentIds.has(document.createdByAgentId) ? document.createdByAgentId : null;\n const targetUpdatedByAgentId =\n document.updatedByAgentId && targetAgentIds.has(document.updatedByAgentId) ? document.updatedByAgentId : null;\n if (\n (document.createdByAgentId && !targetCreatedByAgentId)\n || (document.updatedByAgentId && !targetUpdatedByAgentId)\n ) {\n adjustments.push(\"clear_document_agent\");\n incrementAdjustment(adjustmentCounts, \"clear_document_agent\");\n }\n\n const sourceRevisions = sortDocumentRevisions(sourceRevisionsByDocumentId.get(document.documentId) ?? []);\n const targetRevisions = sortDocumentRevisions(targetRevisionsByDocumentId.get(document.documentId) ?? []);\n const existingRevisionIds = new Set(targetRevisions.map((revision) => revision.id));\n const usedRevisionNumbers = new Set(targetRevisions.map((revision) => revision.revisionNumber));\n let nextRevisionNumber = targetRevisions.reduce(\n (maxValue, revision) => Math.max(maxValue, revision.revisionNumber),\n 0,\n ) + 1;\n\n const targetRevisionNumberById = new Map<string, number>(\n targetRevisions.map((revision) => [revision.id, revision.revisionNumber]),\n );\n const revisionsToInsert: PlannedDocumentRevisionInsert[] = [];\n\n for (const revision of sourceRevisions) {\n if (existingRevisionIds.has(revision.id)) continue;\n let targetRevisionNumber = revision.revisionNumber;\n if (usedRevisionNumbers.has(targetRevisionNumber)) {\n while (usedRevisionNumbers.has(nextRevisionNumber)) {\n nextRevisionNumber += 1;\n }\n targetRevisionNumber = nextRevisionNumber;\n nextRevisionNumber += 1;\n }\n usedRevisionNumbers.add(targetRevisionNumber);\n targetRevisionNumberById.set(revision.id, targetRevisionNumber);\n\n const revisionAdjustments: ImportAdjustment[] = [];\n const targetCreatedByAgentId =\n revision.createdByAgentId && targetAgentIds.has(revision.createdByAgentId) ? revision.createdByAgentId : null;\n if (revision.createdByAgentId && !targetCreatedByAgentId) {\n revisionAdjustments.push(\"clear_document_revision_agent\");\n incrementAdjustment(adjustmentCounts, \"clear_document_revision_agent\");\n }\n\n revisionsToInsert.push({\n source: revision,\n targetRevisionNumber,\n targetCreatedByAgentId,\n adjustments: revisionAdjustments,\n });\n }\n\n const latestRevisionId = document.latestRevisionId ?? existingDocument?.latestRevisionId ?? null;\n const latestRevisionNumber =\n (latestRevisionId ? targetRevisionNumberById.get(latestRevisionId) : undefined)\n ?? document.latestRevisionNumber\n ?? existingDocument?.latestRevisionNumber\n ?? 0;\n\n if (!existingDocument) {\n documentPlans.push({\n source: document,\n action: \"insert\",\n targetCreatedByAgentId,\n targetUpdatedByAgentId,\n latestRevisionId,\n latestRevisionNumber,\n revisionsToInsert,\n adjustments,\n });\n continue;\n }\n\n const documentAlreadyMatches =\n existingDocument.key === document.key\n && existingDocument.title === document.title\n && existingDocument.format === document.format\n && existingDocument.latestBody === document.latestBody\n && (existingDocument.latestRevisionId ?? null) === latestRevisionId\n && existingDocument.latestRevisionNumber === latestRevisionNumber\n && (existingDocument.updatedByAgentId ?? null) === targetUpdatedByAgentId\n && (existingDocument.updatedByUserId ?? null) === (document.updatedByUserId ?? null)\n && sameDate(existingDocument.documentUpdatedAt, document.documentUpdatedAt)\n && sameDate(existingDocument.linkUpdatedAt, document.linkUpdatedAt)\n && revisionsToInsert.length === 0;\n\n if (documentAlreadyMatches) {\n documentPlans.push({ source: document, action: \"skip_existing\" });\n continue;\n }\n\n documentPlans.push({\n source: document,\n action: \"merge_existing\",\n targetCreatedByAgentId,\n targetUpdatedByAgentId,\n latestRevisionId,\n latestRevisionNumber,\n revisionsToInsert,\n adjustments,\n });\n }\n\n const sourceAttachments = input.sourceAttachments ?? [];\n const targetAttachmentIds = new Set((input.targetAttachments ?? []).map((attachment) => attachment.id));\n const attachmentPlans: Array<PlannedAttachmentInsert | PlannedAttachmentSkip> = [];\n for (const attachment of sortAttachments(sourceAttachments)) {\n if (targetAttachmentIds.has(attachment.id)) {\n attachmentPlans.push({ source: attachment, action: \"skip_existing\" });\n continue;\n }\n if (!issueIdsAvailableAfterImport.has(attachment.issueId)) {\n attachmentPlans.push({ source: attachment, action: \"skip_missing_parent\" });\n continue;\n }\n\n const adjustments: ImportAdjustment[] = [];\n const targetCreatedByAgentId =\n attachment.createdByAgentId && targetAgentIds.has(attachment.createdByAgentId)\n ? attachment.createdByAgentId\n : null;\n if (attachment.createdByAgentId && !targetCreatedByAgentId) {\n adjustments.push(\"clear_attachment_agent\");\n incrementAdjustment(adjustmentCounts, \"clear_attachment_agent\");\n }\n\n attachmentPlans.push({\n source: attachment,\n action: \"insert\",\n targetIssueCommentId:\n attachment.issueCommentId && commentIdsAvailableAfterImport.has(attachment.issueCommentId)\n ? attachment.issueCommentId\n : null,\n targetCreatedByAgentId,\n adjustments,\n });\n }\n\n const counts = {\n projectsToImport: projectImports.length,\n issuesToInsert: issuePlans.filter((plan) => plan.action === \"insert\").length,\n issuesExisting: issuePlans.filter((plan) => plan.action === \"skip_existing\").length,\n issueDrift: issuePlans.filter((plan) => plan.action === \"skip_existing\" && plan.driftKeys.length > 0).length,\n commentsToInsert: commentPlans.filter((plan) => plan.action === \"insert\").length,\n commentsExisting: commentPlans.filter((plan) => plan.action === \"skip_existing\").length,\n commentsMissingParent: commentPlans.filter((plan) => plan.action === \"skip_missing_parent\").length,\n documentsToInsert: documentPlans.filter((plan) => plan.action === \"insert\").length,\n documentsToMerge: documentPlans.filter((plan) => plan.action === \"merge_existing\").length,\n documentsExisting: documentPlans.filter((plan) => plan.action === \"skip_existing\").length,\n documentsConflictingKey: documentPlans.filter((plan) => plan.action === \"skip_conflicting_key\").length,\n documentsMissingParent: documentPlans.filter((plan) => plan.action === \"skip_missing_parent\").length,\n documentRevisionsToInsert: documentPlans.reduce(\n (sum, plan) =>\n sum + (plan.action === \"insert\" || plan.action === \"merge_existing\" ? plan.revisionsToInsert.length : 0),\n 0,\n ),\n attachmentsToInsert: attachmentPlans.filter((plan) => plan.action === \"insert\").length,\n attachmentsExisting: attachmentPlans.filter((plan) => plan.action === \"skip_existing\").length,\n attachmentsMissingParent: attachmentPlans.filter((plan) => plan.action === \"skip_missing_parent\").length,\n };\n\n return {\n companyId: input.companyId,\n companyName: input.companyName,\n issuePrefix: input.issuePrefix,\n previewIssueCounterStart: input.previewIssueCounterStart,\n scopes: input.scopes,\n projectImports,\n issuePlans,\n commentPlans,\n documentPlans,\n attachmentPlans,\n counts,\n adjustments: adjustmentCounts,\n };\n}\n", "import path from \"node:path\";\nimport { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport {\n addCommonClientOptions,\n handleCommandError,\n printOutput,\n resolveCommandContext,\n type BaseClientOptions,\n} from \"./common.js\";\n\n// ---------------------------------------------------------------------------\n// Types mirroring server-side shapes\n// ---------------------------------------------------------------------------\n\ninterface PluginRecord {\n id: string;\n pluginKey: string;\n packageName: string;\n version: string;\n status: string;\n displayName?: string;\n lastError?: string | null;\n installedAt: string;\n updatedAt: string;\n}\n\n\n// ---------------------------------------------------------------------------\n// Option types\n// ---------------------------------------------------------------------------\n\ninterface PluginListOptions extends BaseClientOptions {\n status?: string;\n}\n\ninterface PluginInstallOptions extends BaseClientOptions {\n local?: boolean;\n version?: string;\n}\n\ninterface PluginUninstallOptions extends BaseClientOptions {\n force?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve a local path argument to an absolute path so the server can find the\n * plugin on disk regardless of where the user ran the CLI.\n */\nfunction resolvePackageArg(packageArg: string, isLocal: boolean): string {\n if (!isLocal) return packageArg;\n // Already absolute\n if (path.isAbsolute(packageArg)) return packageArg;\n // Expand leading ~ to home directory\n if (packageArg.startsWith(\"~\")) {\n const home = process.env.HOME ?? process.env.USERPROFILE ?? \"\";\n return path.resolve(home, packageArg.slice(1).replace(/^[\\\\/]/, \"\"));\n }\n return path.resolve(process.cwd(), packageArg);\n}\n\nfunction formatPlugin(p: PluginRecord): string {\n const statusColor =\n p.status === \"ready\"\n ? pc.green(p.status)\n : p.status === \"error\"\n ? pc.red(p.status)\n : p.status === \"disabled\"\n ? pc.dim(p.status)\n : pc.yellow(p.status);\n\n const parts = [\n `key=${pc.bold(p.pluginKey)}`,\n `status=${statusColor}`,\n `version=${p.version}`,\n `id=${pc.dim(p.id)}`,\n ];\n\n if (p.lastError) {\n parts.push(`error=${pc.red(p.lastError.slice(0, 80))}`);\n }\n\n return parts.join(\" \");\n}\n\n// ---------------------------------------------------------------------------\n// Command registration\n// ---------------------------------------------------------------------------\n\nexport function registerPluginCommands(program: Command): void {\n const plugin = program.command(\"plugin\").description(\"Plugin lifecycle management\");\n\n // -------------------------------------------------------------------------\n // plugin list\n // -------------------------------------------------------------------------\n addCommonClientOptions(\n plugin\n .command(\"list\")\n .description(\"List installed plugins\")\n .option(\"--status <status>\", \"Filter by status (ready, error, disabled, installed, upgrade_pending)\")\n .action(async (opts: PluginListOptions) => {\n try {\n const ctx = resolveCommandContext(opts);\n const qs = opts.status ? `?status=${encodeURIComponent(opts.status)}` : \"\";\n const plugins = await ctx.api.get<PluginRecord[]>(`/api/plugins${qs}`);\n\n if (ctx.json) {\n printOutput(plugins, { json: true });\n return;\n }\n\n const rows = plugins ?? [];\n if (rows.length === 0) {\n console.log(pc.dim(\"No plugins installed.\"));\n return;\n }\n\n for (const p of rows) {\n console.log(formatPlugin(p));\n }\n } catch (err) {\n handleCommandError(err);\n }\n }),\n );\n\n // -------------------------------------------------------------------------\n // plugin install <package-or-path>\n // -------------------------------------------------------------------------\n addCommonClientOptions(\n plugin\n .command(\"install <package>\")\n .description(\n \"Install a plugin from a local path or npm package.\\n\" +\n \" Examples:\\n\" +\n \" relaycontrol plugin install ./my-plugin # local path\\n\" +\n \" relaycontrol plugin install @acme/plugin-linear # npm package\\n\" +\n \" relaycontrol plugin install @acme/plugin-linear@1.2 # pinned version\",\n )\n .option(\"-l, --local\", \"Treat <package> as a local filesystem path\", false)\n .option(\"--version <version>\", \"Specific npm version to install (npm packages only)\")\n .action(async (packageArg: string, opts: PluginInstallOptions) => {\n try {\n const ctx = resolveCommandContext(opts);\n\n // Auto-detect local paths: starts with . or / or ~ or is an absolute path\n const isLocal =\n opts.local ||\n packageArg.startsWith(\"./\") ||\n packageArg.startsWith(\"../\") ||\n packageArg.startsWith(\"/\") ||\n packageArg.startsWith(\"~\");\n\n const resolvedPackage = resolvePackageArg(packageArg, isLocal);\n\n if (!ctx.json) {\n console.log(\n pc.dim(\n isLocal\n ? `Installing plugin from local path: ${resolvedPackage}`\n : `Installing plugin: ${resolvedPackage}${opts.version ? `@${opts.version}` : \"\"}`,\n ),\n );\n }\n\n const installedPlugin = await ctx.api.post<PluginRecord>(\"/api/plugins/install\", {\n packageName: resolvedPackage,\n version: opts.version,\n isLocalPath: isLocal,\n });\n\n if (ctx.json) {\n printOutput(installedPlugin, { json: true });\n return;\n }\n\n if (!installedPlugin) {\n console.log(pc.dim(\"Install returned no plugin record.\"));\n return;\n }\n\n console.log(\n pc.green(\n `\u2713 Installed ${pc.bold(installedPlugin.pluginKey)} v${installedPlugin.version} (${installedPlugin.status})`,\n ),\n );\n\n if (installedPlugin.lastError) {\n console.log(pc.red(` Warning: ${installedPlugin.lastError}`));\n }\n } catch (err) {\n handleCommandError(err);\n }\n }),\n );\n\n // -------------------------------------------------------------------------\n // plugin uninstall <plugin-key-or-id>\n // -------------------------------------------------------------------------\n addCommonClientOptions(\n plugin\n .command(\"uninstall <pluginKey>\")\n .description(\n \"Uninstall a plugin by its plugin key or database ID.\\n\" +\n \" Use --force to hard-purge all state and config.\",\n )\n .option(\"--force\", \"Purge all plugin state and config (hard delete)\", false)\n .action(async (pluginKey: string, opts: PluginUninstallOptions) => {\n try {\n const ctx = resolveCommandContext(opts);\n const purge = opts.force === true;\n const qs = purge ? \"?purge=true\" : \"\";\n\n if (!ctx.json) {\n console.log(\n pc.dim(\n purge\n ? `Uninstalling and purging plugin: ${pluginKey}`\n : `Uninstalling plugin: ${pluginKey}`,\n ),\n );\n }\n\n const result = await ctx.api.delete<PluginRecord | null>(\n `/api/plugins/${encodeURIComponent(pluginKey)}${qs}`,\n );\n\n if (ctx.json) {\n printOutput(result, { json: true });\n return;\n }\n\n console.log(pc.green(`\u2713 Uninstalled ${pc.bold(pluginKey)}${purge ? \" (purged)\" : \"\"}`));\n } catch (err) {\n handleCommandError(err);\n }\n }),\n );\n\n // -------------------------------------------------------------------------\n // plugin enable <plugin-key-or-id>\n // -------------------------------------------------------------------------\n addCommonClientOptions(\n plugin\n .command(\"enable <pluginKey>\")\n .description(\"Enable a disabled or errored plugin\")\n .action(async (pluginKey: string, opts: BaseClientOptions) => {\n try {\n const ctx = resolveCommandContext(opts);\n const result = await ctx.api.post<PluginRecord>(\n `/api/plugins/${encodeURIComponent(pluginKey)}/enable`,\n );\n\n if (ctx.json) {\n printOutput(result, { json: true });\n return;\n }\n\n console.log(pc.green(`\u2713 Enabled ${pc.bold(pluginKey)} \u2014 status: ${result?.status ?? \"unknown\"}`));\n } catch (err) {\n handleCommandError(err);\n }\n }),\n );\n\n // -------------------------------------------------------------------------\n // plugin disable <plugin-key-or-id>\n // -------------------------------------------------------------------------\n addCommonClientOptions(\n plugin\n .command(\"disable <pluginKey>\")\n .description(\"Disable a running plugin without uninstalling it\")\n .action(async (pluginKey: string, opts: BaseClientOptions) => {\n try {\n const ctx = resolveCommandContext(opts);\n const result = await ctx.api.post<PluginRecord>(\n `/api/plugins/${encodeURIComponent(pluginKey)}/disable`,\n );\n\n if (ctx.json) {\n printOutput(result, { json: true });\n return;\n }\n\n console.log(pc.dim(`Disabled ${pc.bold(pluginKey)} \u2014 status: ${result?.status ?? \"unknown\"}`));\n } catch (err) {\n handleCommandError(err);\n }\n }),\n );\n\n // -------------------------------------------------------------------------\n // plugin inspect <plugin-key-or-id>\n // -------------------------------------------------------------------------\n addCommonClientOptions(\n plugin\n .command(\"inspect <pluginKey>\")\n .description(\"Show full details for an installed plugin\")\n .action(async (pluginKey: string, opts: BaseClientOptions) => {\n try {\n const ctx = resolveCommandContext(opts);\n const result = await ctx.api.get<PluginRecord>(\n `/api/plugins/${encodeURIComponent(pluginKey)}`,\n );\n\n if (ctx.json) {\n printOutput(result, { json: true });\n return;\n }\n\n if (!result) {\n console.log(pc.red(`Plugin not found: ${pluginKey}`));\n process.exit(1);\n }\n\n console.log(formatPlugin(result));\n if (result.lastError) {\n console.log(`\\n${pc.red(\"Last error:\")}\\n${result.lastError}`);\n }\n } catch (err) {\n handleCommandError(err);\n }\n }),\n );\n\n // -------------------------------------------------------------------------\n // plugin examples\n // -------------------------------------------------------------------------\n addCommonClientOptions(\n plugin\n .command(\"examples\")\n .description(\"List bundled example plugins available for local install\")\n .action(async (opts: BaseClientOptions) => {\n try {\n const ctx = resolveCommandContext(opts);\n const examples = await ctx.api.get<\n Array<{\n packageName: string;\n pluginKey: string;\n displayName: string;\n description: string;\n localPath: string;\n tag: string;\n }>\n >(\"/api/plugins/examples\");\n\n if (ctx.json) {\n printOutput(examples, { json: true });\n return;\n }\n\n const rows = examples ?? [];\n if (rows.length === 0) {\n console.log(pc.dim(\"No bundled examples available.\"));\n return;\n }\n\n for (const ex of rows) {\n console.log(\n `${pc.bold(ex.displayName)} ${pc.dim(ex.pluginKey)}\\n` +\n ` ${ex.description}\\n` +\n ` ${pc.cyan(`relaycontrol plugin install ${ex.localPath}`)}`,\n );\n }\n } catch (err) {\n handleCommandError(err);\n }\n }),\n );\n}\n", "import type { Command } from \"commander\";\nimport {\n getStoredBoardCredential,\n loginBoardCli,\n removeStoredBoardCredential,\n revokeStoredBoardCredential,\n} from \"../../client/board-auth.js\";\nimport {\n addCommonClientOptions,\n handleCommandError,\n printOutput,\n resolveCommandContext,\n type BaseClientOptions,\n} from \"./common.js\";\n\ninterface AuthLoginOptions extends BaseClientOptions {\n instanceAdmin?: boolean;\n}\n\ninterface AuthLogoutOptions extends BaseClientOptions {}\ninterface AuthWhoamiOptions extends BaseClientOptions {}\n\nexport function registerClientAuthCommands(auth: Command): void {\n addCommonClientOptions(\n auth\n .command(\"login\")\n .description(\"Authenticate the CLI for board-user access\")\n .option(\"--instance-admin\", \"Request instance-admin approval instead of plain board access\", false)\n .action(async (opts: AuthLoginOptions) => {\n try {\n const ctx = resolveCommandContext(opts);\n const login = await loginBoardCli({\n apiBase: ctx.api.apiBase,\n requestedAccess: opts.instanceAdmin ? \"instance_admin_required\" : \"board\",\n requestedCompanyId: ctx.companyId ?? null,\n command: \"relaycontrol auth login\",\n });\n printOutput(\n {\n ok: true,\n apiBase: ctx.api.apiBase,\n userId: login.userId ?? null,\n approvalUrl: login.approvalUrl,\n },\n { json: ctx.json },\n );\n } catch (err) {\n handleCommandError(err);\n }\n }),\n { includeCompany: true },\n );\n\n addCommonClientOptions(\n auth\n .command(\"logout\")\n .description(\"Remove the stored board-user credential for this API base\")\n .action(async (opts: AuthLogoutOptions) => {\n try {\n const ctx = resolveCommandContext(opts);\n const credential = getStoredBoardCredential(ctx.api.apiBase);\n if (!credential) {\n printOutput({ ok: true, apiBase: ctx.api.apiBase, revoked: false, removedLocalCredential: false }, { json: ctx.json });\n return;\n }\n let revoked = false;\n try {\n await revokeStoredBoardCredential({\n apiBase: ctx.api.apiBase,\n token: credential.token,\n });\n revoked = true;\n } catch {\n // Remove the local credential even if the server-side revoke fails.\n }\n const removedLocalCredential = removeStoredBoardCredential(ctx.api.apiBase);\n printOutput(\n {\n ok: true,\n apiBase: ctx.api.apiBase,\n revoked,\n removedLocalCredential,\n },\n { json: ctx.json },\n );\n } catch (err) {\n handleCommandError(err);\n }\n }),\n );\n\n addCommonClientOptions(\n auth\n .command(\"whoami\")\n .description(\"Show the current board-user identity for this API base\")\n .action(async (opts: AuthWhoamiOptions) => {\n try {\n const ctx = resolveCommandContext(opts);\n const me = await ctx.api.get<{\n user: { id: string; name: string; email: string } | null;\n userId: string;\n isInstanceAdmin: boolean;\n companyIds: string[];\n source: string;\n keyId: string | null;\n }>(\"/api/cli-auth/me\");\n printOutput(me, { json: ctx.json });\n } catch (err) {\n handleCommandError(err);\n }\n }),\n );\n}\n", "import { Command } from \"commander\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { upsertProfile } from \"../client/context.js\";\nimport { setStoredBoardCredential } from \"../client/board-auth.js\";\n\ninterface ConnectOptions {\n server: string;\n token: string;\n context?: string;\n profile?: string;\n authStore?: string;\n}\n\ninterface HealthResponse {\n status?: string;\n [key: string]: unknown;\n}\n\ninterface MeResponse {\n userId?: string;\n email?: string;\n user?: {\n id?: string;\n email?: string;\n name?: string;\n } | null;\n}\n\nfunction normalizeServerUrl(url: string): string {\n return url.trim().replace(/\\/+$/, \"\");\n}\n\nexport function registerConnectCommand(program: Command): void {\n program\n .command(\"connect\")\n .description(\"Connect CLI to a Relay Control server and verify credentials\")\n .requiredOption(\"-s, --server <url>\", \"Relay Control server URL\")\n .requiredOption(\"-t, --token <token>\", \"Bearer token for authentication\")\n .option(\"--context <path>\", \"Path to CLI context file\")\n .option(\"--profile <name>\", \"Profile name (default: current profile)\")\n .option(\"--auth-store <path>\", \"Path to auth store file\")\n .action(async (opts: ConnectOptions) => {\n const server = normalizeServerUrl(opts.server);\n\n p.intro(pc.bgCyan(pc.black(\" relaycontrol connect \")));\n\n const s = p.spinner();\n\n // 1. Save server URL to context profile\n s.start(\"Saving server URL to profile\");\n try {\n upsertProfile(\n opts.profile ?? \"default\",\n { apiBase: server },\n opts.context,\n );\n s.stop(\"Server URL saved to profile\");\n } catch (err) {\n s.stop(\"Failed to save server URL\");\n p.log.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n\n // 2. Save bearer token as board credential\n s.start(\"Saving auth credentials\");\n try {\n setStoredBoardCredential({\n apiBase: server,\n token: opts.token,\n storePath: opts.authStore,\n });\n s.stop(\"Auth credentials saved\");\n } catch (err) {\n s.stop(\"Failed to save credentials\");\n p.log.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n\n // 3. Verify server connectivity\n s.start(\"Checking server health\");\n try {\n const healthUrl = `${server}/api/health`;\n const res = await fetch(healthUrl, {\n headers: { accept: \"application/json\" },\n });\n if (!res.ok) {\n throw new Error(`Health check returned HTTP ${res.status}`);\n }\n const body = (await res.json()) as HealthResponse;\n s.stop(`Server is reachable (status: ${body.status ?? \"ok\"})`);\n } catch (err) {\n s.stop(\"Server health check failed\");\n p.log.error(\n `Could not reach ${server}/api/health\\n` +\n (err instanceof Error ? err.message : String(err)),\n );\n process.exit(1);\n }\n\n // 4. Verify auth token\n s.start(\"Verifying authentication\");\n try {\n const meUrl = `${server}/api/cli-auth/me`;\n const res = await fetch(meUrl, {\n headers: {\n accept: \"application/json\",\n authorization: `Bearer ${opts.token}`,\n },\n });\n if (!res.ok) {\n throw new Error(`Auth verification returned HTTP ${res.status}`);\n }\n const me = (await res.json()) as MeResponse;\n const email = me.email ?? me.user?.email ?? \"unknown\";\n const userId = me.userId ?? me.user?.id ?? null;\n\n // Update credential with userId now that we know it\n if (userId) {\n setStoredBoardCredential({\n apiBase: server,\n token: opts.token,\n userId,\n storePath: opts.authStore,\n });\n }\n\n s.stop(`Authenticated as ${pc.bold(email)}`);\n } catch (err) {\n s.stop(\"Authentication failed\");\n p.log.error(\n `Token verification failed against ${server}/api/cli-auth/me\\n` +\n (err instanceof Error ? err.message : String(err)),\n );\n process.exit(1);\n }\n\n p.log.success(`Connected to ${pc.cyan(server)}`);\n p.outro(\"Connection verified. You're ready to go.\");\n });\n}\n", "import path from \"node:path\";\nimport fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport { setTimeout as delay } from \"node:timers/promises\";\nimport type { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport type { AdapterExecutionContext, AdapterExecutionResult } from \"@paperclipai/adapter-utils\";\nimport { execute as claudeExecute } from \"@paperclipai/adapter-claude-local/server\";\nimport { execute as codexExecute } from \"@paperclipai/adapter-codex-local/server\";\nimport { execute as cursorExecute } from \"@paperclipai/adapter-cursor-local/server\";\nimport { execute as geminiExecute } from \"@paperclipai/adapter-gemini-local/server\";\nimport { execute as openCodeExecute } from \"@paperclipai/adapter-opencode-local/server\";\nimport { execute as piExecute } from \"@paperclipai/adapter-pi-local/server\";\nimport { addCommonClientOptions, handleCommandError, resolveCommandContext } from \"./client/common.js\";\nimport { PaperclipApiClient } from \"../client/http.js\";\n\n// ---------------------------------------------------------------------------\n// Adapter registry\n// ---------------------------------------------------------------------------\n\ntype ExecuteFn = (ctx: AdapterExecutionContext) => Promise<AdapterExecutionResult>;\n\nconst LOCAL_EXECUTORS = new Map<string, ExecuteFn>([\n [\"claude_local\", claudeExecute],\n [\"codex_local\", codexExecute],\n [\"cursor\", cursorExecute],\n [\"gemini_local\", geminiExecute],\n [\"opencode_local\", openCodeExecute],\n [\"pi_local\", piExecute],\n]);\n\n// ---------------------------------------------------------------------------\n// Types matching the server runner route responses\n// ---------------------------------------------------------------------------\n\ninterface RunnerJob {\n id: string;\n companyId: string;\n agentId: string;\n agentName: string;\n agentAdapterType: string;\n agentAdapterConfig: Record<string, unknown>;\n agentRuntimeConfig: Record<string, unknown>;\n contextSnapshot: Record<string, unknown> | null;\n status: string;\n createdAt: string;\n}\n\ninterface ClaimResponse {\n run: RunnerJob;\n agent: {\n id: string;\n companyId: string;\n name: string;\n adapterType: string;\n adapterConfig: Record<string, unknown>;\n } | null;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction resolveLocalWorkspacePath(agentId: string): string {\n const base = process.env.PAPERCLIP_RUNNER_WORKSPACES?.trim()\n || path.join(os.homedir(), \"paperclip\", \"workspaces\");\n return path.join(base, agentId);\n}\n\n// ---------------------------------------------------------------------------\n// Job executor\n// ---------------------------------------------------------------------------\n\nasync function executeJob(\n api: PaperclipApiClient,\n job: RunnerJob,\n verbose: boolean,\n): Promise<void> {\n const runId = job.id;\n const adapterType = job.agentAdapterType;\n\n // Claim the run atomically\n let claimed: ClaimResponse | null;\n try {\n claimed = await api.post<ClaimResponse>(`/api/runner/jobs/${runId}/claim`);\n } catch (err) {\n // Another runner may have claimed it first \u2014 not an error\n if (verbose) {\n console.log(pc.yellow(`[runner] Skipping ${runId} \u2014 already claimed: ${err instanceof Error ? err.message : String(err)}`));\n }\n return;\n }\n if (!claimed) return;\n\n console.log(pc.cyan(`[runner] \u25B6 ${job.agentName} (${adapterType}) run ${runId}`));\n\n const executeFn = LOCAL_EXECUTORS.get(adapterType);\n if (!executeFn) {\n const msg = `Adapter '${adapterType}' is not supported for local execution`;\n console.error(pc.red(`[runner] \u2717 ${msg}`));\n await api.post(`/api/runner/jobs/${runId}/complete`, {\n exitCode: 1,\n signal: null,\n timedOut: false,\n errorMessage: msg,\n errorCode: \"unsupported_adapter\",\n }).catch(() => undefined);\n return;\n }\n\n // Ensure workspace directory exists\n const workspacePath = resolveLocalWorkspacePath(job.agentId);\n try {\n await fs.mkdir(workspacePath, { recursive: true });\n } catch {\n // Non-fatal \u2014 the adapter may create its own cwd\n }\n\n // Build adapter config: inject workspace cwd only when agent has none configured\n const adapterConfig: Record<string, unknown> = {\n ...(typeof job.agentAdapterConfig === \"object\" && job.agentAdapterConfig !== null\n ? job.agentAdapterConfig\n : {}),\n };\n if (!adapterConfig.cwd) {\n adapterConfig.cwd = workspacePath;\n }\n\n const context: Record<string, unknown> = {\n ...(job.contextSnapshot ?? {}),\n };\n\n const onLog = async (stream: \"stdout\" | \"stderr\", chunk: string): Promise<void> => {\n await api\n .post(`/api/runner/jobs/${runId}/log`, { stream, chunk })\n .catch(() => undefined); // best-effort; don't crash on transient errors\n };\n\n const ctx: AdapterExecutionContext = {\n runId,\n agent: {\n id: job.agentId,\n companyId: job.companyId,\n name: job.agentName,\n adapterType,\n adapterConfig,\n },\n runtime: {\n sessionId: null,\n sessionParams: null,\n sessionDisplayId: null,\n taskKey: null,\n },\n config: adapterConfig,\n context,\n onLog,\n };\n\n let result: AdapterExecutionResult;\n try {\n result = await executeFn(ctx);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n console.error(pc.red(`[runner] \u2717 Adapter exception for run ${runId}: ${message}`));\n await api\n .post(`/api/runner/jobs/${runId}/complete`, {\n exitCode: 1,\n signal: null,\n timedOut: false,\n errorMessage: message,\n errorCode: \"adapter_exception\",\n })\n .catch(() => undefined);\n return;\n }\n\n const outcome =\n result.timedOut\n ? \"timed_out\"\n : (result.exitCode ?? 0) === 0 && !result.errorMessage\n ? \"succeeded\"\n : \"failed\";\n\n const icon = outcome === \"succeeded\" ? \"\u2713\" : \"\u2717\";\n const colour = outcome === \"succeeded\" ? \"green\" : \"red\";\n console.log(pc[colour](`[runner] ${icon} Run ${runId} ${outcome} (exit ${result.exitCode ?? \"null\"})`));\n\n await api\n .post(`/api/runner/jobs/${runId}/complete`, {\n exitCode: result.exitCode,\n signal: result.signal,\n timedOut: result.timedOut,\n errorMessage: result.errorMessage ?? null,\n errorCode: result.errorCode ?? null,\n resultJson: result.resultJson ?? null,\n })\n .catch((err) => {\n console.error(pc.yellow(`[runner] Warning: failed to report completion for ${runId}: ${err instanceof Error ? err.message : String(err)}`));\n });\n}\n\n// ---------------------------------------------------------------------------\n// Poll loop\n// ---------------------------------------------------------------------------\n\ninterface RunnerStartOptions {\n config?: string;\n dataDir?: string;\n context?: string;\n profile?: string;\n apiBase?: string;\n apiKey?: string;\n json?: boolean;\n pollInterval?: string;\n concurrency?: string;\n verbose?: boolean;\n}\n\nasync function runnerStart(opts: RunnerStartOptions): Promise<void> {\n const pollIntervalMs = Math.max(500, Number(opts.pollInterval ?? \"3000\") || 3000);\n const maxConcurrency = Math.max(1, Number(opts.concurrency ?? \"4\") || 4);\n\n const ctx = resolveCommandContext(opts);\n const api = ctx.api;\n\n console.log(pc.bold(`[runner] Local runner starting \u2014 polling every ${pollIntervalMs}ms`));\n console.log(pc.dim(`[runner] API base: ${(api as { apiBase?: string }).apiBase ?? \"(inferred)\"}`));\n console.log(pc.dim(`[runner] Max concurrency: ${maxConcurrency}`));\n console.log(pc.dim(\"[runner] Press Ctrl+C to stop\\n\"));\n\n const inFlight = new Set<string>();\n\n const shutdown = () => {\n console.log(pc.yellow(\"\\n[runner] Shutting down...\"));\n process.exit(0);\n };\n process.once(\"SIGINT\", shutdown);\n process.once(\"SIGTERM\", shutdown);\n\n while (true) {\n try {\n const jobs = await api.get<RunnerJob[]>(\"/api/runner/jobs\");\n const pending = Array.isArray(jobs) ? jobs.filter((j) => !inFlight.has(j.id)) : [];\n\n const available = maxConcurrency - inFlight.size;\n const batch = pending.slice(0, Math.max(0, available));\n\n for (const job of batch) {\n inFlight.add(job.id);\n void executeJob(api, job, Boolean(opts.verbose))\n .catch((err) => {\n console.error(pc.red(`[runner] Unhandled error for run ${job.id}: ${err instanceof Error ? err.message : String(err)}`));\n })\n .finally(() => {\n inFlight.delete(job.id);\n });\n }\n } catch (err) {\n console.error(pc.yellow(`[runner] Poll error: ${err instanceof Error ? err.message : String(err)}`));\n }\n\n await delay(pollIntervalMs);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Command registration\n// ---------------------------------------------------------------------------\n\nexport function registerRunnerCommands(program: Command): void {\n const runner = program.command(\"runner\").description(\"Local agent runner \u2014 execute agents on this machine\");\n\n addCommonClientOptions(\n runner\n .command(\"start\")\n .description(\"Start the local runner and poll for pending jobs\")\n .option(\"--poll-interval <ms>\", \"Poll interval in milliseconds\", \"3000\")\n .option(\"--concurrency <n>\", \"Max number of concurrent runs\", \"4\")\n .option(\"--verbose\", \"Print extra debug output\")\n .action(async (opts: RunnerStartOptions) => {\n try {\n await runnerStart(opts);\n } catch (err) {\n handleCommandError(err);\n }\n }),\n );\n}\n", "import fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type { AdapterExecutionContext, AdapterExecutionResult } from \"@paperclipai/adapter-utils\";\nimport type { RunProcessResult } from \"@paperclipai/adapter-utils/server-utils\";\nimport {\n asString,\n asNumber,\n asBoolean,\n asStringArray,\n parseObject,\n parseJson,\n buildPaperclipEnv,\n readPaperclipRuntimeSkillEntries,\n joinPromptSections,\n buildInvocationEnvForLogs,\n ensureAbsoluteDirectory,\n ensureCommandResolvable,\n ensurePathInEnv,\n resolveCommandForLogs,\n renderTemplate,\n runChildProcess,\n} from \"@paperclipai/adapter-utils/server-utils\";\nimport {\n parseClaudeStreamJson,\n describeClaudeFailure,\n detectClaudeLoginRequired,\n isClaudeMaxTurnsResult,\n isClaudeUnknownSessionError,\n} from \"./parse.js\";\nimport { resolveClaudeDesiredSkillNames } from \"./skills.js\";\n\nconst __moduleDir = path.dirname(fileURLToPath(import.meta.url));\n\n/**\n * Create a tmpdir with `.claude/skills/` containing symlinks to skills from\n * the repo's `skills/` directory, so `--add-dir` makes Claude Code discover\n * them as proper registered skills.\n */\nasync function buildSkillsDir(config: Record<string, unknown>): Promise<string> {\n const tmp = await fs.mkdtemp(path.join(os.tmpdir(), \"paperclip-skills-\"));\n const target = path.join(tmp, \".claude\", \"skills\");\n await fs.mkdir(target, { recursive: true });\n const availableEntries = await readPaperclipRuntimeSkillEntries(config, __moduleDir);\n const desiredNames = new Set(\n resolveClaudeDesiredSkillNames(\n config,\n availableEntries,\n ),\n );\n for (const entry of availableEntries) {\n if (!desiredNames.has(entry.key)) continue;\n await fs.symlink(\n entry.source,\n path.join(target, entry.runtimeName),\n );\n }\n return tmp;\n}\n\ninterface ClaudeExecutionInput {\n runId: string;\n agent: AdapterExecutionContext[\"agent\"];\n config: Record<string, unknown>;\n context: Record<string, unknown>;\n authToken?: string;\n}\n\ninterface ClaudeRuntimeConfig {\n command: string;\n resolvedCommand: string;\n cwd: string;\n workspaceId: string | null;\n workspaceRepoUrl: string | null;\n workspaceRepoRef: string | null;\n env: Record<string, string>;\n loggedEnv: Record<string, string>;\n timeoutSec: number;\n graceSec: number;\n extraArgs: string[];\n}\n\nfunction buildLoginResult(input: {\n proc: RunProcessResult;\n loginUrl: string | null;\n}) {\n return {\n exitCode: input.proc.exitCode,\n signal: input.proc.signal,\n timedOut: input.proc.timedOut,\n stdout: input.proc.stdout,\n stderr: input.proc.stderr,\n loginUrl: input.loginUrl,\n };\n}\n\nfunction hasNonEmptyEnvValue(env: Record<string, string>, key: string): boolean {\n const raw = env[key];\n return typeof raw === \"string\" && raw.trim().length > 0;\n}\n\nfunction resolveClaudeBillingType(env: Record<string, string>): \"api\" | \"subscription\" {\n // Claude uses API-key auth when ANTHROPIC_API_KEY is present; otherwise rely on local login/session auth.\n return hasNonEmptyEnvValue(env, \"ANTHROPIC_API_KEY\") ? \"api\" : \"subscription\";\n}\n\nasync function buildClaudeRuntimeConfig(input: ClaudeExecutionInput): Promise<ClaudeRuntimeConfig> {\n const { runId, agent, config, context, authToken } = input;\n\n const command = asString(config.command, \"claude\");\n const workspaceContext = parseObject(context.paperclipWorkspace);\n const workspaceCwd = asString(workspaceContext.cwd, \"\");\n const workspaceSource = asString(workspaceContext.source, \"\");\n const workspaceStrategy = asString(workspaceContext.strategy, \"\");\n const workspaceId = asString(workspaceContext.workspaceId, \"\") || null;\n const workspaceRepoUrl = asString(workspaceContext.repoUrl, \"\") || null;\n const workspaceRepoRef = asString(workspaceContext.repoRef, \"\") || null;\n const workspaceBranch = asString(workspaceContext.branchName, \"\") || null;\n const workspaceWorktreePath = asString(workspaceContext.worktreePath, \"\") || null;\n const agentHome = asString(workspaceContext.agentHome, \"\") || null;\n const workspaceHints = Array.isArray(context.paperclipWorkspaces)\n ? context.paperclipWorkspaces.filter(\n (value): value is Record<string, unknown> => typeof value === \"object\" && value !== null,\n )\n : [];\n const runtimeServiceIntents = Array.isArray(context.paperclipRuntimeServiceIntents)\n ? context.paperclipRuntimeServiceIntents.filter(\n (value): value is Record<string, unknown> => typeof value === \"object\" && value !== null,\n )\n : [];\n const runtimeServices = Array.isArray(context.paperclipRuntimeServices)\n ? context.paperclipRuntimeServices.filter(\n (value): value is Record<string, unknown> => typeof value === \"object\" && value !== null,\n )\n : [];\n const runtimePrimaryUrl = asString(context.paperclipRuntimePrimaryUrl, \"\");\n const configuredCwd = asString(config.cwd, \"\");\n const useConfiguredInsteadOfAgentHome = workspaceSource === \"agent_home\" && configuredCwd.length > 0;\n const effectiveWorkspaceCwd = useConfiguredInsteadOfAgentHome ? \"\" : workspaceCwd;\n const cwd = effectiveWorkspaceCwd || configuredCwd || process.cwd();\n await ensureAbsoluteDirectory(cwd, { createIfMissing: true });\n\n const envConfig = parseObject(config.env);\n const hasExplicitApiKey =\n typeof envConfig.PAPERCLIP_API_KEY === \"string\" && envConfig.PAPERCLIP_API_KEY.trim().length > 0;\n const env: Record<string, string> = { ...buildPaperclipEnv(agent) };\n env.PAPERCLIP_RUN_ID = runId;\n\n const wakeTaskId =\n (typeof context.taskId === \"string\" && context.taskId.trim().length > 0 && context.taskId.trim()) ||\n (typeof context.issueId === \"string\" && context.issueId.trim().length > 0 && context.issueId.trim()) ||\n null;\n const wakeReason =\n typeof context.wakeReason === \"string\" && context.wakeReason.trim().length > 0\n ? context.wakeReason.trim()\n : null;\n const wakeCommentId =\n (typeof context.wakeCommentId === \"string\" && context.wakeCommentId.trim().length > 0 && context.wakeCommentId.trim()) ||\n (typeof context.commentId === \"string\" && context.commentId.trim().length > 0 && context.commentId.trim()) ||\n null;\n const approvalId =\n typeof context.approvalId === \"string\" && context.approvalId.trim().length > 0\n ? context.approvalId.trim()\n : null;\n const approvalStatus =\n typeof context.approvalStatus === \"string\" && context.approvalStatus.trim().length > 0\n ? context.approvalStatus.trim()\n : null;\n const linkedIssueIds = Array.isArray(context.issueIds)\n ? context.issueIds.filter((value): value is string => typeof value === \"string\" && value.trim().length > 0)\n : [];\n\n if (wakeTaskId) {\n env.PAPERCLIP_TASK_ID = wakeTaskId;\n }\n if (wakeReason) {\n env.PAPERCLIP_WAKE_REASON = wakeReason;\n }\n if (wakeCommentId) {\n env.PAPERCLIP_WAKE_COMMENT_ID = wakeCommentId;\n }\n if (approvalId) {\n env.PAPERCLIP_APPROVAL_ID = approvalId;\n }\n if (approvalStatus) {\n env.PAPERCLIP_APPROVAL_STATUS = approvalStatus;\n }\n if (linkedIssueIds.length > 0) {\n env.PAPERCLIP_LINKED_ISSUE_IDS = linkedIssueIds.join(\",\");\n }\n if (effectiveWorkspaceCwd) {\n env.PAPERCLIP_WORKSPACE_CWD = effectiveWorkspaceCwd;\n }\n if (workspaceSource) {\n env.PAPERCLIP_WORKSPACE_SOURCE = workspaceSource;\n }\n if (workspaceStrategy) {\n env.PAPERCLIP_WORKSPACE_STRATEGY = workspaceStrategy;\n }\n if (workspaceId) {\n env.PAPERCLIP_WORKSPACE_ID = workspaceId;\n }\n if (workspaceRepoUrl) {\n env.PAPERCLIP_WORKSPACE_REPO_URL = workspaceRepoUrl;\n }\n if (workspaceRepoRef) {\n env.PAPERCLIP_WORKSPACE_REPO_REF = workspaceRepoRef;\n }\n if (workspaceBranch) {\n env.PAPERCLIP_WORKSPACE_BRANCH = workspaceBranch;\n }\n if (workspaceWorktreePath) {\n env.PAPERCLIP_WORKSPACE_WORKTREE_PATH = workspaceWorktreePath;\n }\n if (agentHome) {\n env.AGENT_HOME = agentHome;\n }\n if (workspaceHints.length > 0) {\n env.PAPERCLIP_WORKSPACES_JSON = JSON.stringify(workspaceHints);\n }\n if (runtimeServiceIntents.length > 0) {\n env.PAPERCLIP_RUNTIME_SERVICE_INTENTS_JSON = JSON.stringify(runtimeServiceIntents);\n }\n if (runtimeServices.length > 0) {\n env.PAPERCLIP_RUNTIME_SERVICES_JSON = JSON.stringify(runtimeServices);\n }\n if (runtimePrimaryUrl) {\n env.PAPERCLIP_RUNTIME_PRIMARY_URL = runtimePrimaryUrl;\n }\n\n for (const [key, value] of Object.entries(envConfig)) {\n if (typeof value === \"string\") env[key] = value;\n }\n\n if (!hasExplicitApiKey && authToken) {\n env.PAPERCLIP_API_KEY = authToken;\n }\n\n const runtimeEnv = ensurePathInEnv({ ...process.env, ...env });\n await ensureCommandResolvable(command, cwd, runtimeEnv);\n const resolvedCommand = await resolveCommandForLogs(command, cwd, runtimeEnv);\n const loggedEnv = buildInvocationEnvForLogs(env, {\n runtimeEnv,\n includeRuntimeKeys: [\"HOME\", \"CLAUDE_CONFIG_DIR\"],\n resolvedCommand,\n });\n\n const timeoutSec = asNumber(config.timeoutSec, 0);\n const graceSec = asNumber(config.graceSec, 20);\n const extraArgs = (() => {\n const fromExtraArgs = asStringArray(config.extraArgs);\n if (fromExtraArgs.length > 0) return fromExtraArgs;\n return asStringArray(config.args);\n })();\n\n return {\n command,\n resolvedCommand,\n cwd,\n workspaceId,\n workspaceRepoUrl,\n workspaceRepoRef,\n env,\n loggedEnv,\n timeoutSec,\n graceSec,\n extraArgs,\n };\n}\n\nexport async function runClaudeLogin(input: {\n runId: string;\n agent: AdapterExecutionContext[\"agent\"];\n config: Record<string, unknown>;\n context?: Record<string, unknown>;\n authToken?: string;\n onLog?: (stream: \"stdout\" | \"stderr\", chunk: string) => Promise<void>;\n}) {\n const onLog = input.onLog ?? (async () => {});\n const runtime = await buildClaudeRuntimeConfig({\n runId: input.runId,\n agent: input.agent,\n config: input.config,\n context: input.context ?? {},\n authToken: input.authToken,\n });\n\n const proc = await runChildProcess(input.runId, runtime.command, [\"login\"], {\n cwd: runtime.cwd,\n env: runtime.env,\n timeoutSec: runtime.timeoutSec,\n graceSec: runtime.graceSec,\n onLog,\n });\n\n const loginMeta = detectClaudeLoginRequired({\n parsed: null,\n stdout: proc.stdout,\n stderr: proc.stderr,\n });\n\n return buildLoginResult({\n proc,\n loginUrl: loginMeta.loginUrl,\n });\n}\n\nexport async function execute(ctx: AdapterExecutionContext): Promise<AdapterExecutionResult> {\n const { runId, agent, runtime, config, context, onLog, onMeta, onSpawn, authToken } = ctx;\n\n const promptTemplate = asString(\n config.promptTemplate,\n \"You are agent {{agent.id}} ({{agent.name}}). Continue your Paperclip work.\",\n );\n const model = asString(config.model, \"\");\n const effort = asString(config.effort, \"\");\n const chrome = asBoolean(config.chrome, false);\n const maxTurns = asNumber(config.maxTurnsPerRun, 0);\n const dangerouslySkipPermissions = asBoolean(config.dangerouslySkipPermissions, false);\n const instructionsFilePath = asString(config.instructionsFilePath, \"\").trim();\n const instructionsFileDir = instructionsFilePath ? `${path.dirname(instructionsFilePath)}/` : \"\";\n const commandNotes = instructionsFilePath\n ? [\n `Injected agent instructions via --append-system-prompt-file ${instructionsFilePath} (with path directive appended)`,\n ]\n : [];\n\n const runtimeConfig = await buildClaudeRuntimeConfig({\n runId,\n agent,\n config,\n context,\n authToken,\n });\n const {\n command,\n resolvedCommand,\n cwd,\n workspaceId,\n workspaceRepoUrl,\n workspaceRepoRef,\n env,\n loggedEnv,\n timeoutSec,\n graceSec,\n extraArgs,\n } = runtimeConfig;\n const effectiveEnv = Object.fromEntries(\n Object.entries({ ...process.env, ...env }).filter(\n (entry): entry is [string, string] => typeof entry[1] === \"string\",\n ),\n );\n const billingType = resolveClaudeBillingType(effectiveEnv);\n const skillsDir = await buildSkillsDir(config);\n\n // When instructionsFilePath is configured, create a combined temp file that\n // includes both the file content and the path directive, so we only need\n // --append-system-prompt-file (Claude CLI forbids using both flags together).\n let effectiveInstructionsFilePath: string | undefined = instructionsFilePath;\n if (instructionsFilePath) {\n try {\n const instructionsContent = await fs.readFile(instructionsFilePath, \"utf-8\");\n const pathDirective = `\\nThe above agent instructions were loaded from ${instructionsFilePath}. Resolve any relative file references from ${instructionsFileDir}.`;\n const combinedPath = path.join(skillsDir, \"agent-instructions.md\");\n await fs.writeFile(combinedPath, instructionsContent + pathDirective, \"utf-8\");\n effectiveInstructionsFilePath = combinedPath;\n } catch (err) {\n const reason = err instanceof Error ? err.message : String(err);\n await onLog(\n \"stderr\",\n `[paperclip] Warning: could not read agent instructions file \"${instructionsFilePath}\": ${reason}\\n`,\n );\n effectiveInstructionsFilePath = undefined;\n }\n }\n\n const runtimeSessionParams = parseObject(runtime.sessionParams);\n const runtimeSessionId = asString(runtimeSessionParams.sessionId, runtime.sessionId ?? \"\");\n const runtimeSessionCwd = asString(runtimeSessionParams.cwd, \"\");\n const canResumeSession =\n runtimeSessionId.length > 0 &&\n (runtimeSessionCwd.length === 0 || path.resolve(runtimeSessionCwd) === path.resolve(cwd));\n const sessionId = canResumeSession ? runtimeSessionId : null;\n if (runtimeSessionId && !canResumeSession) {\n await onLog(\n \"stdout\",\n `[paperclip] Claude session \"${runtimeSessionId}\" was saved for cwd \"${runtimeSessionCwd}\" and will not be resumed in \"${cwd}\".\\n`,\n );\n }\n const bootstrapPromptTemplate = asString(config.bootstrapPromptTemplate, \"\");\n const templateData = {\n agentId: agent.id,\n companyId: agent.companyId,\n runId,\n company: { id: agent.companyId },\n agent,\n run: { id: runId, source: \"on_demand\" },\n context,\n };\n const renderedPrompt = renderTemplate(promptTemplate, templateData);\n const renderedBootstrapPrompt =\n !sessionId && bootstrapPromptTemplate.trim().length > 0\n ? renderTemplate(bootstrapPromptTemplate, templateData).trim()\n : \"\";\n const sessionHandoffNote = asString(context.paperclipSessionHandoffMarkdown, \"\").trim();\n const prompt = joinPromptSections([\n renderedBootstrapPrompt,\n sessionHandoffNote,\n renderedPrompt,\n ]);\n const promptMetrics = {\n promptChars: prompt.length,\n bootstrapPromptChars: renderedBootstrapPrompt.length,\n sessionHandoffChars: sessionHandoffNote.length,\n heartbeatPromptChars: renderedPrompt.length,\n };\n\n const buildClaudeArgs = (resumeSessionId: string | null) => {\n const args = [\"--print\", \"-\", \"--output-format\", \"stream-json\", \"--verbose\"];\n if (resumeSessionId) args.push(\"--resume\", resumeSessionId);\n if (dangerouslySkipPermissions) args.push(\"--dangerously-skip-permissions\");\n if (chrome) args.push(\"--chrome\");\n if (model) args.push(\"--model\", model);\n if (effort) args.push(\"--effort\", effort);\n if (maxTurns > 0) args.push(\"--max-turns\", String(maxTurns));\n if (effectiveInstructionsFilePath) {\n args.push(\"--append-system-prompt-file\", effectiveInstructionsFilePath);\n }\n args.push(\"--add-dir\", skillsDir);\n if (extraArgs.length > 0) args.push(...extraArgs);\n return args;\n };\n\n const parseFallbackErrorMessage = (proc: RunProcessResult) => {\n const stderrLine =\n proc.stderr\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .find(Boolean) ?? \"\";\n\n if ((proc.exitCode ?? 0) === 0) {\n return \"Failed to parse claude JSON output\";\n }\n\n return stderrLine\n ? `Claude exited with code ${proc.exitCode ?? -1}: ${stderrLine}`\n : `Claude exited with code ${proc.exitCode ?? -1}`;\n };\n\n const runAttempt = async (resumeSessionId: string | null) => {\n const args = buildClaudeArgs(resumeSessionId);\n if (onMeta) {\n await onMeta({\n adapterType: \"claude_local\",\n command: resolvedCommand,\n cwd,\n commandArgs: args,\n commandNotes,\n env: loggedEnv,\n prompt,\n promptMetrics,\n context,\n });\n }\n\n const proc = await runChildProcess(runId, command, args, {\n cwd,\n env,\n stdin: prompt,\n timeoutSec,\n graceSec,\n onSpawn,\n onLog,\n });\n\n const parsedStream = parseClaudeStreamJson(proc.stdout);\n const parsed = parsedStream.resultJson ?? parseJson(proc.stdout);\n return { proc, parsedStream, parsed };\n };\n\n const toAdapterResult = (\n attempt: {\n proc: RunProcessResult;\n parsedStream: ReturnType<typeof parseClaudeStreamJson>;\n parsed: Record<string, unknown> | null;\n },\n opts: { fallbackSessionId: string | null; clearSessionOnMissingSession?: boolean },\n ): AdapterExecutionResult => {\n const { proc, parsedStream, parsed } = attempt;\n const loginMeta = detectClaudeLoginRequired({\n parsed,\n stdout: proc.stdout,\n stderr: proc.stderr,\n });\n const errorMeta =\n loginMeta.loginUrl != null\n ? {\n loginUrl: loginMeta.loginUrl,\n }\n : undefined;\n\n if (proc.timedOut) {\n return {\n exitCode: proc.exitCode,\n signal: proc.signal,\n timedOut: true,\n errorMessage: `Timed out after ${timeoutSec}s`,\n errorCode: \"timeout\",\n errorMeta,\n clearSession: Boolean(opts.clearSessionOnMissingSession),\n };\n }\n\n if (!parsed) {\n return {\n exitCode: proc.exitCode,\n signal: proc.signal,\n timedOut: false,\n errorMessage: parseFallbackErrorMessage(proc),\n errorCode: loginMeta.requiresLogin ? \"claude_auth_required\" : null,\n errorMeta,\n resultJson: {\n stdout: proc.stdout,\n stderr: proc.stderr,\n },\n clearSession: Boolean(opts.clearSessionOnMissingSession),\n };\n }\n\n const usage =\n parsedStream.usage ??\n (() => {\n const usageObj = parseObject(parsed.usage);\n return {\n inputTokens: asNumber(usageObj.input_tokens, 0),\n cachedInputTokens: asNumber(usageObj.cache_read_input_tokens, 0),\n outputTokens: asNumber(usageObj.output_tokens, 0),\n };\n })();\n\n const resolvedSessionId =\n parsedStream.sessionId ??\n (asString(parsed.session_id, opts.fallbackSessionId ?? \"\") || opts.fallbackSessionId);\n const resolvedSessionParams = resolvedSessionId\n ? ({\n sessionId: resolvedSessionId,\n cwd,\n ...(workspaceId ? { workspaceId } : {}),\n ...(workspaceRepoUrl ? { repoUrl: workspaceRepoUrl } : {}),\n ...(workspaceRepoRef ? { repoRef: workspaceRepoRef } : {}),\n } as Record<string, unknown>)\n : null;\n const clearSessionForMaxTurns = isClaudeMaxTurnsResult(parsed);\n\n return {\n exitCode: proc.exitCode,\n signal: proc.signal,\n timedOut: false,\n errorMessage:\n (proc.exitCode ?? 0) === 0\n ? null\n : describeClaudeFailure(parsed) ?? `Claude exited with code ${proc.exitCode ?? -1}`,\n errorCode: loginMeta.requiresLogin ? \"claude_auth_required\" : null,\n errorMeta,\n usage,\n sessionId: resolvedSessionId,\n sessionParams: resolvedSessionParams,\n sessionDisplayId: resolvedSessionId,\n provider: \"anthropic\",\n biller: \"anthropic\",\n model: parsedStream.model || asString(parsed.model, model),\n billingType,\n costUsd: parsedStream.costUsd ?? asNumber(parsed.total_cost_usd, 0),\n resultJson: parsed,\n summary: parsedStream.summary || asString(parsed.result, \"\"),\n clearSession: clearSessionForMaxTurns || Boolean(opts.clearSessionOnMissingSession && !resolvedSessionId),\n };\n };\n\n try {\n const initial = await runAttempt(sessionId ?? null);\n if (\n sessionId &&\n !initial.proc.timedOut &&\n (initial.proc.exitCode ?? 0) !== 0 &&\n initial.parsed &&\n isClaudeUnknownSessionError(initial.parsed)\n ) {\n await onLog(\n \"stdout\",\n `[paperclip] Claude resume session \"${sessionId}\" is unavailable; retrying with a fresh session.\\n`,\n );\n const retry = await runAttempt(null);\n return toAdapterResult(retry, { fallbackSessionId: null, clearSessionOnMissingSession: true });\n }\n\n return toAdapterResult(initial, { fallbackSessionId: runtimeSessionId || runtime.sessionId });\n } finally {\n fs.rm(skillsDir, { recursive: true, force: true }).catch(() => {});\n }\n}\n", "import type { UsageSummary } from \"@paperclipai/adapter-utils\";\nimport { asString, asNumber, parseObject, parseJson } from \"@paperclipai/adapter-utils/server-utils\";\n\nconst CLAUDE_AUTH_REQUIRED_RE = /(?:not\\s+logged\\s+in|please\\s+log\\s+in|please\\s+run\\s+`?claude\\s+login`?|login\\s+required|requires\\s+login|unauthorized|authentication\\s+required)/i;\nconst URL_RE = /(https?:\\/\\/[^\\s'\"`<>()[\\]{};,!?]+[^\\s'\"`<>()[\\]{};,!.?:]+)/gi;\n\nexport function parseClaudeStreamJson(stdout: string) {\n let sessionId: string | null = null;\n let model = \"\";\n let finalResult: Record<string, unknown> | null = null;\n const assistantTexts: string[] = [];\n\n for (const rawLine of stdout.split(/\\r?\\n/)) {\n const line = rawLine.trim();\n if (!line) continue;\n const event = parseJson(line);\n if (!event) continue;\n\n const type = asString(event.type, \"\");\n if (type === \"system\" && asString(event.subtype, \"\") === \"init\") {\n sessionId = asString(event.session_id, sessionId ?? \"\") || sessionId;\n model = asString(event.model, model);\n continue;\n }\n\n if (type === \"assistant\") {\n sessionId = asString(event.session_id, sessionId ?? \"\") || sessionId;\n const message = parseObject(event.message);\n const content = Array.isArray(message.content) ? message.content : [];\n for (const entry of content) {\n if (typeof entry !== \"object\" || entry === null || Array.isArray(entry)) continue;\n const block = entry as Record<string, unknown>;\n if (asString(block.type, \"\") === \"text\") {\n const text = asString(block.text, \"\");\n if (text) assistantTexts.push(text);\n }\n }\n continue;\n }\n\n if (type === \"result\") {\n finalResult = event;\n sessionId = asString(event.session_id, sessionId ?? \"\") || sessionId;\n }\n }\n\n if (!finalResult) {\n return {\n sessionId,\n model,\n costUsd: null as number | null,\n usage: null as UsageSummary | null,\n summary: assistantTexts.join(\"\\n\\n\").trim(),\n resultJson: null as Record<string, unknown> | null,\n };\n }\n\n const usageObj = parseObject(finalResult.usage);\n const usage: UsageSummary = {\n inputTokens: asNumber(usageObj.input_tokens, 0),\n cachedInputTokens: asNumber(usageObj.cache_read_input_tokens, 0),\n outputTokens: asNumber(usageObj.output_tokens, 0),\n };\n const costRaw = finalResult.total_cost_usd;\n const costUsd = typeof costRaw === \"number\" && Number.isFinite(costRaw) ? costRaw : null;\n const summary = asString(finalResult.result, assistantTexts.join(\"\\n\\n\")).trim();\n\n return {\n sessionId,\n model,\n costUsd,\n usage,\n summary,\n resultJson: finalResult,\n };\n}\n\nfunction extractClaudeErrorMessages(parsed: Record<string, unknown>): string[] {\n const raw = Array.isArray(parsed.errors) ? parsed.errors : [];\n const messages: string[] = [];\n\n for (const entry of raw) {\n if (typeof entry === \"string\") {\n const msg = entry.trim();\n if (msg) messages.push(msg);\n continue;\n }\n\n if (typeof entry !== \"object\" || entry === null || Array.isArray(entry)) {\n continue;\n }\n\n const obj = entry as Record<string, unknown>;\n const msg = asString(obj.message, \"\") || asString(obj.error, \"\") || asString(obj.code, \"\");\n if (msg) {\n messages.push(msg);\n continue;\n }\n\n try {\n messages.push(JSON.stringify(obj));\n } catch {\n // skip non-serializable entry\n }\n }\n\n return messages;\n}\n\nexport function extractClaudeLoginUrl(text: string): string | null {\n const match = text.match(URL_RE);\n if (!match || match.length === 0) return null;\n for (const rawUrl of match) {\n const cleaned = rawUrl.replace(/[\\])}.!,?;:'\\\"]+$/g, \"\");\n if (cleaned.includes(\"claude\") || cleaned.includes(\"anthropic\") || cleaned.includes(\"auth\")) {\n return cleaned;\n }\n }\n return match[0]?.replace(/[\\])}.!,?;:'\\\"]+$/g, \"\") ?? null;\n}\n\nexport function detectClaudeLoginRequired(input: {\n parsed: Record<string, unknown> | null;\n stdout: string;\n stderr: string;\n}): { requiresLogin: boolean; loginUrl: string | null } {\n const resultText = asString(input.parsed?.result, \"\").trim();\n const messages = [resultText, ...extractClaudeErrorMessages(input.parsed ?? {}), input.stdout, input.stderr]\n .join(\"\\n\")\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean);\n\n const requiresLogin = messages.some((line) => CLAUDE_AUTH_REQUIRED_RE.test(line));\n return {\n requiresLogin,\n loginUrl: extractClaudeLoginUrl([input.stdout, input.stderr].join(\"\\n\")),\n };\n}\n\nexport function describeClaudeFailure(parsed: Record<string, unknown>): string | null {\n const subtype = asString(parsed.subtype, \"\");\n const resultText = asString(parsed.result, \"\").trim();\n const errors = extractClaudeErrorMessages(parsed);\n\n let detail = resultText;\n if (!detail && errors.length > 0) {\n detail = errors[0] ?? \"\";\n }\n\n const parts = [\"Claude run failed\"];\n if (subtype) parts.push(`subtype=${subtype}`);\n if (detail) parts.push(detail);\n return parts.length > 1 ? parts.join(\": \") : null;\n}\n\nexport function isClaudeMaxTurnsResult(parsed: Record<string, unknown> | null | undefined): boolean {\n if (!parsed) return false;\n\n const subtype = asString(parsed.subtype, \"\").trim().toLowerCase();\n if (subtype === \"error_max_turns\") return true;\n\n const stopReason = asString(parsed.stop_reason, \"\").trim().toLowerCase();\n if (stopReason === \"max_turns\") return true;\n\n const resultText = asString(parsed.result, \"\").trim();\n return /max(?:imum)?\\s+turns?/i.test(resultText);\n}\n\nexport function isClaudeUnknownSessionError(parsed: Record<string, unknown>): boolean {\n const resultText = asString(parsed.result, \"\").trim();\n const allMessages = [resultText, ...extractClaudeErrorMessages(parsed)]\n .map((msg) => msg.trim())\n .filter(Boolean);\n\n return allMessages.some((msg) =>\n /no conversation found with session id|unknown session|session .* not found/i.test(msg),\n );\n}\n", "import os from \"node:os\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type {\n AdapterSkillContext,\n AdapterSkillEntry,\n AdapterSkillSnapshot,\n} from \"@paperclipai/adapter-utils\";\nimport {\n readPaperclipRuntimeSkillEntries,\n readInstalledSkillTargets,\n resolvePaperclipDesiredSkillNames,\n} from \"@paperclipai/adapter-utils/server-utils\";\n\nconst __moduleDir = path.dirname(fileURLToPath(import.meta.url));\n\nfunction asString(value: unknown): string | null {\n return typeof value === \"string\" && value.trim().length > 0 ? value.trim() : null;\n}\n\nfunction resolveClaudeSkillsHome(config: Record<string, unknown>) {\n const env =\n typeof config.env === \"object\" && config.env !== null && !Array.isArray(config.env)\n ? (config.env as Record<string, unknown>)\n : {};\n const configuredHome = asString(env.HOME);\n const home = configuredHome ? path.resolve(configuredHome) : os.homedir();\n return path.join(home, \".claude\", \"skills\");\n}\n\nasync function buildClaudeSkillSnapshot(config: Record<string, unknown>): Promise<AdapterSkillSnapshot> {\n const availableEntries = await readPaperclipRuntimeSkillEntries(config, __moduleDir);\n const availableByKey = new Map(availableEntries.map((entry) => [entry.key, entry]));\n const desiredSkills = resolvePaperclipDesiredSkillNames(config, availableEntries);\n const desiredSet = new Set(desiredSkills);\n const skillsHome = resolveClaudeSkillsHome(config);\n const installed = await readInstalledSkillTargets(skillsHome);\n const entries: AdapterSkillEntry[] = availableEntries.map((entry) => ({\n key: entry.key,\n runtimeName: entry.runtimeName,\n desired: desiredSet.has(entry.key),\n managed: true,\n state: desiredSet.has(entry.key) ? \"configured\" : \"available\",\n origin: entry.required ? \"paperclip_required\" : \"company_managed\",\n originLabel: entry.required ? \"Required by Paperclip\" : \"Managed by Paperclip\",\n readOnly: false,\n sourcePath: entry.source,\n targetPath: null,\n detail: desiredSet.has(entry.key)\n ? \"Will be mounted into the ephemeral Claude skill directory on the next run.\"\n : null,\n required: Boolean(entry.required),\n requiredReason: entry.requiredReason ?? null,\n }));\n const warnings: string[] = [];\n\n for (const desiredSkill of desiredSkills) {\n if (availableByKey.has(desiredSkill)) continue;\n warnings.push(`Desired skill \"${desiredSkill}\" is not available from the Paperclip skills directory.`);\n entries.push({\n key: desiredSkill,\n runtimeName: null,\n desired: true,\n managed: true,\n state: \"missing\",\n origin: \"external_unknown\",\n originLabel: \"External or unavailable\",\n readOnly: false,\n sourcePath: undefined,\n targetPath: undefined,\n detail: \"Paperclip cannot find this skill in the local runtime skills directory.\",\n });\n }\n\n for (const [name, installedEntry] of installed.entries()) {\n if (availableEntries.some((entry) => entry.runtimeName === name)) continue;\n entries.push({\n key: name,\n runtimeName: name,\n desired: false,\n managed: false,\n state: \"external\",\n origin: \"user_installed\",\n originLabel: \"User-installed\",\n locationLabel: \"~/.claude/skills\",\n readOnly: true,\n sourcePath: null,\n targetPath: installedEntry.targetPath ?? path.join(skillsHome, name),\n detail: \"Installed outside Paperclip management in the Claude skills home.\",\n });\n }\n\n entries.sort((left, right) => left.key.localeCompare(right.key));\n\n return {\n adapterType: \"claude_local\",\n supported: true,\n mode: \"ephemeral\",\n desiredSkills,\n entries,\n warnings,\n };\n}\n\nexport async function listClaudeSkills(ctx: AdapterSkillContext): Promise<AdapterSkillSnapshot> {\n return buildClaudeSkillSnapshot(ctx.config);\n}\n\nexport async function syncClaudeSkills(\n ctx: AdapterSkillContext,\n _desiredSkills: string[],\n): Promise<AdapterSkillSnapshot> {\n return buildClaudeSkillSnapshot(ctx.config);\n}\n\nexport function resolveClaudeDesiredSkillNames(\n config: Record<string, unknown>,\n availableEntries: Array<{ key: string; required?: boolean }>,\n) {\n return resolvePaperclipDesiredSkillNames(config, availableEntries);\n}\n", "import { execFile } from \"node:child_process\";\nimport fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { promisify } from \"node:util\";\nimport type { ProviderQuotaResult, QuotaWindow } from \"@paperclipai/adapter-utils\";\n\nconst execFileAsync = promisify(execFile);\n\nconst CLAUDE_USAGE_SOURCE_OAUTH = \"anthropic-oauth\";\nconst CLAUDE_USAGE_SOURCE_CLI = \"claude-cli\";\n\nexport function claudeConfigDir(): string {\n const fromEnv = process.env.CLAUDE_CONFIG_DIR;\n if (typeof fromEnv === \"string\" && fromEnv.trim().length > 0) return fromEnv.trim();\n return path.join(os.homedir(), \".claude\");\n}\n\nfunction hasNonEmptyProcessEnv(key: string): boolean {\n const value = process.env[key];\n return typeof value === \"string\" && value.trim().length > 0;\n}\n\nfunction createClaudeQuotaEnv(): Record<string, string> {\n const env: Record<string, string> = {};\n for (const [key, value] of Object.entries(process.env)) {\n if (typeof value !== \"string\") continue;\n if (key.startsWith(\"ANTHROPIC_\")) continue;\n env[key] = value;\n }\n return env;\n}\n\nfunction stripBackspaces(text: string): string {\n let out = \"\";\n for (const char of text) {\n if (char === \"\\b\") {\n out = out.slice(0, -1);\n } else {\n out += char;\n }\n }\n return out;\n}\n\nfunction stripAnsi(text: string): string {\n return text\n .replace(/\\u001B\\][^\\u0007]*(?:\\u0007|\\u001B\\\\)/g, \"\")\n .replace(/\\u001B(?:[@-Z\\\\-_]|\\[[0-?]*[ -/]*[@-~])/g, \"\");\n}\n\nfunction cleanTerminalText(text: string): string {\n return stripAnsi(stripBackspaces(text))\n .replace(/\\u0000/g, \"\")\n .replace(/\\r/g, \"\\n\");\n}\n\nfunction normalizeForLabelSearch(text: string): string {\n return text.toLowerCase().replace(/[^a-z0-9]+/g, \"\");\n}\n\nfunction trimToLatestUsagePanel(text: string): string | null {\n const lower = text.toLowerCase();\n const settingsIndex = lower.lastIndexOf(\"settings:\");\n if (settingsIndex < 0) return null;\n let tail = text.slice(settingsIndex);\n const tailLower = tail.toLowerCase();\n if (!tailLower.includes(\"usage\")) return null;\n if (!tailLower.includes(\"current session\") && !tailLower.includes(\"loading usage\")) return null;\n const stopMarkers = [\n \"status dialog dismissed\",\n \"checking for updates\",\n \"press ctrl-c again to exit\",\n ];\n let stopIndex = -1;\n for (const marker of stopMarkers) {\n const markerIndex = tailLower.indexOf(marker);\n if (markerIndex >= 0 && (stopIndex === -1 || markerIndex < stopIndex)) {\n stopIndex = markerIndex;\n }\n }\n if (stopIndex >= 0) {\n tail = tail.slice(0, stopIndex);\n }\n return tail;\n}\n\nasync function readClaudeTokenFromFile(credPath: string): Promise<string | null> {\n let raw: string;\n try {\n raw = await fs.readFile(credPath, \"utf8\");\n } catch {\n return null;\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n return null;\n }\n if (typeof parsed !== \"object\" || parsed === null) return null;\n const obj = parsed as Record<string, unknown>;\n const oauth = obj[\"claudeAiOauth\"];\n if (typeof oauth !== \"object\" || oauth === null) return null;\n const token = (oauth as Record<string, unknown>)[\"accessToken\"];\n return typeof token === \"string\" && token.length > 0 ? token : null;\n}\n\ninterface ClaudeAuthStatus {\n loggedIn: boolean;\n authMethod: string | null;\n subscriptionType: string | null;\n}\n\nexport async function readClaudeAuthStatus(): Promise<ClaudeAuthStatus | null> {\n try {\n const { stdout } = await execFileAsync(\"claude\", [\"auth\", \"status\"], {\n env: process.env,\n timeout: 5_000,\n maxBuffer: 1024 * 1024,\n });\n const parsed = JSON.parse(stdout) as Record<string, unknown>;\n return {\n loggedIn: parsed.loggedIn === true,\n authMethod: typeof parsed.authMethod === \"string\" ? parsed.authMethod : null,\n subscriptionType: typeof parsed.subscriptionType === \"string\" ? parsed.subscriptionType : null,\n };\n } catch {\n return null;\n }\n}\n\nfunction describeClaudeSubscriptionAuth(status: ClaudeAuthStatus | null): string | null {\n if (!status?.loggedIn || status.authMethod !== \"claude.ai\") return null;\n return status.subscriptionType\n ? `Claude is logged in via claude.ai (${status.subscriptionType})`\n : \"Claude is logged in via claude.ai\";\n}\n\nexport async function readClaudeToken(): Promise<string | null> {\n const configDir = claudeConfigDir();\n for (const filename of [\".credentials.json\", \"credentials.json\"]) {\n const token = await readClaudeTokenFromFile(path.join(configDir, filename));\n if (token) return token;\n }\n return null;\n}\n\ninterface AnthropicUsageWindow {\n utilization?: number | null;\n resets_at?: string | null;\n}\n\ninterface AnthropicExtraUsage {\n is_enabled?: boolean | null;\n monthly_limit?: number | null;\n used_credits?: number | null;\n utilization?: number | null;\n currency?: string | null;\n}\n\ninterface AnthropicUsageResponse {\n five_hour?: AnthropicUsageWindow | null;\n seven_day?: AnthropicUsageWindow | null;\n seven_day_sonnet?: AnthropicUsageWindow | null;\n seven_day_opus?: AnthropicUsageWindow | null;\n extra_usage?: AnthropicExtraUsage | null;\n}\n\nfunction formatCurrencyAmount(value: number, currency: string | null | undefined): string {\n const code = typeof currency === \"string\" && currency.trim().length > 0 ? currency.trim().toUpperCase() : \"USD\";\n return new Intl.NumberFormat(\"en-US\", {\n style: \"currency\",\n currency: code,\n maximumFractionDigits: 2,\n }).format(value);\n}\n\nfunction formatExtraUsageLabel(extraUsage: AnthropicExtraUsage): string | null {\n const monthlyLimit = extraUsage.monthly_limit;\n const usedCredits = extraUsage.used_credits;\n if (\n typeof monthlyLimit !== \"number\" ||\n !Number.isFinite(monthlyLimit) ||\n typeof usedCredits !== \"number\" ||\n !Number.isFinite(usedCredits)\n ) {\n return null;\n }\n return `${formatCurrencyAmount(usedCredits, extraUsage.currency)} / ${formatCurrencyAmount(monthlyLimit, extraUsage.currency)}`;\n}\n\n/** Convert a 0-1 utilization fraction to a 0-100 integer percent. Returns null for null/undefined input. */\nexport function toPercent(utilization: number | null | undefined): number | null {\n if (utilization == null) return null;\n return Math.min(100, Math.round(utilization * 100));\n}\n\n/** fetch with an abort-based timeout so a hanging provider api doesn't block the response indefinitely */\nexport async function fetchWithTimeout(url: string, init: RequestInit, ms = 8000): Promise<Response> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), ms);\n try {\n return await fetch(url, { ...init, signal: controller.signal });\n } finally {\n clearTimeout(timer);\n }\n}\n\nexport async function fetchClaudeQuota(token: string): Promise<QuotaWindow[]> {\n const resp = await fetchWithTimeout(\"https://api.anthropic.com/api/oauth/usage\", {\n headers: {\n Authorization: `Bearer ${token}`,\n \"anthropic-beta\": \"oauth-2025-04-20\",\n },\n });\n if (!resp.ok) throw new Error(`anthropic usage api returned ${resp.status}`);\n const body = (await resp.json()) as AnthropicUsageResponse;\n const windows: QuotaWindow[] = [];\n\n if (body.five_hour != null) {\n windows.push({\n label: \"Current session\",\n usedPercent: toPercent(body.five_hour.utilization),\n resetsAt: body.five_hour.resets_at ?? null,\n valueLabel: null,\n detail: null,\n });\n }\n if (body.seven_day != null) {\n windows.push({\n label: \"Current week (all models)\",\n usedPercent: toPercent(body.seven_day.utilization),\n resetsAt: body.seven_day.resets_at ?? null,\n valueLabel: null,\n detail: null,\n });\n }\n if (body.seven_day_sonnet != null) {\n windows.push({\n label: \"Current week (Sonnet only)\",\n usedPercent: toPercent(body.seven_day_sonnet.utilization),\n resetsAt: body.seven_day_sonnet.resets_at ?? null,\n valueLabel: null,\n detail: null,\n });\n }\n if (body.seven_day_opus != null) {\n windows.push({\n label: \"Current week (Opus only)\",\n usedPercent: toPercent(body.seven_day_opus.utilization),\n resetsAt: body.seven_day_opus.resets_at ?? null,\n valueLabel: null,\n detail: null,\n });\n }\n if (body.extra_usage != null) {\n windows.push({\n label: \"Extra usage\",\n usedPercent: body.extra_usage.is_enabled === false ? null : toPercent(body.extra_usage.utilization),\n resetsAt: null,\n valueLabel:\n body.extra_usage.is_enabled === false\n ? \"Not enabled\"\n : formatExtraUsageLabel(body.extra_usage),\n detail:\n body.extra_usage.is_enabled === false\n ? \"Extra usage not enabled\"\n : \"Monthly extra usage pool\",\n });\n }\n return windows;\n}\n\nfunction usageOutputLooksRelevant(text: string): boolean {\n const normalized = normalizeForLabelSearch(text);\n return normalized.includes(\"currentsession\")\n || normalized.includes(\"currentweek\")\n || normalized.includes(\"loadingusage\")\n || normalized.includes(\"failedtoloadusagedata\")\n || normalized.includes(\"tokenexpired\")\n || normalized.includes(\"authenticationerror\")\n || normalized.includes(\"ratelimited\");\n}\n\nfunction usageOutputLooksComplete(text: string): boolean {\n const normalized = normalizeForLabelSearch(text);\n if (\n normalized.includes(\"failedtoloadusagedata\")\n || normalized.includes(\"tokenexpired\")\n || normalized.includes(\"authenticationerror\")\n || normalized.includes(\"ratelimited\")\n ) {\n return true;\n }\n return normalized.includes(\"currentsession\")\n && (normalized.includes(\"currentweek\") || normalized.includes(\"extrausage\"))\n && /[0-9]{1,3}(?:\\.[0-9]+)?%/i.test(text);\n}\n\nfunction extractUsageError(text: string): string | null {\n const lower = text.toLowerCase();\n const compact = lower.replace(/\\s+/g, \"\");\n if (lower.includes(\"token_expired\") || lower.includes(\"token has expired\")) {\n return \"Claude CLI token expired. Run `claude login` to refresh.\";\n }\n if (lower.includes(\"authentication_error\")) {\n return \"Claude CLI authentication error. Run `claude login`.\";\n }\n if (lower.includes(\"rate_limit_error\") || lower.includes(\"rate limited\") || compact.includes(\"ratelimited\")) {\n return \"Claude CLI usage endpoint is rate limited right now. Please try again later.\";\n }\n if (lower.includes(\"failed to load usage data\") || compact.includes(\"failedtoloadusagedata\")) {\n return \"Claude CLI could not load usage data. Open the CLI and retry `/usage`.\";\n }\n return null;\n}\n\nfunction percentFromLine(line: string): number | null {\n const match = line.match(/([0-9]{1,3}(?:\\.[0-9]+)?)\\s*%/i);\n if (!match) return null;\n const rawValue = Number(match[1]);\n if (!Number.isFinite(rawValue)) return null;\n const clamped = Math.min(100, Math.max(0, rawValue));\n const lower = line.toLowerCase();\n if (lower.includes(\"remaining\") || lower.includes(\"left\") || lower.includes(\"available\")) {\n return Math.max(0, Math.min(100, Math.round(100 - clamped)));\n }\n return Math.round(clamped);\n}\n\nfunction isQuotaLabel(line: string): boolean {\n const normalized = normalizeForLabelSearch(line);\n return normalized === \"currentsession\"\n || normalized === \"currentweekallmodels\"\n || normalized === \"currentweeksonnetonly\"\n || normalized === \"currentweeksonnet\"\n || normalized === \"currentweekopusonly\"\n || normalized === \"currentweekopus\"\n || normalized === \"extrausage\";\n}\n\nfunction canonicalQuotaLabel(line: string): string {\n switch (normalizeForLabelSearch(line)) {\n case \"currentsession\":\n return \"Current session\";\n case \"currentweekallmodels\":\n return \"Current week (all models)\";\n case \"currentweeksonnetonly\":\n case \"currentweeksonnet\":\n return \"Current week (Sonnet only)\";\n case \"currentweekopusonly\":\n case \"currentweekopus\":\n return \"Current week (Opus only)\";\n case \"extrausage\":\n return \"Extra usage\";\n default:\n return line;\n }\n}\n\nfunction formatClaudeCliDetail(label: string, lines: string[]): string | null {\n const normalizedLabel = normalizeForLabelSearch(label);\n if (normalizedLabel === \"extrausage\") {\n const compact = lines.join(\" \").replace(/\\s+/g, \"\").toLowerCase();\n if (compact.includes(\"extrausagenotenabled\")) {\n return \"Extra usage not enabled \u2022 /extra-usage to enable\";\n }\n const firstLine = lines.find((line) => line.trim().length > 0) ?? null;\n return firstLine;\n }\n\n const resetLine = lines.find((line) => /^resets/i.test(line) || normalizeForLabelSearch(line).startsWith(\"resets\"));\n if (!resetLine) return null;\n return resetLine\n .replace(/^Resets/i, \"Resets \")\n .replace(/([A-Z][a-z]{2})(\\d)/g, \"$1 $2\")\n .replace(/(\\d)at(\\d)/g, \"$1 at $2\")\n .replace(/(am|pm)\\(/gi, \"$1 (\")\n .replace(/([A-Za-z])\\(/g, \"$1 (\")\n .replace(/\\s+/g, \" \")\n .trim();\n}\n\nexport function parseClaudeCliUsageText(text: string): QuotaWindow[] {\n const cleaned = trimToLatestUsagePanel(cleanTerminalText(text)) ?? cleanTerminalText(text);\n const usageError = extractUsageError(cleaned);\n if (usageError) throw new Error(usageError);\n\n const lines = cleaned\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n\n const sections: Array<{ label: string; lines: string[] }> = [];\n let current: { label: string; lines: string[] } | null = null;\n\n for (const line of lines) {\n if (isQuotaLabel(line)) {\n if (current) sections.push(current);\n current = { label: canonicalQuotaLabel(line), lines: [] };\n continue;\n }\n if (current) current.lines.push(line);\n }\n if (current) sections.push(current);\n\n const windows = sections.map<QuotaWindow>((section) => {\n const usedPercent = section.lines.map(percentFromLine).find((value) => value != null) ?? null;\n return {\n label: section.label,\n usedPercent,\n resetsAt: null,\n valueLabel: null,\n detail: formatClaudeCliDetail(section.label, section.lines),\n };\n });\n\n if (!windows.some((window) => normalizeForLabelSearch(window.label) === \"currentsession\")) {\n throw new Error(\"Could not parse Claude CLI usage output.\");\n }\n return windows;\n}\n\nfunction quoteForShell(value: string): string {\n return `'${value.replace(/'/g, `'\\\\''`)}'`;\n}\n\nfunction buildClaudeCliShellProbeCommand(): string {\n const feed = \"(sleep 2; printf '/usage\\\\r'; sleep 6; printf '\\\\033'; sleep 1; printf '\\\\003')\";\n const claudeCommand = \"claude --tools \\\"\\\"\";\n if (process.platform === \"darwin\") {\n return `${feed} | script -q /dev/null ${claudeCommand}`;\n }\n return `${feed} | script -q -e -f -c ${quoteForShell(claudeCommand)} /dev/null`;\n}\n\nexport async function captureClaudeCliUsageText(timeoutMs = 12_000): Promise<string> {\n const command = buildClaudeCliShellProbeCommand();\n try {\n const { stdout, stderr } = await execFileAsync(\"sh\", [\"-c\", command], {\n env: createClaudeQuotaEnv(),\n timeout: timeoutMs,\n maxBuffer: 8 * 1024 * 1024,\n });\n const output = `${stdout}${stderr}`;\n const cleaned = cleanTerminalText(output);\n if (usageOutputLooksComplete(cleaned)) return output;\n throw new Error(\"Claude CLI usage probe ended before rendering usage.\");\n } catch (error) {\n const stdout =\n typeof error === \"object\" && error !== null && \"stdout\" in error && typeof error.stdout === \"string\"\n ? error.stdout\n : \"\";\n const stderr =\n typeof error === \"object\" && error !== null && \"stderr\" in error && typeof error.stderr === \"string\"\n ? error.stderr\n : \"\";\n const output = `${stdout}${stderr}`;\n const cleaned = cleanTerminalText(output);\n if (usageOutputLooksComplete(cleaned)) return output;\n if (usageOutputLooksRelevant(cleaned)) {\n throw new Error(\"Claude CLI usage probe ended before rendering usage.\");\n }\n throw error instanceof Error ? error : new Error(String(error));\n }\n}\n\nexport async function fetchClaudeCliQuota(): Promise<QuotaWindow[]> {\n const rawText = await captureClaudeCliUsageText();\n return parseClaudeCliUsageText(rawText);\n}\n\nfunction formatProviderError(source: string, error: unknown): string {\n const message = error instanceof Error ? error.message : String(error);\n return `${source}: ${message}`;\n}\n\nexport async function getQuotaWindows(): Promise<ProviderQuotaResult> {\n const authStatus = await readClaudeAuthStatus();\n const authDescription = describeClaudeSubscriptionAuth(authStatus);\n const token = await readClaudeToken();\n\n const errors: string[] = [];\n\n if (token) {\n try {\n const windows = await fetchClaudeQuota(token);\n return { provider: \"anthropic\", source: CLAUDE_USAGE_SOURCE_OAUTH, ok: true, windows };\n } catch (error) {\n errors.push(formatProviderError(\"Anthropic OAuth usage\", error));\n }\n }\n\n try {\n const windows = await fetchClaudeCliQuota();\n return { provider: \"anthropic\", source: CLAUDE_USAGE_SOURCE_CLI, ok: true, windows };\n } catch (error) {\n errors.push(formatProviderError(\"Claude CLI /usage\", error));\n }\n\n if (hasNonEmptyProcessEnv(\"ANTHROPIC_API_KEY\") && !authDescription) {\n return {\n provider: \"anthropic\",\n ok: false,\n error:\n errors[0]\n ?? \"ANTHROPIC_API_KEY is set and no local Claude subscription session is available for quota polling\",\n windows: [],\n };\n }\n\n if (authDescription) {\n return {\n provider: \"anthropic\",\n ok: false,\n error:\n errors.length > 0\n ? `${authDescription}, but quota polling failed (${errors.join(\"; \")})`\n : `${authDescription}, but Paperclip could not load subscription quota data`,\n windows: [],\n };\n }\n\n return {\n provider: \"anthropic\",\n ok: false,\n error: errors[0] ?? \"no local claude auth token\",\n windows: [],\n };\n}\n", "import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { inferOpenAiCompatibleBiller, type AdapterExecutionContext, type AdapterExecutionResult } from \"@paperclipai/adapter-utils\";\nimport {\n asString,\n asNumber,\n asBoolean,\n asStringArray,\n parseObject,\n buildPaperclipEnv,\n buildInvocationEnvForLogs,\n ensureAbsoluteDirectory,\n ensureCommandResolvable,\n ensurePaperclipSkillSymlink,\n ensurePathInEnv,\n readPaperclipRuntimeSkillEntries,\n resolveCommandForLogs,\n resolvePaperclipDesiredSkillNames,\n renderTemplate,\n joinPromptSections,\n runChildProcess,\n} from \"@paperclipai/adapter-utils/server-utils\";\nimport { parseCodexJsonl, isCodexUnknownSessionError } from \"./parse.js\";\nimport { pathExists, prepareManagedCodexHome, resolveManagedCodexHomeDir, resolveSharedCodexHomeDir } from \"./codex-home.js\";\nimport { resolveCodexDesiredSkillNames } from \"./skills.js\";\n\nconst __moduleDir = path.dirname(fileURLToPath(import.meta.url));\nconst CODEX_ROLLOUT_NOISE_RE =\n /^\\d{4}-\\d{2}-\\d{2}T[^\\s]+\\s+ERROR\\s+codex_core::rollout::list:\\s+state db missing rollout path for thread\\s+[a-z0-9-]+$/i;\n\nfunction stripCodexRolloutNoise(text: string): string {\n const parts = text.split(/\\r?\\n/);\n const kept: string[] = [];\n for (const part of parts) {\n const trimmed = part.trim();\n if (!trimmed) {\n kept.push(part);\n continue;\n }\n if (CODEX_ROLLOUT_NOISE_RE.test(trimmed)) continue;\n kept.push(part);\n }\n return kept.join(\"\\n\");\n}\n\nfunction firstNonEmptyLine(text: string): string {\n return (\n text\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .find(Boolean) ?? \"\"\n );\n}\n\nfunction hasNonEmptyEnvValue(env: Record<string, string>, key: string): boolean {\n const raw = env[key];\n return typeof raw === \"string\" && raw.trim().length > 0;\n}\n\nfunction resolveCodexBillingType(env: Record<string, string>): \"api\" | \"subscription\" {\n // Codex uses API-key auth when OPENAI_API_KEY is present; otherwise rely on local login/session auth.\n return hasNonEmptyEnvValue(env, \"OPENAI_API_KEY\") ? \"api\" : \"subscription\";\n}\n\nfunction resolveCodexBiller(env: Record<string, string>, billingType: \"api\" | \"subscription\"): string {\n const openAiCompatibleBiller = inferOpenAiCompatibleBiller(env, \"openai\");\n if (openAiCompatibleBiller === \"openrouter\") return \"openrouter\";\n return billingType === \"subscription\" ? \"chatgpt\" : openAiCompatibleBiller ?? \"openai\";\n}\n\nasync function isLikelyPaperclipRepoRoot(candidate: string): Promise<boolean> {\n const [hasWorkspace, hasPackageJson, hasServerDir, hasAdapterUtilsDir] = await Promise.all([\n pathExists(path.join(candidate, \"pnpm-workspace.yaml\")),\n pathExists(path.join(candidate, \"package.json\")),\n pathExists(path.join(candidate, \"server\")),\n pathExists(path.join(candidate, \"packages\", \"adapter-utils\")),\n ]);\n\n return hasWorkspace && hasPackageJson && hasServerDir && hasAdapterUtilsDir;\n}\n\nasync function isLikelyPaperclipRuntimeSkillPath(\n candidate: string,\n skillName: string,\n options: { requireSkillMarkdown?: boolean } = {},\n): Promise<boolean> {\n if (path.basename(candidate) !== skillName) return false;\n const skillsRoot = path.dirname(candidate);\n if (path.basename(skillsRoot) !== \"skills\") return false;\n if (options.requireSkillMarkdown !== false && !(await pathExists(path.join(candidate, \"SKILL.md\")))) {\n return false;\n }\n\n let cursor = path.dirname(skillsRoot);\n for (let depth = 0; depth < 6; depth += 1) {\n if (await isLikelyPaperclipRepoRoot(cursor)) return true;\n const parent = path.dirname(cursor);\n if (parent === cursor) break;\n cursor = parent;\n }\n\n return false;\n}\n\nasync function pruneBrokenUnavailablePaperclipSkillSymlinks(\n skillsHome: string,\n allowedSkillNames: Iterable<string>,\n onLog: AdapterExecutionContext[\"onLog\"],\n) {\n const allowed = new Set(Array.from(allowedSkillNames));\n const entries = await fs.readdir(skillsHome, { withFileTypes: true }).catch(() => []);\n\n for (const entry of entries) {\n if (allowed.has(entry.name) || !entry.isSymbolicLink()) continue;\n\n const target = path.join(skillsHome, entry.name);\n const linkedPath = await fs.readlink(target).catch(() => null);\n if (!linkedPath) continue;\n\n const resolvedLinkedPath = path.resolve(path.dirname(target), linkedPath);\n if (await pathExists(resolvedLinkedPath)) continue;\n if (\n !(await isLikelyPaperclipRuntimeSkillPath(resolvedLinkedPath, entry.name, {\n requireSkillMarkdown: false,\n }))\n ) {\n continue;\n }\n\n await fs.unlink(target).catch(() => {});\n await onLog(\n \"stdout\",\n `[paperclip] Removed stale Codex skill \"${entry.name}\" from ${skillsHome}\\n`,\n );\n }\n}\n\nfunction resolveCodexSkillsDir(codexHome: string): string {\n return path.join(codexHome, \"skills\");\n}\n\ntype EnsureCodexSkillsInjectedOptions = {\n skillsHome?: string;\n skillsEntries?: Array<{ key: string; runtimeName: string; source: string }>;\n desiredSkillNames?: string[];\n linkSkill?: (source: string, target: string) => Promise<void>;\n};\n\nexport async function ensureCodexSkillsInjected(\n onLog: AdapterExecutionContext[\"onLog\"],\n options: EnsureCodexSkillsInjectedOptions = {},\n) {\n const allSkillsEntries = options.skillsEntries ?? await readPaperclipRuntimeSkillEntries({}, __moduleDir);\n const desiredSkillNames =\n options.desiredSkillNames ?? allSkillsEntries.map((entry) => entry.key);\n const desiredSet = new Set(desiredSkillNames);\n const skillsEntries = allSkillsEntries.filter((entry) => desiredSet.has(entry.key));\n if (skillsEntries.length === 0) return;\n\n const skillsHome = options.skillsHome ?? resolveCodexSkillsDir(resolveSharedCodexHomeDir());\n await fs.mkdir(skillsHome, { recursive: true });\n const linkSkill = options.linkSkill;\n for (const entry of skillsEntries) {\n const target = path.join(skillsHome, entry.runtimeName);\n\n try {\n const existing = await fs.lstat(target).catch(() => null);\n if (existing?.isSymbolicLink()) {\n const linkedPath = await fs.readlink(target).catch(() => null);\n const resolvedLinkedPath = linkedPath\n ? path.resolve(path.dirname(target), linkedPath)\n : null;\n if (\n resolvedLinkedPath &&\n resolvedLinkedPath !== entry.source &&\n (await isLikelyPaperclipRuntimeSkillPath(resolvedLinkedPath, entry.runtimeName))\n ) {\n await fs.unlink(target);\n if (linkSkill) {\n await linkSkill(entry.source, target);\n } else {\n await fs.symlink(entry.source, target);\n }\n await onLog(\n \"stdout\",\n `[paperclip] Repaired Codex skill \"${entry.runtimeName}\" into ${skillsHome}\\n`,\n );\n continue;\n }\n }\n\n const result = await ensurePaperclipSkillSymlink(entry.source, target, linkSkill);\n if (result === \"skipped\") continue;\n\n await onLog(\n \"stdout\",\n `[paperclip] ${result === \"repaired\" ? \"Repaired\" : \"Injected\"} Codex skill \"${entry.runtimeName}\" into ${skillsHome}\\n`,\n );\n } catch (err) {\n await onLog(\n \"stderr\",\n `[paperclip] Failed to inject Codex skill \"${entry.key}\" into ${skillsHome}: ${err instanceof Error ? err.message : String(err)}\\n`,\n );\n }\n }\n\n await pruneBrokenUnavailablePaperclipSkillSymlinks(\n skillsHome,\n skillsEntries.map((entry) => entry.runtimeName),\n onLog,\n );\n}\n\nexport async function execute(ctx: AdapterExecutionContext): Promise<AdapterExecutionResult> {\n const { runId, agent, runtime, config, context, onLog, onMeta, onSpawn, authToken } = ctx;\n\n const promptTemplate = asString(\n config.promptTemplate,\n \"You are agent {{agent.id}} ({{agent.name}}). Continue your Paperclip work.\",\n );\n const command = asString(config.command, \"codex\");\n const model = asString(config.model, \"\");\n const modelReasoningEffort = asString(\n config.modelReasoningEffort,\n asString(config.reasoningEffort, \"\"),\n );\n const search = asBoolean(config.search, false);\n const bypass = asBoolean(\n config.dangerouslyBypassApprovalsAndSandbox,\n asBoolean(config.dangerouslyBypassSandbox, false),\n );\n\n const workspaceContext = parseObject(context.paperclipWorkspace);\n const workspaceCwd = asString(workspaceContext.cwd, \"\");\n const workspaceSource = asString(workspaceContext.source, \"\");\n const workspaceStrategy = asString(workspaceContext.strategy, \"\");\n const workspaceId = asString(workspaceContext.workspaceId, \"\");\n const workspaceRepoUrl = asString(workspaceContext.repoUrl, \"\");\n const workspaceRepoRef = asString(workspaceContext.repoRef, \"\");\n const workspaceBranch = asString(workspaceContext.branchName, \"\");\n const workspaceWorktreePath = asString(workspaceContext.worktreePath, \"\");\n const agentHome = asString(workspaceContext.agentHome, \"\");\n const workspaceHints = Array.isArray(context.paperclipWorkspaces)\n ? context.paperclipWorkspaces.filter(\n (value): value is Record<string, unknown> => typeof value === \"object\" && value !== null,\n )\n : [];\n const runtimeServiceIntents = Array.isArray(context.paperclipRuntimeServiceIntents)\n ? context.paperclipRuntimeServiceIntents.filter(\n (value): value is Record<string, unknown> => typeof value === \"object\" && value !== null,\n )\n : [];\n const runtimeServices = Array.isArray(context.paperclipRuntimeServices)\n ? context.paperclipRuntimeServices.filter(\n (value): value is Record<string, unknown> => typeof value === \"object\" && value !== null,\n )\n : [];\n const runtimePrimaryUrl = asString(context.paperclipRuntimePrimaryUrl, \"\");\n const configuredCwd = asString(config.cwd, \"\");\n const useConfiguredInsteadOfAgentHome = workspaceSource === \"agent_home\" && configuredCwd.length > 0;\n const effectiveWorkspaceCwd = useConfiguredInsteadOfAgentHome ? \"\" : workspaceCwd;\n const cwd = effectiveWorkspaceCwd || configuredCwd || process.cwd();\n const envConfig = parseObject(config.env);\n const configuredCodexHome =\n typeof envConfig.CODEX_HOME === \"string\" && envConfig.CODEX_HOME.trim().length > 0\n ? path.resolve(envConfig.CODEX_HOME.trim())\n : null;\n const codexSkillEntries = await readPaperclipRuntimeSkillEntries(config, __moduleDir);\n const desiredSkillNames = resolveCodexDesiredSkillNames(config, codexSkillEntries);\n await ensureAbsoluteDirectory(cwd, { createIfMissing: true });\n const preparedManagedCodexHome =\n configuredCodexHome ? null : await prepareManagedCodexHome(process.env, onLog, agent.companyId);\n const defaultCodexHome = resolveManagedCodexHomeDir(process.env, agent.companyId);\n const effectiveCodexHome = configuredCodexHome ?? preparedManagedCodexHome ?? defaultCodexHome;\n await fs.mkdir(effectiveCodexHome, { recursive: true });\n // Inject skills into the same CODEX_HOME that Codex will actually run with\n // (managed home in the default case, or an explicit override from adapter config).\n const codexSkillsDir = resolveCodexSkillsDir(effectiveCodexHome);\n await ensureCodexSkillsInjected(\n onLog,\n {\n skillsHome: codexSkillsDir,\n skillsEntries: codexSkillEntries,\n desiredSkillNames,\n },\n );\n const hasExplicitApiKey =\n typeof envConfig.PAPERCLIP_API_KEY === \"string\" && envConfig.PAPERCLIP_API_KEY.trim().length > 0;\n const env: Record<string, string> = { ...buildPaperclipEnv(agent) };\n env.CODEX_HOME = effectiveCodexHome;\n env.PAPERCLIP_RUN_ID = runId;\n const wakeTaskId =\n (typeof context.taskId === \"string\" && context.taskId.trim().length > 0 && context.taskId.trim()) ||\n (typeof context.issueId === \"string\" && context.issueId.trim().length > 0 && context.issueId.trim()) ||\n null;\n const wakeReason =\n typeof context.wakeReason === \"string\" && context.wakeReason.trim().length > 0\n ? context.wakeReason.trim()\n : null;\n const wakeCommentId =\n (typeof context.wakeCommentId === \"string\" && context.wakeCommentId.trim().length > 0 && context.wakeCommentId.trim()) ||\n (typeof context.commentId === \"string\" && context.commentId.trim().length > 0 && context.commentId.trim()) ||\n null;\n const approvalId =\n typeof context.approvalId === \"string\" && context.approvalId.trim().length > 0\n ? context.approvalId.trim()\n : null;\n const approvalStatus =\n typeof context.approvalStatus === \"string\" && context.approvalStatus.trim().length > 0\n ? context.approvalStatus.trim()\n : null;\n const linkedIssueIds = Array.isArray(context.issueIds)\n ? context.issueIds.filter((value): value is string => typeof value === \"string\" && value.trim().length > 0)\n : [];\n if (wakeTaskId) {\n env.PAPERCLIP_TASK_ID = wakeTaskId;\n }\n if (wakeReason) {\n env.PAPERCLIP_WAKE_REASON = wakeReason;\n }\n if (wakeCommentId) {\n env.PAPERCLIP_WAKE_COMMENT_ID = wakeCommentId;\n }\n if (approvalId) {\n env.PAPERCLIP_APPROVAL_ID = approvalId;\n }\n if (approvalStatus) {\n env.PAPERCLIP_APPROVAL_STATUS = approvalStatus;\n }\n if (linkedIssueIds.length > 0) {\n env.PAPERCLIP_LINKED_ISSUE_IDS = linkedIssueIds.join(\",\");\n }\n if (effectiveWorkspaceCwd) {\n env.PAPERCLIP_WORKSPACE_CWD = effectiveWorkspaceCwd;\n }\n if (workspaceSource) {\n env.PAPERCLIP_WORKSPACE_SOURCE = workspaceSource;\n }\n if (workspaceStrategy) {\n env.PAPERCLIP_WORKSPACE_STRATEGY = workspaceStrategy;\n }\n if (workspaceId) {\n env.PAPERCLIP_WORKSPACE_ID = workspaceId;\n }\n if (workspaceRepoUrl) {\n env.PAPERCLIP_WORKSPACE_REPO_URL = workspaceRepoUrl;\n }\n if (workspaceRepoRef) {\n env.PAPERCLIP_WORKSPACE_REPO_REF = workspaceRepoRef;\n }\n if (workspaceBranch) {\n env.PAPERCLIP_WORKSPACE_BRANCH = workspaceBranch;\n }\n if (workspaceWorktreePath) {\n env.PAPERCLIP_WORKSPACE_WORKTREE_PATH = workspaceWorktreePath;\n }\n if (agentHome) {\n env.AGENT_HOME = agentHome;\n }\n if (workspaceHints.length > 0) {\n env.PAPERCLIP_WORKSPACES_JSON = JSON.stringify(workspaceHints);\n }\n if (runtimeServiceIntents.length > 0) {\n env.PAPERCLIP_RUNTIME_SERVICE_INTENTS_JSON = JSON.stringify(runtimeServiceIntents);\n }\n if (runtimeServices.length > 0) {\n env.PAPERCLIP_RUNTIME_SERVICES_JSON = JSON.stringify(runtimeServices);\n }\n if (runtimePrimaryUrl) {\n env.PAPERCLIP_RUNTIME_PRIMARY_URL = runtimePrimaryUrl;\n }\n for (const [k, v] of Object.entries(envConfig)) {\n if (typeof v === \"string\") env[k] = v;\n }\n if (!hasExplicitApiKey && authToken) {\n env.PAPERCLIP_API_KEY = authToken;\n }\n const effectiveEnv = Object.fromEntries(\n Object.entries({ ...process.env, ...env }).filter(\n (entry): entry is [string, string] => typeof entry[1] === \"string\",\n ),\n );\n const billingType = resolveCodexBillingType(effectiveEnv);\n const runtimeEnv = ensurePathInEnv(effectiveEnv);\n await ensureCommandResolvable(command, cwd, runtimeEnv);\n const resolvedCommand = await resolveCommandForLogs(command, cwd, runtimeEnv);\n const loggedEnv = buildInvocationEnvForLogs(env, {\n runtimeEnv,\n includeRuntimeKeys: [\"HOME\"],\n resolvedCommand,\n });\n\n const timeoutSec = asNumber(config.timeoutSec, 0);\n const graceSec = asNumber(config.graceSec, 20);\n const extraArgs = (() => {\n const fromExtraArgs = asStringArray(config.extraArgs);\n if (fromExtraArgs.length > 0) return fromExtraArgs;\n return asStringArray(config.args);\n })();\n\n const runtimeSessionParams = parseObject(runtime.sessionParams);\n const runtimeSessionId = asString(runtimeSessionParams.sessionId, runtime.sessionId ?? \"\");\n const runtimeSessionCwd = asString(runtimeSessionParams.cwd, \"\");\n const canResumeSession =\n runtimeSessionId.length > 0 &&\n (runtimeSessionCwd.length === 0 || path.resolve(runtimeSessionCwd) === path.resolve(cwd));\n const sessionId = canResumeSession ? runtimeSessionId : null;\n if (runtimeSessionId && !canResumeSession) {\n await onLog(\n \"stdout\",\n `[paperclip] Codex session \"${runtimeSessionId}\" was saved for cwd \"${runtimeSessionCwd}\" and will not be resumed in \"${cwd}\".\\n`,\n );\n }\n const instructionsFilePath = asString(config.instructionsFilePath, \"\").trim();\n const instructionsDir = instructionsFilePath ? `${path.dirname(instructionsFilePath)}/` : \"\";\n let instructionsPrefix = \"\";\n let instructionsChars = 0;\n if (instructionsFilePath) {\n try {\n const instructionsContents = await fs.readFile(instructionsFilePath, \"utf8\");\n instructionsPrefix =\n `${instructionsContents}\\n\\n` +\n `The above agent instructions were loaded from ${instructionsFilePath}. ` +\n `Resolve any relative file references from ${instructionsDir}.\\n\\n`;\n instructionsChars = instructionsPrefix.length;\n } catch (err) {\n const reason = err instanceof Error ? err.message : String(err);\n await onLog(\n \"stdout\",\n `[paperclip] Warning: could not read agent instructions file \"${instructionsFilePath}\": ${reason}\\n`,\n );\n }\n }\n const repoAgentsNote =\n \"Codex exec automatically applies repo-scoped AGENTS.md instructions from the current workspace; Paperclip does not currently suppress that discovery.\";\n const commandNotes = (() => {\n if (!instructionsFilePath) {\n return [repoAgentsNote];\n }\n if (instructionsPrefix.length > 0) {\n return [\n `Loaded agent instructions from ${instructionsFilePath}`,\n `Prepended instructions + path directive to stdin prompt (relative references from ${instructionsDir}).`,\n repoAgentsNote,\n ];\n }\n return [\n `Configured instructionsFilePath ${instructionsFilePath}, but file could not be read; continuing without injected instructions.`,\n repoAgentsNote,\n ];\n })();\n const bootstrapPromptTemplate = asString(config.bootstrapPromptTemplate, \"\");\n const templateData = {\n agentId: agent.id,\n companyId: agent.companyId,\n runId,\n company: { id: agent.companyId },\n agent,\n run: { id: runId, source: \"on_demand\" },\n context,\n };\n const renderedPrompt = renderTemplate(promptTemplate, templateData);\n const renderedBootstrapPrompt =\n !sessionId && bootstrapPromptTemplate.trim().length > 0\n ? renderTemplate(bootstrapPromptTemplate, templateData).trim()\n : \"\";\n const sessionHandoffNote = asString(context.paperclipSessionHandoffMarkdown, \"\").trim();\n const prompt = joinPromptSections([\n instructionsPrefix,\n renderedBootstrapPrompt,\n sessionHandoffNote,\n renderedPrompt,\n ]);\n const promptMetrics = {\n promptChars: prompt.length,\n instructionsChars,\n bootstrapPromptChars: renderedBootstrapPrompt.length,\n sessionHandoffChars: sessionHandoffNote.length,\n heartbeatPromptChars: renderedPrompt.length,\n };\n\n const buildArgs = (resumeSessionId: string | null) => {\n const args = [\"exec\", \"--json\"];\n if (search) args.unshift(\"--search\");\n if (bypass) args.push(\"--dangerously-bypass-approvals-and-sandbox\");\n if (model) args.push(\"--model\", model);\n if (modelReasoningEffort) args.push(\"-c\", `model_reasoning_effort=${JSON.stringify(modelReasoningEffort)}`);\n if (extraArgs.length > 0) args.push(...extraArgs);\n if (resumeSessionId) args.push(\"resume\", resumeSessionId, \"-\");\n else args.push(\"-\");\n return args;\n };\n\n const runAttempt = async (resumeSessionId: string | null) => {\n const args = buildArgs(resumeSessionId);\n if (onMeta) {\n await onMeta({\n adapterType: \"codex_local\",\n command: resolvedCommand,\n cwd,\n commandNotes,\n commandArgs: args.map((value, idx) => {\n if (idx === args.length - 1 && value !== \"-\") return `<prompt ${prompt.length} chars>`;\n return value;\n }),\n env: loggedEnv,\n prompt,\n promptMetrics,\n context,\n });\n }\n\n const proc = await runChildProcess(runId, command, args, {\n cwd,\n env,\n stdin: prompt,\n timeoutSec,\n graceSec,\n onSpawn,\n onLog: async (stream, chunk) => {\n if (stream !== \"stderr\") {\n await onLog(stream, chunk);\n return;\n }\n const cleaned = stripCodexRolloutNoise(chunk);\n if (!cleaned.trim()) return;\n await onLog(stream, cleaned);\n },\n });\n const cleanedStderr = stripCodexRolloutNoise(proc.stderr);\n return {\n proc: {\n ...proc,\n stderr: cleanedStderr,\n },\n rawStderr: proc.stderr,\n parsed: parseCodexJsonl(proc.stdout),\n };\n };\n\n const toResult = (\n attempt: { proc: { exitCode: number | null; signal: string | null; timedOut: boolean; stdout: string; stderr: string }; rawStderr: string; parsed: ReturnType<typeof parseCodexJsonl> },\n clearSessionOnMissingSession = false,\n ): AdapterExecutionResult => {\n if (attempt.proc.timedOut) {\n return {\n exitCode: attempt.proc.exitCode,\n signal: attempt.proc.signal,\n timedOut: true,\n errorMessage: `Timed out after ${timeoutSec}s`,\n clearSession: clearSessionOnMissingSession,\n };\n }\n\n const resolvedSessionId = attempt.parsed.sessionId ?? runtimeSessionId ?? runtime.sessionId ?? null;\n const resolvedSessionParams = resolvedSessionId\n ? ({\n sessionId: resolvedSessionId,\n cwd,\n ...(workspaceId ? { workspaceId } : {}),\n ...(workspaceRepoUrl ? { repoUrl: workspaceRepoUrl } : {}),\n ...(workspaceRepoRef ? { repoRef: workspaceRepoRef } : {}),\n } as Record<string, unknown>)\n : null;\n const parsedError = typeof attempt.parsed.errorMessage === \"string\" ? attempt.parsed.errorMessage.trim() : \"\";\n const stderrLine = firstNonEmptyLine(attempt.proc.stderr);\n const fallbackErrorMessage =\n parsedError ||\n stderrLine ||\n `Codex exited with code ${attempt.proc.exitCode ?? -1}`;\n\n return {\n exitCode: attempt.proc.exitCode,\n signal: attempt.proc.signal,\n timedOut: false,\n errorMessage:\n (attempt.proc.exitCode ?? 0) === 0\n ? null\n : fallbackErrorMessage,\n usage: attempt.parsed.usage,\n sessionId: resolvedSessionId,\n sessionParams: resolvedSessionParams,\n sessionDisplayId: resolvedSessionId,\n provider: \"openai\",\n biller: resolveCodexBiller(effectiveEnv, billingType),\n model,\n billingType,\n costUsd: null,\n resultJson: {\n stdout: attempt.proc.stdout,\n stderr: attempt.proc.stderr,\n },\n summary: attempt.parsed.summary,\n clearSession: Boolean(clearSessionOnMissingSession && !resolvedSessionId),\n };\n };\n\n const initial = await runAttempt(sessionId);\n if (\n sessionId &&\n !initial.proc.timedOut &&\n (initial.proc.exitCode ?? 0) !== 0 &&\n isCodexUnknownSessionError(initial.proc.stdout, initial.rawStderr)\n ) {\n await onLog(\n \"stdout\",\n `[paperclip] Codex resume session \"${sessionId}\" is unavailable; retrying with a fresh session.\\n`,\n );\n const retry = await runAttempt(null);\n return toResult(retry, true);\n }\n\n return toResult(initial);\n}\n", "function readEnv(env: NodeJS.ProcessEnv, key: string): string | null {\n const value = env[key];\n return typeof value === \"string\" && value.trim().length > 0 ? value.trim() : null;\n}\n\nexport function inferOpenAiCompatibleBiller(\n env: NodeJS.ProcessEnv,\n fallback: string | null = \"openai\",\n): string | null {\n const explicitOpenRouterKey = readEnv(env, \"OPENROUTER_API_KEY\");\n if (explicitOpenRouterKey) return \"openrouter\";\n\n const baseUrl =\n readEnv(env, \"OPENAI_BASE_URL\") ??\n readEnv(env, \"OPENAI_API_BASE\") ??\n readEnv(env, \"OPENAI_API_BASE_URL\");\n if (baseUrl && /openrouter\\.ai/i.test(baseUrl)) return \"openrouter\";\n\n return fallback;\n}\n", "import { asString, asNumber, parseObject, parseJson } from \"@paperclipai/adapter-utils/server-utils\";\n\nexport function parseCodexJsonl(stdout: string) {\n let sessionId: string | null = null;\n const messages: string[] = [];\n let errorMessage: string | null = null;\n const usage = {\n inputTokens: 0,\n cachedInputTokens: 0,\n outputTokens: 0,\n };\n\n for (const rawLine of stdout.split(/\\r?\\n/)) {\n const line = rawLine.trim();\n if (!line) continue;\n\n const event = parseJson(line);\n if (!event) continue;\n\n const type = asString(event.type, \"\");\n if (type === \"thread.started\") {\n sessionId = asString(event.thread_id, sessionId ?? \"\") || sessionId;\n continue;\n }\n\n if (type === \"error\") {\n const msg = asString(event.message, \"\").trim();\n if (msg) errorMessage = msg;\n continue;\n }\n\n if (type === \"item.completed\") {\n const item = parseObject(event.item);\n if (asString(item.type, \"\") === \"agent_message\") {\n const text = asString(item.text, \"\");\n if (text) messages.push(text);\n }\n continue;\n }\n\n if (type === \"turn.completed\") {\n const usageObj = parseObject(event.usage);\n usage.inputTokens = asNumber(usageObj.input_tokens, usage.inputTokens);\n usage.cachedInputTokens = asNumber(usageObj.cached_input_tokens, usage.cachedInputTokens);\n usage.outputTokens = asNumber(usageObj.output_tokens, usage.outputTokens);\n continue;\n }\n\n if (type === \"turn.failed\") {\n const err = parseObject(event.error);\n const msg = asString(err.message, \"\").trim();\n if (msg) errorMessage = msg;\n }\n }\n\n return {\n sessionId,\n summary: messages.join(\"\\n\\n\").trim(),\n usage,\n errorMessage,\n };\n}\n\nexport function isCodexUnknownSessionError(stdout: string, stderr: string): boolean {\n const haystack = `${stdout}\\n${stderr}`\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean)\n .join(\"\\n\");\n return /unknown (session|thread)|session .* not found|thread .* not found|conversation .* not found|missing rollout path for thread|state db missing rollout path/i.test(\n haystack,\n );\n}\n", "import fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport type { AdapterExecutionContext } from \"@paperclipai/adapter-utils\";\n\nconst TRUTHY_ENV_RE = /^(1|true|yes|on)$/i;\nconst COPIED_SHARED_FILES = [\"config.json\", \"config.toml\", \"instructions.md\"] as const;\nconst SYMLINKED_SHARED_FILES = [\"auth.json\"] as const;\nconst DEFAULT_PAPERCLIP_INSTANCE_ID = \"default\";\n\nfunction nonEmpty(value: string | undefined): string | null {\n return typeof value === \"string\" && value.trim().length > 0 ? value.trim() : null;\n}\n\nexport async function pathExists(candidate: string): Promise<boolean> {\n return fs.access(candidate).then(() => true).catch(() => false);\n}\n\nexport function resolveSharedCodexHomeDir(\n env: NodeJS.ProcessEnv = process.env,\n): string {\n const fromEnv = nonEmpty(env.CODEX_HOME);\n return fromEnv ? path.resolve(fromEnv) : path.join(os.homedir(), \".codex\");\n}\n\nfunction isWorktreeMode(env: NodeJS.ProcessEnv): boolean {\n return TRUTHY_ENV_RE.test(env.PAPERCLIP_IN_WORKTREE ?? \"\");\n}\n\nexport function resolveManagedCodexHomeDir(\n env: NodeJS.ProcessEnv,\n companyId?: string,\n): string {\n const paperclipHome = nonEmpty(env.PAPERCLIP_HOME) ?? path.resolve(os.homedir(), \".paperclip\");\n const instanceId = nonEmpty(env.PAPERCLIP_INSTANCE_ID) ?? DEFAULT_PAPERCLIP_INSTANCE_ID;\n return companyId\n ? path.resolve(paperclipHome, \"instances\", instanceId, \"companies\", companyId, \"codex-home\")\n : path.resolve(paperclipHome, \"instances\", instanceId, \"codex-home\");\n}\n\nasync function ensureParentDir(target: string): Promise<void> {\n await fs.mkdir(path.dirname(target), { recursive: true });\n}\n\nasync function ensureSymlink(target: string, source: string): Promise<void> {\n const existing = await fs.lstat(target).catch(() => null);\n if (!existing) {\n await ensureParentDir(target);\n await fs.symlink(source, target);\n return;\n }\n\n if (!existing.isSymbolicLink()) {\n return;\n }\n\n const linkedPath = await fs.readlink(target).catch(() => null);\n if (!linkedPath) return;\n\n const resolvedLinkedPath = path.resolve(path.dirname(target), linkedPath);\n if (resolvedLinkedPath === source) return;\n\n await fs.unlink(target);\n await fs.symlink(source, target);\n}\n\nasync function ensureCopiedFile(target: string, source: string): Promise<void> {\n const existing = await fs.lstat(target).catch(() => null);\n if (existing) return;\n await ensureParentDir(target);\n await fs.copyFile(source, target);\n}\n\nexport async function prepareManagedCodexHome(\n env: NodeJS.ProcessEnv,\n onLog: AdapterExecutionContext[\"onLog\"],\n companyId?: string,\n): Promise<string> {\n const targetHome = resolveManagedCodexHomeDir(env, companyId);\n\n const sourceHome = resolveSharedCodexHomeDir(env);\n if (path.resolve(sourceHome) === path.resolve(targetHome)) return targetHome;\n\n await fs.mkdir(targetHome, { recursive: true });\n\n for (const name of SYMLINKED_SHARED_FILES) {\n const source = path.join(sourceHome, name);\n if (!(await pathExists(source))) continue;\n await ensureSymlink(path.join(targetHome, name), source);\n }\n\n for (const name of COPIED_SHARED_FILES) {\n const source = path.join(sourceHome, name);\n if (!(await pathExists(source))) continue;\n await ensureCopiedFile(path.join(targetHome, name), source);\n }\n\n await onLog(\n \"stdout\",\n `[paperclip] Using ${isWorktreeMode(env) ? \"worktree-isolated\" : \"Paperclip-managed\"} Codex home \"${targetHome}\" (seeded from \"${sourceHome}\").\\n`,\n );\n return targetHome;\n}\n", "import path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type {\n AdapterSkillContext,\n AdapterSkillEntry,\n AdapterSkillSnapshot,\n} from \"@paperclipai/adapter-utils\";\nimport {\n readPaperclipRuntimeSkillEntries,\n resolvePaperclipDesiredSkillNames,\n} from \"@paperclipai/adapter-utils/server-utils\";\n\nconst __moduleDir = path.dirname(fileURLToPath(import.meta.url));\n\nasync function buildCodexSkillSnapshot(\n config: Record<string, unknown>,\n): Promise<AdapterSkillSnapshot> {\n const availableEntries = await readPaperclipRuntimeSkillEntries(config, __moduleDir);\n const availableByKey = new Map(availableEntries.map((entry) => [entry.key, entry]));\n const desiredSkills = resolvePaperclipDesiredSkillNames(config, availableEntries);\n const desiredSet = new Set(desiredSkills);\n const entries: AdapterSkillEntry[] = availableEntries.map((entry) => ({\n key: entry.key,\n runtimeName: entry.runtimeName,\n desired: desiredSet.has(entry.key),\n managed: true,\n state: desiredSet.has(entry.key) ? \"configured\" : \"available\",\n origin: entry.required ? \"paperclip_required\" : \"company_managed\",\n originLabel: entry.required ? \"Required by Paperclip\" : \"Managed by Paperclip\",\n readOnly: false,\n sourcePath: entry.source,\n targetPath: null,\n detail: desiredSet.has(entry.key)\n ? \"Will be linked into the effective CODEX_HOME/skills/ directory on the next run.\"\n : null,\n required: Boolean(entry.required),\n requiredReason: entry.requiredReason ?? null,\n }));\n const warnings: string[] = [];\n\n for (const desiredSkill of desiredSkills) {\n if (availableByKey.has(desiredSkill)) continue;\n warnings.push(`Desired skill \"${desiredSkill}\" is not available from the Paperclip skills directory.`);\n entries.push({\n key: desiredSkill,\n runtimeName: null,\n desired: true,\n managed: true,\n state: \"missing\",\n origin: \"external_unknown\",\n originLabel: \"External or unavailable\",\n readOnly: false,\n sourcePath: null,\n targetPath: null,\n detail: \"Paperclip cannot find this skill in the local runtime skills directory.\",\n });\n }\n\n entries.sort((left, right) => left.key.localeCompare(right.key));\n\n return {\n adapterType: \"codex_local\",\n supported: true,\n mode: \"ephemeral\",\n desiredSkills,\n entries,\n warnings,\n };\n}\n\nexport async function listCodexSkills(ctx: AdapterSkillContext): Promise<AdapterSkillSnapshot> {\n return buildCodexSkillSnapshot(ctx.config);\n}\n\nexport async function syncCodexSkills(\n ctx: AdapterSkillContext,\n _desiredSkills: string[],\n): Promise<AdapterSkillSnapshot> {\n return buildCodexSkillSnapshot(ctx.config);\n}\n\nexport function resolveCodexDesiredSkillNames(\n config: Record<string, unknown>,\n availableEntries: Array<{ key: string; required?: boolean }>,\n) {\n return resolvePaperclipDesiredSkillNames(config, availableEntries);\n}\n", "import fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { inferOpenAiCompatibleBiller, type AdapterExecutionContext, type AdapterExecutionResult } from \"@paperclipai/adapter-utils\";\nimport {\n asString,\n asNumber,\n asStringArray,\n parseObject,\n buildPaperclipEnv,\n buildInvocationEnvForLogs,\n ensureAbsoluteDirectory,\n ensureCommandResolvable,\n ensurePaperclipSkillSymlink,\n ensurePathInEnv,\n readPaperclipRuntimeSkillEntries,\n resolveCommandForLogs,\n resolvePaperclipDesiredSkillNames,\n removeMaintainerOnlySkillSymlinks,\n renderTemplate,\n joinPromptSections,\n runChildProcess,\n} from \"@paperclipai/adapter-utils/server-utils\";\nimport { DEFAULT_CURSOR_LOCAL_MODEL } from \"../index.js\";\nimport { parseCursorJsonl, isCursorUnknownSessionError } from \"./parse.js\";\nimport { normalizeCursorStreamLine } from \"../shared/stream.js\";\nimport { hasCursorTrustBypassArg } from \"../shared/trust.js\";\n\nconst __moduleDir = path.dirname(fileURLToPath(import.meta.url));\n\nfunction firstNonEmptyLine(text: string): string {\n return (\n text\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .find(Boolean) ?? \"\"\n );\n}\n\nfunction hasNonEmptyEnvValue(env: Record<string, string>, key: string): boolean {\n const raw = env[key];\n return typeof raw === \"string\" && raw.trim().length > 0;\n}\n\nfunction resolveCursorBillingType(env: Record<string, string>): \"api\" | \"subscription\" {\n return hasNonEmptyEnvValue(env, \"CURSOR_API_KEY\") || hasNonEmptyEnvValue(env, \"OPENAI_API_KEY\")\n ? \"api\"\n : \"subscription\";\n}\n\nfunction resolveCursorBiller(\n env: Record<string, string>,\n billingType: \"api\" | \"subscription\",\n provider: string | null,\n): string {\n const openAiCompatibleBiller = inferOpenAiCompatibleBiller(env, null);\n if (openAiCompatibleBiller === \"openrouter\") return \"openrouter\";\n if (billingType === \"subscription\") return \"cursor\";\n return provider ?? \"cursor\";\n}\n\nfunction resolveProviderFromModel(model: string): string | null {\n const trimmed = model.trim().toLowerCase();\n if (!trimmed) return null;\n const slash = trimmed.indexOf(\"/\");\n if (slash > 0) return trimmed.slice(0, slash);\n if (trimmed.includes(\"sonnet\") || trimmed.includes(\"claude\")) return \"anthropic\";\n if (trimmed.startsWith(\"gpt\") || trimmed.startsWith(\"o\")) return \"openai\";\n return null;\n}\n\nfunction normalizeMode(rawMode: string): \"plan\" | \"ask\" | null {\n const mode = rawMode.trim().toLowerCase();\n if (mode === \"plan\" || mode === \"ask\") return mode;\n return null;\n}\n\nfunction renderPaperclipEnvNote(env: Record<string, string>): string {\n const paperclipKeys = Object.keys(env)\n .filter((key) => key.startsWith(\"PAPERCLIP_\"))\n .sort();\n if (paperclipKeys.length === 0) return \"\";\n return [\n \"Paperclip runtime note:\",\n `The following PAPERCLIP_* environment variables are available in this run: ${paperclipKeys.join(\", \")}`,\n \"Do not assume these variables are missing without checking your shell environment.\",\n \"\",\n \"\",\n ].join(\"\\n\");\n}\n\nfunction cursorSkillsHome(): string {\n return path.join(os.homedir(), \".cursor\", \"skills\");\n}\n\ntype EnsureCursorSkillsInjectedOptions = {\n skillsDir?: string | null;\n skillsEntries?: Array<{ key: string; runtimeName: string; source: string }>;\n skillsHome?: string;\n linkSkill?: (source: string, target: string) => Promise<void>;\n};\n\nexport async function ensureCursorSkillsInjected(\n onLog: AdapterExecutionContext[\"onLog\"],\n options: EnsureCursorSkillsInjectedOptions = {},\n) {\n const skillsEntries = options.skillsEntries\n ?? (options.skillsDir\n ? (await fs.readdir(options.skillsDir, { withFileTypes: true }))\n .filter((entry) => entry.isDirectory())\n .map((entry) => ({\n key: entry.name,\n runtimeName: entry.name,\n source: path.join(options.skillsDir!, entry.name),\n }))\n : await readPaperclipRuntimeSkillEntries({}, __moduleDir));\n if (skillsEntries.length === 0) return;\n\n const skillsHome = options.skillsHome ?? cursorSkillsHome();\n try {\n await fs.mkdir(skillsHome, { recursive: true });\n } catch (err) {\n await onLog(\n \"stderr\",\n `[paperclip] Failed to prepare Cursor skills directory ${skillsHome}: ${err instanceof Error ? err.message : String(err)}\\n`,\n );\n return;\n }\n const removedSkills = await removeMaintainerOnlySkillSymlinks(\n skillsHome,\n skillsEntries.map((entry) => entry.runtimeName),\n );\n for (const skillName of removedSkills) {\n await onLog(\n \"stderr\",\n `[paperclip] Removed maintainer-only Cursor skill \"${skillName}\" from ${skillsHome}\\n`,\n );\n }\n const linkSkill = options.linkSkill ?? ((source: string, target: string) => fs.symlink(source, target));\n for (const entry of skillsEntries) {\n const target = path.join(skillsHome, entry.runtimeName);\n try {\n const result = await ensurePaperclipSkillSymlink(entry.source, target, linkSkill);\n if (result === \"skipped\") continue;\n\n await onLog(\n \"stderr\",\n `[paperclip] ${result === \"repaired\" ? \"Repaired\" : \"Injected\"} Cursor skill \"${entry.key}\" into ${skillsHome}\\n`,\n );\n } catch (err) {\n await onLog(\n \"stderr\",\n `[paperclip] Failed to inject Cursor skill \"${entry.key}\" into ${skillsHome}: ${err instanceof Error ? err.message : String(err)}\\n`,\n );\n }\n }\n}\n\nexport async function execute(ctx: AdapterExecutionContext): Promise<AdapterExecutionResult> {\n const { runId, agent, runtime, config, context, onLog, onMeta, onSpawn, authToken } = ctx;\n\n const promptTemplate = asString(\n config.promptTemplate,\n \"You are agent {{agent.id}} ({{agent.name}}). Continue your Paperclip work.\",\n );\n const command = asString(config.command, \"agent\");\n const model = asString(config.model, DEFAULT_CURSOR_LOCAL_MODEL).trim();\n const mode = normalizeMode(asString(config.mode, \"\"));\n\n const workspaceContext = parseObject(context.paperclipWorkspace);\n const workspaceCwd = asString(workspaceContext.cwd, \"\");\n const workspaceSource = asString(workspaceContext.source, \"\");\n const workspaceId = asString(workspaceContext.workspaceId, \"\");\n const workspaceRepoUrl = asString(workspaceContext.repoUrl, \"\");\n const workspaceRepoRef = asString(workspaceContext.repoRef, \"\");\n const agentHome = asString(workspaceContext.agentHome, \"\");\n const workspaceHints = Array.isArray(context.paperclipWorkspaces)\n ? context.paperclipWorkspaces.filter(\n (value): value is Record<string, unknown> => typeof value === \"object\" && value !== null,\n )\n : [];\n const configuredCwd = asString(config.cwd, \"\");\n const useConfiguredInsteadOfAgentHome = workspaceSource === \"agent_home\" && configuredCwd.length > 0;\n const effectiveWorkspaceCwd = useConfiguredInsteadOfAgentHome ? \"\" : workspaceCwd;\n const cwd = effectiveWorkspaceCwd || configuredCwd || process.cwd();\n await ensureAbsoluteDirectory(cwd, { createIfMissing: true });\n const cursorSkillEntries = await readPaperclipRuntimeSkillEntries(config, __moduleDir);\n const desiredCursorSkillNames = resolvePaperclipDesiredSkillNames(config, cursorSkillEntries);\n await ensureCursorSkillsInjected(onLog, {\n skillsEntries: cursorSkillEntries.filter((entry) => desiredCursorSkillNames.includes(entry.key)),\n });\n\n const envConfig = parseObject(config.env);\n const hasExplicitApiKey =\n typeof envConfig.PAPERCLIP_API_KEY === \"string\" && envConfig.PAPERCLIP_API_KEY.trim().length > 0;\n const env: Record<string, string> = { ...buildPaperclipEnv(agent) };\n env.PAPERCLIP_RUN_ID = runId;\n const wakeTaskId =\n (typeof context.taskId === \"string\" && context.taskId.trim().length > 0 && context.taskId.trim()) ||\n (typeof context.issueId === \"string\" && context.issueId.trim().length > 0 && context.issueId.trim()) ||\n null;\n const wakeReason =\n typeof context.wakeReason === \"string\" && context.wakeReason.trim().length > 0\n ? context.wakeReason.trim()\n : null;\n const wakeCommentId =\n (typeof context.wakeCommentId === \"string\" && context.wakeCommentId.trim().length > 0 && context.wakeCommentId.trim()) ||\n (typeof context.commentId === \"string\" && context.commentId.trim().length > 0 && context.commentId.trim()) ||\n null;\n const approvalId =\n typeof context.approvalId === \"string\" && context.approvalId.trim().length > 0\n ? context.approvalId.trim()\n : null;\n const approvalStatus =\n typeof context.approvalStatus === \"string\" && context.approvalStatus.trim().length > 0\n ? context.approvalStatus.trim()\n : null;\n const linkedIssueIds = Array.isArray(context.issueIds)\n ? context.issueIds.filter((value): value is string => typeof value === \"string\" && value.trim().length > 0)\n : [];\n if (wakeTaskId) {\n env.PAPERCLIP_TASK_ID = wakeTaskId;\n }\n if (wakeReason) {\n env.PAPERCLIP_WAKE_REASON = wakeReason;\n }\n if (wakeCommentId) {\n env.PAPERCLIP_WAKE_COMMENT_ID = wakeCommentId;\n }\n if (approvalId) {\n env.PAPERCLIP_APPROVAL_ID = approvalId;\n }\n if (approvalStatus) {\n env.PAPERCLIP_APPROVAL_STATUS = approvalStatus;\n }\n if (linkedIssueIds.length > 0) {\n env.PAPERCLIP_LINKED_ISSUE_IDS = linkedIssueIds.join(\",\");\n }\n if (effectiveWorkspaceCwd) {\n env.PAPERCLIP_WORKSPACE_CWD = effectiveWorkspaceCwd;\n }\n if (workspaceSource) {\n env.PAPERCLIP_WORKSPACE_SOURCE = workspaceSource;\n }\n if (workspaceId) {\n env.PAPERCLIP_WORKSPACE_ID = workspaceId;\n }\n if (workspaceRepoUrl) {\n env.PAPERCLIP_WORKSPACE_REPO_URL = workspaceRepoUrl;\n }\n if (workspaceRepoRef) {\n env.PAPERCLIP_WORKSPACE_REPO_REF = workspaceRepoRef;\n }\n if (agentHome) {\n env.AGENT_HOME = agentHome;\n }\n if (workspaceHints.length > 0) {\n env.PAPERCLIP_WORKSPACES_JSON = JSON.stringify(workspaceHints);\n }\n for (const [k, v] of Object.entries(envConfig)) {\n if (typeof v === \"string\") env[k] = v;\n }\n if (!hasExplicitApiKey && authToken) {\n env.PAPERCLIP_API_KEY = authToken;\n }\n const effectiveEnv = Object.fromEntries(\n Object.entries({ ...process.env, ...env }).filter(\n (entry): entry is [string, string] => typeof entry[1] === \"string\",\n ),\n );\n const billingType = resolveCursorBillingType(effectiveEnv);\n const runtimeEnv = ensurePathInEnv(effectiveEnv);\n await ensureCommandResolvable(command, cwd, runtimeEnv);\n const resolvedCommand = await resolveCommandForLogs(command, cwd, runtimeEnv);\n const loggedEnv = buildInvocationEnvForLogs(env, {\n runtimeEnv,\n includeRuntimeKeys: [\"HOME\"],\n resolvedCommand,\n });\n\n const timeoutSec = asNumber(config.timeoutSec, 0);\n const graceSec = asNumber(config.graceSec, 20);\n const extraArgs = (() => {\n const fromExtraArgs = asStringArray(config.extraArgs);\n if (fromExtraArgs.length > 0) return fromExtraArgs;\n return asStringArray(config.args);\n })();\n const autoTrustEnabled = !hasCursorTrustBypassArg(extraArgs);\n\n const runtimeSessionParams = parseObject(runtime.sessionParams);\n const runtimeSessionId = asString(runtimeSessionParams.sessionId, runtime.sessionId ?? \"\");\n const runtimeSessionCwd = asString(runtimeSessionParams.cwd, \"\");\n const canResumeSession =\n runtimeSessionId.length > 0 &&\n (runtimeSessionCwd.length === 0 || path.resolve(runtimeSessionCwd) === path.resolve(cwd));\n const sessionId = canResumeSession ? runtimeSessionId : null;\n if (runtimeSessionId && !canResumeSession) {\n await onLog(\n \"stdout\",\n `[paperclip] Cursor session \"${runtimeSessionId}\" was saved for cwd \"${runtimeSessionCwd}\" and will not be resumed in \"${cwd}\".\\n`,\n );\n }\n\n const instructionsFilePath = asString(config.instructionsFilePath, \"\").trim();\n const instructionsDir = instructionsFilePath ? `${path.dirname(instructionsFilePath)}/` : \"\";\n let instructionsPrefix = \"\";\n let instructionsChars = 0;\n if (instructionsFilePath) {\n try {\n const instructionsContents = await fs.readFile(instructionsFilePath, \"utf8\");\n instructionsPrefix =\n `${instructionsContents}\\n\\n` +\n `The above agent instructions were loaded from ${instructionsFilePath}. ` +\n `Resolve any relative file references from ${instructionsDir}.\\n\\n`;\n instructionsChars = instructionsPrefix.length;\n } catch (err) {\n const reason = err instanceof Error ? err.message : String(err);\n await onLog(\n \"stdout\",\n `[paperclip] Warning: could not read agent instructions file \"${instructionsFilePath}\": ${reason}\\n`,\n );\n }\n }\n const commandNotes = (() => {\n const notes: string[] = [];\n if (autoTrustEnabled) {\n notes.push(\"Auto-added --yolo to bypass interactive prompts.\");\n }\n notes.push(\"Prompt is piped to Cursor via stdin.\");\n if (!instructionsFilePath) return notes;\n if (instructionsPrefix.length > 0) {\n notes.push(\n `Loaded agent instructions from ${instructionsFilePath}`,\n `Prepended instructions + path directive to prompt (relative references from ${instructionsDir}).`,\n );\n return notes;\n }\n notes.push(\n `Configured instructionsFilePath ${instructionsFilePath}, but file could not be read; continuing without injected instructions.`,\n );\n return notes;\n })();\n\n const bootstrapPromptTemplate = asString(config.bootstrapPromptTemplate, \"\");\n const templateData = {\n agentId: agent.id,\n companyId: agent.companyId,\n runId,\n company: { id: agent.companyId },\n agent,\n run: { id: runId, source: \"on_demand\" },\n context,\n };\n const renderedPrompt = renderTemplate(promptTemplate, templateData);\n const renderedBootstrapPrompt =\n !sessionId && bootstrapPromptTemplate.trim().length > 0\n ? renderTemplate(bootstrapPromptTemplate, templateData).trim()\n : \"\";\n const sessionHandoffNote = asString(context.paperclipSessionHandoffMarkdown, \"\").trim();\n const paperclipEnvNote = renderPaperclipEnvNote(env);\n const prompt = joinPromptSections([\n instructionsPrefix,\n renderedBootstrapPrompt,\n sessionHandoffNote,\n paperclipEnvNote,\n renderedPrompt,\n ]);\n const promptMetrics = {\n promptChars: prompt.length,\n instructionsChars,\n bootstrapPromptChars: renderedBootstrapPrompt.length,\n sessionHandoffChars: sessionHandoffNote.length,\n runtimeNoteChars: paperclipEnvNote.length,\n heartbeatPromptChars: renderedPrompt.length,\n };\n\n const buildArgs = (resumeSessionId: string | null) => {\n const args = [\"-p\", \"--output-format\", \"stream-json\", \"--workspace\", cwd];\n if (resumeSessionId) args.push(\"--resume\", resumeSessionId);\n if (model) args.push(\"--model\", model);\n if (mode) args.push(\"--mode\", mode);\n if (autoTrustEnabled) args.push(\"--yolo\");\n if (extraArgs.length > 0) args.push(...extraArgs);\n return args;\n };\n\n const runAttempt = async (resumeSessionId: string | null) => {\n const args = buildArgs(resumeSessionId);\n if (onMeta) {\n await onMeta({\n adapterType: \"cursor\",\n command: resolvedCommand,\n cwd,\n commandNotes,\n commandArgs: args,\n env: loggedEnv,\n prompt,\n promptMetrics,\n context,\n });\n }\n\n let stdoutLineBuffer = \"\";\n const emitNormalizedStdoutLine = async (rawLine: string) => {\n const normalized = normalizeCursorStreamLine(rawLine);\n if (!normalized.line) return;\n await onLog(normalized.stream ?? \"stdout\", `${normalized.line}\\n`);\n };\n const flushStdoutChunk = async (chunk: string, finalize = false) => {\n const combined = `${stdoutLineBuffer}${chunk}`;\n const lines = combined.split(/\\r?\\n/);\n stdoutLineBuffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n await emitNormalizedStdoutLine(line);\n }\n\n if (finalize) {\n const trailing = stdoutLineBuffer.trim();\n stdoutLineBuffer = \"\";\n if (trailing) {\n await emitNormalizedStdoutLine(trailing);\n }\n }\n };\n\n const proc = await runChildProcess(runId, command, args, {\n cwd,\n env,\n timeoutSec,\n graceSec,\n stdin: prompt,\n onSpawn,\n onLog: async (stream, chunk) => {\n if (stream !== \"stdout\") {\n await onLog(stream, chunk);\n return;\n }\n await flushStdoutChunk(chunk);\n },\n });\n await flushStdoutChunk(\"\", true);\n\n return {\n proc,\n parsed: parseCursorJsonl(proc.stdout),\n };\n };\n\n const providerFromModel = resolveProviderFromModel(model);\n\n const toResult = (\n attempt: {\n proc: {\n exitCode: number | null;\n signal: string | null;\n timedOut: boolean;\n stdout: string;\n stderr: string;\n };\n parsed: ReturnType<typeof parseCursorJsonl>;\n },\n clearSessionOnMissingSession = false,\n ): AdapterExecutionResult => {\n if (attempt.proc.timedOut) {\n return {\n exitCode: attempt.proc.exitCode,\n signal: attempt.proc.signal,\n timedOut: true,\n errorMessage: `Timed out after ${timeoutSec}s`,\n clearSession: clearSessionOnMissingSession,\n };\n }\n\n const resolvedSessionId = attempt.parsed.sessionId ?? runtimeSessionId ?? runtime.sessionId ?? null;\n const resolvedSessionParams = resolvedSessionId\n ? ({\n sessionId: resolvedSessionId,\n cwd,\n ...(workspaceId ? { workspaceId } : {}),\n ...(workspaceRepoUrl ? { repoUrl: workspaceRepoUrl } : {}),\n ...(workspaceRepoRef ? { repoRef: workspaceRepoRef } : {}),\n } as Record<string, unknown>)\n : null;\n const parsedError = typeof attempt.parsed.errorMessage === \"string\" ? attempt.parsed.errorMessage.trim() : \"\";\n const stderrLine = firstNonEmptyLine(attempt.proc.stderr);\n const fallbackErrorMessage =\n parsedError ||\n stderrLine ||\n `Cursor exited with code ${attempt.proc.exitCode ?? -1}`;\n\n return {\n exitCode: attempt.proc.exitCode,\n signal: attempt.proc.signal,\n timedOut: false,\n errorMessage:\n (attempt.proc.exitCode ?? 0) === 0\n ? null\n : fallbackErrorMessage,\n usage: attempt.parsed.usage,\n sessionId: resolvedSessionId,\n sessionParams: resolvedSessionParams,\n sessionDisplayId: resolvedSessionId,\n provider: providerFromModel,\n biller: resolveCursorBiller(effectiveEnv, billingType, providerFromModel),\n model,\n billingType,\n costUsd: attempt.parsed.costUsd,\n resultJson: {\n stdout: attempt.proc.stdout,\n stderr: attempt.proc.stderr,\n },\n summary: attempt.parsed.summary,\n clearSession: Boolean(clearSessionOnMissingSession && !resolvedSessionId),\n };\n };\n\n const initial = await runAttempt(sessionId);\n if (\n sessionId &&\n !initial.proc.timedOut &&\n (initial.proc.exitCode ?? 0) !== 0 &&\n isCursorUnknownSessionError(initial.proc.stdout, initial.proc.stderr)\n ) {\n await onLog(\n \"stdout\",\n `[paperclip] Cursor resume session \"${sessionId}\" is unavailable; retrying with a fresh session.\\n`,\n );\n const retry = await runAttempt(null);\n return toResult(retry, true);\n }\n\n return toResult(initial);\n}\n", "export const type = \"cursor\";\nexport const label = \"Cursor CLI (local)\";\nexport const DEFAULT_CURSOR_LOCAL_MODEL = \"auto\";\n\nconst CURSOR_FALLBACK_MODEL_IDS = [\n \"auto\",\n \"composer-1.5\",\n \"composer-1\",\n \"gpt-5.3-codex-low\",\n \"gpt-5.3-codex-low-fast\",\n \"gpt-5.3-codex\",\n \"gpt-5.3-codex-fast\",\n \"gpt-5.3-codex-high\",\n \"gpt-5.3-codex-high-fast\",\n \"gpt-5.3-codex-xhigh\",\n \"gpt-5.3-codex-xhigh-fast\",\n \"gpt-5.3-codex-spark-preview\",\n \"gpt-5.2\",\n \"gpt-5.2-codex-low\",\n \"gpt-5.2-codex-low-fast\",\n \"gpt-5.2-codex\",\n \"gpt-5.2-codex-fast\",\n \"gpt-5.2-codex-high\",\n \"gpt-5.2-codex-high-fast\",\n \"gpt-5.2-codex-xhigh\",\n \"gpt-5.2-codex-xhigh-fast\",\n \"gpt-5.1-codex-max\",\n \"gpt-5.1-codex-max-high\",\n \"gpt-5.2-high\",\n \"gpt-5.1-high\",\n \"gpt-5.1-codex-mini\",\n \"opus-4.6-thinking\",\n \"opus-4.6\",\n \"opus-4.5\",\n \"opus-4.5-thinking\",\n \"sonnet-4.6\",\n \"sonnet-4.6-thinking\",\n \"sonnet-4.5\",\n \"sonnet-4.5-thinking\",\n \"gemini-3.1-pro\",\n \"gemini-3-pro\",\n \"gemini-3-flash\",\n \"grok\",\n \"kimi-k2.5\",\n];\n\nexport const models = CURSOR_FALLBACK_MODEL_IDS.map((id) => ({ id, label: id }));\n\nexport const agentConfigurationDoc = `# cursor agent configuration\n\nAdapter: cursor\n\nUse when:\n- You want Paperclip to run Cursor Agent CLI locally as the agent runtime\n- You want Cursor chat session resume across heartbeats via --resume\n- You want structured stream output in run logs via --output-format stream-json\n\nDon't use when:\n- You need webhook-style external invocation (use openclaw_gateway or http)\n- You only need one-shot shell commands (use process)\n- Cursor Agent CLI is not installed on the machine\n\nCore fields:\n- cwd (string, optional): default absolute working directory fallback for the agent process (created if missing when possible)\n- instructionsFilePath (string, optional): absolute path to a markdown instructions file prepended to the run prompt\n- promptTemplate (string, optional): run prompt template\n- model (string, optional): Cursor model id (for example auto or gpt-5.3-codex)\n- mode (string, optional): Cursor execution mode passed as --mode (plan|ask). Leave unset for normal autonomous runs.\n- command (string, optional): defaults to \"agent\"\n- extraArgs (string[], optional): additional CLI args\n- env (object, optional): KEY=VALUE environment variables\n\nOperational fields:\n- timeoutSec (number, optional): run timeout in seconds\n- graceSec (number, optional): SIGTERM grace period in seconds\n\nNotes:\n- Runs are executed with: agent -p --output-format stream-json ...\n- Prompts are piped to Cursor via stdin.\n- Sessions are resumed with --resume when stored session cwd matches current cwd.\n- Paperclip auto-injects local skills into \"~/.cursor/skills\" when missing, so Cursor can discover \"$paperclip\" and related skills on local runs.\n- Paperclip auto-adds --yolo unless one of --trust/--yolo/-f is already present in extraArgs.\n`;\n", "import { asString, asNumber, parseObject, parseJson } from \"@paperclipai/adapter-utils/server-utils\";\nimport { normalizeCursorStreamLine } from \"../shared/stream.js\";\n\nfunction asErrorText(value: unknown): string {\n if (typeof value === \"string\") return value;\n const rec = parseObject(value);\n const message =\n asString(rec.message, \"\") ||\n asString(rec.error, \"\") ||\n asString(rec.code, \"\") ||\n asString(rec.detail, \"\");\n if (message) return message;\n try {\n return JSON.stringify(rec);\n } catch {\n return \"\";\n }\n}\n\nfunction collectAssistantText(message: unknown): string[] {\n if (typeof message === \"string\") {\n const trimmed = message.trim();\n return trimmed ? [trimmed] : [];\n }\n\n const rec = parseObject(message);\n const direct = asString(rec.text, \"\").trim();\n const lines: string[] = direct ? [direct] : [];\n const content = Array.isArray(rec.content) ? rec.content : [];\n\n for (const partRaw of content) {\n const part = parseObject(partRaw);\n const type = asString(part.type, \"\").trim();\n if (type === \"output_text\" || type === \"text\") {\n const text = asString(part.text, \"\").trim();\n if (text) lines.push(text);\n }\n }\n\n return lines;\n}\n\nfunction readSessionId(event: Record<string, unknown>): string | null {\n return (\n asString(event.session_id, \"\").trim() ||\n asString(event.sessionId, \"\").trim() ||\n asString(event.sessionID, \"\").trim() ||\n null\n );\n}\n\nexport function parseCursorJsonl(stdout: string) {\n let sessionId: string | null = null;\n const messages: string[] = [];\n let errorMessage: string | null = null;\n let totalCostUsd = 0;\n const usage = {\n inputTokens: 0,\n cachedInputTokens: 0,\n outputTokens: 0,\n };\n\n for (const rawLine of stdout.split(/\\r?\\n/)) {\n const line = normalizeCursorStreamLine(rawLine).line;\n if (!line) continue;\n\n const event = parseJson(line);\n if (!event) continue;\n\n const foundSession = readSessionId(event);\n if (foundSession) sessionId = foundSession;\n\n const type = asString(event.type, \"\").trim();\n\n if (type === \"assistant\") {\n messages.push(...collectAssistantText(event.message));\n continue;\n }\n\n if (type === \"result\") {\n const usageObj = parseObject(event.usage);\n usage.inputTokens += asNumber(\n usageObj.input_tokens,\n asNumber(usageObj.inputTokens, 0),\n );\n usage.cachedInputTokens += asNumber(\n usageObj.cached_input_tokens,\n asNumber(usageObj.cachedInputTokens, asNumber(usageObj.cache_read_input_tokens, 0)),\n );\n usage.outputTokens += asNumber(\n usageObj.output_tokens,\n asNumber(usageObj.outputTokens, 0),\n );\n totalCostUsd += asNumber(event.total_cost_usd, asNumber(event.cost_usd, asNumber(event.cost, 0)));\n\n const isError = event.is_error === true || asString(event.subtype, \"\").toLowerCase() === \"error\";\n const resultText = asString(event.result, \"\").trim();\n if (resultText && messages.length === 0) {\n messages.push(resultText);\n }\n if (isError) {\n const resultError = asErrorText(event.error ?? event.message ?? event.result).trim();\n if (resultError) errorMessage = resultError;\n }\n continue;\n }\n\n if (type === \"error\") {\n const message = asErrorText(event.message ?? event.error ?? event.detail).trim();\n if (message) errorMessage = message;\n continue;\n }\n\n if (type === \"system\") {\n const subtype = asString(event.subtype, \"\").trim().toLowerCase();\n if (subtype === \"error\") {\n const message = asErrorText(event.message ?? event.error ?? event.detail).trim();\n if (message) errorMessage = message;\n }\n continue;\n }\n\n // Compatibility with older stream-json shapes.\n if (type === \"text\") {\n const part = parseObject(event.part);\n const text = asString(part.text, \"\").trim();\n if (text) messages.push(text);\n continue;\n }\n\n if (type === \"step_finish\") {\n const part = parseObject(event.part);\n const tokens = parseObject(part.tokens);\n const cache = parseObject(tokens.cache);\n usage.inputTokens += asNumber(tokens.input, 0);\n usage.cachedInputTokens += asNumber(cache.read, 0);\n usage.outputTokens += asNumber(tokens.output, 0);\n totalCostUsd += asNumber(part.cost, 0);\n continue;\n }\n }\n\n return {\n sessionId,\n summary: messages.join(\"\\n\\n\").trim(),\n usage,\n costUsd: totalCostUsd > 0 ? totalCostUsd : null,\n errorMessage,\n };\n}\n\nexport function isCursorUnknownSessionError(stdout: string, stderr: string): boolean {\n const haystack = `${stdout}\\n${stderr}`\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean)\n .join(\"\\n\");\n\n return /unknown\\s+(session|chat)|session\\s+.*\\s+not\\s+found|chat\\s+.*\\s+not\\s+found|resume\\s+.*\\s+not\\s+found|could\\s+not\\s+resume/i.test(\n haystack,\n );\n}\n", "export function hasCursorTrustBypassArg(args: readonly string[]): boolean {\n return args.some(\n (arg) =>\n arg === \"--trust\" ||\n arg === \"--yolo\" ||\n arg === \"-f\" ||\n arg.startsWith(\"--trust=\"),\n );\n}\n", "import fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type {\n AdapterSkillContext,\n AdapterSkillSnapshot,\n} from \"@paperclipai/adapter-utils\";\nimport {\n buildPersistentSkillSnapshot,\n ensurePaperclipSkillSymlink,\n readPaperclipRuntimeSkillEntries,\n readInstalledSkillTargets,\n resolvePaperclipDesiredSkillNames,\n} from \"@paperclipai/adapter-utils/server-utils\";\n\nconst __moduleDir = path.dirname(fileURLToPath(import.meta.url));\n\nfunction asString(value: unknown): string | null {\n return typeof value === \"string\" && value.trim().length > 0 ? value.trim() : null;\n}\n\nfunction resolveCursorSkillsHome(config: Record<string, unknown>) {\n const env =\n typeof config.env === \"object\" && config.env !== null && !Array.isArray(config.env)\n ? (config.env as Record<string, unknown>)\n : {};\n const configuredHome = asString(env.HOME);\n const home = configuredHome ? path.resolve(configuredHome) : os.homedir();\n return path.join(home, \".cursor\", \"skills\");\n}\n\nasync function buildCursorSkillSnapshot(config: Record<string, unknown>): Promise<AdapterSkillSnapshot> {\n const availableEntries = await readPaperclipRuntimeSkillEntries(config, __moduleDir);\n const desiredSkills = resolvePaperclipDesiredSkillNames(config, availableEntries);\n const skillsHome = resolveCursorSkillsHome(config);\n const installed = await readInstalledSkillTargets(skillsHome);\n return buildPersistentSkillSnapshot({\n adapterType: \"cursor\",\n availableEntries,\n desiredSkills,\n installed,\n skillsHome,\n locationLabel: \"~/.cursor/skills\",\n missingDetail: \"Configured but not currently linked into the Cursor skills home.\",\n externalConflictDetail: \"Skill name is occupied by an external installation.\",\n externalDetail: \"Installed outside Paperclip management.\",\n });\n}\n\nexport async function listCursorSkills(ctx: AdapterSkillContext): Promise<AdapterSkillSnapshot> {\n return buildCursorSkillSnapshot(ctx.config);\n}\n\nexport async function syncCursorSkills(\n ctx: AdapterSkillContext,\n desiredSkills: string[],\n): Promise<AdapterSkillSnapshot> {\n const availableEntries = await readPaperclipRuntimeSkillEntries(ctx.config, __moduleDir);\n const desiredSet = new Set([\n ...desiredSkills,\n ...availableEntries.filter((entry) => entry.required).map((entry) => entry.key),\n ]);\n const skillsHome = resolveCursorSkillsHome(ctx.config);\n await fs.mkdir(skillsHome, { recursive: true });\n const installed = await readInstalledSkillTargets(skillsHome);\n const availableByRuntimeName = new Map(availableEntries.map((entry) => [entry.runtimeName, entry]));\n\n for (const available of availableEntries) {\n if (!desiredSet.has(available.key)) continue;\n const target = path.join(skillsHome, available.runtimeName);\n await ensurePaperclipSkillSymlink(available.source, target);\n }\n\n for (const [name, installedEntry] of installed.entries()) {\n const available = availableByRuntimeName.get(name);\n if (!available) continue;\n if (desiredSet.has(available.key)) continue;\n if (installedEntry.targetPath !== available.source) continue;\n await fs.unlink(path.join(skillsHome, name)).catch(() => {});\n }\n\n return buildCursorSkillSnapshot(ctx.config);\n}\n\nexport function resolveCursorDesiredSkillNames(\n config: Record<string, unknown>,\n availableEntries: Array<{ key: string; required?: boolean }>,\n) {\n return resolvePaperclipDesiredSkillNames(config, availableEntries);\n}\n", "import fs from \"node:fs/promises\";\nimport type { Dirent } from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type { AdapterExecutionContext, AdapterExecutionResult } from \"@paperclipai/adapter-utils\";\nimport {\n asBoolean,\n asNumber,\n asString,\n asStringArray,\n buildPaperclipEnv,\n buildInvocationEnvForLogs,\n ensureAbsoluteDirectory,\n ensureCommandResolvable,\n ensurePaperclipSkillSymlink,\n joinPromptSections,\n ensurePathInEnv,\n readPaperclipRuntimeSkillEntries,\n resolveCommandForLogs,\n resolvePaperclipDesiredSkillNames,\n removeMaintainerOnlySkillSymlinks,\n parseObject,\n renderTemplate,\n runChildProcess,\n} from \"@paperclipai/adapter-utils/server-utils\";\nimport { DEFAULT_GEMINI_LOCAL_MODEL } from \"../index.js\";\nimport {\n describeGeminiFailure,\n detectGeminiAuthRequired,\n isGeminiTurnLimitResult,\n isGeminiUnknownSessionError,\n parseGeminiJsonl,\n} from \"./parse.js\";\nimport { firstNonEmptyLine } from \"./utils.js\";\n\nconst __moduleDir = path.dirname(fileURLToPath(import.meta.url));\n\nfunction hasNonEmptyEnvValue(env: Record<string, string>, key: string): boolean {\n const raw = env[key];\n return typeof raw === \"string\" && raw.trim().length > 0;\n}\n\nfunction resolveGeminiBillingType(env: Record<string, string>): \"api\" | \"subscription\" {\n return hasNonEmptyEnvValue(env, \"GEMINI_API_KEY\") || hasNonEmptyEnvValue(env, \"GOOGLE_API_KEY\")\n ? \"api\"\n : \"subscription\";\n}\n\nfunction renderPaperclipEnvNote(env: Record<string, string>): string {\n const paperclipKeys = Object.keys(env)\n .filter((key) => key.startsWith(\"PAPERCLIP_\"))\n .sort();\n if (paperclipKeys.length === 0) return \"\";\n return [\n \"Paperclip runtime note:\",\n `The following PAPERCLIP_* environment variables are available in this run: ${paperclipKeys.join(\", \")}`,\n \"Do not assume these variables are missing without checking your shell environment.\",\n \"\",\n \"\",\n ].join(\"\\n\");\n}\n\nfunction renderApiAccessNote(env: Record<string, string>): string {\n if (!hasNonEmptyEnvValue(env, \"PAPERCLIP_API_URL\") || !hasNonEmptyEnvValue(env, \"PAPERCLIP_API_KEY\")) return \"\";\n return [\n \"Paperclip API access note:\",\n \"Use run_shell_command with curl to make Paperclip API requests.\",\n \"GET example:\",\n ` run_shell_command({ command: \"curl -s -H \\\\\"Authorization: Bearer $PAPERCLIP_API_KEY\\\\\" \\\\\"$PAPERCLIP_API_URL/api/agents/me\\\\\"\" })`,\n \"POST/PATCH example:\",\n ` run_shell_command({ command: \"curl -s -X POST -H \\\\\"Authorization: Bearer $PAPERCLIP_API_KEY\\\\\" -H 'Content-Type: application/json' -H \\\\\"X-Paperclip-Run-Id: $PAPERCLIP_RUN_ID\\\\\" -d '{...}' \\\\\"$PAPERCLIP_API_URL/api/issues/{id}/checkout\\\\\"\" })`,\n \"\",\n \"\",\n ].join(\"\\n\");\n}\n\nfunction geminiSkillsHome(): string {\n return path.join(os.homedir(), \".gemini\", \"skills\");\n}\n\n/**\n * Inject Paperclip skills directly into `~/.gemini/skills/` via symlinks.\n * This avoids needing GEMINI_CLI_HOME overrides, so the CLI naturally finds\n * both its auth credentials and the injected skills in the real home directory.\n */\nasync function ensureGeminiSkillsInjected(\n onLog: AdapterExecutionContext[\"onLog\"],\n skillsEntries: Array<{ key: string; runtimeName: string; source: string }>,\n desiredSkillNames?: string[],\n): Promise<void> {\n const desiredSet = new Set(desiredSkillNames ?? skillsEntries.map((entry) => entry.key));\n const selectedEntries = skillsEntries.filter((entry) => desiredSet.has(entry.key));\n if (selectedEntries.length === 0) return;\n\n const skillsHome = geminiSkillsHome();\n try {\n await fs.mkdir(skillsHome, { recursive: true });\n } catch (err) {\n await onLog(\n \"stderr\",\n `[paperclip] Failed to prepare Gemini skills directory ${skillsHome}: ${err instanceof Error ? err.message : String(err)}\\n`,\n );\n return;\n }\n const removedSkills = await removeMaintainerOnlySkillSymlinks(\n skillsHome,\n selectedEntries.map((entry) => entry.runtimeName),\n );\n for (const skillName of removedSkills) {\n await onLog(\n \"stderr\",\n `[paperclip] Removed maintainer-only Gemini skill \"${skillName}\" from ${skillsHome}\\n`,\n );\n }\n\n for (const entry of selectedEntries) {\n const target = path.join(skillsHome, entry.runtimeName);\n\n try {\n const result = await ensurePaperclipSkillSymlink(entry.source, target);\n if (result === \"skipped\") continue;\n await onLog(\n \"stderr\",\n `[paperclip] ${result === \"repaired\" ? \"Repaired\" : \"Linked\"} Gemini skill: ${entry.key}\\n`,\n );\n } catch (err) {\n await onLog(\n \"stderr\",\n `[paperclip] Failed to link Gemini skill \"${entry.key}\": ${err instanceof Error ? err.message : String(err)}\\n`,\n );\n }\n }\n}\n\nexport async function execute(ctx: AdapterExecutionContext): Promise<AdapterExecutionResult> {\n const { runId, agent, runtime, config, context, onLog, onMeta, onSpawn, authToken } = ctx;\n\n const promptTemplate = asString(\n config.promptTemplate,\n \"You are agent {{agent.id}} ({{agent.name}}). Continue your Paperclip work.\",\n );\n const command = asString(config.command, \"gemini\");\n const model = asString(config.model, DEFAULT_GEMINI_LOCAL_MODEL).trim();\n const sandbox = asBoolean(config.sandbox, false);\n\n const workspaceContext = parseObject(context.paperclipWorkspace);\n const workspaceCwd = asString(workspaceContext.cwd, \"\");\n const workspaceSource = asString(workspaceContext.source, \"\");\n const workspaceId = asString(workspaceContext.workspaceId, \"\");\n const workspaceRepoUrl = asString(workspaceContext.repoUrl, \"\");\n const workspaceRepoRef = asString(workspaceContext.repoRef, \"\");\n const agentHome = asString(workspaceContext.agentHome, \"\");\n const workspaceHints = Array.isArray(context.paperclipWorkspaces)\n ? context.paperclipWorkspaces.filter(\n (value): value is Record<string, unknown> => typeof value === \"object\" && value !== null,\n )\n : [];\n const configuredCwd = asString(config.cwd, \"\");\n const useConfiguredInsteadOfAgentHome = workspaceSource === \"agent_home\" && configuredCwd.length > 0;\n const effectiveWorkspaceCwd = useConfiguredInsteadOfAgentHome ? \"\" : workspaceCwd;\n const cwd = effectiveWorkspaceCwd || configuredCwd || process.cwd();\n await ensureAbsoluteDirectory(cwd, { createIfMissing: true });\n const geminiSkillEntries = await readPaperclipRuntimeSkillEntries(config, __moduleDir);\n const desiredGeminiSkillNames = resolvePaperclipDesiredSkillNames(config, geminiSkillEntries);\n await ensureGeminiSkillsInjected(onLog, geminiSkillEntries, desiredGeminiSkillNames);\n\n const envConfig = parseObject(config.env);\n const hasExplicitApiKey =\n typeof envConfig.PAPERCLIP_API_KEY === \"string\" && envConfig.PAPERCLIP_API_KEY.trim().length > 0;\n const env: Record<string, string> = { ...buildPaperclipEnv(agent) };\n env.PAPERCLIP_RUN_ID = runId;\n const wakeTaskId =\n (typeof context.taskId === \"string\" && context.taskId.trim().length > 0 && context.taskId.trim()) ||\n (typeof context.issueId === \"string\" && context.issueId.trim().length > 0 && context.issueId.trim()) ||\n null;\n const wakeReason =\n typeof context.wakeReason === \"string\" && context.wakeReason.trim().length > 0\n ? context.wakeReason.trim()\n : null;\n const wakeCommentId =\n (typeof context.wakeCommentId === \"string\" && context.wakeCommentId.trim().length > 0 && context.wakeCommentId.trim()) ||\n (typeof context.commentId === \"string\" && context.commentId.trim().length > 0 && context.commentId.trim()) ||\n null;\n const approvalId =\n typeof context.approvalId === \"string\" && context.approvalId.trim().length > 0\n ? context.approvalId.trim()\n : null;\n const approvalStatus =\n typeof context.approvalStatus === \"string\" && context.approvalStatus.trim().length > 0\n ? context.approvalStatus.trim()\n : null;\n const linkedIssueIds = Array.isArray(context.issueIds)\n ? context.issueIds.filter((value): value is string => typeof value === \"string\" && value.trim().length > 0)\n : [];\n if (wakeTaskId) env.PAPERCLIP_TASK_ID = wakeTaskId;\n if (wakeReason) env.PAPERCLIP_WAKE_REASON = wakeReason;\n if (wakeCommentId) env.PAPERCLIP_WAKE_COMMENT_ID = wakeCommentId;\n if (approvalId) env.PAPERCLIP_APPROVAL_ID = approvalId;\n if (approvalStatus) env.PAPERCLIP_APPROVAL_STATUS = approvalStatus;\n if (linkedIssueIds.length > 0) env.PAPERCLIP_LINKED_ISSUE_IDS = linkedIssueIds.join(\",\");\n if (effectiveWorkspaceCwd) env.PAPERCLIP_WORKSPACE_CWD = effectiveWorkspaceCwd;\n if (workspaceSource) env.PAPERCLIP_WORKSPACE_SOURCE = workspaceSource;\n if (workspaceId) env.PAPERCLIP_WORKSPACE_ID = workspaceId;\n if (workspaceRepoUrl) env.PAPERCLIP_WORKSPACE_REPO_URL = workspaceRepoUrl;\n if (workspaceRepoRef) env.PAPERCLIP_WORKSPACE_REPO_REF = workspaceRepoRef;\n if (agentHome) env.AGENT_HOME = agentHome;\n if (workspaceHints.length > 0) env.PAPERCLIP_WORKSPACES_JSON = JSON.stringify(workspaceHints);\n\n for (const [key, value] of Object.entries(envConfig)) {\n if (typeof value === \"string\") env[key] = value;\n }\n if (!hasExplicitApiKey && authToken) {\n env.PAPERCLIP_API_KEY = authToken;\n }\n const effectiveEnv = Object.fromEntries(\n Object.entries({ ...process.env, ...env }).filter(\n (entry): entry is [string, string] => typeof entry[1] === \"string\",\n ),\n );\n const billingType = resolveGeminiBillingType(effectiveEnv);\n const runtimeEnv = ensurePathInEnv(effectiveEnv);\n await ensureCommandResolvable(command, cwd, runtimeEnv);\n const resolvedCommand = await resolveCommandForLogs(command, cwd, runtimeEnv);\n const loggedEnv = buildInvocationEnvForLogs(env, {\n runtimeEnv,\n includeRuntimeKeys: [\"HOME\"],\n resolvedCommand,\n });\n\n const timeoutSec = asNumber(config.timeoutSec, 0);\n const graceSec = asNumber(config.graceSec, 20);\n const extraArgs = (() => {\n const fromExtraArgs = asStringArray(config.extraArgs);\n if (fromExtraArgs.length > 0) return fromExtraArgs;\n return asStringArray(config.args);\n })();\n\n const runtimeSessionParams = parseObject(runtime.sessionParams);\n const runtimeSessionId = asString(runtimeSessionParams.sessionId, runtime.sessionId ?? \"\");\n const runtimeSessionCwd = asString(runtimeSessionParams.cwd, \"\");\n const canResumeSession =\n runtimeSessionId.length > 0 &&\n (runtimeSessionCwd.length === 0 || path.resolve(runtimeSessionCwd) === path.resolve(cwd));\n const sessionId = canResumeSession ? runtimeSessionId : null;\n if (runtimeSessionId && !canResumeSession) {\n await onLog(\n \"stdout\",\n `[paperclip] Gemini session \"${runtimeSessionId}\" was saved for cwd \"${runtimeSessionCwd}\" and will not be resumed in \"${cwd}\".\\n`,\n );\n }\n\n const instructionsFilePath = asString(config.instructionsFilePath, \"\").trim();\n const instructionsDir = instructionsFilePath ? `${path.dirname(instructionsFilePath)}/` : \"\";\n let instructionsPrefix = \"\";\n if (instructionsFilePath) {\n try {\n const instructionsContents = await fs.readFile(instructionsFilePath, \"utf8\");\n instructionsPrefix =\n `${instructionsContents}\\n\\n` +\n `The above agent instructions were loaded from ${instructionsFilePath}. ` +\n `Resolve any relative file references from ${instructionsDir}.\\n\\n`;\n } catch (err) {\n const reason = err instanceof Error ? err.message : String(err);\n await onLog(\n \"stdout\",\n `[paperclip] Warning: could not read agent instructions file \"${instructionsFilePath}\": ${reason}\\n`,\n );\n }\n }\n const commandNotes = (() => {\n const notes: string[] = [\"Prompt is passed to Gemini via --prompt for non-interactive execution.\"];\n notes.push(\"Added --approval-mode yolo for unattended execution.\");\n if (!instructionsFilePath) return notes;\n if (instructionsPrefix.length > 0) {\n notes.push(\n `Loaded agent instructions from ${instructionsFilePath}`,\n `Prepended instructions + path directive to prompt (relative references from ${instructionsDir}).`,\n );\n return notes;\n }\n notes.push(\n `Configured instructionsFilePath ${instructionsFilePath}, but file could not be read; continuing without injected instructions.`,\n );\n return notes;\n })();\n\n const bootstrapPromptTemplate = asString(config.bootstrapPromptTemplate, \"\");\n const templateData = {\n agentId: agent.id,\n companyId: agent.companyId,\n runId,\n company: { id: agent.companyId },\n agent,\n run: { id: runId, source: \"on_demand\" },\n context,\n };\n const renderedPrompt = renderTemplate(promptTemplate, templateData);\n const renderedBootstrapPrompt =\n !sessionId && bootstrapPromptTemplate.trim().length > 0\n ? renderTemplate(bootstrapPromptTemplate, templateData).trim()\n : \"\";\n const sessionHandoffNote = asString(context.paperclipSessionHandoffMarkdown, \"\").trim();\n const paperclipEnvNote = renderPaperclipEnvNote(env);\n const apiAccessNote = renderApiAccessNote(env);\n const prompt = joinPromptSections([\n instructionsPrefix,\n renderedBootstrapPrompt,\n sessionHandoffNote,\n paperclipEnvNote,\n apiAccessNote,\n renderedPrompt,\n ]);\n const promptMetrics = {\n promptChars: prompt.length,\n instructionsChars: instructionsPrefix.length,\n bootstrapPromptChars: renderedBootstrapPrompt.length,\n sessionHandoffChars: sessionHandoffNote.length,\n runtimeNoteChars: paperclipEnvNote.length + apiAccessNote.length,\n heartbeatPromptChars: renderedPrompt.length,\n };\n\n const buildArgs = (resumeSessionId: string | null) => {\n const args = [\"--output-format\", \"stream-json\"];\n if (resumeSessionId) args.push(\"--resume\", resumeSessionId);\n if (model && model !== DEFAULT_GEMINI_LOCAL_MODEL) args.push(\"--model\", model);\n args.push(\"--approval-mode\", \"yolo\");\n if (sandbox) {\n args.push(\"--sandbox\");\n } else {\n args.push(\"--sandbox=none\");\n }\n if (extraArgs.length > 0) args.push(...extraArgs);\n args.push(\"--prompt\", prompt);\n return args;\n };\n\n const runAttempt = async (resumeSessionId: string | null) => {\n const args = buildArgs(resumeSessionId);\n if (onMeta) {\n await onMeta({\n adapterType: \"gemini_local\",\n command: resolvedCommand,\n cwd,\n commandNotes,\n commandArgs: args.map((value, index) => (\n index === args.length - 1 ? `<prompt ${prompt.length} chars>` : value\n )),\n env: loggedEnv,\n prompt,\n promptMetrics,\n context,\n });\n }\n\n const proc = await runChildProcess(runId, command, args, {\n cwd,\n env,\n timeoutSec,\n graceSec,\n onSpawn,\n onLog,\n });\n return {\n proc,\n parsed: parseGeminiJsonl(proc.stdout),\n };\n };\n\n const toResult = (\n attempt: {\n proc: {\n exitCode: number | null;\n signal: string | null;\n timedOut: boolean;\n stdout: string;\n stderr: string;\n };\n parsed: ReturnType<typeof parseGeminiJsonl>;\n },\n clearSessionOnMissingSession = false,\n isRetry = false,\n ): AdapterExecutionResult => {\n const authMeta = detectGeminiAuthRequired({\n parsed: attempt.parsed.resultEvent,\n stdout: attempt.proc.stdout,\n stderr: attempt.proc.stderr,\n });\n\n if (attempt.proc.timedOut) {\n return {\n exitCode: attempt.proc.exitCode,\n signal: attempt.proc.signal,\n timedOut: true,\n errorMessage: `Timed out after ${timeoutSec}s`,\n errorCode: authMeta.requiresAuth ? \"gemini_auth_required\" : null,\n clearSession: clearSessionOnMissingSession,\n };\n }\n\n const clearSessionForTurnLimit = isGeminiTurnLimitResult(attempt.parsed.resultEvent, attempt.proc.exitCode);\n\n // On retry, don't fall back to old session ID \u2014 the old session was stale\n const canFallbackToRuntimeSession = !isRetry;\n const resolvedSessionId = attempt.parsed.sessionId\n ?? (canFallbackToRuntimeSession ? (runtimeSessionId ?? runtime.sessionId ?? null) : null);\n const resolvedSessionParams = resolvedSessionId\n ? ({\n sessionId: resolvedSessionId,\n cwd,\n ...(workspaceId ? { workspaceId } : {}),\n ...(workspaceRepoUrl ? { repoUrl: workspaceRepoUrl } : {}),\n ...(workspaceRepoRef ? { repoRef: workspaceRepoRef } : {}),\n } as Record<string, unknown>)\n : null;\n const parsedError = typeof attempt.parsed.errorMessage === \"string\" ? attempt.parsed.errorMessage.trim() : \"\";\n const stderrLine = firstNonEmptyLine(attempt.proc.stderr);\n const structuredFailure = attempt.parsed.resultEvent\n ? describeGeminiFailure(attempt.parsed.resultEvent)\n : null;\n const fallbackErrorMessage =\n parsedError ||\n structuredFailure ||\n stderrLine ||\n `Gemini exited with code ${attempt.proc.exitCode ?? -1}`;\n\n return {\n exitCode: attempt.proc.exitCode,\n signal: attempt.proc.signal,\n timedOut: false,\n errorMessage: (attempt.proc.exitCode ?? 0) === 0 ? null : fallbackErrorMessage,\n errorCode: (attempt.proc.exitCode ?? 0) !== 0 && authMeta.requiresAuth ? \"gemini_auth_required\" : null,\n usage: attempt.parsed.usage,\n sessionId: resolvedSessionId,\n sessionParams: resolvedSessionParams,\n sessionDisplayId: resolvedSessionId,\n provider: \"google\",\n biller: \"google\",\n model,\n billingType,\n costUsd: attempt.parsed.costUsd,\n resultJson: attempt.parsed.resultEvent ?? {\n stdout: attempt.proc.stdout,\n stderr: attempt.proc.stderr,\n },\n summary: attempt.parsed.summary,\n question: attempt.parsed.question,\n clearSession: clearSessionForTurnLimit || Boolean(clearSessionOnMissingSession && !resolvedSessionId),\n };\n };\n\n const initial = await runAttempt(sessionId);\n if (\n sessionId &&\n !initial.proc.timedOut &&\n (initial.proc.exitCode ?? 0) !== 0 &&\n isGeminiUnknownSessionError(initial.proc.stdout, initial.proc.stderr)\n ) {\n await onLog(\n \"stdout\",\n `[paperclip] Gemini resume session \"${sessionId}\" is unavailable; retrying with a fresh session.\\n`,\n );\n const retry = await runAttempt(null);\n return toResult(retry, true, true);\n }\n\n return toResult(initial);\n}\n", "export const type = \"gemini_local\";\nexport const label = \"Gemini CLI (local)\";\nexport const DEFAULT_GEMINI_LOCAL_MODEL = \"auto\";\n\nexport const models = [\n { id: DEFAULT_GEMINI_LOCAL_MODEL, label: \"Auto\" },\n { id: \"gemini-2.5-pro\", label: \"Gemini 2.5 Pro\" },\n { id: \"gemini-2.5-flash\", label: \"Gemini 2.5 Flash\" },\n { id: \"gemini-2.5-flash-lite\", label: \"Gemini 2.5 Flash Lite\" },\n { id: \"gemini-2.0-flash\", label: \"Gemini 2.0 Flash\" },\n { id: \"gemini-2.0-flash-lite\", label: \"Gemini 2.0 Flash Lite\" },\n];\n\nexport const agentConfigurationDoc = `# gemini_local agent configuration\n\nAdapter: gemini_local\n\nUse when:\n- You want Paperclip to run the Gemini CLI locally on the host machine\n- You want Gemini chat sessions resumed across heartbeats with --resume\n- You want Paperclip skills injected locally without polluting the global environment\n\nDon't use when:\n- You need webhook-style external invocation (use http or openclaw_gateway)\n- You only need a one-shot script without an AI coding agent loop (use process)\n- Gemini CLI is not installed on the machine that runs Paperclip\n\nCore fields:\n- cwd (string, optional): default absolute working directory fallback for the agent process (created if missing when possible)\n- instructionsFilePath (string, optional): absolute path to a markdown instructions file prepended to the run prompt\n- promptTemplate (string, optional): run prompt template\n- model (string, optional): Gemini model id. Defaults to auto.\n- sandbox (boolean, optional): run in sandbox mode (default: false, passes --sandbox=none)\n- command (string, optional): defaults to \"gemini\"\n- extraArgs (string[], optional): additional CLI args\n- env (object, optional): KEY=VALUE environment variables\n\nOperational fields:\n- timeoutSec (number, optional): run timeout in seconds\n- graceSec (number, optional): SIGTERM grace period in seconds\n\nNotes:\n- Runs use positional prompt arguments, not stdin.\n- Sessions resume with --resume when stored session cwd matches the current cwd.\n- Paperclip auto-injects local skills into \\`~/.gemini/skills/\\` via symlinks, so the CLI can discover both credentials and skills in their natural location.\n- Authentication can use GEMINI_API_KEY / GOOGLE_API_KEY or local Gemini CLI login.\n`;\n", "import { asNumber, asString, parseJson, parseObject } from \"@paperclipai/adapter-utils/server-utils\";\n\nfunction collectMessageText(message: unknown): string[] {\n if (typeof message === \"string\") {\n const trimmed = message.trim();\n return trimmed ? [trimmed] : [];\n }\n\n const record = parseObject(message);\n const direct = asString(record.text, \"\").trim();\n const lines: string[] = direct ? [direct] : [];\n const content = Array.isArray(record.content) ? record.content : [];\n\n for (const partRaw of content) {\n const part = parseObject(partRaw);\n const type = asString(part.type, \"\").trim();\n if (type === \"output_text\" || type === \"text\" || type === \"content\") {\n const text = asString(part.text, \"\").trim() || asString(part.content, \"\").trim();\n if (text) lines.push(text);\n }\n }\n\n return lines;\n}\n\nfunction readSessionId(event: Record<string, unknown>): string | null {\n return (\n asString(event.session_id, \"\").trim() ||\n asString(event.sessionId, \"\").trim() ||\n asString(event.sessionID, \"\").trim() ||\n asString(event.checkpoint_id, \"\").trim() ||\n asString(event.thread_id, \"\").trim() ||\n null\n );\n}\n\nfunction asErrorText(value: unknown): string {\n if (typeof value === \"string\") return value;\n const rec = parseObject(value);\n const message =\n asString(rec.message, \"\") ||\n asString(rec.error, \"\") ||\n asString(rec.code, \"\") ||\n asString(rec.detail, \"\");\n if (message) return message;\n try {\n return JSON.stringify(rec);\n } catch {\n return \"\";\n }\n}\n\nfunction accumulateUsage(\n target: { inputTokens: number; cachedInputTokens: number; outputTokens: number },\n usageRaw: unknown,\n) {\n const usage = parseObject(usageRaw);\n const usageMetadata = parseObject(usage.usageMetadata);\n const source = Object.keys(usageMetadata).length > 0 ? usageMetadata : usage;\n\n target.inputTokens += asNumber(\n source.input_tokens,\n asNumber(source.inputTokens, asNumber(source.promptTokenCount, 0)),\n );\n target.cachedInputTokens += asNumber(\n source.cached_input_tokens,\n asNumber(source.cachedInputTokens, asNumber(source.cachedContentTokenCount, 0)),\n );\n target.outputTokens += asNumber(\n source.output_tokens,\n asNumber(source.outputTokens, asNumber(source.candidatesTokenCount, 0)),\n );\n}\n\nexport function parseGeminiJsonl(stdout: string) {\n let sessionId: string | null = null;\n const messages: string[] = [];\n let errorMessage: string | null = null;\n let costUsd: number | null = null;\n let resultEvent: Record<string, unknown> | null = null;\n let question: { prompt: string; choices: Array<{ key: string; label: string; description?: string }> } | null = null;\n const usage = {\n inputTokens: 0,\n cachedInputTokens: 0,\n outputTokens: 0,\n };\n\n for (const rawLine of stdout.split(/\\r?\\n/)) {\n const line = rawLine.trim();\n if (!line) continue;\n\n const event = parseJson(line);\n if (!event) continue;\n\n const foundSessionId = readSessionId(event);\n if (foundSessionId) sessionId = foundSessionId;\n\n const type = asString(event.type, \"\").trim();\n\n if (type === \"assistant\") {\n messages.push(...collectMessageText(event.message));\n const messageObj = parseObject(event.message);\n const content = Array.isArray(messageObj.content) ? messageObj.content : [];\n for (const partRaw of content) {\n const part = parseObject(partRaw);\n if (asString(part.type, \"\").trim() === \"question\") {\n question = {\n prompt: asString(part.prompt, \"\").trim(),\n choices: (Array.isArray(part.choices) ? part.choices : []).map((choiceRaw) => {\n const choice = parseObject(choiceRaw);\n return {\n key: asString(choice.key, \"\").trim(),\n label: asString(choice.label, \"\").trim(),\n description: asString(choice.description, \"\").trim() || undefined,\n };\n }),\n };\n break; // only one question per message\n }\n }\n continue;\n }\n\n if (type === \"result\") {\n resultEvent = event;\n accumulateUsage(usage, event.usage ?? event.usageMetadata);\n const resultText =\n asString(event.result, \"\").trim() ||\n asString(event.text, \"\").trim() ||\n asString(event.response, \"\").trim();\n if (resultText && messages.length === 0) messages.push(resultText);\n costUsd = asNumber(event.total_cost_usd, asNumber(event.cost_usd, asNumber(event.cost, costUsd ?? 0))) || costUsd;\n const isError = event.is_error === true || asString(event.subtype, \"\").toLowerCase() === \"error\";\n if (isError) {\n const text = asErrorText(event.error ?? event.message ?? event.result).trim();\n if (text) errorMessage = text;\n }\n continue;\n }\n\n if (type === \"error\") {\n const text = asErrorText(event.error ?? event.message ?? event.detail).trim();\n if (text) errorMessage = text;\n continue;\n }\n\n if (type === \"system\") {\n const subtype = asString(event.subtype, \"\").trim().toLowerCase();\n if (subtype === \"error\") {\n const text = asErrorText(event.error ?? event.message ?? event.detail).trim();\n if (text) errorMessage = text;\n }\n continue;\n }\n\n if (type === \"text\") {\n const part = parseObject(event.part);\n const text = asString(part.text, \"\").trim();\n if (text) messages.push(text);\n continue;\n }\n\n if (type === \"step_finish\" || event.usage || event.usageMetadata) {\n accumulateUsage(usage, event.usage ?? event.usageMetadata);\n costUsd = asNumber(event.total_cost_usd, asNumber(event.cost_usd, asNumber(event.cost, costUsd ?? 0))) || costUsd;\n continue;\n }\n }\n\n return {\n sessionId,\n summary: messages.join(\"\\n\\n\").trim(),\n usage,\n costUsd,\n errorMessage,\n resultEvent,\n question,\n };\n}\n\nexport function isGeminiUnknownSessionError(stdout: string, stderr: string): boolean {\n const haystack = `${stdout}\\n${stderr}`\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean)\n .join(\"\\n\");\n\n return /unknown\\s+session|session\\s+.*\\s+not\\s+found|resume\\s+.*\\s+not\\s+found|checkpoint\\s+.*\\s+not\\s+found|cannot\\s+resume|failed\\s+to\\s+resume/i.test(\n haystack,\n );\n}\n\nfunction extractGeminiErrorMessages(parsed: Record<string, unknown>): string[] {\n const messages: string[] = [];\n const errorMsg = asString(parsed.error, \"\").trim();\n if (errorMsg) messages.push(errorMsg);\n\n const raw = Array.isArray(parsed.errors) ? parsed.errors : [];\n for (const entry of raw) {\n if (typeof entry === \"string\") {\n const msg = entry.trim();\n if (msg) messages.push(msg);\n continue;\n }\n if (typeof entry !== \"object\" || entry === null || Array.isArray(entry)) continue;\n const obj = entry as Record<string, unknown>;\n const msg = asString(obj.message, \"\") || asString(obj.error, \"\") || asString(obj.code, \"\");\n if (msg) {\n messages.push(msg);\n continue;\n }\n try {\n messages.push(JSON.stringify(obj));\n } catch {\n // skip non-serializable entry\n }\n }\n\n return messages;\n}\n\nexport function describeGeminiFailure(parsed: Record<string, unknown>): string | null {\n const status = asString(parsed.status, \"\");\n const errors = extractGeminiErrorMessages(parsed);\n\n const detail = errors[0] ?? \"\";\n const parts = [\"Gemini run failed\"];\n if (status) parts.push(`status=${status}`);\n if (detail) parts.push(detail);\n return parts.length > 1 ? parts.join(\": \") : null;\n}\n\nconst GEMINI_AUTH_REQUIRED_RE = /(?:not\\s+authenticated|please\\s+authenticate|api[_ ]?key\\s+(?:required|missing|invalid)|authentication\\s+required|unauthorized|invalid\\s+credentials|not\\s+logged\\s+in|login\\s+required|run\\s+`?gemini\\s+auth(?:\\s+login)?`?\\s+first)/i;\nconst GEMINI_QUOTA_EXHAUSTED_RE =\n /(?:resource_exhausted|quota|rate[-\\s]?limit|too many requests|\\b429\\b|billing details)/i;\n\nexport function detectGeminiAuthRequired(input: {\n parsed: Record<string, unknown> | null;\n stdout: string;\n stderr: string;\n}): { requiresAuth: boolean } {\n const errors = extractGeminiErrorMessages(input.parsed ?? {});\n const messages = [...errors, input.stdout, input.stderr]\n .join(\"\\n\")\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean);\n\n const requiresAuth = messages.some((line) => GEMINI_AUTH_REQUIRED_RE.test(line));\n return { requiresAuth };\n}\n\nexport function detectGeminiQuotaExhausted(input: {\n parsed: Record<string, unknown> | null;\n stdout: string;\n stderr: string;\n}): { exhausted: boolean } {\n const errors = extractGeminiErrorMessages(input.parsed ?? {});\n const messages = [...errors, input.stdout, input.stderr]\n .join(\"\\n\")\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean);\n\n const exhausted = messages.some((line) => GEMINI_QUOTA_EXHAUSTED_RE.test(line));\n return { exhausted };\n}\n\nexport function isGeminiTurnLimitResult(\n parsed: Record<string, unknown> | null | undefined,\n exitCode?: number | null,\n): boolean {\n if (exitCode === 53) return true;\n if (!parsed) return false;\n\n const status = asString(parsed.status, \"\").trim().toLowerCase();\n if (status === \"turn_limit\" || status === \"max_turns\") return true;\n\n const error = asString(parsed.error, \"\").trim();\n return /turn\\s*limit|max(?:imum)?\\s+turns?/i.test(error);\n}\n", "export function firstNonEmptyLine(text: string): string {\n return (\n text\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .find(Boolean) ?? \"\"\n );\n}\n", "import fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type {\n AdapterSkillContext,\n AdapterSkillSnapshot,\n} from \"@paperclipai/adapter-utils\";\nimport {\n buildPersistentSkillSnapshot,\n ensurePaperclipSkillSymlink,\n readPaperclipRuntimeSkillEntries,\n readInstalledSkillTargets,\n resolvePaperclipDesiredSkillNames,\n} from \"@paperclipai/adapter-utils/server-utils\";\n\nconst __moduleDir = path.dirname(fileURLToPath(import.meta.url));\n\nfunction asString(value: unknown): string | null {\n return typeof value === \"string\" && value.trim().length > 0 ? value.trim() : null;\n}\n\nfunction resolveGeminiSkillsHome(config: Record<string, unknown>) {\n const env =\n typeof config.env === \"object\" && config.env !== null && !Array.isArray(config.env)\n ? (config.env as Record<string, unknown>)\n : {};\n const configuredHome = asString(env.HOME);\n const home = configuredHome ? path.resolve(configuredHome) : os.homedir();\n return path.join(home, \".gemini\", \"skills\");\n}\n\nasync function buildGeminiSkillSnapshot(config: Record<string, unknown>): Promise<AdapterSkillSnapshot> {\n const availableEntries = await readPaperclipRuntimeSkillEntries(config, __moduleDir);\n const desiredSkills = resolvePaperclipDesiredSkillNames(config, availableEntries);\n const skillsHome = resolveGeminiSkillsHome(config);\n const installed = await readInstalledSkillTargets(skillsHome);\n return buildPersistentSkillSnapshot({\n adapterType: \"gemini_local\",\n availableEntries,\n desiredSkills,\n installed,\n skillsHome,\n locationLabel: \"~/.gemini/skills\",\n missingDetail: \"Configured but not currently linked into the Gemini skills home.\",\n externalConflictDetail: \"Skill name is occupied by an external installation.\",\n externalDetail: \"Installed outside Paperclip management.\",\n });\n}\n\nexport async function listGeminiSkills(ctx: AdapterSkillContext): Promise<AdapterSkillSnapshot> {\n return buildGeminiSkillSnapshot(ctx.config);\n}\n\nexport async function syncGeminiSkills(\n ctx: AdapterSkillContext,\n desiredSkills: string[],\n): Promise<AdapterSkillSnapshot> {\n const availableEntries = await readPaperclipRuntimeSkillEntries(ctx.config, __moduleDir);\n const desiredSet = new Set([\n ...desiredSkills,\n ...availableEntries.filter((entry) => entry.required).map((entry) => entry.key),\n ]);\n const skillsHome = resolveGeminiSkillsHome(ctx.config);\n await fs.mkdir(skillsHome, { recursive: true });\n const installed = await readInstalledSkillTargets(skillsHome);\n const availableByRuntimeName = new Map(availableEntries.map((entry) => [entry.runtimeName, entry]));\n\n for (const available of availableEntries) {\n if (!desiredSet.has(available.key)) continue;\n const target = path.join(skillsHome, available.runtimeName);\n await ensurePaperclipSkillSymlink(available.source, target);\n }\n\n for (const [name, installedEntry] of installed.entries()) {\n const available = availableByRuntimeName.get(name);\n if (!available) continue;\n if (desiredSet.has(available.key)) continue;\n if (installedEntry.targetPath !== available.source) continue;\n await fs.unlink(path.join(skillsHome, name)).catch(() => {});\n }\n\n return buildGeminiSkillSnapshot(ctx.config);\n}\n\nexport function resolveGeminiDesiredSkillNames(\n config: Record<string, unknown>,\n availableEntries: Array<{ key: string; required?: boolean }>,\n) {\n return resolvePaperclipDesiredSkillNames(config, availableEntries);\n}\n", "import fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { inferOpenAiCompatibleBiller, type AdapterExecutionContext, type AdapterExecutionResult } from \"@paperclipai/adapter-utils\";\nimport {\n asString,\n asNumber,\n asStringArray,\n parseObject,\n buildPaperclipEnv,\n joinPromptSections,\n buildInvocationEnvForLogs,\n ensureAbsoluteDirectory,\n ensureCommandResolvable,\n ensurePaperclipSkillSymlink,\n ensurePathInEnv,\n resolveCommandForLogs,\n renderTemplate,\n runChildProcess,\n readPaperclipRuntimeSkillEntries,\n resolvePaperclipDesiredSkillNames,\n} from \"@paperclipai/adapter-utils/server-utils\";\nimport { isOpenCodeUnknownSessionError, parseOpenCodeJsonl } from \"./parse.js\";\nimport { ensureOpenCodeModelConfiguredAndAvailable } from \"./models.js\";\nimport { removeMaintainerOnlySkillSymlinks } from \"@paperclipai/adapter-utils/server-utils\";\nimport { prepareOpenCodeRuntimeConfig } from \"./runtime-config.js\";\n\nconst __moduleDir = path.dirname(fileURLToPath(import.meta.url));\n\nfunction firstNonEmptyLine(text: string): string {\n return (\n text\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .find(Boolean) ?? \"\"\n );\n}\n\nfunction parseModelProvider(model: string | null): string | null {\n if (!model) return null;\n const trimmed = model.trim();\n if (!trimmed.includes(\"/\")) return null;\n return trimmed.slice(0, trimmed.indexOf(\"/\")).trim() || null;\n}\n\nfunction resolveOpenCodeBiller(env: Record<string, string>, provider: string | null): string {\n return inferOpenAiCompatibleBiller(env, null) ?? provider ?? \"unknown\";\n}\n\nfunction claudeSkillsHome(): string {\n return path.join(os.homedir(), \".claude\", \"skills\");\n}\n\nasync function ensureOpenCodeSkillsInjected(\n onLog: AdapterExecutionContext[\"onLog\"],\n skillsEntries: Array<{ key: string; runtimeName: string; source: string }>,\n desiredSkillNames?: string[],\n) {\n const skillsHome = claudeSkillsHome();\n await fs.mkdir(skillsHome, { recursive: true });\n const desiredSet = new Set(desiredSkillNames ?? skillsEntries.map((entry) => entry.key));\n const selectedEntries = skillsEntries.filter((entry) => desiredSet.has(entry.key));\n const removedSkills = await removeMaintainerOnlySkillSymlinks(\n skillsHome,\n selectedEntries.map((entry) => entry.runtimeName),\n );\n for (const skillName of removedSkills) {\n await onLog(\n \"stderr\",\n `[paperclip] Removed maintainer-only OpenCode skill \"${skillName}\" from ${skillsHome}\\n`,\n );\n }\n for (const entry of selectedEntries) {\n const target = path.join(skillsHome, entry.runtimeName);\n\n try {\n const result = await ensurePaperclipSkillSymlink(entry.source, target);\n if (result === \"skipped\") continue;\n await onLog(\n \"stderr\",\n `[paperclip] ${result === \"repaired\" ? \"Repaired\" : \"Injected\"} OpenCode skill \"${entry.key}\" into ${skillsHome}\\n`,\n );\n } catch (err) {\n await onLog(\n \"stderr\",\n `[paperclip] Failed to inject OpenCode skill \"${entry.key}\" into ${skillsHome}: ${err instanceof Error ? err.message : String(err)}\\n`,\n );\n }\n }\n}\n\nexport async function execute(ctx: AdapterExecutionContext): Promise<AdapterExecutionResult> {\n const { runId, agent, runtime, config, context, onLog, onMeta, onSpawn, authToken } = ctx;\n\n const promptTemplate = asString(\n config.promptTemplate,\n \"You are agent {{agent.id}} ({{agent.name}}). Continue your Paperclip work.\",\n );\n const command = asString(config.command, \"opencode\");\n const model = asString(config.model, \"\").trim();\n const variant = asString(config.variant, \"\").trim();\n\n const workspaceContext = parseObject(context.paperclipWorkspace);\n const workspaceCwd = asString(workspaceContext.cwd, \"\");\n const workspaceSource = asString(workspaceContext.source, \"\");\n const workspaceId = asString(workspaceContext.workspaceId, \"\");\n const workspaceRepoUrl = asString(workspaceContext.repoUrl, \"\");\n const workspaceRepoRef = asString(workspaceContext.repoRef, \"\");\n const agentHome = asString(workspaceContext.agentHome, \"\");\n const workspaceHints = Array.isArray(context.paperclipWorkspaces)\n ? context.paperclipWorkspaces.filter(\n (value): value is Record<string, unknown> => typeof value === \"object\" && value !== null,\n )\n : [];\n const configuredCwd = asString(config.cwd, \"\");\n const useConfiguredInsteadOfAgentHome = workspaceSource === \"agent_home\" && configuredCwd.length > 0;\n const effectiveWorkspaceCwd = useConfiguredInsteadOfAgentHome ? \"\" : workspaceCwd;\n const cwd = effectiveWorkspaceCwd || configuredCwd || process.cwd();\n await ensureAbsoluteDirectory(cwd, { createIfMissing: true });\n const openCodeSkillEntries = await readPaperclipRuntimeSkillEntries(config, __moduleDir);\n const desiredOpenCodeSkillNames = resolvePaperclipDesiredSkillNames(config, openCodeSkillEntries);\n await ensureOpenCodeSkillsInjected(\n onLog,\n openCodeSkillEntries,\n desiredOpenCodeSkillNames,\n );\n\n const envConfig = parseObject(config.env);\n const hasExplicitApiKey =\n typeof envConfig.PAPERCLIP_API_KEY === \"string\" && envConfig.PAPERCLIP_API_KEY.trim().length > 0;\n const env: Record<string, string> = { ...buildPaperclipEnv(agent) };\n env.PAPERCLIP_RUN_ID = runId;\n const wakeTaskId =\n (typeof context.taskId === \"string\" && context.taskId.trim().length > 0 && context.taskId.trim()) ||\n (typeof context.issueId === \"string\" && context.issueId.trim().length > 0 && context.issueId.trim()) ||\n null;\n const wakeReason =\n typeof context.wakeReason === \"string\" && context.wakeReason.trim().length > 0\n ? context.wakeReason.trim()\n : null;\n const wakeCommentId =\n (typeof context.wakeCommentId === \"string\" && context.wakeCommentId.trim().length > 0 && context.wakeCommentId.trim()) ||\n (typeof context.commentId === \"string\" && context.commentId.trim().length > 0 && context.commentId.trim()) ||\n null;\n const approvalId =\n typeof context.approvalId === \"string\" && context.approvalId.trim().length > 0\n ? context.approvalId.trim()\n : null;\n const approvalStatus =\n typeof context.approvalStatus === \"string\" && context.approvalStatus.trim().length > 0\n ? context.approvalStatus.trim()\n : null;\n const linkedIssueIds = Array.isArray(context.issueIds)\n ? context.issueIds.filter((value): value is string => typeof value === \"string\" && value.trim().length > 0)\n : [];\n if (wakeTaskId) env.PAPERCLIP_TASK_ID = wakeTaskId;\n if (wakeReason) env.PAPERCLIP_WAKE_REASON = wakeReason;\n if (wakeCommentId) env.PAPERCLIP_WAKE_COMMENT_ID = wakeCommentId;\n if (approvalId) env.PAPERCLIP_APPROVAL_ID = approvalId;\n if (approvalStatus) env.PAPERCLIP_APPROVAL_STATUS = approvalStatus;\n if (linkedIssueIds.length > 0) env.PAPERCLIP_LINKED_ISSUE_IDS = linkedIssueIds.join(\",\");\n if (effectiveWorkspaceCwd) env.PAPERCLIP_WORKSPACE_CWD = effectiveWorkspaceCwd;\n if (workspaceSource) env.PAPERCLIP_WORKSPACE_SOURCE = workspaceSource;\n if (workspaceId) env.PAPERCLIP_WORKSPACE_ID = workspaceId;\n if (workspaceRepoUrl) env.PAPERCLIP_WORKSPACE_REPO_URL = workspaceRepoUrl;\n if (workspaceRepoRef) env.PAPERCLIP_WORKSPACE_REPO_REF = workspaceRepoRef;\n if (agentHome) env.AGENT_HOME = agentHome;\n if (workspaceHints.length > 0) env.PAPERCLIP_WORKSPACES_JSON = JSON.stringify(workspaceHints);\n\n for (const [key, value] of Object.entries(envConfig)) {\n if (typeof value === \"string\") env[key] = value;\n }\n // Prevent OpenCode from writing an opencode.json config file into the\n // project working directory (which would pollute the git repo). Model\n // selection is already handled via the --model CLI flag. Set after the\n // envConfig loop so user overrides cannot disable this guard.\n env.OPENCODE_DISABLE_PROJECT_CONFIG = \"true\";\n if (!hasExplicitApiKey && authToken) {\n env.PAPERCLIP_API_KEY = authToken;\n }\n const preparedRuntimeConfig = await prepareOpenCodeRuntimeConfig({ env, config });\n try {\n const runtimeEnv = Object.fromEntries(\n Object.entries(ensurePathInEnv({ ...process.env, ...preparedRuntimeConfig.env })).filter(\n (entry): entry is [string, string] => typeof entry[1] === \"string\",\n ),\n );\n await ensureCommandResolvable(command, cwd, runtimeEnv);\n const resolvedCommand = await resolveCommandForLogs(command, cwd, runtimeEnv);\n const loggedEnv = buildInvocationEnvForLogs(preparedRuntimeConfig.env, {\n runtimeEnv,\n includeRuntimeKeys: [\"HOME\"],\n resolvedCommand,\n });\n\n await ensureOpenCodeModelConfiguredAndAvailable({\n model,\n command,\n cwd,\n env: runtimeEnv,\n });\n\n const timeoutSec = asNumber(config.timeoutSec, 0);\n const graceSec = asNumber(config.graceSec, 20);\n const extraArgs = (() => {\n const fromExtraArgs = asStringArray(config.extraArgs);\n if (fromExtraArgs.length > 0) return fromExtraArgs;\n return asStringArray(config.args);\n })();\n\n const runtimeSessionParams = parseObject(runtime.sessionParams);\n const runtimeSessionId = asString(runtimeSessionParams.sessionId, runtime.sessionId ?? \"\");\n const runtimeSessionCwd = asString(runtimeSessionParams.cwd, \"\");\n const canResumeSession =\n runtimeSessionId.length > 0 &&\n (runtimeSessionCwd.length === 0 || path.resolve(runtimeSessionCwd) === path.resolve(cwd));\n const sessionId = canResumeSession ? runtimeSessionId : null;\n if (runtimeSessionId && !canResumeSession) {\n await onLog(\n \"stdout\",\n `[paperclip] OpenCode session \"${runtimeSessionId}\" was saved for cwd \"${runtimeSessionCwd}\" and will not be resumed in \"${cwd}\".\\n`,\n );\n }\n\n const instructionsFilePath = asString(config.instructionsFilePath, \"\").trim();\n const resolvedInstructionsFilePath = instructionsFilePath\n ? path.resolve(cwd, instructionsFilePath)\n : \"\";\n const instructionsDir = resolvedInstructionsFilePath ? `${path.dirname(resolvedInstructionsFilePath)}/` : \"\";\n let instructionsPrefix = \"\";\n if (resolvedInstructionsFilePath) {\n try {\n const instructionsContents = await fs.readFile(resolvedInstructionsFilePath, \"utf8\");\n instructionsPrefix =\n `${instructionsContents}\\n\\n` +\n `The above agent instructions were loaded from ${resolvedInstructionsFilePath}. ` +\n `Resolve any relative file references from ${instructionsDir}.\\n\\n`;\n } catch (err) {\n const reason = err instanceof Error ? err.message : String(err);\n await onLog(\n \"stdout\",\n `[paperclip] Warning: could not read agent instructions file \"${resolvedInstructionsFilePath}\": ${reason}\\n`,\n );\n }\n }\n\n const commandNotes = (() => {\n const notes = [...preparedRuntimeConfig.notes];\n if (!resolvedInstructionsFilePath) return notes;\n if (instructionsPrefix.length > 0) {\n notes.push(`Loaded agent instructions from ${resolvedInstructionsFilePath}`);\n notes.push(\n `Prepended instructions + path directive to stdin prompt (relative references from ${instructionsDir}).`,\n );\n return notes;\n }\n notes.push(\n `Configured instructionsFilePath ${resolvedInstructionsFilePath}, but file could not be read; continuing without injected instructions.`,\n );\n return notes;\n })();\n\n const bootstrapPromptTemplate = asString(config.bootstrapPromptTemplate, \"\");\n const templateData = {\n agentId: agent.id,\n companyId: agent.companyId,\n runId,\n company: { id: agent.companyId },\n agent,\n run: { id: runId, source: \"on_demand\" },\n context,\n };\n const renderedPrompt = renderTemplate(promptTemplate, templateData);\n const renderedBootstrapPrompt =\n !sessionId && bootstrapPromptTemplate.trim().length > 0\n ? renderTemplate(bootstrapPromptTemplate, templateData).trim()\n : \"\";\n const sessionHandoffNote = asString(context.paperclipSessionHandoffMarkdown, \"\").trim();\n const prompt = joinPromptSections([\n instructionsPrefix,\n renderedBootstrapPrompt,\n sessionHandoffNote,\n renderedPrompt,\n ]);\n const promptMetrics = {\n promptChars: prompt.length,\n instructionsChars: instructionsPrefix.length,\n bootstrapPromptChars: renderedBootstrapPrompt.length,\n sessionHandoffChars: sessionHandoffNote.length,\n heartbeatPromptChars: renderedPrompt.length,\n };\n\n const buildArgs = (resumeSessionId: string | null) => {\n const args = [\"run\", \"--format\", \"json\"];\n if (resumeSessionId) args.push(\"--session\", resumeSessionId);\n if (model) args.push(\"--model\", model);\n if (variant) args.push(\"--variant\", variant);\n if (extraArgs.length > 0) args.push(...extraArgs);\n return args;\n };\n\n const runAttempt = async (resumeSessionId: string | null) => {\n const args = buildArgs(resumeSessionId);\n if (onMeta) {\n await onMeta({\n adapterType: \"opencode_local\",\n command: resolvedCommand,\n cwd,\n commandNotes,\n commandArgs: [...args, `<stdin prompt ${prompt.length} chars>`],\n env: loggedEnv,\n prompt,\n promptMetrics,\n context,\n });\n }\n\n const proc = await runChildProcess(runId, command, args, {\n cwd,\n env: runtimeEnv,\n stdin: prompt,\n timeoutSec,\n graceSec,\n onSpawn,\n onLog,\n });\n return {\n proc,\n rawStderr: proc.stderr,\n parsed: parseOpenCodeJsonl(proc.stdout),\n };\n };\n\n const toResult = (\n attempt: {\n proc: { exitCode: number | null; signal: string | null; timedOut: boolean; stdout: string; stderr: string };\n rawStderr: string;\n parsed: ReturnType<typeof parseOpenCodeJsonl>;\n },\n clearSessionOnMissingSession = false,\n ): AdapterExecutionResult => {\n if (attempt.proc.timedOut) {\n return {\n exitCode: attempt.proc.exitCode,\n signal: attempt.proc.signal,\n timedOut: true,\n errorMessage: `Timed out after ${timeoutSec}s`,\n clearSession: clearSessionOnMissingSession,\n };\n }\n\n const resolvedSessionId =\n attempt.parsed.sessionId ??\n (clearSessionOnMissingSession ? null : runtimeSessionId ?? runtime.sessionId ?? null);\n const resolvedSessionParams = resolvedSessionId\n ? ({\n sessionId: resolvedSessionId,\n cwd,\n ...(workspaceId ? { workspaceId } : {}),\n ...(workspaceRepoUrl ? { repoUrl: workspaceRepoUrl } : {}),\n ...(workspaceRepoRef ? { repoRef: workspaceRepoRef } : {}),\n } as Record<string, unknown>)\n : null;\n\n const parsedError = typeof attempt.parsed.errorMessage === \"string\" ? attempt.parsed.errorMessage.trim() : \"\";\n const stderrLine = firstNonEmptyLine(attempt.proc.stderr);\n const rawExitCode = attempt.proc.exitCode;\n const synthesizedExitCode = parsedError && (rawExitCode ?? 0) === 0 ? 1 : rawExitCode;\n const fallbackErrorMessage =\n parsedError ||\n stderrLine ||\n `OpenCode exited with code ${synthesizedExitCode ?? -1}`;\n const modelId = model || null;\n\n return {\n exitCode: synthesizedExitCode,\n signal: attempt.proc.signal,\n timedOut: false,\n errorMessage: (synthesizedExitCode ?? 0) === 0 ? null : fallbackErrorMessage,\n usage: {\n inputTokens: attempt.parsed.usage.inputTokens,\n outputTokens: attempt.parsed.usage.outputTokens,\n cachedInputTokens: attempt.parsed.usage.cachedInputTokens,\n },\n sessionId: resolvedSessionId,\n sessionParams: resolvedSessionParams,\n sessionDisplayId: resolvedSessionId,\n provider: parseModelProvider(modelId),\n biller: resolveOpenCodeBiller(runtimeEnv, parseModelProvider(modelId)),\n model: modelId,\n billingType: \"unknown\",\n costUsd: attempt.parsed.costUsd,\n resultJson: {\n stdout: attempt.proc.stdout,\n stderr: attempt.proc.stderr,\n },\n summary: attempt.parsed.summary,\n clearSession: Boolean(clearSessionOnMissingSession && !attempt.parsed.sessionId),\n };\n };\n\n const initial = await runAttempt(sessionId);\n const initialFailed =\n !initial.proc.timedOut && ((initial.proc.exitCode ?? 0) !== 0 || Boolean(initial.parsed.errorMessage));\n if (\n sessionId &&\n initialFailed &&\n isOpenCodeUnknownSessionError(initial.proc.stdout, initial.rawStderr)\n ) {\n await onLog(\n \"stdout\",\n `[paperclip] OpenCode session \"${sessionId}\" is unavailable; retrying with a fresh session.\\n`,\n );\n const retry = await runAttempt(null);\n return toResult(retry, true);\n }\n\n return toResult(initial);\n } finally {\n await preparedRuntimeConfig.cleanup();\n }\n}\n", "import { asNumber, asString, parseJson, parseObject } from \"@paperclipai/adapter-utils/server-utils\";\n\nfunction errorText(value: unknown): string {\n if (typeof value === \"string\") return value;\n const rec = parseObject(value);\n const message = asString(rec.message, \"\").trim();\n if (message) return message;\n const data = parseObject(rec.data);\n const nestedMessage = asString(data.message, \"\").trim();\n if (nestedMessage) return nestedMessage;\n const name = asString(rec.name, \"\").trim();\n if (name) return name;\n const code = asString(rec.code, \"\").trim();\n if (code) return code;\n try {\n return JSON.stringify(rec);\n } catch {\n return \"\";\n }\n}\n\nexport function parseOpenCodeJsonl(stdout: string) {\n let sessionId: string | null = null;\n const messages: string[] = [];\n const errors: string[] = [];\n const usage = {\n inputTokens: 0,\n cachedInputTokens: 0,\n outputTokens: 0,\n };\n let costUsd = 0;\n\n for (const rawLine of stdout.split(/\\r?\\n/)) {\n const line = rawLine.trim();\n if (!line) continue;\n\n const event = parseJson(line);\n if (!event) continue;\n\n const currentSessionId = asString(event.sessionID, \"\").trim();\n if (currentSessionId) sessionId = currentSessionId;\n\n const type = asString(event.type, \"\");\n\n if (type === \"text\") {\n const part = parseObject(event.part);\n const text = asString(part.text, \"\").trim();\n if (text) messages.push(text);\n continue;\n }\n\n if (type === \"step_finish\") {\n const part = parseObject(event.part);\n const tokens = parseObject(part.tokens);\n const cache = parseObject(tokens.cache);\n usage.inputTokens += asNumber(tokens.input, 0);\n usage.cachedInputTokens += asNumber(cache.read, 0);\n usage.outputTokens += asNumber(tokens.output, 0) + asNumber(tokens.reasoning, 0);\n costUsd += asNumber(part.cost, 0);\n continue;\n }\n\n if (type === \"tool_use\") {\n const part = parseObject(event.part);\n const state = parseObject(part.state);\n if (asString(state.status, \"\") === \"error\") {\n const text = asString(state.error, \"\").trim();\n if (text) errors.push(text);\n }\n continue;\n }\n\n if (type === \"error\") {\n const text = errorText(event.error ?? event.message).trim();\n if (text) errors.push(text);\n continue;\n }\n }\n\n return {\n sessionId,\n summary: messages.join(\"\\n\\n\").trim(),\n usage,\n costUsd,\n errorMessage: errors.length > 0 ? errors.join(\"\\n\") : null,\n };\n}\n\nexport function isOpenCodeUnknownSessionError(stdout: string, stderr: string): boolean {\n const haystack = `${stdout}\\n${stderr}`\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean)\n .join(\"\\n\");\n\n return /unknown\\s+session|session\\b.*\\bnot\\s+found|resource\\s+not\\s+found:.*[\\\\/]session[\\\\/].*\\.json|notfounderror|no session/i.test(\n haystack,\n );\n}\n", "import { createHash } from \"node:crypto\";\nimport os from \"node:os\";\nimport type { AdapterModel } from \"@paperclipai/adapter-utils\";\nimport {\n asString,\n ensurePathInEnv,\n runChildProcess,\n} from \"@paperclipai/adapter-utils/server-utils\";\n\nconst MODELS_CACHE_TTL_MS = 60_000;\nconst MODELS_DISCOVERY_TIMEOUT_MS = 20_000;\n\nfunction resolveOpenCodeCommand(input: unknown): string {\n const envOverride =\n typeof process.env.PAPERCLIP_OPENCODE_COMMAND === \"string\" &&\n process.env.PAPERCLIP_OPENCODE_COMMAND.trim().length > 0\n ? process.env.PAPERCLIP_OPENCODE_COMMAND.trim()\n : \"opencode\";\n return asString(input, envOverride);\n}\n\nconst discoveryCache = new Map<string, { expiresAt: number; models: AdapterModel[] }>();\nconst VOLATILE_ENV_KEY_PREFIXES = [\"PAPERCLIP_\", \"npm_\", \"NPM_\"] as const;\nconst VOLATILE_ENV_KEY_EXACT = new Set([\"PWD\", \"OLDPWD\", \"SHLVL\", \"_\", \"TERM_SESSION_ID\", \"HOME\"]);\n\nfunction dedupeModels(models: AdapterModel[]): AdapterModel[] {\n const seen = new Set<string>();\n const deduped: AdapterModel[] = [];\n for (const model of models) {\n const id = model.id.trim();\n if (!id || seen.has(id)) continue;\n seen.add(id);\n deduped.push({ id, label: model.label.trim() || id });\n }\n return deduped;\n}\n\nfunction sortModels(models: AdapterModel[]): AdapterModel[] {\n return [...models].sort((a, b) =>\n a.id.localeCompare(b.id, \"en\", { numeric: true, sensitivity: \"base\" }),\n );\n}\n\nfunction firstNonEmptyLine(text: string): string {\n return (\n text\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .find(Boolean) ?? \"\"\n );\n}\n\nfunction parseModelsOutput(stdout: string): AdapterModel[] {\n const parsed: AdapterModel[] = [];\n for (const raw of stdout.split(/\\r?\\n/)) {\n const line = raw.trim();\n if (!line) continue;\n const firstToken = line.split(/\\s+/)[0]?.trim() ?? \"\";\n if (!firstToken.includes(\"/\")) continue;\n const provider = firstToken.slice(0, firstToken.indexOf(\"/\")).trim();\n const model = firstToken.slice(firstToken.indexOf(\"/\") + 1).trim();\n if (!provider || !model) continue;\n parsed.push({ id: `${provider}/${model}`, label: `${provider}/${model}` });\n }\n return dedupeModels(parsed);\n}\n\nfunction normalizeEnv(input: unknown): Record<string, string> {\n const envInput = typeof input === \"object\" && input !== null && !Array.isArray(input)\n ? (input as Record<string, unknown>)\n : {};\n const env: Record<string, string> = {};\n for (const [key, value] of Object.entries(envInput)) {\n if (typeof value === \"string\") env[key] = value;\n }\n return env;\n}\n\nfunction isVolatileEnvKey(key: string): boolean {\n if (VOLATILE_ENV_KEY_EXACT.has(key)) return true;\n return VOLATILE_ENV_KEY_PREFIXES.some((prefix) => key.startsWith(prefix));\n}\n\nfunction hashValue(value: string): string {\n return createHash(\"sha256\").update(value).digest(\"hex\");\n}\n\nfunction discoveryCacheKey(command: string, cwd: string, env: Record<string, string>) {\n const envKey = Object.entries(env)\n .filter(([key]) => !isVolatileEnvKey(key))\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([key, value]) => `${key}=${hashValue(value)}`)\n .join(\"\\n\");\n return `${command}\\n${cwd}\\n${envKey}`;\n}\n\nfunction pruneExpiredDiscoveryCache(now: number) {\n for (const [key, value] of discoveryCache.entries()) {\n if (value.expiresAt <= now) discoveryCache.delete(key);\n }\n}\n\nexport async function discoverOpenCodeModels(input: {\n command?: unknown;\n cwd?: unknown;\n env?: unknown;\n} = {}): Promise<AdapterModel[]> {\n const command = resolveOpenCodeCommand(input.command);\n const cwd = asString(input.cwd, process.cwd());\n const env = normalizeEnv(input.env);\n // Ensure HOME points to the actual running user's home directory.\n // When the server is started via `runuser -u <user>`, HOME may still\n // reflect the parent process (e.g. /root), causing OpenCode to miss\n // provider auth credentials stored under the target user's home.\n let resolvedHome: string | undefined;\n try {\n resolvedHome = os.userInfo().homedir || undefined;\n } catch {\n // os.userInfo() throws a SystemError when the current UID has no\n // /etc/passwd entry (e.g. `docker run --user 1234` with a minimal\n // image). Fall back to process.env.HOME.\n }\n // Prevent OpenCode from writing an opencode.json into the working directory.\n const runtimeEnv = normalizeEnv(ensurePathInEnv({ ...process.env, ...env, ...(resolvedHome ? { HOME: resolvedHome } : {}), OPENCODE_DISABLE_PROJECT_CONFIG: \"true\" }));\n\n const result = await runChildProcess(\n `opencode-models-${Date.now()}-${Math.random().toString(16).slice(2)}`,\n command,\n [\"models\"],\n {\n cwd,\n env: runtimeEnv,\n timeoutSec: MODELS_DISCOVERY_TIMEOUT_MS / 1000,\n graceSec: 3,\n onLog: async () => {},\n },\n );\n\n if (result.timedOut) {\n throw new Error(`\\`opencode models\\` timed out after ${MODELS_DISCOVERY_TIMEOUT_MS / 1000}s.`);\n }\n if ((result.exitCode ?? 1) !== 0) {\n const detail = firstNonEmptyLine(result.stderr) || firstNonEmptyLine(result.stdout);\n throw new Error(detail ? `\\`opencode models\\` failed: ${detail}` : \"`opencode models` failed.\");\n }\n\n return sortModels(parseModelsOutput(result.stdout));\n}\n\nexport async function discoverOpenCodeModelsCached(input: {\n command?: unknown;\n cwd?: unknown;\n env?: unknown;\n} = {}): Promise<AdapterModel[]> {\n const command = resolveOpenCodeCommand(input.command);\n const cwd = asString(input.cwd, process.cwd());\n const env = normalizeEnv(input.env);\n const key = discoveryCacheKey(command, cwd, env);\n const now = Date.now();\n pruneExpiredDiscoveryCache(now);\n const cached = discoveryCache.get(key);\n if (cached && cached.expiresAt > now) return cached.models;\n\n const models = await discoverOpenCodeModels({ command, cwd, env });\n discoveryCache.set(key, { expiresAt: now + MODELS_CACHE_TTL_MS, models });\n return models;\n}\n\nexport async function ensureOpenCodeModelConfiguredAndAvailable(input: {\n model?: unknown;\n command?: unknown;\n cwd?: unknown;\n env?: unknown;\n}): Promise<AdapterModel[]> {\n const model = asString(input.model, \"\").trim();\n if (!model) {\n throw new Error(\"OpenCode requires `adapterConfig.model` in provider/model format.\");\n }\n\n const models = await discoverOpenCodeModelsCached({\n command: input.command,\n cwd: input.cwd,\n env: input.env,\n });\n\n if (models.length === 0) {\n throw new Error(\"OpenCode returned no models. Run `opencode models` and verify provider auth.\");\n }\n\n if (!models.some((entry) => entry.id === model)) {\n const sample = models.slice(0, 12).map((entry) => entry.id).join(\", \");\n throw new Error(\n `Configured OpenCode model is unavailable: ${model}. Available models: ${sample}${models.length > 12 ? \", ...\" : \"\"}`,\n );\n }\n\n return models;\n}\n\nexport async function listOpenCodeModels(): Promise<AdapterModel[]> {\n try {\n return await discoverOpenCodeModelsCached();\n } catch {\n return [];\n }\n}\n\nexport function resetOpenCodeModelsCacheForTests() {\n discoveryCache.clear();\n}\n", "import fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { asBoolean } from \"@paperclipai/adapter-utils/server-utils\";\n\ntype PreparedOpenCodeRuntimeConfig = {\n env: Record<string, string>;\n notes: string[];\n cleanup: () => Promise<void>;\n};\n\nfunction resolveXdgConfigHome(env: Record<string, string>): string {\n return (\n (typeof env.XDG_CONFIG_HOME === \"string\" && env.XDG_CONFIG_HOME.trim()) ||\n (typeof process.env.XDG_CONFIG_HOME === \"string\" && process.env.XDG_CONFIG_HOME.trim()) ||\n path.join(os.homedir(), \".config\")\n );\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nasync function readJsonObject(filepath: string): Promise<Record<string, unknown>> {\n try {\n const raw = await fs.readFile(filepath, \"utf8\");\n const parsed = JSON.parse(raw);\n return isPlainObject(parsed) ? parsed : {};\n } catch {\n return {};\n }\n}\n\nexport async function prepareOpenCodeRuntimeConfig(input: {\n env: Record<string, string>;\n config: Record<string, unknown>;\n}): Promise<PreparedOpenCodeRuntimeConfig> {\n const skipPermissions = asBoolean(input.config.dangerouslySkipPermissions, true);\n if (!skipPermissions) {\n return {\n env: input.env,\n notes: [],\n cleanup: async () => {},\n };\n }\n\n const sourceConfigDir = path.join(resolveXdgConfigHome(input.env), \"opencode\");\n const runtimeConfigHome = await fs.mkdtemp(path.join(os.tmpdir(), \"paperclip-opencode-config-\"));\n const runtimeConfigDir = path.join(runtimeConfigHome, \"opencode\");\n const runtimeConfigPath = path.join(runtimeConfigDir, \"opencode.json\");\n\n await fs.mkdir(runtimeConfigDir, { recursive: true });\n try {\n await fs.cp(sourceConfigDir, runtimeConfigDir, {\n recursive: true,\n force: true,\n errorOnExist: false,\n dereference: false,\n });\n } catch (err) {\n if ((err as NodeJS.ErrnoException | null)?.code !== \"ENOENT\") {\n throw err;\n }\n }\n\n const existingConfig = await readJsonObject(runtimeConfigPath);\n const existingPermission = isPlainObject(existingConfig.permission)\n ? existingConfig.permission\n : {};\n const nextConfig = {\n ...existingConfig,\n permission: {\n ...existingPermission,\n external_directory: \"allow\",\n },\n };\n await fs.writeFile(runtimeConfigPath, `${JSON.stringify(nextConfig, null, 2)}\\n`, \"utf8\");\n\n return {\n env: {\n ...input.env,\n XDG_CONFIG_HOME: runtimeConfigHome,\n },\n notes: [\n \"Injected runtime OpenCode config with permission.external_directory=allow to avoid headless approval prompts.\",\n ],\n cleanup: async () => {\n await fs.rm(runtimeConfigHome, { recursive: true, force: true });\n },\n };\n}\n", "import fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type {\n AdapterSkillContext,\n AdapterSkillSnapshot,\n} from \"@paperclipai/adapter-utils\";\nimport {\n buildPersistentSkillSnapshot,\n ensurePaperclipSkillSymlink,\n readPaperclipRuntimeSkillEntries,\n readInstalledSkillTargets,\n resolvePaperclipDesiredSkillNames,\n} from \"@paperclipai/adapter-utils/server-utils\";\n\nconst __moduleDir = path.dirname(fileURLToPath(import.meta.url));\n\nfunction asString(value: unknown): string | null {\n return typeof value === \"string\" && value.trim().length > 0 ? value.trim() : null;\n}\n\nfunction resolveOpenCodeSkillsHome(config: Record<string, unknown>) {\n const env =\n typeof config.env === \"object\" && config.env !== null && !Array.isArray(config.env)\n ? (config.env as Record<string, unknown>)\n : {};\n const configuredHome = asString(env.HOME);\n const home = configuredHome ? path.resolve(configuredHome) : os.homedir();\n return path.join(home, \".claude\", \"skills\");\n}\n\nasync function buildOpenCodeSkillSnapshot(config: Record<string, unknown>): Promise<AdapterSkillSnapshot> {\n const availableEntries = await readPaperclipRuntimeSkillEntries(config, __moduleDir);\n const desiredSkills = resolvePaperclipDesiredSkillNames(config, availableEntries);\n const skillsHome = resolveOpenCodeSkillsHome(config);\n const installed = await readInstalledSkillTargets(skillsHome);\n return buildPersistentSkillSnapshot({\n adapterType: \"opencode_local\",\n availableEntries,\n desiredSkills,\n installed,\n skillsHome,\n locationLabel: \"~/.claude/skills\",\n installedDetail: \"Installed in the shared Claude/OpenCode skills home.\",\n missingDetail: \"Configured but not currently linked into the shared Claude/OpenCode skills home.\",\n externalConflictDetail: \"Skill name is occupied by an external installation in the shared skills home.\",\n externalDetail: \"Installed outside Paperclip management in the shared skills home.\",\n warnings: [\n \"OpenCode currently uses the shared Claude skills home (~/.claude/skills).\",\n ],\n });\n}\n\nexport async function listOpenCodeSkills(ctx: AdapterSkillContext): Promise<AdapterSkillSnapshot> {\n return buildOpenCodeSkillSnapshot(ctx.config);\n}\n\nexport async function syncOpenCodeSkills(\n ctx: AdapterSkillContext,\n desiredSkills: string[],\n): Promise<AdapterSkillSnapshot> {\n const availableEntries = await readPaperclipRuntimeSkillEntries(ctx.config, __moduleDir);\n const desiredSet = new Set([\n ...desiredSkills,\n ...availableEntries.filter((entry) => entry.required).map((entry) => entry.key),\n ]);\n const skillsHome = resolveOpenCodeSkillsHome(ctx.config);\n await fs.mkdir(skillsHome, { recursive: true });\n const installed = await readInstalledSkillTargets(skillsHome);\n const availableByRuntimeName = new Map(availableEntries.map((entry) => [entry.runtimeName, entry]));\n\n for (const available of availableEntries) {\n if (!desiredSet.has(available.key)) continue;\n const target = path.join(skillsHome, available.runtimeName);\n await ensurePaperclipSkillSymlink(available.source, target);\n }\n\n for (const [name, installedEntry] of installed.entries()) {\n const available = availableByRuntimeName.get(name);\n if (!available) continue;\n if (desiredSet.has(available.key)) continue;\n if (installedEntry.targetPath !== available.source) continue;\n await fs.unlink(path.join(skillsHome, name)).catch(() => {});\n }\n\n return buildOpenCodeSkillSnapshot(ctx.config);\n}\n\nexport function resolveOpenCodeDesiredSkillNames(\n config: Record<string, unknown>,\n availableEntries: Array<{ key: string; required?: boolean }>,\n) {\n return resolvePaperclipDesiredSkillNames(config, availableEntries);\n}\n", "import fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { inferOpenAiCompatibleBiller, type AdapterExecutionContext, type AdapterExecutionResult } from \"@paperclipai/adapter-utils\";\nimport {\n asString,\n asNumber,\n asStringArray,\n parseObject,\n buildPaperclipEnv,\n joinPromptSections,\n buildInvocationEnvForLogs,\n ensureAbsoluteDirectory,\n ensureCommandResolvable,\n ensurePaperclipSkillSymlink,\n ensurePathInEnv,\n readPaperclipRuntimeSkillEntries,\n resolveCommandForLogs,\n resolvePaperclipDesiredSkillNames,\n removeMaintainerOnlySkillSymlinks,\n renderTemplate,\n runChildProcess,\n} from \"@paperclipai/adapter-utils/server-utils\";\nimport { isPiUnknownSessionError, parsePiJsonl } from \"./parse.js\";\nimport { ensurePiModelConfiguredAndAvailable } from \"./models.js\";\n\nconst __moduleDir = path.dirname(fileURLToPath(import.meta.url));\n\nconst PAPERCLIP_SESSIONS_DIR = path.join(os.homedir(), \".pi\", \"paperclips\");\nconst PI_AGENT_SKILLS_DIR = path.join(os.homedir(), \".pi\", \"agent\", \"skills\");\n\nfunction firstNonEmptyLine(text: string): string {\n return (\n text\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .find(Boolean) ?? \"\"\n );\n}\n\nfunction parseModelProvider(model: string | null): string | null {\n if (!model) return null;\n const trimmed = model.trim();\n if (!trimmed.includes(\"/\")) return null;\n return trimmed.slice(0, trimmed.indexOf(\"/\")).trim() || null;\n}\n\nfunction parseModelId(model: string | null): string | null {\n if (!model) return null;\n const trimmed = model.trim();\n if (!trimmed.includes(\"/\")) return trimmed || null;\n return trimmed.slice(trimmed.indexOf(\"/\") + 1).trim() || null;\n}\n\nasync function ensurePiSkillsInjected(\n onLog: AdapterExecutionContext[\"onLog\"],\n skillsEntries: Array<{ key: string; runtimeName: string; source: string }>,\n desiredSkillNames?: string[],\n) {\n const desiredSet = new Set(desiredSkillNames ?? skillsEntries.map((entry) => entry.key));\n const selectedEntries = skillsEntries.filter((entry) => desiredSet.has(entry.key));\n if (selectedEntries.length === 0) return;\n await fs.mkdir(PI_AGENT_SKILLS_DIR, { recursive: true });\n const removedSkills = await removeMaintainerOnlySkillSymlinks(\n PI_AGENT_SKILLS_DIR,\n selectedEntries.map((entry) => entry.runtimeName),\n );\n for (const skillName of removedSkills) {\n await onLog(\n \"stderr\",\n `[paperclip] Removed maintainer-only Pi skill \"${skillName}\" from ${PI_AGENT_SKILLS_DIR}\\n`,\n );\n }\n\n for (const entry of selectedEntries) {\n const target = path.join(PI_AGENT_SKILLS_DIR, entry.runtimeName);\n\n try {\n const result = await ensurePaperclipSkillSymlink(entry.source, target);\n if (result === \"skipped\") continue;\n await onLog(\n \"stderr\",\n `[paperclip] ${result === \"repaired\" ? \"Repaired\" : \"Injected\"} Pi skill \"${entry.runtimeName}\" into ${PI_AGENT_SKILLS_DIR}\\n`,\n );\n } catch (err) {\n await onLog(\n \"stderr\",\n `[paperclip] Failed to inject Pi skill \"${entry.runtimeName}\" into ${PI_AGENT_SKILLS_DIR}: ${err instanceof Error ? err.message : String(err)}\\n`,\n );\n }\n }\n}\n\nfunction resolvePiBiller(env: Record<string, string>, provider: string | null): string {\n return inferOpenAiCompatibleBiller(env, null) ?? provider ?? \"unknown\";\n}\n\nasync function ensureSessionsDir(): Promise<string> {\n await fs.mkdir(PAPERCLIP_SESSIONS_DIR, { recursive: true });\n return PAPERCLIP_SESSIONS_DIR;\n}\n\nfunction buildSessionPath(agentId: string, timestamp: string): string {\n const safeTimestamp = timestamp.replace(/[:.]/g, \"-\");\n return path.join(PAPERCLIP_SESSIONS_DIR, `${safeTimestamp}-${agentId}.jsonl`);\n}\n\nexport async function execute(ctx: AdapterExecutionContext): Promise<AdapterExecutionResult> {\n const { runId, agent, runtime, config, context, onLog, onMeta, onSpawn, authToken } = ctx;\n\n const promptTemplate = asString(\n config.promptTemplate,\n \"You are agent {{agent.id}} ({{agent.name}}). Continue your Paperclip work.\",\n );\n const command = asString(config.command, \"pi\");\n const model = asString(config.model, \"\").trim();\n const thinking = asString(config.thinking, \"\").trim();\n\n // Parse model into provider and model id\n const provider = parseModelProvider(model);\n const modelId = parseModelId(model);\n\n const workspaceContext = parseObject(context.paperclipWorkspace);\n const workspaceCwd = asString(workspaceContext.cwd, \"\");\n const workspaceSource = asString(workspaceContext.source, \"\");\n const workspaceId = asString(workspaceContext.workspaceId, \"\");\n const workspaceRepoUrl = asString(workspaceContext.repoUrl, \"\");\n const workspaceRepoRef = asString(workspaceContext.repoRef, \"\");\n const agentHome = asString(workspaceContext.agentHome, \"\");\n const workspaceHints = Array.isArray(context.paperclipWorkspaces)\n ? context.paperclipWorkspaces.filter(\n (value): value is Record<string, unknown> => typeof value === \"object\" && value !== null,\n )\n : [];\n const configuredCwd = asString(config.cwd, \"\");\n const useConfiguredInsteadOfAgentHome = workspaceSource === \"agent_home\" && configuredCwd.length > 0;\n const effectiveWorkspaceCwd = useConfiguredInsteadOfAgentHome ? \"\" : workspaceCwd;\n const cwd = effectiveWorkspaceCwd || configuredCwd || process.cwd();\n await ensureAbsoluteDirectory(cwd, { createIfMissing: true });\n \n // Ensure sessions directory exists\n await ensureSessionsDir();\n \n // Inject skills\n const piSkillEntries = await readPaperclipRuntimeSkillEntries(config, __moduleDir);\n const desiredPiSkillNames = resolvePaperclipDesiredSkillNames(config, piSkillEntries);\n await ensurePiSkillsInjected(onLog, piSkillEntries, desiredPiSkillNames);\n\n // Build environment\n const envConfig = parseObject(config.env);\n const hasExplicitApiKey =\n typeof envConfig.PAPERCLIP_API_KEY === \"string\" && envConfig.PAPERCLIP_API_KEY.trim().length > 0;\n const env: Record<string, string> = { ...buildPaperclipEnv(agent) };\n env.PAPERCLIP_RUN_ID = runId;\n \n const wakeTaskId =\n (typeof context.taskId === \"string\" && context.taskId.trim().length > 0 && context.taskId.trim()) ||\n (typeof context.issueId === \"string\" && context.issueId.trim().length > 0 && context.issueId.trim()) ||\n null;\n const wakeReason =\n typeof context.wakeReason === \"string\" && context.wakeReason.trim().length > 0\n ? context.wakeReason.trim()\n : null;\n const wakeCommentId =\n (typeof context.wakeCommentId === \"string\" && context.wakeCommentId.trim().length > 0 && context.wakeCommentId.trim()) ||\n (typeof context.commentId === \"string\" && context.commentId.trim().length > 0 && context.commentId.trim()) ||\n null;\n const approvalId =\n typeof context.approvalId === \"string\" && context.approvalId.trim().length > 0\n ? context.approvalId.trim()\n : null;\n const approvalStatus =\n typeof context.approvalStatus === \"string\" && context.approvalStatus.trim().length > 0\n ? context.approvalStatus.trim()\n : null;\n const linkedIssueIds = Array.isArray(context.issueIds)\n ? context.issueIds.filter((value): value is string => typeof value === \"string\" && value.trim().length > 0)\n : [];\n \n if (wakeTaskId) env.PAPERCLIP_TASK_ID = wakeTaskId;\n if (wakeReason) env.PAPERCLIP_WAKE_REASON = wakeReason;\n if (wakeCommentId) env.PAPERCLIP_WAKE_COMMENT_ID = wakeCommentId;\n if (approvalId) env.PAPERCLIP_APPROVAL_ID = approvalId;\n if (approvalStatus) env.PAPERCLIP_APPROVAL_STATUS = approvalStatus;\n if (linkedIssueIds.length > 0) env.PAPERCLIP_LINKED_ISSUE_IDS = linkedIssueIds.join(\",\");\n if (workspaceCwd) env.PAPERCLIP_WORKSPACE_CWD = workspaceCwd;\n if (workspaceSource) env.PAPERCLIP_WORKSPACE_SOURCE = workspaceSource;\n if (workspaceId) env.PAPERCLIP_WORKSPACE_ID = workspaceId;\n if (workspaceRepoUrl) env.PAPERCLIP_WORKSPACE_REPO_URL = workspaceRepoUrl;\n if (workspaceRepoRef) env.PAPERCLIP_WORKSPACE_REPO_REF = workspaceRepoRef;\n if (agentHome) env.AGENT_HOME = agentHome;\n if (workspaceHints.length > 0) env.PAPERCLIP_WORKSPACES_JSON = JSON.stringify(workspaceHints);\n\n for (const [key, value] of Object.entries(envConfig)) {\n if (typeof value === \"string\") env[key] = value;\n }\n if (!hasExplicitApiKey && authToken) {\n env.PAPERCLIP_API_KEY = authToken;\n }\n \n const runtimeEnv = Object.fromEntries(\n Object.entries(ensurePathInEnv({ ...process.env, ...env })).filter(\n (entry): entry is [string, string] => typeof entry[1] === \"string\",\n ),\n );\n await ensureCommandResolvable(command, cwd, runtimeEnv);\n const resolvedCommand = await resolveCommandForLogs(command, cwd, runtimeEnv);\n const loggedEnv = buildInvocationEnvForLogs(env, {\n runtimeEnv,\n includeRuntimeKeys: [\"HOME\"],\n resolvedCommand,\n });\n\n // Validate model is available before execution\n await ensurePiModelConfiguredAndAvailable({\n model,\n command,\n cwd,\n env: runtimeEnv,\n });\n\n const timeoutSec = asNumber(config.timeoutSec, 0);\n const graceSec = asNumber(config.graceSec, 20);\n const extraArgs = (() => {\n const fromExtraArgs = asStringArray(config.extraArgs);\n if (fromExtraArgs.length > 0) return fromExtraArgs;\n return asStringArray(config.args);\n })();\n\n // Handle session\n const runtimeSessionParams = parseObject(runtime.sessionParams);\n const runtimeSessionId = asString(runtimeSessionParams.sessionId, runtime.sessionId ?? \"\");\n const runtimeSessionCwd = asString(runtimeSessionParams.cwd, \"\");\n const canResumeSession =\n runtimeSessionId.length > 0 &&\n (runtimeSessionCwd.length === 0 || path.resolve(runtimeSessionCwd) === path.resolve(cwd));\n const sessionPath = canResumeSession ? runtimeSessionId : buildSessionPath(agent.id, new Date().toISOString());\n \n if (runtimeSessionId && !canResumeSession) {\n await onLog(\n \"stdout\",\n `[paperclip] Pi session \"${runtimeSessionId}\" was saved for cwd \"${runtimeSessionCwd}\" and will not be resumed in \"${cwd}\".\\n`,\n );\n }\n\n // Ensure session file exists (Pi requires this on first run)\n if (!canResumeSession) {\n try {\n await fs.writeFile(sessionPath, \"\", { flag: \"wx\" });\n } catch (err) {\n // File may already exist, that's ok\n if ((err as NodeJS.ErrnoException).code !== \"EEXIST\") {\n throw err;\n }\n }\n }\n\n // Handle instructions file and build system prompt extension\n const instructionsFilePath = asString(config.instructionsFilePath, \"\").trim();\n const resolvedInstructionsFilePath = instructionsFilePath\n ? path.resolve(cwd, instructionsFilePath)\n : \"\";\n const instructionsFileDir = instructionsFilePath ? `${path.dirname(instructionsFilePath)}/` : \"\";\n \n let systemPromptExtension = \"\";\n let instructionsReadFailed = false;\n if (resolvedInstructionsFilePath) {\n try {\n const instructionsContents = await fs.readFile(resolvedInstructionsFilePath, \"utf8\");\n systemPromptExtension =\n `${instructionsContents}\\n\\n` +\n `The above agent instructions were loaded from ${resolvedInstructionsFilePath}. ` +\n `Resolve any relative file references from ${instructionsFileDir}.\\n\\n` +\n `You are agent {{agent.id}} ({{agent.name}}). Continue your Paperclip work.`;\n } catch (err) {\n instructionsReadFailed = true;\n const reason = err instanceof Error ? err.message : String(err);\n await onLog(\n \"stdout\",\n `[paperclip] Warning: could not read agent instructions file \"${resolvedInstructionsFilePath}\": ${reason}\\n`,\n );\n // Fall back to base prompt template\n systemPromptExtension = promptTemplate;\n }\n } else {\n systemPromptExtension = promptTemplate;\n }\n\n const bootstrapPromptTemplate = asString(config.bootstrapPromptTemplate, \"\");\n const templateData = {\n agentId: agent.id,\n companyId: agent.companyId,\n runId,\n company: { id: agent.companyId },\n agent,\n run: { id: runId, source: \"on_demand\" },\n context,\n };\n const renderedSystemPromptExtension = renderTemplate(systemPromptExtension, templateData);\n const renderedHeartbeatPrompt = renderTemplate(promptTemplate, templateData);\n const renderedBootstrapPrompt =\n !canResumeSession && bootstrapPromptTemplate.trim().length > 0\n ? renderTemplate(bootstrapPromptTemplate, templateData).trim()\n : \"\";\n const sessionHandoffNote = asString(context.paperclipSessionHandoffMarkdown, \"\").trim();\n const userPrompt = joinPromptSections([\n renderedBootstrapPrompt,\n sessionHandoffNote,\n renderedHeartbeatPrompt,\n ]);\n const promptMetrics = {\n systemPromptChars: renderedSystemPromptExtension.length,\n promptChars: userPrompt.length,\n bootstrapPromptChars: renderedBootstrapPrompt.length,\n sessionHandoffChars: sessionHandoffNote.length,\n heartbeatPromptChars: renderedHeartbeatPrompt.length,\n };\n\n const commandNotes = (() => {\n if (!resolvedInstructionsFilePath) return [] as string[];\n if (instructionsReadFailed) {\n return [\n `Configured instructionsFilePath ${resolvedInstructionsFilePath}, but file could not be read; continuing without injected instructions.`,\n ];\n }\n return [\n `Loaded agent instructions from ${resolvedInstructionsFilePath}`,\n `Appended instructions + path directive to system prompt (relative references from ${instructionsFileDir}).`,\n ];\n })();\n\n const buildArgs = (sessionFile: string): string[] => {\n const args: string[] = [];\n \n // Use JSON mode for structured output with print mode (non-interactive)\n args.push(\"--mode\", \"json\");\n args.push(\"-p\"); // Non-interactive mode: process prompt and exit\n \n // Use --append-system-prompt to extend Pi's default system prompt\n args.push(\"--append-system-prompt\", renderedSystemPromptExtension);\n \n if (provider) args.push(\"--provider\", provider);\n if (modelId) args.push(\"--model\", modelId);\n if (thinking) args.push(\"--thinking\", thinking);\n\n args.push(\"--tools\", \"read,bash,edit,write,grep,find,ls\");\n args.push(\"--session\", sessionFile);\n\n // Add Paperclip skills directory so Pi can load the paperclip skill\n args.push(\"--skill\", PI_AGENT_SKILLS_DIR);\n\n if (extraArgs.length > 0) args.push(...extraArgs);\n \n // Add the user prompt as the last argument\n args.push(userPrompt);\n\n return args;\n };\n\n const runAttempt = async (sessionFile: string) => {\n const args = buildArgs(sessionFile);\n if (onMeta) {\n await onMeta({\n adapterType: \"pi_local\",\n command: resolvedCommand,\n cwd,\n commandNotes,\n commandArgs: args,\n env: loggedEnv,\n prompt: userPrompt,\n promptMetrics,\n context,\n });\n }\n\n // Buffer stdout by lines to handle partial JSON chunks\n let stdoutBuffer = \"\";\n const bufferedOnLog = async (stream: \"stdout\" | \"stderr\", chunk: string) => {\n if (stream === \"stderr\") {\n // Pass stderr through immediately (not JSONL)\n await onLog(stream, chunk);\n return;\n }\n \n // Buffer stdout and emit only complete lines\n stdoutBuffer += chunk;\n const lines = stdoutBuffer.split(\"\\n\");\n // Keep the last (potentially incomplete) line in the buffer\n stdoutBuffer = lines.pop() || \"\";\n \n // Emit complete lines\n for (const line of lines) {\n if (line) {\n await onLog(stream, line + \"\\n\");\n }\n }\n };\n\n const proc = await runChildProcess(runId, command, args, {\n cwd,\n env: runtimeEnv,\n timeoutSec,\n graceSec,\n onSpawn,\n onLog: bufferedOnLog,\n });\n \n // Flush any remaining buffer content\n if (stdoutBuffer) {\n await onLog(\"stdout\", stdoutBuffer);\n }\n \n return {\n proc,\n rawStderr: proc.stderr,\n parsed: parsePiJsonl(proc.stdout),\n };\n };\n\n const toResult = (\n attempt: {\n proc: { exitCode: number | null; signal: string | null; timedOut: boolean; stdout: string; stderr: string };\n rawStderr: string;\n parsed: ReturnType<typeof parsePiJsonl>;\n },\n clearSessionOnMissingSession = false,\n ): AdapterExecutionResult => {\n if (attempt.proc.timedOut) {\n return {\n exitCode: attempt.proc.exitCode,\n signal: attempt.proc.signal,\n timedOut: true,\n errorMessage: `Timed out after ${timeoutSec}s`,\n clearSession: clearSessionOnMissingSession,\n };\n }\n\n const resolvedSessionId = clearSessionOnMissingSession ? null : sessionPath;\n const resolvedSessionParams = resolvedSessionId\n ? { sessionId: resolvedSessionId, cwd }\n : null;\n\n const stderrLine = firstNonEmptyLine(attempt.proc.stderr);\n const rawExitCode = attempt.proc.exitCode;\n const fallbackErrorMessage = stderrLine || `Pi exited with code ${rawExitCode ?? -1}`;\n\n return {\n exitCode: rawExitCode,\n signal: attempt.proc.signal,\n timedOut: false,\n errorMessage: (rawExitCode ?? 0) === 0 ? null : fallbackErrorMessage,\n usage: {\n inputTokens: attempt.parsed.usage.inputTokens,\n outputTokens: attempt.parsed.usage.outputTokens,\n cachedInputTokens: attempt.parsed.usage.cachedInputTokens,\n },\n sessionId: resolvedSessionId,\n sessionParams: resolvedSessionParams,\n sessionDisplayId: resolvedSessionId,\n provider: provider,\n biller: resolvePiBiller(runtimeEnv, provider),\n model: model,\n billingType: \"unknown\",\n costUsd: attempt.parsed.usage.costUsd,\n resultJson: {\n stdout: attempt.proc.stdout,\n stderr: attempt.proc.stderr,\n },\n summary: attempt.parsed.finalMessage ?? attempt.parsed.messages.join(\"\\n\\n\").trim(),\n clearSession: Boolean(clearSessionOnMissingSession),\n };\n };\n\n const initial = await runAttempt(sessionPath);\n const initialFailed =\n !initial.proc.timedOut && ((initial.proc.exitCode ?? 0) !== 0 || initial.parsed.errors.length > 0);\n \n if (\n canResumeSession &&\n initialFailed &&\n isPiUnknownSessionError(initial.proc.stdout, initial.rawStderr)\n ) {\n await onLog(\n \"stdout\",\n `[paperclip] Pi session \"${runtimeSessionId}\" is unavailable; retrying with a fresh session.\\n`,\n );\n const newSessionPath = buildSessionPath(agent.id, new Date().toISOString());\n try {\n await fs.writeFile(newSessionPath, \"\", { flag: \"wx\" });\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"EEXIST\") {\n throw err;\n }\n }\n const retry = await runAttempt(newSessionPath);\n return toResult(retry, true);\n }\n\n return toResult(initial);\n}\n", "import { asNumber, asString, parseJson, parseObject } from \"@paperclipai/adapter-utils/server-utils\";\n\ninterface ParsedPiOutput {\n sessionId: string | null;\n messages: string[];\n errors: string[];\n usage: {\n inputTokens: number;\n outputTokens: number;\n cachedInputTokens: number;\n costUsd: number;\n };\n finalMessage: string | null;\n toolCalls: Array<{ toolCallId: string; toolName: string; args: unknown; result: string | null; isError: boolean }>;\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return null;\n return value as Record<string, unknown>;\n}\n\nfunction extractTextContent(content: string | Array<{ type: string; text?: string }>): string {\n if (typeof content === \"string\") return content;\n if (!Array.isArray(content)) return \"\";\n return content\n .filter((c) => c.type === \"text\" && c.text)\n .map((c) => c.text!)\n .join(\"\");\n}\n\nexport function parsePiJsonl(stdout: string): ParsedPiOutput {\n const result: ParsedPiOutput = {\n sessionId: null,\n messages: [],\n errors: [],\n usage: {\n inputTokens: 0,\n outputTokens: 0,\n cachedInputTokens: 0,\n costUsd: 0,\n },\n finalMessage: null,\n toolCalls: [],\n };\n\n let currentToolCall: { toolCallId: string; toolName: string; args: unknown } | null = null;\n\n for (const rawLine of stdout.split(/\\r?\\n/)) {\n const line = rawLine.trim();\n if (!line) continue;\n\n const event = parseJson(line);\n if (!event) continue;\n\n const eventType = asString(event.type, \"\");\n\n // RPC protocol messages - skip these (internal implementation detail)\n if (eventType === \"response\" || eventType === \"extension_ui_request\" || eventType === \"extension_ui_response\" || eventType === \"extension_error\") {\n continue;\n }\n\n // Agent lifecycle\n if (eventType === \"agent_start\") {\n continue;\n }\n\n if (eventType === \"agent_end\") {\n const messages = event.messages as Array<Record<string, unknown>> | undefined;\n if (messages && messages.length > 0) {\n const lastMessage = messages[messages.length - 1];\n if (lastMessage?.role === \"assistant\") {\n const content = lastMessage.content as string | Array<{ type: string; text?: string }>;\n result.finalMessage = extractTextContent(content);\n }\n }\n continue;\n }\n\n // Turn lifecycle\n if (eventType === \"turn_start\") {\n continue;\n }\n\n if (eventType === \"turn_end\") {\n const message = asRecord(event.message);\n if (message) {\n const content = message.content as string | Array<{ type: string; text?: string }>;\n const text = extractTextContent(content);\n if (text) {\n result.finalMessage = text;\n result.messages.push(text);\n }\n \n // Extract usage and cost from assistant message\n const usage = asRecord(message.usage);\n if (usage) {\n result.usage.inputTokens += asNumber(usage.input, 0);\n result.usage.outputTokens += asNumber(usage.output, 0);\n result.usage.cachedInputTokens += asNumber(usage.cacheRead, 0);\n \n // Pi stores cost in usage.cost.total (and broken down in usage.cost.input, etc.)\n const cost = asRecord(usage.cost);\n if (cost) {\n result.usage.costUsd += asNumber(cost.total, 0);\n }\n }\n }\n \n // Tool results are in toolResults array\n const toolResults = event.toolResults as Array<Record<string, unknown>> | undefined;\n if (toolResults) {\n for (const tr of toolResults) {\n const toolCallId = asString(tr.toolCallId, \"\");\n const content = tr.content;\n const isError = tr.isError === true;\n \n // Find matching tool call by toolCallId\n const existingCall = result.toolCalls.find((tc) => tc.toolCallId === toolCallId);\n if (existingCall) {\n existingCall.result = typeof content === \"string\" ? content : JSON.stringify(content);\n existingCall.isError = isError;\n }\n }\n }\n continue;\n }\n\n // Message updates (streaming)\n if (eventType === \"message_update\") {\n const assistantEvent = asRecord(event.assistantMessageEvent);\n if (assistantEvent) {\n const msgType = asString(assistantEvent.type, \"\");\n if (msgType === \"text_delta\") {\n const delta = asString(assistantEvent.delta, \"\");\n if (delta) {\n // Append to last message or create new\n if (result.messages.length === 0) {\n result.messages.push(delta);\n } else {\n result.messages[result.messages.length - 1] += delta;\n }\n }\n }\n }\n continue;\n }\n\n // Tool execution\n if (eventType === \"tool_execution_start\") {\n const toolCallId = asString(event.toolCallId, \"\");\n const toolName = asString(event.toolName, \"\");\n const args = event.args;\n currentToolCall = { toolCallId, toolName, args };\n result.toolCalls.push({\n toolCallId,\n toolName,\n args,\n result: null,\n isError: false,\n });\n continue;\n }\n\n if (eventType === \"tool_execution_end\") {\n const toolCallId = asString(event.toolCallId, \"\");\n const toolName = asString(event.toolName, \"\");\n const toolResult = event.result;\n const isError = event.isError === true;\n \n // Find the tool call by toolCallId (not toolName, to handle multiple calls to same tool)\n const existingCall = result.toolCalls.find((tc) => tc.toolCallId === toolCallId);\n if (existingCall) {\n existingCall.result = typeof toolResult === \"string\" ? toolResult : JSON.stringify(toolResult);\n existingCall.isError = isError;\n }\n currentToolCall = null;\n continue;\n }\n\n // Usage tracking if available in the event (fallback for standalone usage events)\n if (eventType === \"usage\" || event.usage) {\n const usage = asRecord(event.usage);\n if (usage) {\n // Support both Pi format (input/output/cacheRead) and generic format (inputTokens/outputTokens/cachedInputTokens)\n result.usage.inputTokens += asNumber(usage.inputTokens ?? usage.input, 0);\n result.usage.outputTokens += asNumber(usage.outputTokens ?? usage.output, 0);\n result.usage.cachedInputTokens += asNumber(usage.cachedInputTokens ?? usage.cacheRead, 0);\n \n // Cost may be in usage.costUsd (direct) or usage.cost.total (Pi format)\n const cost = asRecord(usage.cost);\n if (cost) {\n result.usage.costUsd += asNumber(cost.total ?? usage.costUsd, 0);\n } else {\n result.usage.costUsd += asNumber(usage.costUsd, 0);\n }\n }\n }\n }\n\n return result;\n}\n\nexport function isPiUnknownSessionError(stdout: string, stderr: string): boolean {\n const haystack = `${stdout}\\n${stderr}`\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean)\n .join(\"\\n\");\n\n return /unknown\\s+session|session\\s+not\\s+found|session\\s+.*\\s+not\\s+found|no\\s+session/i.test(haystack);\n}\n", "import { createHash } from \"node:crypto\";\nimport type { AdapterModel } from \"@paperclipai/adapter-utils\";\nimport { asString, runChildProcess } from \"@paperclipai/adapter-utils/server-utils\";\n\nconst MODELS_CACHE_TTL_MS = 60_000;\n\nfunction firstNonEmptyLine(text: string): string {\n return (\n text\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .find(Boolean) ?? \"\"\n );\n}\n\nfunction parseModelsOutput(stdout: string): AdapterModel[] {\n const parsed: AdapterModel[] = [];\n const lines = stdout.split(/\\r?\\n/);\n \n // Skip header line if present\n let startIndex = 0;\n if (lines.length > 0 && (lines[0].includes(\"provider\") || lines[0].includes(\"model\"))) {\n startIndex = 1;\n }\n \n for (let i = startIndex; i < lines.length; i++) {\n const line = lines[i].trim();\n if (!line) continue;\n \n // Parse format: \"provider model context max-out thinking images\"\n // Split by 2+ spaces to handle the columnar format\n const parts = line.split(/\\s{2,}/);\n if (parts.length < 2) continue;\n \n const provider = parts[0].trim();\n const model = parts[1].trim();\n \n if (!provider || !model) continue;\n if (provider === \"provider\" && model === \"model\") continue; // Skip header\n \n const id = `${provider}/${model}`;\n parsed.push({ id, label: id });\n }\n \n return parsed;\n}\n\nfunction dedupeModels(models: AdapterModel[]): AdapterModel[] {\n const seen = new Set<string>();\n const deduped: AdapterModel[] = [];\n for (const model of models) {\n const id = model.id.trim();\n if (!id || seen.has(id)) continue;\n seen.add(id);\n deduped.push({ id, label: model.label.trim() || id });\n }\n return deduped;\n}\n\nfunction sortModels(models: AdapterModel[]): AdapterModel[] {\n return [...models].sort((a, b) =>\n a.id.localeCompare(b.id, \"en\", { numeric: true, sensitivity: \"base\" }),\n );\n}\n\nfunction resolvePiCommand(input: unknown): string {\n const envOverride =\n typeof process.env.PAPERCLIP_PI_COMMAND === \"string\" &&\n process.env.PAPERCLIP_PI_COMMAND.trim().length > 0\n ? process.env.PAPERCLIP_PI_COMMAND.trim()\n : \"pi\";\n return asString(input, envOverride);\n}\n\nconst discoveryCache = new Map<string, { expiresAt: number; models: AdapterModel[] }>();\nconst VOLATILE_ENV_KEY_PREFIXES = [\"PAPERCLIP_\", \"npm_\", \"NPM_\"] as const;\nconst VOLATILE_ENV_KEY_EXACT = new Set([\"PWD\", \"OLDPWD\", \"SHLVL\", \"_\", \"TERM_SESSION_ID\"]);\n\nfunction isVolatileEnvKey(key: string): boolean {\n if (VOLATILE_ENV_KEY_EXACT.has(key)) return true;\n return VOLATILE_ENV_KEY_PREFIXES.some((prefix) => key.startsWith(prefix));\n}\n\nfunction hashValue(value: string): string {\n return createHash(\"sha256\").update(value).digest(\"hex\");\n}\n\nfunction discoveryCacheKey(command: string, cwd: string, env: Record<string, string>) {\n const envKey = Object.entries(env)\n .filter(([key]) => !isVolatileEnvKey(key))\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([key, value]) => `${key}=${hashValue(value)}`)\n .join(\"\\n\");\n return `${command}\\n${cwd}\\n${envKey}`;\n}\n\nfunction pruneExpiredDiscoveryCache(now: number) {\n for (const [key, value] of discoveryCache.entries()) {\n if (value.expiresAt <= now) discoveryCache.delete(key);\n }\n}\n\nexport async function discoverPiModels(input: {\n command?: unknown;\n cwd?: unknown;\n env?: unknown;\n} = {}): Promise<AdapterModel[]> {\n const command = resolvePiCommand(input.command);\n const cwd = asString(input.cwd, process.cwd());\n const env = normalizeEnv(input.env);\n const runtimeEnv = normalizeEnv({ ...process.env, ...env });\n\n const result = await runChildProcess(\n `pi-models-${Date.now()}-${Math.random().toString(16).slice(2)}`,\n command,\n [\"--list-models\"],\n {\n cwd,\n env: runtimeEnv,\n timeoutSec: 20,\n graceSec: 3,\n onLog: async () => {},\n },\n );\n\n if (result.timedOut) {\n throw new Error(\"`pi --list-models` timed out.\");\n }\n if ((result.exitCode ?? 1) !== 0) {\n const detail = firstNonEmptyLine(result.stderr) || firstNonEmptyLine(result.stdout);\n throw new Error(detail ? `\\`pi --list-models\\` failed: ${detail}` : \"`pi --list-models` failed.\");\n }\n\n // Pi outputs model list to stderr, but fall back to stdout for older versions\n const output = result.stderr || result.stdout;\n return sortModels(dedupeModels(parseModelsOutput(output)));\n}\n\nfunction normalizeEnv(input: unknown): Record<string, string> {\n const envInput = typeof input === \"object\" && input !== null && !Array.isArray(input)\n ? (input as Record<string, unknown>)\n : {};\n const env: Record<string, string> = {};\n for (const [key, value] of Object.entries(envInput)) {\n if (typeof value === \"string\") env[key] = value;\n }\n return env;\n}\n\nexport async function discoverPiModelsCached(input: {\n command?: unknown;\n cwd?: unknown;\n env?: unknown;\n} = {}): Promise<AdapterModel[]> {\n const command = resolvePiCommand(input.command);\n const cwd = asString(input.cwd, process.cwd());\n const env = normalizeEnv(input.env);\n const key = discoveryCacheKey(command, cwd, env);\n const now = Date.now();\n pruneExpiredDiscoveryCache(now);\n const cached = discoveryCache.get(key);\n if (cached && cached.expiresAt > now) return cached.models;\n\n const models = await discoverPiModels({ command, cwd, env });\n discoveryCache.set(key, { expiresAt: now + MODELS_CACHE_TTL_MS, models });\n return models;\n}\n\nexport async function ensurePiModelConfiguredAndAvailable(input: {\n model?: unknown;\n command?: unknown;\n cwd?: unknown;\n env?: unknown;\n}): Promise<AdapterModel[]> {\n const model = asString(input.model, \"\").trim();\n if (!model) {\n throw new Error(\"Pi requires `adapterConfig.model` in provider/model format.\");\n }\n\n const models = await discoverPiModelsCached({\n command: input.command,\n cwd: input.cwd,\n env: input.env,\n });\n\n if (models.length === 0) {\n throw new Error(\"Pi returned no models. Run `pi --list-models` and verify provider auth.\");\n }\n\n if (!models.some((entry) => entry.id === model)) {\n const sample = models.slice(0, 12).map((entry) => entry.id).join(\", \");\n throw new Error(\n `Configured Pi model is unavailable: ${model}. Available models: ${sample}${models.length > 12 ? \", ...\" : \"\"}`,\n );\n }\n\n return models;\n}\n\nexport async function listPiModels(): Promise<AdapterModel[]> {\n try {\n return await discoverPiModelsCached();\n } catch {\n return [];\n }\n}\n\nexport function resetPiModelsCacheForTests() {\n discoveryCache.clear();\n}\n", "import fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type {\n AdapterSkillContext,\n AdapterSkillSnapshot,\n} from \"@paperclipai/adapter-utils\";\nimport {\n buildPersistentSkillSnapshot,\n ensurePaperclipSkillSymlink,\n readPaperclipRuntimeSkillEntries,\n readInstalledSkillTargets,\n resolvePaperclipDesiredSkillNames,\n} from \"@paperclipai/adapter-utils/server-utils\";\n\nconst __moduleDir = path.dirname(fileURLToPath(import.meta.url));\n\nfunction asString(value: unknown): string | null {\n return typeof value === \"string\" && value.trim().length > 0 ? value.trim() : null;\n}\n\nfunction resolvePiSkillsHome(config: Record<string, unknown>) {\n const env =\n typeof config.env === \"object\" && config.env !== null && !Array.isArray(config.env)\n ? (config.env as Record<string, unknown>)\n : {};\n const configuredHome = asString(env.HOME);\n const home = configuredHome ? path.resolve(configuredHome) : os.homedir();\n return path.join(home, \".pi\", \"agent\", \"skills\");\n}\n\nasync function buildPiSkillSnapshot(config: Record<string, unknown>): Promise<AdapterSkillSnapshot> {\n const availableEntries = await readPaperclipRuntimeSkillEntries(config, __moduleDir);\n const desiredSkills = resolvePaperclipDesiredSkillNames(config, availableEntries);\n const skillsHome = resolvePiSkillsHome(config);\n const installed = await readInstalledSkillTargets(skillsHome);\n return buildPersistentSkillSnapshot({\n adapterType: \"pi_local\",\n availableEntries,\n desiredSkills,\n installed,\n skillsHome,\n locationLabel: \"~/.pi/agent/skills\",\n missingDetail: \"Configured but not currently linked into the Pi skills home.\",\n externalConflictDetail: \"Skill name is occupied by an external installation.\",\n externalDetail: \"Installed outside Paperclip management.\",\n });\n}\n\nexport async function listPiSkills(ctx: AdapterSkillContext): Promise<AdapterSkillSnapshot> {\n return buildPiSkillSnapshot(ctx.config);\n}\n\nexport async function syncPiSkills(\n ctx: AdapterSkillContext,\n desiredSkills: string[],\n): Promise<AdapterSkillSnapshot> {\n const availableEntries = await readPaperclipRuntimeSkillEntries(ctx.config, __moduleDir);\n const desiredSet = new Set([\n ...desiredSkills,\n ...availableEntries.filter((entry) => entry.required).map((entry) => entry.key),\n ]);\n const skillsHome = resolvePiSkillsHome(ctx.config);\n await fs.mkdir(skillsHome, { recursive: true });\n const installed = await readInstalledSkillTargets(skillsHome);\n const availableByRuntimeName = new Map(availableEntries.map((entry) => [entry.runtimeName, entry]));\n\n for (const available of availableEntries) {\n if (!desiredSet.has(available.key)) continue;\n const target = path.join(skillsHome, available.runtimeName);\n await ensurePaperclipSkillSymlink(available.source, target);\n }\n\n for (const [name, installedEntry] of installed.entries()) {\n const available = availableByRuntimeName.get(name);\n if (!available) continue;\n if (desiredSet.has(available.key)) continue;\n if (installedEntry.targetPath !== available.source) continue;\n await fs.unlink(path.join(skillsHome, name)).catch(() => {});\n }\n\n return buildPiSkillSnapshot(ctx.config);\n}\n\nexport function resolvePiDesiredSkillNames(\n config: Record<string, unknown>,\n availableEntries: Array<{ key: string; required?: boolean }>,\n) {\n return resolvePaperclipDesiredSkillNames(config, availableEntries);\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["init_feedback", "z", "init_feedback", "z", "z", "z", "z", "z", "z", "z", "z", "z", "z", "executionWorkspaceStrategySchema", "z", "z", "z", "z", "z", "z", "z", "z", "z", "init_feedback", "z", "path", "issues", "fs", "path", "fs", "path", "randomBytes", "fs", "path", "p", "p", "p", "p", "unique", "p", "auth", "text", "pgTable", "uuid", "text", "integer", "timestamp", "pgTable", "uuid", "text", "integer", "timestamp", "index", "uniqueIndex", "pgTable", "uuid", "timestamp", "uniqueIndex", "pgTable", "text", "timestamp", "boolean", "pgTable", "uuid", "text", "timestamp", "jsonb", "uniqueIndex", "pgTable", "uuid", "text", "timestamp", "uniqueIndex", "index", "pgTable", "uuid", "text", "timestamp", "index", "uniqueIndex", "pgTable", "uuid", "text", "timestamp", "index", "pgTable", "uuid", "text", "timestamp", "uniqueIndex", "index", "pgTable", "uuid", "text", "timestamp", "jsonb", "uniqueIndex", "index", "pgTable", "uuid", "text", "timestamp", "jsonb", "index", "uniqueIndex", "pgTable", "uuid", "text", "timestamp", "jsonb", "index", "uniqueIndex", "boolean", "index", "integer", "pgTable", "text", "timestamp", "uuid", "uniqueIndex", "pgTable", "uuid", "text", "timestamp", "jsonb", "index", "index", "integer", "pgTable", "text", "timestamp", "uuid", "uniqueIndex", "pgTable", "uuid", "text", "timestamp", "jsonb", "index", "pgTable", "uuid", "text", "timestamp", "index", "pgTable", "uuid", "text", "timestamp", "jsonb", "index", "pgTable", "uuid", "text", "timestamp", "jsonb", "integer", "index", "pgTable", "uuid", "text", "timestamp", "jsonb", "index", "integer", "bigint", "boolean", "pgTable", "uuid", "text", "timestamp", "jsonb", "index", "uniqueIndex", "pgTable", "uuid", "text", "timestamp", "index", "pgTable", "uuid", "text", "timestamp", "index", "jsonb", "boolean", "index", "jsonb", "pgTable", "text", "timestamp", "uniqueIndex", "uuid", "sql", "pgTable", "uuid", "text", "timestamp", "integer", "jsonb", "index", "uniqueIndex", "index", "jsonb", "pgTable", "text", "timestamp", "uuid", "bigint", "boolean", "index", "integer", "jsonb", "pgTable", "text", "timestamp", "uuid", "index", "integer", "jsonb", "pgTable", "text", "timestamp", "uuid", "pgTable", "uuid", "timestamp", "index", "pgTable", "uuid", "text", "timestamp", "integer", "index", "uniqueIndex", "boolean", "index", "integer", "jsonb", "pgTable", "text", "timestamp", "uniqueIndex", "uuid", "boolean", "index", "jsonb", "pgTable", "text", "timestamp", "uuid", "pgTable", "uuid", "text", "timestamp", "index", "uniqueIndex", "pgTable", "uuid", "timestamp", "index", "primaryKey", "pgTable", "uuid", "text", "timestamp", "index", "primaryKey", "pgTable", "uuid", "text", "timestamp", "index", "pgTable", "uuid", "text", "timestamp", "index", "uniqueIndex", "boolean", "index", "jsonb", "pgTable", "text", "timestamp", "uniqueIndex", "uuid", "index", "integer", "jsonb", "pgTable", "text", "timestamp", "uniqueIndex", "uuid", "pgTable", "uuid", "text", "timestamp", "index", "uniqueIndex", "pgTable", "uuid", "timestamp", "index", "uniqueIndex", "pgTable", "uuid", "text", "integer", "timestamp", "index", "pgTable", "uuid", "text", "integer", "timestamp", "index", "uniqueIndex", "pgTable", "uuid", "text", "timestamp", "index", "uniqueIndex", "pgTable", "uuid", "text", "timestamp", "integer", "jsonb", "index", "pgTable", "uuid", "text", "timestamp", "integer", "index", "pgTable", "uuid", "text", "timestamp", "integer", "index", "boolean", "jsonb", "pgTable", "uuid", "text", "timestamp", "index", "pgTable", "uuid", "text", "timestamp", "jsonb", "index", "pgTable", "uuid", "text", "timestamp", "integer", "jsonb", "index", "uniqueIndex", "pgTable", "uuid", "text", "timestamp", "jsonb", "index", "uniqueIndex", "pgTable", "uuid", "text", "integer", "timestamp", "jsonb", "index", "uniqueIndex", "pgTable", "uuid", "text", "timestamp", "jsonb", "uniqueIndex", "pgTable", "uuid", "text", "timestamp", "jsonb", "index", "uniqueIndex", "boolean", "pgTable", "uuid", "text", "timestamp", "jsonb", "index", "unique", "pgTable", "uuid", "text", "timestamp", "jsonb", "index", "uniqueIndex", "pgTable", "uuid", "text", "integer", "timestamp", "jsonb", "index", "uniqueIndex", "pgTable", "uuid", "text", "integer", "timestamp", "jsonb", "index", "pgTable", "uuid", "text", "timestamp", "jsonb", "index", "pgTable", "uuid", "text", "boolean", "timestamp", "jsonb", "index", "sql", "pgTable", "uuid", "timestamp", "index", "pgTable", "uuid", "text", "timestamp", "integer", "jsonb", "index", "index", "integer", "jsonb", "pgTable", "text", "timestamp", "uuid", "init_schema", "sql", "rows", "repair", "init_schema", "fs", "os", "path", "resolve", "readFile", "postgres", "timestamp", "date", "stat", "quoteIdentifier", "resolve", "sql", "DRIZZLE_MIGRATIONS_TABLE", "labels", "p", "index", "text", "formatEmbeddedPostgresError", "formatEmbeddedPostgresError", "init_src", "init_schema", "createHash", "randomBytes", "p", "init_src", "pc", "createHash", "init_client", "randomBytes", "existsSync", "mkdirSync", "path", "client", "init_client", "require", "path", "init_telemetry", "auth", "init_path_resolver", "fs", "createDb", "init_path_resolver", "fs", "init_path_resolver", "net", "resolve", "randomBytes", "fs", "path", "init_path_resolver", "fs", "init_path_resolver", "p", "pc", "fs", "path", "fileURLToPath", "p", "pc", "p", "path", "pc", "jwtSecret", "envFilePath", "keyResult", "shouldRunNow", "runCommand", "auth", "createDb", "init_telemetry", "p", "pc", "defaultStorageBaseDir", "p", "pc", "auth", "p", "pc", "pc", "pc", "text", "pc", "text", "path", "pc", "asRecord", "asString", "asNumber", "text", "pc", "pc", "asRecord", "asString", "asNumber", "stringifyUnknown", "errorText", "text", "pc", "text", "asRecord", "asString", "asNumber", "errorText", "pc", "safeJsonParse", "text", "asRecord", "asString", "pc", "pc", "fs", "path", "pc", "path", "fs", "resolve", "child", "pc", "fs", "path", "parseJson", "URL", "path", "text", "pc", "asRecord", "asErrorText", "pc", "adapterType", "init_src", "path", "p", "pc", "spinner", "pc", "program", "pc", "init_telemetry", "mkdir", "readdir", "readFile", "stat", "writeFile", "path", "p", "pc", "path", "readdir", "readFile", "path", "pc", "program", "path", "companies", "pc", "asRecord", "readdir", "readFile", "path", "isUuidLike", "labels", "agents", "projects", "pc", "owner", "repo", "stat", "readdir", "readFile", "mkdir", "writeFile", "companies", "confirm", "program", "writeFile", "program", "path", "writeFile", "text", "spawn", "fs", "path", "asString", "asNumber", "parseJson", "path", "pathExists", "fs", "asString", "fs", "path", "resolve", "spawn", "text", "fs", "os", "path", "fileURLToPath", "path", "fileURLToPath", "os", "fs", "program", "program", "parseCsv", "program", "path", "program", "init_src", "fs", "net", "path", "pc", "eq", "resolve", "formatEmbeddedPostgresError", "eq", "pc", "program", "path", "init_telemetry", "init_src", "existsSync", "mkdirSync", "readdirSync", "readFileSync", "statSync", "writeFileSync", "os", "path", "p", "pc", "and", "eq", "inArray", "sql", "path", "nonEmpty", "isLoopbackHost", "targetCreatedByAgentId", "nonEmpty", "path", "client", "os", "readPidFilePort", "existsSync", "readFileSync", "readRunningPostmasterPid", "isPortAvailable", "resolve", "findAvailablePort", "index", "readdirSync", "mkdirSync", "statSync", "eq", "writeFileSync", "ensureEmbeddedPostgres", "formatEmbeddedPostgresError", "spinner", "pc", "closeDb", "sql", "inArray", "and", "program", "path", "pc", "path", "p", "pc", "program", "plugins", "auth", "p", "pc", "program", "pc", "path", "fs", "os", "delay", "pc", "fs", "os", "path", "fileURLToPath", "parseJson", "asString", "text", "asNumber", "msg", "path", "fileURLToPath", "__moduleDir", "path", "fileURLToPath", "__moduleDir", "path", "fileURLToPath", "fs", "os", "asString", "asNumber", "asString", "asNumber", "path", "fs", "parseJson", "fs", "path", "fileURLToPath", "parseJson", "asString", "text", "asNumber", "fs", "os", "path", "nonEmpty", "pathExists", "path", "fileURLToPath", "__moduleDir", "path", "fileURLToPath", "__moduleDir", "path", "fileURLToPath", "text", "hasNonEmptyEnvValue", "pathExists", "fs", "execute", "asString", "asNumber", "fs", "os", "path", "fileURLToPath", "asErrorText", "asString", "text", "parseJson", "asNumber", "__moduleDir", "path", "fileURLToPath", "firstNonEmptyLine", "text", "hasNonEmptyEnvValue", "os", "fs", "execute", "asString", "asNumber", "path", "fileURLToPath", "__moduleDir", "path", "fileURLToPath", "fs", "os", "path", "fileURLToPath", "asString", "text", "readSessionId", "asErrorText", "asNumber", "parseJson", "msg", "asString", "firstNonEmptyLine", "text", "__moduleDir", "path", "fileURLToPath", "hasNonEmptyEnvValue", "renderPaperclipEnvNote", "os", "fs", "execute", "asString", "asNumber", "index", "firstNonEmptyLine", "path", "fileURLToPath", "__moduleDir", "path", "fileURLToPath", "fs", "os", "path", "fileURLToPath", "errorText", "asString", "parseJson", "text", "asNumber", "createHash", "os", "asString", "models", "firstNonEmptyLine", "text", "createHash", "os", "fs", "os", "path", "path", "os", "fs", "__moduleDir", "path", "fileURLToPath", "firstNonEmptyLine", "text", "claudeSkillsHome", "os", "fs", "execute", "asString", "asNumber", "path", "fileURLToPath", "__moduleDir", "path", "fileURLToPath", "fs", "os", "path", "fileURLToPath", "asRecord", "extractTextContent", "parseJson", "asString", "text", "asNumber", "createHash", "MODELS_CACHE_TTL_MS", "firstNonEmptyLine", "text", "parseModelsOutput", "dedupeModels", "models", "sortModels", "asString", "discoveryCache", "VOLATILE_ENV_KEY_PREFIXES", "VOLATILE_ENV_KEY_EXACT", "isVolatileEnvKey", "hashValue", "createHash", "discoveryCacheKey", "pruneExpiredDiscoveryCache", "normalizeEnv", "__moduleDir", "path", "fileURLToPath", "os", "firstNonEmptyLine", "text", "parseModelProvider", "fs", "timestamp", "execute", "asString", "asNumber", "path", "fileURLToPath", "__moduleDir", "path", "fileURLToPath", "execute", "path", "os", "pc", "fs", "delay", "program"]
|
|
7
|
+
}
|