@ekanos/cli 0.13.0 → 0.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (173) hide show
  1. package/README.md +25 -8
  2. package/dist/agents-api.d.ts +11 -2
  3. package/dist/agents-api.js +39 -3
  4. package/dist/agents-api.js.map +1 -1
  5. package/dist/apps-api.js +2 -2
  6. package/dist/apps-api.js.map +1 -1
  7. package/dist/auth/ekanos-api.d.ts +16 -2
  8. package/dist/auth/ekanos-api.js +101 -15
  9. package/dist/auth/ekanos-api.js.map +1 -1
  10. package/dist/auth/host-trust.d.ts +46 -0
  11. package/dist/auth/host-trust.js +79 -0
  12. package/dist/auth/host-trust.js.map +1 -0
  13. package/dist/auth/session.d.ts +10 -1
  14. package/dist/auth/session.js +28 -28
  15. package/dist/auth/session.js.map +1 -1
  16. package/dist/commands/agents-edit.d.ts +6 -2
  17. package/dist/commands/agents-edit.js +57 -26
  18. package/dist/commands/agents-edit.js.map +1 -1
  19. package/dist/commands/agents.d.ts +13 -2
  20. package/dist/commands/agents.js +140 -35
  21. package/dist/commands/agents.js.map +1 -1
  22. package/dist/commands/apps.d.ts +2 -0
  23. package/dist/commands/apps.js +16 -12
  24. package/dist/commands/apps.js.map +1 -1
  25. package/dist/commands/catalog.js +7 -6
  26. package/dist/commands/catalog.js.map +1 -1
  27. package/dist/commands/knowledge.d.ts +19 -0
  28. package/dist/commands/knowledge.js +119 -27
  29. package/dist/commands/knowledge.js.map +1 -1
  30. package/dist/commands/login.d.ts +4 -0
  31. package/dist/commands/login.js +30 -2
  32. package/dist/commands/login.js.map +1 -1
  33. package/dist/commands/logout.d.ts +9 -1
  34. package/dist/commands/logout.js +56 -7
  35. package/dist/commands/logout.js.map +1 -1
  36. package/dist/commands/publish.js +3 -3
  37. package/dist/commands/publish.js.map +1 -1
  38. package/dist/commands/reviewers.d.ts +2 -0
  39. package/dist/commands/reviewers.js +7 -3
  40. package/dist/commands/reviewers.js.map +1 -1
  41. package/dist/commands/routes.d.ts +2 -0
  42. package/dist/commands/routes.js +42 -9
  43. package/dist/commands/routes.js.map +1 -1
  44. package/dist/commands/runs.d.ts +13 -2
  45. package/dist/commands/runs.js +99 -16
  46. package/dist/commands/runs.js.map +1 -1
  47. package/dist/commands/scope-notice.d.ts +21 -0
  48. package/dist/commands/scope-notice.js +35 -0
  49. package/dist/commands/scope-notice.js.map +1 -0
  50. package/dist/commands/skills.d.ts +7 -1
  51. package/dist/commands/skills.js +80 -24
  52. package/dist/commands/skills.js.map +1 -1
  53. package/dist/commands/sources.d.ts +1 -1
  54. package/dist/commands/sources.js +126 -12
  55. package/dist/commands/sources.js.map +1 -1
  56. package/dist/commands/status.js +5 -4
  57. package/dist/commands/status.js.map +1 -1
  58. package/dist/commands/team-agent-readiness.d.ts +49 -0
  59. package/dist/commands/team-agent-readiness.js +308 -0
  60. package/dist/commands/team-agent-readiness.js.map +1 -0
  61. package/dist/commands/team-agents-agents.d.ts +24 -3
  62. package/dist/commands/team-agents-agents.js +314 -35
  63. package/dist/commands/team-agents-agents.js.map +1 -1
  64. package/dist/commands/team-agents-mcp.js +32 -3
  65. package/dist/commands/team-agents-mcp.js.map +1 -1
  66. package/dist/commands/team-agents-triggers.js +230 -55
  67. package/dist/commands/team-agents-triggers.js.map +1 -1
  68. package/dist/commands/team-agents.d.ts +3 -1
  69. package/dist/commands/team-agents.js +27 -7
  70. package/dist/commands/team-agents.js.map +1 -1
  71. package/dist/commands/teams-channel-install.d.ts +24 -0
  72. package/dist/commands/teams-channel-install.js +94 -0
  73. package/dist/commands/teams-channel-install.js.map +1 -0
  74. package/dist/commands/teams-connect.d.ts +41 -0
  75. package/dist/commands/teams-connect.js +212 -57
  76. package/dist/commands/teams-connect.js.map +1 -1
  77. package/dist/commands/teams-events.d.ts +12 -0
  78. package/dist/commands/teams-events.js +138 -0
  79. package/dist/commands/teams-events.js.map +1 -0
  80. package/dist/commands/teams-onboard.d.ts +11 -3
  81. package/dist/commands/teams-onboard.js +60 -7
  82. package/dist/commands/teams-onboard.js.map +1 -1
  83. package/dist/commands/teams-overview.d.ts +11 -0
  84. package/dist/commands/teams-overview.js +160 -0
  85. package/dist/commands/teams-overview.js.map +1 -0
  86. package/dist/commands/teams-scope.d.ts +10 -0
  87. package/dist/commands/teams-scope.js +109 -0
  88. package/dist/commands/teams-scope.js.map +1 -0
  89. package/dist/commands/teams.d.ts +4 -2
  90. package/dist/commands/teams.js +113 -14
  91. package/dist/commands/teams.js.map +1 -1
  92. package/dist/commands/upgrade.js +12 -2
  93. package/dist/commands/upgrade.js.map +1 -1
  94. package/dist/commands/use.js +2 -2
  95. package/dist/commands/use.js.map +1 -1
  96. package/dist/commands/whoami.js +1 -1
  97. package/dist/commands/whoami.js.map +1 -1
  98. package/dist/connections-api.js +1 -1
  99. package/dist/connections-api.js.map +1 -1
  100. package/dist/delegate.js +11 -4
  101. package/dist/delegate.js.map +1 -1
  102. package/dist/harness-scaffold.js +12 -0
  103. package/dist/harness-scaffold.js.map +1 -1
  104. package/dist/index.d.ts +6 -0
  105. package/dist/index.js +682 -167
  106. package/dist/index.js.map +1 -1
  107. package/dist/knowledge-api.d.ts +46 -0
  108. package/dist/knowledge-api.js +32 -1
  109. package/dist/knowledge-api.js.map +1 -1
  110. package/dist/open-url.d.ts +16 -0
  111. package/dist/open-url.js +73 -0
  112. package/dist/open-url.js.map +1 -0
  113. package/dist/parse-argv.d.ts +2 -0
  114. package/dist/parse-argv.js.map +1 -1
  115. package/dist/publish-api.d.ts +2 -1
  116. package/dist/publish-api.js +4 -3
  117. package/dist/publish-api.js.map +1 -1
  118. package/dist/pull-write.d.ts +27 -0
  119. package/dist/pull-write.js +60 -0
  120. package/dist/pull-write.js.map +1 -0
  121. package/dist/routes-api.d.ts +3 -0
  122. package/dist/routes-api.js +9 -4
  123. package/dist/routes-api.js.map +1 -1
  124. package/dist/runs-api.d.ts +7 -1
  125. package/dist/runs-api.js +21 -6
  126. package/dist/runs-api.js.map +1 -1
  127. package/dist/safe-fs.d.ts +2 -0
  128. package/dist/safe-fs.js +12 -6
  129. package/dist/safe-fs.js.map +1 -1
  130. package/dist/secret-file.d.ts +17 -0
  131. package/dist/secret-file.js +69 -0
  132. package/dist/secret-file.js.map +1 -0
  133. package/dist/skills-api.d.ts +10 -2
  134. package/dist/skills-api.js +37 -2
  135. package/dist/skills-api.js.map +1 -1
  136. package/dist/source-products-api.d.ts +4 -0
  137. package/dist/source-products-api.js +14 -4
  138. package/dist/source-products-api.js.map +1 -1
  139. package/dist/source-target.js +2 -1
  140. package/dist/source-target.js.map +1 -1
  141. package/dist/sources-api.d.ts +2 -1
  142. package/dist/sources-api.js +3 -2
  143. package/dist/sources-api.js.map +1 -1
  144. package/dist/team-connect-api.d.ts +44 -2
  145. package/dist/team-connect-api.js +19 -7
  146. package/dist/team-connect-api.js.map +1 -1
  147. package/dist/teams-api.d.ts +41 -1
  148. package/dist/teams-api.js +95 -19
  149. package/dist/teams-api.js.map +1 -1
  150. package/dist/toolchain-api.d.ts +9 -0
  151. package/dist/toolchain-api.js +17 -2
  152. package/dist/toolchain-api.js.map +1 -1
  153. package/dist/toolchain-resolve.d.ts +3 -0
  154. package/dist/toolchain-resolve.js +15 -1
  155. package/dist/toolchain-resolve.js.map +1 -1
  156. package/dist/toolchain.d.ts +6 -0
  157. package/dist/toolchain.js +19 -0
  158. package/dist/toolchain.js.map +1 -1
  159. package/dist/update-notice.js +2 -1
  160. package/dist/update-notice.js.map +1 -1
  161. package/package.json +2 -2
  162. package/templates/AGENTS.md.tmpl +6 -1
  163. package/templates/claude-skill.md.tmpl +5 -0
  164. package/templates/package.json.tmpl +4 -4
  165. package/templates/skills/build-agent/SKILL.md +104 -17
  166. package/templates/skills/build-agent/references/agent-json.md +4 -2
  167. package/templates/skills/build-agent/references/rollout.md +23 -4
  168. package/templates/skills/build-agent/references/set-up-an-integration.md +55 -7
  169. package/templates/skills/build-agent/references/skills.md +20 -1
  170. package/templates/skills/build-agent/references/triggers.md +47 -11
  171. package/templates/skills/build-integration/references/widget-design.md +3 -3
  172. package/templates/skills/ekanos-platform/SKILL.md +45 -16
  173. package/templates/skills/polish-widgets/references/patterns.md +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"runs.js","sourceRoot":"","sources":["../../src/commands/runs.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n AgentRunApproval,\n AgentRunDetail,\n AgentRunStartRequest,\n AgentRunSummary,\n} from '@ekanos/integration-schema';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\n\nimport type { StoredSession } from '../auth/credential-store';\nimport {\n type AuthEnvironment,\n refreshStoredSession,\n requireSession,\n resolveAuthEnvironment,\n} from '../auth/session';\nimport type { CliContext } from '../context';\nimport { authRequiredError, usageError, validationError } from '../errors';\nimport type { ExitCode } from '../exit-codes';\nimport {\n type RunsApiResult,\n decideApproval,\n listApprovals,\n listRuns,\n showRun,\n startRun,\n} from '../runs-api';\nimport { resolveSourceTarget } from '../source-target';\nimport type { ResultRow, Ui } from '../ui';\n\nexport const RUNS_SUBCOMMANDS = ['start', 'list', 'show'] as const;\nexport const APPROVALS_SUBCOMMANDS = [\n 'list',\n 'approve',\n 'reject',\n 'edit',\n] as const;\n\nconst FOLLOW_INTERVAL_MS = 2000;\nconst FOLLOW_TIMEOUT_MS = 15 * 60 * 1000;\n\nexport interface RunsArgs {\n host?: string;\n source?: string;\n positionals: readonly string[];\n team?: string;\n agent?: string;\n prompt?: string;\n input?: string;\n follow: boolean;\n reason?: string;\n body?: string;\n dir: string;\n env: Record<string, string | undefined>;\n /** Test seam for the `--follow` poll delay. */\n sleep?: (ms: number) => Promise<void>;\n}\n\n/**\n * `runs` — run, list and inspect a team's agents as its Source admin. A run\n * started here is the app's \"Run now\": it runs as the agent's creator under\n * the agent's own grant, policy and approvals (writes still wait for one),\n * and is attributed to you.\n */\nexport async function runRuns(\n ctx: CliContext,\n args: RunsArgs,\n): Promise<ExitCode> {\n const [rawSubcommand, operand, ...extra] = args.positionals;\n const subcommand = RUNS_SUBCOMMANDS.find((name) => name === rawSubcommand);\n if (!subcommand) {\n throw usageError(\n rawSubcommand\n ? `Unknown runs subcommand \"${rawSubcommand}\".`\n : 'runs needs a subcommand.',\n 'Run one of: ekanos runs start <agent> --team <slug> --prompt \"…\", ekanos runs list --team <slug>, ekanos runs show <run-id> --team <slug>.',\n );\n }\n rejectExtra(extra, 'runs');\n const team = requireTeam(args.team);\n\n if (subcommand === 'start') {\n const agent = requireOperand(operand, 'agent key', 'runs start');\n return startAndReport(ctx, args, { team, agent, draft: false });\n }\n\n const { env, client, source } = await connect(ctx, args);\n\n if (subcommand === 'list') {\n if (operand) rejectExtra([operand], 'runs list');\n const list = await client.call((token) =>\n listRuns(env.host, token, { source, team, agent: args.agent }),\n );\n return ctx.succeed(\n { host: env.host, ...list },\n list.runs.length === 0\n ? ctx.ui.result({\n title: `No runs on ${list.team.slug}${args.agent ? ` for ${args.agent}` : ''}`,\n tone: 'warn',\n })\n : ctx.ui.table(\n ['RUN', 'AGENT', 'STATUS', 'TRIGGER', 'VERSION', 'STARTED'],\n list.runs.map((run) => [\n run.id,\n agentLabel(run.agent),\n run.status,\n run.trigger,\n versionLabel(run),\n run.startedAt.slice(0, 19).replace('T', ' '),\n ]),\n ),\n );\n }\n\n const runId = requireOperand(operand, 'run id', 'runs show');\n const detail = await client.call((token) =>\n showRun(env.host, token, { source, team, runId }),\n );\n return ctx.succeed({ host: env.host, ...detail }, runDetail(ctx.ui, detail));\n}\n\n/**\n * `agents test <key> --team <slug>`: run the template's latest version — its\n * draft, published or not — on one team, without publishing it. Marked as a\n * draft test run in the ledger; the team's stored agent still bounds every\n * tool call, so a draft can narrow what runs but never widen it.\n */\nexport async function runAgentTest(\n ctx: CliContext,\n args: RunsArgs & { key: string | undefined },\n): Promise<ExitCode> {\n const agent = requireOperand(args.key, 'agent key', 'agents test');\n const team = requireTeam(args.team);\n return startAndReport(ctx, args, { team, agent, draft: true });\n}\n\n/**\n * `approvals` — what a team's agent runs are waiting on, and deciding it.\n * Decided with the authority a team's agent manager has in the app, and\n * recorded as your decision.\n */\nexport async function runApprovals(\n ctx: CliContext,\n args: RunsArgs,\n): Promise<ExitCode> {\n const [rawSubcommand, operand, ...extra] = args.positionals;\n const subcommand = APPROVALS_SUBCOMMANDS.find(\n (name) => name === rawSubcommand,\n );\n if (!subcommand) {\n throw usageError(\n rawSubcommand\n ? `Unknown approvals subcommand \"${rawSubcommand}\".`\n : 'approvals needs a subcommand.',\n 'Run one of: ekanos approvals list --team <slug>, ekanos approvals approve|reject <id> --team <slug> [--reason \"…\"], ekanos approvals edit <id> --team <slug> --body <file>.',\n );\n }\n rejectExtra(extra, 'approvals');\n const team = requireTeam(args.team);\n\n if (subcommand === 'list') {\n if (operand) rejectExtra([operand], 'approvals list');\n const { env, client, source } = await connect(ctx, args);\n const list = await client.call((token) =>\n listApprovals(env.host, token, { source, team }),\n );\n return ctx.succeed(\n { host: env.host, ...list },\n list.approvals.length === 0\n ? ctx.ui.result({ title: `Nothing waiting on ${list.team.slug}` })\n : ctx.ui.result({\n title: `${list.approvals.length} waiting on ${list.team.slug}`,\n tone: 'warn',\n rows: list.approvals.map((approval): ResultRow => [\n approval.id,\n approvalLines(approval),\n ]),\n notes: [\n '\"ekanos approvals approve|reject <id> --team <slug>\" decides one; \"approvals edit <id> --body <file>\" edits a reply draft and sends it.',\n ],\n }),\n );\n }\n\n const approvalId = requireOperand(\n operand,\n 'approval id',\n `approvals ${subcommand}`,\n );\n const editedBody =\n subcommand === 'edit' ? readBodyFile(args.body, args.dir) : undefined;\n if (subcommand !== 'edit' && args.body) {\n throw usageError(\n '--body is for \"approvals edit\".',\n `Run \"ekanos approvals edit ${approvalId} --team ${team} --body <file>\".`,\n );\n }\n\n const { env, client, source } = await connect(ctx, args);\n const decided = await client.call((token) =>\n decideApproval(\n env.host,\n token,\n { source, team, approvalId },\n {\n decision: subcommand === 'reject' ? 'rejected' : 'approved',\n ...(args.reason ? { reason: args.reason } : {}),\n ...(editedBody ? { body: editedBody } : {}),\n },\n ),\n );\n const approval = decided.approval;\n return ctx.succeed(\n { host: env.host, ...decided },\n ctx.ui.result({\n title: `${approval.status === 'rejected' ? 'Rejected' : editedBody ? 'Edited and approved' : 'Approved'} ${approval.toolName}`,\n tone: approval.status === 'rejected' ? 'warn' : 'ok',\n rows: [\n ['Agent', agentLabel(approval.agent)],\n ['Run', approval.runId],\n ],\n notes: [\n `The run picks it up now: \"ekanos runs show ${approval.runId} --team ${team}\".`,\n ],\n }),\n );\n}\n\nasync function startAndReport(\n ctx: CliContext,\n args: RunsArgs,\n target: { team: string; agent: string; draft: boolean },\n): Promise<ExitCode> {\n const body = startBody(args, target);\n const { env, client, source } = await connect(ctx, args);\n const started = await client.call((token) =>\n startRun(env.host, token, { source, team: target.team }, body),\n );\n\n const startedNote = `${target.draft ? 'Testing' : 'Started'} ${agentLabel(started.agent)} on ${started.team.slug}${started.draftTemplateVersion ? ` (draft v${started.draftTemplateVersion}, unpublished)` : ''}: run ${started.runId}`;\n\n if (!args.follow) {\n return ctx.succeed(\n { host: env.host, ...started },\n ctx.ui.result({\n title: startedNote,\n notes: [\n `Watch it: \"ekanos runs show ${started.runId} --team ${target.team}\".`,\n ],\n }),\n );\n }\n\n ctx.log(startedNote);\n const detail = await follow(ctx, args, async (after) =>\n client.call((token) =>\n showRun(env.host, token, {\n source,\n team: target.team,\n runId: started.runId,\n after,\n }),\n ),\n );\n return ctx.succeed(\n { host: env.host, started, ...detail },\n runDetail(ctx.ui, detail),\n );\n}\n\n/**\n * Poll the run, printing its status changes, its messages and each tool\n * call as it lands, until it ends or parks on an approval.\n */\nasync function follow(\n ctx: CliContext,\n args: RunsArgs,\n read: (after: number | undefined) => Promise<AgentRunDetail>,\n): Promise<AgentRunDetail> {\n const sleep =\n args.sleep ??\n ((ms: number) => new Promise<void>((resolve) => setTimeout(resolve, ms)));\n const seenCalls = new Set<string>();\n const events: AgentRunDetail['events'] = [];\n let lastEvent: number | undefined;\n let lastStatus = '';\n const deadline = Date.now() + FOLLOW_TIMEOUT_MS;\n\n for (;;) {\n const detail = await read(lastEvent);\n for (const event of detail.events) {\n events.push(event);\n lastEvent = event.id;\n for (const line of eventLines(event.message)) ctx.log(` ${line}`);\n }\n for (const call of detail.toolCalls) {\n if (seenCalls.has(call.toolCallId)) continue;\n seenCalls.add(call.toolCallId);\n ctx.log(\n ` ${call.ok === false ? '✗' : '✓'} ${call.toolName} (${call.effect}, ${call.authorizedVia})${call.error ? ` — ${call.error}` : ''}`,\n );\n }\n if (detail.run.status !== lastStatus) {\n lastStatus = detail.run.status;\n ctx.log(` status: ${lastStatus}`);\n }\n\n const waiting = detail.approvals.some(\n (approval) => approval.status === 'pending',\n );\n const ended = ['completed', 'failed', 'cancelled'].includes(\n detail.run.status,\n );\n if (ended || waiting || Date.now() > deadline) {\n return { ...detail, events };\n }\n await sleep(FOLLOW_INTERVAL_MS);\n }\n}\n\n/** Assistant text and tool calls from one live transcript message. */\nfunction eventLines(message: unknown): string[] {\n if (!isRecord(message)) return [];\n const content = message.content;\n if (message.role === 'assistant' && typeof content === 'string') {\n return content.trim() ? [`agent: ${clip(content)}`] : [];\n }\n if (!Array.isArray(content)) return [];\n return content.flatMap((part): string[] => {\n if (!isRecord(part)) return [];\n if (part.type === 'text' && message.role === 'assistant') {\n return typeof part.text === 'string' && part.text.trim()\n ? [`agent: ${clip(part.text)}`]\n : [];\n }\n if (part.type === 'tool-call' && typeof part.toolName === 'string') {\n return [`→ ${part.toolName}`];\n }\n return [];\n });\n}\n\nfunction startBody(\n args: RunsArgs,\n target: { agent: string; draft: boolean },\n): AgentRunStartRequest {\n if (!args.prompt && !args.input) {\n throw usageError(\n 'Give the run a prompt or an input.',\n `Pass --prompt \"…\" or --input <file.json>.`,\n );\n }\n let input: unknown;\n if (args.input) {\n const file = path.resolve(args.dir, args.input);\n let raw: string;\n try {\n raw = fs.readFileSync(file, 'utf8');\n } catch {\n throw usageError(`Cannot read ${file}.`, 'Pass --input <file.json>.');\n }\n try {\n input = JSON.parse(raw);\n } catch {\n throw validationError(\n `${file} is not valid JSON.`,\n 'Fix the file, or pass the text with --prompt instead.',\n );\n }\n }\n return {\n agent: target.agent,\n ...(args.prompt ? { prompt: args.prompt } : {}),\n ...(input !== undefined ? { input } : {}),\n draft: target.draft,\n };\n}\n\nfunction readBodyFile(file: string | undefined, dir: string): string {\n if (!file) {\n throw usageError(\n 'approvals edit needs the reply to send.',\n 'Pass --body <file> with the edited reply text.',\n );\n }\n const resolved = path.resolve(dir, file);\n let text: string;\n try {\n text = fs.readFileSync(resolved, 'utf8');\n } catch {\n throw usageError(`Cannot read ${resolved}.`, 'Pass --body <file>.');\n }\n if (!text.trim()) {\n throw validationError(`${resolved} is empty.`, 'Write the reply to send.');\n }\n return text;\n}\n\nfunction runDetail(ui: Ui, detail: AgentRunDetail): string {\n const { run } = detail;\n const pending = detail.approvals.filter(\n (approval) => approval.status === 'pending',\n );\n const rows: ResultRow[] = [\n ['Agent', agentLabel(run.agent)],\n ['Status', run.status],\n ['Trigger', run.trigger],\n ['Version', versionLabel(run)],\n ['Started', run.startedAt],\n ...(run.finishedAt ? [['Finished', run.finishedAt] as ResultRow] : []),\n ...(run.error ? [['Error', run.error] as ResultRow] : []),\n [\n 'Tool calls',\n detail.toolCalls.length === 0\n ? 'none'\n : detail.toolCalls.map(\n (call) =>\n `${call.ok === false ? '✗' : '✓'} ${call.toolName} (${call.effect}, ${call.authorizedVia})`,\n ),\n ],\n ...(pending.length > 0\n ? [\n [\n 'Waiting on',\n pending.flatMap((approval) => [\n `${approval.id} ${approval.toolName}${approval.replyDraft ? ' (reply draft)' : ''}`,\n ]),\n ] as ResultRow,\n ]\n : []),\n ...(run.output ? [['Output', run.output.split('\\n')] as ResultRow] : []),\n ];\n return ui.result({\n title: `Run ${run.id}`,\n tone:\n run.status === 'failed'\n ? 'err'\n : run.status === 'completed'\n ? 'ok'\n : 'warn',\n rows,\n notes:\n pending.length > 0\n ? [\n `Decide: \"ekanos approvals approve|reject <id> --team ${detail.team.slug}\". Full record: --json.`,\n ]\n : ['The full transcript and every tool call: --json.'],\n });\n}\n\nfunction approvalLines(approval: AgentRunApproval): string[] {\n return [\n `${approval.toolName} · ${agentLabel(approval.agent)}${approval.replyDraft ? ' · reply draft (editable)' : ''}`,\n `run ${approval.runId}${approval.expiresAt ? ` · expires ${approval.expiresAt}` : ''}`,\n clip(JSON.stringify(approval.args ?? null)),\n ];\n}\n\nfunction agentLabel(agent: AgentRunSummary['agent']): string {\n return agent.templateKey ?? agent.slug;\n}\n\nfunction versionLabel(run: AgentRunSummary): string {\n return run.draftTemplateVersion\n ? `v${run.agentVersion} · draft test of template v${run.draftTemplateVersion}`\n : `v${run.agentVersion}`;\n}\n\nfunction clip(text: string, max = 200): string {\n const flat = text.replace(/\\s+/g, ' ').trim();\n return flat.length > max ? `${flat.slice(0, max - 1)}…` : flat;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction requireTeam(value: string | undefined): string {\n const slug = value?.trim().toLowerCase();\n if (slug && /^[a-z0-9][a-z0-9-]*$/.test(slug)) return slug;\n throw usageError(\n value\n ? `\"${value}\" is not a team slug.`\n : 'Name the team with --team <slug>.',\n '\"ekanos teams list\" lists the teams on this Source.',\n );\n}\n\nfunction requireOperand(\n value: string | undefined,\n what: string,\n command: string,\n): string {\n const trimmed = value?.trim();\n if (trimmed) return trimmed;\n throw usageError(`Name the ${what}.`, `See \"ekanos ${command} --help\".`);\n}\n\nfunction rejectExtra(extra: readonly string[], command: string) {\n if (extra.length > 0) {\n throw usageError(\n `Unexpected argument \"${extra[0]}\".`,\n `See \"ekanos ${command.split(' ')[0]} --help\".`,\n );\n }\n}\n\nasync function connect(ctx: CliContext, args: RunsArgs) {\n const env = resolveAuthEnvironment(ctx, args.host, args.env, {\n projectDir: args.dir,\n });\n const resolved = await resolveSourceTarget(\n env,\n requireSession(env.store, env.host),\n args,\n );\n return {\n env,\n client: new RunsClient(env, resolved.session),\n source: resolved.source,\n };\n}\n\nclass RunsClient {\n constructor(\n private readonly env: AuthEnvironment,\n private session: StoredSession,\n ) {}\n\n async call<T>(\n send: (accessToken: string) => Promise<RunsApiResult<T>>,\n ): Promise<T> {\n let result = await send(this.session.accessToken);\n if (result.status === 'unauthorized') {\n this.session = await refreshStoredSession(this.env, this.session);\n result = await send(this.session.accessToken);\n }\n if (result.status === 'ok') return result.data;\n throw authRequiredError(\n `The session for ${this.env.host} could not authorize the call.`,\n `Run \"ekanos login --host ${this.env.host}\" and retry.`,\n );\n }\n}\n"]}
