@x-otto/cli 0.0.1-alpha.53 → 0.0.1-alpha.55

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 (42) hide show
  1. package/dist/{auth-command--ky3JspQ.js → auth-command-Cw71Gud0.js} +2 -2
  2. package/dist/{auth-command--ky3JspQ.js.map → auth-command-Cw71Gud0.js.map} +1 -1
  3. package/dist/build-id-9kqTcA9R.js +3 -0
  4. package/dist/build-id-9kqTcA9R.js.map +1 -0
  5. package/dist/bundled-extensions/plugin-otto-wire-protocols/plugin-dist/meta.json +1 -1
  6. package/dist/bundled-extensions/plugin-otto-wire-protocols/plugin-dist/plugin.cjs +195 -161
  7. package/dist/bundled-extensions/plugin-otto-wire-protocols/plugin.ts +4 -0
  8. package/dist/bundled-extensions/plugin-otto-wire-protocols/src/anthropic-messages.ts +9 -1
  9. package/dist/bundled-extensions/plugin-otto-wire-protocols/src/openai-completions.ts +11 -1
  10. package/dist/bundled-extensions/plugin-otto-wire-protocols/src/openai-responses.ts +9 -1
  11. package/dist/command-dispatcher-W3E5zhWN.js +18 -0
  12. package/dist/command-dispatcher-W3E5zhWN.js.map +1 -0
  13. package/dist/create-host-app-_xUKDWy7.js +3 -0
  14. package/dist/{create-host-app-BtifD7KK.js.map → create-host-app-_xUKDWy7.js.map} +1 -1
  15. package/dist/{doctor-BAxvhLws.js → doctor-BDEllJgc.js} +2 -2
  16. package/dist/{doctor-BAxvhLws.js.map → doctor-BDEllJgc.js.map} +1 -1
  17. package/dist/{feedback-CJVKfI0S.js → feedback-CqTWm_TD.js} +10 -10
  18. package/dist/{feedback-CJVKfI0S.js.map → feedback-CqTWm_TD.js.map} +1 -1
  19. package/dist/{feedback-backend-methods-C23Z2suw.js → feedback-backend-methods-3CMRkGoJ.js} +2 -2
  20. package/dist/{feedback-backend-methods-C23Z2suw.js.map → feedback-backend-methods-3CMRkGoJ.js.map} +1 -1
  21. package/dist/index.js +7 -7
  22. package/dist/index.js.map +1 -1
  23. package/dist/{interactive-schedule-BKiI3Qrw.js → interactive-schedule-D0NOMjB7.js} +2 -2
  24. package/dist/{interactive-schedule-BKiI3Qrw.js.map → interactive-schedule-D0NOMjB7.js.map} +1 -1
  25. package/dist/{mcp-server-CfJK4pav.js → mcp-server-kME-VSX4.js} +2 -2
  26. package/dist/{mcp-server-CfJK4pav.js.map → mcp-server-kME-VSX4.js.map} +1 -1
  27. package/dist/{parse-cli-B9Go-f6A.js → parse-cli-Byh6vJ3e.js} +2 -2
  28. package/dist/{parse-cli-B9Go-f6A.js.map → parse-cli-Byh6vJ3e.js.map} +1 -1
  29. package/dist/schedule-C_uHI2M8.js +5 -0
  30. package/dist/schedule-C_uHI2M8.js.map +1 -0
  31. package/dist/{serve-ChSSkjLs.js → serve-Di0fC7-B.js} +2 -2
  32. package/dist/{serve-ChSSkjLs.js.map → serve-Di0fC7-B.js.map} +1 -1
  33. package/dist/{version-BL66TSQP.js → version-CHEEY4Vx.js} +2 -2
  34. package/dist/{version-BL66TSQP.js.map → version-CHEEY4Vx.js.map} +1 -1
  35. package/package.json +18 -18
  36. package/dist/build-id-C94zHRXj.js +0 -3
  37. package/dist/build-id-C94zHRXj.js.map +0 -1
  38. package/dist/command-dispatcher-CKj6qR-G.js +0 -18
  39. package/dist/command-dispatcher-CKj6qR-G.js.map +0 -1
  40. package/dist/create-host-app-BtifD7KK.js +0 -3
  41. package/dist/schedule-Ke0jwatM.js +0 -5
  42. package/dist/schedule-Ke0jwatM.js.map +0 -1
