kiokuko-dsh 0.2.0 → 0.2.2

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 (294) hide show
  1. package/PERMISSIONS.md +21 -28
  2. package/README.ja.md +5 -2
  3. package/README.md +8 -2
  4. package/THIRD_PARTY_NOTICES.md +8 -0
  5. package/dist/client.cjs +2248 -1383
  6. package/dist/client.d.ts +3 -1
  7. package/dist/client.d.ts.map +1 -1
  8. package/dist/deep-thinker/configuration.d.ts.map +1 -1
  9. package/dist/deep-thinker/configuration.js +8 -5
  10. package/dist/deep-thinker/configuration.js.map +1 -1
  11. package/dist/deep-thinker/core/contracts.d.ts +107 -13
  12. package/dist/deep-thinker/core/contracts.d.ts.map +1 -1
  13. package/dist/deep-thinker/core/contracts.js +4 -2
  14. package/dist/deep-thinker/core/contracts.js.map +1 -1
  15. package/dist/deep-thinker/memory-finalizer.d.ts +10 -10
  16. package/dist/deep-thinker/memory-finalizer.js +2 -2
  17. package/dist/deep-thinker/memory-finalizer.js.map +1 -1
  18. package/dist/deep-thinker/report.d.ts +1 -1
  19. package/dist/deep-thinker/store.d.ts +10 -10
  20. package/dist/deep-thinker/store.d.ts.map +1 -1
  21. package/dist/deep-thinker/store.js +2 -2
  22. package/dist/deep-thinker/store.js.map +1 -1
  23. package/dist/dsh/agenticreplay-read-service.d.ts.map +1 -1
  24. package/dist/dsh/agenticreplay-read-service.js +2 -1
  25. package/dist/dsh/agenticreplay-read-service.js.map +1 -1
  26. package/dist/dsh/agenticreplay-security.d.ts +2 -0
  27. package/dist/dsh/agenticreplay-security.d.ts.map +1 -1
  28. package/dist/dsh/agenticreplay-security.js +67 -0
  29. package/dist/dsh/agenticreplay-security.js.map +1 -1
  30. package/dist/dsh/completion-verifiers.d.ts +26 -0
  31. package/dist/dsh/completion-verifiers.d.ts.map +1 -0
  32. package/dist/dsh/completion-verifiers.js +9 -0
  33. package/dist/dsh/completion-verifiers.js.map +1 -0
  34. package/dist/dsh/config.d.ts +5 -1
  35. package/dist/dsh/config.d.ts.map +1 -1
  36. package/dist/dsh/core/host.d.ts +1 -1
  37. package/dist/dsh/core/host.d.ts.map +1 -1
  38. package/dist/dsh/core/host.js +49 -4
  39. package/dist/dsh/core/host.js.map +1 -1
  40. package/dist/dsh/core/index.d.ts +4 -4
  41. package/dist/dsh/core/tasks.d.ts.map +1 -1
  42. package/dist/dsh/core/tasks.js +7 -0
  43. package/dist/dsh/core/tasks.js.map +1 -1
  44. package/dist/dsh/core-runtime.d.ts +1 -0
  45. package/dist/dsh/core-runtime.d.ts.map +1 -1
  46. package/dist/dsh/core-runtime.js +4 -1
  47. package/dist/dsh/core-runtime.js.map +1 -1
  48. package/dist/dsh/decisions/config.d.ts +2 -2
  49. package/dist/dsh/enno-delegation.js +2 -2
  50. package/dist/dsh/enno-delegation.js.map +1 -1
  51. package/dist/dsh/execution-command.d.ts +4 -0
  52. package/dist/dsh/execution-command.d.ts.map +1 -0
  53. package/dist/dsh/execution-command.js +52 -0
  54. package/dist/dsh/execution-command.js.map +1 -0
  55. package/dist/dsh/execution-journal.d.ts +17 -0
  56. package/dist/dsh/execution-journal.d.ts.map +1 -0
  57. package/dist/dsh/execution-journal.js +69 -0
  58. package/dist/dsh/execution-journal.js.map +1 -0
  59. package/dist/dsh/execution-result.d.ts +20 -0
  60. package/dist/dsh/execution-result.d.ts.map +1 -0
  61. package/dist/dsh/execution-result.js +7 -0
  62. package/dist/dsh/execution-result.js.map +1 -0
  63. package/dist/dsh/execution-selection.d.ts +149 -22
  64. package/dist/dsh/execution-selection.d.ts.map +1 -1
  65. package/dist/dsh/execution-selection.js +18 -6
  66. package/dist/dsh/execution-selection.js.map +1 -1
  67. package/dist/dsh/host-adapter/admission.d.ts.map +1 -1
  68. package/dist/dsh/host-adapter/admission.js +20 -0
  69. package/dist/dsh/host-adapter/admission.js.map +1 -1
  70. package/dist/dsh/host-adapter/turn-state.js +1 -1
  71. package/dist/dsh/host-adapter/turn-state.js.map +1 -1
  72. package/dist/dsh/host-adapter.d.ts.map +1 -1
  73. package/dist/dsh/host-adapter.js +26 -13
  74. package/dist/dsh/host-adapter.js.map +1 -1
  75. package/dist/dsh/index.d.ts +4 -2
  76. package/dist/dsh/index.d.ts.map +1 -1
  77. package/dist/dsh/index.js +7 -0
  78. package/dist/dsh/index.js.map +1 -1
  79. package/dist/dsh/intake-gate.d.ts +1 -0
  80. package/dist/dsh/intake-gate.d.ts.map +1 -1
  81. package/dist/dsh/intake-gate.js +9 -1
  82. package/dist/dsh/intake-gate.js.map +1 -1
  83. package/dist/dsh/lisp/approval.d.ts +2 -1
  84. package/dist/dsh/lisp/approval.d.ts.map +1 -1
  85. package/dist/dsh/lisp/approval.js +4 -3
  86. package/dist/dsh/lisp/approval.js.map +1 -1
  87. package/dist/dsh/lisp/candidate.d.ts +3 -3
  88. package/dist/dsh/lisp/code-intelligence-contracts.d.ts +78 -0
  89. package/dist/dsh/lisp/code-intelligence-contracts.d.ts.map +1 -0
  90. package/dist/dsh/lisp/code-intelligence-contracts.js +54 -0
  91. package/dist/dsh/lisp/code-intelligence-contracts.js.map +1 -0
  92. package/dist/dsh/lisp/code-intelligence-provider.d.ts +116 -0
  93. package/dist/dsh/lisp/code-intelligence.d.ts +13 -0
  94. package/dist/dsh/lisp/code-intelligence.d.ts.map +1 -0
  95. package/dist/dsh/lisp/code-intelligence.js +181 -0
  96. package/dist/dsh/lisp/code-intelligence.js.map +1 -0
  97. package/dist/dsh/lisp/coding-choice.d.ts +1 -0
  98. package/dist/dsh/lisp/coding-choice.d.ts.map +1 -1
  99. package/dist/dsh/lisp/coding-choice.js +17 -6
  100. package/dist/dsh/lisp/coding-choice.js.map +1 -1
  101. package/dist/dsh/lisp/compiled-cache.d.ts.map +1 -1
  102. package/dist/dsh/lisp/compiled-cache.js +3 -2
  103. package/dist/dsh/lisp/compiled-cache.js.map +1 -1
  104. package/dist/dsh/lisp/contracts.d.ts +4 -0
  105. package/dist/dsh/lisp/contracts.d.ts.map +1 -1
  106. package/dist/dsh/lisp/contracts.js +1 -0
  107. package/dist/dsh/lisp/contracts.js.map +1 -1
  108. package/dist/dsh/lisp/manager.d.ts +8 -1
  109. package/dist/dsh/lisp/manager.d.ts.map +1 -1
  110. package/dist/dsh/lisp/manager.js +78 -24
  111. package/dist/dsh/lisp/manager.js.map +1 -1
  112. package/dist/dsh/lisp/model-result.d.ts.map +1 -1
  113. package/dist/dsh/lisp/model-result.js +35 -1
  114. package/dist/dsh/lisp/model-result.js.map +1 -1
  115. package/dist/dsh/lisp/proposal-batch.d.ts +2 -0
  116. package/dist/dsh/lisp/proposal-batch.d.ts.map +1 -1
  117. package/dist/dsh/lisp/proposal-batch.js +32 -2
  118. package/dist/dsh/lisp/proposal-batch.js.map +1 -1
  119. package/dist/dsh/lisp/sandbox.d.ts +3 -0
  120. package/dist/dsh/lisp/sandbox.d.ts.map +1 -1
  121. package/dist/dsh/lisp/sandbox.js +13 -6
  122. package/dist/dsh/lisp/sandbox.js.map +1 -1
  123. package/dist/dsh/lisp/surface.d.ts +1 -1
  124. package/dist/dsh/lisp/surface.d.ts.map +1 -1
  125. package/dist/dsh/lisp/surface.js +74 -20
  126. package/dist/dsh/lisp/surface.js.map +1 -1
  127. package/dist/dsh/lisp/worker.d.ts +2 -0
  128. package/dist/dsh/lisp/worker.d.ts.map +1 -1
  129. package/dist/dsh/lisp/worker.js +7 -5
  130. package/dist/dsh/lisp/worker.js.map +1 -1
  131. package/dist/dsh/memory-application.d.ts +1 -1
  132. package/dist/dsh/memory-application.d.ts.map +1 -1
  133. package/dist/dsh/memory-application.js +4 -3
  134. package/dist/dsh/memory-application.js.map +1 -1
  135. package/dist/dsh/model-auto/candidates.d.ts.map +1 -1
  136. package/dist/dsh/model-auto/candidates.js +31 -22
  137. package/dist/dsh/model-auto/candidates.js.map +1 -1
  138. package/dist/dsh/model-configuration.d.ts +145 -2
  139. package/dist/dsh/model-configuration.d.ts.map +1 -1
  140. package/dist/dsh/model-configuration.js +10 -3
  141. package/dist/dsh/model-configuration.js.map +1 -1
  142. package/dist/dsh/model-selection-ui.d.ts.map +1 -1
  143. package/dist/dsh/model-selection-ui.js +7 -2
  144. package/dist/dsh/model-selection-ui.js.map +1 -1
  145. package/dist/dsh/models/config-store.d.ts +8 -0
  146. package/dist/dsh/models/config-store.d.ts.map +1 -0
  147. package/dist/dsh/models/config-store.js +49 -0
  148. package/dist/dsh/models/config-store.js.map +1 -0
  149. package/dist/dsh/models/contracts.d.ts +107 -0
  150. package/dist/dsh/models/contracts.d.ts.map +1 -0
  151. package/dist/dsh/models/contracts.js +104 -0
  152. package/dist/dsh/models/contracts.js.map +1 -0
  153. package/dist/dsh/models/metadata.d.ts +7 -0
  154. package/dist/dsh/models/metadata.d.ts.map +1 -0
  155. package/dist/dsh/models/metadata.js +13 -0
  156. package/dist/dsh/models/metadata.js.map +1 -0
  157. package/dist/dsh/models/profiles.d.ts +10 -0
  158. package/dist/dsh/models/profiles.d.ts.map +1 -0
  159. package/dist/dsh/models/profiles.js +176 -0
  160. package/dist/dsh/models/profiles.js.map +1 -0
  161. package/dist/dsh/models/service.d.ts +97 -0
  162. package/dist/dsh/models/service.d.ts.map +1 -0
  163. package/dist/dsh/models/service.js +518 -0
  164. package/dist/dsh/models/service.js.map +1 -0
  165. package/dist/dsh/models/surface.d.ts +8 -0
  166. package/dist/dsh/models/surface.d.ts.map +1 -0
  167. package/dist/dsh/models/surface.js +162 -0
  168. package/dist/dsh/models/surface.js.map +1 -0
  169. package/dist/dsh/models/vendor/THIRD_PARTY_NOTICES.txt +134 -0
  170. package/dist/dsh/models/vendor/abortable.d.ts +3 -0
  171. package/dist/dsh/models/vendor/abortable.d.ts.map +1 -0
  172. package/dist/dsh/models/vendor/abortable.js +10 -0
  173. package/dist/dsh/models/vendor/abortable.js.map +1 -0
  174. package/dist/dsh/models/vendor/auth-contract.d.ts +67 -0
  175. package/dist/dsh/models/vendor/auth-contract.d.ts.map +1 -0
  176. package/dist/dsh/models/vendor/auth-contract.js +2 -0
  177. package/dist/dsh/models/vendor/auth-contract.js.map +1 -0
  178. package/dist/dsh/models/vendor/credentials.d.ts +58 -0
  179. package/dist/dsh/models/vendor/credentials.d.ts.map +1 -0
  180. package/dist/dsh/models/vendor/credentials.js +205 -0
  181. package/dist/dsh/models/vendor/credentials.js.map +1 -0
  182. package/dist/dsh/models/vendor/nous-oauth.d.ts +6 -0
  183. package/dist/dsh/models/vendor/nous-oauth.d.ts.map +1 -0
  184. package/dist/dsh/models/vendor/nous-oauth.js +113 -0
  185. package/dist/dsh/models/vendor/nous-oauth.js.map +1 -0
  186. package/dist/dsh/models/vendor/opencode-adapter.d.ts +38 -0
  187. package/dist/dsh/models/vendor/opencode-adapter.d.ts.map +1 -0
  188. package/dist/dsh/models/vendor/opencode-adapter.js +207 -0
  189. package/dist/dsh/models/vendor/opencode-adapter.js.map +1 -0
  190. package/dist/dsh/models/vendor/opencode-catalog.d.ts +73 -0
  191. package/dist/dsh/models/vendor/opencode-catalog.d.ts.map +1 -0
  192. package/dist/dsh/models/vendor/opencode-catalog.js +253 -0
  193. package/dist/dsh/models/vendor/opencode-catalog.js.map +1 -0
  194. package/dist/dsh/models/vendor/opencode-codec.d.ts +7 -0
  195. package/dist/dsh/models/vendor/opencode-codec.d.ts.map +1 -0
  196. package/dist/dsh/models/vendor/opencode-codec.js +107 -0
  197. package/dist/dsh/models/vendor/opencode-codec.js.map +1 -0
  198. package/dist/dsh/models/vendor/opencode-owned.generated.d.ts +114 -0
  199. package/dist/dsh/models/vendor/opencode-owned.generated.d.ts.map +1 -0
  200. package/dist/dsh/models/vendor/opencode-owned.generated.js +2867 -0
  201. package/dist/dsh/models/vendor/opencode-owned.generated.js.map +1 -0
  202. package/dist/dsh/models/vendor/opencode-replay.d.ts +17 -0
  203. package/dist/dsh/models/vendor/opencode-replay.d.ts.map +1 -0
  204. package/dist/dsh/models/vendor/opencode-replay.js +147 -0
  205. package/dist/dsh/models/vendor/opencode-replay.js.map +1 -0
  206. package/dist/dsh/models/vendor/opencode-sdk.d.ts +6 -0
  207. package/dist/dsh/models/vendor/opencode-sdk.d.ts.map +1 -0
  208. package/dist/dsh/models/vendor/opencode-sdk.js +49915 -0
  209. package/dist/dsh/models/vendor/opencode-sdk.js.map +7 -0
  210. package/dist/dsh/models/vendor/opencode-transport.d.ts +6 -0
  211. package/dist/dsh/models/vendor/opencode-transport.d.ts.map +1 -0
  212. package/dist/dsh/models/vendor/opencode-transport.js +70 -0
  213. package/dist/dsh/models/vendor/opencode-transport.js.map +1 -0
  214. package/dist/dsh/models/vendor/pi-ai.d.ts +23 -0
  215. package/dist/dsh/models/vendor/pi-ai.d.ts.map +1 -0
  216. package/dist/dsh/models/vendor/pi-ai.js +27 -0
  217. package/dist/dsh/models/vendor/pi-ai.js.map +1 -0
  218. package/dist/dsh/modules/lisp.d.ts +1 -1
  219. package/dist/dsh/modules/lisp.d.ts.map +1 -1
  220. package/dist/dsh/modules/lisp.js +1 -1
  221. package/dist/dsh/modules/lisp.js.map +1 -1
  222. package/dist/dsh/native-model-catalog.d.ts.map +1 -1
  223. package/dist/dsh/native-model-catalog.js +4 -3
  224. package/dist/dsh/native-model-catalog.js.map +1 -1
  225. package/dist/dsh/node-tap-summary.d.ts +6 -1
  226. package/dist/dsh/node-tap-summary.d.ts.map +1 -1
  227. package/dist/dsh/node-tap-summary.js +27 -2
  228. package/dist/dsh/node-tap-summary.js.map +1 -1
  229. package/dist/dsh/on-demand-intake.d.ts +1 -1
  230. package/dist/dsh/on-demand-intake.d.ts.map +1 -1
  231. package/dist/dsh/on-demand-intake.js +24 -12
  232. package/dist/dsh/on-demand-intake.js.map +1 -1
  233. package/dist/dsh/owned-evidence.d.ts +49 -0
  234. package/dist/dsh/owned-evidence.d.ts.map +1 -0
  235. package/dist/dsh/owned-evidence.js +69 -0
  236. package/dist/dsh/owned-evidence.js.map +1 -0
  237. package/dist/dsh/owned-execution.d.ts +98 -0
  238. package/dist/dsh/owned-execution.d.ts.map +1 -0
  239. package/dist/dsh/owned-execution.js +523 -0
  240. package/dist/dsh/owned-execution.js.map +1 -0
  241. package/dist/dsh/plan-transition.d.ts +5 -0
  242. package/dist/dsh/plan-transition.d.ts.map +1 -0
  243. package/dist/dsh/plan-transition.js +34 -0
  244. package/dist/dsh/plan-transition.js.map +1 -0
  245. package/dist/dsh/session-memory-finalizer.d.ts.map +1 -1
  246. package/dist/dsh/session-memory-finalizer.js +46 -3
  247. package/dist/dsh/session-memory-finalizer.js.map +1 -1
  248. package/dist/dsh/setup.d.ts +1 -1
  249. package/dist/dsh/setup.d.ts.map +1 -1
  250. package/dist/dsh/setup.js +2 -0
  251. package/dist/dsh/setup.js.map +1 -1
  252. package/dist/dsh/skill-prompts.json +1 -1
  253. package/dist/dsh/task-completion.d.ts +1 -0
  254. package/dist/dsh/task-completion.d.ts.map +1 -1
  255. package/dist/dsh/task-completion.js +19 -19
  256. package/dist/dsh/task-completion.js.map +1 -1
  257. package/dist/enno-oduno/schemas.d.ts +9 -9
  258. package/dist/enno-oduno/store.d.ts.map +1 -1
  259. package/dist/enno-oduno/store.js +12 -0
  260. package/dist/enno-oduno/store.js.map +1 -1
  261. package/dist/locale/en.json +1 -1
  262. package/dist/locale/ja.json +1 -1
  263. package/dist/locale/ko.json +1 -1
  264. package/dist/locale/zh-CN.json +1 -1
  265. package/dist/memory/application.d.ts +2 -1
  266. package/dist/memory/application.d.ts.map +1 -1
  267. package/dist/memory/application.js +26 -12
  268. package/dist/memory/application.js.map +1 -1
  269. package/dist/memory/evidence.d.ts +2 -0
  270. package/dist/memory/evidence.d.ts.map +1 -1
  271. package/dist/memory/evidence.js +3 -1
  272. package/dist/memory/evidence.js.map +1 -1
  273. package/dist/model-tools/contracts.d.ts +4 -4
  274. package/dist/models-client.cjs +635 -0
  275. package/dist/models-client.d.ts +26 -0
  276. package/dist/models-client.d.ts.map +1 -0
  277. package/dist/models-client.js +642 -0
  278. package/dist/models-client.js.map +1 -0
  279. package/docs/agenticreplay-recording.md +14 -0
  280. package/docs/code-intelligence.md +149 -0
  281. package/docs/dsh-auth-LICENSE.txt +22 -0
  282. package/docs/dsh-auth-provenance.md +25 -0
  283. package/docs/dsh-plugin.md +21 -0
  284. package/docs/kiokuko-models.md +66 -0
  285. package/docs/lisp.md +107 -56
  286. package/docs/model-selection.ja.md +7 -9
  287. package/docs/model-selection.md +14 -12
  288. package/docs/owned-execution.md +99 -0
  289. package/lisp/supervisor.mjs +8 -2
  290. package/lisp/tools.lisp +31 -3
  291. package/migrations/035_owned_execution.sql +19 -0
  292. package/package.json +46 -11
  293. package/skills/kiokuko-lisp/SKILL.md +49 -67
  294. package/skills/kiokuko-soul/SKILL.md +7 -26
