@deepseek-harness-tui/dsh-tui 0.8.0 → 0.8.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.
- package/README.md +32 -15
- package/cordis.patch.yml +21 -2
- package/cordis.yml +12 -1
- package/dsh-ecosystem-spec/protocols/profile-definitions.d.ts +13 -0
- package/dsh-ecosystem-spec/protocols/profile-definitions.js +59 -0
- package/dsh-ecosystem-spec/protocols/tui-channel-http.d.ts +15 -0
- package/dsh-ecosystem-spec/protocols/tui-channel-http.js +32 -0
- package/dsh-ecosystem-spec/protocols/tui-channel.d.ts +59 -0
- package/dsh-ecosystem-spec/protocols/tui-channel.js +166 -0
- package/dsh-ecosystem-spec/protocols/tui-contributions.d.ts +42 -0
- package/dsh-ecosystem-spec/protocols/tui-contributions.js +143 -0
- package/dsh-ecosystem-spec/registry/README.md +14 -0
- package/dsh-ecosystem-spec/registry/contracts/decision-events-v1alpha1.json +13 -0
- package/dsh-ecosystem-spec/registry/contracts/scene-v1alpha1.json +13 -0
- package/dsh-ecosystem-spec/registry/contracts/settings-section-v1alpha1.json +13 -0
- package/dsh-ecosystem-spec/registry/contracts/tui-channel-v1alpha1.json +30 -0
- package/dsh-ecosystem-spec/registry/contracts/workspace-provider-v1alpha1.json +6 -0
- package/dsh-ecosystem-spec/registry/host-descriptor.tui.example.json +56 -0
- package/dsh-ecosystem-spec/registry/permissions-0.1.json +13 -0
- package/dsh-ecosystem-spec/registry/registry-0.15.json +149 -0
- package/dsh-ecosystem-spec/schemas/conformance-claim.schema.json +15 -0
- package/dsh-ecosystem-spec/schemas/effect-ledger-record.schema.json +16 -0
- package/dsh-ecosystem-spec/schemas/host-descriptor.schema.json +26 -0
- package/lib/types/cc/figures.d.ts +4 -0
- package/lib/types/cc/figures.d.ts.map +1 -1
- package/lib/types/cc/figures.js +4 -0
- package/lib/types/command-trees.d.ts +2 -1
- package/lib/types/command-trees.d.ts.map +1 -1
- package/lib/types/command-trees.js +1 -1
- package/lib/types/commands.d.ts.map +1 -1
- package/lib/types/commands.js +2 -0
- package/lib/types/components/ExtensionDialog.d.ts +40 -0
- package/lib/types/components/ExtensionDialog.d.ts.map +1 -0
- package/lib/types/components/ExtensionDialog.js +210 -0
- package/lib/types/components/HelpMenu.js +1 -1
- package/lib/types/components/LoadedContextPanel.d.ts +5 -5
- package/lib/types/components/LoadedContextPanel.js +6 -6
- package/lib/types/components/LogoV2.d.ts.map +1 -1
- package/lib/types/components/LogoV2.js +16 -8
- package/lib/types/components/Markdown.d.ts +13 -1
- package/lib/types/components/Markdown.d.ts.map +1 -1
- package/lib/types/components/Markdown.js +15 -1
- package/lib/types/components/MessageList.d.ts +3 -1
- package/lib/types/components/MessageList.d.ts.map +1 -1
- package/lib/types/components/MessageList.js +111 -6
- package/lib/types/components/PromptInput.d.ts.map +1 -1
- package/lib/types/components/PromptInput.js +26 -12
- package/lib/types/components/RewindPicker.d.ts +13 -1
- package/lib/types/components/RewindPicker.d.ts.map +1 -1
- package/lib/types/components/RewindPicker.js +26 -2
- package/lib/types/components/StreamingMarkdown.d.ts +2 -8
- package/lib/types/components/StreamingMarkdown.d.ts.map +1 -1
- package/lib/types/components/StreamingMarkdown.js +51 -9
- package/lib/types/components/ToolUseLoader.d.ts +8 -3
- package/lib/types/components/ToolUseLoader.d.ts.map +1 -1
- package/lib/types/components/ToolUseLoader.js +43 -9
- package/lib/types/components/activityFrames.d.ts +1 -1
- package/lib/types/components/activityFrames.d.ts.map +1 -1
- package/lib/types/components/activityFrames.js +4 -1
- package/lib/types/components/messages/AssistantThinkingMessage.d.ts +5 -1
- package/lib/types/components/messages/AssistantThinkingMessage.d.ts.map +1 -1
- package/lib/types/components/messages/AssistantThinkingMessage.js +26 -3
- package/lib/types/components/messages/AssistantToolUseMessage.d.ts.map +1 -1
- package/lib/types/components/messages/AssistantToolUseMessage.js +13 -2
- package/lib/types/dsh-adapter/channel.d.ts +61 -11
- package/lib/types/dsh-adapter/channel.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel.js +767 -120
- package/lib/types/dsh-adapter/childStderr.d.ts.map +1 -1
- package/lib/types/dsh-adapter/childStderr.js +10 -0
- package/lib/types/dsh-adapter/command-attribution.d.ts +51 -0
- package/lib/types/dsh-adapter/command-attribution.d.ts.map +1 -0
- package/lib/types/dsh-adapter/command-attribution.js +93 -0
- package/lib/types/dsh-adapter/command-errors.d.ts +42 -0
- package/lib/types/dsh-adapter/command-errors.d.ts.map +1 -0
- package/lib/types/dsh-adapter/command-errors.js +63 -0
- package/lib/types/dsh-adapter/command-trees.d.ts +7 -1
- package/lib/types/dsh-adapter/command-trees.d.ts.map +1 -1
- package/lib/types/dsh-adapter/command-trees.js +70 -20
- package/lib/types/dsh-adapter/component-identity.d.ts +33 -0
- package/lib/types/dsh-adapter/component-identity.d.ts.map +1 -0
- package/lib/types/dsh-adapter/component-identity.js +108 -0
- package/lib/types/dsh-adapter/contract.d.ts +1 -1
- package/lib/types/dsh-adapter/contract.js +2 -2
- package/lib/types/dsh-adapter/decision-guard.d.ts +84 -0
- package/lib/types/dsh-adapter/decision-guard.d.ts.map +1 -0
- package/lib/types/dsh-adapter/decision-guard.js +348 -0
- package/lib/types/dsh-adapter/dialogs.d.ts +145 -0
- package/lib/types/dsh-adapter/dialogs.d.ts.map +1 -0
- package/lib/types/dsh-adapter/dialogs.js +316 -0
- package/lib/types/dsh-adapter/effect-ledger.d.ts +91 -0
- package/lib/types/dsh-adapter/effect-ledger.d.ts.map +1 -0
- package/lib/types/dsh-adapter/effect-ledger.js +251 -0
- package/lib/types/dsh-adapter/extension-events.d.ts +193 -0
- package/lib/types/dsh-adapter/extension-events.d.ts.map +1 -0
- package/lib/types/dsh-adapter/extension-events.js +207 -0
- package/lib/types/dsh-adapter/extensions.d.ts +32 -0
- package/lib/types/dsh-adapter/extensions.d.ts.map +1 -0
- package/lib/types/dsh-adapter/extensions.js +42 -0
- package/lib/types/dsh-adapter/grants.d.ts +25 -0
- package/lib/types/dsh-adapter/grants.d.ts.map +1 -0
- package/lib/types/dsh-adapter/grants.js +213 -0
- package/lib/types/dsh-adapter/host-access.d.ts +37 -0
- package/lib/types/dsh-adapter/host-access.d.ts.map +1 -0
- package/lib/types/dsh-adapter/host-access.js +652 -0
- package/lib/types/dsh-adapter/host-descriptor.d.ts +24 -0
- package/lib/types/dsh-adapter/host-descriptor.d.ts.map +1 -0
- package/lib/types/dsh-adapter/host-descriptor.js +169 -0
- package/lib/types/dsh-adapter/index.d.ts +4 -0
- package/lib/types/dsh-adapter/index.d.ts.map +1 -1
- package/lib/types/dsh-adapter/index.js +1 -0
- package/lib/types/dsh-adapter/message-observer.d.ts +173 -0
- package/lib/types/dsh-adapter/message-observer.d.ts.map +1 -0
- package/lib/types/dsh-adapter/message-observer.js +553 -0
- package/lib/types/dsh-adapter/plugin-host.d.ts +136 -0
- package/lib/types/dsh-adapter/plugin-host.d.ts.map +1 -0
- package/lib/types/dsh-adapter/plugin-host.js +365 -0
- package/lib/types/dsh-adapter/plugin-storage.d.ts +108 -0
- package/lib/types/dsh-adapter/plugin-storage.d.ts.map +1 -0
- package/lib/types/dsh-adapter/plugin-storage.js +397 -0
- package/lib/types/dsh-adapter/plugin.d.ts.map +1 -1
- package/lib/types/dsh-adapter/plugin.js +124 -14
- package/lib/types/dsh-adapter/plugins-info.d.ts +43 -0
- package/lib/types/dsh-adapter/plugins-info.d.ts.map +1 -0
- package/lib/types/dsh-adapter/plugins-info.js +276 -0
- package/lib/types/dsh-adapter/promptDebug.d.ts +0 -6
- package/lib/types/dsh-adapter/promptDebug.d.ts.map +1 -1
- package/lib/types/dsh-adapter/promptDebug.js +13 -4
- package/lib/types/dsh-adapter/renderers.d.ts +57 -0
- package/lib/types/dsh-adapter/renderers.d.ts.map +1 -0
- package/lib/types/dsh-adapter/renderers.js +173 -0
- package/lib/types/dsh-adapter/sanitize.d.ts +36 -0
- package/lib/types/dsh-adapter/sanitize.d.ts.map +1 -0
- package/lib/types/dsh-adapter/sanitize.js +65 -0
- package/lib/types/dsh-adapter/scenes.d.ts +15 -5
- package/lib/types/dsh-adapter/scenes.d.ts.map +1 -1
- package/lib/types/dsh-adapter/scenes.js +149 -35
- package/lib/types/dsh-adapter/settings-sections.d.ts +7 -3
- package/lib/types/dsh-adapter/settings-sections.d.ts.map +1 -1
- package/lib/types/dsh-adapter/settings-sections.js +106 -26
- package/lib/types/dsh-adapter/shortcuts.d.ts +107 -0
- package/lib/types/dsh-adapter/shortcuts.d.ts.map +1 -0
- package/lib/types/dsh-adapter/shortcuts.js +340 -0
- package/lib/types/dsh-adapter/status.d.ts +74 -0
- package/lib/types/dsh-adapter/status.d.ts.map +1 -0
- package/lib/types/dsh-adapter/status.js +234 -0
- package/lib/types/dsh-adapter/workspaces.d.ts +16 -5
- package/lib/types/dsh-adapter/workspaces.d.ts.map +1 -1
- package/lib/types/dsh-adapter/workspaces.js +287 -170
- package/lib/types/extensions.d.ts +13 -0
- package/lib/types/extensions.d.ts.map +1 -0
- package/lib/types/extensions.js +21 -0
- package/lib/types/force-production-react.d.ts +1 -0
- package/lib/types/force-production-react.d.ts.map +1 -0
- package/lib/types/force-production-react.js +12 -0
- package/lib/types/i18n.d.ts +174 -20
- package/lib/types/i18n.d.ts.map +1 -1
- package/lib/types/i18n.js +56 -6
- package/lib/types/index.d.ts +1 -0
- package/lib/types/index.d.ts.map +1 -1
- package/lib/types/index.js +1 -0
- package/lib/types/ink/components/App.d.ts +2 -0
- package/lib/types/ink/components/App.d.ts.map +1 -1
- package/lib/types/ink/components/App.js +4 -0
- package/lib/types/ink/ink.d.ts +31 -3
- package/lib/types/ink/ink.d.ts.map +1 -1
- package/lib/types/ink/ink.js +90 -5
- package/lib/types/ink/log-update.d.ts.map +1 -1
- package/lib/types/ink/log-update.js +225 -56
- package/lib/types/ink/output.d.ts +35 -2
- package/lib/types/ink/output.d.ts.map +1 -1
- package/lib/types/ink/output.js +281 -14
- package/lib/types/ink/render-node-to-output.d.ts.map +1 -1
- package/lib/types/ink/render-node-to-output.js +14 -6
- package/lib/types/ink/screen.d.ts +39 -0
- package/lib/types/ink/screen.d.ts.map +1 -1
- package/lib/types/ink/screen.js +117 -0
- package/lib/types/ink/terminal.d.ts.map +1 -1
- package/lib/types/ink/terminal.js +26 -6
- package/lib/types/ink/wrapAnsi.d.ts +1 -1
- package/lib/types/ink/wrapAnsi.d.ts.map +1 -1
- package/lib/types/ink/wrapAnsi.js +29 -2
- package/lib/types/plugin-host.d.ts +15 -0
- package/lib/types/plugin-host.d.ts.map +1 -0
- package/lib/types/plugin-host.js +17 -0
- package/lib/types/plugin-spec/negotiate.d.ts +11 -0
- package/lib/types/plugin-spec/negotiate.d.ts.map +1 -0
- package/lib/types/plugin-spec/negotiate.js +97 -0
- package/lib/types/plugin-spec/permission-scope.d.ts +32 -0
- package/lib/types/plugin-spec/permission-scope.d.ts.map +1 -0
- package/lib/types/plugin-spec/permission-scope.js +90 -0
- package/lib/types/plugin-spec/registry.d.ts +23 -0
- package/lib/types/plugin-spec/registry.d.ts.map +1 -0
- package/lib/types/plugin-spec/registry.js +252 -0
- package/lib/types/plugin-spec/schema-check.d.ts +17 -0
- package/lib/types/plugin-spec/schema-check.d.ts.map +1 -0
- package/lib/types/plugin-spec/schema-check.js +165 -0
- package/lib/types/plugin-spec/tui-extension.d.ts +16 -0
- package/lib/types/plugin-spec/tui-extension.d.ts.map +1 -0
- package/lib/types/plugin-spec/tui-extension.js +79 -0
- package/lib/types/plugin-spec/types.d.ts +114 -0
- package/lib/types/plugin-spec/types.d.ts.map +1 -0
- package/lib/types/plugin-spec/types.js +10 -0
- package/lib/types/plugin-spec/validate.d.ts +21 -0
- package/lib/types/plugin-spec/validate.d.ts.map +1 -0
- package/lib/types/plugin-spec/validate.js +138 -0
- package/lib/types/scenes.d.ts +2 -1
- package/lib/types/scenes.d.ts.map +1 -1
- package/lib/types/scenes.js +1 -1
- package/lib/types/screens/Chat.d.ts +14 -1
- package/lib/types/screens/Chat.d.ts.map +1 -1
- package/lib/types/screens/Chat.js +173 -49
- package/lib/types/screens/SessionBrowser.d.ts.map +1 -1
- package/lib/types/screens/SessionBrowser.js +10 -3
- package/lib/types/sessions/view.d.ts +3 -2
- package/lib/types/sessions/view.d.ts.map +1 -1
- package/lib/types/sessions/view.js +18 -0
- package/lib/types/settings-sections.d.ts +2 -1
- package/lib/types/settings-sections.d.ts.map +1 -1
- package/lib/types/settings-sections.js +1 -1
- package/lib/types/theme.d.ts +5 -0
- package/lib/types/theme.d.ts.map +1 -1
- package/lib/types/theme.js +15 -0
- package/lib/types/update.d.ts +20 -0
- package/lib/types/update.d.ts.map +1 -1
- package/lib/types/update.js +54 -7
- package/lib/types/utils/execFileNoThrow.d.ts.map +1 -1
- package/lib/types/utils/execFileNoThrow.js +3 -0
- package/lib/types/utils/loaded-context.d.ts +8 -3
- package/lib/types/utils/loaded-context.d.ts.map +1 -1
- package/lib/types/utils/loaded-context.js +39 -3
- package/lib/types/utils/modifiers.d.ts.map +1 -1
- package/lib/types/utils/modifiers.js +3 -2
- package/lib/types/working-activity.d.ts +12 -0
- package/lib/types/working-activity.d.ts.map +1 -1
- package/lib/types/working-activity.js +13 -0
- package/lib/types/workspaces.d.ts +2 -1
- package/lib/types/workspaces.d.ts.map +1 -1
- package/lib/types/workspaces.js +1 -1
- package/node_modules/@dsh-std/command/CHANGELOG.md +8 -0
- package/node_modules/@dsh-std/command/LICENSE +21 -0
- package/node_modules/@dsh-std/command/README.md +26 -0
- package/node_modules/@dsh-std/command/README.zh.md +28 -0
- package/node_modules/@dsh-std/command/lib/index.d.ts +144 -0
- package/node_modules/@dsh-std/command/lib/index.d.ts.map +1 -0
- package/node_modules/@dsh-std/command/lib/index.js +252 -0
- package/node_modules/@dsh-std/command/lib/index.js.map +1 -0
- package/node_modules/@dsh-std/command/package.json +22 -0
- package/node_modules/@dsh-std/connection/CHANGELOG.md +8 -0
- package/node_modules/@dsh-std/connection/LICENSE +21 -0
- package/node_modules/@dsh-std/connection/README.md +42 -0
- package/node_modules/@dsh-std/connection/README.zh.md +42 -0
- package/node_modules/@dsh-std/connection/lib/connection-CdGcSQnu.d.ts +125 -0
- package/node_modules/@dsh-std/connection/lib/connection-CdGcSQnu.d.ts.map +1 -0
- package/node_modules/@dsh-std/connection/lib/index.d.ts +89 -0
- package/node_modules/@dsh-std/connection/lib/index.d.ts.map +1 -0
- package/node_modules/@dsh-std/connection/lib/index.js +158 -0
- package/node_modules/@dsh-std/connection/lib/index.js.map +1 -0
- package/node_modules/@dsh-std/connection/lib/memory.d.ts +24 -0
- package/node_modules/@dsh-std/connection/lib/memory.d.ts.map +1 -0
- package/node_modules/@dsh-std/connection/lib/memory.js +258 -0
- package/node_modules/@dsh-std/connection/lib/memory.js.map +1 -0
- package/node_modules/@dsh-std/connection/lib/resolve-3X6ausgz.js +226 -0
- package/node_modules/@dsh-std/connection/lib/resolve-3X6ausgz.js.map +1 -0
- package/node_modules/@dsh-std/connection/package.json +20 -0
- package/node_modules/@dsh-std/core/CHANGELOG.md +8 -0
- package/node_modules/@dsh-std/core/LICENSE +21 -0
- package/node_modules/@dsh-std/core/README.md +13 -0
- package/node_modules/@dsh-std/core/README.zh.md +13 -0
- package/node_modules/@dsh-std/core/lib/index.d.ts +112 -0
- package/node_modules/@dsh-std/core/lib/index.d.ts.map +1 -0
- package/node_modules/@dsh-std/core/lib/index.js +424 -0
- package/node_modules/@dsh-std/core/lib/index.js.map +1 -0
- package/node_modules/@dsh-std/core/package.json +21 -0
- package/node_modules/@dsh-std/manifest/CHANGELOG.md +9 -0
- package/node_modules/@dsh-std/manifest/LICENSE +21 -0
- package/node_modules/@dsh-std/manifest/README.md +5 -0
- package/node_modules/@dsh-std/manifest/README.zh.md +5 -0
- package/node_modules/@dsh-std/manifest/lib/index.d.ts +182 -0
- package/node_modules/@dsh-std/manifest/lib/index.d.ts.map +1 -0
- package/node_modules/@dsh-std/manifest/lib/index.js +625 -0
- package/node_modules/@dsh-std/manifest/lib/index.js.map +1 -0
- package/node_modules/@dsh-std/manifest/package.json +20 -0
- package/node_modules/@dsh-std/manifest/schema/dsh-plugin-0.15.schema.json +144 -0
- package/node_modules/@dsh-std/messages/CHANGELOG.md +8 -0
- package/node_modules/@dsh-std/messages/LICENSE +21 -0
- package/node_modules/@dsh-std/messages/README.md +5 -0
- package/node_modules/@dsh-std/messages/README.zh.md +7 -0
- package/node_modules/@dsh-std/messages/lib/index.d.ts +50 -0
- package/node_modules/@dsh-std/messages/lib/index.d.ts.map +1 -0
- package/node_modules/@dsh-std/messages/lib/index.js +151 -0
- package/node_modules/@dsh-std/messages/lib/index.js.map +1 -0
- package/node_modules/@dsh-std/messages/package.json +20 -0
- package/node_modules/@dsh-std/messages/schema/message-observer-envelope-0.15.schema.json +54 -0
- package/node_modules/@dsh-std/presentation/CHANGELOG.md +9 -0
- package/node_modules/@dsh-std/presentation/LICENSE +21 -0
- package/node_modules/@dsh-std/presentation/README.md +27 -0
- package/node_modules/@dsh-std/presentation/README.zh.md +29 -0
- package/node_modules/@dsh-std/presentation/lib/callback.d.ts +2 -0
- package/node_modules/@dsh-std/presentation/lib/callback.js +179 -0
- package/node_modules/@dsh-std/presentation/lib/callback.js.map +1 -0
- package/node_modules/@dsh-std/presentation/lib/index.d.ts +262 -0
- package/node_modules/@dsh-std/presentation/lib/index.d.ts.map +1 -0
- package/node_modules/@dsh-std/presentation/lib/index.js +550 -0
- package/node_modules/@dsh-std/presentation/lib/index.js.map +1 -0
- package/node_modules/@dsh-std/presentation/lib/interaction.d.ts +2 -0
- package/node_modules/@dsh-std/presentation/lib/interaction.js +2 -0
- package/node_modules/@dsh-std/presentation/lib/operations.d.ts +2 -0
- package/node_modules/@dsh-std/presentation/lib/operations.js +2 -0
- package/node_modules/@dsh-std/presentation/package.json +25 -0
- package/node_modules/@dsh-std/storage/CHANGELOG.md +8 -0
- package/node_modules/@dsh-std/storage/LICENSE +21 -0
- package/node_modules/@dsh-std/storage/README.md +5 -0
- package/node_modules/@dsh-std/storage/README.zh.md +7 -0
- package/node_modules/@dsh-std/storage/lib/index.d.ts +48 -0
- package/node_modules/@dsh-std/storage/lib/index.d.ts.map +1 -0
- package/node_modules/@dsh-std/storage/lib/index.js +104 -0
- package/node_modules/@dsh-std/storage/lib/index.js.map +1 -0
- package/node_modules/@dsh-std/storage/package.json +20 -0
- package/node_modules/@dsh-std/storage/schema/local-storage-0.15.schema.json +56 -0
- package/package.json +110 -70
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/connection/CHANGELOG.md +8 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/connection/LICENSE +21 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/connection/README.md +42 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/connection/README.zh.md +42 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/connection/lib/connection-CdGcSQnu.d.ts +125 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/connection/lib/connection-CdGcSQnu.d.ts.map +1 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/connection/lib/index.d.ts +89 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/connection/lib/index.d.ts.map +1 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/connection/lib/index.js +158 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/connection/lib/index.js.map +1 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/connection/lib/memory.d.ts +24 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/connection/lib/memory.d.ts.map +1 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/connection/lib/memory.js +258 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/connection/lib/memory.js.map +1 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/connection/lib/resolve-3X6ausgz.js +226 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/connection/lib/resolve-3X6ausgz.js.map +1 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/connection/package.json +20 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/core/CHANGELOG.md +8 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/core/LICENSE +21 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/core/README.md +13 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/core/README.zh.md +13 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/core/lib/index.d.ts +112 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/core/lib/index.d.ts.map +1 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/core/lib/index.js +424 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/core/lib/index.js.map +1 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/core/package.json +21 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/manifest/CHANGELOG.md +9 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/manifest/LICENSE +21 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/manifest/README.md +5 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/manifest/README.zh.md +5 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/manifest/lib/index.d.ts +182 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/manifest/lib/index.d.ts.map +1 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/manifest/lib/index.js +625 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/manifest/lib/index.js.map +1 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/manifest/package.json +20 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/manifest/schema/dsh-plugin-0.15.schema.json +144 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/presentation/CHANGELOG.md +9 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/presentation/LICENSE +21 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/presentation/README.md +27 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/presentation/README.zh.md +29 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/presentation/lib/callback.d.ts +2 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/presentation/lib/callback.js +179 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/presentation/lib/callback.js.map +1 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/presentation/lib/index.d.ts +262 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/presentation/lib/index.d.ts.map +1 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/presentation/lib/index.js +550 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/presentation/lib/index.js.map +1 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/presentation/lib/interaction.d.ts +2 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/presentation/lib/interaction.js +2 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/presentation/lib/operations.d.ts +2 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/presentation/lib/operations.js +2 -0
- package/vendor/dsh-std/packages/command/node_modules/@dsh-std/presentation/package.json +25 -0
- package/vendor/dsh-std/packages/connection/node_modules/@dsh-std/core/CHANGELOG.md +8 -0
- package/vendor/dsh-std/packages/connection/node_modules/@dsh-std/core/LICENSE +21 -0
- package/vendor/dsh-std/packages/connection/node_modules/@dsh-std/core/README.md +13 -0
- package/vendor/dsh-std/packages/connection/node_modules/@dsh-std/core/README.zh.md +13 -0
- package/vendor/dsh-std/packages/connection/node_modules/@dsh-std/core/lib/index.d.ts +112 -0
- package/vendor/dsh-std/packages/connection/node_modules/@dsh-std/core/lib/index.d.ts.map +1 -0
- package/vendor/dsh-std/packages/connection/node_modules/@dsh-std/core/lib/index.js +424 -0
- package/vendor/dsh-std/packages/connection/node_modules/@dsh-std/core/lib/index.js.map +1 -0
- package/vendor/dsh-std/packages/connection/node_modules/@dsh-std/core/package.json +21 -0
- package/vendor/dsh-std/packages/manifest/node_modules/@dsh-std/core/CHANGELOG.md +8 -0
- package/vendor/dsh-std/packages/manifest/node_modules/@dsh-std/core/LICENSE +21 -0
- package/vendor/dsh-std/packages/manifest/node_modules/@dsh-std/core/README.md +13 -0
- package/vendor/dsh-std/packages/manifest/node_modules/@dsh-std/core/README.zh.md +13 -0
- package/vendor/dsh-std/packages/manifest/node_modules/@dsh-std/core/lib/index.d.ts +112 -0
- package/vendor/dsh-std/packages/manifest/node_modules/@dsh-std/core/lib/index.d.ts.map +1 -0
- package/vendor/dsh-std/packages/manifest/node_modules/@dsh-std/core/lib/index.js +424 -0
- package/vendor/dsh-std/packages/manifest/node_modules/@dsh-std/core/lib/index.js.map +1 -0
- package/vendor/dsh-std/packages/manifest/node_modules/@dsh-std/core/package.json +21 -0
- package/vendor/dsh-std/packages/messages/node_modules/@dsh-std/core/CHANGELOG.md +8 -0
- package/vendor/dsh-std/packages/messages/node_modules/@dsh-std/core/LICENSE +21 -0
- package/vendor/dsh-std/packages/messages/node_modules/@dsh-std/core/README.md +13 -0
- package/vendor/dsh-std/packages/messages/node_modules/@dsh-std/core/README.zh.md +13 -0
- package/vendor/dsh-std/packages/messages/node_modules/@dsh-std/core/lib/index.d.ts +112 -0
- package/vendor/dsh-std/packages/messages/node_modules/@dsh-std/core/lib/index.d.ts.map +1 -0
- package/vendor/dsh-std/packages/messages/node_modules/@dsh-std/core/lib/index.js +424 -0
- package/vendor/dsh-std/packages/messages/node_modules/@dsh-std/core/lib/index.js.map +1 -0
- package/vendor/dsh-std/packages/messages/node_modules/@dsh-std/core/package.json +21 -0
- package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/connection/CHANGELOG.md +8 -0
- package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/connection/LICENSE +21 -0
- package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/connection/README.md +42 -0
- package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/connection/README.zh.md +42 -0
- package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/connection/lib/connection-CdGcSQnu.d.ts +125 -0
- package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/connection/lib/connection-CdGcSQnu.d.ts.map +1 -0
- package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/connection/lib/index.d.ts +89 -0
- package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/connection/lib/index.d.ts.map +1 -0
- package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/connection/lib/index.js +158 -0
- package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/connection/lib/index.js.map +1 -0
- package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/connection/lib/memory.d.ts +24 -0
- package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/connection/lib/memory.d.ts.map +1 -0
- package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/connection/lib/memory.js +258 -0
- package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/connection/lib/memory.js.map +1 -0
- package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/connection/lib/resolve-3X6ausgz.js +226 -0
- package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/connection/lib/resolve-3X6ausgz.js.map +1 -0
- package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/connection/package.json +20 -0
- package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/core/CHANGELOG.md +8 -0
- package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/core/LICENSE +21 -0
- package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/core/README.md +13 -0
- package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/core/README.zh.md +13 -0
- package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/core/lib/index.d.ts +112 -0
- package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/core/lib/index.d.ts.map +1 -0
- package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/core/lib/index.js +424 -0
- package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/core/lib/index.js.map +1 -0
- package/vendor/dsh-std/packages/presentation/node_modules/@dsh-std/core/package.json +21 -0
- package/vendor/dsh-std/packages/storage/node_modules/@dsh-std/core/CHANGELOG.md +8 -0
- package/vendor/dsh-std/packages/storage/node_modules/@dsh-std/core/LICENSE +21 -0
- package/vendor/dsh-std/packages/storage/node_modules/@dsh-std/core/README.md +13 -0
- package/vendor/dsh-std/packages/storage/node_modules/@dsh-std/core/README.zh.md +13 -0
- package/vendor/dsh-std/packages/storage/node_modules/@dsh-std/core/lib/index.d.ts +112 -0
- package/vendor/dsh-std/packages/storage/node_modules/@dsh-std/core/lib/index.d.ts.map +1 -0
- package/vendor/dsh-std/packages/storage/node_modules/@dsh-std/core/lib/index.js +424 -0
- package/vendor/dsh-std/packages/storage/node_modules/@dsh-std/core/lib/index.js.map +1 -0
- package/vendor/dsh-std/packages/storage/node_modules/@dsh-std/core/package.json +21 -0
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { CapabilityCall, CapabilityClient, CapabilityHandlerContext, CapabilityImplementation } from "@dsh-std/connection";
|
|
2
|
+
import { PresentationClients, PresentationDescriptor } from "@dsh-std/presentation";
|
|
3
|
+
import { ProtocolCatalog, ProtocolDefinition, ProtocolSupport } from "@dsh-std/core";
|
|
4
|
+
import { ManifestDefinitionCatalog, ManifestExtension } from "@dsh-std/manifest";
|
|
5
|
+
//#region src/index.d.ts
|
|
6
|
+
declare const API_VERSION = "commands.dsh/v1alpha1";
|
|
7
|
+
declare const KIND = "Command";
|
|
8
|
+
declare const RUNTIME_KIND = "CommandRuntime";
|
|
9
|
+
/** Stable reference to one declared command path. */
|
|
10
|
+
interface CommandReference {
|
|
11
|
+
readonly name: string;
|
|
12
|
+
readonly path?: readonly string[];
|
|
13
|
+
}
|
|
14
|
+
interface CommandValueSpec {
|
|
15
|
+
readonly value: string;
|
|
16
|
+
readonly title?: string;
|
|
17
|
+
readonly titles?: Readonly<Record<string, string>>;
|
|
18
|
+
}
|
|
19
|
+
interface CommandArgumentSpec {
|
|
20
|
+
readonly name: string;
|
|
21
|
+
readonly title?: string;
|
|
22
|
+
readonly titles?: Readonly<Record<string, string>>;
|
|
23
|
+
readonly required?: boolean;
|
|
24
|
+
readonly variadic?: boolean;
|
|
25
|
+
readonly values?: readonly CommandValueSpec[];
|
|
26
|
+
}
|
|
27
|
+
interface CommandOptionSpec {
|
|
28
|
+
/** Literal spellings such as `--verbose` and `-v`. */
|
|
29
|
+
readonly names: readonly string[];
|
|
30
|
+
readonly title: string;
|
|
31
|
+
readonly titles?: Readonly<Record<string, string>>;
|
|
32
|
+
readonly value?: CommandArgumentSpec;
|
|
33
|
+
}
|
|
34
|
+
interface CommandNodeSpec {
|
|
35
|
+
readonly title: string;
|
|
36
|
+
readonly titles?: Readonly<Record<string, string>>;
|
|
37
|
+
readonly description?: string;
|
|
38
|
+
readonly aliases?: readonly string[];
|
|
39
|
+
readonly arguments?: readonly CommandArgumentSpec[];
|
|
40
|
+
readonly options?: readonly CommandOptionSpec[];
|
|
41
|
+
readonly children?: readonly CommandNode[];
|
|
42
|
+
}
|
|
43
|
+
interface CommandNode {
|
|
44
|
+
readonly name: string;
|
|
45
|
+
readonly spec: CommandNodeSpec;
|
|
46
|
+
}
|
|
47
|
+
type CommandSpec = CommandNodeSpec;
|
|
48
|
+
type CommandResource = ManifestExtension<CommandSpec>;
|
|
49
|
+
interface CommandOwnerReference {
|
|
50
|
+
readonly component: string;
|
|
51
|
+
readonly facet: string;
|
|
52
|
+
readonly participantId?: string;
|
|
53
|
+
}
|
|
54
|
+
interface CommandDescriptor {
|
|
55
|
+
readonly name: string;
|
|
56
|
+
readonly description: string;
|
|
57
|
+
readonly input?: {
|
|
58
|
+
readonly hint: string;
|
|
59
|
+
};
|
|
60
|
+
readonly owner: CommandOwnerReference;
|
|
61
|
+
readonly resource: CommandResource;
|
|
62
|
+
readonly available: boolean;
|
|
63
|
+
readonly missingPresentation: readonly ProtocolSupport[];
|
|
64
|
+
readonly issues: readonly {
|
|
65
|
+
readonly code: string;
|
|
66
|
+
readonly message: string;
|
|
67
|
+
}[];
|
|
68
|
+
}
|
|
69
|
+
interface CommandCatalog {
|
|
70
|
+
readonly apiVersion: typeof API_VERSION;
|
|
71
|
+
readonly commands: readonly CommandDescriptor[];
|
|
72
|
+
}
|
|
73
|
+
interface CommandCatalogInput {
|
|
74
|
+
/** Opaque execution context selected by the consuming product. */
|
|
75
|
+
readonly contextId: string;
|
|
76
|
+
readonly presentation?: PresentationDescriptor;
|
|
77
|
+
}
|
|
78
|
+
interface CommandExecutionInput extends CommandCatalogInput {
|
|
79
|
+
readonly line: string;
|
|
80
|
+
}
|
|
81
|
+
interface CommandExecution {
|
|
82
|
+
readonly apiVersion: typeof API_VERSION;
|
|
83
|
+
readonly commandId: string;
|
|
84
|
+
readonly result: {
|
|
85
|
+
readonly kind: 'success' | 'error';
|
|
86
|
+
readonly text?: string;
|
|
87
|
+
readonly sourceEventSeq?: number;
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
type CommandRuntimeCall = {
|
|
91
|
+
readonly operation: 'catalog';
|
|
92
|
+
readonly input: CommandCatalogInput;
|
|
93
|
+
readonly output: CommandCatalog;
|
|
94
|
+
} | {
|
|
95
|
+
readonly operation: 'execute';
|
|
96
|
+
readonly input: CommandExecutionInput;
|
|
97
|
+
readonly output: CommandExecution | undefined;
|
|
98
|
+
};
|
|
99
|
+
interface CommandRuntimeClient {
|
|
100
|
+
catalog(input: CommandCatalogInput, options?: {
|
|
101
|
+
readonly signal?: AbortSignal;
|
|
102
|
+
}): CapabilityCall<CommandCatalog>;
|
|
103
|
+
execute(input: CommandExecutionInput, options?: {
|
|
104
|
+
readonly signal?: AbortSignal;
|
|
105
|
+
}): CapabilityCall<CommandExecution | undefined>;
|
|
106
|
+
}
|
|
107
|
+
interface CommandRuntimeHandler {
|
|
108
|
+
catalog(input: CommandCatalogInput, context: CapabilityHandlerContext): CommandCatalog | Promise<CommandCatalog>;
|
|
109
|
+
execute(input: CommandExecutionInput, context: CapabilityHandlerContext): CommandExecution | undefined | Promise<CommandExecution | undefined>;
|
|
110
|
+
}
|
|
111
|
+
interface CommandHandlerInput {
|
|
112
|
+
readonly rawInput: string;
|
|
113
|
+
}
|
|
114
|
+
interface CommandHandlerContext {
|
|
115
|
+
readonly signal: AbortSignal;
|
|
116
|
+
/** Host-bound clients for Presentation agreements active in this invocation. */
|
|
117
|
+
readonly presentation?: PresentationClients;
|
|
118
|
+
}
|
|
119
|
+
interface CommandHandler {
|
|
120
|
+
execute(input: CommandHandlerInput, context: CommandHandlerContext): CommandExecution['result'] | Promise<CommandExecution['result']>;
|
|
121
|
+
}
|
|
122
|
+
declare function assertCommandHandler(value: unknown): asserts value is CommandHandler;
|
|
123
|
+
declare const extensionDefinition: Readonly<{
|
|
124
|
+
apiVersion: "commands.dsh/v1alpha1";
|
|
125
|
+
kind: "Command";
|
|
126
|
+
validateMetadata(metadata: {
|
|
127
|
+
readonly name: string;
|
|
128
|
+
}): void;
|
|
129
|
+
validateSpec(value: unknown): void;
|
|
130
|
+
}>;
|
|
131
|
+
/** Host support for accepting and owning Command resource publications. */
|
|
132
|
+
declare const resourceProtocol: ProtocolDefinition;
|
|
133
|
+
declare const resourceSupport: ProtocolSupport;
|
|
134
|
+
/** Callable, resource-keyed command dispatcher implemented once by a Runtime adapter. */
|
|
135
|
+
declare const runtimeProtocol: ProtocolDefinition<unknown, unknown, unknown, unknown>;
|
|
136
|
+
declare const runtimeSupport: ProtocolSupport;
|
|
137
|
+
/** Bind the typed CommandRuntime operations to a consumer-scoped connection client. */
|
|
138
|
+
declare function commandRuntime(client: CapabilityClient): CommandRuntimeClient;
|
|
139
|
+
/** Create the sole Runtime-side dispatcher implementation for every Command resource. */
|
|
140
|
+
declare function commandRuntimeImplementation(participantId: string, handler: CommandRuntimeHandler): CapabilityImplementation;
|
|
141
|
+
declare function register(protocols: ProtocolCatalog, manifest?: ManifestDefinitionCatalog): () => void;
|
|
142
|
+
//#endregion
|
|
143
|
+
export { API_VERSION, CommandArgumentSpec, CommandCatalog, CommandCatalogInput, CommandDescriptor, CommandExecution, CommandExecutionInput, CommandHandler, CommandHandlerContext, CommandHandlerInput, CommandNode, CommandNodeSpec, CommandOptionSpec, CommandOwnerReference, CommandReference, CommandResource, CommandRuntimeCall, CommandRuntimeClient, CommandRuntimeHandler, CommandSpec, CommandValueSpec, KIND, RUNTIME_KIND, assertCommandHandler, commandRuntime, commandRuntimeImplementation, extensionDefinition, register, resourceProtocol, resourceSupport, runtimeProtocol, runtimeSupport };
|
|
144
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/index.ts"],"mappings":";;;;;cAoBa;cACA;cACA;;UAGI;WACN;WACA;;UAGM;WACN;WACA;WACA,SAAS,SAAS;;UAGZ;WACN;WACA;WACA,SAAS,SAAS;WAClB;WACA;WACA,kBAAkB;;UAGZ;;WAEN;WACA;WACA,SAAS,SAAS;WAClB,QAAQ;;UAGF;WACN;WACA,SAAS,SAAS;WAClB;WACA;WACA,qBAAqB;WACrB,mBAAmB;WACnB,oBAAoB;;UAGd;WACN;WACA,MAAM;;KAGL,cAAc;KAEd,kBAAkB,kBAAkB;UAE/B;WACN;WACA;WACA;;UAGM;WACN;WACA;WACA;aAAmB;;WACnB,OAAO;WACP,UAAU;WACV;WACA,8BAA8B;WAC9B;aAA4B;aAAuB;;;UAG7C;WACN,mBAAmB;WACnB,mBAAmB;;UAGb;;WAEN;WACA,eAAe;;UAGT,8BAA8B;WACpC;;UAGM;WACN,mBAAmB;WACnB;WACA;aACE;aACA;aACA;;;KAID;WACG;WAA+B,OAAO;WAA8B,QAAQ;;WAC5E;WAA+B,OAAO;WAAgC,QAAQ;;UAE5E;EACf,QAAQ,OAAO,qBAAqB;aAAqB,SAAS;MAAgB,eAAe;EACjG,QAAQ,OAAO,uBAAuB;aAAqB,SAAS;MAAgB,eAAe;;UAGpF;EACf,QAAQ,OAAO,qBAAqB,SAAS,2BAA2B,iBAAiB,QAAQ;EACjG,QACE,OAAO,uBACP,SAAS,2BACR,+BAA+B,QAAQ;;UAG3B;WACN;;UAGM;WACN,QAAQ;;WAER,eAAe;;UAGT;EACf,QACE,OAAO,qBACP,SAAS,wBACR,6BAA6B,QAAQ;;iBAG1B,qBAAqB,yBAAyB,SAAS;cAM1D,qBAAmB;;;EAGH,iBAAA;aAAW;;EAGlB,aAAA;;;cAMT,kBAAkB;cAuBlB,iBAAiB;;cAMjB,iBAAe;cAKf,gBAAgB;;iBAMb,eAAe,QAAQ,mBAAmB;;iBAY1C,6BACd,uBACA,SAAS,wBACR;iBAYa,SAAS,WAAW,iBAAiB,WAAW"}
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
import { defineCapabilityProtocol } from "@dsh-std/connection";
|
|
2
|
+
import { validatePresentationDescriptor } from "@dsh-std/presentation";
|
|
3
|
+
//#region src/index.ts
|
|
4
|
+
const API_VERSION = "commands.dsh/v1alpha1";
|
|
5
|
+
const KIND = "Command";
|
|
6
|
+
const RUNTIME_KIND = "CommandRuntime";
|
|
7
|
+
function assertCommandHandler(value) {
|
|
8
|
+
if (!record(value) || typeof value.execute !== "function") throw new TypeError("Command handler must provide execute(input, context)");
|
|
9
|
+
}
|
|
10
|
+
const extensionDefinition = Object.freeze({
|
|
11
|
+
apiVersion: API_VERSION,
|
|
12
|
+
kind: KIND,
|
|
13
|
+
validateMetadata(metadata) {
|
|
14
|
+
if (!/^[a-z][a-z0-9_-]*$/u.test(metadata.name)) throw new TypeError("Command metadata.name is invalid");
|
|
15
|
+
},
|
|
16
|
+
validateSpec(value) {
|
|
17
|
+
validateNodeSpec(value, "Command spec");
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
/** Host support for accepting and owning Command resource publications. */
|
|
21
|
+
const resourceProtocol = Object.freeze({
|
|
22
|
+
apiVersion: API_VERSION,
|
|
23
|
+
kind: KIND,
|
|
24
|
+
validateRequirement: emptyProtocolSpec,
|
|
25
|
+
validateSupport: emptyProtocolSpec,
|
|
26
|
+
negotiate(input) {
|
|
27
|
+
const issues = [];
|
|
28
|
+
for (const row of input.requirements) {
|
|
29
|
+
if (input.supports.some((candidate) => candidate.participant !== row.participant)) continue;
|
|
30
|
+
issues.push(Object.freeze({
|
|
31
|
+
code: row.requirement.optional === true ? "optional-support-missing" : "required-support-missing",
|
|
32
|
+
severity: row.requirement.optional === true ? "warning" : "error",
|
|
33
|
+
participant: row.participant,
|
|
34
|
+
message: `no participant accepts ${row.requirement.apiVersion} ${row.requirement.kind} resources`
|
|
35
|
+
}));
|
|
36
|
+
}
|
|
37
|
+
return {
|
|
38
|
+
agreement: Object.freeze({ kind: "ResourcePublication" }),
|
|
39
|
+
issues: Object.freeze(issues)
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
const resourceSupport = Object.freeze({
|
|
44
|
+
apiVersion: API_VERSION,
|
|
45
|
+
kind: KIND
|
|
46
|
+
});
|
|
47
|
+
/** Callable, resource-keyed command dispatcher implemented once by a Runtime adapter. */
|
|
48
|
+
const runtimeProtocol = defineCapabilityProtocol({
|
|
49
|
+
apiVersion: API_VERSION,
|
|
50
|
+
kind: RUNTIME_KIND
|
|
51
|
+
});
|
|
52
|
+
const runtimeSupport = Object.freeze({
|
|
53
|
+
apiVersion: API_VERSION,
|
|
54
|
+
kind: RUNTIME_KIND
|
|
55
|
+
});
|
|
56
|
+
/** Bind the typed CommandRuntime operations to a consumer-scoped connection client. */
|
|
57
|
+
function commandRuntime(client) {
|
|
58
|
+
return Object.freeze({
|
|
59
|
+
catalog(input, options) {
|
|
60
|
+
return client.invoke(runtimeSupport, "catalog", validateCatalogInput(input), options);
|
|
61
|
+
},
|
|
62
|
+
execute(input, options) {
|
|
63
|
+
return client.invoke(runtimeSupport, "execute", validateExecutionInput(input), options);
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
/** Create the sole Runtime-side dispatcher implementation for every Command resource. */
|
|
68
|
+
function commandRuntimeImplementation(participantId, handler) {
|
|
69
|
+
return Object.freeze({
|
|
70
|
+
participantId,
|
|
71
|
+
protocol: runtimeSupport,
|
|
72
|
+
handle(operation, input, context) {
|
|
73
|
+
if (operation === "catalog") return handler.catalog(validateCatalogInput(input), context);
|
|
74
|
+
if (operation === "execute") return handler.execute(validateExecutionInput(input), context);
|
|
75
|
+
throw new TypeError(`unsupported CommandRuntime operation ${JSON.stringify(operation)}`);
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
function register(protocols, manifest) {
|
|
80
|
+
const disposeResource = manifest?.registerExtension(extensionDefinition) ?? (() => void 0);
|
|
81
|
+
const disposeResourceProtocol = protocols.register(resourceProtocol);
|
|
82
|
+
const disposeRuntime = protocols.register(runtimeProtocol);
|
|
83
|
+
return () => {
|
|
84
|
+
disposeRuntime();
|
|
85
|
+
disposeResourceProtocol();
|
|
86
|
+
disposeResource();
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
function emptyProtocolSpec(value) {
|
|
90
|
+
if (value !== void 0) throw new TypeError("Command resource protocol does not accept spec");
|
|
91
|
+
}
|
|
92
|
+
function record(value) {
|
|
93
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
94
|
+
}
|
|
95
|
+
function validateCatalogInput(value) {
|
|
96
|
+
if (!record(value)) throw new TypeError("CommandRuntime.catalog input must be an object");
|
|
97
|
+
exact(value, ["contextId", "presentation"], "CommandRuntime.catalog input");
|
|
98
|
+
text(value.contextId, "CommandRuntime.catalog input.contextId");
|
|
99
|
+
if (value.presentation !== void 0) validatePresentationDescriptor(value.presentation);
|
|
100
|
+
return Object.freeze({
|
|
101
|
+
contextId: value.contextId,
|
|
102
|
+
...value.presentation === void 0 ? {} : { presentation: value.presentation }
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
function validateExecutionInput(value) {
|
|
106
|
+
if (!record(value)) throw new TypeError("CommandRuntime.execute input must be an object");
|
|
107
|
+
exact(value, [
|
|
108
|
+
"contextId",
|
|
109
|
+
"line",
|
|
110
|
+
"presentation"
|
|
111
|
+
], "CommandRuntime.execute input");
|
|
112
|
+
const catalog = validateCatalogInput({
|
|
113
|
+
contextId: value.contextId,
|
|
114
|
+
...value.presentation === void 0 ? {} : { presentation: value.presentation }
|
|
115
|
+
});
|
|
116
|
+
text(value.line, "CommandRuntime.execute input.line");
|
|
117
|
+
return Object.freeze({
|
|
118
|
+
...catalog,
|
|
119
|
+
line: value.line
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
function validateNodeSpec(value, label) {
|
|
123
|
+
if (!record(value)) throw new TypeError(`${label} must be an object`);
|
|
124
|
+
exact(value, [
|
|
125
|
+
"title",
|
|
126
|
+
"titles",
|
|
127
|
+
"description",
|
|
128
|
+
"aliases",
|
|
129
|
+
"arguments",
|
|
130
|
+
"options",
|
|
131
|
+
"children"
|
|
132
|
+
], label);
|
|
133
|
+
text(value.title, `${label}.title`);
|
|
134
|
+
if (value.description !== void 0) text(value.description, `${label}.description`);
|
|
135
|
+
if (value.titles !== void 0) localized(value.titles, `${label}.titles`);
|
|
136
|
+
if (value.aliases !== void 0) tokens(value.aliases, `${label}.aliases`);
|
|
137
|
+
if (value.arguments !== void 0) argumentsList(value.arguments, `${label}.arguments`);
|
|
138
|
+
if (value.options !== void 0) optionsList(value.options, `${label}.options`);
|
|
139
|
+
if (value.children !== void 0) children(value.children, `${label}.children`);
|
|
140
|
+
}
|
|
141
|
+
function argumentsList(value, label) {
|
|
142
|
+
if (!Array.isArray(value)) throw new TypeError(`${label} must be an array`);
|
|
143
|
+
const names = /* @__PURE__ */ new Set();
|
|
144
|
+
for (const [index, argument] of value.entries()) {
|
|
145
|
+
const item = `${label}[${index}]`;
|
|
146
|
+
if (!record(argument)) throw new TypeError(`${item} must be an object`);
|
|
147
|
+
exact(argument, [
|
|
148
|
+
"name",
|
|
149
|
+
"title",
|
|
150
|
+
"titles",
|
|
151
|
+
"required",
|
|
152
|
+
"variadic",
|
|
153
|
+
"values"
|
|
154
|
+
], item);
|
|
155
|
+
token(argument.name, `${item}.name`);
|
|
156
|
+
if (names.has(argument.name)) throw new TypeError(`${label} contains a duplicate argument`);
|
|
157
|
+
names.add(argument.name);
|
|
158
|
+
if (argument.title !== void 0) text(argument.title, `${item}.title`);
|
|
159
|
+
if (argument.titles !== void 0) localized(argument.titles, `${item}.titles`);
|
|
160
|
+
if (argument.required !== void 0 && typeof argument.required !== "boolean") throw new TypeError(`${item}.required must be boolean`);
|
|
161
|
+
if (argument.variadic !== void 0 && typeof argument.variadic !== "boolean") throw new TypeError(`${item}.variadic must be boolean`);
|
|
162
|
+
if (argument.variadic === true && index !== value.length - 1) throw new TypeError(`${item} must be the last argument when variadic`);
|
|
163
|
+
if (argument.values !== void 0) values(argument.values, `${item}.values`);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
function optionsList(value, label) {
|
|
167
|
+
if (!Array.isArray(value)) throw new TypeError(`${label} must be an array`);
|
|
168
|
+
const names = /* @__PURE__ */ new Set();
|
|
169
|
+
for (const [index, option] of value.entries()) {
|
|
170
|
+
const item = `${label}[${index}]`;
|
|
171
|
+
if (!record(option)) throw new TypeError(`${item} must be an object`);
|
|
172
|
+
exact(option, [
|
|
173
|
+
"names",
|
|
174
|
+
"title",
|
|
175
|
+
"titles",
|
|
176
|
+
"value"
|
|
177
|
+
], item);
|
|
178
|
+
text(option.title, `${item}.title`);
|
|
179
|
+
if (option.titles !== void 0) localized(option.titles, `${item}.titles`);
|
|
180
|
+
if (!Array.isArray(option.names) || option.names.length === 0) throw new TypeError(`${item}.names must be a non-empty array`);
|
|
181
|
+
for (const name of option.names) {
|
|
182
|
+
if (typeof name !== "string" || !/^-{1,2}[^\s-][^\s]*$/u.test(name)) throw new TypeError(`${item}.names contains an invalid option`);
|
|
183
|
+
if (names.has(name)) throw new TypeError(`${label} contains a duplicate option name`);
|
|
184
|
+
names.add(name);
|
|
185
|
+
}
|
|
186
|
+
if (option.value !== void 0) argumentsList([option.value], `${item}.value`);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
function children(value, label) {
|
|
190
|
+
if (!Array.isArray(value)) throw new TypeError(`${label} must be an array`);
|
|
191
|
+
const names = /* @__PURE__ */ new Set();
|
|
192
|
+
for (const [index, child] of value.entries()) {
|
|
193
|
+
const item = `${label}[${index}]`;
|
|
194
|
+
if (!record(child)) throw new TypeError(`${item} must be an object`);
|
|
195
|
+
exact(child, ["name", "spec"], item);
|
|
196
|
+
token(child.name, `${item}.name`);
|
|
197
|
+
for (const name of [child.name, ...Array.isArray(child.spec?.aliases) ? child.spec.aliases : []]) {
|
|
198
|
+
if (typeof name !== "string") continue;
|
|
199
|
+
if (names.has(name)) throw new TypeError(`${label} contains a duplicate name or alias`);
|
|
200
|
+
names.add(name);
|
|
201
|
+
}
|
|
202
|
+
validateNodeSpec(child.spec, `${item}.spec`);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
function values(value, label) {
|
|
206
|
+
if (!Array.isArray(value)) throw new TypeError(`${label} must be an array`);
|
|
207
|
+
const seen = /* @__PURE__ */ new Set();
|
|
208
|
+
for (const [index, choice] of value.entries()) {
|
|
209
|
+
const item = `${label}[${index}]`;
|
|
210
|
+
if (!record(choice)) throw new TypeError(`${item} must be an object`);
|
|
211
|
+
exact(choice, [
|
|
212
|
+
"value",
|
|
213
|
+
"title",
|
|
214
|
+
"titles"
|
|
215
|
+
], item);
|
|
216
|
+
text(choice.value, `${item}.value`);
|
|
217
|
+
if (seen.has(choice.value)) throw new TypeError(`${label} contains a duplicate value`);
|
|
218
|
+
seen.add(choice.value);
|
|
219
|
+
if (choice.title !== void 0) text(choice.title, `${item}.title`);
|
|
220
|
+
if (choice.titles !== void 0) localized(choice.titles, `${item}.titles`);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
function localized(value, label) {
|
|
224
|
+
if (!record(value)) throw new TypeError(`${label} must be an object`);
|
|
225
|
+
for (const [locale, translation] of Object.entries(value)) {
|
|
226
|
+
if (locale.trim() === "") throw new TypeError(`${label} contains an empty locale`);
|
|
227
|
+
text(translation, `${label}.${locale}`);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
function tokens(value, label) {
|
|
231
|
+
if (!Array.isArray(value)) throw new TypeError(`${label} must be an array`);
|
|
232
|
+
const seen = /* @__PURE__ */ new Set();
|
|
233
|
+
for (const valueItem of value) {
|
|
234
|
+
token(valueItem, label);
|
|
235
|
+
if (seen.has(valueItem)) throw new TypeError(`${label} contains a duplicate token`);
|
|
236
|
+
seen.add(valueItem);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
function token(value, label) {
|
|
240
|
+
if (typeof value !== "string" || !/^[^\s/]+$/u.test(value)) throw new TypeError(`${label} must be one token`);
|
|
241
|
+
}
|
|
242
|
+
function text(value, label) {
|
|
243
|
+
if (typeof value !== "string" || value.trim() === "") throw new TypeError(`${label} must be a non-empty string`);
|
|
244
|
+
}
|
|
245
|
+
function exact(value, allowed, label) {
|
|
246
|
+
const unknown = Object.keys(value).filter((key) => !allowed.includes(key) && !key.startsWith("x-"));
|
|
247
|
+
if (unknown.length > 0) throw new TypeError(`${label} contains unknown field ${JSON.stringify(unknown[0])}`);
|
|
248
|
+
}
|
|
249
|
+
//#endregion
|
|
250
|
+
export { API_VERSION, KIND, RUNTIME_KIND, assertCommandHandler, commandRuntime, commandRuntimeImplementation, extensionDefinition, register, resourceProtocol, resourceSupport, runtimeProtocol, runtimeSupport };
|
|
251
|
+
|
|
252
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["import type {\n ProtocolCatalog,\n ProtocolDefinition,\n ProtocolIssue,\n ProtocolSupport,\n} from '@dsh-std/core'\nimport type { ManifestDefinitionCatalog, ManifestExtension } from '@dsh-std/manifest'\nimport type {\n CapabilityCall,\n CapabilityClient,\n CapabilityHandlerContext,\n CapabilityImplementation,\n} from '@dsh-std/connection'\nimport { defineCapabilityProtocol } from '@dsh-std/connection'\nimport {\n validatePresentationDescriptor,\n type PresentationClients,\n type PresentationDescriptor,\n} from '@dsh-std/presentation'\n\nexport const API_VERSION = 'commands.dsh/v1alpha1'\nexport const KIND = 'Command'\nexport const RUNTIME_KIND = 'CommandRuntime'\n\n/** Stable reference to one declared command path. */\nexport interface CommandReference {\n readonly name: string\n readonly path?: readonly string[]\n}\n\nexport interface CommandValueSpec {\n readonly value: string\n readonly title?: string\n readonly titles?: Readonly<Record<string, string>>\n}\n\nexport interface CommandArgumentSpec {\n readonly name: string\n readonly title?: string\n readonly titles?: Readonly<Record<string, string>>\n readonly required?: boolean\n readonly variadic?: boolean\n readonly values?: readonly CommandValueSpec[]\n}\n\nexport interface CommandOptionSpec {\n /** Literal spellings such as `--verbose` and `-v`. */\n readonly names: readonly string[]\n readonly title: string\n readonly titles?: Readonly<Record<string, string>>\n readonly value?: CommandArgumentSpec\n}\n\nexport interface CommandNodeSpec {\n readonly title: string\n readonly titles?: Readonly<Record<string, string>>\n readonly description?: string\n readonly aliases?: readonly string[]\n readonly arguments?: readonly CommandArgumentSpec[]\n readonly options?: readonly CommandOptionSpec[]\n readonly children?: readonly CommandNode[]\n}\n\nexport interface CommandNode {\n readonly name: string\n readonly spec: CommandNodeSpec\n}\n\nexport type CommandSpec = CommandNodeSpec\n\nexport type CommandResource = ManifestExtension<CommandSpec>\n\nexport interface CommandOwnerReference {\n readonly component: string\n readonly facet: string\n readonly participantId?: string\n}\n\nexport interface CommandDescriptor {\n readonly name: string\n readonly description: string\n readonly input?: { readonly hint: string }\n readonly owner: CommandOwnerReference\n readonly resource: CommandResource\n readonly available: boolean\n readonly missingPresentation: readonly ProtocolSupport[]\n readonly issues: readonly { readonly code: string; readonly message: string }[]\n}\n\nexport interface CommandCatalog {\n readonly apiVersion: typeof API_VERSION\n readonly commands: readonly CommandDescriptor[]\n}\n\nexport interface CommandCatalogInput {\n /** Opaque execution context selected by the consuming product. */\n readonly contextId: string\n readonly presentation?: PresentationDescriptor\n}\n\nexport interface CommandExecutionInput extends CommandCatalogInput {\n readonly line: string\n}\n\nexport interface CommandExecution {\n readonly apiVersion: typeof API_VERSION\n readonly commandId: string\n readonly result: {\n readonly kind: 'success' | 'error'\n readonly text?: string\n readonly sourceEventSeq?: number\n }\n}\n\nexport type CommandRuntimeCall =\n | { readonly operation: 'catalog'; readonly input: CommandCatalogInput; readonly output: CommandCatalog }\n | { readonly operation: 'execute'; readonly input: CommandExecutionInput; readonly output: CommandExecution | undefined }\n\nexport interface CommandRuntimeClient {\n catalog(input: CommandCatalogInput, options?: { readonly signal?: AbortSignal }): CapabilityCall<CommandCatalog>\n execute(input: CommandExecutionInput, options?: { readonly signal?: AbortSignal }): CapabilityCall<CommandExecution | undefined>\n}\n\nexport interface CommandRuntimeHandler {\n catalog(input: CommandCatalogInput, context: CapabilityHandlerContext): CommandCatalog | Promise<CommandCatalog>\n execute(\n input: CommandExecutionInput,\n context: CapabilityHandlerContext,\n ): CommandExecution | undefined | Promise<CommandExecution | undefined>\n}\n\nexport interface CommandHandlerInput {\n readonly rawInput: string\n}\n\nexport interface CommandHandlerContext {\n readonly signal: AbortSignal\n /** Host-bound clients for Presentation agreements active in this invocation. */\n readonly presentation?: PresentationClients\n}\n\nexport interface CommandHandler {\n execute(\n input: CommandHandlerInput,\n context: CommandHandlerContext,\n ): CommandExecution['result'] | Promise<CommandExecution['result']>\n}\n\nexport function assertCommandHandler(value: unknown): asserts value is CommandHandler {\n if (!record(value) || typeof value.execute !== 'function') {\n throw new TypeError('Command handler must provide execute(input, context)')\n }\n}\n\nexport const extensionDefinition = Object.freeze({\n apiVersion: API_VERSION,\n kind: KIND,\n validateMetadata(metadata: { readonly name: string }): void {\n if (!/^[a-z][a-z0-9_-]*$/u.test(metadata.name)) throw new TypeError('Command metadata.name is invalid')\n },\n validateSpec(value: unknown): void {\n validateNodeSpec(value, 'Command spec')\n },\n})\n\n/** Host support for accepting and owning Command resource publications. */\nexport const resourceProtocol: ProtocolDefinition = Object.freeze({\n apiVersion: API_VERSION,\n kind: KIND,\n validateRequirement: emptyProtocolSpec,\n validateSupport: emptyProtocolSpec,\n negotiate(input) {\n const issues: ProtocolIssue[] = []\n for (const row of input.requirements) {\n if (input.supports.some(candidate => candidate.participant !== row.participant)) continue\n issues.push(Object.freeze({\n code: row.requirement.optional === true ? 'optional-support-missing' : 'required-support-missing',\n severity: row.requirement.optional === true ? 'warning' : 'error',\n participant: row.participant,\n message: `no participant accepts ${row.requirement.apiVersion} ${row.requirement.kind} resources`,\n }))\n }\n return {\n agreement: Object.freeze({ kind: 'ResourcePublication' as const }),\n issues: Object.freeze(issues),\n }\n },\n} satisfies ProtocolDefinition)\n\nexport const resourceSupport: ProtocolSupport = Object.freeze({\n apiVersion: API_VERSION,\n kind: KIND,\n})\n\n/** Callable, resource-keyed command dispatcher implemented once by a Runtime adapter. */\nexport const runtimeProtocol = defineCapabilityProtocol({\n apiVersion: API_VERSION,\n kind: RUNTIME_KIND,\n})\n\nexport const runtimeSupport: ProtocolSupport = Object.freeze({\n apiVersion: API_VERSION,\n kind: RUNTIME_KIND,\n})\n\n/** Bind the typed CommandRuntime operations to a consumer-scoped connection client. */\nexport function commandRuntime(client: CapabilityClient): CommandRuntimeClient {\n return Object.freeze({\n catalog(input: CommandCatalogInput, options?: { readonly signal?: AbortSignal }) {\n return client.invoke<CommandCatalogInput, CommandCatalog>(runtimeSupport, 'catalog', validateCatalogInput(input), options)\n },\n execute(input: CommandExecutionInput, options?: { readonly signal?: AbortSignal }) {\n return client.invoke<CommandExecutionInput, CommandExecution | undefined>(runtimeSupport, 'execute', validateExecutionInput(input), options)\n },\n })\n}\n\n/** Create the sole Runtime-side dispatcher implementation for every Command resource. */\nexport function commandRuntimeImplementation(\n participantId: string,\n handler: CommandRuntimeHandler,\n): CapabilityImplementation {\n return Object.freeze({\n participantId,\n protocol: runtimeSupport,\n handle(operation: string, input: unknown, context: CapabilityHandlerContext) {\n if (operation === 'catalog') return handler.catalog(validateCatalogInput(input), context)\n if (operation === 'execute') return handler.execute(validateExecutionInput(input), context)\n throw new TypeError(`unsupported CommandRuntime operation ${JSON.stringify(operation)}`)\n },\n })\n}\n\nexport function register(protocols: ProtocolCatalog, manifest?: ManifestDefinitionCatalog): () => void {\n const disposeResource = manifest?.registerExtension(extensionDefinition) ?? (() => undefined)\n const disposeResourceProtocol = protocols.register(resourceProtocol)\n const disposeRuntime = protocols.register(runtimeProtocol)\n return () => {\n disposeRuntime()\n disposeResourceProtocol()\n disposeResource()\n }\n}\n\nfunction emptyProtocolSpec(value: unknown): undefined {\n if (value !== undefined) throw new TypeError('Command resource protocol does not accept spec')\n return undefined\n}\n\nfunction record(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction validateCatalogInput(value: unknown): CommandCatalogInput {\n if (!record(value)) throw new TypeError('CommandRuntime.catalog input must be an object')\n exact(value, ['contextId', 'presentation'], 'CommandRuntime.catalog input')\n text(value.contextId, 'CommandRuntime.catalog input.contextId')\n if (value.presentation !== undefined) validatePresentationDescriptor(value.presentation)\n return Object.freeze({\n contextId: value.contextId as string,\n ...(value.presentation === undefined ? {} : { presentation: value.presentation as PresentationDescriptor }),\n })\n}\n\nfunction validateExecutionInput(value: unknown): CommandExecutionInput {\n if (!record(value)) throw new TypeError('CommandRuntime.execute input must be an object')\n exact(value, ['contextId', 'line', 'presentation'], 'CommandRuntime.execute input')\n const catalog = validateCatalogInput({\n contextId: value.contextId,\n ...(value.presentation === undefined ? {} : { presentation: value.presentation }),\n })\n text(value.line, 'CommandRuntime.execute input.line')\n return Object.freeze({ ...catalog, line: value.line as string })\n}\n\nfunction validateNodeSpec(value: unknown, label: string): void {\n if (!record(value)) throw new TypeError(`${label} must be an object`)\n exact(value, ['title', 'titles', 'description', 'aliases', 'arguments', 'options', 'children'], label)\n text(value.title, `${label}.title`)\n if (value.description !== undefined) text(value.description, `${label}.description`)\n if (value.titles !== undefined) localized(value.titles, `${label}.titles`)\n if (value.aliases !== undefined) tokens(value.aliases, `${label}.aliases`)\n if (value.arguments !== undefined) argumentsList(value.arguments, `${label}.arguments`)\n if (value.options !== undefined) optionsList(value.options, `${label}.options`)\n if (value.children !== undefined) children(value.children, `${label}.children`)\n}\n\nfunction argumentsList(value: unknown, label: string): void {\n if (!Array.isArray(value)) throw new TypeError(`${label} must be an array`)\n const names = new Set<string>()\n for (const [index, argument] of value.entries()) {\n const item = `${label}[${index}]`\n if (!record(argument)) throw new TypeError(`${item} must be an object`)\n exact(argument, ['name', 'title', 'titles', 'required', 'variadic', 'values'], item)\n token(argument.name, `${item}.name`)\n if (names.has(argument.name as string)) throw new TypeError(`${label} contains a duplicate argument`)\n names.add(argument.name as string)\n if (argument.title !== undefined) text(argument.title, `${item}.title`)\n if (argument.titles !== undefined) localized(argument.titles, `${item}.titles`)\n if (argument.required !== undefined && typeof argument.required !== 'boolean') throw new TypeError(`${item}.required must be boolean`)\n if (argument.variadic !== undefined && typeof argument.variadic !== 'boolean') throw new TypeError(`${item}.variadic must be boolean`)\n if (argument.variadic === true && index !== value.length - 1) throw new TypeError(`${item} must be the last argument when variadic`)\n if (argument.values !== undefined) values(argument.values, `${item}.values`)\n }\n}\n\nfunction optionsList(value: unknown, label: string): void {\n if (!Array.isArray(value)) throw new TypeError(`${label} must be an array`)\n const names = new Set<string>()\n for (const [index, option] of value.entries()) {\n const item = `${label}[${index}]`\n if (!record(option)) throw new TypeError(`${item} must be an object`)\n exact(option, ['names', 'title', 'titles', 'value'], item)\n text(option.title, `${item}.title`)\n if (option.titles !== undefined) localized(option.titles, `${item}.titles`)\n if (!Array.isArray(option.names) || option.names.length === 0) throw new TypeError(`${item}.names must be a non-empty array`)\n for (const name of option.names) {\n if (typeof name !== 'string' || !/^-{1,2}[^\\s-][^\\s]*$/u.test(name)) throw new TypeError(`${item}.names contains an invalid option`)\n if (names.has(name)) throw new TypeError(`${label} contains a duplicate option name`)\n names.add(name)\n }\n if (option.value !== undefined) argumentsList([option.value], `${item}.value`)\n }\n}\n\nfunction children(value: unknown, label: string): void {\n if (!Array.isArray(value)) throw new TypeError(`${label} must be an array`)\n const names = new Set<string>()\n for (const [index, child] of value.entries()) {\n const item = `${label}[${index}]`\n if (!record(child)) throw new TypeError(`${item} must be an object`)\n exact(child, ['name', 'spec'], item)\n token(child.name, `${item}.name`)\n for (const name of [child.name, ...(Array.isArray((child.spec as Record<string, unknown> | undefined)?.aliases) ? (child.spec as { aliases: unknown[] }).aliases : [])]) {\n if (typeof name !== 'string') continue\n if (names.has(name)) throw new TypeError(`${label} contains a duplicate name or alias`)\n names.add(name)\n }\n validateNodeSpec(child.spec, `${item}.spec`)\n }\n}\n\nfunction values(value: unknown, label: string): void {\n if (!Array.isArray(value)) throw new TypeError(`${label} must be an array`)\n const seen = new Set<string>()\n for (const [index, choice] of value.entries()) {\n const item = `${label}[${index}]`\n if (!record(choice)) throw new TypeError(`${item} must be an object`)\n exact(choice, ['value', 'title', 'titles'], item)\n text(choice.value, `${item}.value`)\n if (seen.has(choice.value as string)) throw new TypeError(`${label} contains a duplicate value`)\n seen.add(choice.value as string)\n if (choice.title !== undefined) text(choice.title, `${item}.title`)\n if (choice.titles !== undefined) localized(choice.titles, `${item}.titles`)\n }\n}\n\nfunction localized(value: unknown, label: string): void {\n if (!record(value)) throw new TypeError(`${label} must be an object`)\n for (const [locale, translation] of Object.entries(value)) {\n if (locale.trim() === '') throw new TypeError(`${label} contains an empty locale`)\n text(translation, `${label}.${locale}`)\n }\n}\n\nfunction tokens(value: unknown, label: string): void {\n if (!Array.isArray(value)) throw new TypeError(`${label} must be an array`)\n const seen = new Set<string>()\n for (const valueItem of value) {\n token(valueItem, label)\n if (seen.has(valueItem as string)) throw new TypeError(`${label} contains a duplicate token`)\n seen.add(valueItem as string)\n }\n}\n\nfunction token(value: unknown, label: string): void {\n if (typeof value !== 'string' || !/^[^\\s/]+$/u.test(value)) throw new TypeError(`${label} must be one token`)\n}\n\nfunction text(value: unknown, label: string): void {\n if (typeof value !== 'string' || value.trim() === '') throw new TypeError(`${label} must be a non-empty string`)\n}\n\nfunction exact(value: Record<string, unknown>, allowed: readonly string[], label: string): void {\n const unknown = Object.keys(value).filter(key => !allowed.includes(key) && !key.startsWith('x-'))\n if (unknown.length > 0) throw new TypeError(`${label} contains unknown field ${JSON.stringify(unknown[0])}`)\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@dsh-std/command",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"license": "MIT",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "lib/index.js",
|
|
7
|
+
"types": "lib/index.d.ts",
|
|
8
|
+
"exports": { ".": { "types": "./lib/index.d.ts", "default": "./lib/index.js" } },
|
|
9
|
+
"files": ["lib", "CHANGELOG.md"],
|
|
10
|
+
"scripts": {
|
|
11
|
+
"build": "pnpm run typecheck && tsdown",
|
|
12
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
13
|
+
"test": "vitest run --passWithNoTests"
|
|
14
|
+
},
|
|
15
|
+
"dependencies": {
|
|
16
|
+
"@dsh-std/core": "workspace:*",
|
|
17
|
+
"@dsh-std/manifest": "workspace:*",
|
|
18
|
+
"@dsh-std/connection": "workspace:*",
|
|
19
|
+
"@dsh-std/presentation": "workspace:*"
|
|
20
|
+
},
|
|
21
|
+
"engines": { "node": "^22.19 || >=24" }
|
|
22
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
Changes to `@dsh-std/connection` are recorded here.
|
|
4
|
+
|
|
5
|
+
## 0.1.0 (draft)
|
|
6
|
+
|
|
7
|
+
- Defined connection services, endpoint views, participant publication, capability bindings, and attachments.
|
|
8
|
+
- Added an in-memory transport for protocol conformance and host integration tests.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 DSH Standard contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# @dsh-std/connection
|
|
2
|
+
|
|
3
|
+
English | [中文](README.zh.md)
|
|
4
|
+
|
|
5
|
+
The proposed design is documented in [Endpoint Connection](../../docs/proposals/endpoint-connection.zh.md). It separates the application-facing `ConnectionService` from the Connection Host provider SPI. The remainder of this page describes the current reference implementation, which does not yet complete that split.
|
|
6
|
+
|
|
7
|
+
Host-provided communication service, two-endpoint capability negotiation, and implementation-neutral invocation for the DSH Standard.
|
|
8
|
+
|
|
9
|
+
## Endpoint offers
|
|
10
|
+
|
|
11
|
+
An endpoint offer contains an endpoint identity, a revision, and the live participant declarations admitted by endpoint policy. It carries no component manifests, installation inventory, or plugin registry.
|
|
12
|
+
|
|
13
|
+
`resolveConnection()` passes both sets of declarations to a caller-owned `ProtocolCatalog`. Each protocol definition owns its negotiation and may place invocation bindings in its agreement; connection does not impose consumer/provider semantics on every protocol. `defineCapabilityProtocol()` is an explicit helper for domain protocols that do use RPC-shaped bindings.
|
|
14
|
+
|
|
15
|
+
Each invocation binding is participant-scoped and plan-revision-scoped. A client for one participant cannot discover or invoke bindings granted to another participant.
|
|
16
|
+
|
|
17
|
+
## Current reference API
|
|
18
|
+
|
|
19
|
+
`StandardConnection` exposes endpoint identities, the active plan, consumer-scoped clients, plan-change observation, and close. `CapabilityClient.invoke()` returns an invocation id, a result promise, an asynchronous progress stream, and cancellation. Domain protocol packages own operation names and input, output, and progress values.
|
|
20
|
+
|
|
21
|
+
`ConnectionBroker` selects one registered `ConnectionConnector` for an implementation-neutral target URI. Zero matches and multiple matches are both explicit errors. The broker does not expose the selected connector type through `StandardConnection`.
|
|
22
|
+
|
|
23
|
+
These types are an early reference implementation. They do not require a TUI, Web UI, GUI, or business plugin to register and operate its own connector. The protocol direction places the broker, connector/provider registry, carrier, and wire behind a Connection Host's `ConnectionService`. A consumer submits a target and uses scoped typed clients for the negotiated protocols.
|
|
24
|
+
|
|
25
|
+
A Connection Host may install or discover a remote service, own authentication, ports, forwarding and reconnection, and produce the `StandardConnection`. An SSH target facet contributes resolution and bootstrap integration while system OpenSSH or another provider may supply the physical SSH implementation. Applications do not observe the selected provider, ports, credentials, or wire.
|
|
26
|
+
|
|
27
|
+
## Lifecycle
|
|
28
|
+
|
|
29
|
+
Renegotiation creates a complete new plan revision and publishes it atomically. An invocation admitted under the old revision retains its binding until settlement; later invocations use the new revision. Closing a connection cancels active work and rejects new work with `connection-closed`.
|
|
30
|
+
|
|
31
|
+
Transport implementations must preserve invocation isolation, progress order, cancellation, and the error classification exposed by `ConnectionInvocationError`. They are also responsible for authenticating the peer and preventing one connection from reusing another connection's grants.
|
|
32
|
+
|
|
33
|
+
## Reference implementation
|
|
34
|
+
|
|
35
|
+
The `@dsh-std/connection/memory` export provides a process-local implementation for tests, adapters, and conformance experiments. It demonstrates symmetric calls, progress, cancellation, isolation, and renegotiation. It is not a required carrier or a wire-format specification.
|
|
36
|
+
|
|
37
|
+
## Known Limitations and Deferred Work
|
|
38
|
+
|
|
39
|
+
- The consumer-facing `ConnectionService` and Host provider SPI are not implemented in the current code yet.
|
|
40
|
+
- The package does not yet standardize discovery, authentication, encryption, reconnect policy, framing, or serialization.
|
|
41
|
+
- A connection has exactly two endpoints in `v1alpha1`; multi-party routing is composed from separate connections.
|
|
42
|
+
- The capability helper requires one peer provider by default. Protocols that allow multiple providers must opt into and define that behavior explicitly.
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# @dsh-std/connection
|
|
2
|
+
|
|
3
|
+
[English](README.md) | 中文
|
|
4
|
+
|
|
5
|
+
拟议设计见 [Endpoint Connection](../../docs/proposals/endpoint-connection.zh.md)。规范把普通应用使用的 `ConnectionService` 与 Connection Host 的 provider SPI 分开;本页其余内容描述尚未完成该分层的当前参考实现。
|
|
6
|
+
|
|
7
|
+
DSH Standard 的宿主通信 service、双端点能力协商与实现无关调用。
|
|
8
|
+
|
|
9
|
+
## 端点提议
|
|
10
|
+
|
|
11
|
+
端点提议包含端点身份、修订号,以及经端点 policy 裁剪后的 live participant declarations。它不携带 component manifests、安装记录或插件注册表。
|
|
12
|
+
|
|
13
|
+
`resolveConnection()` 把两端 declarations 交给调用方提供的 `ProtocolCatalog`。每份协议 definition 决定如何协商,并可在 agreement 中产生调用绑定;connection 不为所有协议预设 consumer/provider 语义。内置的 `defineCapabilityProtocol()` 是需要 RPC 绑定的领域协议可显式采用的辅助定义。
|
|
14
|
+
|
|
15
|
+
每项调用绑定都限定于消费 participant 和方案修订版。一个 participant 的客户端不能发现或调用授予另一 participant 的绑定。
|
|
16
|
+
|
|
17
|
+
## 当前参考 API
|
|
18
|
+
|
|
19
|
+
`StandardConnection` 暴露端点身份、当前方案、按消费方隔离的客户端、方案变更观察与关闭操作。`CapabilityClient.invoke()` 返回调用 id、结果 Promise、异步进度流与取消操作。领域协议包拥有操作名称以及输入、输出和进度值的语义。
|
|
20
|
+
|
|
21
|
+
`ConnectionBroker` 根据与实现无关的目标 URI,从已注册 `ConnectionConnector` 中选择唯一实现。零个匹配与多个匹配都是明确错误。broker 不会通过 `StandardConnection` 暴露选中的 connector 类型。
|
|
22
|
+
|
|
23
|
+
这些类型是早期参考实现,不表示 TUI、Web、GUI 或业务插件应自行注册 connector。规范方向是由 Connection Host 把 broker、connector/provider、carrier 和 wire 封装为 `ConnectionService`;consumer 只提交 target,并通过 scoped typed client 使用已协商协议。
|
|
24
|
+
|
|
25
|
+
Connection Host 负责安装或发现远端服务、认证、端口与转发、重连和 `StandardConnection`。SSH target facet 可以贡献解析与 bootstrap 集成,物理 SSH 则可由系统 OpenSSH 或独立 provider 完成。应用不会看到所选 provider、端口、凭据或 wire。
|
|
26
|
+
|
|
27
|
+
## 生命周期
|
|
28
|
+
|
|
29
|
+
重新协商会生成完整的新方案修订版,并原子发布。旧修订版已经接纳的调用保留其绑定直至结束;后续调用使用新修订版。关闭连接会取消活跃工作,并以 `connection-closed` 拒绝新工作。
|
|
30
|
+
|
|
31
|
+
传输实现必须保持调用隔离、进度顺序、取消语义和 `ConnectionInvocationError` 暴露的错误分类。实现还负责认证对端,并阻止一条连接复用另一条连接的授权。
|
|
32
|
+
|
|
33
|
+
## 参考实现
|
|
34
|
+
|
|
35
|
+
`@dsh-std/connection/memory` 导出用于测试、适配器和一致性实验的进程内实现。它演示双向调用、进度、取消、隔离和重新协商,但不是强制承载方式或线协议规范。
|
|
36
|
+
|
|
37
|
+
## 已知限制与暂缓事项
|
|
38
|
+
|
|
39
|
+
- consumer-facing `ConnectionService` 与 Host provider SPI 尚未在当前代码中实现。
|
|
40
|
+
- 本包尚未标准化发现、认证、加密、重连策略、封帧或序列化。
|
|
41
|
+
- `v1alpha1` 的一条连接恰好包含两个端点;多方路由由多条独立连接组合。
|
|
42
|
+
- Capability helper 默认要求唯一对端提供方;需要多提供方的协议必须明确选择其规则。
|