@chances-ai/cli 16.0.0 → 18.0.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 (78) hide show
  1. package/dist/boot/dispose.d.ts.map +1 -1
  2. package/dist/boot/dispose.js +11 -0
  3. package/dist/boot/dispose.js.map +1 -1
  4. package/dist/boot/load-runtime.d.ts +8 -0
  5. package/dist/boot/load-runtime.d.ts.map +1 -1
  6. package/dist/boot/load-runtime.js +2 -37
  7. package/dist/boot/load-runtime.js.map +1 -1
  8. package/dist/boot/open-browser.d.ts +10 -0
  9. package/dist/boot/open-browser.d.ts.map +1 -0
  10. package/dist/boot/open-browser.js +39 -0
  11. package/dist/boot/open-browser.js.map +1 -0
  12. package/dist/boot/web-assets.d.ts +11 -0
  13. package/dist/boot/web-assets.d.ts.map +1 -0
  14. package/dist/boot/web-assets.js +23 -0
  15. package/dist/boot/web-assets.js.map +1 -0
  16. package/dist/commands/chat.d.ts +2 -2
  17. package/dist/commands/chat.d.ts.map +1 -1
  18. package/dist/commands/chat.js +15 -4
  19. package/dist/commands/chat.js.map +1 -1
  20. package/dist/commands/config.d.ts +4 -1
  21. package/dist/commands/config.d.ts.map +1 -1
  22. package/dist/commands/config.js +8 -3
  23. package/dist/commands/config.js.map +1 -1
  24. package/dist/commands/doctor.d.ts +4 -1
  25. package/dist/commands/doctor.d.ts.map +1 -1
  26. package/dist/commands/doctor.js +8 -3
  27. package/dist/commands/doctor.js.map +1 -1
  28. package/dist/commands/help-text.d.ts +43 -0
  29. package/dist/commands/help-text.d.ts.map +1 -0
  30. package/dist/commands/help-text.js +87 -0
  31. package/dist/commands/help-text.js.map +1 -0
  32. package/dist/commands/prompt.d.ts +4 -1
  33. package/dist/commands/prompt.d.ts.map +1 -1
  34. package/dist/commands/prompt.js +10 -4
  35. package/dist/commands/prompt.js.map +1 -1
  36. package/dist/commands/serve.d.ts +17 -0
  37. package/dist/commands/serve.d.ts.map +1 -0
  38. package/dist/commands/serve.js +64 -0
  39. package/dist/commands/serve.js.map +1 -0
  40. package/dist/commands/stats.d.ts +4 -0
  41. package/dist/commands/stats.d.ts.map +1 -1
  42. package/dist/commands/stats.js +18 -0
  43. package/dist/commands/stats.js.map +1 -1
  44. package/dist/commands/version.d.ts.map +1 -1
  45. package/dist/commands/version.js +7 -17
  46. package/dist/commands/version.js.map +1 -1
  47. package/dist/entrypoints/cli.d.ts.map +1 -1
  48. package/dist/entrypoints/cli.js +2 -0
  49. package/dist/entrypoints/cli.js.map +1 -1
  50. package/dist/slash/config.d.ts +10 -0
  51. package/dist/slash/config.d.ts.map +1 -0
  52. package/dist/slash/config.js +22 -0
  53. package/dist/slash/config.js.map +1 -0
  54. package/dist/slash/doctor.d.ts +9 -0
  55. package/dist/slash/doctor.d.ts.map +1 -0
  56. package/dist/slash/doctor.js +21 -0
  57. package/dist/slash/doctor.js.map +1 -0
  58. package/dist/slash/help.d.ts +9 -8
  59. package/dist/slash/help.d.ts.map +1 -1
  60. package/dist/slash/help.js +36 -18
  61. package/dist/slash/help.js.map +1 -1
  62. package/dist/slash/index.d.ts +6 -0
  63. package/dist/slash/index.d.ts.map +1 -1
  64. package/dist/slash/index.js +11 -1
  65. package/dist/slash/index.js.map +1 -1
  66. package/dist/slash/stats.d.ts +10 -0
  67. package/dist/slash/stats.d.ts.map +1 -0
  68. package/dist/slash/stats.js +23 -0
  69. package/dist/slash/stats.js.map +1 -0
  70. package/dist/slash/web.d.ts +25 -0
  71. package/dist/slash/web.d.ts.map +1 -0
  72. package/dist/slash/web.js +79 -0
  73. package/dist/slash/web.js.map +1 -0
  74. package/dist/web/assets/index-C060taGU.css +1 -0
  75. package/dist/web/assets/index-DGs1rWta.js +110 -0
  76. package/dist/web/assets/index-DGs1rWta.js.map +1 -0
  77. package/dist/web/index.html +13 -0
  78. package/package.json +21 -20
