@songsid/agend 2.1.0-beta.2 → 2.1.0-beta.21

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/README.md +1 -0
  2. package/README.zh-TW.md +2 -1
  3. package/dist/access-path.js +3 -3
  4. package/dist/access-path.js.map +1 -1
  5. package/dist/agent-endpoint.d.ts +8 -0
  6. package/dist/agent-endpoint.js +36 -8
  7. package/dist/agent-endpoint.js.map +1 -1
  8. package/dist/backend/antigravity.js +3 -2
  9. package/dist/backend/antigravity.js.map +1 -1
  10. package/dist/backend/factory.js +5 -1
  11. package/dist/backend/factory.js.map +1 -1
  12. package/dist/backend/grok.d.ts +41 -0
  13. package/dist/backend/grok.js +256 -0
  14. package/dist/backend/grok.js.map +1 -0
  15. package/dist/backend/kiro.js +3 -2
  16. package/dist/backend/kiro.js.map +1 -1
  17. package/dist/backend/types.d.ts +12 -2
  18. package/dist/backend/types.js +1 -0
  19. package/dist/backend/types.js.map +1 -1
  20. package/dist/classic-channel-manager.js +1 -1
  21. package/dist/cli.js +56 -6
  22. package/dist/cli.js.map +1 -1
  23. package/dist/config-validator.js +50 -1
  24. package/dist/config-validator.js.map +1 -1
  25. package/dist/config.d.ts +3 -1
  26. package/dist/config.js +13 -0
  27. package/dist/config.js.map +1 -1
  28. package/dist/context-guardian.d.ts +2 -0
  29. package/dist/context-guardian.js +10 -2
  30. package/dist/context-guardian.js.map +1 -1
  31. package/dist/daemon-entry.js +2 -1
  32. package/dist/daemon-entry.js.map +1 -1
  33. package/dist/daemon.d.ts +51 -3
  34. package/dist/daemon.js +380 -36
  35. package/dist/daemon.js.map +1 -1
  36. package/dist/fleet-context.d.ts +2 -1
  37. package/dist/fleet-manager.d.ts +23 -5
  38. package/dist/fleet-manager.js +229 -123
  39. package/dist/fleet-manager.js.map +1 -1
  40. package/dist/general-knowledge/skills/fleet-config/SKILL.md +1 -1
  41. package/dist/general-knowledge/skills/model-discovery/SKILL.md +1 -0
  42. package/dist/instance-lifecycle.d.ts +6 -1
  43. package/dist/instance-lifecycle.js +46 -3
  44. package/dist/instance-lifecycle.js.map +1 -1
  45. package/dist/logger.d.ts +6 -0
  46. package/dist/logger.js +29 -10
  47. package/dist/logger.js.map +1 -1
  48. package/dist/outbound-handlers.d.ts +5 -0
  49. package/dist/outbound-handlers.js +68 -16
  50. package/dist/outbound-handlers.js.map +1 -1
  51. package/dist/outbound-schemas.d.ts +1 -0
  52. package/dist/outbound-schemas.js +1 -1
  53. package/dist/outbound-schemas.js.map +1 -1
  54. package/dist/settings-api.d.ts +17 -2
  55. package/dist/settings-api.js +105 -8
  56. package/dist/settings-api.js.map +1 -1
  57. package/dist/setup-wizard.js +8 -0
  58. package/dist/setup-wizard.js.map +1 -1
  59. package/dist/statusline-watcher.d.ts +1 -1
  60. package/dist/statusline-watcher.js +3 -2
  61. package/dist/statusline-watcher.js.map +1 -1
  62. package/dist/tmux-manager.d.ts +3 -1
  63. package/dist/tmux-manager.js +9 -0
  64. package/dist/tmux-manager.js.map +1 -1
  65. package/dist/topic-archiver.d.ts +1 -1
  66. package/dist/topic-commands.d.ts +14 -1
  67. package/dist/topic-commands.js +96 -25
  68. package/dist/topic-commands.js.map +1 -1
  69. package/dist/transcript-monitor.js +2 -0
  70. package/dist/transcript-monitor.js.map +1 -1
  71. package/dist/types.d.ts +18 -1
  72. package/dist/ui/dashboard.html +2 -2
  73. package/dist/ui/settings.html +251 -40
  74. package/dist/view-api.d.ts +1 -1
  75. package/dist/web-api.d.ts +2 -1
  76. package/dist/web-api.js +24 -15
  77. package/dist/web-api.js.map +1 -1
  78. package/package.json +2 -1
