@code-yeongyu/senpi 2026.9.19-2 → 2026.9.20

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 (171) hide show
  1. package/CHANGELOG.md +53 -0
  2. package/dist/bundle/chunks/{app-server-command-QBJ4GPN7.js → app-server-command-B35FQUTE.js} +1 -1
  3. package/dist/bundle/chunks/{bun-extension-importer-JQZRPNJH.js → bun-extension-importer-HHH4TV4B.js} +3 -3
  4. package/dist/bundle/chunks/{chunk-YRN3PCTM.js → chunk-DQZB4GVV.js} +4 -4
  5. package/dist/bundle/chunks/{chunk-EHSDTQ6I.js → chunk-E5R67F7G.js} +37 -37
  6. package/dist/bundle/chunks/{chunk-5E5TLB76.js → chunk-TWGC3TBR.js} +2 -2
  7. package/dist/bundle/chunks/{chunk-RLRLQRI2.js → chunk-V2ZB62DG.js} +1 -1
  8. package/dist/bundle/chunks/{chunk-3FRTRCR6.js → chunk-YXQG2SUX.js} +2 -2
  9. package/dist/bundle/chunks/{chunk-PLZK7ABD.js → chunk-Z4LHCTJ6.js} +1 -1
  10. package/dist/bundle/chunks/{chunk-3Q4WGKFA.js → chunk-ZMFHNH6U.js} +1 -1
  11. package/dist/bundle/chunks/{cli-main-MLJ2H637.js → cli-main-USVT7JMN.js} +1 -1
  12. package/dist/bundle/chunks/{interactive-host-runtime-AITXUDCT.js → interactive-host-runtime-ELBAZ4LN.js} +1 -1
  13. package/dist/bundle/chunks/{interactive-mode-7C75IXNF.js → interactive-mode-R6225BKI.js} +1 -1
  14. package/dist/bundle/chunks/{list-tips-KTDNGQUK.js → list-tips-Z7T2ACVU.js} +1 -1
  15. package/dist/bundle/chunks/{multi-session-host-2YCJKQOL.js → multi-session-host-QNEBJW2P.js} +3 -3
  16. package/dist/bundle/chunks/{package-manager-cli-4ANSELYT.js → package-manager-cli-4MVJ3JSE.js} +1 -1
  17. package/dist/bundle/chunks/{rpc-mode-OPFQIWFP.js → rpc-mode-CXVDRIBU.js} +1 -1
  18. package/dist/bundle/chunks/{session-picker-DXCITGLS.js → session-picker-6N666KQZ.js} +1 -1
  19. package/dist/bundle/chunks/session-worker.js +66 -66
  20. package/dist/bundle/cli.js +1 -1
  21. package/dist/bundle/index.js +1 -1
  22. package/dist/bundle/rpc-entry.js +1 -1
  23. package/dist/core/agent-session-services.d.ts.map +1 -1
  24. package/dist/core/agent-session-services.js +14 -1
  25. package/dist/core/agent-session-services.js.map +1 -1
  26. package/dist/core/agent-session.d.ts +45 -0
  27. package/dist/core/agent-session.d.ts.map +1 -1
  28. package/dist/core/agent-session.js +233 -11
  29. package/dist/core/agent-session.js.map +1 -1
  30. package/dist/core/extensions/builtin/ask-user/extension.d.ts.map +1 -1
  31. package/dist/core/extensions/builtin/ask-user/extension.js +16 -5
  32. package/dist/core/extensions/builtin/ask-user/extension.js.map +1 -1
  33. package/dist/core/extensions/builtin/ask-user/format.d.ts +5 -0
  34. package/dist/core/extensions/builtin/ask-user/format.d.ts.map +1 -1
  35. package/dist/core/extensions/builtin/ask-user/format.js +4 -0
  36. package/dist/core/extensions/builtin/ask-user/format.js.map +1 -1
  37. package/dist/core/extensions/builtin/ask-user/notify.d.ts +2 -0
  38. package/dist/core/extensions/builtin/ask-user/notify.d.ts.map +1 -1
  39. package/dist/core/extensions/builtin/ask-user/notify.js +2 -0
  40. package/dist/core/extensions/builtin/ask-user/notify.js.map +1 -1
  41. package/dist/core/extensions/builtin/ask-user/registry.d.ts +15 -2
  42. package/dist/core/extensions/builtin/ask-user/registry.d.ts.map +1 -1
  43. package/dist/core/extensions/builtin/ask-user/registry.js +13 -0
  44. package/dist/core/extensions/builtin/ask-user/registry.js.map +1 -1
  45. package/dist/core/extensions/builtin/ask-user/render.d.ts +6 -0
  46. package/dist/core/extensions/builtin/ask-user/render.d.ts.map +1 -1
  47. package/dist/core/extensions/builtin/ask-user/render.js +9 -0
  48. package/dist/core/extensions/builtin/ask-user/render.js.map +1 -1
  49. package/dist/core/extensions/builtin/ask-user/resume.d.ts.map +1 -1
  50. package/dist/core/extensions/builtin/ask-user/resume.js +59 -24
  51. package/dist/core/extensions/builtin/ask-user/resume.js.map +1 -1
  52. package/dist/core/extensions/builtin/ask-user/tool.d.ts +1 -1
  53. package/dist/core/extensions/builtin/ask-user/tool.d.ts.map +1 -1
  54. package/dist/core/extensions/builtin/ask-user/tool.js +98 -17
  55. package/dist/core/extensions/builtin/ask-user/tool.js.map +1 -1
  56. package/dist/core/extensions/builtin/compaction/model-usability-budget.d.ts +18 -0
  57. package/dist/core/extensions/builtin/compaction/model-usability-budget.d.ts.map +1 -1
  58. package/dist/core/extensions/builtin/compaction/model-usability-budget.js +16 -8
  59. package/dist/core/extensions/builtin/compaction/model-usability-budget.js.map +1 -1
  60. package/dist/core/extensions/builtin/compaction/switch-admission.d.ts +23 -0
  61. package/dist/core/extensions/builtin/compaction/switch-admission.d.ts.map +1 -0
  62. package/dist/core/extensions/builtin/compaction/switch-admission.js +19 -0
  63. package/dist/core/extensions/builtin/compaction/switch-admission.js.map +1 -0
  64. package/dist/core/extensions/builtin/goal/index.d.ts.map +1 -1
  65. package/dist/core/extensions/builtin/goal/index.js +10 -0
  66. package/dist/core/extensions/builtin/goal/index.js.map +1 -1
  67. package/dist/core/extensions/bun-extension-commonjs.d.ts +1 -1
  68. package/dist/core/extensions/bun-extension-commonjs.d.ts.map +1 -1
  69. package/dist/core/extensions/bun-extension-commonjs.js +3 -3
  70. package/dist/core/extensions/bun-extension-commonjs.js.map +1 -1
  71. package/dist/core/extensions/bun-extension-importer.d.ts.map +1 -1
  72. package/dist/core/extensions/bun-extension-importer.js +4 -1
  73. package/dist/core/extensions/bun-extension-importer.js.map +1 -1
  74. package/dist/core/extensions/bun-extension-registry.d.ts.map +1 -1
  75. package/dist/core/extensions/bun-extension-registry.js +5 -9
  76. package/dist/core/extensions/bun-extension-registry.js.map +1 -1
  77. package/dist/core/resolved-paths-memo.d.ts +31 -0
  78. package/dist/core/resolved-paths-memo.d.ts.map +1 -0
  79. package/dist/core/resolved-paths-memo.js +57 -0
  80. package/dist/core/resolved-paths-memo.js.map +1 -0
  81. package/dist/core/resource-loader.d.ts +4 -1
  82. package/dist/core/resource-loader.d.ts.map +1 -1
  83. package/dist/core/resource-loader.js +25 -12
  84. package/dist/core/resource-loader.js.map +1 -1
  85. package/dist/core/retry-fallback/settings.d.ts +10 -2
  86. package/dist/core/retry-fallback/settings.d.ts.map +1 -1
  87. package/dist/core/retry-fallback/settings.js +28 -6
  88. package/dist/core/retry-fallback/settings.js.map +1 -1
  89. package/dist/core/skill-discovery.d.ts.map +1 -1
  90. package/dist/core/skill-discovery.js +11 -1
  91. package/dist/core/skill-discovery.js.map +1 -1
  92. package/dist/main.d.ts +10 -0
  93. package/dist/main.d.ts.map +1 -1
  94. package/dist/main.js +19 -2
  95. package/dist/main.js.map +1 -1
  96. package/dist/modes/interactive/components/ask-user-answer-chip.d.ts +2 -5
  97. package/dist/modes/interactive/components/ask-user-answer-chip.d.ts.map +1 -1
  98. package/dist/modes/interactive/components/ask-user-answer-chip.js +1 -4
  99. package/dist/modes/interactive/components/ask-user-answer-chip.js.map +1 -1
  100. package/dist/modes/interactive/components/assistant-message.d.ts +2 -0
  101. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  102. package/dist/modes/interactive/components/assistant-message.js +8 -0
  103. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  104. package/dist/modes/interactive/components/assistant-render-descriptors.d.ts +1 -0
  105. package/dist/modes/interactive/components/assistant-render-descriptors.d.ts.map +1 -1
  106. package/dist/modes/interactive/components/assistant-render-descriptors.js +4 -0
  107. package/dist/modes/interactive/components/assistant-render-descriptors.js.map +1 -1
  108. package/dist/modes/interactive/components/status-indicator.d.ts +3 -1
  109. package/dist/modes/interactive/components/status-indicator.d.ts.map +1 -1
  110. package/dist/modes/interactive/components/status-indicator.js +15 -2
  111. package/dist/modes/interactive/components/status-indicator.js.map +1 -1
  112. package/dist/modes/interactive/interactive-mode.d.ts +2 -0
  113. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  114. package/dist/modes/interactive/interactive-mode.js +81 -6
  115. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  116. package/dist/modes/interactive/provider-error-presentation.d.ts +18 -0
  117. package/dist/modes/interactive/provider-error-presentation.d.ts.map +1 -0
  118. package/dist/modes/interactive/provider-error-presentation.js +100 -0
  119. package/dist/modes/interactive/provider-error-presentation.js.map +1 -0
  120. package/dist/modes/rpc/rpc-types.d.ts +18 -0
  121. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  122. package/dist/modes/rpc/rpc-types.js.map +1 -1
  123. package/dist/modes/rpc/session-command-router.d.ts.map +1 -1
  124. package/dist/modes/rpc/session-command-router.js +14 -0
  125. package/dist/modes/rpc/session-command-router.js.map +1 -1
  126. package/dist/modes/rpc/session-event-writer.d.ts +9 -1
  127. package/dist/modes/rpc/session-event-writer.d.ts.map +1 -1
  128. package/dist/modes/rpc/session-event-writer.js +21 -0
  129. package/dist/modes/rpc/session-event-writer.js.map +1 -1
  130. package/dist/modes/rpc/session-registry.d.ts.map +1 -1
  131. package/dist/modes/rpc/session-registry.js +9 -2
  132. package/dist/modes/rpc/session-registry.js.map +1 -1
  133. package/dist/modes/rpc/session-worker-requests.d.ts +10 -1
  134. package/dist/modes/rpc/session-worker-requests.d.ts.map +1 -1
  135. package/dist/modes/rpc/session-worker-requests.js +8 -2
  136. package/dist/modes/rpc/session-worker-requests.js.map +1 -1
  137. package/dist/modes/rpc/session-worker-requests.test.d.ts +2 -0
  138. package/dist/modes/rpc/session-worker-requests.test.d.ts.map +1 -0
  139. package/dist/modes/rpc/session-worker-requests.test.js +44 -0
  140. package/dist/modes/rpc/session-worker-requests.test.js.map +1 -0
  141. package/docs/rpc.md +7 -0
  142. package/docs/settings.md +1 -1
  143. package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +12 -0
  144. package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
  145. package/node_modules/@earendil-works/pi-agent-core/package.json +3 -3
  146. package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
  147. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode-go.json +1 -1
  148. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode.json +1 -1
  149. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opengateway.json +1 -1
  150. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
  151. package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
  152. package/node_modules/@earendil-works/pi-ai/dist/providers/data/zai-coding-cn.json +1 -1
  153. package/node_modules/@earendil-works/pi-ai/dist/providers/data/zai.json +1 -1
  154. package/node_modules/@earendil-works/pi-ai/package.json +2 -2
  155. package/node_modules/@earendil-works/pi-pty/package.json +1 -1
  156. package/node_modules/@earendil-works/pi-telemetry/package.json +1 -1
  157. package/node_modules/@earendil-works/pi-tui/dist/native-module-path.d.ts.map +1 -1
  158. package/node_modules/@earendil-works/pi-tui/dist/native-module-path.js +26 -3
  159. package/node_modules/@earendil-works/pi-tui/dist/native-module-path.js.map +1 -1
  160. package/node_modules/@earendil-works/pi-tui/dist/tui-alt-screen.d.ts.map +1 -1
  161. package/node_modules/@earendil-works/pi-tui/dist/tui-alt-screen.js +13 -6
  162. package/node_modules/@earendil-works/pi-tui/dist/tui-alt-screen.js.map +1 -1
  163. package/node_modules/@earendil-works/pi-tui/dist/tui-main-screen.d.ts.map +1 -1
  164. package/node_modules/@earendil-works/pi-tui/dist/tui-main-screen.js +11 -3
  165. package/node_modules/@earendil-works/pi-tui/dist/tui-main-screen.js.map +1 -1
  166. package/node_modules/@earendil-works/pi-tui/dist/tui.d.ts +15 -2
  167. package/node_modules/@earendil-works/pi-tui/dist/tui.d.ts.map +1 -1
  168. package/node_modules/@earendil-works/pi-tui/dist/tui.js +45 -2
  169. package/node_modules/@earendil-works/pi-tui/dist/tui.js.map +1 -1
  170. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  171. package/package.json +8 -8