1
+ {"version":3,"file":"runs.js","sourceRoot":"","sources":["../../src/commands/runs.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n type AgentRunApproval,\n type AgentRunDetail,\n type AgentRunStartRequest,\n AgentRunStatusSchema,\n type AgentRunSummary,\n type AgentRunToolCall,\n} from '@ekanos/integration-schema';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\n\nimport type { StoredSession } from '../auth/credential-store';\nimport { loginHint } from '../auth/host-trust';\nimport {\n type AuthEnvironment,\n refreshStoredSession,\n requireSession,\n resolveAuthEnvironment,\n} from '../auth/session';\nimport type { CliContext } from '../context';\nimport { authRequiredError, usageError, validationError } from '../errors';\nimport type { ExitCode } from '../exit-codes';\nimport {\n type RunsApiResult,\n cancelRun,\n decideApproval,\n listApprovals,\n listRuns,\n showRun,\n startRun,\n} from '../runs-api';\nimport { resolveSourceTarget } from '../source-target';\nimport type { ResultRow, Ui } from '../ui';\nimport { promptYesNo } from './publish';\nimport { parseSince } from './teams-events';\n\nexport const RUNS_SUBCOMMANDS = ['start', 'list', 'show', 'cancel'] as const;\nexport const APPROVALS_SUBCOMMANDS = [\n 'list',\n 'approve',\n 'reject',\n 'edit',\n] as const;\n\nconst FOLLOW_INTERVAL_MS = 2000;\nconst FOLLOW_TIMEOUT_MS = 15 * 60 * 1000;\n\nexport interface RunsArgs {\n host?: string;\n source?: string;\n positionals: readonly string[];\n team?: string;\n agent?: string;\n /** `list --status <status>` and `--since 24h|7d|<date>`. */\n status?: string;\n since?: string;\n prompt?: string;\n input?: string;\n follow: boolean;\n reason?: string;\n body?: string;\n /** `runs cancel`: confirmed up front, for a script or an agent run. */\n yes?: boolean;\n dir: string;\n env: Record<string, string | undefined>;\n /** Test seam for the `--follow` poll delay. */\n sleep?: (ms: number) => Promise<void>;\n /** Test seams for `runs cancel`'s question. */\n stdinIsTTY?: boolean;\n confirm?: (question: string) => Promise<boolean>;\n}\n\n/**\n * `runs` — run, list and inspect a team's agents as its Source admin. A run\n * started here is the app's \"Run now\": it runs as the agent's creator under\n * the agent's own grant, policy and approvals (writes still wait for one),\n * and is attributed to you.\n */\nexport async function runRuns(\n ctx: CliContext,\n args: RunsArgs,\n): Promise<ExitCode> {\n const [rawSubcommand, operand, ...extra] = args.positionals;\n const subcommand = RUNS_SUBCOMMANDS.find((name) => name === rawSubcommand);\n if (!subcommand) {\n throw usageError(\n rawSubcommand\n ? `Unknown runs subcommand \"${rawSubcommand}\".`\n : 'runs needs a subcommand.',\n 'Run one of: ekanos runs start <agent> --team <slug> --prompt \"…\", ekanos runs list --team <slug>, ekanos runs show <run-id> --team <slug>, ekanos runs cancel <run-id> --team <slug> [--yes].',\n );\n }\n rejectExtra(extra, 'runs');\n const team = requireTeam(args.team);\n\n if (subcommand === 'start') {\n const agent = requireOperand(operand, 'agent key', 'runs start');\n return startAndReport(ctx, args, { team, agent, draft: false });\n }\n\n const { env, client, source } = await connect(ctx, args);\n\n if (subcommand === 'list') {\n if (operand) rejectExtra([operand], 'runs list');\n const status = parseStatus(args.status);\n const since = parseSince(args.since, Date.now());\n const list = await client.call((token) =>\n listRuns(env.host, token, {\n source,\n team,\n agent: args.agent,\n status,\n since,\n }),\n );\n const scope = [\n args.agent ? `for ${args.agent}` : '',\n status ? `${status}` : '',\n since ? `since ${since.slice(0, 16).replace('T', ' ')}` : '',\n ]\n .filter(Boolean)\n .join(', ');\n return ctx.succeed(\n { host: env.host, ...list },\n list.runs.length === 0\n ? ctx.ui.result({\n title: `No runs on ${list.team.slug}${scope ? ` (${scope})` : ''}`,\n tone: 'warn',\n })\n : ctx.ui.table(\n ['RUN', 'AGENT', 'STATUS', 'TRIGGER', 'VERSION', 'STARTED'],\n list.runs.map((run) => [\n run.id,\n agentLabel(run.agent),\n run.status,\n run.trigger,\n versionLabel(run),\n run.startedAt.slice(0, 19).replace('T', ' '),\n ]),\n ),\n );\n }\n\n if (subcommand === 'cancel') {\n const runId = requireOperand(operand, 'run id', 'runs cancel');\n await confirmCancel(ctx, args, { runId, team });\n const cancelled = await client.call((token) =>\n cancelRun(env.host, token, { source, team, runId }),\n );\n return ctx.succeed(\n { host: env.host, ...cancelled },\n ctx.ui.result({\n title: `Cancelled run ${cancelled.run.id} on ${cancelled.team.slug}`,\n tone: 'warn',\n rows: [\n ['Agent', agentLabel(cancelled.run.agent)],\n ['Status', cancelled.run.status],\n ],\n notes: [\n 'Its pending approvals expired, and runs it was waiting on were stopped too.',\n ],\n }),\n );\n }\n\n const runId = requireOperand(operand, 'run id', 'runs show');\n const detail = await client.call((token) =>\n showRun(env.host, token, { source, team, runId }),\n );\n return ctx.succeed({ host: env.host, ...detail }, runDetail(ctx.ui, detail));\n}\n\n/**\n * `agents test <key> --team <slug>`: run the template's latest version — its\n * draft, published or not — on one team, without publishing it. Marked as a\n * draft test run in the ledger; the team's stored agent still bounds every\n * tool call, so a draft can narrow what runs but never widen it. To test what\n * a draft adds — or a template never published — pin the team to the draft\n * first (`teams agents enable|pin <team> <key> --draft`); the host warns when\n * the team holds another version.\n */\nexport async function runAgentTest(\n ctx: CliContext,\n args: RunsArgs & { key: string | undefined },\n): Promise<ExitCode> {\n const agent = requireOperand(args.key, 'agent key', 'agents test');\n const team = requireTeam(args.team);\n return startAndReport(ctx, args, { team, agent, draft: true });\n}\n\n/**\n * `approvals` — what a team's agent runs are waiting on, and deciding it.\n * Decided with the authority a team's agent manager has in the app, and\n * recorded as your decision.\n */\nexport async function runApprovals(\n ctx: CliContext,\n args: RunsArgs,\n): Promise<ExitCode> {\n const [rawSubcommand, operand, ...extra] = args.positionals;\n const subcommand = APPROVALS_SUBCOMMANDS.find(\n (name) => name === rawSubcommand,\n );\n if (!subcommand) {\n throw usageError(\n rawSubcommand\n ? `Unknown approvals subcommand \"${rawSubcommand}\".`\n : 'approvals needs a subcommand.',\n 'Run one of: ekanos approvals list --team <slug>, ekanos approvals approve|reject <id> --team <slug> [--reason \"…\"], ekanos approvals edit <id> --team <slug> --body <file>.',\n );\n }\n rejectExtra(extra, 'approvals');\n const team = requireTeam(args.team);\n\n if (subcommand === 'list') {\n if (operand) rejectExtra([operand], 'approvals list');\n const { env, client, source } = await connect(ctx, args);\n const list = await client.call((token) =>\n listApprovals(env.host, token, { source, team }),\n );\n return ctx.succeed(\n { host: env.host, ...list },\n list.approvals.length === 0\n ? ctx.ui.result({ title: `Nothing waiting on ${list.team.slug}` })\n : ctx.ui.result({\n title: `${list.approvals.length} waiting on ${list.team.slug}`,\n tone: 'warn',\n rows: list.approvals.map((approval): ResultRow => [\n approval.id,\n approvalLines(approval),\n ]),\n notes: [\n '\"ekanos approvals approve|reject <id> --team <slug>\" decides one; \"approvals edit <id> --body <file>\" edits a reply draft and sends it.',\n ],\n }),\n );\n }\n\n const approvalId = requireOperand(\n operand,\n 'approval id',\n `approvals ${subcommand}`,\n );\n const editedBody =\n subcommand === 'edit' ? readBodyFile(args.body, args.dir) : undefined;\n if (subcommand !== 'edit' && args.body) {\n throw usageError(\n '--body is for \"approvals edit\".',\n `Run \"ekanos approvals edit ${approvalId} --team ${team} --body <file>\".`,\n );\n }\n\n const { env, client, source } = await connect(ctx, args);\n const decided = await client.call((token) =>\n decideApproval(\n env.host,\n token,\n { source, team, approvalId },\n {\n decision: subcommand === 'reject' ? 'rejected' : 'approved',\n ...(args.reason ? { reason: args.reason } : {}),\n ...(editedBody ? { body: editedBody } : {}),\n },\n ),\n );\n const approval = decided.approval;\n return ctx.succeed(\n { host: env.host, ...decided },\n ctx.ui.result({\n title: `${approval.status === 'rejected' ? 'Rejected' : editedBody ? 'Edited and approved' : 'Approved'} ${approval.toolName}`,\n tone: approval.status === 'rejected' ? 'warn' : 'ok',\n rows: [\n ['Agent', agentLabel(approval.agent)],\n ['Run', approval.runId],\n ],\n notes: [\n `The run picks it up now: \"ekanos runs show ${approval.runId} --team ${team}\".`,\n ],\n }),\n );\n}\n\n/**\n * Stopping a run can't be undone: a human run asks first; a scripted or JSON\n * run needs `--yes`. Asked before any request.\n */\nasync function confirmCancel(\n ctx: CliContext,\n args: RunsArgs,\n target: { runId: string; team: string },\n) {\n if (args.yes) return;\n if (ctx.jsonMode || !(args.stdinIsTTY ?? process.stdin.isTTY === true)) {\n throw validationError(\n `Cancelling run ${target.runId} on ${target.team} needs confirmation.`,\n `It stops the run for good and expires its pending approvals. Pass --yes to confirm: ekanos runs cancel ${target.runId} --team ${target.team} --yes`,\n );\n }\n const confirmed = await (args.confirm ?? promptYesNo)(\n `Stop run ${target.runId} on ${target.team} for good? [y/N]`,\n );\n if (!confirmed) {\n throw validationError(\n `Cancelling run ${target.runId} was not confirmed.`,\n 'Nothing was changed.',\n );\n }\n}\n\nasync function startAndReport(\n ctx: CliContext,\n args: RunsArgs,\n target: { team: string; agent: string; draft: boolean },\n): Promise<ExitCode> {\n const body = startBody(args, target);\n const { env, client, source } = await connect(ctx, args);\n const started = await client.call((token) =>\n startRun(env.host, token, { source, team: target.team }, body),\n );\n\n const startedNote = `${target.draft ? 'Testing' : 'Started'} ${agentLabel(started.agent)} on ${started.team.slug}${started.draftTemplateVersion ? ` (draft v${started.draftTemplateVersion}, unpublished)` : ''}: run ${started.runId}`;\n // A run started here needs no channel, so it ran; the agent's real trigger\n // may still never fire. Said up front, so a passing test is not read as\n // \"the agent answers in Linear\".\n const warnings = (started.warnings ?? []).map(\n (warning) => `Warning: ${warning}`,\n );\n\n if (!args.follow) {\n return ctx.succeed(\n { host: env.host, ...started },\n ctx.ui.result({\n title: startedNote,\n ...(warnings.length > 0 ? { tone: 'warn' as const } : {}),\n notes: [\n ...warnings,\n `Watch it: \"ekanos runs show ${started.runId} --team ${target.team}\".`,\n ],\n }),\n );\n }\n\n ctx.log(startedNote);\n for (const warning of warnings) ctx.log(warning);\n const detail = await follow(ctx, args, async (after) =>\n client.call((token) =>\n showRun(env.host, token, {\n source,\n team: target.team,\n runId: started.runId,\n after,\n }),\n ),\n );\n return ctx.succeed(\n { host: env.host, started, ...detail },\n runDetail(ctx.ui, detail),\n );\n}\n\n/**\n * Poll the run, printing its status changes, its messages and each tool\n * call as it lands, until it ends or parks on an approval.\n */\nasync function follow(\n ctx: CliContext,\n args: RunsArgs,\n read: (after: number | undefined) => Promise<AgentRunDetail>,\n): Promise<AgentRunDetail> {\n const sleep =\n args.sleep ??\n ((ms: number) => new Promise<void>((resolve) => setTimeout(resolve, ms)));\n const seenCalls = new Set<string>();\n const events: AgentRunDetail['events'] = [];\n let lastEvent: number | undefined;\n let lastStatus = '';\n const deadline = Date.now() + FOLLOW_TIMEOUT_MS;\n\n for (;;) {\n const detail = await read(lastEvent);\n for (const event of detail.events) {\n events.push(event);\n lastEvent = event.id;\n for (const line of eventLines(event.message)) ctx.log(` ${line}`);\n }\n for (const call of detail.toolCalls) {\n if (seenCalls.has(call.toolCallId)) continue;\n seenCalls.add(call.toolCallId);\n ctx.log(\n ` ${call.ok === false ? '✗' : '✓'} ${call.toolName} (${callFacts(call)})${call.error ? ` — ${call.error}` : ''}`,\n );\n }\n if (detail.run.status !== lastStatus) {\n lastStatus = detail.run.status;\n ctx.log(` status: ${lastStatus}`);\n }\n\n const waiting = detail.approvals.some(\n (approval) => approval.status === 'pending',\n );\n const ended = ['completed', 'failed', 'cancelled'].includes(\n detail.run.status,\n );\n if (ended || waiting || Date.now() > deadline) {\n return { ...detail, events };\n }\n await sleep(FOLLOW_INTERVAL_MS);\n }\n}\n\n/** Assistant text and tool calls from one live transcript message. */\nfunction eventLines(message: unknown): string[] {\n if (!isRecord(message)) return [];\n const content = message.content;\n if (message.role === 'assistant' && typeof content === 'string') {\n return content.trim() ? [`agent: ${clip(content)}`] : [];\n }\n if (!Array.isArray(content)) return [];\n return content.flatMap((part): string[] => {\n if (!isRecord(part)) return [];\n if (part.type === 'text' && message.role === 'assistant') {\n return typeof part.text === 'string' && part.text.trim()\n ? [`agent: ${clip(part.text)}`]\n : [];\n }\n if (part.type === 'tool-call' && typeof part.toolName === 'string') {\n return [`→ ${part.toolName}`];\n }\n return [];\n });\n}\n\nfunction startBody(\n args: RunsArgs,\n target: { agent: string; draft: boolean },\n): AgentRunStartRequest {\n if (!args.prompt && !args.input) {\n throw usageError(\n 'Give the run a prompt or an input.',\n `Pass --prompt \"…\" or --input <file.json>.`,\n );\n }\n let input: unknown;\n if (args.input) {\n const file = path.resolve(args.dir, args.input);\n let raw: string;\n try {\n raw = fs.readFileSync(file, 'utf8');\n } catch {\n throw usageError(`Cannot read ${file}.`, 'Pass --input <file.json>.');\n }\n try {\n input = JSON.parse(raw);\n } catch {\n throw validationError(\n `${file} is not valid JSON.`,\n 'Fix the file, or pass the text with --prompt instead.',\n );\n }\n }\n return {\n agent: target.agent,\n ...(args.prompt ? { prompt: args.prompt } : {}),\n ...(input !== undefined ? { input } : {}),\n draft: target.draft,\n };\n}\n\nfunction readBodyFile(file: string | undefined, dir: string): string {\n if (!file) {\n throw usageError(\n 'approvals edit needs the reply to send.',\n 'Pass --body <file> with the edited reply text.',\n );\n }\n const resolved = path.resolve(dir, file);\n let text: string;\n try {\n text = fs.readFileSync(resolved, 'utf8');\n } catch {\n throw usageError(`Cannot read ${resolved}.`, 'Pass --body <file>.');\n }\n if (!text.trim()) {\n throw validationError(`${resolved} is empty.`, 'Write the reply to send.');\n }\n return text;\n}\n\nfunction runDetail(ui: Ui, detail: AgentRunDetail): string {\n const { run } = detail;\n const pending = detail.approvals.filter(\n (approval) => approval.status === 'pending',\n );\n const rows: ResultRow[] = [\n ['Agent', agentLabel(run.agent)],\n ['Status', run.status],\n ['Trigger', run.trigger],\n ['Version', versionLabel(run)],\n ['Started', run.startedAt],\n ...(run.finishedAt ? [['Finished', run.finishedAt] as ResultRow] : []),\n ...(run.error ? [['Error', run.error] as ResultRow] : []),\n [\n 'Tool calls',\n detail.toolCalls.length === 0\n ? 'none'\n : detail.toolCalls.map(\n (call) =>\n `${call.ok === false ? '✗' : '✓'} ${call.toolName} (${callFacts(call)})`,\n ),\n ],\n ...(pending.length > 0\n ? [\n [\n 'Waiting on',\n pending.flatMap((approval) => [\n `${approval.id} ${approval.toolName}${approval.replyDraft ? ' (reply draft)' : ''}`,\n ]),\n ] as ResultRow,\n ]\n : []),\n ...(run.output ? [['Output', run.output.split('\\n')] as ResultRow] : []),\n ];\n return ui.result({\n title: `Run ${run.id}`,\n tone:\n run.status === 'failed'\n ? 'err'\n : run.status === 'completed'\n ? 'ok'\n : 'warn',\n rows,\n notes:\n pending.length > 0\n ? [\n `Decide: \"ekanos approvals approve|reject <id> --team ${detail.team.slug}\". Full record: --json.`,\n ]\n : ['The full transcript and every tool call: --json.'],\n });\n}\n\nfunction approvalLines(approval: AgentRunApproval): string[] {\n return [\n `${approval.toolName} · ${agentLabel(approval.agent)}${approval.replyDraft ? ' · reply draft (editable)' : ''}`,\n `run ${approval.runId}${approval.expiresAt ? ` · expires ${approval.expiresAt}` : ''}`,\n approval.argsWithheld\n ? \"arguments withheld: the team's own agent, so only a member of the team who could decide it sees what it would do\"\n : clip(JSON.stringify(approval.args ?? null)),\n ];\n}\n\nfunction agentLabel(agent: AgentRunSummary['agent']): string {\n return agent.templateKey ?? agent.slug;\n}\n\nfunction versionLabel(run: AgentRunSummary): string {\n return run.draftTemplateVersion\n ? `v${run.agentVersion} · draft test of template v${run.draftTemplateVersion}`\n : `v${run.agentVersion}`;\n}\n\nfunction clip(text: string, max = 200): string {\n const flat = text.replace(/\\s+/g, ' ').trim();\n return flat.length > max ? `${flat.slice(0, max - 1)}…` : flat;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction requireTeam(value: string | undefined): string {\n const slug = value?.trim().toLowerCase();\n if (slug && /^[a-z0-9][a-z0-9-]*$/.test(slug)) return slug;\n throw usageError(\n value\n ? `\"${value}\" is not a team slug.`\n : 'Name the team with --team <slug>.',\n '\"ekanos teams list\" lists the teams on this Source.',\n );\n}\n\nfunction requireOperand(\n value: string | undefined,\n what: string,\n command: string,\n): string {\n const trimmed = value?.trim();\n if (trimmed) return trimmed;\n throw usageError(`Name the ${what}.`, `See \"ekanos ${command} --help\".`);\n}\n\n/** `--status`, one of the run statuses. */\nfunction parseStatus(raw: string | undefined): string | undefined {\n if (raw === undefined) return undefined;\n const parsed = AgentRunStatusSchema.safeParse(raw.trim());\n if (parsed.success) return parsed.data;\n throw usageError(\n `--status \"${raw}\" is not a run status.`,\n `Use one of: ${AgentRunStatusSchema.options.join(', ')}.`,\n );\n}\n\nfunction rejectExtra(extra: readonly string[], command: string) {\n if (extra.length > 0) {\n throw usageError(\n `Unexpected argument \"${extra[0]}\".`,\n `See \"ekanos ${command.split(' ')[0]} --help\".`,\n );\n }\n}\n\nasync function connect(ctx: CliContext, args: RunsArgs) {\n const env = resolveAuthEnvironment(ctx, args.host, args.env, {\n projectDir: args.dir,\n });\n const resolved = await resolveSourceTarget(env, requireSession(env), args);\n return {\n env,\n client: new RunsClient(env, resolved.session),\n source: resolved.source,\n };\n}\n\nclass RunsClient {\n constructor(\n private readonly env: AuthEnvironment,\n private session: StoredSession,\n ) {}\n\n async call<T>(\n send: (accessToken: string) => Promise<RunsApiResult<T>>,\n ): Promise<T> {\n let result = await send(this.session.accessToken);\n if (result.status === 'unauthorized') {\n this.session = await refreshStoredSession(this.env, this.session);\n result = await send(this.session.accessToken);\n }\n if (result.status === 'ok') return result.data;\n throw authRequiredError(\n `The session for ${this.env.host} could not authorize the call.`,\n loginHint(this.env),\n );\n }\n}\n\nconst CONNECTION_WORDS = {\n source: 'via Source connection',\n team: 'via team connection',\n person: 'via personal connection',\n} as const;\n\n/** Effect, how it was authorized, and whose connection it ran on. */\nfunction callFacts(call: AgentRunToolCall): string {\n return [\n call.effect,\n call.authorizedVia,\n ...(call.connection ? [CONNECTION_WORDS[call.connection]] : []),\n ].join(', ');\n}\n"]}
@@ -0,0 +1,21 @@
1
+ import type { TeamScopeState } from '@ekanos/integration-schema';
2
+ export interface ScopeFacts {
3
+ state: TeamScopeState;
4
+ scopes: string[];
5
+ }
6
+ /** "hidden by its product scope Bronze" — the problem, in words. */
7
+ export declare function scopeHiddenWords(scope: ScopeFacts): string;
8
+ /** The command that shows the product to the team. */
9
+ export declare function scopeFix(scope: ScopeFacts, target: {
10
+ team: string;
11
+ product: string;
12
+ source: string;
13
+ }): string;
14
+ /** The two lines `teams show` / `teams connect` print for a hidden product. */
15
+ export declare function scopeHiddenLines(scope: (ScopeFacts & {
16
+ hidden: boolean;
17
+ }) | undefined, target: {
18
+ team: string;
19
+ product: string;
20
+ source: string;
21
+ }): string[];
@@ -0,0 +1,35 @@
1
+ /**
2
+ * A product the CLI reports as ready for a team can still be hidden from the
3
+ * team in the app by the team's product scopes — the "Bronze" scope that
4
+ * hid Linear and Zendesk on a team whose setup read as done. Wherever the
5
+ * CLI says a product is ready, it says this too, with the command that
6
+ * changes it.
7
+ */
8
+ const CLI = 'npx @ekanos/cli';
9
+ /** "hidden by its product scope Bronze" — the problem, in words. */
10
+ export function scopeHiddenWords(scope) {
11
+ return scope.state === 'locked_out' || scope.scopes.length === 0
12
+ ? 'hidden from the team in the app: it holds none of the Source’s product scopes'
13
+ : `hidden from the team in the app by its product scope${scope.scopes.length === 1 ? '' : 's'} ${scope.scopes.join(', ')}`;
14
+ }
15
+ /** The command that shows the product to the team. */
16
+ export function scopeFix(scope, target) {
17
+ const set = `${CLI} teams scope set ${target.team} <scope> --source ${target.source}`;
18
+ if (scope.state === 'locked_out' || scope.scopes.length === 0) {
19
+ return `${set} (scopes and their products: ${CLI} sources scopes --source ${target.source})`;
20
+ }
21
+ return `${CLI} sources scopes add ${quote(scope.scopes[0])} ${target.product} --source ${target.source} (every team on ${scope.scopes[0]} then sees it; or move the team to a scope that has it: ${set})`;
22
+ }
23
+ /** The two lines `teams show` / `teams connect` print for a hidden product. */
24
+ export function scopeHiddenLines(scope, target) {
25
+ if (!(scope === null || scope === void 0 ? void 0 : scope.hidden))
26
+ return [];
27
+ return [
28
+ `! ${target.product} is ${scopeHiddenWords(scope)}.`,
29
+ ` Fix: ${scopeFix(scope, target)}`,
30
+ ];
31
+ }
32
+ function quote(name) {
33
+ return /^[A-Za-z0-9._-]+$/.test(name) ? name : `"${name}"`;
34
+ }
35
+ //# sourceMappingURL=scope-notice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope-notice.js","sourceRoot":"","sources":["../../src/commands/scope-notice.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AAEH,MAAM,GAAG,GAAG,iBAAiB,CAAC;AAO9B,oEAAoE;AACpE,MAAM,UAAU,gBAAgB,CAAC,KAAiB;IAChD,OAAO,KAAK,CAAC,KAAK,KAAK,YAAY,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;QAC9D,CAAC,CAAC,+EAA+E;QACjF,CAAC,CAAC,uDAAuD,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AAC/H,CAAC;AAED,sDAAsD;AACtD,MAAM,UAAU,QAAQ,CACtB,KAAiB,EACjB,MAAyD;IAEzD,MAAM,GAAG,GAAG,GAAG,GAAG,oBAAoB,MAAM,CAAC,IAAI,qBAAqB,MAAM,CAAC,MAAM,EAAE,CAAC;IACtF,IAAI,KAAK,CAAC,KAAK,KAAK,YAAY,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9D,OAAO,GAAG,GAAG,iCAAiC,GAAG,4BAA4B,MAAM,CAAC,MAAM,GAAG,CAAC;IAChG,CAAC;IACD,OAAO,GAAG,GAAG,uBAAuB,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,IAAI,MAAM,CAAC,OAAO,aAAa,MAAM,CAAC,MAAM,oBAAoB,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,2DAA2D,GAAG,GAAG,CAAC;AAC9M,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,gBAAgB,CAC9B,KAAqD,EACrD,MAAyD;IAEzD,IAAI,EAAC,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,MAAM,CAAA;QAAE,OAAO,EAAE,CAAC;IAC9B,OAAO;QACL,KAAK,MAAM,CAAC,OAAO,OAAO,gBAAgB,CAAC,KAAK,CAAC,GAAG;QACpD,UAAU,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE;KACpC,CAAC;AACJ,CAAC;AAED,SAAS,KAAK,CAAC,IAAY;IACzB,OAAO,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC;AAC7D,CAAC","sourcesContent":["import type { TeamScopeState } from '@ekanos/integration-schema';\n\n/**\n * A product the CLI reports as ready for a team can still be hidden from the\n * team in the app by the team's product scopes — the \"Bronze\" scope that\n * hid Linear and Zendesk on a team whose setup read as done. Wherever the\n * CLI says a product is ready, it says this too, with the command that\n * changes it.\n */\n\nconst CLI = 'npx @ekanos/cli';\n\nexport interface ScopeFacts {\n state: TeamScopeState;\n scopes: string[];\n}\n\n/** \"hidden by its product scope Bronze\" — the problem, in words. */\nexport function scopeHiddenWords(scope: ScopeFacts): string {\n return scope.state === 'locked_out' || scope.scopes.length === 0\n ? 'hidden from the team in the app: it holds none of the Source’s product scopes'\n : `hidden from the team in the app by its product scope${scope.scopes.length === 1 ? '' : 's'} ${scope.scopes.join(', ')}`;\n}\n\n/** The command that shows the product to the team. */\nexport function scopeFix(\n scope: ScopeFacts,\n target: { team: string; product: string; source: string },\n): string {\n const set = `${CLI} teams scope set ${target.team} <scope> --source ${target.source}`;\n if (scope.state === 'locked_out' || scope.scopes.length === 0) {\n return `${set} (scopes and their products: ${CLI} sources scopes --source ${target.source})`;\n }\n return `${CLI} sources scopes add ${quote(scope.scopes[0]!)} ${target.product} --source ${target.source} (every team on ${scope.scopes[0]} then sees it; or move the team to a scope that has it: ${set})`;\n}\n\n/** The two lines `teams show` / `teams connect` print for a hidden product. */\nexport function scopeHiddenLines(\n scope: (ScopeFacts & { hidden: boolean }) | undefined,\n target: { team: string; product: string; source: string },\n): string[] {\n if (!scope?.hidden) return [];\n return [\n `! ${target.product} is ${scopeHiddenWords(scope)}.`,\n ` Fix: ${scopeFix(scope, target)}`,\n ];\n}\n\nfunction quote(name: string): string {\n return /^[A-Za-z0-9._-]+$/.test(name) ? name : `\"${name}\"`;\n}\n"]}
@@ -5,7 +5,7 @@ import type { CliContext } from '../context.js';
5
5
  import type { ExitCode } from '../exit-codes.js';