@@ -92,8 +92,18 @@ export interface CliBackend {
92
92
  preTrust?(workingDirectory: string): void;
93
93
  /** Resolve working directory (e.g. create symlink to avoid hidden paths). Returns resolved path. */
94
94
  resolveWorkingDirectory?(workingDirectory: string, instanceName?: string): string;
95
- /** Command to gracefully quit the CLI (e.g. "/exit", "/quit"). */
96
- getQuitCommand(): string;
95
+ /**
96
+ * Slash/text command to gracefully quit the CLI (e.g. "/exit", "/quit"),
97
+ * typed then followed by Enter. Return null when the CLI has no quit command
98
+ * and quits via a key chord instead — implement getQuitKey() in that case.
99
+ */
100
+ getQuitCommand(): string | null;
101
+ /**
102
+ * The tmux key chord that quits the CLI, for backends whose quit is a keypress
103
+ * rather than a typed command (e.g. grok Ctrl+Q). Consulted only when
104
+ * getQuitCommand() returns null. Values are tmux send-keys names (e.g. "C-q").
105
+ */
106
+ getQuitKey?(): string;
97
107
  /**
98
108
  * In-session command to compact/reset the conversation context. Most CLIs use
99
109
  * "/compact"; some (e.g. Codex) use "/compact" too, OpenCode uses "/compact".
@@ -34,6 +34,7 @@ const BACKEND_MODEL_PATTERNS = {
34
34
  "gemini-cli": /^gemini/i,
35
35
  "opencode": /./, // opencode accepts anything (provider-dependent)
36
36
  "antigravity": / /, // agy models always contain spaces (display names like "Gemini 3.5 Flash (High)")
37
+ "grok": /^grok/i, // grok-4.5, grok-4.3, grok-code, grok-build-0.1
37
38
  };
38
39
  /** Check if a model name is compatible with the given backend. */
39
40
  export function isModelCompatible(backendName, model) {
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/backend/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AA0IlD;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACrE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC,CAAC,wBAAwB;IACvC,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,aAAa,GAAG,qBAAqB,CAAC;AAC5C,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,uBAAuB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,iBAAiB,aAAa,EAAE,CAAC,CAAC;IAChG,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,0GAA0G;AAC1G,MAAM,sBAAsB,GAA2B;IACrD,aAAa,EAAE,4CAA4C;IAC3D,UAAU,EAAE,8BAA8B;IAC1C,OAAO,EAAE,wBAAwB;IACjC,YAAY,EAAE,UAAU;IACxB,UAAU,EAAE,GAAG,EAAG,iDAAiD;IACnE,aAAa,EAAE,GAAG,EAAG,kFAAkF;CACxG,CAAC;AAEF,kEAAkE;AAClE,MAAM,UAAU,iBAAiB,CAAC,WAAmB,EAAE,KAAa;IAClE,MAAM,OAAO,GAAG,sBAAsB,CAAC,WAAW,CAAC,CAAC;IACpD,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC,CAAC,iCAAiC;IAC5D,OAAO,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC7B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CAAC,WAAmB,EAAE,KAAa;IACpE,IAAI,CAAC,iBAAiB,CAAC,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC;QAC3C,OAAO,CAAC,IAAI,CAAC,kBAAkB,KAAK,uCAAuC,WAAW,0BAA0B,CAAC,CAAC;IACpH,CAAC;AACH,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,UAAU,CAAC,CAAS;IAClC,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC;AACzC,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/backend/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAqJlD;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACrE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC,CAAC,wBAAwB;IACvC,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,aAAa,GAAG,qBAAqB,CAAC;AAC5C,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,uBAAuB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,iBAAiB,aAAa,EAAE,CAAC,CAAC;IAChG,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,0GAA0G;AAC1G,MAAM,sBAAsB,GAA2B;IACrD,aAAa,EAAE,4CAA4C;IAC3D,UAAU,EAAE,8BAA8B;IAC1C,OAAO,EAAE,wBAAwB;IACjC,YAAY,EAAE,UAAU;IACxB,UAAU,EAAE,GAAG,EAAG,iDAAiD;IACnE,aAAa,EAAE,GAAG,EAAG,kFAAkF;IACvG,MAAM,EAAE,QAAQ,EAAG,gDAAgD;CACpE,CAAC;AAEF,kEAAkE;AAClE,MAAM,UAAU,iBAAiB,CAAC,WAAmB,EAAE,KAAa;IAClE,MAAM,OAAO,GAAG,sBAAsB,CAAC,WAAW,CAAC,CAAC;IACpD,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC,CAAC,iCAAiC;IAC5D,OAAO,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC7B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CAAC,WAAmB,EAAE,KAAa;IACpE,IAAI,CAAC,iBAAiB,CAAC,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC;QAC3C,OAAO,CAAC,IAAI,CAAC,kBAAkB,KAAK,uCAAuC,WAAW,0BAA0B,CAAC,CAAC;IACpH,CAAC;AACH,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,UAAU,CAAC,CAAS;IAClC,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC;AACzC,CAAC"}
@@ -4,7 +4,7 @@ import yaml from "js-yaml";
4
4
  import { getAgendHome } from "./paths.js";
5
5
  import { sanitizeInstanceName } from "./topic-commands.js";
6
6
  const YAML_HEADER = `# ClassicBot Configuration
7
- # Available backends: claude-code, gemini-cli, codex, opencode, kiro-cli
7
+ # Available backends: claude-code, gemini-cli, codex, opencode, kiro-cli, antigravity, grok
8
8
  `;
9
9
  /**
10
10
  * Derive instance name from channel name + last 4 digits of channelId.
package/dist/cli.js CHANGED
@@ -1895,6 +1895,8 @@ function getInstanceStatusStandalone(name) {
1895
1895
  const pid = parseInt(readFileSync(pidPath, "utf-8").trim(), 10);
1896
1896
  try {
1897
1897
  process.kill(pid, 0);
1898
+ if (existsSync(join(DATA_DIR, "instances", name, "paused-state.json")))
1899
+ return "paused";
1898
1900
  return "running";
1899
1901
  }
1900
1902
  catch {
@@ -1936,6 +1938,7 @@ function formatTimeSince(isoStr) {
1936
1938
  * kiro classic "8% !>" / TUI "◔ 1%" / bracket "[8%]" / prompt "8% ❯"
1937
1939
  * codex "Context N% left" (remaining → 100-N) or "Context N% used"
1938
1940
  * opencode "1.2K (6%)"
1941
+ * grok "12K / 500K" (used tokens / context window)
1939
1942
  * Duplicated (not imported) so this CLI entry point stays free of the daemon's
1940
1943
  * dependency graph. All returned values are context USED (low % = fresh).
1941
1944
  */
@@ -1946,6 +1949,18 @@ const defaultParser = (output) => {
1946
1949
  const left = line.match(/Context\s+(\d+)%\s+left/i);
1947
1950
  if (left)
1948
1951
  return 100 - parseInt(left[1], 10);
1952
+ const ratio = line.match(/(\d+\.?\d*[KkMm]?)\s*\/\s*(\d+\.?\d*[KkMm]?)/);
1953
+ if (ratio) {
1954
+ const tokenCount = (value) => {
1955
+ const suffix = value.at(-1)?.toLowerCase();
1956
+ const multiplier = suffix === "k" ? 1_000 : suffix === "m" ? 1_000_000 : 1;
1957
+ return parseFloat(value) * multiplier;
1958
+ };
1959
+ const used = tokenCount(ratio[1]);
1960
+ const total = tokenCount(ratio[2]);
1961
+ if (Number.isFinite(used) && Number.isFinite(total) && total > 0)
1962
+ return used / total * 100;
1963
+ }
1949
1964
  const m = line.match(/(\d+)%.*[!❯>]/)
1950
1965
  || line.match(/◔\s*(\d+)%/)
1951
1966
  || line.match(/\[(\d+)%\]/)
@@ -2103,8 +2118,13 @@ async function lsAction(opts) {
2103
2118
  const apiData = await resp.json();
2104
2119
  for (const inst of apiData.instances ?? []) {
2105
2120
  const row = rows.find(r => r.name === inst.name);
2106
- if (row)
2121
+ if (row) {
2107
2122
  row.idle = inst.idle;
2123
+ if (inst.status)
2124
+ row.status = inst.status;
2125
+ if (inst.state)
2126
+ row.state = inst.state;
2127
+ }
2108
2128
  }
2109
2129
  }
2110
2130
  catch { /* fleet not running or API unreachable */ }
@@ -2112,9 +2132,38 @@ async function lsAction(opts) {
2112
2132
  console.log(JSON.stringify(rows, null, 2));
2113
2133
  return;
2114
2134
  }
2115
- // Status icon
2116
- const statusIcon = (s, idle) => s === "running" ? (idle === false ? "\x1b[34m●\x1b[0m" : "\x1b[32m●\x1b[0m") : s === "crashed" ? "\x1b[31m●\x1b[0m" : "\x1b[90m○\x1b[0m";
2117
- const statusLabel = (s, idle) => s === "running" ? (idle === false ? "Busy" : "Idle") : s === "crashed" ? "Crashed" : "Stopped";
2135
+ // Status icon — prefer tri-state 'state' field, fall back to idle boolean
2136
+ const statusIcon = (s, idle, state) => {
2137
+ if (state === "stuck")
2138
+ return "\x1b[31m●\x1b[0m";
2139
+ if (state === "paused" || s === "paused")
2140
+ return "\x1b[33m⏸\x1b[0m";
2141
+ if (state === "working")
2142
+ return "\x1b[34m●\x1b[0m";
2143
+ if (state === "idle")
2144
+ return "\x1b[32m●\x1b[0m";
2145
+ // Fallback for when API is unreachable
2146
+ if (s === "running")
2147
+ return idle === false ? "\x1b[34m●\x1b[0m" : "\x1b[32m●\x1b[0m";
2148
+ if (s === "crashed")
2149
+ return "\x1b[31m●\x1b[0m";
2150
+ return "\x1b[90m○\x1b[0m";
2151
+ };
2152
+ const statusLabel = (s, idle, state) => {
2153
+ if (state === "stuck")
2154
+ return "Stuck";
2155
+ if (state === "paused" || s === "paused")
2156
+ return "Paused";
2157
+ if (state === "working")
2158
+ return "Working";
2159
+ if (state === "idle")
2160
+ return "Idle";
2161
+ if (s === "running")
2162
+ return idle === false ? "Busy" : "Idle";
2163
+ if (s === "crashed")
2164
+ return "Crashed";
2165
+ return "Stopped";
2166
+ };
2118
2167
  /** Get display width accounting for fullwidth (CJK) characters */
2119
2168
  const displayWidth = (s) => {
2120
2169
  let w = 0;
@@ -2148,7 +2197,7 @@ async function lsAction(opts) {
2148
2197
  const actStr = r.lastActivity ?? "-";
2149
2198
  console.log(padDisplay(r.name, nameW) +
2150
2199
  r.backend.padEnd(backendW) +
2151
- statusIcon(r.status, r.idle) + " " + statusLabel(r.status, r.idle).padEnd(statusW - 2) +
2200
+ statusIcon(r.status, r.idle, r.state) + " " + statusLabel(r.status, r.idle, r.state).padEnd(statusW - 2) +
2152
2201
  padDisplay(teamStr, teamW) +
2153
2202
  r.source.padEnd(srcW) +
2154
2203
  ctxStr.padEnd(ctxW) +
@@ -2158,9 +2207,10 @@ async function lsAction(opts) {
2158
2207
  // System memory footer
2159
2208
  const totalMemMb = rows.reduce((sum, r) => sum + (r.memMb ?? 0), 0);
2160
2209
  const runningCount = rows.filter(r => r.status === "running").length;
2210
+ const pausedCount = rows.filter(r => r.status === "paused").length;
2161
2211
  const totalGB = totalmem() / (1024 ** 3);
2162
2212
  const usedGB = (totalmem() - freemem()) / (1024 ** 3);
2163
- console.log(`\nInstances: ${runningCount} running | Fleet Mem: ${(totalMemMb / 1024).toFixed(1)} GB | System Memory: ${usedGB.toFixed(1)} / ${totalGB.toFixed(1)} GB`);
2213
+ console.log(`\nInstances: ${runningCount} running, ${pausedCount} paused | Fleet Mem: ${(totalMemMb / 1024).toFixed(1)} GB | System Memory: ${usedGB.toFixed(1)} / ${totalGB.toFixed(1)} GB`);
2164
2214
  }
2165
2215
  program
2166
2216
  .command("ls")