@@ -1,3 +0,0 @@
1
- #!/usr/bin/env node
2
- import{ot as e}from"./command-dispatcher-CKj6qR-G.js";import{t}from"./bundled-extensions-C3n8jg20.js";import{createApp as n}from"@x-otto/coding";var r=e({createHostApp:()=>a,hostSelfDescribingOptions:()=>i});function i(){let e=t();return{pluginBundledDirs:e?[e]:[]}}function a(e){return n({...i(),...e})}export{r as n,a as t};
3
- //# sourceMappingURL=create-host-app-BtifD7KK.js.map
@@ -1,5 +0,0 @@
1
- #!/usr/bin/env node
2
- import{OTTO_HOME as e}from"@x-otto/env";import{resolve as t}from"node:path";import{readFileSync as n,readdirSync as r}from"node:fs";import{parseCron as i}from"@x-otto/schedule";let a;function o(e){a=e}const s=async(e,t)=>{let n=a;if(!n){t.tui.info.showToast(`Schedule`,`Schedule system not available`);return}let r=e[0];switch(r){case void 0:return c(t);case`list`:return l(n,t);case`add`:return d(e.slice(1),n,t);case`remove`:return f(e[1],n,t);case`run`:return p(e[1],n,t);case`enable`:return h(e[1],!0,n,t);case`disable`:return h(e[1],!1,n,t);case`logs`:return g(e[1],t);case`cancel`:return m(e[1],t);default:t.tui.info.showToast(`Schedule`,`/schedule ${r} — unknown subcommand. Use: add|list|remove|run|enable|disable|cancel|logs`)}};async function c(e){let t=(e.app.getPluginPanelRegistrations?.()??[]).find(e=>e.pluginId===`plugin-schedule`);if(!t){e.tui.info.showToast(`Schedule`,`Schedule panel not installed — run "otto extension install plugin-schedule"`);return}e.tui.modal.openModal({kind:`pluginPanel`,panelInfo:{title:t.title,modulePath:t.modulePath,exportName:t.exportName,pluginId:t.pluginId},onClose:()=>{}})}async function l(e,t){let n=e.list(),r=e.isFireOwner()?[]:e.fireOwnerFailureReason()===`network-error`?[`[read-only — could not reach the remote schedule service; check network/persistenced connectivity]`]:[`[read-only — another terminal holds the fire-ownership lease for this workspace]`];if(n.length===0){t.tui.info.showToast(`Schedule`,r.length>0?`No scheduled tasks. ${r[0]}`:`No scheduled tasks`);return}let i=[];for(let e of n){let t=e.lastFireFailed?`✕`:e.enabled?`◉`:`○`,n=e.recurring?e.cronExpression:`one-shot`,r=new Date(e.nextFireAt).toLocaleString(),a=e.lastFireFailed&&e.lastFireError?` (failed: ${e.lastFireError})`:``;i.push(`${t} ${e.id} ${e.name}${a}`),i.push(` ${n} next: ${r}`)}t.tui.messages.pushMessage({role:`command_echo`,command:`/schedule`,status:r.length>0?`warn`:`ok`,summary:r.length>0?r[0]:`${n.length} 个已排定任务`,detail:i.join(`
3
- `)}),t.tui.panes.togglePane?.(`schedulePane`)}function u(e){if(e.length>=5){let t=e.slice(0,5).join(` `);try{return i(t),{cron:t,prompt:e.slice(5).join(` `)}}catch{}}return{cron:e[0]??``,prompt:e.slice(1).join(` `)}}async function d(e,t,n){if(e.length<2){n.tui.info.showToast(`Schedule`,`/schedule add [--once] [--session] <cron 5 fields> <prompt>`);return}let r=!1,i,a=[...e],o=a.indexOf(`--once`);o!==-1&&(r=!0,a.splice(o,1));let s=a.indexOf(`--session`);if(s!==-1&&(i=`session`,a.splice(s,1)),a.length<2){n.tui.info.showToast(`Schedule`,`Opening schedule panel in create mode`),c(n);return}let{cron:l,prompt:d}=u(a);try{let e=t.add({name:d.slice(0,40),prompt:d,cronExpression:l,recurring:!r,origin:`user`,target:i}),a=r?`one-shot`:`recurring`,o=new Date(e.nextFireAt).toLocaleString(),s=e.target===`session`?` [fires into this conversation]`:``;n.tui.info.showToast(`Schedule`,`${e.id}: ${e.name} (${a})${s} next: ${o}`)}catch(e){n.tui.info.showToast(`Schedule`,`Failed: ${e instanceof Error?e.message:String(e)}`)}}async function f(e,t,n){if(!e){n.tui.info.showToast(`Schedule`,`/schedule remove <id>`);return}let r=t.remove(e);n.tui.info.showToast(`Schedule`,r?`Removed ${e}`:`Schedule "${e}" not found`)}async function p(e,t,n){if(!e){n.tui.info.showToast(`Schedule`,`/schedule run <id>`);return}try{t.runNow(e),n.tui.info.showToast(`Schedule`,`Triggering ${e}...`)}catch(e){n.tui.info.showToast(`Schedule`,`Failed: ${e instanceof Error?e.message:String(e)}`)}}async function m(e,t){let n=a;if(!n){t.tui.info.showToast(`Schedule`,`Schedule system not available`);return}if(!e){t.tui.info.showToast(`Schedule`,`/schedule cancel <id>`);return}let r=n.cancel(e);r.ok?t.tui.info.showToast(`Schedule`,`Canceled "${e}"`):t.tui.info.showToast(`Schedule`,`Cannot cancel "${e}": ${r.reason??`unknown`}`)}async function h(e,t,n,r){if(!e){r.tui.info.showToast(`Schedule`,`/schedule ${t?`enable`:`disable`} <id>`);return}let i=n.update(e,{enabled:t});r.tui.info.showToast(`Schedule`,i?`Schedule ${e} ${t?`enabled`:`disabled`}`:`Schedule "${e}" not found`)}async function g(i,a){let o=t(e,`schedule-logs`),s;try{s=r(o)}catch{a.tui.info.showToast(`Schedule`,`No schedule logs found`);return}if(i&&(s=s.filter(e=>e.startsWith(i+`-`))),s.length===0){a.tui.info.showToast(`Schedule`,i?`No logs for schedule "${i}"`:`No schedule logs found`);return}s.sort().reverse();let c=s.slice(0,5),l=[];for(let e of c)try{let r=n(t(o,e),`utf-8`).trim(),i=e.indexOf(`-`),a=i>0?e.slice(0,i):e;l.push(`${a} ${r}`)}catch{l.push(`${e} (unreadable)`)}let u=s.length-c.length;u>0&&l.push(`... and ${u} more entries`),a.tui.messages.pushMessage({role:`command_echo`,command:`/schedule logs`,summary:`${s.length} 条日志文件`,detail:l.join(`
4
- `)})}export{o as n,s as t};
5
- //# sourceMappingURL=schedule-Ke0jwatM.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"schedule-Ke0jwatM.js","names":[],"sources":["../src/commands/handlers/schedule.ts"],"sourcesContent":["/**\n * /schedule 命令:周期性 Agent Job 管理(增删改查/手动执行)。\n */\n\nimport { readdirSync, readFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\n\n// RFC-161 M2:SchedulerService 已迁至 @x-otto/schedule,直连新真源。\nimport type { SchedulerService } from '@x-otto/schedule'\nimport { parseCron } from '@x-otto/schedule'\nimport { OTTO_HOME } from '@x-otto/env'\n\nimport type { CliContext } from '../../command-dispatcher'\n\n/** RFC-426 M3:/schedule 定时任务管理——app 仅 getPluginPanelRegistrations(打开面板)+ tui。 */\nexport type ScheduleCtx = Pick<CliContext, 'tui'> & {\n app: Pick<CliContext['app'], 'getPluginPanelRegistrations'>\n}\n\n// ── Module-level scheduler ref ──\n\nlet schedulerRef: SchedulerService | undefined\n\nexport function setScheduleService(s: SchedulerService | undefined): void {\n schedulerRef = s\n}\n\n// ── Main handler ──\n\nexport const handleSchedule = async (args: string[], ctx: ScheduleCtx): Promise<void> => {\n const scheduler = schedulerRef\n if (!scheduler) {\n ctx.tui.info.showToast('Schedule', 'Schedule system not available')\n return\n }\n\n const sub = args[0]\n switch (sub) {\n case undefined:\n // RFC-229 M2: open the schedule plugin panel\n return handleOpenPanel(ctx)\n case 'list':\n return handleList(scheduler, ctx)\n case 'add':\n return handleAdd(args.slice(1), scheduler, ctx)\n case 'remove':\n return handleRemove(args[1], scheduler, ctx)\n case 'run':\n return handleRun(args[1], scheduler, ctx)\n case 'enable':\n return handleToggle(args[1], true, scheduler, ctx)\n case 'disable':\n return handleToggle(args[1], false, scheduler, ctx)\n case 'logs':\n return handleLogs(args[1], ctx)\n case 'cancel':\n return handleCancel(args[1], ctx)\n default:\n ctx.tui.info.showToast('Schedule', `/schedule ${sub} — unknown subcommand. Use: add|list|remove|run|enable|disable|cancel|logs`)\n }\n}\n\n// ── Subcommand handlers ──\n\n// open panel (RFC-229 M2: when /schedule is called without subcommand)\n//\n// 2026-07-25 终局修复:不再用 resolveOttoRepoRoot() 猜测 extensions/plugin-schedule/panels-dist/\n// 的磁盘路径——该函数向上找 `.git` 定位仓库根,只在本仓开发环境有效,`@x-otto/cli` 一旦真正\n// 发布到 npm(生产分发只含 `dist/`,无 `.git`),该函数恒返回 undefined,面板永远打不开。\n// schedule 现已物化为独立 npm 包 `@x-otto/plugin-schedule-panel`(对齐 browser-use/mobile-use 等既有\n// 内置扩展形态),走 `otto extension install schedule` 标准安装流程软链进 `~/.otto/plugins/\n// schedule`,面板路径改为查已注册的 `PanelRegistration`(`app.getPluginPanelRegistrations()`,\n// 内部用真实插件目录 `p.dir` 拼接,不依赖任何路径猜测)。\nasync function handleOpenPanel(ctx: ScheduleCtx): Promise<void> {\n const panel = (ctx.app.getPluginPanelRegistrations?.() ?? []).find(\n (p) => p.pluginId === 'plugin-schedule',\n )\n if (!panel) {\n ctx.tui.info.showToast(\n 'Schedule',\n 'Schedule panel not installed — run \"otto extension install plugin-schedule\"',\n )\n return\n }\n ctx.tui.modal.openModal({\n kind: 'pluginPanel',\n panelInfo: {\n title: panel.title,\n modulePath: panel.modulePath,\n exportName: panel.exportName,\n pluginId: panel.pluginId,\n },\n onClose: () => {},\n } as any)\n}\n\nasync function handleList(scheduler: SchedulerService, ctx: ScheduleCtx): Promise<void> {\n const tasks = scheduler.list()\n // RFC-169 D3d: surface read-only state — the user can see the shared task list but\n // this process isn't the one that will fire them (another terminal holds the lease).\n // F2 (RFC-169 终局 review 2026-07-15): distinguish \"another terminal genuinely holds the\n // lease\" from \"we couldn't reach the remote lease service at all\" — showing the wrong\n // specific reason is worse than a vague one; a network-error hint tells the user to check\n // connectivity instead of hunting for a nonexistent second terminal.\n const readOnlyHint = scheduler.isFireOwner()\n ? []\n : scheduler.fireOwnerFailureReason() === 'network-error'\n ? ['[read-only — could not reach the remote schedule service; check network/persistenced connectivity]']\n : ['[read-only — another terminal holds the fire-ownership lease for this workspace]']\n\n if (tasks.length === 0) {\n ctx.tui.info.showToast('Schedule', readOnlyHint.length > 0 ? `No scheduled tasks. ${readOnlyHint[0]}` : 'No scheduled tasks')\n return\n }\n const lines: string[] = []\n for (const t of tasks) {\n const status = t.lastFireFailed ? '✕' : t.enabled ? '◉' : '○'\n const cron = t.recurring ? t.cronExpression : 'one-shot'\n const next = new Date(t.nextFireAt).toLocaleString()\n const failedHint = t.lastFireFailed && t.lastFireError ? ` (failed: ${t.lastFireError})` : ''\n lines.push(`${status} ${t.id} ${t.name}${failedHint}`)\n lines.push(` ${cron} next: ${next}`)\n }\n ctx.tui.messages.pushMessage({\n role: 'command_echo',\n command: '/schedule',\n status: readOnlyHint.length > 0 ? 'warn' : 'ok',\n // readOnlyHint 优先展示(降级功能提醒,比\"N 个已排定任务\"更需要用户先看到)。\n summary: readOnlyHint.length > 0 ? readOnlyHint[0] : `${tasks.length} 个已排定任务`,\n detail: lines.join('\\n'),\n })\n ctx.tui.panes.togglePane?.('schedulePane')\n}\n\n/**\n * 从 token 化的命令行参数里解算 cron 表达式与 prompt(纯函数,单测覆盖)。\n *\n * 背景(2026-08-14 真 PTY 验收发现):cron 的自然书写是 5 个空格分隔字段\n * (`0 0 1 1 *`),但命令分词后散成 5 个独立 token——此前 handleAdd 只取\n * `positional[0]` 当 cron,用户自然写法必然报 \"expected 5 fields, got 1 (0)\",\n * 且用法提示从未提过引号包裹,等于自然语法全废。tokenizer 虽支持引号\n * (`\"0 0 1 1 *\"` 合成单 token),但把负担推给用户是 UX 缺陷而非答案。\n *\n * 解算规则(贪心、确定性):\n * - 前 5 个 token 拼接后能通过 parseCron 校验 → 认作 cron,其余归 prompt\n * (自然写法 `add --once 0 0 1 1 * probe` 命中此支);\n * - 否则沿用单 token 形态(引号包裹的完整表达式,或用户输入本就非法——\n * 由 scheduler.add 的 parseCron 报错兜底,错误文案不变)。\n */\nexport function splitCronArgs(positional: readonly string[]): { cron: string; prompt: string } {\n if (positional.length >= 5) {\n const joined = positional.slice(0, 5).join(' ')\n try {\n parseCron(joined)\n return { cron: joined, prompt: positional.slice(5).join(' ') }\n } catch {\n // 前 5 token 不构成合法 cron → 单 token 形态(引号包裹)继续。\n }\n }\n return { cron: positional[0] ?? '', prompt: positional.slice(1).join(' ') }\n}\n\nasync function handleAdd(args: string[], scheduler: SchedulerService, ctx: ScheduleCtx): Promise<void> {\n if (args.length < 2) {\n ctx.tui.info.showToast('Schedule', '/schedule add [--once] [--session] <cron 5 fields> <prompt>')\n return\n }\n\n let once = false\n // RFC-357 D3 (M2): --session opts a user-created task into firing back into the\n // current conversation (via followUp) instead of dispatching an isolated worktree job.\n let target: 'job' | 'session' | undefined\n const positional = [...args]\n const onceIdx = positional.indexOf('--once')\n if (onceIdx !== -1) {\n once = true\n positional.splice(onceIdx, 1)\n }\n const sessionIdx = positional.indexOf('--session')\n if (sessionIdx !== -1) {\n target = 'session'\n positional.splice(sessionIdx, 1)\n }\n\n if (positional.length < 2) {\n // RFC-229 M4: open the panel in create view mode\n ctx.tui.info.showToast('Schedule', 'Opening schedule panel in create mode')\n void handleOpenPanel(ctx)\n return\n }\n\n const { cron: cronExpr, prompt } = splitCronArgs(positional)\n\n try {\n const task = scheduler.add({\n name: prompt.slice(0, 40),\n prompt,\n cronExpression: cronExpr,\n recurring: !once,\n origin: 'user',\n target,\n })\n const kind = once ? 'one-shot' : 'recurring'\n const next = new Date(task.nextFireAt).toLocaleString()\n const targetNote = task.target === 'session' ? ' [fires into this conversation]' : ''\n ctx.tui.info.showToast('Schedule', `${task.id}: ${task.name} (${kind})${targetNote} next: ${next}`)\n } catch (err) {\n ctx.tui.info.showToast('Schedule', `Failed: ${err instanceof Error ? err.message : String(err)}`)\n }\n}\n\nasync function handleRemove(id: string | undefined, scheduler: SchedulerService, ctx: ScheduleCtx): Promise<void> {\n if (!id) {\n ctx.tui.info.showToast('Schedule', '/schedule remove <id>')\n return\n }\n const removed = scheduler.remove(id)\n ctx.tui.info.showToast('Schedule', removed ? `Removed ${id}` : `Schedule \"${id}\" not found`)\n}\n\nasync function handleRun(id: string | undefined, scheduler: SchedulerService, ctx: ScheduleCtx): Promise<void> {\n if (!id) {\n ctx.tui.info.showToast('Schedule', '/schedule run <id>')\n return\n }\n try {\n scheduler.runNow(id)\n ctx.tui.info.showToast('Schedule', `Triggering ${id}...`)\n } catch (err) {\n ctx.tui.info.showToast('Schedule', `Failed: ${err instanceof Error ? err.message : String(err)}`)\n }\n}\n\nasync function handleCancel(id: string | undefined, ctx: ScheduleCtx): Promise<void> {\n const scheduler = schedulerRef\n if (!scheduler) {\n ctx.tui.info.showToast('Schedule', 'Schedule system not available')\n return\n }\n if (!id) {\n ctx.tui.info.showToast('Schedule', '/schedule cancel <id>')\n return\n }\n const result = scheduler.cancel(id)\n if (result.ok) {\n ctx.tui.info.showToast('Schedule', `Canceled \"${id}\"`)\n } else {\n ctx.tui.info.showToast('Schedule', `Cannot cancel \"${id}\": ${result.reason ?? 'unknown'}`)\n }\n}\n\nasync function handleToggle(\n id: string | undefined,\n enabled: boolean,\n scheduler: SchedulerService,\n ctx: ScheduleCtx,\n): Promise<void> {\n if (!id) {\n ctx.tui.info.showToast('Schedule', `/schedule ${enabled ? 'enable' : 'disable'} <id>`)\n return\n }\n const ok = scheduler.update(id, { enabled })\n ctx.tui.info.showToast('Schedule', ok ? `Schedule ${id} ${enabled ? 'enabled' : 'disabled'}` : `Schedule \"${id}\" not found`)\n}\n\nasync function handleLogs(taskId: string | undefined, ctx: ScheduleCtx): Promise<void> {\n const logDir = resolve(OTTO_HOME, 'schedule-logs')\n\n let logFiles: string[]\n try {\n logFiles = readdirSync(logDir)\n } catch {\n ctx.tui.info.showToast('Schedule', 'No schedule logs found')\n return\n }\n\n if (taskId) {\n logFiles = logFiles.filter(f => f.startsWith(taskId + '-'))\n }\n\n if (logFiles.length === 0) {\n ctx.tui.info.showToast('Schedule', taskId ? `No logs for schedule \"${taskId}\"` : 'No schedule logs found')\n return\n }\n\n logFiles.sort().reverse()\n\n const recent = logFiles.slice(0, 5)\n const lines: string[] = []\n for (const filename of recent) {\n try {\n const content = readFileSync(resolve(logDir, filename), 'utf-8').trim()\n const dashIdx = filename.indexOf('-')\n const tid = dashIdx > 0 ? filename.slice(0, dashIdx) : filename\n lines.push(`${tid} ${content}`)\n } catch {\n lines.push(`${filename} (unreadable)`)\n }\n }\n\n const remaining = logFiles.length - recent.length\n if (remaining > 0) {\n lines.push(`... and ${remaining} more entries`)\n }\n\n ctx.tui.messages.pushMessage({\n role: 'command_echo',\n command: '/schedule logs',\n summary: `${logFiles.length} 条日志文件`,\n detail: lines.join('\\n'),\n })\n}\n"],"mappings":"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"}