6
6
  import { type SkillsApiResult } from '../skills-api.js';
7
7
  import { type Ui } from '../ui.js';
8
- export declare const SKILLS_SUBCOMMANDS: readonly ['list', 'show', 'push', 'pull'];
8
+ export declare const SKILLS_SUBCOMMANDS: readonly ['list', 'show', 'push', 'pull', 'archive', 'unarchive'];
9
9
  /** Where an agent directory keeps the skills it uses: `agents/<key>/skills/<slug>/SKILL.md`. */
10
10
  export declare const AGENT_SKILLS_DIR = "skills";
11
11
  export interface SkillsArgs {
@@ -18,8 +18,14 @@ export interface SkillsArgs {
18
18
  team?: string;
19
19
  /** `pull`: where to write the folder (default `skills/<slug>`). */
20
20
  out?: string;
21
+ /** `pull`: overwrite local files that differ from the host's. */
22
+ force?: boolean;
23
+ /** `archive`: confirm without asking. */
24
+ yes?: boolean;
21
25
  dir: string;
22
26
  env: Record<string, string | undefined>;
27
+ stdinIsTTY?: boolean;
28
+ confirm?: (question: string) => Promise<boolean>;
23
29
  }
24
30
  /**
25
31
  * `skills` — the Source's skills, held by Ekanos in its skill store. A skill
@@ -12,13 +12,23 @@ var __rest = (this && this.__rest) || function (s, e) {
12
12
  import { SOURCE_SKILL_ENTRY_FILE, SOURCE_SKILL_LIMITS, SourceSkillSlugSchema, } from '@ekanos/integration-schema';
13
13
  import * as fs from 'node:fs';
14
14
  import * as path from 'node:path';
15
+ import { loginHint } from '../auth/host-trust.js';
15
16
  import { refreshStoredSession, requireSession, resolveAuthEnvironment, } from '../auth/session.js';
16
- import { authRequiredError, notFoundError, usageError, validationError, } from '../errors.js';
17
+ import { authRequiredError, invalidStateError, notFoundError, usageError, validationError, } from '../errors.js';
18
+ import { writePulledFiles } from '../pull-write.js';
17
19
  import { classifyPath } from '../safe-fs.js';
18
- import { listSkills, pushSkill, showSkill, } from '../skills-api.js';
20
+ import { archiveSkill, listSkills, pushSkill, showSkill, } from '../skills-api.js';
19
21
  import { resolveSourceTarget } from '../source-target.js';
20
22
  import { pluralize } from '../ui.js';
21
- export const SKILLS_SUBCOMMANDS = ['list', 'show', 'push', 'pull'];
23
+ import { promptYesNo } from './publish.js';
24
+ export const SKILLS_SUBCOMMANDS = [
25
+ 'list',
26
+ 'show',
27
+ 'push',
28
+ 'pull',
29
+ 'archive',
30
+ 'unarchive',
31
+ ];
22
32
  /** Where an agent directory keeps the skills it uses: `agents/<key>/skills/<slug>/SKILL.md`. */
23
33
  export const AGENT_SKILLS_DIR = 'skills';
24
34
  /**
@@ -39,7 +49,7 @@ export async function runSkills(ctx, args) {
39
49
  const env = resolveAuthEnvironment(ctx, args.host, args.env, {
40
50
  projectDir: args.dir,
41
51
  });
42
- const resolved = await resolveSourceTarget(env, requireSession(env.store, env.host), args);
52
+ const resolved = await resolveSourceTarget(env, requireSession(env), args);
43
53
  const client = new SkillsClient(env, resolved.session);
44
54
  const source = resolved.source;
45
55
  const team = ((_a = args.team) === null || _a === void 0 ? void 0 : _a.trim()) || undefined;
@@ -62,7 +72,16 @@ export async function runSkills(ctx, args) {
62
72
  const slug = requireSlug(args.target, 'pull');
63
73
  const shown = await client.call((token) => showSkill(env.host, token, source, slug, team));
64
74
  const outDir = path.resolve(args.dir, (_b = args.out) !== null && _b !== void 0 ? _b : path.join(AGENT_SKILLS_DIR, slug));
65
- const written = writeSkillFolder(outDir, shown.files);
75
+ const written = writePulledFiles({
76
+ projectDir: args.dir,
77
+ outDir,
78
+ files: shown.files.map((file) => ({
79
+ path: file.path,
80
+ contents: Buffer.from(file.content, file.encoding === 'base64' ? 'base64' : 'utf8'),
81
+ })),
82
+ force: args.force === true,
83
+ rerun: `ekanos skills pull ${slug}${team ? ` --team ${team}` : ''}`,
84
+ });
66
85
  return ctx.succeed({
67
86
  host: env.host,
68
87
  slug,
@@ -80,6 +99,20 @@ export async function runSkills(ctx, args) {
80
99
  ],
81
100
  }));
82
101
  }
102
+ case 'archive':
103
+ case 'unarchive': {
104
+ const slug = requireSlug(args.target, subcommand);
105
+ if (subcommand === 'archive') {
106
+ await confirmArchive(ctx, args, {
107
+ slug,
108
+ where: team !== null && team !== void 0 ? team : source,
109
+ source,
110
+ team,
111
+ });
112
+ }
113
+ const result = await client.call((token) => archiveSkill(env.host, token, subcommand, { source, slug, team }));
114
+ return ctx.succeed(Object.assign({ host: env.host }, result), archiveSummary(ctx.ui, result, subcommand, team));
115
+ }
83
116
  case 'push': {
84
117
  const result = await pushSkillFolder(client, env.host, {
85
118
  source,
@@ -90,6 +123,42 @@ export async function runSkills(ctx, args) {
90
123
  }
91
124
  }
92
125
  }
126
+ /**
127
+ * Archiving takes a skill away from every agent that could name it. A human
128
+ * run asks first; a scripted or JSON run needs `--yes`.
129
+ */
130
+ async function confirmArchive(ctx, args, target) {
131
+ var _a, _b;
132
+ if (args.yes)
133
+ return;
134
+ const canPrompt = !ctx.jsonMode && ((_a = args.stdinIsTTY) !== null && _a !== void 0 ? _a : process.stdin.isTTY === true);
135
+ if (!canPrompt) {
136
+ throw invalidStateError(`Archiving ${target.slug} on ${target.where} means no agent can name it, and it cannot be pushed, until it is unarchived.`, `Re-run with --yes: ekanos skills archive ${target.slug}${target.team ? ` --team ${target.team}` : ''} --source ${target.source} --yes`);
137
+ }
138
+ const confirmed = await ((_b = args.confirm) !== null && _b !== void 0 ? _b : promptYesNo)(`Archive ${target.slug} on ${target.where}? No agent can name it until "ekanos skills unarchive ${target.slug}". [y/N]`);
139
+ if (!confirmed) {
140
+ throw validationError(`Archiving ${target.slug} was not confirmed.`, 'Nothing was changed.');
141
+ }
142
+ }
143
+ function archiveSummary(ui, result, action, team) {
144
+ const { skill } = result;
145
+ const flag = team ? ` --team ${team}` : '';
146
+ if (result.outcome === 'unchanged') {
147
+ return ui.result({
148
+ title: `Unchanged: ${skill.slug} is already ${action === 'archive' ? 'archived' : 'active'}`,
149
+ tone: 'warn',
150
+ });
151
+ }
152
+ return ui.result({
153
+ title: `${result.outcome === 'archived' ? 'Archived' : 'Unarchived'}: ${skill.slug}`,
154
+ rows: skill.version ? [['Version', `v${skill.version}`]] : [],
155
+ notes: [
156
+ result.outcome === 'archived'
157
+ ? `No agent can name it now. "ekanos skills unarchive ${skill.slug}${flag}" brings it back.`
158
+ : 'Agents can name it again.',
159
+ ],
160
+ });
161
+ }
93
162
  /** Every call refreshes the session once on a 401, then gives up. */
94
163
  export class SkillsClient {
95
164
  constructor(env, session) {
@@ -104,7 +173,7 @@ export class SkillsClient {
104
173
  }
105
174
  if (result.status === 'ok')
106
175
  return result.data;
107
- throw authRequiredError(`The session for ${this.env.host} could not authorize the skills call.`, `Run "ekanos login --host ${this.env.host}" and retry.`);
176
+ throw authRequiredError(`The session for ${this.env.host} could not authorize the skills call.`, loginHint(this.env));
108
177
  }
109
178
  }
110
179
  export function pushSkillFolder(client, host, input) {
@@ -198,23 +267,6 @@ export function findAgentSkillFolders(agentDir) {
198
267
  .filter((dir) => classifyPath(dir) === 'directory' &&
199
268
  classifyPath(path.join(dir, SOURCE_SKILL_ENTRY_FILE)) === 'file');
200
269
  }
201
- function writeSkillFolder(outDir, files) {
202
- const written = [];
203
- for (const file of files) {
204
- const target = path.resolve(outDir, ...file.path.split('/'));
205
- if (!target.startsWith(outDir + path.sep)) {
206
- throw validationError(`Refusing to write ${file.path} outside ${outDir}.`, 'The host sent a path that leaves the folder.');
207
- }
208
- const kind = classifyPath(target);
209
- if (kind !== 'missing' && kind !== 'file') {
210
- throw validationError(`Refusing to write through ${target} (${kind}).`, 'Remove it, or pass --out <dir>.');
211
- }
212
- fs.mkdirSync(path.dirname(target), { recursive: true });
213
- fs.writeFileSync(target, Buffer.from(file.content, file.encoding === 'base64' ? 'base64' : 'utf8'));
214
- written.push(target);
215
- }
216
- return written;
217
- }
218
270
  function encodeBytes(bytes) {
219
271
  try {
220
272
  return {
@@ -386,7 +438,11 @@ export function pushSummary(ui, result) {
386
438
  ? [
387
439
  'Live now: every agent that names this skill reads the new version.',
388
440
  ]
389
- : [],
441
+ : skill.team && result.outcome === 'created'
442
+ ? [
443
+ `A provided agent reads it once attached, where its template allows team skills: ekanos teams agents skills ${skill.team.slug} <agent-key> add ${skill.slug}`,
444
+ ]
445
+ : [],
390
446
  });
391
447
  }
392
448
  function formatBytes(bytes) {