@@ -0,0 +1,205 @@
1
+ /**
2
+ * Auth-owned credential persistence, structurally compatible with pi stores, over
3
+ * one JSON document, one credential per provider id.
4
+ *
5
+ * Writes are atomic (temp file + rename) with 0700 directory / 0600 file
6
+ * permissions best-effort on every platform. All mutations go through
7
+ * {@link CredentialFile.modify}, which serializes read-modify-write cycles
8
+ * across processes — pi-ai runs its OAuth refresh *inside* `modify`, so the
9
+ * exclusion keeps concurrent requests from double-refreshing a rotated
10
+ * token. The file is the single source of truth;
11
+ * nothing here ever logs token material, and {@link CredentialFile.describe}
12
+ * reports only non-secret metadata for status surfaces.
13
+ *
14
+ * @module dsh-auth/credentials
15
+ */
16
+ import { mkdirSync, readFileSync, renameSync, rmdirSync, writeFileSync } from 'node:fs';
17
+ import { dirname, join } from 'node:path';
18
+ import { homedir } from 'node:os';
19
+ /** Narrow an unknown parsed value into a stored credential, or reject it. */
20
+ export function asStoredCredential(value) {
21
+ if (typeof value !== 'object' || value === null)
22
+ return undefined;
23
+ const record = value;
24
+ if (record['type'] === 'api_key') {
25
+ return typeof record['key'] === 'string' && record['key'].length > 0
26
+ ? value
27
+ : undefined;
28
+ }
29
+ if (record['type'] !== 'oauth')
30
+ return undefined;
31
+ if (typeof record['access'] !== 'string' || typeof record['refresh'] !== 'string')
32
+ return undefined;
33
+ if (typeof record['expires'] !== 'number' || !Number.isFinite(record['expires']))
34
+ return undefined;
35
+ return value;
36
+ }
37
+ /** Default credential file location: `$DSH_HOME/dsh-auth/credentials.json` (or `~/.dsh/…`). */
38
+ export function defaultCredentialsFile() {
39
+ const override = process.env['DSH_AUTH_CREDENTIALS'];
40
+ if (override !== undefined && override !== '')
41
+ return override;
42
+ const root = process.env['DSH_HOME'] ?? join(homedir(), '.dsh');
43
+ return join(root, 'dsh-auth', 'credentials.json');
44
+ }
45
+ const EMPTY_DOCUMENT = { version: 1, providers: {} };
46
+ /**
47
+ * The credential file. IO failures throw (loud, naming the path) rather than
48
+ * degrading to an empty store: silently treating a corrupt or unreadable
49
+ * credential file as "signed out everywhere" would strand every route behind
50
+ * a fresh login for no reason.
51
+ */
52
+ export class CredentialFile {
53
+ path;
54
+ /** Serialize all updates in this process; the file lock covers other processes. */
55
+ chainTail = Promise.resolve();
56
+ constructor(path) {
57
+ this.path = path;
58
+ }
59
+ /** The stored credential for one provider, possibly expired. */
60
+ async read(providerId) {
61
+ return (await this.load()).providers[providerId];
62
+ }
63
+ /** Stored credential metadata without resolving or exposing secrets. */
64
+ async list() {
65
+ const document = await this.load();
66
+ return Object.entries(document.providers).map(([providerId, credential]) => ({
67
+ providerId,
68
+ type: credential.type,
69
+ }));
70
+ }
71
+ /**
72
+ * Serialized read-modify-write for one provider. `fn` sees the current
73
+ * credential; returning a new credential persists it, returning
74
+ * `undefined` leaves the entry unchanged. Resolves with the post-write
75
+ * credential. Rejections from `fn` propagate without touching the file.
76
+ */
77
+ async modify(providerId, fn) {
78
+ return this.withLock(async () => {
79
+ const document = await this.load();
80
+ const current = document.providers[providerId];
81
+ const replacement = await fn(current);
82
+ if (replacement === undefined || replacement === current)
83
+ return current;
84
+ if (asStoredCredential(replacement) === undefined) {
85
+ throw new Error(`dsh-auth: refusing to store an invalid credential for "${providerId}"`);
86
+ }
87
+ await this.save({ ...document, providers: { ...document.providers, [providerId]: replacement } });
88
+ return replacement;
89
+ });
90
+ }
91
+ /** Remove one provider's credential (logout). */
92
+ async delete(providerId) {
93
+ await this.withLock(async () => {
94
+ const document = await this.load();
95
+ if (!(providerId in document.providers))
96
+ return;
97
+ const providers = { ...document.providers };
98
+ delete providers[providerId];
99
+ await this.save({ ...document, providers });
100
+ });
101
+ }
102
+ /** Non-secret metadata for every stored credential, for status surfaces. */
103
+ async describe() {
104
+ const document = await this.load();
105
+ const now = Date.now();
106
+ return Object.entries(document.providers).map(([provider, credential]) => {
107
+ const expiresAt = credential.type === 'oauth' && provider !== 'openrouter'
108
+ && credential.expires < 8_640_000_000_000_000
109
+ ? credential.expires
110
+ : undefined;
111
+ return {
112
+ provider,
113
+ credentialKind: credential.type === 'api_key' || provider === 'openrouter' ? 'api-key' : 'oauth-token',
114
+ expiresAt,
115
+ expired: expiresAt !== undefined && expiresAt <= now,
116
+ };
117
+ });
118
+ }
119
+ /** Hold a process-wide lock through reread, refresh/mutation, and atomic save. */
120
+ async withLock(operation) {
121
+ const previous = this.chainTail;
122
+ let releaseLocal;
123
+ this.chainTail = new Promise(resolve => { releaseLocal = resolve; });
124
+ await previous;
125
+ const lockPath = `${this.path}.lock`;
126
+ const deadline = Date.now() + 120_000;
127
+ try {
128
+ mkdirSync(dirname(this.path), { recursive: true, mode: 0o700 });
129
+ while (true) {
130
+ try {
131
+ mkdirSync(lockPath, { mode: 0o700 });
132
+ break;
133
+ }
134
+ catch (error) {
135
+ if (error?.code !== 'EEXIST')
136
+ throw error;
137
+ if (Date.now() >= deadline) {
138
+ throw new Error(`dsh-auth: timed out waiting for credential file lock ${lockPath}`);
139
+ }
140
+ await new Promise(resolve => setTimeout(resolve, 100));
141
+ }
142
+ }
143
+ try {
144
+ return await operation();
145
+ }
146
+ finally {
147
+ rmdirSync(lockPath);
148
+ }
149
+ }
150
+ finally {
151
+ releaseLocal();
152
+ }
153
+ }
154
+ async load() {
155
+ let text;
156
+ try {
157
+ text = readFileSync(this.path, 'utf8');
158
+ }
159
+ catch (error) {
160
+ if (error?.code === 'ENOENT') {
161
+ return EMPTY_DOCUMENT;
162
+ }
163
+ throw new Error(`dsh-auth: cannot read credential file ${this.path}: ${String(error)}`);
164
+ }
165
+ let parsed;
166
+ try {
167
+ parsed = JSON.parse(text);
168
+ }
169
+ catch (error) {
170
+ throw new Error(`dsh-auth: credential file ${this.path} is not valid JSON ; `
171
+ + 'fix or remove the file by hand — it will not be overwritten silently');
172
+ }
173
+ if (typeof parsed !== 'object' || parsed === null) {
174
+ throw new Error(`dsh-auth: credential file ${this.path} has an unexpected shape; fix or remove it by hand`);
175
+ }
176
+ const record = parsed;
177
+ if (record['version'] !== 1 || typeof record['providers'] !== 'object'
178
+ || record['providers'] === null || Array.isArray(record['providers'])) {
179
+ throw new Error(`dsh-auth: credential file ${this.path} has an unexpected shape; fix or remove it by hand`);
180
+ }
181
+ const providers = Object.create(null);
182
+ for (const [provider, value] of Object.entries(record['providers'])) {
183
+ const credential = asStoredCredential(value);
184
+ if (credential === undefined) {
185
+ throw new Error(`dsh-auth: credential file ${this.path} holds an invalid entry for "${provider}"; fix or remove it by hand`);
186
+ }
187
+ providers[provider] = credential;
188
+ }
189
+ return { version: 1, providers };
190
+ }
191
+ async save(document) {
192
+ const text = JSON.stringify(document, null, 2) + '\n';
193
+ const directory = dirname(this.path);
194
+ mkdirSync(directory, { recursive: true, mode: 0o700 });
195
+ const temporary = join(directory, `.${Math.random().toString(36).slice(2)}.tmp`);
196
+ try {
197
+ writeFileSync(temporary, text, { mode: 0o600 });
198
+ renameSync(temporary, this.path);
199
+ }
200
+ catch (error) {
201
+ throw new Error(`dsh-auth: cannot write credential file ${this.path}: ${String(error)}`);
202
+ }
203
+ }
204
+ }
205
+ //# sourceMappingURL=credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../../../src/dsh/models/vendor/credentials.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { StoredOAuthCredential } from './credentials.js';
2
+ import type { AuthInteraction } from './auth-contract.js';
3
+ export declare function loginNous(bridge: AuthInteraction, clientId: string): Promise<StoredOAuthCredential>;
4
+ /** Called only while CredentialFile.modify holds the cross-process lock. */
5
+ export declare function refreshNous(current: StoredOAuthCredential, clientId: string): Promise<StoredOAuthCredential>;
6
+ //# sourceMappingURL=nous-oauth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nous-oauth.d.ts","sourceRoot":"","sources":["../../../../src/dsh/models/vendor/nous-oauth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAA;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAoDzD,wBAAsB,SAAS,CAAC,MAAM,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC,CA6BzG;AAED,4EAA4E;AAC5E,wBAAsB,WAAW,CAAC,OAAO,EAAE,qBAAqB,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAYlH"}
@@ -0,0 +1,113 @@
1
+ const PORTAL = 'https://portal.nousresearch.com';
2
+ const DEVICE_GRANT = 'urn:ietf:params:oauth:grant-type:device_code';
3
+ function object(value) {
4
+ return typeof value === 'object' && value !== null && !Array.isArray(value)
5
+ ? value : undefined;
6
+ }
7
+ async function post(path, fields, signal, headers = {}) {
8
+ let response;
9
+ try {
10
+ response = await fetch(`${PORTAL}${path}`, {
11
+ method: 'POST',
12
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded', ...headers },
13
+ body: new URLSearchParams(fields),
14
+ signal,
15
+ });
16
+ }
17
+ catch (error) {
18
+ if (signal.aborted) {
19
+ if (signal.reason?.name === 'TimeoutError') {
20
+ throw new Error('dsh-auth: Nous Portal request timed out');
21
+ }
22
+ throw new Error('dsh-auth: Nous sign-in cancelled');
23
+ }
24
+ throw new Error(`dsh-auth: Nous Portal request failed: ${error instanceof Error ? error.name : 'network error'}`);
25
+ }
26
+ let parsed;
27
+ try {
28
+ parsed = await response.json();
29
+ }
30
+ catch {
31
+ parsed = undefined;
32
+ }
33
+ return { response, data: object(parsed) ?? {} };
34
+ }
35
+ function credential(data) {
36
+ if (typeof data.access_token !== 'string' || data.access_token.length === 0
37
+ || typeof data.refresh_token !== 'string' || data.refresh_token.length === 0) {
38
+ throw new Error('dsh-auth: Nous Portal returned an incomplete token response');
39
+ }
40
+ const ttl = Number(data.expires_in);
41
+ if (!Number.isFinite(ttl) || ttl <= 0)
42
+ throw new Error('dsh-auth: Nous Portal returned an invalid token lifetime');
43
+ return { type: 'oauth', access: data.access_token, refresh: data.refresh_token, expires: Date.now() + ttl * 1000 };
44
+ }
45
+ function delay(ms, signal) {
46
+ return new Promise((resolve, reject) => {
47
+ if (signal.aborted) {
48
+ reject(new Error('dsh-auth: Nous sign-in cancelled'));
49
+ return;
50
+ }
51
+ const timer = setTimeout(() => { signal.removeEventListener('abort', cancel); resolve(); }, ms);
52
+ const cancel = () => { clearTimeout(timer); reject(new Error('dsh-auth: Nous sign-in cancelled')); };
53
+ signal.addEventListener('abort', cancel, { once: true });
54
+ });
55
+ }
56
+ export async function loginNous(bridge, clientId) {
57
+ const requestSignal = () => AbortSignal.any([bridge.signal, AbortSignal.timeout(15_000)]);
58
+ const initial = await post('/api/oauth/device/code', { client_id: clientId, scope: 'inference:invoke' }, requestSignal());
59
+ if (!initial.response.ok)
60
+ throw new Error(`dsh-auth: Nous device authorization failed (HTTP ${initial.response.status})`);
61
+ const { data } = initial;
62
+ if (typeof data.device_code !== 'string' || typeof data.user_code !== 'string'
63
+ || typeof data.verification_uri !== 'string' || typeof data.verification_uri_complete !== 'string') {
64
+ throw new Error('dsh-auth: Nous Portal returned an invalid device authorization response');
65
+ }
66
+ const expiresIn = Number(data.expires_in);
67
+ if (!Number.isFinite(expiresIn) || expiresIn <= 0)
68
+ throw new Error('dsh-auth: Nous Portal returned an invalid device-code lifetime');
69
+ let interval = Number(data.interval);
70
+ interval = Number.isFinite(interval) && interval > 0 ? Math.min(interval, 30) : 5;
71
+ const deadline = Date.now() + expiresIn * 1000;
72
+ bridge.notify({ type: 'device_code', userCode: data.user_code, verificationUri: data.verification_uri_complete });
73
+ while (Date.now() < deadline) {
74
+ if (bridge.signal.aborted)
75
+ throw new Error('dsh-auth: Nous sign-in cancelled');
76
+ const next = await post('/api/oauth/token', {
77
+ grant_type: DEVICE_GRANT, client_id: clientId, device_code: data.device_code,
78
+ }, requestSignal());
79
+ if (next.response.ok)
80
+ return credential(next.data);
81
+ const code = next.data.error;
82
+ if (code === 'authorization_pending') {
83
+ await delay(interval * 1000, bridge.signal);
84
+ continue;
85
+ }
86
+ if (code === 'slow_down') {
87
+ interval = Math.min(interval + 1, 30);
88
+ await delay(interval * 1000, bridge.signal);
89
+ continue;
90
+ }
91
+ if (code === 'access_denied')
92
+ throw new Error('dsh-auth: Nous device authorization was denied');
93
+ if (code === 'expired_token')
94
+ throw new Error('dsh-auth: Nous device authorization expired; sign in again');
95
+ throw new Error(`dsh-auth: Nous device authorization failed (HTTP ${next.response.status})`);
96
+ }
97
+ throw new Error('dsh-auth: Nous device authorization expired; sign in again');
98
+ }
99
+ /** Called only while CredentialFile.modify holds the cross-process lock. */
100
+ export async function refreshNous(current, clientId) {
101
+ const result = await post('/api/oauth/token', { grant_type: 'refresh_token', client_id: clientId }, AbortSignal.timeout(15_000), {
102
+ 'x-nous-refresh-token': current.refresh,
103
+ });
104
+ if (!result.response.ok) {
105
+ const code = result.data.error;
106
+ if (code === 'invalid_grant' || code === 'refresh_token_reused' || result.response.status === 401) {
107
+ throw new Error('dsh-auth: Nous token expired or was revoked; run /auth login nous');
108
+ }
109
+ throw new Error(`dsh-auth: Nous token refresh failed (HTTP ${result.response.status})`);
110
+ }
111
+ return credential(result.data);
112
+ }
113
+ //# sourceMappingURL=nous-oauth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nous-oauth.js","sourceRoot":"","sources":["../../../../src/dsh/models/vendor/nous-oauth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /** Native DSH adapter for Zen/Go; catalog and wire dispatch never consult pi. */
2
+ import { LlmAdapter, type GenerateOptions, type StreamChunk, type PreparedAdapterCall, type LlmResolvedModelInfo } from '@deepseek-ai/dsh-llm';
3
+ import type { AttachmentStore } from '@deepseek-ai/dsh-attachment';
4
+ import { type OpenCodeCatalog, type OpenCodeRoute } from './opencode-catalog.js';
5
+ import type { CredentialFile } from './credentials.js';
6
+ interface Options {
7
+ catalogs: ReadonlyMap<OpenCodeRoute, OpenCodeCatalog>;
8
+ store: CredentialFile;
9
+ attachments?: () => AttachmentStore | undefined;
10
+ fetcher?: typeof fetch;
11
+ overrides?: Record<string, Record<string, {
12
+ contextWindow?: number;
13
+ maxTokens?: number;
14
+ }>>;
15
+ warn?: (reason: string) => void;
16
+ }
17
+ export declare class OpenCodeAdapter extends LlmAdapter {
18
+ private readonly options;
19
+ constructor(options: Options);
20
+ providerInfo(provider: string): {
21
+ id: string;
22
+ name: string;
23
+ };
24
+ private descriptor;
25
+ listModels(provider: string): Promise<{
26
+ provider: string;
27
+ id: string;
28
+ name: string;
29
+ inputModalities: ("text" | "image")[];
30
+ }[]>;
31
+ private resolved;
32
+ resolveModel(provider: string, model: string, signal?: AbortSignal): Promise<LlmResolvedModelInfo>;
33
+ prepareCall(provider: string, model: string, signal?: AbortSignal): Promise<PreparedAdapterCall>;
34
+ stream(options: GenerateOptions): AsyncIterable<StreamChunk>;
35
+ private dispatch;
36
+ }
37
+ export {};
38
+ //# sourceMappingURL=opencode-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode-adapter.d.ts","sourceRoot":"","sources":["../../../../src/dsh/models/vendor/opencode-adapter.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,OAAO,EAAE,UAAU,EAAgC,KAAK,eAAe,EAAE,KAAK,WAAW,EAAqB,KAAK,mBAAmB,EAAE,KAAK,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAC/L,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAA;AAIlE,OAAO,EAAE,KAAK,eAAe,EAAsB,KAAK,aAAa,EAAE,MAAM,uBAAuB,CAAA;AACpG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAKtD,UAAU,OAAO;IACf,QAAQ,EAAE,WAAW,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC;IAAC,KAAK,EAAE,cAAc,CAAA;IAC5E,WAAW,CAAC,EAAE,MAAM,eAAe,GAAG,SAAS,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,KAAK,CAAA;IACvE,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,aAAa,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAA;IAC1F,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;CAChC;AACD,qBAAa,eAAgB,SAAQ,UAAU;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,OAAO;IAQpC,YAAY,CAAC,QAAQ,EAAE,MAAM;;;;IACtC,OAAO,CAAC,UAAU;IAOH,UAAU,CAAC,QAAQ,EAAE,MAAM;;;;;;IAI1C,OAAO,CAAC,QAAQ;IAID,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW;IAClE,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAOtG,MAAM,CAAC,OAAO,EAAE,eAAe;YACzB,QAAQ;CAuFxB"}
@@ -0,0 +1,207 @@
1
+ /** Native DSH adapter for Zen/Go; catalog and wire dispatch never consult pi. */
2
+ import { LlmAdapter, LlmError, attributionHeaders } from '@deepseek-ai/dsh-llm';
3
+ import { encodePrompt } from './opencode-codec.js';
4
+ import { createTransport } from './opencode-transport.js';
5
+ import { abortable } from './abortable.js';
6
+ import { randomUUID } from 'node:crypto';
7
+ import { record, mergeMetadata } from './opencode-replay.js';
8
+ export class OpenCodeAdapter extends LlmAdapter {
9
+ options;
10
+ constructor(options) {
11
+ super();
12
+ this.options = options;
13
+ for (const [provider, models] of Object.entries(options.overrides ?? {}))
14
+ for (const [id, override] of Object.entries(models)) {
15
+ if (!options.catalogs.has(provider))
16
+ continue;
17
+ this.descriptor(provider, id);
18
+ for (const value of Object.values(override))
19
+ if (value !== undefined && (!Number.isSafeInteger(value) || value <= 0))
20
+ throw new Error(`Invalid model override for ${provider}/${id}`);
21
+ }
22
+ }
23
+ providerInfo(provider) { return { id: provider, name: provider === 'opencode' ? 'OpenCode Zen' : 'OpenCode Go' }; }
24
+ descriptor(provider, id) {
25
+ const catalog = this.options.catalogs.get(provider);
26
+ const found = catalog?.models().find(model => model.id === id);
27
+ if (!found)
28
+ throw new LlmError(`OpenCode model ${provider}/${id} unavailable: ${catalog?.status().excluded.find(model => model.id === id)?.reason ?? 'not on the verified roster'}`, 'MODEL_NOT_FOUND');
29
+ const override = this.options.overrides?.[provider]?.[id];
30
+ return { ...found, ...override };
31
+ }
32
+ async listModels(provider) {
33
+ if (!(await this.options.store.read(provider)))
34
+ return [];
35
+ return (this.options.catalogs.get(provider)?.models() ?? []).map(model => ({ provider, id: model.id, name: model.name, inputModalities: model.inputModalities }));
36
+ }
37
+ resolved(provider, descriptor) {
38
+ return { provider, id: descriptor.id, name: descriptor.name, inputModalities: descriptor.inputModalities, context: { contextWindow: descriptor.contextWindow }, defaultMaxTokens: descriptor.maxTokens,
39
+ ...(descriptor.efforts.length ? { reasoning: { efforts: descriptor.efforts.map(id => ({ id: id, name: id })) } } : {}) };
40
+ }
41
+ async resolveModel(provider, model, signal) { signal?.throwIfAborted(); return this.resolved(provider, this.descriptor(provider, model)); }
42
+ async prepareCall(provider, model, signal) {
43
+ signal?.throwIfAborted();
44
+ const descriptor = this.descriptor(provider, model);
45
+ return { model: this.resolved(provider, descriptor), stream: options => {
46
+ if (options.provider !== provider || options.model !== model)
47
+ throw new LlmError('Prepared OpenCode call identity mismatch', 'INVALID_PREPARED_CALL');
48
+ return this.dispatch(options, descriptor);
49
+ } };
50
+ }
51
+ stream(options) { return this.dispatch(options, this.descriptor(options.provider, options.model)); }
52
+ async *dispatch(options, descriptor) {
53
+ options.signal?.throwIfAborted();
54
+ if (options.tools?.length && !descriptor.toolCall)
55
+ throw new LlmError('This OpenCode model does not support tool calls', 'UNSUPPORTED_CAPABILITY');
56
+ if (options.reasoningEffort && !descriptor.efforts.includes(options.reasoningEffort))
57
+ throw new LlmError('Unsupported reasoning effort for this model', 'UNSUPPORTED_CAPABILITY');
58
+ const prompt = await encodePrompt(options, descriptor, this.options.attachments, this.options.warn);
59
+ const credential = await this.options.store.read(options.provider);
60
+ if (credential?.type !== 'api_key' || !credential.key?.trim())
61
+ throw new LlmError(`Run /auth login ${options.provider}`, 'AUTH');
62
+ const headers = { ...attributionHeaders(), 'x-opencode-session': options.sessionId ?? randomUUID() };
63
+ const model = createTransport(descriptor, options, credential.key, headers, prompt, this.options.fetcher);
64
+ const abort = new AbortController();
65
+ const signal = AbortSignal.any([abort.signal, ...(options.signal ? [options.signal] : [])]);
66
+ let timer = setTimeout(() => abort.abort(new Error('OpenCode stream idle timeout')), 300_000);
67
+ timer.unref();
68
+ let reader;
69
+ try {
70
+ const result = await abortable(model.doStream({ prompt, abortSignal: signal, maxOutputTokens: options.maxTokens ?? descriptor.maxTokens,
71
+ ...(descriptor.temperature && options.temperature !== undefined ? { temperature: options.temperature } : {}), ...(options.stop ? { stopSequences: options.stop } : {}),
72
+ ...(options.tools ? { tools: options.tools.map(tool => ({ type: 'function', name: tool.name, description: tool.description, inputSchema: tool.parameters })) } : {}),
73
+ ...(descriptor.protocol === 'responses' ? { providerOptions: { openai: { store: false } } } : {}) }), signal);
74
+ reader = result.stream.getReader();
75
+ const blocks = new Map();
76
+ let responseId;
77
+ while (true) {
78
+ const item = await abortable(reader.read(), signal);
79
+ if (item.done)
80
+ throw new LlmError('OpenCode stream ended without a finish event', 'PROTOCOL_ERROR');
81
+ clearTimeout(timer);
82
+ timer = setTimeout(() => abort.abort(new Error('OpenCode stream idle timeout')), 300_000);
83
+ timer.unref();
84
+ const part = item.value;
85
+ if (part.type === 'error')
86
+ throw part.error;
87
+ if (part.type === 'response-metadata') {
88
+ responseId = part.id;
89
+ continue;
90
+ }
91
+ if (part.type === 'text-start' || part.type === 'reasoning-start' || part.type === 'tool-input-start') {
92
+ const block = part.type === 'tool-input-start' ? { type: 'tool-call', id: part.id, name: part.toolName, arguments: '' } : { type: part.type === 'text-start' ? 'text' : 'reasoning', text: '' };
93
+ const entry = { index: blocks.size, block, ended: false, providerOptions: part.providerMetadata };
94
+ blocks.set(part.id, entry);
95
+ yield { type: 'block-start', index: entry.index, blockType: block.type };
96
+ continue;
97
+ }
98
+ if (part.type === 'text-delta' || part.type === 'reasoning-delta' || part.type === 'tool-input-delta') {
99
+ const entry = blocks.get(part.id);
100
+ if (!entry || entry.ended || entry.inputEnded)
101
+ throw new LlmError('Unmatched stream delta', 'PROTOCOL_ERROR');
102
+ if (entry.block.type === 'tool-call') {
103
+ entry.block.arguments += part.delta;
104
+ yield { type: 'tool-call-delta', index: entry.index, id: entry.block.id, argumentsDelta: part.delta };
105
+ }
106
+ else if (entry.block.type === 'text' || entry.block.type === 'reasoning') {
107
+ entry.block.text += part.delta;
108
+ yield { type: entry.block.type === 'text' ? 'text-delta' : 'reasoning-delta', index: entry.index, text: part.delta };
109
+ }
110
+ if (part.providerMetadata)
111
+ entry.providerOptions = mergeMetadata(entry.providerOptions, part.providerMetadata);
112
+ continue;
113
+ }
114
+ if (part.type === 'text-end' || part.type === 'reasoning-end' || part.type === 'tool-input-end') {
115
+ const entry = blocks.get(part.id);
116
+ if (!entry || entry.ended)
117
+ throw new LlmError('Unmatched stream end', 'PROTOCOL_ERROR');
118
+ if (part.providerMetadata)
119
+ entry.providerOptions = mergeMetadata(entry.providerOptions, part.providerMetadata);
120
+ if (entry.block.type === 'tool-call') {
121
+ entry.inputEnded = true;
122
+ continue;
123
+ }
124
+ entry.ended = true;
125
+ yield { type: 'block-end', index: entry.index, block: entry.block };
126
+ continue;
127
+ }
128
+ if (part.type === 'tool-call') {
129
+ if (part.providerExecuted)
130
+ throw new LlmError('Unexpected provider-executed tool', 'PROTOCOL_ERROR');
131
+ if (!blocks.has(part.toolCallId)) {
132
+ const block = { type: 'tool-call', id: part.toolCallId, name: part.toolName, arguments: part.input };
133
+ const index = blocks.size;
134
+ blocks.set(part.toolCallId, { index, block, ended: true, providerOptions: part.providerMetadata });
135
+ yield { type: 'block-start', index, blockType: 'tool-call' };
136
+ yield { type: 'block-end', index, block };
137
+ }
138
+ else {
139
+ const entry = blocks.get(part.toolCallId);
140
+ if (entry.block.type !== 'tool-call' || entry.ended || entry.block.name !== part.toolName)
141
+ throw new LlmError('Mismatched final tool call', 'PROTOCOL_ERROR');
142
+ // Some providers send the complete arguments only in the final
143
+ // tool event. Preserve streamed raw JSON when it was supplied.
144
+ if (!entry.block.arguments)
145
+ entry.block.arguments = part.input;
146
+ if (part.providerMetadata)
147
+ entry.providerOptions = mergeMetadata(entry.providerOptions, part.providerMetadata);
148
+ entry.ended = true;
149
+ yield { type: 'block-end', index: entry.index, block: entry.block };
150
+ }
151
+ continue;
152
+ }
153
+ if (part.type === 'finish') {
154
+ for (const entry of blocks.values())
155
+ if (!entry.ended) {
156
+ entry.ended = true;
157
+ yield { type: 'block-end', index: entry.index, block: entry.block };
158
+ }
159
+ const input = part.usage.inputTokens;
160
+ const output = part.usage.outputTokens;
161
+ // DSH snapshots chunks losslessly: optional SDK values must be absent,
162
+ // not own properties containing undefined. Preserve reported zeroes.
163
+ yield { type: 'usage', usage: {
164
+ inputTokens: input.noCache ?? Math.max(0, (input.total ?? 0) - (input.cacheRead ?? 0) - (input.cacheWrite ?? 0)),
165
+ outputTokens: output.total ?? 0,
166
+ ...(input.cacheRead !== undefined ? { cacheReadTokens: input.cacheRead } : {}),
167
+ ...(input.cacheWrite !== undefined ? { cacheWriteTokens: input.cacheWrite } : {}),
168
+ ...(output.reasoning !== undefined ? { reasoningTokens: output.reasoning } : {}),
169
+ ...(input.total !== undefined && output.total !== undefined ? { totalTokens: input.total + output.total } : {}),
170
+ } };
171
+ if (!blocks.size)
172
+ throw new LlmError('OpenCode returned no content', 'EMPTY_RESPONSE');
173
+ const finish = part.finishReason.unified;
174
+ if (finish === 'error' || finish === 'content-filter' || finish === 'other')
175
+ throw new LlmError(`OpenCode generation ended: ${finish}`, 'PROVIDER_ERROR');
176
+ yield { type: 'finish', reason: { kind: finish === 'tool-calls' ? 'tool-calls' : finish === 'length' ? 'max-tokens' : 'stop' }, replayState: { response: { kind: 'dsh-opencode', version: 1, protocol: descriptor.protocol, provider: options.provider, model: descriptor.id, ...(responseId !== undefined ? { responseId } : {}) }, blocks: [...blocks.values()].map(entry => ({ type: entry.block.type, ...(entry.providerOptions ? { providerOptions: entry.providerOptions } : {}) })) } };
177
+ return;
178
+ }
179
+ }
180
+ }
181
+ catch (error) {
182
+ if (options.signal?.aborted)
183
+ throw options.signal.reason;
184
+ if (signal.aborted)
185
+ throw new LlmError('OpenCode stream idle timeout', 'TIMEOUT');
186
+ if (error instanceof LlmError)
187
+ throw error;
188
+ const raw = record(error);
189
+ const status = typeof raw?.statusCode === 'number' ? raw.statusCode : undefined;
190
+ const responseHeaders = record(raw?.responseHeaders);
191
+ const retryHeader = responseHeaders?.['retry-after'];
192
+ const seconds = Number(retryHeader);
193
+ const retry = typeof retryHeader === 'string' ? Number.isFinite(seconds) ? seconds * 1000 : Date.parse(retryHeader) - Date.now() : undefined;
194
+ const requestId = responseHeaders?.['x-request-id'] ?? responseHeaders?.['request-id'];
195
+ throw new LlmError(`OpenCode request failed${status ? `: HTTP ${status}` : ''}`, status === 401 || status === 403 ? 'AUTH' : status === 429 ? 'RATE_LIMIT' : status && status >= 500 ? 'SERVER' : status ? 'PROVIDER_ERROR' : 'TRANSPORT', { ...(status !== undefined ? { status } : {}), ...(retry !== undefined && retry > 0 ? { providerRetryAfterMs: retry } : {}), ...(typeof requestId === 'string' && requestId.trim() ? { requestId: requestId } : {}) });
196
+ }
197
+ finally {
198
+ clearTimeout(timer);
199
+ abort.abort();
200
+ if (reader) {
201
+ void reader.cancel().catch(() => undefined);
202
+ reader.releaseLock();
203
+ }
204
+ }
205
+ }
206
+ }
207
+ //# sourceMappingURL=opencode-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode-adapter.js","sourceRoot":"","sources":["../../../../src/dsh/models/vendor/opencode-adapter.ts"],"names":[],"mappings":"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"}