@@ -1,27 +1,45 @@
1
+ import { createElement } from "react";
1
2
  import { definePlugin } from "@chances-ai/plugin-api";
3
+ import { HelpView } from "@chances-ai/tui";
4
+ import { GETTING_STARTED, MORE_URL, SHORTCUTS, renderHelpText } from "../commands/help-text.js";
5
+ import { VERSION } from "../commands/version.js";
2
6
  /**
3
- * Lists every registered slash command built-ins and plugin-provided alike.
4
- * Sorted alphabetically; the active command itself is included for symmetry.
5
- * The output is a single multi-line string that the dispatcher renders as an
6
- * info line.
7
+ * (v19) `/help` a tabbed overlay (general · commands · shortcuts) modelled on
8
+ * claude-code's HelpV2. In a TUI it opens the {@link HelpView} modal via
9
+ * `openModal`; in text mode (rpc / `-p`) it returns the same sectioned text as
10
+ * `chances --help` (one renderer, `help-text.ts`, so the surfaces never drift).
7
11
  *
8
- * `host` is captured by closure so the listing reflects what's actually
9
- * loaded — adding a new built-in or a plugin command at any time updates the
10
- * `/help` output without changing this file.
12
+ * The command lists are LIVE: slash commands from `host.slashCommands()` (so
13
+ * plugin-provided commands appear too) and CLI sub-commands from the registry
14
+ * snapshot threaded in via {@link BuiltinSlashDeps.cliCommands}.
11
15
  */
