longer-agent 0.1.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 (289) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +227 -0
  3. package/README.zh-CN.md +227 -0
  4. package/agent_templates/executor/agent.yaml +22 -0
  5. package/agent_templates/executor/system_prompt.md +17 -0
  6. package/agent_templates/explorer/agent.yaml +13 -0
  7. package/agent_templates/explorer/system_prompt.md +19 -0
  8. package/agent_templates/main/agent.yaml +7 -0
  9. package/agent_templates/main/system_prompt.md +45 -0
  10. package/configExample.yaml +83 -0
  11. package/dist/agents/agent.d.ts +79 -0
  12. package/dist/agents/agent.d.ts.map +1 -0
  13. package/dist/agents/agent.js +156 -0
  14. package/dist/agents/agent.js.map +1 -0
  15. package/dist/agents/tool-loop.d.ts +140 -0
  16. package/dist/agents/tool-loop.d.ts.map +1 -0
  17. package/dist/agents/tool-loop.js +465 -0
  18. package/dist/agents/tool-loop.js.map +1 -0
  19. package/dist/ask.d.ts +81 -0
  20. package/dist/ask.d.ts.map +1 -0
  21. package/dist/ask.js +34 -0
  22. package/dist/ask.js.map +1 -0
  23. package/dist/auth/openai-oauth.d.ts +66 -0
  24. package/dist/auth/openai-oauth.d.ts.map +1 -0
  25. package/dist/auth/openai-oauth.js +640 -0
  26. package/dist/auth/openai-oauth.js.map +1 -0
  27. package/dist/cli.d.ts +14 -0
  28. package/dist/cli.d.ts.map +1 -0
  29. package/dist/cli.js +254 -0
  30. package/dist/cli.js.map +1 -0
  31. package/dist/commands.d.ts +118 -0
  32. package/dist/commands.d.ts.map +1 -0
  33. package/dist/commands.js +862 -0
  34. package/dist/commands.js.map +1 -0
  35. package/dist/config.d.ts +130 -0
  36. package/dist/config.d.ts.map +1 -0
  37. package/dist/config.js +648 -0
  38. package/dist/config.js.map +1 -0
  39. package/dist/context-rendering.d.ts +69 -0
  40. package/dist/context-rendering.d.ts.map +1 -0
  41. package/dist/context-rendering.js +250 -0
  42. package/dist/context-rendering.js.map +1 -0
  43. package/dist/document-projection.d.ts +12 -0
  44. package/dist/document-projection.d.ts.map +1 -0
  45. package/dist/document-projection.js +75 -0
  46. package/dist/document-projection.js.map +1 -0
  47. package/dist/ephemeral-log.d.ts +15 -0
  48. package/dist/ephemeral-log.d.ts.map +1 -0
  49. package/dist/ephemeral-log.js +173 -0
  50. package/dist/ephemeral-log.js.map +1 -0
  51. package/dist/file-attach.d.ts +89 -0
  52. package/dist/file-attach.d.ts.map +1 -0
  53. package/dist/file-attach.js +571 -0
  54. package/dist/file-attach.js.map +1 -0
  55. package/dist/index.d.ts +29 -0
  56. package/dist/index.d.ts.map +1 -0
  57. package/dist/index.js +43 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/init-wizard.d.ts +13 -0
  60. package/dist/init-wizard.d.ts.map +1 -0
  61. package/dist/init-wizard.js +328 -0
  62. package/dist/init-wizard.js.map +1 -0
  63. package/dist/log-entry.d.ts +104 -0
  64. package/dist/log-entry.d.ts.map +1 -0
  65. package/dist/log-entry.js +292 -0
  66. package/dist/log-entry.js.map +1 -0
  67. package/dist/log-projection.d.ts +73 -0
  68. package/dist/log-projection.d.ts.map +1 -0
  69. package/dist/log-projection.js +651 -0
  70. package/dist/log-projection.js.map +1 -0
  71. package/dist/mcp-client.d.ts +55 -0
  72. package/dist/mcp-client.d.ts.map +1 -0
  73. package/dist/mcp-client.js +402 -0
  74. package/dist/mcp-client.js.map +1 -0
  75. package/dist/model-selection.d.ts +16 -0
  76. package/dist/model-selection.d.ts.map +1 -0
  77. package/dist/model-selection.js +181 -0
  78. package/dist/model-selection.js.map +1 -0
  79. package/dist/network-retry.d.ts +38 -0
  80. package/dist/network-retry.d.ts.map +1 -0
  81. package/dist/network-retry.js +140 -0
  82. package/dist/network-retry.js.map +1 -0
  83. package/dist/persistence.d.ts +104 -0
  84. package/dist/persistence.d.ts.map +1 -0
  85. package/dist/persistence.js +644 -0
  86. package/dist/persistence.js.map +1 -0
  87. package/dist/primitives/context.d.ts +29 -0
  88. package/dist/primitives/context.d.ts.map +1 -0
  89. package/dist/primitives/context.js +85 -0
  90. package/dist/primitives/context.js.map +1 -0
  91. package/dist/progress.d.ts +51 -0
  92. package/dist/progress.d.ts.map +1 -0
  93. package/dist/progress.js +229 -0
  94. package/dist/progress.js.map +1 -0
  95. package/dist/provider-presets.d.ts +34 -0
  96. package/dist/provider-presets.d.ts.map +1 -0
  97. package/dist/provider-presets.js +181 -0
  98. package/dist/provider-presets.js.map +1 -0
  99. package/dist/providers/anthropic.d.ts +32 -0
  100. package/dist/providers/anthropic.d.ts.map +1 -0
  101. package/dist/providers/anthropic.js +450 -0
  102. package/dist/providers/anthropic.js.map +1 -0
  103. package/dist/providers/base.d.ts +135 -0
  104. package/dist/providers/base.d.ts.map +1 -0
  105. package/dist/providers/base.js +104 -0
  106. package/dist/providers/base.js.map +1 -0
  107. package/dist/providers/glm.d.ts +18 -0
  108. package/dist/providers/glm.d.ts.map +1 -0
  109. package/dist/providers/glm.js +59 -0
  110. package/dist/providers/glm.js.map +1 -0
  111. package/dist/providers/kimi.d.ts +23 -0
  112. package/dist/providers/kimi.d.ts.map +1 -0
  113. package/dist/providers/kimi.js +89 -0
  114. package/dist/providers/kimi.js.map +1 -0
  115. package/dist/providers/minimax.d.ts +20 -0
  116. package/dist/providers/minimax.d.ts.map +1 -0
  117. package/dist/providers/minimax.js +192 -0
  118. package/dist/providers/minimax.js.map +1 -0
  119. package/dist/providers/openai-chat.d.ts +33 -0
  120. package/dist/providers/openai-chat.d.ts.map +1 -0
  121. package/dist/providers/openai-chat.js +543 -0
  122. package/dist/providers/openai-chat.js.map +1 -0
  123. package/dist/providers/openai-responses.d.ts +26 -0
  124. package/dist/providers/openai-responses.d.ts.map +1 -0
  125. package/dist/providers/openai-responses.js +443 -0
  126. package/dist/providers/openai-responses.js.map +1 -0
  127. package/dist/providers/openrouter.d.ts +24 -0
  128. package/dist/providers/openrouter.d.ts.map +1 -0
  129. package/dist/providers/openrouter.js +177 -0
  130. package/dist/providers/openrouter.js.map +1 -0
  131. package/dist/providers/registry.d.ts +7 -0
  132. package/dist/providers/registry.d.ts.map +1 -0
  133. package/dist/providers/registry.js +38 -0
  134. package/dist/providers/registry.js.map +1 -0
  135. package/dist/security/path.d.ts +51 -0
  136. package/dist/security/path.d.ts.map +1 -0
  137. package/dist/security/path.js +187 -0
  138. package/dist/security/path.js.map +1 -0
  139. package/dist/security/sensitive-files.d.ts +3 -0
  140. package/dist/security/sensitive-files.d.ts.map +1 -0
  141. package/dist/security/sensitive-files.js +41 -0
  142. package/dist/security/sensitive-files.js.map +1 -0
  143. package/dist/session.d.ts +446 -0
  144. package/dist/session.d.ts.map +1 -0
  145. package/dist/session.js +4595 -0
  146. package/dist/session.js.map +1 -0
  147. package/dist/settings.d.ts +46 -0
  148. package/dist/settings.d.ts.map +1 -0
  149. package/dist/settings.js +134 -0
  150. package/dist/settings.js.map +1 -0
  151. package/dist/show-context.d.ts +35 -0
  152. package/dist/show-context.d.ts.map +1 -0
  153. package/dist/show-context.js +320 -0
  154. package/dist/show-context.js.map +1 -0
  155. package/dist/skills/loader.d.ts +49 -0
  156. package/dist/skills/loader.d.ts.map +1 -0
  157. package/dist/skills/loader.js +166 -0
  158. package/dist/skills/loader.js.map +1 -0
  159. package/dist/summarize-context.d.ts +29 -0
  160. package/dist/summarize-context.d.ts.map +1 -0
  161. package/dist/summarize-context.js +247 -0
  162. package/dist/summarize-context.js.map +1 -0
  163. package/dist/templates/loader.d.ts +104 -0
  164. package/dist/templates/loader.d.ts.map +1 -0
  165. package/dist/templates/loader.js +514 -0
  166. package/dist/templates/loader.js.map +1 -0
  167. package/dist/tools/basic.d.ts +29 -0
  168. package/dist/tools/basic.d.ts.map +1 -0
  169. package/dist/tools/basic.js +2079 -0
  170. package/dist/tools/basic.js.map +1 -0
  171. package/dist/tools/comm.d.ts +17 -0
  172. package/dist/tools/comm.d.ts.map +1 -0
  173. package/dist/tools/comm.js +192 -0
  174. package/dist/tools/comm.js.map +1 -0
  175. package/dist/tools/web-fetch.d.ts +11 -0
  176. package/dist/tools/web-fetch.d.ts.map +1 -0
  177. package/dist/tools/web-fetch.js +237 -0
  178. package/dist/tools/web-fetch.js.map +1 -0
  179. package/dist/tools/web-search.d.ts +24 -0
  180. package/dist/tools/web-search.d.ts.map +1 -0
  181. package/dist/tools/web-search.js +51 -0
  182. package/dist/tools/web-search.js.map +1 -0
  183. package/dist/tui/app.d.ts +35 -0
  184. package/dist/tui/app.d.ts.map +1 -0
  185. package/dist/tui/app.js +1042 -0
  186. package/dist/tui/app.js.map +1 -0
  187. package/dist/tui/checkbox-picker.d.ts +35 -0
  188. package/dist/tui/checkbox-picker.d.ts.map +1 -0
  189. package/dist/tui/checkbox-picker.js +85 -0
  190. package/dist/tui/checkbox-picker.js.map +1 -0
  191. package/dist/tui/command-picker.d.ts +31 -0
  192. package/dist/tui/command-picker.d.ts.map +1 -0
  193. package/dist/tui/command-picker.js +113 -0
  194. package/dist/tui/command-picker.js.map +1 -0
  195. package/dist/tui/components/ask-panel.d.ts +21 -0
  196. package/dist/tui/components/ask-panel.d.ts.map +1 -0
  197. package/dist/tui/components/ask-panel.js +81 -0
  198. package/dist/tui/components/ask-panel.js.map +1 -0
  199. package/dist/tui/components/conversation-panel.d.ts +68 -0
  200. package/dist/tui/components/conversation-panel.d.ts.map +1 -0
  201. package/dist/tui/components/conversation-panel.js +611 -0
  202. package/dist/tui/components/conversation-panel.js.map +1 -0
  203. package/dist/tui/components/input-panel.d.ts +27 -0
  204. package/dist/tui/components/input-panel.d.ts.map +1 -0
  205. package/dist/tui/components/input-panel.js +725 -0
  206. package/dist/tui/components/input-panel.js.map +1 -0
  207. package/dist/tui/components/logo-panel.d.ts +14 -0
  208. package/dist/tui/components/logo-panel.d.ts.map +1 -0
  209. package/dist/tui/components/logo-panel.js +37 -0
  210. package/dist/tui/components/logo-panel.js.map +1 -0
  211. package/dist/tui/components/plan-panel.d.ts +10 -0
  212. package/dist/tui/components/plan-panel.d.ts.map +1 -0
  213. package/dist/tui/components/plan-panel.js +8 -0
  214. package/dist/tui/components/plan-panel.js.map +1 -0
  215. package/dist/tui/components/status-bar.d.ts +24 -0
  216. package/dist/tui/components/status-bar.d.ts.map +1 -0
  217. package/dist/tui/components/status-bar.js +80 -0
  218. package/dist/tui/components/status-bar.js.map +1 -0
  219. package/dist/tui/input/editor-state.d.ts +22 -0
  220. package/dist/tui/input/editor-state.d.ts.map +1 -0
  221. package/dist/tui/input/editor-state.js +157 -0
  222. package/dist/tui/input/editor-state.js.map +1 -0
  223. package/dist/tui/input/keymap.d.ts +3 -0
  224. package/dist/tui/input/keymap.d.ts.map +1 -0
  225. package/dist/tui/input/keymap.js +72 -0
  226. package/dist/tui/input/keymap.js.map +1 -0
  227. package/dist/tui/input/paste-slots.d.ts +17 -0
  228. package/dist/tui/input/paste-slots.d.ts.map +1 -0
  229. package/dist/tui/input/paste-slots.js +46 -0
  230. package/dist/tui/input/paste-slots.js.map +1 -0
  231. package/dist/tui/input/paste.d.ts +15 -0
  232. package/dist/tui/input/paste.d.ts.map +1 -0
  233. package/dist/tui/input/paste.js +35 -0
  234. package/dist/tui/input/paste.js.map +1 -0
  235. package/dist/tui/input/protocol.d.ts +9 -0
  236. package/dist/tui/input/protocol.d.ts.map +1 -0
  237. package/dist/tui/input/protocol.js +387 -0
  238. package/dist/tui/input/protocol.js.map +1 -0
  239. package/dist/tui/input/sanitize.d.ts +6 -0
  240. package/dist/tui/input/sanitize.d.ts.map +1 -0
  241. package/dist/tui/input/sanitize.js +20 -0
  242. package/dist/tui/input/sanitize.js.map +1 -0
  243. package/dist/tui/input/types.d.ts +18 -0
  244. package/dist/tui/input/types.d.ts.map +1 -0
  245. package/dist/tui/input/types.js +2 -0
  246. package/dist/tui/input/types.js.map +1 -0
  247. package/dist/tui/launch.d.ts +23 -0
  248. package/dist/tui/launch.d.ts.map +1 -0
  249. package/dist/tui/launch.js +104 -0
  250. package/dist/tui/launch.js.map +1 -0
  251. package/dist/tui/theme.d.ts +20 -0
  252. package/dist/tui/theme.d.ts.map +1 -0
  253. package/dist/tui/theme.js +29 -0
  254. package/dist/tui/theme.js.map +1 -0
  255. package/dist/tui/types.d.ts +136 -0
  256. package/dist/tui/types.d.ts.map +1 -0
  257. package/dist/tui/types.js +9 -0
  258. package/dist/tui/types.js.map +1 -0
  259. package/package.json +76 -0
  260. package/prompts/sections/agents_md.md +23 -0
  261. package/prompts/sections/important_log.md +16 -0
  262. package/prompts/sections/system_mechanisms.md +18 -0
  263. package/prompts/tools/apply_patch.md +31 -0
  264. package/prompts/tools/ask.md +18 -0
  265. package/prompts/tools/bash.md +13 -0
  266. package/prompts/tools/bash_background.md +9 -0
  267. package/prompts/tools/bash_output.md +9 -0
  268. package/prompts/tools/check_status.md +3 -0
  269. package/prompts/tools/diff.md +5 -0
  270. package/prompts/tools/edit_file.md +11 -0
  271. package/prompts/tools/glob.md +7 -0
  272. package/prompts/tools/grep.md +20 -0
  273. package/prompts/tools/kill_agent.md +3 -0
  274. package/prompts/tools/kill_shell.md +5 -0
  275. package/prompts/tools/list_dir.md +5 -0
  276. package/prompts/tools/plan.md +252 -0
  277. package/prompts/tools/read_file.md +9 -0
  278. package/prompts/tools/show_context.md +12 -0
  279. package/prompts/tools/skill.md +7 -0
  280. package/prompts/tools/spawn_agent.md +195 -0
  281. package/prompts/tools/summarize_context.md +122 -0
  282. package/prompts/tools/test.md +5 -0
  283. package/prompts/tools/wait.md +17 -0
  284. package/prompts/tools/web_fetch.md +9 -0
  285. package/prompts/tools/web_search.md +5 -0
  286. package/prompts/tools/write_file.md +11 -0
  287. package/skills/.staging/.gitkeep +0 -0
  288. package/skills/explain-code/SKILL.md +15 -0
  289. package/skills/skill-manager/SKILL.md +83 -0