@@ -1,8 +1,27 @@
1
1
  /**
2
- * Fallback chains are explicit user configuration only. There is deliberately
3
- * no shipped default or wildcard lane.
2
+ * Shipped defaults are declared as model families (bare ids, no provider prefix).
3
+ * `canonicalizeFallbackChains` expands them against the live registry, so the chain
4
+ * follows Fable 5 whichever provider serves it - the builtin Anthropic provider, the
5
+ * Claude SDK OAuth extension, a gateway, or Bedrock.
6
+ *
7
+ * The ladder never leaves the Anthropic Opus family. The previous shipped default was
8
+ * removed because it led with cross-family rungs (`k3`, `kimi-k3`), which moved a Claude
9
+ * session onto another vendor mid-turn and could rank a guaranteed-refusal OAuth lane
10
+ * first; a same-family step-down carries neither problem. There is still deliberately no
11
+ * wildcard lane.
4
12
  */
5
- export const DEFAULT_FALLBACK_CHAINS = {};
13
+ export const DEFAULT_FALLBACK_CHAINS = {
14
+ // Every rung is `:max` because `claude-opus-4-6` publishes only that thinking level.
15
+ "claude-fable-5-1": ["claude-opus-5:max", "claude-opus-4-8:max", "claude-opus-4-6:max"],
16
+ "claude-fable-5": ["claude-opus-5:max", "claude-opus-4-8:max", "claude-opus-4-6:max"],
17
+ };
18
+ function cloneDefaultFallbackChains() {
19
+ const chains = {};
20
+ for (const [key, entries] of Object.entries(DEFAULT_FALLBACK_CHAINS)) {
21
+ chains[key] = [...entries];
22
+ }
23
+ return chains;
24
+ }
6
25
  function isPlainObject(value) {
7
26
  return value !== null && typeof value === "object" && !Array.isArray(value);
8
27
  }
