kiokuko-dsh 0.2.1 → 0.2.3
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.
- package/PERMISSIONS.md +21 -28
- package/README.ja.md +8 -6
- package/README.md +12 -6
- package/THIRD_PARTY_NOTICES.md +8 -0
- package/dist/client.cjs +2248 -1383
- package/dist/client.d.ts +3 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/context/continuity-view.d.ts +1 -1
- package/dist/deep-thinker/configuration.d.ts.map +1 -1
- package/dist/deep-thinker/configuration.js +8 -5
- package/dist/deep-thinker/configuration.js.map +1 -1
- package/dist/deep-thinker/core/contracts.d.ts +107 -13
- package/dist/deep-thinker/core/contracts.d.ts.map +1 -1
- package/dist/deep-thinker/core/contracts.js +4 -2
- package/dist/deep-thinker/core/contracts.js.map +1 -1
- package/dist/deep-thinker/memory-finalizer.d.ts +10 -10
- package/dist/deep-thinker/memory-finalizer.js +2 -2
- package/dist/deep-thinker/memory-finalizer.js.map +1 -1
- package/dist/deep-thinker/report.d.ts +1 -1
- package/dist/deep-thinker/store.d.ts +10 -10
- package/dist/deep-thinker/store.d.ts.map +1 -1
- package/dist/deep-thinker/store.js +2 -2
- package/dist/deep-thinker/store.js.map +1 -1
- package/dist/dsh/coding-workflow/contracts.d.ts +120 -0
- package/dist/dsh/coding-workflow/contracts.d.ts.map +1 -0
- package/dist/dsh/coding-workflow/contracts.js +77 -0
- package/dist/dsh/coding-workflow/contracts.js.map +1 -0
- package/dist/dsh/coding-workflow/host.d.ts +41 -0
- package/dist/dsh/coding-workflow/host.d.ts.map +1 -0
- package/dist/dsh/coding-workflow/host.js +235 -0
- package/dist/dsh/coding-workflow/host.js.map +1 -0
- package/dist/dsh/coding-workflow/intent.d.ts +15 -0
- package/dist/dsh/coding-workflow/intent.d.ts.map +1 -0
- package/dist/dsh/coding-workflow/intent.js +86 -0
- package/dist/dsh/coding-workflow/intent.js.map +1 -0
- package/dist/dsh/coding-workflow/service.d.ts +155 -0
- package/dist/dsh/coding-workflow/service.d.ts.map +1 -0
- package/dist/dsh/coding-workflow/service.js +282 -0
- package/dist/dsh/coding-workflow/service.js.map +1 -0
- package/dist/dsh/coding-workflow/store.d.ts +17 -0
- package/dist/dsh/coding-workflow/store.d.ts.map +1 -0
- package/dist/dsh/coding-workflow/store.js +77 -0
- package/dist/dsh/coding-workflow/store.js.map +1 -0
- package/dist/dsh/completion-verifiers.d.ts +39 -0
- package/dist/dsh/completion-verifiers.d.ts.map +1 -0
- package/dist/dsh/completion-verifiers.js +9 -0
- package/dist/dsh/completion-verifiers.js.map +1 -0
- package/dist/dsh/config.d.ts +5 -1
- package/dist/dsh/config.d.ts.map +1 -1
- package/dist/dsh/core/host.d.ts +1 -1
- package/dist/dsh/core/host.d.ts.map +1 -1
- package/dist/dsh/core/host.js +97 -11
- package/dist/dsh/core/host.js.map +1 -1
- package/dist/dsh/core/index.d.ts +4 -4
- package/dist/dsh/core/index.js +2 -2
- package/dist/dsh/core/index.js.map +1 -1
- package/dist/dsh/core/tasks.d.ts +2 -0
- package/dist/dsh/core/tasks.d.ts.map +1 -1
- package/dist/dsh/core/tasks.js +43 -1
- package/dist/dsh/core/tasks.js.map +1 -1
- package/dist/dsh/core-runtime.d.ts +1 -0
- package/dist/dsh/core-runtime.d.ts.map +1 -1
- package/dist/dsh/core-runtime.js +4 -1
- package/dist/dsh/core-runtime.js.map +1 -1
- package/dist/dsh/decisions/config.d.ts +2 -2
- package/dist/dsh/enno-delegation.js +2 -2
- package/dist/dsh/enno-delegation.js.map +1 -1
- package/dist/dsh/execution-command.d.ts +4 -0
- package/dist/dsh/execution-command.d.ts.map +1 -0
- package/dist/dsh/execution-command.js +52 -0
- package/dist/dsh/execution-command.js.map +1 -0
- package/dist/dsh/execution-journal.d.ts +17 -0
- package/dist/dsh/execution-journal.d.ts.map +1 -0
- package/dist/dsh/execution-journal.js +69 -0
- package/dist/dsh/execution-journal.js.map +1 -0
- package/dist/dsh/execution-result.d.ts +20 -0
- package/dist/dsh/execution-result.d.ts.map +1 -0
- package/dist/dsh/execution-result.js +7 -0
- package/dist/dsh/execution-result.js.map +1 -0
- package/dist/dsh/execution-selection.d.ts +150 -23
- package/dist/dsh/execution-selection.d.ts.map +1 -1
- package/dist/dsh/execution-selection.js +18 -6
- package/dist/dsh/execution-selection.js.map +1 -1
- package/dist/dsh/host-adapter/admission.d.ts.map +1 -1
- package/dist/dsh/host-adapter/admission.js +33 -22
- package/dist/dsh/host-adapter/admission.js.map +1 -1
- package/dist/dsh/host-adapter/boundaries.d.ts.map +1 -1
- package/dist/dsh/host-adapter/boundaries.js +2 -0
- package/dist/dsh/host-adapter/boundaries.js.map +1 -1
- package/dist/dsh/host-adapter/context.d.ts.map +1 -1
- package/dist/dsh/host-adapter/context.js +18 -13
- package/dist/dsh/host-adapter/context.js.map +1 -1
- package/dist/dsh/host-adapter/lifecycle.d.ts.map +1 -1
- package/dist/dsh/host-adapter/lifecycle.js +12 -0
- package/dist/dsh/host-adapter/lifecycle.js.map +1 -1
- package/dist/dsh/host-adapter/routing.js +1 -1
- package/dist/dsh/host-adapter/routing.js.map +1 -1
- package/dist/dsh/host-adapter/turn-state.js +1 -1
- package/dist/dsh/host-adapter/turn-state.js.map +1 -1
- package/dist/dsh/host-adapter.d.ts.map +1 -1
- package/dist/dsh/host-adapter.js +61 -18
- package/dist/dsh/host-adapter.js.map +1 -1
- package/dist/dsh/index.d.ts +4 -2
- package/dist/dsh/index.d.ts.map +1 -1
- package/dist/dsh/index.js +7 -0
- package/dist/dsh/index.js.map +1 -1
- package/dist/dsh/intake-gate.d.ts +1 -0
- package/dist/dsh/intake-gate.d.ts.map +1 -1
- package/dist/dsh/intake-gate.js +9 -1
- package/dist/dsh/intake-gate.js.map +1 -1
- package/dist/dsh/lisp/approval.d.ts +2 -1
- package/dist/dsh/lisp/approval.d.ts.map +1 -1
- package/dist/dsh/lisp/approval.js +4 -3
- package/dist/dsh/lisp/approval.js.map +1 -1
- package/dist/dsh/lisp/candidate.d.ts +1 -1
- package/dist/dsh/lisp/code-intelligence-contracts.d.ts +78 -0
- package/dist/dsh/lisp/code-intelligence-contracts.d.ts.map +1 -0
- package/dist/dsh/lisp/code-intelligence-contracts.js +54 -0
- package/dist/dsh/lisp/code-intelligence-contracts.js.map +1 -0
- package/dist/dsh/lisp/code-intelligence-provider.d.ts +116 -0
- package/dist/dsh/lisp/code-intelligence.d.ts +13 -0
- package/dist/dsh/lisp/code-intelligence.d.ts.map +1 -0
- package/dist/dsh/lisp/code-intelligence.js +181 -0
- package/dist/dsh/lisp/code-intelligence.js.map +1 -0
- package/dist/dsh/lisp/coding-choice.d.ts +4 -1
- package/dist/dsh/lisp/coding-choice.d.ts.map +1 -1
- package/dist/dsh/lisp/coding-choice.js +26 -10
- package/dist/dsh/lisp/coding-choice.js.map +1 -1
- package/dist/dsh/lisp/compiled-cache.d.ts.map +1 -1
- package/dist/dsh/lisp/compiled-cache.js +3 -2
- package/dist/dsh/lisp/compiled-cache.js.map +1 -1
- package/dist/dsh/lisp/contracts.d.ts +4 -0
- package/dist/dsh/lisp/contracts.d.ts.map +1 -1
- package/dist/dsh/lisp/contracts.js +1 -0
- package/dist/dsh/lisp/contracts.js.map +1 -1
- package/dist/dsh/lisp/manager.d.ts +9 -1
- package/dist/dsh/lisp/manager.d.ts.map +1 -1
- package/dist/dsh/lisp/manager.js +91 -24
- package/dist/dsh/lisp/manager.js.map +1 -1
- package/dist/dsh/lisp/model-result.d.ts.map +1 -1
- package/dist/dsh/lisp/model-result.js +35 -1
- package/dist/dsh/lisp/model-result.js.map +1 -1
- package/dist/dsh/lisp/proposal-batch.d.ts +2 -0
- package/dist/dsh/lisp/proposal-batch.d.ts.map +1 -1
- package/dist/dsh/lisp/proposal-batch.js +32 -2
- package/dist/dsh/lisp/proposal-batch.js.map +1 -1
- package/dist/dsh/lisp/request-surface.d.ts +12 -2
- package/dist/dsh/lisp/request-surface.d.ts.map +1 -1
- package/dist/dsh/lisp/request-surface.js +1 -1
- package/dist/dsh/lisp/request-surface.js.map +1 -1
- package/dist/dsh/lisp/sandbox.d.ts +3 -0
- package/dist/dsh/lisp/sandbox.d.ts.map +1 -1
- package/dist/dsh/lisp/sandbox.js +13 -6
- package/dist/dsh/lisp/sandbox.js.map +1 -1
- package/dist/dsh/lisp/surface.d.ts +1 -1
- package/dist/dsh/lisp/surface.d.ts.map +1 -1
- package/dist/dsh/lisp/surface.js +118 -23
- package/dist/dsh/lisp/surface.js.map +1 -1
- package/dist/dsh/lisp/worker.d.ts +2 -0
- package/dist/dsh/lisp/worker.d.ts.map +1 -1
- package/dist/dsh/lisp/worker.js +7 -5
- package/dist/dsh/lisp/worker.js.map +1 -1
- package/dist/dsh/lisp-service-key.d.ts +9 -0
- package/dist/dsh/lisp-service-key.d.ts.map +1 -1
- package/dist/dsh/lisp-service-key.js +11 -0
- package/dist/dsh/lisp-service-key.js.map +1 -1
- package/dist/dsh/memory-application.d.ts +1 -1
- package/dist/dsh/memory-application.d.ts.map +1 -1
- package/dist/dsh/memory-application.js +4 -3
- package/dist/dsh/memory-application.js.map +1 -1
- package/dist/dsh/model-auto/candidates.d.ts.map +1 -1
- package/dist/dsh/model-auto/candidates.js +31 -22
- package/dist/dsh/model-auto/candidates.js.map +1 -1
- package/dist/dsh/model-configuration.d.ts +145 -2
- package/dist/dsh/model-configuration.d.ts.map +1 -1
- package/dist/dsh/model-configuration.js +10 -3
- package/dist/dsh/model-configuration.js.map +1 -1
- package/dist/dsh/model-selection-ui.d.ts.map +1 -1
- package/dist/dsh/model-selection-ui.js +7 -2
- package/dist/dsh/model-selection-ui.js.map +1 -1
- package/dist/dsh/models/config-store.d.ts +8 -0
- package/dist/dsh/models/config-store.d.ts.map +1 -0
- package/dist/dsh/models/config-store.js +49 -0
- package/dist/dsh/models/config-store.js.map +1 -0
- package/dist/dsh/models/contracts.d.ts +107 -0
- package/dist/dsh/models/contracts.d.ts.map +1 -0
- package/dist/dsh/models/contracts.js +104 -0
- package/dist/dsh/models/contracts.js.map +1 -0
- package/dist/dsh/models/metadata.d.ts +7 -0
- package/dist/dsh/models/metadata.d.ts.map +1 -0
- package/dist/dsh/models/metadata.js +13 -0
- package/dist/dsh/models/metadata.js.map +1 -0
- package/dist/dsh/models/profiles.d.ts +10 -0
- package/dist/dsh/models/profiles.d.ts.map +1 -0
- package/dist/dsh/models/profiles.js +176 -0
- package/dist/dsh/models/profiles.js.map +1 -0
- package/dist/dsh/models/service.d.ts +97 -0
- package/dist/dsh/models/service.d.ts.map +1 -0
- package/dist/dsh/models/service.js +518 -0
- package/dist/dsh/models/service.js.map +1 -0
- package/dist/dsh/models/surface.d.ts +8 -0
- package/dist/dsh/models/surface.d.ts.map +1 -0
- package/dist/dsh/models/surface.js +162 -0
- package/dist/dsh/models/surface.js.map +1 -0
- package/dist/dsh/models/vendor/THIRD_PARTY_NOTICES.txt +134 -0
- package/dist/dsh/models/vendor/abortable.d.ts +3 -0
- package/dist/dsh/models/vendor/abortable.d.ts.map +1 -0
- package/dist/dsh/models/vendor/abortable.js +10 -0
- package/dist/dsh/models/vendor/abortable.js.map +1 -0
- package/dist/dsh/models/vendor/auth-contract.d.ts +67 -0
- package/dist/dsh/models/vendor/auth-contract.d.ts.map +1 -0
- package/dist/dsh/models/vendor/auth-contract.js +2 -0
- package/dist/dsh/models/vendor/auth-contract.js.map +1 -0
- package/dist/dsh/models/vendor/credentials.d.ts +58 -0
- package/dist/dsh/models/vendor/credentials.d.ts.map +1 -0
- package/dist/dsh/models/vendor/credentials.js +205 -0
- package/dist/dsh/models/vendor/credentials.js.map +1 -0
- package/dist/dsh/models/vendor/nous-oauth.d.ts +6 -0
- package/dist/dsh/models/vendor/nous-oauth.d.ts.map +1 -0
- package/dist/dsh/models/vendor/nous-oauth.js +113 -0
- package/dist/dsh/models/vendor/nous-oauth.js.map +1 -0
- package/dist/dsh/models/vendor/opencode-adapter.d.ts +38 -0
- package/dist/dsh/models/vendor/opencode-adapter.d.ts.map +1 -0
- package/dist/dsh/models/vendor/opencode-adapter.js +207 -0
- package/dist/dsh/models/vendor/opencode-adapter.js.map +1 -0
- package/dist/dsh/models/vendor/opencode-catalog.d.ts +73 -0
- package/dist/dsh/models/vendor/opencode-catalog.d.ts.map +1 -0
- package/dist/dsh/models/vendor/opencode-catalog.js +253 -0
- package/dist/dsh/models/vendor/opencode-catalog.js.map +1 -0
- package/dist/dsh/models/vendor/opencode-codec.d.ts +7 -0
- package/dist/dsh/models/vendor/opencode-codec.d.ts.map +1 -0
- package/dist/dsh/models/vendor/opencode-codec.js +107 -0
- package/dist/dsh/models/vendor/opencode-codec.js.map +1 -0
- package/dist/dsh/models/vendor/opencode-owned.generated.d.ts +114 -0
- package/dist/dsh/models/vendor/opencode-owned.generated.d.ts.map +1 -0
- package/dist/dsh/models/vendor/opencode-owned.generated.js +2867 -0
- package/dist/dsh/models/vendor/opencode-owned.generated.js.map +1 -0
- package/dist/dsh/models/vendor/opencode-replay.d.ts +17 -0
- package/dist/dsh/models/vendor/opencode-replay.d.ts.map +1 -0
- package/dist/dsh/models/vendor/opencode-replay.js +147 -0
- package/dist/dsh/models/vendor/opencode-replay.js.map +1 -0
- package/dist/dsh/models/vendor/opencode-sdk.d.ts +6 -0
- package/dist/dsh/models/vendor/opencode-sdk.d.ts.map +1 -0
- package/dist/dsh/models/vendor/opencode-sdk.js +49915 -0
- package/dist/dsh/models/vendor/opencode-sdk.js.map +7 -0
- package/dist/dsh/models/vendor/opencode-transport.d.ts +6 -0
- package/dist/dsh/models/vendor/opencode-transport.d.ts.map +1 -0
- package/dist/dsh/models/vendor/opencode-transport.js +70 -0
- package/dist/dsh/models/vendor/opencode-transport.js.map +1 -0
- package/dist/dsh/models/vendor/pi-ai.d.ts +23 -0
- package/dist/dsh/models/vendor/pi-ai.d.ts.map +1 -0
- package/dist/dsh/models/vendor/pi-ai.js +27 -0
- package/dist/dsh/models/vendor/pi-ai.js.map +1 -0
- package/dist/dsh/modules/lisp.d.ts +1 -1
- package/dist/dsh/modules/lisp.d.ts.map +1 -1
- package/dist/dsh/modules/lisp.js +2 -13
- package/dist/dsh/modules/lisp.js.map +1 -1
- package/dist/dsh/modules/resources.d.ts +3 -1
- package/dist/dsh/modules/resources.d.ts.map +1 -1
- package/dist/dsh/modules/resources.js +4 -0
- package/dist/dsh/modules/resources.js.map +1 -1
- package/dist/dsh/native-model-catalog.d.ts.map +1 -1
- package/dist/dsh/native-model-catalog.js +4 -3
- package/dist/dsh/native-model-catalog.js.map +1 -1
- package/dist/dsh/node-tap-summary.d.ts +8 -1
- package/dist/dsh/node-tap-summary.d.ts.map +1 -1
- package/dist/dsh/node-tap-summary.js +33 -3
- package/dist/dsh/node-tap-summary.js.map +1 -1
- package/dist/dsh/on-demand-intake.d.ts +1 -1
- package/dist/dsh/on-demand-intake.d.ts.map +1 -1
- package/dist/dsh/on-demand-intake.js +35 -14
- package/dist/dsh/on-demand-intake.js.map +1 -1
- package/dist/dsh/owned-evidence.d.ts +49 -0
- package/dist/dsh/owned-evidence.d.ts.map +1 -0
- package/dist/dsh/owned-evidence.js +69 -0
- package/dist/dsh/owned-evidence.js.map +1 -0
- package/dist/dsh/owned-execution.d.ts +99 -0
- package/dist/dsh/owned-execution.d.ts.map +1 -0
- package/dist/dsh/owned-execution.js +558 -0
- package/dist/dsh/owned-execution.js.map +1 -0
- package/dist/dsh/plan-transition.d.ts +5 -0
- package/dist/dsh/plan-transition.d.ts.map +1 -0
- package/dist/dsh/plan-transition.js +34 -0
- package/dist/dsh/plan-transition.js.map +1 -0
- package/dist/dsh/session-memory-finalizer.d.ts.map +1 -1
- package/dist/dsh/session-memory-finalizer.js +46 -3
- package/dist/dsh/session-memory-finalizer.js.map +1 -1
- package/dist/dsh/setup.d.ts +1 -1
- package/dist/dsh/setup.d.ts.map +1 -1
- package/dist/dsh/setup.js +2 -0
- package/dist/dsh/setup.js.map +1 -1
- package/dist/dsh/skill-prompts.json +1 -1
- package/dist/dsh/task-completion-host.js +3 -3
- package/dist/dsh/task-completion-host.js.map +1 -1
- package/dist/dsh/task-completion.d.ts +17 -0
- package/dist/dsh/task-completion.d.ts.map +1 -1
- package/dist/dsh/task-completion.js +144 -38
- package/dist/dsh/task-completion.js.map +1 -1
- package/dist/dsh/task-intake.d.ts.map +1 -1
- package/dist/dsh/task-intake.js +7 -0
- package/dist/dsh/task-intake.js.map +1 -1
- package/dist/enno-oduno/coding-workflow.d.ts +39 -0
- package/dist/enno-oduno/coding-workflow.d.ts.map +1 -0
- package/dist/enno-oduno/coding-workflow.js +33 -0
- package/dist/enno-oduno/coding-workflow.js.map +1 -0
- package/dist/enno-oduno/schemas.d.ts +10 -10
- package/dist/enno-oduno/store.d.ts.map +1 -1
- package/dist/enno-oduno/store.js +56 -1
- package/dist/enno-oduno/store.js.map +1 -1
- package/dist/enno-oduno/types.d.ts +1 -0
- package/dist/enno-oduno/types.d.ts.map +1 -1
- package/dist/enno-oduno/verifier.d.ts.map +1 -1
- package/dist/enno-oduno/verifier.js +4 -1
- package/dist/enno-oduno/verifier.js.map +1 -1
- package/dist/locale/en.json +1 -1
- package/dist/locale/ja.json +1 -1
- package/dist/locale/ko.json +1 -1
- package/dist/locale/zh-CN.json +1 -1
- package/dist/memory/application.d.ts +2 -1
- package/dist/memory/application.d.ts.map +1 -1
- package/dist/memory/application.js +26 -12
- package/dist/memory/application.js.map +1 -1
- package/dist/memory/evidence.d.ts +2 -0
- package/dist/memory/evidence.d.ts.map +1 -1
- package/dist/memory/evidence.js +3 -1
- package/dist/memory/evidence.js.map +1 -1
- package/dist/model-tools/contracts.d.ts +4 -4
- package/dist/models-client.cjs +635 -0
- package/dist/models-client.d.ts +26 -0
- package/dist/models-client.d.ts.map +1 -0
- package/dist/models-client.js +642 -0
- package/dist/models-client.js.map +1 -0
- package/docs/code-intelligence.md +149 -0
- package/docs/coding-workflow.md +45 -0
- package/docs/dsh-auth-LICENSE.txt +22 -0
- package/docs/dsh-auth-provenance.md +25 -0
- package/docs/dsh-plugin.md +19 -0
- package/docs/execution-support.md +4 -0
- package/docs/kiokuko-models.md +66 -0
- package/docs/lisp-hot-tools.md +2 -2
- package/docs/lisp.md +112 -63
- package/docs/model-selection.ja.md +7 -9
- package/docs/model-selection.md +14 -12
- package/docs/owned-execution.md +99 -0
- package/lisp/supervisor.mjs +8 -2
- package/lisp/tools.lisp +31 -3
- package/migrations/035_owned_execution.sql +19 -0
- package/migrations/036_coding_workflow.sql +26 -0
- package/package.json +47 -12
- package/skills/coding-ideal-routine-skill/SKILL.md +6 -0
- package/skills/kiokuko-lisp/SKILL.md +53 -67
- package/skills/kiokuko-soul/SKILL.md +7 -28
- package/skills/one-shot-software-completion/SKILL.md +5 -6
|
@@ -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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"}
|