package/dist/cli.d.ts ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CLI entry point for LongerAgent.
4
+ *
5
+ * Usage:
6
+ *
7
+ * longeragent # auto-detect config
8
+ * longeragent init # run initialization wizard
9
+ * longeragent --config my.yaml # explicit config path
10
+ * longeragent --templates ./tpls # explicit templates path
11
+ * longeragent --verbose # enable debug logging
12
+ */
13
+ export {};
14
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;GAUG"}
package/dist/cli.js ADDED
@@ -0,0 +1,254 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CLI entry point for LongerAgent.
4
+ *
5
+ * Usage:
6
+ *
7
+ * longeragent # auto-detect config
8
+ * longeragent init # run initialization wizard
9
+ * longeragent --config my.yaml # explicit config path
10
+ * longeragent --templates ./tpls # explicit templates path
11
+ * longeragent --verbose # enable debug logging
12
+ */
13
+ import { existsSync, statSync } from "node:fs";
14
+ import { join } from "node:path";
15
+ import { Command } from "commander";
16
+ import { Config, resolveConfigPaths, getBundledAssetsDir } from "./config.js";
17
+ import { Session } from "./session.js";
18
+ import { loadTemplates } from "./templates/loader.js";
19
+ import { loadSkillsMulti } from "./skills/loader.js";
20
+ import { SessionStore } from "./persistence.js";
21
+ import { loadSettingsFile, resolveSettings } from "./settings.js";
22
+ import { buildDefaultRegistry, registerSkillCommands, resolveModelSelection, } from "./commands.js";
23
+ import { setAccent } from "./tui/theme.js";
24
+ // ------------------------------------------------------------------
25
+ // Primary agent resolution
26
+ // ------------------------------------------------------------------
27
+ function identifyPrimaryAgent(agents, name = "main") {
28
+ const agent = agents[name];
29
+ if (agent)
30
+ return agent;
31
+ // Fallback: first agent alphabetically
32
+ const names = Object.keys(agents).sort();
33
+ if (names.length > 0) {
34
+ const firstName = names[0];
35
+ console.warn(`Warning: '${name}' agent not found, using '${firstName}' instead.`);
36
+ return agents[firstName];
37
+ }
38
+ console.error("Error: no agent templates found.");
39
+ process.exit(1);
40
+ }
41
+ // ------------------------------------------------------------------
42
+ // Main
43
+ // ------------------------------------------------------------------
44
+ async function main() {
45
+ const program = new Command();
46
+ program
47
+ .name("longeragent")
48
+ .description("A terminal AI coding agent built for long sessions")
49
+ .option("--config <path>", "Path to config.yaml")
50
+ .option("--templates <path>", "Path to agent_templates directory")
51
+ .option("--verbose", "Enable debug logging");
52
+ // Subcommands
53
+ let ranSubcommand = false;
54
+ program
55
+ .command("init")
56
+ .description("Initialize LongerAgent configuration")
57
+ .action(async () => {
58
+ ranSubcommand = true;
59
+ const { runInitWizard } = await import("./init-wizard.js");
60
+ await runInitWizard();
61
+ });
62
+ program
63
+ .command("oauth [action]")
64
+ .description("Manage OpenAI ChatGPT OAuth login (login/status/logout)")
65
+ .action(async (action) => {
66
+ ranSubcommand = true;
67
+ const { oauthCommand } = await import("./auth/openai-oauth.js");
68
+ await oauthCommand(action);
69
+ });
70
+ // Default action — prevents Commander from showing help and exiting
71
+ // when no subcommand is provided.
72
+ program.action(() => { });
73
+ await program.parseAsync(process.argv);
74
+ // If a subcommand ran, exit — don't continue into TUI
75
+ if (ranSubcommand)
76
+ return;
77
+ const opts = program.opts();
78
+ // Logging
79
+ if (opts.verbose) {
80
+ const origDebug = console.debug;
81
+ console.debug = (...args) => origDebug("[DEBUG]", ...args);
82
+ }
83
+ // Resolve paths with discovery chain: CLI flags → ~/.longeragent/ → cwd/
84
+ let paths = resolveConfigPaths({
85
+ configFlag: opts.config,
86
+ templatesFlag: opts.templates,
87
+ });
88
+ // If no config found, run the initialization wizard
89
+ if (!paths.configPath) {
90
+ console.log("No configuration found. Starting setup wizard...\n");
91
+ try {
92
+ const { runInitWizard } = await import("./init-wizard.js");
93
+ await runInitWizard();
94
+ // Re-resolve paths after wizard completes
95
+ paths = resolveConfigPaths({
96
+ configFlag: opts.config,
97
+ templatesFlag: opts.templates,
98
+ });
99
+ }
100
+ catch {
101
+ console.error("Error: no config.yaml found.\n" +
102
+ " Run 'longeragent init' to set up, or use --config to specify the path.");
103
+ process.exit(1);
104
+ }
105
+ }
106
+ if (!paths.configPath) {
107
+ console.error("Error: no config.yaml found after setup.\n" +
108
+ " Run 'longeragent init' to set up, or use --config to specify the path.");
109
+ process.exit(1);
110
+ }
111
+ const configPath = paths.configPath;
112
+ // Load config
113
+ const config = new Config({ path: configPath });
114
+ // Refresh OAuth tokens if any model uses them (before building providers)
115
+ const oauthEntries = config.listModelEntries().filter((e) => e.apiKeyRaw === "oauth:openai-codex");
116
+ if (oauthEntries.length > 0) {
117
+ try {
118
+ const { ensureFreshToken } = await import("./auth/openai-oauth.js");
119
+ await ensureFreshToken();
120
+ }
121
+ catch (err) {
122
+ console.warn(`Warning: OAuth token refresh failed: ${err instanceof Error ? err.message : String(err)}`);
123
+ console.warn("Run 'longeragent oauth' to re-authenticate.\n");
124
+ }
125
+ }
126
+ // Load user settings (~/.longeragent/settings.json)
127
+ const rawSettings = loadSettingsFile(paths.homeDir);
128
+ const settings = resolveSettings(rawSettings);
129
+ // Display settings warnings (invalid thresholds, clamped values, etc.)
130
+ for (const warning of settings.warnings) {
131
+ console.warn(`Warning: ${warning}`);
132
+ }
133
+ // Initialise MCP client manager (if mcp_servers configured)
134
+ let mcpManager = null;
135
+ if (config.mcpServerConfigs.length > 0) {
136
+ try {
137
+ // Dynamic import to keep MCP optional
138
+ const { MCPClientManager } = await import("./mcp-client.js");
139
+ mcpManager = new MCPClientManager(config.mcpServerConfigs);
140
+ }
141
+ catch {
142
+ console.warn("Warning: mcp_servers configured but MCP client module not available. " +
143
+ "Install with: npm install @modelcontextprotocol/sdk");
144
+ }
145
+ }
146
+ // Bundled assets (always available from the installed package)
147
+ const bundledDir = getBundledAssetsDir();
148
+ const bundledTemplates = join(bundledDir, "agent_templates");
149
+ const bundledPrompts = join(bundledDir, "prompts");
150
+ // Build ordered prompts dirs: user override first, bundled second
151
+ const promptsDirs = [];
152
+ if (paths.promptsPath)
153
+ promptsDirs.push(paths.promptsPath);
154
+ promptsDirs.push(bundledPrompts);
155
+ // Load agent templates (bundled + user override, with layered prompt assembly)
156
+ const agents = loadTemplates(bundledTemplates, config, mcpManager, promptsDirs, paths.templatesPath ?? undefined);
157
+ const primary = identifyPrimaryAgent(agents);
158
+ // Load skills (user overrides layered on top of bundled defaults).
159
+ const bundledSkills = join(bundledDir, "skills");
160
+ const skillRoots = [];
161
+ if (existsSync(bundledSkills) && statSync(bundledSkills).isDirectory()) {
162
+ skillRoots.push(bundledSkills);
163
+ }
164
+ const userSkillsPath = paths.skillsPath;
165
+ if (userSkillsPath &&
166
+ userSkillsPath !== bundledSkills &&
167
+ existsSync(userSkillsPath) &&
168
+ statSync(userSkillsPath).isDirectory()) {
169
+ skillRoots.push(userSkillsPath);
170
+ }
171
+ const skills = loadSkillsMulti(skillRoots);
172
+ // Session store (session directory is created lazily on the first turn)
173
+ let store;
174
+ try {
175
+ store = new SessionStore({ projectPath: process.cwd() });
176
+ }
177
+ catch (e) {
178
+ console.error(`Error: Failed to initialize session storage.\n` +
179
+ `Reason: ${e}\n` +
180
+ `Possible causes:\n` +
181
+ ` - Invalid LONGERAGENT_HOME configuration\n` +
182
+ ` - File permission issues`);
183
+ process.exit(1);
184
+ }
185
+ // Build Session with store attached from the start
186
+ const session = new Session({
187
+ primaryAgent: primary,
188
+ config,
189
+ agentTemplates: agents,
190
+ skills: skills,
191
+ skillRoots,
192
+ progress: undefined,
193
+ mcpManager: mcpManager,
194
+ promptsDirs,
195
+ store: store,
196
+ settings,
197
+ });
198
+ const globalPreferences = store.loadGlobalPreferences();
199
+ try {
200
+ if (globalPreferences.modelConfigName) {
201
+ try {
202
+ session.switchModel(globalPreferences.modelConfigName);
203
+ session.setPersistedModelSelection?.({
204
+ modelConfigName: globalPreferences.modelConfigName,
205
+ modelProvider: globalPreferences.modelProvider,
206
+ modelSelectionKey: globalPreferences.modelSelectionKey,
207
+ modelId: globalPreferences.modelId,
208
+ });
209
+ }
210
+ catch {
211
+ if (globalPreferences.modelProvider && (globalPreferences.modelSelectionKey || globalPreferences.modelId)) {
212
+ const restored = resolveModelSelection(session, `${globalPreferences.modelProvider}:${globalPreferences.modelSelectionKey ?? globalPreferences.modelId}`);
213
+ session.switchModel(restored.selectedConfigName);
214
+ session.setPersistedModelSelection?.({
215
+ modelConfigName: restored.selectedConfigName,
216
+ modelProvider: restored.modelProvider,
217
+ modelSelectionKey: restored.modelSelectionKey,
218
+ modelId: restored.modelId,
219
+ });
220
+ }
221
+ }
222
+ }
223
+ else if (globalPreferences.modelProvider && (globalPreferences.modelSelectionKey || globalPreferences.modelId)) {
224
+ const restored = resolveModelSelection(session, `${globalPreferences.modelProvider}:${globalPreferences.modelSelectionKey ?? globalPreferences.modelId}`);
225
+ session.switchModel(restored.selectedConfigName);
226
+ session.setPersistedModelSelection?.({
227
+ modelConfigName: restored.selectedConfigName,
228
+ modelProvider: restored.modelProvider,
229
+ modelSelectionKey: restored.modelSelectionKey,
230
+ modelId: restored.modelId,
231
+ });
232
+ }
233
+ }
234
+ catch (err) {
235
+ console.warn(`Warning: failed to restore saved model preference: ${err instanceof Error ? err.message : String(err)}`);
236
+ }
237
+ session.applyGlobalPreferences(globalPreferences);
238
+ if (globalPreferences.accentColor) {
239
+ setAccent(globalPreferences.accentColor);
240
+ }
241
+ // Commands
242
+ const commandRegistry = buildDefaultRegistry();
243
+ registerSkillCommands(commandRegistry, session.skills);
244
+ // Launch TUI
245
+ const { launchTui } = await import("./tui/launch.js");
246
+ await launchTui(session, commandRegistry, store, {
247
+ verbose: opts.verbose,
248
+ });
249
+ }
250
+ main().catch((err) => {
251
+ console.error("Fatal error:", err);
252
+ process.exit(1);
253
+ });
254
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Extensible slash-command system.
3
+ *
4
+ * Usage:
5
+ *
6
+ * const registry = buildDefaultRegistry();
7
+ * const cmd = registry.lookup("/help");
8
+ * if (cmd) {
9
+ * await cmd.handler(ctx, "");
10
+ * }
11
+ */
12
+ import type { SessionStore } from "./persistence.js";
13
+ import { type SkillMeta } from "./skills/loader.js";
14
+ /**
15
+ * Callback used by command handlers to display a message to the user.
16
+ * The TUI layer supplies the concrete implementation.
17
+ */
18
+ export type ShowMessageFn = (text: string) => void;
19
+ /**
20
+ * Context passed to every command handler.
21
+ *
22
+ * Uses a generic interface so command handlers don't need direct TUI imports.
23
+ */
24
+ export interface CommandContext {
25
+ /** The active Session instance (typed as `any` to avoid circular deps). */
26
+ session: any;
27
+ /** Display a message in the conversation area. */
28
+ showMessage: ShowMessageFn;
29
+ /** The SessionStore for persistence (may be undefined). */
30
+ store?: SessionStore;
31
+ /** Auto-save the current session (TUI provides the implementation). */
32
+ autoSave: () => void;
33
+ /** Reset TUI state (cancel workers, clear spinners, etc.). */
34
+ resetUiState: () => void;
35
+ /** The command registry itself, so /help can enumerate commands. */
36
+ commandRegistry: CommandRegistry;
37
+ /** Request TUI-layer graceful exit. */
38
+ exit?: () => Promise<void> | void;
39
+ /** Inject content as a user message and trigger a new turn. */
40
+ onTurnRequested?: (content: string) => void;
41
+ /** Trigger a manual summarize request through the TUI turn pipeline. */
42
+ onManualSummarizeRequested?: (instruction: string) => void;
43
+ /** Trigger a manual compact request through the TUI execution pipeline. */
44
+ onManualCompactRequested?: (instruction: string) => void;
45
+ }
46
+ /**
47
+ * An option entry for command overlays.
48
+ */
49
+ export interface CommandOption {
50
+ /** Display label shown in the overlay. */
51
+ label: string;
52
+ /** Value submitted as the command argument when selected. */
53
+ value: string;
54
+ /** Child options for hierarchical selection (e.g., provider → model). */
55
+ children?: CommandOption[];
56
+ /** Checked state for checkbox picker mode. */
57
+ checked?: boolean;
58
+ }
59
+ /** Context available when building dynamic picker options for a slash command. */
60
+ export interface CommandOptionsContext {
61
+ session: any;
62
+ store?: SessionStore;
63
+ }
64
+ /**
65
+ * A single slash command.
66
+ */
67
+ export interface SlashCommand {
68
+ /** The command name, e.g. "/resume". */
69
+ name: string;
70
+ /** Short description shown in /help output. */
71
+ description: string;
72
+ /** Async handler invoked when the command is executed. */
73
+ handler: (ctx: CommandContext, args: string) => Promise<void>;
74
+ /**
75
+ * Optional callback that returns dynamic overlay options for this command.
76
+ * When present, typing the command shows an option picker overlay.
77
+ * Receives session/store context so it can compute dynamic picker options.
78
+ */
79
+ options?: (ctx: CommandOptionsContext) => CommandOption[];
80
+ /** When true, TUI uses a checkbox multi-select picker instead of single-select. */
81
+ checkboxMode?: boolean;
82
+ }
83
+ export declare class CommandExitSignal extends Error {
84
+ code: number;
85
+ constructor(code?: number);
86
+ }
87
+ export declare function isCommandExitSignal(err: unknown): err is CommandExitSignal;
88
+ export declare class CommandRegistry {
89
+ private _commands;
90
+ /** Register a command. Overwrites any existing command with the same name. */
91
+ register(cmd: SlashCommand): void;
92
+ /** Remove a command by its exact name. Returns true if it existed. */
93
+ unregister(name: string): boolean;
94
+ /** Look up a command by its exact name. */
95
+ lookup(name: string): SlashCommand | undefined;
96
+ /** Return all registered commands sorted alphabetically by name. */
97
+ getAll(): SlashCommand[];
98
+ /** Return command names that start with the given prefix (for completion). */
99
+ getCompletions(prefix: string): string[];
100
+ }
101
+ export declare function resolveModelSelection(session: any, target: string, apiKey?: string): import("./model-selection.js").ResolvedModelSelection;
102
+ /**
103
+ * Build the default command registry with all built-in commands.
104
+ */
105
+ export declare function buildDefaultRegistry(): CommandRegistry;
106
+ /**
107
+ * Register slash commands for user-invocable skills.
108
+ *
109
+ * Each skill with `userInvocable === true` gets a `/skill-name` command.
110
+ * When invoked, the skill content is injected and a turn is triggered.
111
+ */
112
+ export declare function registerSkillCommands(registry: CommandRegistry, skills: ReadonlyMap<string, SkillMeta>): void;
113
+ /**
114
+ * Unregister old skill commands, then register new ones.
115
+ * Used after reloadSkills() to keep slash commands in sync.
116
+ */
117
+ export declare function reRegisterSkillCommands(registry: CommandRegistry, oldSkills: ReadonlyMap<string, SkillMeta>, newSkills: ReadonlyMap<string, SkillMeta>): void;
118
+ //# sourceMappingURL=commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"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"}