@@ -23,11 +42,14 @@ function isStringArray(value) {
23
42
  */
24
43
  function resolveFallbackChains(value) {
25
44
  if (value === undefined || !isPlainObject(value))
26
- return {};
27
- const chains = {};
45
+ return cloneDefaultFallbackChains();
46
+ const chains = cloneDefaultFallbackChains();
28
47
  for (const [key, entries] of Object.entries(value)) {
29
48
  if (!isStringArray(entries))
30
- return {};
49
+ return cloneDefaultFallbackChains();
50
+ // An empty list stays in the map as a tombstone: canonicalization needs it to
51
+ // suppress the expanded default for that family or provider variant, and
52
+ // dropping it here would let the shipped default reappear after expansion.
31
53
  chains[key] = [...entries];
32
54
  }
33
55
  return chains;
@@ -1 +1 @@
1
- {"version":3,"file":"settings.js","sourceRoot":"","sources":["../../../src/core/retry-fallback/settings.ts"],"names":[],"mappings":"AAgCA;;;GAGG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAmB,EAAE,CAAC;AAE1D,SAAS,aAAa,CAAC,KAAc;IACpC,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC7E,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACpC,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC;AAClF,CAAC;AAED;;;;;;;;;;;GAWG;AACH,SAAS,qBAAqB,CAAC,KAAc;IAC5C,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC5D,MAAM,MAAM,GAAsC,EAAE,CAAC;IACrD,KAAK,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACpD,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC;YAAE,OAAO,EAAE,CAAC;QACvC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC;IAC5B,CAAC;IACD,OAAO,MAAM,CAAC;AACf,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,QAAmC;IAC/E,OAAO;QACN,aAAa,EAAE,OAAO,QAAQ,EAAE,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI;QAC3F,MAAM,EAAE,qBAAqB,CAAC,QAAQ,EAAE,cAAc,CAAC;QACvD,YAAY,EAAE,QAAQ,EAAE,oBAAoB,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,iBAAiB;KACtF,CAAC;AACH,CAAC;AAED,MAAM,UAAU,8BAA8B,CAAC,QAAmC;IACjF,OAAO,OAAO,QAAQ,EAAE,uBAAuB,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,uBAAuB,CAAC,CAAC,CAAC,IAAI,CAAC;AACzG,CAAC;AAED,MAAM,CAAC,MAAM,0BAA0B,GAAG,OAAO,CAAC;AAClD,MAAM,CAAC,MAAM,yBAAyB,GAAG,SAAS,CAAC;AAOnD,MAAM,UAAU,yBAAyB,CAAC,QAAmC;IAC5E,MAAM,eAAe,GACpB,OAAO,QAAQ,EAAE,eAAe,KAAK,QAAQ,IAAI,QAAQ,CAAC,eAAe,IAAI,CAAC;QAC7E,CAAC,CAAC,QAAQ,CAAC,eAAe;QAC1B,CAAC,CAAC,0BAA0B,CAAC;IAC/B,MAAM,cAAc,GACnB,OAAO,QAAQ,EAAE,cAAc,KAAK,QAAQ,IAAI,QAAQ,CAAC,cAAc,IAAI,CAAC;QAC3E,CAAC,CAAC,QAAQ,CAAC,cAAc;QACzB,CAAC,CAAC,yBAAyB,CAAC;IAE9B,IAAI,cAAc,IAAI,eAAe,EAAE,CAAC;QACvC,OAAO,EAAE,eAAe,EAAE,0BAA0B,EAAE,cAAc,EAAE,yBAAyB,EAAE,CAAC;IACnG,CAAC;IAED,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,CAAC;AAC5C,CAAC","sourcesContent":["import type { FallbackChains } from \"./chains.ts\";\n\nexport interface ProviderRetrySettings {\n\ttimeoutMs?: number;\n\tstreamStartTimeoutMs?: number;\n\tstreamRetryTimeoutMs?: number; // retry-continuation watchdog cap after a provider timeout; reconciled to max(cap, streamStartTimeoutMs) so a granted stream-start budget is never cut short; default: 30000, 0 disables\n\tmaxRetries?: number;\n\tmaxRetryDelayMs?: number;\n}\n\nexport interface RetrySettings {\n\tenabled?: boolean;\n\tmaxRetries?: number;\n\tbaseDelayMs?: number;\n\t/** Hard ceiling on one agent-level retry wait, applied after profile/hint/jitter planning; default: 60000. */\n\tmaxAgentDelayMs?: number;\n\tprovider?: ProviderRetrySettings;\n\tproviders?: Record<string, import(\"./profile-override.ts\").RetryPolicyOverride>;\n\tmodelFallback?: boolean;\n\tfallbackChains?: Record<string, string[]>;\n\tfallbackRevertPolicy?: \"cooldown-expiry\" | \"never\";\n\tabortServerSideFallback?: boolean;\n\thintedWaitCapMs?: number;\n\tprobeBackMaxMs?: number;\n}\n\nexport interface ResolvedRetryFallbackSettings {\n\tmodelFallback: boolean;\n\tchains: FallbackChains;\n\trevertPolicy: \"cooldown-expiry\" | \"never\";\n}\n\n/**\n * Fallback chains are explicit user configuration only. There is deliberately\n * no shipped default or wildcard lane.\n */\nexport const DEFAULT_FALLBACK_CHAINS: FallbackChains = {};\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n\treturn value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction isStringArray(value: unknown): value is string[] {\n\treturn Array.isArray(value) && value.every((entry) => typeof entry === \"string\");\n}\n\n/**\n * User chains layer over the shipped defaults per key instead of replacing the\n * whole map. Configuring an unrelated model must not silently delete a default\n * chain: that left the defaulted model with no client chain at all, which in\n * turn disabled the server-fallback abort and handed model choice back to the\n * provider. A same-named key still replaces that default outright (never a\n * union), and an explicit empty array removes a default the user does not want -\n * as a tombstone honored at both bare-family and canonical-provider granularity.\n *\n * Cross-scope replacement (global vs project) stays wholesale and is handled by\n * `deepMergeSettings`; this only resolves defaults against the merged result.\n */\nfunction resolveFallbackChains(value: unknown): FallbackChains {\n\tif (value === undefined || !isPlainObject(value)) return {};\n\tconst chains: Record<string, readonly string[]> = {};\n\tfor (const [key, entries] of Object.entries(value)) {\n\t\tif (!isStringArray(entries)) return {};\n\t\tchains[key] = [...entries];\n\t}\n\treturn chains;\n}\n\nexport function resolveRetryFallbackSettings(settings: RetrySettings | undefined): ResolvedRetryFallbackSettings {\n\treturn {\n\t\tmodelFallback: typeof settings?.modelFallback === \"boolean\" ? settings.modelFallback : true,\n\t\tchains: resolveFallbackChains(settings?.fallbackChains),\n\t\trevertPolicy: settings?.fallbackRevertPolicy === \"never\" ? \"never\" : \"cooldown-expiry\",\n\t};\n}\n\nexport function resolveAbortServerSideFallback(settings: RetrySettings | undefined): boolean {\n\treturn typeof settings?.abortServerSideFallback === \"boolean\" ? settings.abortServerSideFallback : true;\n}\n\nexport const DEFAULT_HINTED_WAIT_CAP_MS = 300_000;\nexport const DEFAULT_PROBE_BACK_MAX_MS = 3_600_000;\n\nexport interface ResolvedHintPolicySettings {\n\thintedWaitCapMs: number;\n\tprobeBackMaxMs: number;\n}\n\nexport function resolveHintPolicySettings(settings: RetrySettings | undefined): ResolvedHintPolicySettings {\n\tconst hintedWaitCapMs =\n\t\ttypeof settings?.hintedWaitCapMs === \"number\" && settings.hintedWaitCapMs >= 0\n\t\t\t? settings.hintedWaitCapMs\n\t\t\t: DEFAULT_HINTED_WAIT_CAP_MS;\n\tconst probeBackMaxMs =\n\t\ttypeof settings?.probeBackMaxMs === \"number\" && settings.probeBackMaxMs >= 0\n\t\t\t? settings.probeBackMaxMs\n\t\t\t: DEFAULT_PROBE_BACK_MAX_MS;\n\n\tif (probeBackMaxMs <= hintedWaitCapMs) {\n\t\treturn { hintedWaitCapMs: DEFAULT_HINTED_WAIT_CAP_MS, probeBackMaxMs: DEFAULT_PROBE_BACK_MAX_MS };\n\t}\n\n\treturn { hintedWaitCapMs, probeBackMaxMs };\n}\n"]}
1
+ {"version":3,"file":"settings.js","sourceRoot":"","sources":["../../../src/core/retry-fallback/settings.ts"],"names":[],"mappings":"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","sourcesContent":["import type { FallbackChains } from \"./chains.ts\";\n\nexport interface ProviderRetrySettings {\n\ttimeoutMs?: number;\n\tstreamStartTimeoutMs?: number;\n\tstreamRetryTimeoutMs?: number; // retry-continuation watchdog cap after a provider timeout; reconciled to max(cap, streamStartTimeoutMs) so a granted stream-start budget is never cut short; default: 30000, 0 disables\n\tmaxRetries?: number;\n\tmaxRetryDelayMs?: number;\n}\n\nexport interface RetrySettings {\n\tenabled?: boolean;\n\tmaxRetries?: number;\n\tbaseDelayMs?: number;\n\t/** Hard ceiling on one agent-level retry wait, applied after profile/hint/jitter planning; default: 60000. */\n\tmaxAgentDelayMs?: number;\n\tprovider?: ProviderRetrySettings;\n\tproviders?: Record<string, import(\"./profile-override.ts\").RetryPolicyOverride>;\n\tmodelFallback?: boolean;\n\tfallbackChains?: Record<string, string[]>;\n\tfallbackRevertPolicy?: \"cooldown-expiry\" | \"never\";\n\tabortServerSideFallback?: boolean;\n\thintedWaitCapMs?: number;\n\tprobeBackMaxMs?: number;\n}\n\nexport interface ResolvedRetryFallbackSettings {\n\tmodelFallback: boolean;\n\tchains: FallbackChains;\n\trevertPolicy: \"cooldown-expiry\" | \"never\";\n}\n\n/**\n * Shipped defaults are declared as model families (bare ids, no provider prefix).\n * `canonicalizeFallbackChains` expands them against the live registry, so the chain\n * follows Fable 5 whichever provider serves it - the builtin Anthropic provider, the\n * Claude SDK OAuth extension, a gateway, or Bedrock.\n *\n * The ladder never leaves the Anthropic Opus family. The previous shipped default was\n * removed because it led with cross-family rungs (`k3`, `kimi-k3`), which moved a Claude\n * session onto another vendor mid-turn and could rank a guaranteed-refusal OAuth lane\n * first; a same-family step-down carries neither problem. There is still deliberately no\n * wildcard lane.\n */\nexport const DEFAULT_FALLBACK_CHAINS: FallbackChains = {\n\t// Every rung is `:max` because `claude-opus-4-6` publishes only that thinking level.\n\t\"claude-fable-5-1\": [\"claude-opus-5:max\", \"claude-opus-4-8:max\", \"claude-opus-4-6:max\"],\n\t\"claude-fable-5\": [\"claude-opus-5:max\", \"claude-opus-4-8:max\", \"claude-opus-4-6:max\"],\n};\n\nfunction cloneDefaultFallbackChains(): Record<string, readonly string[]> {\n\tconst chains: Record<string, readonly string[]> = {};\n\tfor (const [key, entries] of Object.entries(DEFAULT_FALLBACK_CHAINS)) {\n\t\tchains[key] = [...entries];\n\t}\n\treturn chains;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n\treturn value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction isStringArray(value: unknown): value is string[] {\n\treturn Array.isArray(value) && value.every((entry) => typeof entry === \"string\");\n}\n\n/**\n * User chains layer over the shipped defaults per key instead of replacing the\n * whole map. Configuring an unrelated model must not silently delete a default\n * chain: that left the defaulted model with no client chain at all, which in\n * turn disabled the server-fallback abort and handed model choice back to the\n * provider. A same-named key still replaces that default outright (never a\n * union), and an explicit empty array removes a default the user does not want -\n * as a tombstone honored at both bare-family and canonical-provider granularity.\n *\n * Cross-scope replacement (global vs project) stays wholesale and is handled by\n * `deepMergeSettings`; this only resolves defaults against the merged result.\n */\nfunction resolveFallbackChains(value: unknown): FallbackChains {\n\tif (value === undefined || !isPlainObject(value)) return cloneDefaultFallbackChains();\n\tconst chains: Record<string, readonly string[]> = cloneDefaultFallbackChains();\n\tfor (const [key, entries] of Object.entries(value)) {\n\t\tif (!isStringArray(entries)) return cloneDefaultFallbackChains();\n\t\t// An empty list stays in the map as a tombstone: canonicalization needs it to\n\t\t// suppress the expanded default for that family or provider variant, and\n\t\t// dropping it here would let the shipped default reappear after expansion.\n\t\tchains[key] = [...entries];\n\t}\n\treturn chains;\n}\n\nexport function resolveRetryFallbackSettings(settings: RetrySettings | undefined): ResolvedRetryFallbackSettings {\n\treturn {\n\t\tmodelFallback: typeof settings?.modelFallback === \"boolean\" ? settings.modelFallback : true,\n\t\tchains: resolveFallbackChains(settings?.fallbackChains),\n\t\trevertPolicy: settings?.fallbackRevertPolicy === \"never\" ? \"never\" : \"cooldown-expiry\",\n\t};\n}\n\nexport function resolveAbortServerSideFallback(settings: RetrySettings | undefined): boolean {\n\treturn typeof settings?.abortServerSideFallback === \"boolean\" ? settings.abortServerSideFallback : true;\n}\n\nexport const DEFAULT_HINTED_WAIT_CAP_MS = 300_000;\nexport const DEFAULT_PROBE_BACK_MAX_MS = 3_600_000;\n\nexport interface ResolvedHintPolicySettings {\n\thintedWaitCapMs: number;\n\tprobeBackMaxMs: number;\n}\n\nexport function resolveHintPolicySettings(settings: RetrySettings | undefined): ResolvedHintPolicySettings {\n\tconst hintedWaitCapMs =\n\t\ttypeof settings?.hintedWaitCapMs === \"number\" && settings.hintedWaitCapMs >= 0\n\t\t\t? settings.hintedWaitCapMs\n\t\t\t: DEFAULT_HINTED_WAIT_CAP_MS;\n\tconst probeBackMaxMs =\n\t\ttypeof settings?.probeBackMaxMs === \"number\" && settings.probeBackMaxMs >= 0\n\t\t\t? settings.probeBackMaxMs\n\t\t\t: DEFAULT_PROBE_BACK_MAX_MS;\n\n\tif (probeBackMaxMs <= hintedWaitCapMs) {\n\t\treturn { hintedWaitCapMs: DEFAULT_HINTED_WAIT_CAP_MS, probeBackMaxMs: DEFAULT_PROBE_BACK_MAX_MS };\n\t}\n\n\treturn { hintedWaitCapMs, probeBackMaxMs };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"skill-discovery.d.ts","sourceRoot":"","sources":["../../src/core/skill-discovery.ts"],"names":[],"mappings":"AAEA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,6FAA6F;AAC7F,eAAO,MAAM,8BAA8B,OAAO,CAAC;AAOnD,KAAK,aAAa,GAAG,UAAU,CAAC,OAAO,MAAM,CAAC,CAAC;AAE/C,MAAM,MAAM,kBAAkB,GAAG,IAAI,GAAG,QAAQ,CAAC;AAMjD,wBAAgB,gCAAgC,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEtE;AAiED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAmBhE;AAED,wBAAgB,mBAAmB,CAClC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,kBAAkB,EACxB,aAAa,CAAC,EAAE,aAAa,EAC7B,OAAO,CAAC,EAAE,MAAM,GACd,MAAM,EAAE,CAuEV;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,GAAG,MAAM,EAAE,CAEvF"}
1
+ {"version":3,"file":"skill-discovery.d.ts","sourceRoot":"","sources":["../../src/core/skill-discovery.ts"],"names":[],"mappings":"AAEA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,6FAA6F;AAC7F,eAAO,MAAM,8BAA8B,OAAO,CAAC;AAOnD,KAAK,aAAa,GAAG,UAAU,CAAC,OAAO,MAAM,CAAC,CAAC;AAE/C,MAAM,MAAM,kBAAkB,GAAG,IAAI,GAAG,QAAQ,CAAC;AAMjD,wBAAgB,gCAAgC,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEtE;AAiED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CA4BhE;AAED,wBAAgB,mBAAmB,CAClC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,kBAAkB,EACxB,aAAa,CAAC,EAAE,aAAa,EAC7B,OAAO,CAAC,EAAE,MAAM,GACd,MAAM,EAAE,CAuEV;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,GAAG,MAAM,EAAE,CAEvF"}
@@ -79,7 +79,17 @@ function decodeFrontmatterSource(buf) {
79
79
  * Falls back to the rest of the file when the delimiter is not in the prefix.
80
80
  */
81
81
  export function readSkillMarkdownSource(filePath) {
82
- const fd = openSync(filePath, "r");
82
+ let fd;
83
+ try {
84
+ fd = openSync(filePath, "r");
85
+ }
86
+ catch {
87
+ // A Bun single-file executable serves embedded assets from a virtual filesystem that answers
88
+ // existsSync, statSync and readFileSync but hands out no descriptors, so openSync fails on a path
89
+ // the resource loader has already accepted. Read the asset whole instead; a file that is genuinely
90
+ // missing or unreadable throws here too, which keeps the loader's diagnostics truthful.
91
+ return decodeFrontmatterSource(readFileSync(filePath));
92
+ }
83
93
  try {
84
94
  const prefix = Buffer.allocUnsafe(SKILL_FRONTMATTER_PREFIX_BYTES);
85
95
  const bytesRead = readSync(fd, prefix, 0, SKILL_FRONTMATTER_PREFIX_BYTES, 0);
@@ -1 +1 @@
1
- {"version":3,"file":"skill-discovery.js","sourceRoot":"","sources":["../../src/core/skill-discovery.ts"],"names":[],"mappings":"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","sourcesContent":["import { closeSync, existsSync, fstatSync, openSync, readdirSync, readFileSync, readSync, statSync } from \"node:fs\";\nimport { join, relative, sep } from \"node:path\";\nimport ignore from \"ignore\";\n\n/** Bytes read before falling back to the rest of SKILL.md when the closing --- is absent. */\nexport const SKILL_FRONTMATTER_PREFIX_BYTES = 8192;\n\nconst IGNORE_FILE_NAMES = [\".gitignore\", \".ignore\", \".fdignore\"];\nconst SKIP_SKILL_WALK_DIRECTORY_NAMES: ReadonlySet<string> = new Set([\"node_modules\", \".git\"]);\nconst FRONTMATTER_CLOSE_LF = Buffer.from(\"\\n---\");\nconst FRONTMATTER_CLOSE_CR = Buffer.from(\"\\r---\");\n\ntype IgnoreMatcher = ReturnType<typeof ignore>;\n\nexport type SkillDiscoveryMode = \"pi\" | \"agents\";\n\nfunction toPosixPath(p: string): string {\n\treturn p.split(sep).join(\"/\");\n}\n\nexport function shouldSkipSkillWalkDirectoryName(name: string): boolean {\n\treturn name.startsWith(\".\") || SKIP_SKILL_WALK_DIRECTORY_NAMES.has(name);\n}\n\nfunction prefixIgnorePattern(line: string, prefix: string): string | null {\n\tconst trimmed = line.trim();\n\tif (!trimmed) return null;\n\tif (trimmed.startsWith(\"#\") && !trimmed.startsWith(\"\\\\#\")) return null;\n\n\tlet pattern = line;\n\tlet negated = false;\n\n\tif (pattern.startsWith(\"!\")) {\n\t\tnegated = true;\n\t\tpattern = pattern.slice(1);\n\t} else if (pattern.startsWith(\"\\\\!\")) {\n\t\tpattern = pattern.slice(1);\n\t}\n\n\tif (pattern.startsWith(\"/\")) {\n\t\tpattern = pattern.slice(1);\n\t}\n\n\tconst prefixed = prefix ? `${prefix}${pattern}` : pattern;\n\treturn negated ? `!${prefixed}` : prefixed;\n}\n\nfunction addIgnoreRules(ig: IgnoreMatcher, dir: string, rootDir: string): void {\n\tconst relativeDir = relative(rootDir, dir);\n\tconst prefix = relativeDir ? `${toPosixPath(relativeDir)}/` : \"\";\n\n\tfor (const filename of IGNORE_FILE_NAMES) {\n\t\tconst ignorePath = join(dir, filename);\n\t\tif (!existsSync(ignorePath)) continue;\n\t\ttry {\n\t\t\tconst content = readFileSync(ignorePath, \"utf-8\");\n\t\t\tconst patterns = content\n\t\t\t\t.split(/\\r?\\n/)\n\t\t\t\t.map((line) => prefixIgnorePattern(line, prefix))\n\t\t\t\t.filter((line): line is string => Boolean(line));\n\t\t\tif (patterns.length > 0) {\n\t\t\t\tig.add(patterns);\n\t\t\t}\n\t\t} catch {}\n\t}\n}\n\nfunction frontmatterPrefixEnd(buf: Buffer): number | undefined {\n\tlet offset = 0;\n\tif (buf.length >= 3 && buf[0] === 0xef && buf[1] === 0xbb && buf[2] === 0xbf) {\n\t\toffset = 3;\n\t}\n\tif (buf.length - offset < 3 || buf[offset] !== 0x2d || buf[offset + 1] !== 0x2d || buf[offset + 2] !== 0x2d) {\n\t\treturn buf.length;\n\t}\n\tconst lf = buf.indexOf(FRONTMATTER_CLOSE_LF, offset + 3);\n\tconst cr = buf.indexOf(FRONTMATTER_CLOSE_CR, offset + 3);\n\tconst closeAt = lf >= 0 && cr >= 0 ? Math.min(lf, cr) : lf >= 0 ? lf : cr;\n\tif (closeAt < 0) return undefined;\n\treturn closeAt + FRONTMATTER_CLOSE_LF.length;\n}\n\nfunction decodeFrontmatterSource(buf: Buffer): string {\n\tconst end = frontmatterPrefixEnd(buf);\n\treturn (end === undefined ? buf : buf.subarray(0, end)).toString(\"utf8\");\n}\n\n/**\n * Read enough of a skill markdown file to parse YAML frontmatter.\n * Stops at the first 8 KiB when that prefix already contains the closing --- (or has no frontmatter).\n * Falls back to the rest of the file when the delimiter is not in the prefix.\n */\nexport function readSkillMarkdownSource(filePath: string): string {\n\tconst fd = openSync(filePath, \"r\");\n\ttry {\n\t\tconst prefix = Buffer.allocUnsafe(SKILL_FRONTMATTER_PREFIX_BYTES);\n\t\tconst bytesRead = readSync(fd, prefix, 0, SKILL_FRONTMATTER_PREFIX_BYTES, 0);\n\t\tconst prefixBuf = prefix.subarray(0, bytesRead);\n\t\tif (bytesRead < SKILL_FRONTMATTER_PREFIX_BYTES || frontmatterPrefixEnd(prefixBuf) !== undefined) {\n\t\t\treturn decodeFrontmatterSource(prefixBuf);\n\t\t}\n\t\tconst restSize = fstatSync(fd).size - bytesRead;\n\t\tif (restSize <= 0) {\n\t\t\treturn decodeFrontmatterSource(prefixBuf);\n\t\t}\n\t\tconst rest = Buffer.allocUnsafe(restSize);\n\t\treadSync(fd, rest, 0, restSize, bytesRead);\n\t\treturn decodeFrontmatterSource(Buffer.concat([prefixBuf, rest]));\n\t} finally {\n\t\tcloseSync(fd);\n\t}\n}\n\nexport function collectSkillEntries(\n\tdir: string,\n\tmode: SkillDiscoveryMode,\n\tignoreMatcher?: IgnoreMatcher,\n\trootDir?: string,\n): string[] {\n\tconst entries: string[] = [];\n\tif (!existsSync(dir)) return entries;\n\n\tconst root = rootDir ?? dir;\n\tconst ig = ignoreMatcher ?? ignore();\n\taddIgnoreRules(ig, dir, root);\n\n\ttry {\n\t\tconst dirEntries = readdirSync(dir, { withFileTypes: true });\n\n\t\tfor (const entry of dirEntries) {\n\t\t\tif (entry.name !== \"SKILL.md\") {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst fullPath = join(dir, entry.name);\n\t\t\tlet isFile = entry.isFile();\n\t\t\tif (entry.isSymbolicLink()) {\n\t\t\t\ttry {\n\t\t\t\t\tisFile = statSync(fullPath).isFile();\n\t\t\t\t} catch {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst relPath = toPosixPath(relative(root, fullPath));\n\t\t\tif (isFile && !ig.ignores(relPath)) {\n\t\t\t\tentries.push(fullPath);\n\t\t\t\treturn entries;\n\t\t\t}\n\t\t}\n\n\t\tfor (const entry of dirEntries) {\n\t\t\tif (shouldSkipSkillWalkDirectoryName(entry.name)) continue;\n\n\t\t\tconst fullPath = join(dir, entry.name);\n\t\t\tlet isDir = entry.isDirectory();\n\t\t\tlet isFile = entry.isFile();\n\n\t\t\tif (entry.isSymbolicLink()) {\n\t\t\t\ttry {\n\t\t\t\t\tconst stats = statSync(fullPath);\n\t\t\t\t\tisDir = stats.isDirectory();\n\t\t\t\t\tisFile = stats.isFile();\n\t\t\t\t} catch {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst relPath = toPosixPath(relative(root, fullPath));\n\t\t\tconst shouldIncludeMarkdownFile =\n\t\t\t\tisFile &&\n\t\t\t\tentry.name.endsWith(\".md\") &&\n\t\t\t\t!ig.ignores(relPath) &&\n\t\t\t\t((mode === \"pi\" && dir === root) || (mode === \"agents\" && dir !== root));\n\t\t\tif (shouldIncludeMarkdownFile) {\n\t\t\t\tentries.push(fullPath);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (!isDir) continue;\n\t\t\tif (ig.ignores(`${relPath}/`)) continue;\n\n\t\t\tentries.push(...collectSkillEntries(fullPath, mode, ig, root));\n\t\t}\n\t} catch {\n\t\t// Ignore errors\n\t}\n\n\treturn entries;\n}\n\nexport function collectAutoSkillEntries(dir: string, mode: SkillDiscoveryMode): string[] {\n\treturn collectSkillEntries(dir, mode);\n}\n"]}
1
+ {"version":3,"file":"skill-discovery.js","sourceRoot":"","sources":["../../src/core/skill-discovery.ts"],"names":[],"mappings":"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","sourcesContent":["import { closeSync, existsSync, fstatSync, openSync, readdirSync, readFileSync, readSync, statSync } from \"node:fs\";\nimport { join, relative, sep } from \"node:path\";\nimport ignore from \"ignore\";\n\n/** Bytes read before falling back to the rest of SKILL.md when the closing --- is absent. */\nexport const SKILL_FRONTMATTER_PREFIX_BYTES = 8192;\n\nconst IGNORE_FILE_NAMES = [\".gitignore\", \".ignore\", \".fdignore\"];\nconst SKIP_SKILL_WALK_DIRECTORY_NAMES: ReadonlySet<string> = new Set([\"node_modules\", \".git\"]);\nconst FRONTMATTER_CLOSE_LF = Buffer.from(\"\\n---\");\nconst FRONTMATTER_CLOSE_CR = Buffer.from(\"\\r---\");\n\ntype IgnoreMatcher = ReturnType<typeof ignore>;\n\nexport type SkillDiscoveryMode = \"pi\" | \"agents\";\n\nfunction toPosixPath(p: string): string {\n\treturn p.split(sep).join(\"/\");\n}\n\nexport function shouldSkipSkillWalkDirectoryName(name: string): boolean {\n\treturn name.startsWith(\".\") || SKIP_SKILL_WALK_DIRECTORY_NAMES.has(name);\n}\n\nfunction prefixIgnorePattern(line: string, prefix: string): string | null {\n\tconst trimmed = line.trim();\n\tif (!trimmed) return null;\n\tif (trimmed.startsWith(\"#\") && !trimmed.startsWith(\"\\\\#\")) return null;\n\n\tlet pattern = line;\n\tlet negated = false;\n\n\tif (pattern.startsWith(\"!\")) {\n\t\tnegated = true;\n\t\tpattern = pattern.slice(1);\n\t} else if (pattern.startsWith(\"\\\\!\")) {\n\t\tpattern = pattern.slice(1);\n\t}\n\n\tif (pattern.startsWith(\"/\")) {\n\t\tpattern = pattern.slice(1);\n\t}\n\n\tconst prefixed = prefix ? `${prefix}${pattern}` : pattern;\n\treturn negated ? `!${prefixed}` : prefixed;\n}\n\nfunction addIgnoreRules(ig: IgnoreMatcher, dir: string, rootDir: string): void {\n\tconst relativeDir = relative(rootDir, dir);\n\tconst prefix = relativeDir ? `${toPosixPath(relativeDir)}/` : \"\";\n\n\tfor (const filename of IGNORE_FILE_NAMES) {\n\t\tconst ignorePath = join(dir, filename);\n\t\tif (!existsSync(ignorePath)) continue;\n\t\ttry {\n\t\t\tconst content = readFileSync(ignorePath, \"utf-8\");\n\t\t\tconst patterns = content\n\t\t\t\t.split(/\\r?\\n/)\n\t\t\t\t.map((line) => prefixIgnorePattern(line, prefix))\n\t\t\t\t.filter((line): line is string => Boolean(line));\n\t\t\tif (patterns.length > 0) {\n\t\t\t\tig.add(patterns);\n\t\t\t}\n\t\t} catch {}\n\t}\n}\n\nfunction frontmatterPrefixEnd(buf: Buffer): number | undefined {\n\tlet offset = 0;\n\tif (buf.length >= 3 && buf[0] === 0xef && buf[1] === 0xbb && buf[2] === 0xbf) {\n\t\toffset = 3;\n\t}\n\tif (buf.length - offset < 3 || buf[offset] !== 0x2d || buf[offset + 1] !== 0x2d || buf[offset + 2] !== 0x2d) {\n\t\treturn buf.length;\n\t}\n\tconst lf = buf.indexOf(FRONTMATTER_CLOSE_LF, offset + 3);\n\tconst cr = buf.indexOf(FRONTMATTER_CLOSE_CR, offset + 3);\n\tconst closeAt = lf >= 0 && cr >= 0 ? Math.min(lf, cr) : lf >= 0 ? lf : cr;\n\tif (closeAt < 0) return undefined;\n\treturn closeAt + FRONTMATTER_CLOSE_LF.length;\n}\n\nfunction decodeFrontmatterSource(buf: Buffer): string {\n\tconst end = frontmatterPrefixEnd(buf);\n\treturn (end === undefined ? buf : buf.subarray(0, end)).toString(\"utf8\");\n}\n\n/**\n * Read enough of a skill markdown file to parse YAML frontmatter.\n * Stops at the first 8 KiB when that prefix already contains the closing --- (or has no frontmatter).\n * Falls back to the rest of the file when the delimiter is not in the prefix.\n */\nexport function readSkillMarkdownSource(filePath: string): string {\n\tlet fd: number;\n\ttry {\n\t\tfd = openSync(filePath, \"r\");\n\t} catch {\n\t\t// A Bun single-file executable serves embedded assets from a virtual filesystem that answers\n\t\t// existsSync, statSync and readFileSync but hands out no descriptors, so openSync fails on a path\n\t\t// the resource loader has already accepted. Read the asset whole instead; a file that is genuinely\n\t\t// missing or unreadable throws here too, which keeps the loader's diagnostics truthful.\n\t\treturn decodeFrontmatterSource(readFileSync(filePath));\n\t}\n\ttry {\n\t\tconst prefix = Buffer.allocUnsafe(SKILL_FRONTMATTER_PREFIX_BYTES);\n\t\tconst bytesRead = readSync(fd, prefix, 0, SKILL_FRONTMATTER_PREFIX_BYTES, 0);\n\t\tconst prefixBuf = prefix.subarray(0, bytesRead);\n\t\tif (bytesRead < SKILL_FRONTMATTER_PREFIX_BYTES || frontmatterPrefixEnd(prefixBuf) !== undefined) {\n\t\t\treturn decodeFrontmatterSource(prefixBuf);\n\t\t}\n\t\tconst restSize = fstatSync(fd).size - bytesRead;\n\t\tif (restSize <= 0) {\n\t\t\treturn decodeFrontmatterSource(prefixBuf);\n\t\t}\n\t\tconst rest = Buffer.allocUnsafe(restSize);\n\t\treadSync(fd, rest, 0, restSize, bytesRead);\n\t\treturn decodeFrontmatterSource(Buffer.concat([prefixBuf, rest]));\n\t} finally {\n\t\tcloseSync(fd);\n\t}\n}\n\nexport function collectSkillEntries(\n\tdir: string,\n\tmode: SkillDiscoveryMode,\n\tignoreMatcher?: IgnoreMatcher,\n\trootDir?: string,\n): string[] {\n\tconst entries: string[] = [];\n\tif (!existsSync(dir)) return entries;\n\n\tconst root = rootDir ?? dir;\n\tconst ig = ignoreMatcher ?? ignore();\n\taddIgnoreRules(ig, dir, root);\n\n\ttry {\n\t\tconst dirEntries = readdirSync(dir, { withFileTypes: true });\n\n\t\tfor (const entry of dirEntries) {\n\t\t\tif (entry.name !== \"SKILL.md\") {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst fullPath = join(dir, entry.name);\n\t\t\tlet isFile = entry.isFile();\n\t\t\tif (entry.isSymbolicLink()) {\n\t\t\t\ttry {\n\t\t\t\t\tisFile = statSync(fullPath).isFile();\n\t\t\t\t} catch {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst relPath = toPosixPath(relative(root, fullPath));\n\t\t\tif (isFile && !ig.ignores(relPath)) {\n\t\t\t\tentries.push(fullPath);\n\t\t\t\treturn entries;\n\t\t\t}\n\t\t}\n\n\t\tfor (const entry of dirEntries) {\n\t\t\tif (shouldSkipSkillWalkDirectoryName(entry.name)) continue;\n\n\t\t\tconst fullPath = join(dir, entry.name);\n\t\t\tlet isDir = entry.isDirectory();\n\t\t\tlet isFile = entry.isFile();\n\n\t\t\tif (entry.isSymbolicLink()) {\n\t\t\t\ttry {\n\t\t\t\t\tconst stats = statSync(fullPath);\n\t\t\t\t\tisDir = stats.isDirectory();\n\t\t\t\t\tisFile = stats.isFile();\n\t\t\t\t} catch {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst relPath = toPosixPath(relative(root, fullPath));\n\t\t\tconst shouldIncludeMarkdownFile =\n\t\t\t\tisFile &&\n\t\t\t\tentry.name.endsWith(\".md\") &&\n\t\t\t\t!ig.ignores(relPath) &&\n\t\t\t\t((mode === \"pi\" && dir === root) || (mode === \"agents\" && dir !== root));\n\t\t\tif (shouldIncludeMarkdownFile) {\n\t\t\t\tentries.push(fullPath);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (!isDir) continue;\n\t\t\tif (ig.ignores(`${relPath}/`)) continue;\n\n\t\t\tentries.push(...collectSkillEntries(fullPath, mode, ig, root));\n\t\t}\n\t} catch {\n\t\t// Ignore errors\n\t}\n\n\treturn entries;\n}\n\nexport function collectAutoSkillEntries(dir: string, mode: SkillDiscoveryMode): string[] {\n\treturn collectSkillEntries(dir, mode);\n}\n"]}
package/dist/main.d.ts CHANGED
@@ -9,6 +9,7 @@ import { createStartupLoadingIndicator } from "./cli/startup-loading-indicator.t
9
9
  import { type CreateAgentSessionRuntimeFactory } from "./core/agent-session-runtime.ts";
10
10
  import { type AgentSessionRuntimeDiagnostic } from "./core/agent-session-services.ts";
11
11
  import type { InlineExtension } from "./core/extensions/types.ts";
12
+ import { ModelRuntime } from "./core/model-runtime.ts";
12
13
  import { type AppMode } from "./core/project-trust.ts";
13
14
  import { SessionManager } from "./core/session-manager.ts";
14
15
  import { SettingsManager } from "./core/settings-manager.ts";
@@ -45,6 +46,15 @@ export declare function createCliRuntimeFactory(configuration: CliRuntimeConfigu
45
46
  extensionFactories?: InlineExtension[];
46
47
  startupSettingsManager?: SettingsManager;
47
48
  startupLoadingIndicator?: ReturnType<typeof createStartupLoadingIndicator>;
49
+ /**
50
+ * One model runtime for every session this factory creates. A shared host's
51
+ * sessions all live in one agent dir, so they would each build an identical
52
+ * runtime - ~100 ms of loop CPU per open that, concurrent, every open pays
53
+ * N times over (senpi#1844). Provider registration is keyed by id and
54
+ * merges, so replaying each session's extension providers into one runtime
55
+ * is idempotent.
56
+ */
57
+ modelRuntime?: ModelRuntime;
48
58
  }): CreateAgentSessionRuntimeFactory;
49
59
  export declare function main(args: string[], options?: MainOptions): Promise<void>;
50
60
  //# sourceMappingURL=main.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AACA;;;;;GAKG;AAOH,OAAO,EAAE,KAAK,IAAI,EAAgF,MAAM,eAAe,CAAC;AA+BxH,OAAO,EACN,6BAA6B,EAG7B,MAAM,oCAAoC,CAAC;AAG5C,OAAO,EAAE,KAAK,gCAAgC,EAA6B,MAAM,iCAAiC,CAAC;AACnH,OAAO,EACN,KAAK,6BAA6B,EAGlC,MAAM,kCAAkC,CAAC;AAM1C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAUlE,OAAO,EAAE,KAAK,OAAO,EAAyB,MAAM,yBAAyB,CAAC;AAQ9E,OAAO,EAAwB,cAAc,EAAE,MAAM,2BAA2B,CAAC;AACjF,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAwD7D,wBAAgB,+BAA+B,CAC9C,MAAM,EAAE,SAAS;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,GAChD,6BAA6B,EAAE,CAKjC;AAuCD;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CACvC,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,IAAI,EACZ,kBAAkB,EAAE,OAAO,EAC3B,kBAAkB,GAAE,SAAS,MAAM,EAAiE,EACpG,gBAAgB,CAAC,EAAE,OAAO,GACxB,OAAO,CAQT;AAsPD,wBAAsB,oBAAoB,CACzC,MAAM,EAAE,IAAI,EACZ,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,eAAe,EAAE,eAAe,EAChC,OAAO,EAAE,OAAO,GACd,OAAO,CAAC,cAAc,CAAC,CAqGzB;AA0HD,MAAM,WAAW,WAAW;IAC3B,kBAAkB,CAAC,EAAE,eAAe,EAAE,CAAC;CACvC;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,eAAe,EAAE,eAAe,GAAG,IAAI,CAYhF;AAED,MAAM,WAAW,uBAAuB;IACvC,MAAM,EAAE,IAAI,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;CACjB;AAED,kGAAkG;AAClG,wBAAgB,uBAAuB,CACtC,aAAa,EAAE,uBAAuB,EACtC,KAAK,GAAE;IACN,kBAAkB,CAAC,EAAE,eAAe,EAAE,CAAC;IACvC,sBAAsB,CAAC,EAAE,eAAe,CAAC;IACzC,uBAAuB,CAAC,EAAE,UAAU,CAAC,OAAO,6BAA6B,CAAC,CAAC;CACtE,GACJ,gCAAgC,CAqLlC;AAED,wBAAsB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,WAAW,iBAyc/D"}
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AACA;;;;;GAKG;AAOH,OAAO,EAAE,KAAK,IAAI,EAAgF,MAAM,eAAe,CAAC;AA+BxH,OAAO,EACN,6BAA6B,EAG7B,MAAM,oCAAoC,CAAC;AAG5C,OAAO,EAAE,KAAK,gCAAgC,EAA6B,MAAM,iCAAiC,CAAC;AACnH,OAAO,EACN,KAAK,6BAA6B,EAGlC,MAAM,kCAAkC,CAAC;AAM1C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAQlE,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,OAAO,EAAE,KAAK,OAAO,EAAyB,MAAM,yBAAyB,CAAC;AAQ9E,OAAO,EAAwB,cAAc,EAAE,MAAM,2BAA2B,CAAC;AACjF,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAwD7D,wBAAgB,+BAA+B,CAC9C,MAAM,EAAE,SAAS;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,GAChD,6BAA6B,EAAE,CAKjC;AAuCD;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CACvC,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,IAAI,EACZ,kBAAkB,EAAE,OAAO,EAC3B,kBAAkB,GAAE,SAAS,MAAM,EAAiE,EACpG,gBAAgB,CAAC,EAAE,OAAO,GACxB,OAAO,CAQT;AAsPD,wBAAsB,oBAAoB,CACzC,MAAM,EAAE,IAAI,EACZ,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,eAAe,EAAE,eAAe,EAChC,OAAO,EAAE,OAAO,GACd,OAAO,CAAC,cAAc,CAAC,CAqGzB;AA0HD,MAAM,WAAW,WAAW;IAC3B,kBAAkB,CAAC,EAAE,eAAe,EAAE,CAAC;CACvC;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,eAAe,EAAE,eAAe,GAAG,IAAI,CAYhF;AAED,MAAM,WAAW,uBAAuB;IACvC,MAAM,EAAE,IAAI,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;CACjB;AAED,kGAAkG;AAClG,wBAAgB,uBAAuB,CACtC,aAAa,EAAE,uBAAuB,EACtC,KAAK,GAAE;IACN,kBAAkB,CAAC,EAAE,eAAe,EAAE,CAAC;IACvC,sBAAsB,CAAC,EAAE,eAAe,CAAC;IACzC,uBAAuB,CAAC,EAAE,UAAU,CAAC,OAAO,6BAA6B,CAAC,CAAC;IAC3E;;;;;;;OAOG;IACH,YAAY,CAAC,EAAE,YAAY,CAAC;CACvB,GACJ,gCAAgC,CAsLlC;AAED,wBAAsB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,WAAW,iBA0d/D"}
package/dist/main.js CHANGED
@@ -5,7 +5,7 @@
5
5
  * This file handles CLI argument parsing and translates them into
6
6
  * createAgentSession() options. The SDK does the heavy lifting.
7
7
  */
8
- import { resolve } from "node:path";
8
+ import { join, resolve } from "node:path";
9
9
  import { createInterface } from "node:readline";
10
10
  import { modelsAreEqual } from "@earendil-works/pi-ai";
11
11
  import { setCapabilityOverrides } from "@earendil-works/pi-tui";
@@ -570,6 +570,7 @@ export function createCliRuntimeFactory(configuration, local = {}) {
570
570
  cwd,
571
571
  agentDir,
572
572
  settingsManager: runtimeSettingsManager,
573
+ ...(local.modelRuntime === undefined ? {} : { modelRuntime: local.modelRuntime }),
573
574
  modelRuntimeSignal: AbortSignal.timeout(15_000),
574
575
  extensionFlagValues: parsed.unknownFlags,
575
576
  resourceLoaderReloadOptions: shouldResolveProjectTrust
@@ -877,10 +878,24 @@ export async function main(args, options) {
877
878
  // is passed, so withholding it is what selects the uncapped in-process registry.
878
879
  const sessionRuntime = resolveSessionRuntime(parsed);
879
880
  const { runMultiSessionHost } = await import("./modes/rpc/multi-session-host.js");
881
+ // In-process sessions share the host's model runtime: one agent dir, one
882
+ // catalog. Worker sessions build their own inside the isolate - an object
883
+ // cannot cross that boundary - so the shared one is offered only here.
884
+ const hostModelRuntime = sessionRuntime === "worker"
885
+ ? undefined
886
+ : await ModelRuntime.create({
887
+ credentials: AuthStorage.create(join(agentDir, "auth.json")),
888
+ authPath: join(agentDir, "auth.json"),
889
+ agentDir,
890
+ modelsPath: join(agentDir, "models.json"),
891
+ signal: AbortSignal.timeout(15_000),
892
+ });
880
893
  printTimings();
881
894
  await runMultiSessionHost({
882
895
  agentDir,
883
- createRuntime: createCliRuntimeFactory(runtimeConfiguration),
896
+ createRuntime: createCliRuntimeFactory(runtimeConfiguration, {
897
+ ...(hostModelRuntime === undefined ? {} : { modelRuntime: hostModelRuntime }),
898
+ }),
884
899
  ...(sessionRuntime === "worker" ? { workerConfiguration: runtimeConfiguration } : {}),
885
900
  cwd,
886
901
  creationModel: parsed.provider && parsed.model ? { provider: parsed.provider, modelId: parsed.model } : undefined,
@@ -978,6 +993,7 @@ export async function main(args, options) {
978
993
  printHelp(extensionFlags);
979
994
  process.exit(0);
980
995
  }
996
+ time("extensionFlags");
981
997
  // Every full launch refreshes what `--help` reads, so the fast path stays warm without a help
982
998
  // run of its own.
983
999
  writeHelpFlagsCache({
@@ -985,6 +1001,7 @@ export async function main(args, options) {
985
1001
  flags: extensionFlags,
986
1002
  extensionPaths: loadedExtensions.map((extension) => extension.resolvedPath),
987
1003
  });
1004
+ time("helpFlagsCache");
988
1005
  // Read piped stdin content (if any) - skip for RPC mode which uses stdin for JSON-RPC
989
1006
  let stdinContent;
990
1007
  if (appMode !== "rpc") {