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
@@ -0,0 +1,181 @@
1
+ import { hasOAuthTokens } from "./auth/openai-oauth.js";
2
+ import { formatScopedModelName } from "./config.js";
3
+ import { buildProviderPresetRawConfig, findProviderPreset, findProviderPresetModel, } from "./provider-presets.js";
4
+ function readModelEntries(config) {
5
+ if (typeof config?.listModelEntries === "function") {
6
+ try {
7
+ const entries = config.listModelEntries();
8
+ if (Array.isArray(entries))
9
+ return entries;
10
+ }
11
+ catch {
12
+ // Fall through to compatibility mode.
13
+ }
14
+ }
15
+ const out = [];
16
+ for (const name of config?.modelNames ?? []) {
17
+ try {
18
+ const mc = config.getModel(name);
19
+ out.push({
20
+ name,
21
+ provider: String(mc.provider ?? ""),
22
+ model: String(mc.model ?? ""),
23
+ apiKeyRaw: String(mc.apiKey ?? ""),
24
+ hasResolvedApiKey: Boolean(mc.apiKey),
25
+ });
26
+ }
27
+ catch {
28
+ // Ignore invalid entries.
29
+ }
30
+ }
31
+ return out;
32
+ }
33
+ function hasEnvApiKey(envVar) {
34
+ if (!envVar)
35
+ return false;
36
+ const raw = process.env[envVar];
37
+ return typeof raw === "string" && raw.trim() !== "";
38
+ }
39
+ function getProviderKeySource(entries, provider) {
40
+ // Exact provider match in existing config entries.
41
+ const fromConfig = entries.find((entry) => entry.provider === provider
42
+ && entry.hasResolvedApiKey
43
+ && entry.apiKeyRaw.trim() !== "");
44
+ if (fromConfig)
45
+ return fromConfig.apiKeyRaw;
46
+ // Provider-specific env var — no cross-site fallback.
47
+ const preset = findProviderPreset(provider);
48
+ if (preset && hasEnvApiKey(preset.envVar))
49
+ return `\${${preset.envVar}}`;
50
+ if (provider === "openai-codex") {
51
+ try {
52
+ if (hasOAuthTokens())
53
+ return "oauth:openai-codex";
54
+ }
55
+ catch {
56
+ // Ignore auth lookup failures here.
57
+ }
58
+ }
59
+ return undefined;
60
+ }
61
+ function parseProviderModelTarget(target) {
62
+ const idx = target.indexOf(":");
63
+ if (idx <= 0 || idx >= target.length - 1)
64
+ return null;
65
+ return {
66
+ provider: target.slice(0, idx),
67
+ model: target.slice(idx + 1),
68
+ };
69
+ }
70
+ function runtimeModelName(provider, model) {
71
+ const slug = (s) => s
72
+ .toLowerCase()
73
+ .replace(/[^a-z0-9]+/g, "-")
74
+ .replace(/^-+|-+$/g, "");
75
+ return `runtime-${slug(provider)}-${slug(model)}`;
76
+ }
77
+ export function resolveModelSelection(session, target, apiKey) {
78
+ const config = session.config;
79
+ let selectedConfigName = target;
80
+ const knownNames = new Set(config?.modelNames ?? []);
81
+ if (knownNames.has(selectedConfigName)) {
82
+ const existing = config.getModel(selectedConfigName);
83
+ return {
84
+ selectedConfigName,
85
+ selectedHint: formatScopedModelName(existing.provider, existing.model),
86
+ modelProvider: existing.provider,
87
+ modelSelectionKey: existing.model,
88
+ modelId: existing.model,
89
+ };
90
+ }
91
+ const parsed = parseProviderModelTarget(target);
92
+ if (!parsed) {
93
+ throw new Error("Invalid model target. Use config name or provider:model (e.g. openai:gpt-5.4).");
94
+ }
95
+ const presetModel = findProviderPresetModel(parsed.provider, parsed.model);
96
+ const resolvedModel = presetModel?.id ?? parsed.model;
97
+ const selectionKey = presetModel?.key ?? parsed.model;
98
+ const presetRequiresDedicatedConfig = Boolean(presetModel && (presetModel.key !== presetModel.id
99
+ || presetModel.optionNote
100
+ || presetModel.config
101
+ || (presetModel.aliases && presetModel.aliases.length > 0)));
102
+ const entries = readModelEntries(config);
103
+ const exactEntries = entries.filter((entry) => entry.provider === parsed.provider && entry.model === resolvedModel);
104
+ const exactWithKey = exactEntries.find((entry) => entry.hasResolvedApiKey);
105
+ if (exactWithKey && !apiKey && !presetRequiresDedicatedConfig) {
106
+ selectedConfigName = exactWithKey.name;
107
+ }
108
+ else {
109
+ const keySource = (apiKey && apiKey.trim() !== "")
110
+ ? apiKey
111
+ : getProviderKeySource(entries, parsed.provider)
112
+ ?? (session.primaryAgent?.modelConfig?.provider === parsed.provider
113
+ && session.primaryAgent?.modelConfig?.apiKey
114
+ ? session.primaryAgent.modelConfig.apiKey
115
+ : undefined);
116
+ if (!keySource) {
117
+ if (parsed.provider === "openai-codex") {
118
+ throw new Error("Not logged in to OpenAI (ChatGPT).\n" +
119
+ "Run 'longeragent oauth' to log in with your ChatGPT account.");
120
+ }
121
+ const preset = findProviderPreset(parsed.provider);
122
+ const envHint = preset
123
+ ? `\nSet the environment variable:\n\n export ${preset.envVar}=YOUR_API_KEY\n`
124
+ : "";
125
+ throw new Error(`Missing API key for provider '${parsed.provider}'${preset ? ` (${preset.name})` : ""}.` +
126
+ envHint +
127
+ `\nOr run 'longeragent init' to configure.` +
128
+ `\nTip: /model ${parsed.provider}:${parsed.model} key=YOUR_API_KEY (current session only)`);
129
+ }
130
+ if (typeof config?.upsertModelRaw !== "function") {
131
+ throw new Error("Runtime model creation is not supported by this config object.");
132
+ }
133
+ const runtimeName = runtimeModelName(parsed.provider, selectionKey);
134
+ config.upsertModelRaw(runtimeName, presetModel
135
+ ? buildProviderPresetRawConfig(parsed.provider, presetModel, keySource)
136
+ : {
137
+ provider: parsed.provider,
138
+ model: resolvedModel,
139
+ api_key: keySource,
140
+ });
141
+ selectedConfigName = runtimeName;
142
+ }
143
+ return {
144
+ selectedConfigName,
145
+ selectedHint: formatScopedModelName(parsed.provider, resolvedModel),
146
+ modelProvider: parsed.provider,
147
+ modelSelectionKey: selectionKey,
148
+ modelId: resolvedModel,
149
+ };
150
+ }
151
+ export function resolvePersistedModelSelection(session, selection) {
152
+ const configName = selection.modelConfigName?.trim();
153
+ let configResolutionError;
154
+ if (configName) {
155
+ try {
156
+ const existing = session.config.getModel(configName);
157
+ return {
158
+ selectedConfigName: configName,
159
+ selectedHint: formatScopedModelName(existing.provider, existing.model),
160
+ modelProvider: existing.provider,
161
+ modelSelectionKey: selection.modelSelectionKey?.trim() || existing.model,
162
+ modelId: existing.model,
163
+ };
164
+ }
165
+ catch (err) {
166
+ configResolutionError = err;
167
+ }
168
+ }
169
+ const provider = selection.modelProvider?.trim();
170
+ const selectionKey = selection.modelSelectionKey?.trim() || selection.modelId?.trim();
171
+ if (provider && selectionKey) {
172
+ return resolveModelSelection(session, `${provider}:${selectionKey}`);
173
+ }
174
+ if (configResolutionError) {
175
+ throw configResolutionError instanceof Error
176
+ ? configResolutionError
177
+ : new Error(String(configResolutionError));
178
+ }
179
+ throw new Error("Saved session is missing persisted model identity.");
180
+ }
181
+ //# sourceMappingURL=model-selection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-selection.js","sourceRoot":"","sources":["../src/model-selection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Network error retry utilities.
3
+ *
4
+ * Provides detection of transient network errors, exponential backoff
5
+ * delay computation, and an abort-aware sleep helper. Used by the
6
+ * session turn loop to automatically retry LLM API calls that fail
7
+ * due to network issues (ETIMEDOUT, ECONNRESET, 5xx, 429, etc.).
8
+ */
9
+ /** Maximum number of network-error retries per turn. */
10
+ export declare const MAX_NETWORK_RETRIES = 10;
11
+ /**
12
+ * Determine whether `err` is a transient network error worth retrying.
13
+ *
14
+ * Handles three layers of errors:
15
+ * 1. SDK-wrapped errors (Anthropic / OpenAI `APIConnectionError`)
16
+ * 2. Raw Node.js errors with `.code` (ETIMEDOUT, ECONNRESET, …)
17
+ * 3. HTTP status codes (429 rate-limit, 5xx server errors)
18
+ *
19
+ * Uses duck-typing (constructor name) instead of `instanceof` to avoid
20
+ * importing both SDK packages.
21
+ */
22
+ export declare function isRetryableNetworkError(err: unknown): boolean;
23
+ /**
24
+ * Compute the backoff delay for a given retry attempt (0-indexed).
25
+ *
26
+ * Uses exponential backoff (base 1 s, factor 2) capped at 30 s,
27
+ * with 0–25 % random jitter to avoid thundering-herd effects.
28
+ *
29
+ * Progression: ~1 s, ~2 s, ~4 s, ~8 s, ~16 s, ~30 s, ~30 s, …
30
+ */
31
+ export declare function computeRetryDelay(attempt: number): number;
32
+ /**
33
+ * Sleep for `ms` milliseconds, aborting immediately if `signal` fires.
34
+ *
35
+ * If the signal is already aborted when called, rejects immediately.
36
+ */
37
+ export declare function retrySleep(ms: number, signal?: AbortSignal): Promise<void>;
38
+ //# sourceMappingURL=network-retry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network-retry.d.ts","sourceRoot":"","sources":["../src/network-retry.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,wDAAwD;AACxD,eAAO,MAAM,mBAAmB,KAAK,CAAC;AAuCtC;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAyC7D;AAMD;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAIzD;AAMD;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAgB1E"}
@@ -0,0 +1,140 @@
1
+ /**
2
+ * Network error retry utilities.
3
+ *
4
+ * Provides detection of transient network errors, exponential backoff
5
+ * delay computation, and an abort-aware sleep helper. Used by the
6
+ * session turn loop to automatically retry LLM API calls that fail
7
+ * due to network issues (ETIMEDOUT, ECONNRESET, 5xx, 429, etc.).
8
+ */
9
+ // ------------------------------------------------------------------
10
+ // Constants
11
+ // ------------------------------------------------------------------
12
+ /** Maximum number of network-error retries per turn. */
13
+ export const MAX_NETWORK_RETRIES = 10;
14
+ /** Node.js / undici error codes that indicate a transient network issue. */
15
+ const RETRYABLE_CODES = new Set([
16
+ "ETIMEDOUT",
17
+ "ECONNRESET",
18
+ "ECONNREFUSED",
19
+ "ECONNABORTED",
20
+ "ENETUNREACH",
21
+ "EHOSTUNREACH",
22
+ "EPIPE",
23
+ "EAI_AGAIN",
24
+ "UND_ERR_SOCKET",
25
+ "UND_ERR_CONNECT_TIMEOUT",
26
+ "ERR_STREAM_PREMATURE_CLOSE",
27
+ ]);
28
+ /** SDK wrapper class names that indicate a connection-level failure. */
29
+ const CONNECTION_ERROR_NAMES = new Set([
30
+ "APIConnectionError",
31
+ "APIConnectionTimeoutError",
32
+ ]);
33
+ /** Message substrings (lowercase) that suggest a transient network failure. */
34
+ const RETRYABLE_MESSAGE_PATTERNS = [
35
+ "etimedout",
36
+ "econnreset",
37
+ "econnrefused",
38
+ "socket hang up",
39
+ "fetch failed",
40
+ "network",
41
+ "premature close",
42
+ "uND_ERR_SOCKET".toLowerCase(),
43
+ ];
44
+ // ------------------------------------------------------------------
45
+ // isRetryableNetworkError
46
+ // ------------------------------------------------------------------
47
+ /**
48
+ * Determine whether `err` is a transient network error worth retrying.
49
+ *
50
+ * Handles three layers of errors:
51
+ * 1. SDK-wrapped errors (Anthropic / OpenAI `APIConnectionError`)
52
+ * 2. Raw Node.js errors with `.code` (ETIMEDOUT, ECONNRESET, …)
53
+ * 3. HTTP status codes (429 rate-limit, 5xx server errors)
54
+ *
55
+ * Uses duck-typing (constructor name) instead of `instanceof` to avoid
56
+ * importing both SDK packages.
57
+ */
58
+ export function isRetryableNetworkError(err) {
59
+ if (!err || typeof err !== "object")
60
+ return false;
61
+ const e = err;
62
+ // -- Explicit exclusions --
63
+ if (e["name"] === "AbortError")
64
+ return false;
65
+ const status = e["status"];
66
+ if (typeof status === "number" && status >= 400 && status < 500 && status !== 408 && status !== 429) {
67
+ return false; // 400, 401, 403, 404, 422 etc. are not retryable
68
+ }
69
+ // -- SDK connection errors (duck-typed) --
70
+ const ctorName = err?.constructor?.name;
71
+ if (ctorName && CONNECTION_ERROR_NAMES.has(ctorName))
72
+ return true;
73
+ // -- Node.js / undici error codes --
74
+ const code = e["code"];
75
+ if (typeof code === "string" && RETRYABLE_CODES.has(code))
76
+ return true;
77
+ // -- HTTP status-based retries --
78
+ if (typeof status === "number") {
79
+ if (status === 408 || status === 429)
80
+ return true;
81
+ if (status >= 500)
82
+ return true;
83
+ }
84
+ // -- Message-based fallback --
85
+ const msg = String(err).toLowerCase();
86
+ for (const pattern of RETRYABLE_MESSAGE_PATTERNS) {
87
+ if (msg.includes(pattern))
88
+ return true;
89
+ }
90
+ // Also check .cause for wrapped errors
91
+ const cause = e["cause"];
92
+ if (cause && typeof cause === "object") {
93
+ const causeCode = cause["code"];
94
+ if (typeof causeCode === "string" && RETRYABLE_CODES.has(causeCode))
95
+ return true;
96
+ }
97
+ return false;
98
+ }
99
+ // ------------------------------------------------------------------
100
+ // computeRetryDelay
101
+ // ------------------------------------------------------------------
102
+ /**
103
+ * Compute the backoff delay for a given retry attempt (0-indexed).
104
+ *
105
+ * Uses exponential backoff (base 1 s, factor 2) capped at 30 s,
106
+ * with 0–25 % random jitter to avoid thundering-herd effects.
107
+ *
108
+ * Progression: ~1 s, ~2 s, ~4 s, ~8 s, ~16 s, ~30 s, ~30 s, …
109
+ */
110
+ export function computeRetryDelay(attempt) {
111
+ const baseDelay = Math.min(1000 * Math.pow(2, attempt), 30_000);
112
+ const jitter = baseDelay * 0.25 * Math.random();
113
+ return Math.round(baseDelay + jitter);
114
+ }
115
+ // ------------------------------------------------------------------
116
+ // retrySleep
117
+ // ------------------------------------------------------------------
118
+ /**
119
+ * Sleep for `ms` milliseconds, aborting immediately if `signal` fires.
120
+ *
121
+ * If the signal is already aborted when called, rejects immediately.
122
+ */
123
+ export function retrySleep(ms, signal) {
124
+ return new Promise((resolve, reject) => {
125
+ if (signal?.aborted) {
126
+ reject(new DOMException("The operation was aborted.", "AbortError"));
127
+ return;
128
+ }
129
+ const timer = setTimeout(() => {
130
+ signal?.removeEventListener("abort", onAbort);
131
+ resolve();
132
+ }, ms);
133
+ const onAbort = () => {
134
+ clearTimeout(timer);
135
+ reject(new DOMException("The operation was aborted.", "AbortError"));
136
+ };
137
+ signal?.addEventListener("abort", onAbort, { once: true });
138
+ });
139
+ }
140
+ //# sourceMappingURL=network-retry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network-retry.js","sourceRoot":"","sources":["../src/network-retry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,104 @@
1
+ /**
2
+ * Session persistence — log-native session storage on disk.
3
+ *
4
+ * Storage layout:
5
+ *
6
+ * <base_dir>/
7
+ * └── projects/
8
+ * ├── <project_slug>/ # <dir_name>_<sha256[:6]>
9
+ * │ ├── project.json
10
+ * │ ├── 20260212_143052_chat/
11
+ * │ │ ├── log.json
12
+ * │ │ └── artifacts/
13
+ * │ └── ...
14
+ * └── general/ # sessions without a project path
15
+ */
16
+ import { LogIdAllocator, type LogEntry } from "./log-entry.js";
17
+ export declare class SessionStore {
18
+ private _projectPath;
19
+ private _projectSlug;
20
+ private _preferredBaseDir;
21
+ private _activeBaseDir;
22
+ private _projectDir;
23
+ private _sessionDir;
24
+ constructor(opts?: {
25
+ projectPath?: string;
26
+ baseDir?: string;
27
+ });
28
+ private _candidateBaseDirs;
29
+ private _ensureProjectMetadata;
30
+ private _globalPreferenceBaseDirs;
31
+ private _globalPreferencesPath;
32
+ private static _createUniqueSessionDir;
33
+ createSession(): string;
34
+ /** Clear the current session directory (used by /new to defer creation). */
35
+ clearSession(): void;
36
+ loadGlobalPreferences(): GlobalTuiPreferences;
37
+ saveGlobalPreferences(preferences: GlobalTuiPreferences): void;
38
+ listSessions(): Array<{
39
+ path: string;
40
+ created: string;
41
+ summary: string;
42
+ turns: number;
43
+ }>;
44
+ get projectDir(): string;
45
+ get artifactsDir(): string | undefined;
46
+ get sessionDir(): string | undefined;
47
+ set sessionDir(value: string);
48
+ }
49
+ export interface LogSessionMeta {
50
+ version: number;
51
+ sessionId: string;
52
+ createdAt: string;
53
+ updatedAt: string;
54
+ projectPath: string;
55
+ modelConfigName: string;
56
+ modelProvider?: string;
57
+ modelSelectionKey?: string;
58
+ modelId?: string;
59
+ summary: string;
60
+ turnCount: number;
61
+ compactCount: number;
62
+ thinkingLevel: string;
63
+ cacheHitEnabled: boolean;
64
+ activePlanFile?: string;
65
+ }
66
+ export interface GlobalTuiPreferences {
67
+ version: number;
68
+ modelConfigName?: string;
69
+ modelProvider?: string;
70
+ modelSelectionKey?: string;
71
+ modelId?: string;
72
+ thinkingLevel: string;
73
+ cacheHitEnabled: boolean;
74
+ accentColor?: string;
75
+ disabledSkills?: string[];
76
+ }
77
+ export declare function createGlobalTuiPreferences(partial?: Partial<GlobalTuiPreferences>): GlobalTuiPreferences;
78
+ export declare function createLogSessionMeta(partial?: Partial<LogSessionMeta>): LogSessionMeta;
79
+ export declare function saveLog(dir: string, meta: LogSessionMeta, entries: LogEntry[]): void;
80
+ export interface LoadLogResult {
81
+ meta: LogSessionMeta;
82
+ entries: LogEntry[];
83
+ idAllocator: LogIdAllocator;
84
+ }
85
+ export declare function loadLog(dir: string): LoadLogResult;
86
+ export interface LogRepairResult {
87
+ entries: LogEntry[];
88
+ repaired: boolean;
89
+ warnings: string[];
90
+ }
91
+ export declare function validateAndRepairLog(entries: LogEntry[]): LogRepairResult;
92
+ export declare function archiveWindow(dir: string, windowIndex: number, entries: LogEntry[], windowStartIdx: number, windowEndIdx: number): void;
93
+ export declare function loadArchive(dir: string, windowIndex: number): Array<{
94
+ id: string;
95
+ content: unknown;
96
+ }>;
97
+ /**
98
+ * Restore archived content back into entries (in-memory only).
99
+ */
100
+ export declare function restoreArchiveToEntries(entries: LogEntry[], archived: Array<{
101
+ id: string;
102
+ content: unknown;
103
+ }>): void;
104
+ //# sourceMappingURL=persistence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../src/persistence.ts"],"names":[],"mappings":"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"}