12
- export function makeHelpPlugin(host) {
16
+ export function makeHelpPlugin(host, deps) {
17
+ const cliCommands = () => deps.cliCommands.filter((c) => c.name !== "chat").map((c) => ({ name: c.name, description: c.description }));
18
+ // Live slash commands (built-ins + plugins), minus hidden + `help` itself.
19
+ const liveSlash = () => host
20
+ .slashCommands()
21
+ .filter((c) => !c.isHidden)
22
+ .sort((a, b) => a.name.localeCompare(b.name))
23
+ .map((c) => ({ name: c.name, description: c.description, argumentHint: c.argumentHint }));
13
24
  const command = {
14
25
  name: "help",
15
- description: "List all slash commands.",
16
- run: () => {
17
- const commands = host.slashCommands();
18
- if (commands.length === 0)
19
- return "no slash commands registered";
20
- const padTo = Math.max(...commands.map((c) => c.name.length));
21
- const lines = [...commands]
22
- .sort((a, b) => a.name.localeCompare(b.name))
23
- .map((c) => ` /${c.name.padEnd(padTo)} ${c.description}`);
24
- return ["Slash commands:", ...lines].join("\n");
26
+ description: "Show all commands, shortcuts, and usage.",
27
+ run: async (_args, slashCtx) => {
28
+ const slash = liveSlash();
29
+ const cli = cliCommands();
30
+ if (slashCtx.openModal) {
31
+ await slashCtx.openModal((resolve) => createElement(HelpView, {
32
+ version: VERSION,
33
+ gettingStarted: GETTING_STARTED,
34
+ cliCommands: cli,
35
+ slashCommands: slash.map((c) => ({ name: c.name, description: c.description })),
36
+ shortcuts: SHORTCUTS,
37
+ moreUrl: MORE_URL,
38
+ onClose: () => resolve(null),
39
+ }));
40
+ return;
41
+ }
42
+ return renderHelpText({ version: VERSION, cliCommands: cli, slashCommands: slash });
25
43
  },
26
44
  };
27
45
  return definePlugin({
@@ -1 +1 @@
1
- {"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/slash/help.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAmD,MAAM,wBAAwB,CAAC;AAEvG;;;;;;;;;GASG;AACH,MAAM,UAAU,cAAc,CAAC,IAAgB;IAC7C,MAAM,OAAO,GAAiB;QAC5B,IAAI,EAAE,MAAM;QACZ,WAAW,EAAE,0BAA0B;QACvC,GAAG,EAAE,GAAG,EAAE;YACR,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YACtC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,8BAA8B,CAAC;YACjE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;YAC9D,MAAM,KAAK,GAAG,CAAC,GAAG,QAAQ,CAAC;iBACxB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;iBAC5C,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;YAC9D,OAAO,CAAC,iBAAiB,EAAE,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClD,CAAC;KACF,CAAC;IACF,OAAO,YAAY,CAAC;QAClB,IAAI,EAAE,cAAc;QACpB,MAAM,CAAC,GAAG;YACR,GAAG,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;QACpC,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/slash/help.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,YAAY,EAAmD,MAAM,wBAAwB,CAAC;AACvG,OAAO,EAAE,QAAQ,EAAoB,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,SAAS,EAAE,cAAc,EAAkB,MAAM,0BAA0B,CAAC;AAChH,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAGjD;;;;;;;;;GASG;AACH,MAAM,UAAU,cAAc,CAAC,IAAgB,EAAE,IAAsB;IACrE,MAAM,WAAW,GAAG,GAAkB,EAAE,CACtC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IAE/G,2EAA2E;IAC3E,MAAM,SAAS,GAAG,GAAgB,EAAE,CAClC,IAAI;SACD,aAAa,EAAE;SACf,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;SAC1B,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;SAC5C,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,YAAY,EAAE,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;IAE9F,MAAM,OAAO,GAAiB;QAC5B,IAAI,EAAE,MAAM;QACZ,WAAW,EAAE,0CAA0C;QACvD,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;YAC7B,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;YAC1B,MAAM,GAAG,GAAG,WAAW,EAAE,CAAC;YAC1B,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;gBACvB,MAAM,QAAQ,CAAC,SAAS,CAAO,CAAC,OAAO,EAAE,EAAE,CACzC,aAAa,CAAC,QAAQ,EAAE;oBACtB,OAAO,EAAE,OAAO;oBAChB,cAAc,EAAE,eAAe;oBAC/B,WAAW,EAAE,GAAG;oBAChB,aAAa,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;oBAC/E,SAAS,EAAE,SAAS;oBACpB,OAAO,EAAE,QAAQ;oBACjB,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;iBAC7B,CAAC,CACH,CAAC;gBACF,OAAO;YACT,CAAC;YACD,OAAO,cAAc,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC;QACtF,CAAC;KACF,CAAC;IACF,OAAO,YAAY,CAAC;QAClB,IAAI,EAAE,cAAc;QACpB,MAAM,CAAC,GAAG;YACR,GAAG,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;QACpC,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
@@ -23,6 +23,12 @@ export interface BuiltinSlashDeps {
23
23
  store: SessionStore;
24
24
  respawn: (resumeSessionId?: string) => void;
25
25
  openTerminal: () => void;
26
+ /** (v19) The CLI sub-command registry snapshot, for `/help` to list both
27
+ * `chances <command>` entries and slash commands in one place. */
28
+ cliCommands: {
29
+ name: string;
30
+ description: string;
31
+ }[];
26
32
  }
27
33
  export declare function registerBuiltinSlashCommands(host: PluginHost, deps: BuiltinSlashDeps): Promise<void>;
28
34
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/slash/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAc1D;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,UAAU,CAAC;IAChB,EAAE,EAAE,aAAa,CAAC;IAClB,OAAO,EAAE,cAAc,CAAC;IACxB,KAAK,EAAE,YAAY,CAAC;IACpB,OAAO,EAAE,CAAC,eAAe,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,YAAY,EAAE,MAAM,IAAI,CAAC;CAC1B;AAED,wBAAsB,4BAA4B,CAChD,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,gBAAgB,GACrB,OAAO,CAAC,IAAI,CAAC,CAgBf"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/slash/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAkB1D;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,UAAU,CAAC;IAChB,EAAE,EAAE,aAAa,CAAC;IAClB,OAAO,EAAE,cAAc,CAAC;IACxB,KAAK,EAAE,YAAY,CAAC;IACpB,OAAO,EAAE,CAAC,eAAe,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB;uEACmE;IACnE,WAAW,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACtD;AAED,wBAAsB,4BAA4B,CAChD,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,gBAAgB,GACrB,OAAO,CAAC,IAAI,CAAC,CAsBf"}
@@ -10,11 +10,15 @@ import { makeMcpPromptsPlugin } from "./mcp-prompts.js";
10
10
  import { makeAgentsPlugin } from "./agents.js";
11
11
  import { makeApprovalPlugin } from "./approval.js";
12
12
  import { makeTerminalPlugin } from "./terminal.js";
13
+ import { makeDoctorPlugin } from "./doctor.js";
14
+ import { makeStatsPlugin } from "./stats.js";
15
+ import { makeConfigPlugin } from "./config.js";
16
+ import { makeWebPlugin } from "./web.js";
13
17
  export async function registerBuiltinSlashCommands(host, deps) {
14
18
  // Order doesn't matter; each plugin only mutates its own command slot.
15
19
  // `await` so any onLoad error (e.g. duplicate registration in a buggy
16
20
  // teardown) surfaces immediately rather than as an unhandled rejection.
17
- await host.load(makeHelpPlugin(host));
21
+ await host.load(makeHelpPlugin(host, deps));
18
22
  await host.load(makeModelPlugin(deps));
19
23
  await host.load(makeProviderPlugin(deps));
20
24
  await host.load(makeClearPlugin(deps));
@@ -26,5 +30,11 @@ export async function registerBuiltinSlashCommands(host, deps) {
26
30
  await host.load(makeAgentsPlugin(deps));
27
31
  await host.load(makeApprovalPlugin(deps));
28
32
  await host.load(makeTerminalPlugin(deps));
33
+ // (v19) In-chat forms of the read-only CLI sub-commands.
34
+ await host.load(makeDoctorPlugin(deps));
35
+ await host.load(makeStatsPlugin(deps));
36
+ await host.load(makeConfigPlugin(deps));
37
+ // (v20) One-click web UI.
38
+ await host.load(makeWebPlugin(deps));
29
39
  }
30
40
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/slash/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAyBnD,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAChD,IAAgB,EAChB,IAAsB;IAEtB,uEAAuE;IACvE,sEAAsE;IACtE,wEAAwE;IACxE,MAAM,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;IACtC,MAAM,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;IACvC,MAAM,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1C,MAAM,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;IACvC,MAAM,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;IACxC,MAAM,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;IACzC,MAAM,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;IACxC,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;IACrC,MAAM,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5C,MAAM,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;IACxC,MAAM,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1C,MAAM,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5C,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/slash/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AA4BzC,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAChD,IAAgB,EAChB,IAAsB;IAEtB,uEAAuE;IACvE,sEAAsE;IACtE,wEAAwE;IACxE,MAAM,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IAC5C,MAAM,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;IACvC,MAAM,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1C,MAAM,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;IACvC,MAAM,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;IACxC,MAAM,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;IACzC,MAAM,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;IACxC,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;IACrC,MAAM,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5C,MAAM,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;IACxC,MAAM,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1C,MAAM,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1C,yDAAyD;IACzD,MAAM,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;IACxC,MAAM,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;IACvC,MAAM,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;IACxC,0BAA0B;IAC1B,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;AACvC,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { type Plugin } from "@chances-ai/plugin-api";
2
+ import type { BuiltinSlashDeps } from "./index.js";
3
+ /**
4
+ * (v19) `/stats [--since <date>] [--by-model]` — the in-chat form of
5
+ * `chances stats`: token usage + estimated cost from this workspace's
6
+ * `.chances/usage.jsonl`. Read-only; shares {@link statsReport} with the CLI
7
+ * command (bad flags come back as an inline usage message, never a throw).
8
+ */
9
+ export declare function makeStatsPlugin(deps: BuiltinSlashDeps): Plugin;
10
+ //# sourceMappingURL=stats.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../src/slash/stats.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,MAAM,EAAqB,MAAM,wBAAwB,CAAC;AAEtF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,CAa9D"}
@@ -0,0 +1,23 @@
1
+ import { definePlugin } from "@chances-ai/plugin-api";
2
+ import { statsReport } from "../commands/stats.js";
3
+ /**
4
+ * (v19) `/stats [--since <date>] [--by-model]` — the in-chat form of
5
+ * `chances stats`: token usage + estimated cost from this workspace's
6
+ * `.chances/usage.jsonl`. Read-only; shares {@link statsReport} with the CLI
7
+ * command (bad flags come back as an inline usage message, never a throw).
8
+ */
9
+ export function makeStatsPlugin(deps) {
10
+ const command = {
11
+ name: "stats",
12
+ description: "Show token usage and estimated cost.",
13
+ argumentHint: "[--since <date>] [--by-model]",
14
+ run: (args) => statsReport(deps.ctx.workspaceRoot, args),
15
+ };
16
+ return definePlugin({
17
+ name: "builtin/stats",
18
+ onLoad(ctx) {
19
+ ctx.registerSlashCommand(command);
20
+ },
21
+ });
22
+ }
23
+ //# sourceMappingURL=stats.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats.js","sourceRoot":"","sources":["../../src/slash/stats.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAkC,MAAM,wBAAwB,CAAC;AACtF,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAGnD;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,IAAsB;IACpD,MAAM,OAAO,GAAiB;QAC5B,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,sCAAsC;QACnD,YAAY,EAAE,+BAA+B;QAC7C,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC;KACzD,CAAC;IACF,OAAO,YAAY,CAAC;QAClB,IAAI,EAAE,eAAe;QACrB,MAAM,CAAC,GAAG;YACR,GAAG,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;QACpC,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { startRelay } from "@chances-ai/serve";
2
+ import { type Plugin } from "@chances-ai/plugin-api";
3
+ import type { BuiltinSlashDeps } from "./index.js";
4
+ /**
5
+ * The external effects `/web` performs — injectable so the command is unit-
6
+ * testable without starting a real socket or spawning a real browser. Defaults
7
+ * to the production implementations.
8
+ */
9
+ export interface WebIo {
10
+ startRelay: typeof startRelay;
11
+ openBrowser: (url: URL) => Promise<void>;
12
+ resolveWebAssetsDir: () => string | undefined;
13
+ }
14
+ /**
15
+ * (v20) `/web [stop]` — one-click web UI. Starts an in-process loopback relay
16
+ * serving the embedded SPA + the engine control channel (the SAME
17
+ * `EngineHost`/`RpcServer` seam `chances serve` uses, so each browser connection
18
+ * gets its own session over the shared runtime), then opens the browser.
19
+ *
20
+ * The relay outlives the command (stored on `ctx.relay`, stopped by
21
+ * `disposeRuntime` on exit or by `/web stop`); a second `/web` is idempotent —
22
+ * it re-opens the running URL. Loopback-only; LAN/auth is a later milestone.
23
+ */
24
+ export declare function makeWebPlugin(deps: BuiltinSlashDeps, io?: WebIo): Plugin;
25
+ //# sourceMappingURL=web.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web.d.ts","sourceRoot":"","sources":["../../src/slash/web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAgB,KAAK,MAAM,EAAqB,MAAM,wBAAwB,CAAC;AAKtF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD;;;;GAIG;AACH,MAAM,WAAW,KAAK;IACpB,UAAU,EAAE,OAAO,UAAU,CAAC;IAC9B,WAAW,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,mBAAmB,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;CAC/C;AAID;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,gBAAgB,EAAE,EAAE,GAAE,KAAc,GAAG,MAAM,CAoEhF"}
@@ -0,0 +1,79 @@
1
+ import { startRelay } from "@chances-ai/serve";
2
+ import { definePlugin } from "@chances-ai/plugin-api";
3
+ import { makeEngineHost } from "../commands/rpc.js";
4
+ import { openBrowser } from "../boot/open-browser.js";
5
+ import { resolveWebAssetsDir } from "../boot/web-assets.js";
6
+ import cliPkg from "../../package.json" with { type: "json" };
7
+ const realIo = { startRelay, openBrowser, resolveWebAssetsDir };
8
+ /**
9
+ * (v20) `/web [stop]` — one-click web UI. Starts an in-process loopback relay
10
+ * serving the embedded SPA + the engine control channel (the SAME
11
+ * `EngineHost`/`RpcServer` seam `chances serve` uses, so each browser connection
12
+ * gets its own session over the shared runtime), then opens the browser.
13
+ *
14
+ * The relay outlives the command (stored on `ctx.relay`, stopped by
15
+ * `disposeRuntime` on exit or by `/web stop`); a second `/web` is idempotent —
16
+ * it re-opens the running URL. Loopback-only; LAN/auth is a later milestone.
17
+ */
18
+ export function makeWebPlugin(deps, io = realIo) {
19
+ const command = {
20
+ name: "web",
21
+ description: "Open the web UI in your browser.",
22
+ argumentHint: "[stop]",
23
+ run: async (args, slashCtx) => {
24
+ const { ctx } = deps;
25
+ if (args[0] === "stop") {
26
+ if (!ctx.relay)
27
+ return "web UI is not running";
28
+ ctx.relay.stop();
29
+ ctx.relay = undefined;
30
+ return "web UI stopped";
31
+ }
32
+ // (codex v20 SHOULD-FIX) `/web` needs the interactive chat loop to stay
33
+ // alive — a one-shot `chances -p "/web"` (or an rpc dispatch) returns
34
+ // immediately, and `disposeRuntime` would stop the relay before the
35
+ // browser even connects. `openModal` is only wired in the TUI, so its
36
+ // absence means a non-interactive dispatch.
37
+ if (!slashCtx.openModal) {
38
+ return ("/web needs interactive chat — run `chances`, then type /web (a one-shot `-p` exits " +
39
+ "immediately and would kill the server). For headless serving use `chances serve --web <dir>`.");
40
+ }
41
+ // Already running → just re-open the browser at the live URL.
42
+ if (ctx.relay) {
43
+ const url = ctx.relay.url;
44
+ await io.openBrowser(new URL(url)).catch(() => { });
45
+ return `web UI already running on ${url} — reopened in your browser. /web stop to stop.`;
46
+ }
47
+ const staticDir = io.resolveWebAssetsDir();
48
+ if (!staticDir) {
49
+ return ("web UI assets aren't bundled in this build. In the repo, build them with " +
50
+ "`bun --filter @chances-ai/web build`, then run /web again — or use `chances serve --web <dir>`.");
51
+ }
52
+ const relay = await io.startRelay({
53
+ version: cliPkg.version,
54
+ staticDir,
55
+ control: {
56
+ host: makeEngineHost(ctx),
57
+ agent: { name: cliPkg.name, version: cliPkg.version },
58
+ // The browser closes the permission round-trip itself; don't auto-approve.
59
+ autoApprove: false,
60
+ },
61
+ });
62
+ ctx.relay = relay;
63
+ try {
64
+ await io.openBrowser(new URL(relay.url));
65
+ }
66
+ catch (e) {
67
+ return `web UI on ${relay.url} — open it in your browser (auto-open failed: ${e.message}). /web stop to stop.`;
68
+ }
69
+ return `web UI on ${relay.url} — opened in your browser. /web stop to stop.`;
70
+ },
71
+ };
72
+ return definePlugin({
73
+ name: "builtin/web",
74
+ onLoad(ctx) {
75
+ ctx.registerSlashCommand(command);
76
+ },
77
+ });
78
+ }
79
+ //# sourceMappingURL=web.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web.js","sourceRoot":"","sources":["../../src/slash/web.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ :root{color-scheme:dark light}*{box-sizing:border-box}html,body,#root{margin:0;padding:0;height:100%}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif}