@askdkc/dsh-cli 0.13.5 → 0.14.1
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/bin/{dsh-tui.js → dsh-cli.js} +27 -27
- package/cordis.patch.yml +32 -32
- package/cordis.yml +17 -17
- package/lib/types/activityPrefs.d.ts +2 -2
- package/lib/types/activityPrefs.js +2 -2
- package/lib/types/adapter/channel/actions.js +1 -1
- package/lib/types/adapter/channel/consumer.js +1 -1
- package/lib/types/adapter/channel/internal-token.js +1 -1
- package/lib/types/adapter/channel/plugins.js +1 -1
- package/lib/types/adapter/channel/session-projection.js +3 -3
- package/lib/types/adapter/channel/transcript.js +1 -1
- package/lib/types/adapter/channel/ui.js +3 -3
- package/lib/types/adapter/kernel/host-facade.d.ts +1 -1
- package/lib/types/adapter/kernel/host-facade.js +6 -6
- package/lib/types/adapter/kernel/host-probe-access.d.ts +1 -1
- package/lib/types/adapter/kernel/host-probe-access.js +6 -6
- package/lib/types/adapter/kernel/kernel-runtime.js +1 -1
- package/lib/types/adapter/kernel/legacy-facade.d.ts +1 -1
- package/lib/types/adapter/kernel/legacy-facade.js +1 -1
- package/lib/types/adapter/kernel/replay-isolation.js +1 -1
- package/lib/types/adapter/kernel/runtime.d.ts +1 -1
- package/lib/types/adapter/kernel/runtime.js +7 -7
- package/lib/types/adapter/ports/channel-display.d.ts +1 -1
- package/lib/types/adapter/ports/channel-ui.d.ts +15 -15
- package/lib/types/adapter/standard/descriptor.d.ts +1 -1
- package/lib/types/adapter/standard/descriptor.js +2 -2
- package/lib/types/adapter/standard/registry.d.ts +1 -1
- package/lib/types/adapter/standard/registry.js +2 -2
- package/lib/types/adapter/standard/tui-extension.d.ts +2 -2
- package/lib/types/adapter/standard/tui-extension.js +3 -3
- package/lib/types/adapter/upstream/channel-driver.js +10 -10
- package/lib/types/adapter/upstream/decisions-driver.js +3 -3
- package/lib/types/adapter/upstream/extensions-driver.js +18 -18
- package/lib/types/adapter/upstream/host-descriptor-driver.js +4 -4
- package/lib/types/adapter/upstream/presentation-driver.js +5 -5
- package/lib/types/adapter/upstream/scenes-driver.js +4 -4
- package/lib/types/adapter/upstream/settings-driver.js +4 -4
- package/lib/types/adapter/upstream/workspace-driver.js +2 -2
- package/lib/types/bootstrap/state.d.ts +4 -4
- package/lib/types/bootstrap/state.js +4 -4
- package/lib/types/{tuiDisplayPrefs.d.ts → cliDisplayPrefs.d.ts} +1 -1
- package/lib/types/{tuiDisplayPrefs.d.ts.map → cliDisplayPrefs.d.ts.map} +1 -1
- package/lib/types/{tuiDisplayPrefs.js → cliDisplayPrefs.js} +1 -1
- package/lib/types/commands.js +7 -7
- package/lib/types/components/AutoRecapRow.d.ts +1 -1
- package/lib/types/components/AutoRecapRow.js +1 -1
- package/lib/types/components/HelpMenu.d.ts +1 -1
- package/lib/types/components/HelpMenu.js +1 -1
- package/lib/types/components/LogoV2.d.ts +2 -2
- package/lib/types/components/LogoV2.d.ts.map +1 -1
- package/lib/types/components/LogoV2.js +5 -19
- package/lib/types/components/MermaidDiagram.js +1 -1
- package/lib/types/components/MessageList.d.ts +2 -2
- package/lib/types/components/MessageList.js +1 -1
- package/lib/types/components/PageMargin.d.ts +3 -3
- package/lib/types/components/PageMargin.js +1 -1
- package/lib/types/components/PluginSceneBoundary.d.ts +1 -1
- package/lib/types/components/PluginSceneBoundary.js +1 -1
- package/lib/types/components/PromptInput.d.ts +1 -1
- package/lib/types/components/PromptInput.js +3 -3
- package/lib/types/components/ScrollbarGutter.d.ts +1 -1
- package/lib/types/components/ScrollbarGutter.js +1 -1
- package/lib/types/components/Select.d.ts +1 -1
- package/lib/types/components/Select.js +1 -1
- package/lib/types/components/SplitDiffView.d.ts +1 -1
- package/lib/types/components/ThemePicker.d.ts +1 -1
- package/lib/types/components/ThemePicker.js +1 -1
- package/lib/types/components/activityFrames.d.ts +1 -1
- package/lib/types/components/activityFrames.js +1 -1
- package/lib/types/components/design-system/Byline.d.ts +1 -1
- package/lib/types/components/design-system/Byline.js +1 -1
- package/lib/types/components/design-system/Divider.d.ts +1 -1
- package/lib/types/components/design-system/Divider.js +1 -1
- package/lib/types/components/design-system/StatusIcon.d.ts +1 -1
- package/lib/types/components/design-system/StatusIcon.js +1 -1
- package/lib/types/components/design-system/ThemeProvider.d.ts +1 -1
- package/lib/types/components/design-system/ThemeProvider.js +11 -11
- package/lib/types/components/design-system/ThemedBox.d.ts +1 -1
- package/lib/types/components/design-system/ThemedBox.js +1 -1
- package/lib/types/components/design-system/ThemedText.d.ts +1 -1
- package/lib/types/components/design-system/ThemedText.js +1 -1
- package/lib/types/components/messages/AssistantThinkingMessage.d.ts +1 -1
- package/lib/types/components/messages/AssistantThinkingMessage.js +1 -1
- package/lib/types/components/messages/AssistantToolUseMessage.d.ts +3 -3
- package/lib/types/components/messages/AssistantToolUseMessage.js +1 -1
- package/lib/types/components/messages/originalImage.js +1 -1
- package/lib/types/components/questions/AskUserQuestionPanel.d.ts +1 -1
- package/lib/types/components/questions/AskUserQuestionPanel.js +1 -1
- package/lib/types/components/smoothReveal.d.ts +1 -1
- package/lib/types/components/smoothReveal.js +1 -1
- package/lib/types/customTheme.d.ts +5 -5
- package/lib/types/customTheme.js +7 -7
- package/lib/types/dsh-adapter/activity-store.d.ts +1 -1
- package/lib/types/dsh-adapter/activity-store.js +3 -3
- package/lib/types/dsh-adapter/bundled-presets.js +2 -2
- package/lib/types/dsh-adapter/channel/action-readiness.js +2 -2
- package/lib/types/dsh-adapter/channel/agent-view-projection.js +1 -1
- package/lib/types/dsh-adapter/channel/background-action.js +1 -1
- package/lib/types/dsh-adapter/channel/binding-events.js +1 -1
- package/lib/types/dsh-adapter/channel/binding.js +14 -14
- package/lib/types/dsh-adapter/channel/external-commands.js +3 -3
- package/lib/types/dsh-adapter/channel/input-delivery.js +1 -1
- package/lib/types/dsh-adapter/channel/job-projection.js +1 -1
- package/lib/types/dsh-adapter/channel/lifetime-resources.js +1 -1
- package/lib/types/dsh-adapter/channel/local-actions.js +1 -1
- package/lib/types/dsh-adapter/channel/mode-actions.js +1 -1
- package/lib/types/dsh-adapter/channel/mode-permission.js +6 -6
- package/lib/types/dsh-adapter/channel/mode-roster.js +1 -1
- package/lib/types/dsh-adapter/channel/owner.js +2 -2
- package/lib/types/dsh-adapter/channel/preferences.js +1 -1
- package/lib/types/dsh-adapter/channel/projection.js +1 -1
- package/lib/types/dsh-adapter/channel/reports.js +3 -3
- package/lib/types/dsh-adapter/channel/session-fork.js +1 -1
- package/lib/types/dsh-adapter/channel/session-metadata.d.ts +4 -4
- package/lib/types/dsh-adapter/channel/session-metadata.js +2 -2
- package/lib/types/dsh-adapter/channel/session-rewind.js +2 -2
- package/lib/types/dsh-adapter/channel/state.d.ts +1 -1
- package/lib/types/dsh-adapter/channel/state.js +1 -1
- package/lib/types/dsh-adapter/channel/types.d.ts +1 -1
- package/lib/types/dsh-adapter/channel-ui.js +2 -2
- package/lib/types/dsh-adapter/channel.js +9 -9
- package/lib/types/dsh-adapter/cli-registration.d.ts.map +1 -1
- package/lib/types/dsh-adapter/cli-registration.js +5 -4
- package/lib/types/dsh-adapter/command-trees.d.ts +1 -1
- package/lib/types/dsh-adapter/command-trees.js +2 -2
- package/lib/types/dsh-adapter/compat/sessionLog.d.ts +3 -3
- package/lib/types/dsh-adapter/compat/sessionLog.js +5 -5
- package/lib/types/dsh-adapter/compat/settings.d.ts.map +1 -1
- package/lib/types/dsh-adapter/compat/settings.js +15 -7
- package/lib/types/dsh-adapter/contract.d.ts +1 -1
- package/lib/types/dsh-adapter/contract.d.ts.map +1 -1
- package/lib/types/dsh-adapter/contract.js +0 -1
- package/lib/types/dsh-adapter/decision-guard.d.ts +3 -3
- package/lib/types/dsh-adapter/decision-guard.js +6 -6
- package/lib/types/dsh-adapter/dialogs.d.ts +1 -1
- package/lib/types/dsh-adapter/dialogs.js +7 -7
- package/lib/types/dsh-adapter/effect-ledger.d.ts +2 -2
- package/lib/types/dsh-adapter/effect-ledger.js +5 -5
- package/lib/types/dsh-adapter/extension-events.js +10 -10
- package/lib/types/dsh-adapter/extensions.d.ts +3 -3
- package/lib/types/dsh-adapter/extensions.js +3 -3
- package/lib/types/dsh-adapter/host-access.js +11 -11
- package/lib/types/dsh-adapter/ide-channel.d.ts +6 -6
- package/lib/types/dsh-adapter/ide-channel.js +6 -6
- package/lib/types/dsh-adapter/index.d.ts +18 -18
- package/lib/types/dsh-adapter/index.js +5 -5
- package/lib/types/dsh-adapter/inject-channel.d.ts +4 -4
- package/lib/types/dsh-adapter/inject-channel.js +5 -5
- package/lib/types/dsh-adapter/invariant.d.ts +9 -2
- package/lib/types/dsh-adapter/invariant.d.ts.map +1 -1
- package/lib/types/dsh-adapter/invariant.js +1 -1
- package/lib/types/dsh-adapter/message-observer.d.ts +2 -2
- package/lib/types/dsh-adapter/message-observer.js +23 -23
- package/lib/types/dsh-adapter/migrate/adapters/scan.js +1 -1
- package/lib/types/dsh-adapter/migrate/bin-path.d.ts +1 -1
- package/lib/types/dsh-adapter/migrate/bin-path.js +4 -4
- package/lib/types/dsh-adapter/migrate/picker.d.ts +1 -1
- package/lib/types/dsh-adapter/migrate/picker.js +1 -1
- package/lib/types/dsh-adapter/migrate/uuid.js +1 -1
- package/lib/types/dsh-adapter/packaged-presets.js +1 -1
- package/lib/types/dsh-adapter/plugin-host.d.ts +2 -2
- package/lib/types/dsh-adapter/plugin-host.js +32 -32
- package/lib/types/dsh-adapter/plugin-storage.d.ts +3 -3
- package/lib/types/dsh-adapter/plugin-storage.js +5 -5
- package/lib/types/dsh-adapter/plugin.d.ts +4 -4
- package/lib/types/dsh-adapter/plugin.js +89 -89
- package/lib/types/dsh-adapter/preset-resolution.d.ts +1 -1
- package/lib/types/dsh-adapter/presets.js +1 -1
- package/lib/types/dsh-adapter/promptDebug.js +1 -1
- package/lib/types/dsh-adapter/questions.d.ts +1 -1
- package/lib/types/dsh-adapter/questions.js +1 -1
- package/lib/types/dsh-adapter/renderers.js +7 -7
- package/lib/types/dsh-adapter/scenes.d.ts +1 -1
- package/lib/types/dsh-adapter/scenes.js +6 -6
- package/lib/types/dsh-adapter/settings-sections.d.ts +1 -1
- package/lib/types/dsh-adapter/settings-sections.js +5 -5
- package/lib/types/dsh-adapter/sharp.js +1 -1
- package/lib/types/dsh-adapter/shortcuts.js +9 -9
- package/lib/types/dsh-adapter/status.js +21 -21
- package/lib/types/dsh-adapter/themes.js +2 -2
- package/lib/types/dsh-adapter/toast.js +7 -7
- package/lib/types/dsh-adapter/types.d.ts +0 -1
- package/lib/types/dsh-adapter/types.d.ts.map +1 -1
- package/lib/types/dsh-adapter/workspaces.d.ts +1 -1
- package/lib/types/dsh-adapter/workspaces.js +6 -6
- package/lib/types/effortPrefs.d.ts +2 -2
- package/lib/types/effortPrefs.js +2 -2
- package/lib/types/force-production-react.js +1 -1
- package/lib/types/herdr.js +4 -4
- package/lib/types/homePrefs.js +1 -1
- package/lib/types/i18n.d.ts +54 -54
- package/lib/types/i18n.js +39 -39
- package/lib/types/ink/clearTerminal.d.ts +1 -1
- package/lib/types/ink/clearTerminal.js +1 -1
- package/lib/types/ink/colorize.js +1 -1
- package/lib/types/ink/components/App.d.ts +1 -1
- package/lib/types/ink/components/App.js +5 -5
- package/lib/types/ink/components/Text.d.ts +1 -1
- package/lib/types/ink/devtools.d.ts +1 -1
- package/lib/types/ink/dom.d.ts +1 -1
- package/lib/types/ink/dom.js +1 -1
- package/lib/types/ink/geometry-trace.js +4 -4
- package/lib/types/ink/ink.d.ts.map +1 -1
- package/lib/types/ink/ink.js +8 -19
- package/lib/types/ink/reconciler.d.ts +1 -1
- package/lib/types/ink/reconciler.d.ts.map +1 -1
- package/lib/types/ink/reconciler.js +6 -3
- package/lib/types/ink/render-to-screen.d.ts.map +1 -1
- package/lib/types/ink/render-to-screen.js +0 -5
- package/lib/types/ink/terminal.js +3 -3
- package/lib/types/ink/termio/osc.js +1 -1
- package/lib/types/ink/update-overflow-guard.js +2 -2
- package/lib/types/minimalMode.d.ts +2 -2
- package/lib/types/minimalMode.js +2 -2
- package/lib/types/modelGroups.d.ts +1 -1
- package/lib/types/modelGroups.js +1 -1
- package/lib/types/modelPrefs.d.ts +1 -1
- package/lib/types/modelPrefs.js +1 -1
- package/lib/types/modelRecents.d.ts +2 -2
- package/lib/types/modelRecents.js +2 -2
- package/lib/types/package-version.d.ts +3 -0
- package/lib/types/package-version.d.ts.map +1 -0
- package/lib/types/package-version.js +25 -0
- package/lib/types/presetPrefs.d.ts +1 -1
- package/lib/types/presetPrefs.js +1 -1
- package/lib/types/reload.d.ts +8 -8
- package/lib/types/reload.js +4 -4
- package/lib/types/screens/Chat.js +27 -27
- package/lib/types/screens/StatusLine.js +1 -1
- package/lib/types/screens/StatusMetrics.js +1 -1
- package/lib/types/sessionHistory.d.ts +3 -3
- package/lib/types/sessionHistory.js +7 -7
- package/lib/types/sessionModes.js +1 -1
- package/lib/types/sessionMounts.d.ts +1 -1
- package/lib/types/sessionMounts.js +1 -1
- package/lib/types/sessionPins.d.ts +1 -1
- package/lib/types/sessionPins.js +1 -1
- package/lib/types/terminal-utils/cliHighlight.d.ts +1 -1
- package/lib/types/terminal-utils/hash.d.ts +1 -1
- package/lib/types/terminal-utils/hash.js +1 -1
- package/lib/types/terminal-utils/mermaid.d.ts +1 -1
- package/lib/types/terminal-utils/syntaxTheme.js +1 -1
- package/lib/types/theme.d.ts +3 -3
- package/lib/types/theme.js +3 -3
- package/lib/types/themePrefs.d.ts +3 -3
- package/lib/types/themePrefs.js +3 -3
- package/lib/types/tips.js +4 -4
- package/lib/types/trajectory/effortIgnition.d.ts +1 -1
- package/lib/types/trajectoryPrefs.d.ts +1 -1
- package/lib/types/trajectoryPrefs.js +1 -1
- package/lib/types/ui.d.ts +1 -1
- package/lib/types/ui.js +1 -1
- package/lib/types/update.d.ts +25 -26
- package/lib/types/update.d.ts.map +1 -1
- package/lib/types/update.js +55 -73
- package/lib/types/utils/clipboard.js +1 -1
- package/lib/types/utils/credentials.js +2 -2
- package/lib/types/utils/debug.d.ts +3 -3
- package/lib/types/utils/debug.js +6 -6
- package/lib/types/utils/earlyInput.d.ts +1 -1
- package/lib/types/utils/earlyInput.js +1 -1
- package/lib/types/utils/externalEditor.js +1 -1
- package/lib/types/utils/fullscreen.d.ts +3 -3
- package/lib/types/utils/fullscreen.js +4 -4
- package/lib/types/utils/log.js +1 -1
- package/lib/types/utils/paths.d.ts +3 -3
- package/lib/types/utils/paths.js +4 -4
- package/lib/types/working-activity.js +1 -1
- package/node_modules/@askdkc/dsh-auth/dsh-plugin.json +1 -1
- package/node_modules/@askdkc/dsh-auth/lib/index.d.ts +2 -2
- package/node_modules/@askdkc/dsh-auth/lib/index.js +2 -2
- package/node_modules/@askdkc/dsh-auth/lib/pi-ai.d.ts +0 -2
- package/node_modules/@askdkc/dsh-auth/lib/pi-ai.js +0 -2
- package/node_modules/@askdkc/dsh-auth/lib/service.d.ts +1 -1
- package/node_modules/@askdkc/dsh-auth/lib/service.js +2 -2
- package/node_modules/dsh-working-activity/lib/client.js.map +1 -1
- package/node_modules/dsh-working-activity/lib/types/client/index.d.ts +1 -1
- package/node_modules/dsh-working-activity/lib/types/config.d.ts +2 -2
- package/node_modules/dsh-working-activity/lib/types/config.js +2 -2
- package/node_modules/dsh-working-activity/lib/types/frames.d.ts +1 -1
- package/node_modules/dsh-working-activity/lib/types/frames.js +1 -1
- package/node_modules/dsh-working-activity/lib/types/index.d.ts +1 -1
- package/node_modules/dsh-working-activity/lib/types/index.js +2 -2
- package/node_modules/dsh-working-activity/lib/types/invariant.d.ts +13 -1
- package/node_modules/dsh-working-activity/lib/types/lang.d.ts +5 -5
- package/node_modules/dsh-working-activity/lib/types/lang.js +8 -8
- package/node_modules/dsh-working-activity/lib/types/projection.d.ts +1 -1
- package/node_modules/dsh-working-activity/lib/types/projection.js +1 -1
- package/node_modules/dsh-working-activity/lib/types/status.d.ts +1 -1
- package/node_modules/dsh-working-activity/lib/types/status.js +1 -1
- package/node_modules/dsh-working-activity/package.json +0 -4
- package/node_modules/dsh-working-activity/src/client/index.ts +1 -1
- package/node_modules/dsh-working-activity/src/config.ts +2 -2
- package/node_modules/dsh-working-activity/src/frames.ts +1 -1
- package/node_modules/dsh-working-activity/src/index.ts +4 -4
- package/node_modules/dsh-working-activity/src/invariant.ts +10 -3
- package/node_modules/dsh-working-activity/src/lang.ts +8 -8
- package/node_modules/dsh-working-activity/src/projection.ts +1 -1
- package/node_modules/dsh-working-activity/src/status.ts +1 -1
- package/package.json +8 -13
- package/presets/liangshen/agent.cordis.yml +1 -1
- package/presets/liangshen/custom-bash.mjs +2 -2
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* messages.observe contract surface (C-042,
|
|
3
3
|
* `messages.dsh/v1alpha1#MessageObserver`): the host event broker, mounted
|
|
4
|
-
* by the dsh-
|
|
4
|
+
* by the dsh-cli-plugin-host row as `ctx.tuiMessageObserver`.
|
|
5
5
|
*
|
|
6
6
|
* Mapping (deliberately narrow):
|
|
7
7
|
*
|
|
@@ -174,7 +174,7 @@ export class TuiMessageObserverRuntime extends Service {
|
|
|
174
174
|
runtime.#publishGuarded(session, event);
|
|
175
175
|
}
|
|
176
176
|
catch (error) {
|
|
177
|
-
runtime.ctx.logger.warn('dsh-
|
|
177
|
+
runtime.ctx.logger.warn('dsh-cli: messages.observe publish failed (event dropped)');
|
|
178
178
|
}
|
|
179
179
|
},
|
|
180
180
|
});
|
|
@@ -242,22 +242,22 @@ export class TuiMessageObserverRuntime extends Service {
|
|
|
242
242
|
const state = observerStateFor(this);
|
|
243
243
|
const before = state.subscriptions.size;
|
|
244
244
|
const identity = {
|
|
245
|
-
componentId: '
|
|
246
|
-
activationId: '
|
|
245
|
+
componentId: '__dsh_cli_live_probe__',
|
|
246
|
+
activationId: '__dsh_cli_live_probe__',
|
|
247
247
|
version: '0.0.0',
|
|
248
248
|
facet: 'host',
|
|
249
|
-
manifest: { id: '
|
|
250
|
-
projection: { id: '
|
|
249
|
+
manifest: { id: '__dsh_cli_live_probe__' },
|
|
250
|
+
projection: { id: '__dsh_cli_live_probe__' },
|
|
251
251
|
};
|
|
252
252
|
const self = concreteService(this);
|
|
253
253
|
const received = [];
|
|
254
|
-
const release = self.#registerSubscription(state.hostContext, identity, '
|
|
254
|
+
const release = self.#registerSubscription(state.hostContext, identity, '__dsh_cli_live_probe__', 'session:__dsh_cli_live_probe__', envelope => { received.push(envelope); }, { enforceGrants: false, recordLedger: false, bindLifecycle: false });
|
|
255
255
|
try {
|
|
256
256
|
const during = state.subscriptions.size;
|
|
257
257
|
if (during !== before + 1) {
|
|
258
258
|
throw new Error(`temporary subscription did not enter the broker (${before} -> ${during})`);
|
|
259
259
|
}
|
|
260
|
-
self.#publishGuarded({ id: '
|
|
260
|
+
self.#publishGuarded({ id: '__dsh_cli_live_probe__' }, {
|
|
261
261
|
type: 'user/message',
|
|
262
262
|
seq: 1,
|
|
263
263
|
data: {
|
|
@@ -315,18 +315,18 @@ export class TuiMessageObserverRuntime extends Service {
|
|
|
315
315
|
assertCapabilityShadowPolicy('host.messages.subscribe', observerStateFor(this).runtime.mode, observerStateFor(this).runtime.slices);
|
|
316
316
|
const caller = activationContext(pluginCtx);
|
|
317
317
|
if (caller === undefined)
|
|
318
|
-
throw new Error('dsh-
|
|
318
|
+
throw new Error('dsh-cli: messages.observe.subscribe requires a live activation context');
|
|
319
319
|
assertCallerContext(this.ctx, caller, 'messages.observe.subscribe', this);
|
|
320
320
|
const identity = requireComponentIdentity(caller);
|
|
321
321
|
const plugin = identity.componentId;
|
|
322
322
|
if (!requiresContract(identity, 'messages.dsh/v1alpha1', 'MessageObserver')) {
|
|
323
|
-
observerStateFor(this).hostContext.logger.warn(`dsh-
|
|
323
|
+
observerStateFor(this).hostContext.logger.warn(`dsh-cli: messages.observe subscription from Component "${plugin}" denied — ` +
|
|
324
324
|
'the messages.dsh/v1alpha1#MessageObserver contract was not required');
|
|
325
325
|
return () => false;
|
|
326
326
|
}
|
|
327
327
|
const scope = typeof options?.scope === 'string' ? options.scope : '';
|
|
328
328
|
if (scope === '' || scope.length > OBSERVE_SCOPE_MAX_CHARS) {
|
|
329
|
-
observerStateFor(this).hostContext.logger.warn(`dsh-
|
|
329
|
+
observerStateFor(this).hostContext.logger.warn(`dsh-cli: messages.observe subscription from plugin "${plugin}" refused — options.scope must be a ` +
|
|
330
330
|
`non-empty string of at most ${OBSERVE_SCOPE_MAX_CHARS} characters (e.g. "session:<id>")`);
|
|
331
331
|
return () => false;
|
|
332
332
|
}
|
|
@@ -347,7 +347,7 @@ export class TuiMessageObserverRuntime extends Service {
|
|
|
347
347
|
&& (!declaresObserverScope(identity, scope)
|
|
348
348
|
|| !declaresPermission(identity, 'messages.observe.read', scope)
|
|
349
349
|
|| !this.grants().allows({ componentId: identity.componentId, activationId: identity.activationId }, 'messages.observe.read', scope)))) {
|
|
350
|
-
observerStateFor(this).hostContext.logger.warn(`dsh-
|
|
350
|
+
observerStateFor(this).hostContext.logger.warn(`dsh-cli: messages.observe subscription from Component "${plugin}" denied — ` +
|
|
351
351
|
'the scope is not statically declared or the current grant does not cover it; the listener was NOT registered');
|
|
352
352
|
if (options.recordLedger) {
|
|
353
353
|
this.ledger()?.record({
|
|
@@ -406,7 +406,7 @@ export class TuiMessageObserverRuntime extends Service {
|
|
|
406
406
|
return;
|
|
407
407
|
const sessionId = session?.id;
|
|
408
408
|
if (typeof sessionId !== 'string' || sessionId === '') {
|
|
409
|
-
observerStateFor(this).hostContext.logger.warn('dsh-
|
|
409
|
+
observerStateFor(this).hostContext.logger.warn('dsh-cli: messages.observe publish skipped — the session carries no string id');
|
|
410
410
|
return;
|
|
411
411
|
}
|
|
412
412
|
const data = (record.data ?? {});
|
|
@@ -415,7 +415,7 @@ export class TuiMessageObserverRuntime extends Service {
|
|
|
415
415
|
// Never truncate a session identity into the schema's scope bound: two
|
|
416
416
|
// distinct long ids can otherwise collapse into one subscription scope.
|
|
417
417
|
if (scope.length > OBSERVE_SCOPE_MAX_CHARS) {
|
|
418
|
-
observerStateFor(this).hostContext.logger.warn(`dsh-
|
|
418
|
+
observerStateFor(this).hostContext.logger.warn(`dsh-cli: messages.observe publish skipped — the session scope exceeds ${OBSERVE_SCOPE_MAX_CHARS} characters`);
|
|
419
419
|
return;
|
|
420
420
|
}
|
|
421
421
|
// C-042 isolation: match subscriptions BEFORE building anything — a
|
|
@@ -462,7 +462,7 @@ export class TuiMessageObserverRuntime extends Service {
|
|
|
462
462
|
if (state.validatorUnavailable) {
|
|
463
463
|
if (!state.validatorWarned) {
|
|
464
464
|
state.validatorWarned = true;
|
|
465
|
-
observerStateFor(this).hostContext.logger.warn('dsh-
|
|
465
|
+
observerStateFor(this).hostContext.logger.warn('dsh-cli: standard message envelope validator unavailable — delivery is fail-closed');
|
|
466
466
|
}
|
|
467
467
|
return;
|
|
468
468
|
}
|
|
@@ -470,7 +470,7 @@ export class TuiMessageObserverRuntime extends Service {
|
|
|
470
470
|
state.validateEnvelope(envelope);
|
|
471
471
|
}
|
|
472
472
|
catch (error) {
|
|
473
|
-
observerStateFor(this).hostContext.logger.warn('dsh-
|
|
473
|
+
observerStateFor(this).hostContext.logger.warn('dsh-cli: messages.observe envelope failed the standard validator and was dropped');
|
|
474
474
|
return;
|
|
475
475
|
}
|
|
476
476
|
for (const subscription of matched) {
|
|
@@ -481,12 +481,12 @@ export class TuiMessageObserverRuntime extends Service {
|
|
|
481
481
|
// probe subscriptions bypass this re-check because they are synthetic
|
|
482
482
|
// and never represent a real caller grant.
|
|
483
483
|
if (!subscription.probe && !this.grants().allows({ componentId: subscription.identity.componentId, activationId: subscription.identity.activationId }, 'messages.observe.read', scope)) {
|
|
484
|
-
observerStateFor(this).hostContext.logger.warn(`dsh-
|
|
484
|
+
observerStateFor(this).hostContext.logger.warn(`dsh-cli: messages.observe subscription of plugin "${subscription.plugin}" released — the grant was revoked`);
|
|
485
485
|
this.drop(subscription);
|
|
486
486
|
continue;
|
|
487
487
|
}
|
|
488
488
|
if (subscription.pendingCallbacks >= OBSERVE_CALLBACK_QUEUE_LIMIT) {
|
|
489
|
-
observerStateFor(this).hostContext.logger.warn(`dsh-
|
|
489
|
+
observerStateFor(this).hostContext.logger.warn(`dsh-cli: messages.observe listener of Component "${subscription.plugin}" reached its ` +
|
|
490
490
|
`${OBSERVE_CALLBACK_QUEUE_LIMIT}-callback queue limit; this envelope was skipped`);
|
|
491
491
|
continue;
|
|
492
492
|
}
|
|
@@ -499,28 +499,28 @@ export class TuiMessageObserverRuntime extends Service {
|
|
|
499
499
|
// running; queued envelopes must then be skipped rather than
|
|
500
500
|
// delivered from the stale pre-revocation snapshot.
|
|
501
501
|
if (!subscription.probe && !this.grants().allows({ componentId: subscription.identity.componentId, activationId: subscription.identity.activationId }, 'messages.observe.read', scope)) {
|
|
502
|
-
observerStateFor(this).hostContext.logger.warn(`dsh-
|
|
502
|
+
observerStateFor(this).hostContext.logger.warn(`dsh-cli: messages.observe subscription of plugin "${subscription.plugin}" released — the grant was revoked`);
|
|
503
503
|
this.drop(subscription);
|
|
504
504
|
return;
|
|
505
505
|
}
|
|
506
506
|
const isolated = freezeEnvelope(envelope);
|
|
507
507
|
const result = await runWithBudget(() => subscription.listener(isolated), OBSERVE_CALLBACK_TIMEOUT_MS);
|
|
508
508
|
if (result.kind === 'timeout') {
|
|
509
|
-
observerStateFor(this).hostContext.logger.warn(`dsh-
|
|
509
|
+
observerStateFor(this).hostContext.logger.warn(`dsh-cli: messages.observe listener of Component "${subscription.plugin}" exceeded ` +
|
|
510
510
|
`${OBSERVE_CALLBACK_TIMEOUT_MS}ms and the subscription was closed`);
|
|
511
511
|
this.drop(subscription);
|
|
512
512
|
}
|
|
513
513
|
else if (result.kind === 'rejected') {
|
|
514
|
-
observerStateFor(this).hostContext.logger.warn(`dsh-
|
|
514
|
+
observerStateFor(this).hostContext.logger.warn(`dsh-cli: messages.observe listener of Component "${subscription.plugin}" failed; delivery continues`);
|
|
515
515
|
}
|
|
516
516
|
});
|
|
517
517
|
subscription.chain = run.catch(error => {
|
|
518
|
-
observerStateFor(this).hostContext.logger.warn('dsh-
|
|
518
|
+
observerStateFor(this).hostContext.logger.warn('dsh-cli: messages.observe delivery failed');
|
|
519
519
|
}).finally(() => { subscription.pendingCallbacks -= 1; });
|
|
520
520
|
}
|
|
521
521
|
}
|
|
522
522
|
catch (error) {
|
|
523
|
-
observerStateFor(this).hostContext.logger.warn('dsh-
|
|
523
|
+
observerStateFor(this).hostContext.logger.warn('dsh-cli: messages.observe publish failed (event dropped)');
|
|
524
524
|
}
|
|
525
525
|
}
|
|
526
526
|
/** Release a subscription exactly once (disposer, ctx unload, revoke). */
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Shared lightweight counting for the migration adapters.
|
|
3
3
|
*
|
|
4
|
-
* Bare `dsh-
|
|
4
|
+
* Bare `dsh-cli migrate` (and the TUI's `/migrate`) only prints a per-agent
|
|
5
5
|
* count, but discover() parses EVERY file into memory (real-world scale:
|
|
6
6
|
* ~9600 files / 5.5GB → 49s and ~880MB just to print five numbers —
|
|
7
7
|
* deep-review M3). countSessions() walks the same trees matching only
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Resolve `bin/dsh-
|
|
2
|
+
* Resolve `bin/dsh-cli.js` for the package that contains `fromDir`, or
|
|
3
3
|
* undefined when no ancestor within the probe bound carries it.
|
|
4
4
|
*/
|
|
5
5
|
export declare function resolveOwnBin(fromDir: string): string | undefined;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Locate this package's `bin/dsh-
|
|
2
|
+
* Locate this package's `bin/dsh-cli.js` from a module directory inside it.
|
|
3
3
|
*
|
|
4
4
|
* The TUI's `/migrate` spawns the CLI through the package bin so the import
|
|
5
5
|
* runs in a child process. Callers live at DIFFERENT depths per layout:
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* installed (four levels) — a fixed dirname count lands inside the tree and
|
|
8
8
|
* the spawn fails on every real install (the regression the probe-up walk
|
|
9
9
|
* below replaces; found by the independent test session on a real profile).
|
|
10
|
-
* Probing upward for `bin/dsh-
|
|
10
|
+
* Probing upward for `bin/dsh-cli.js` matches both layouts without knowing
|
|
11
11
|
* which one we are in — the same spirit as src/update.ts's manifest walk.
|
|
12
12
|
*
|
|
13
13
|
* @module dsh-cli/migrate/bin-path
|
|
@@ -17,12 +17,12 @@ import { join } from 'node:path';
|
|
|
17
17
|
/** Upward probe bounds: covers src/screens and lib/types/screens layouts. */
|
|
18
18
|
const PROBE_UP = ['..', '../..', '../../..', '../../../..'];
|
|
19
19
|
/**
|
|
20
|
-
* Resolve `bin/dsh-
|
|
20
|
+
* Resolve `bin/dsh-cli.js` for the package that contains `fromDir`, or
|
|
21
21
|
* undefined when no ancestor within the probe bound carries it.
|
|
22
22
|
*/
|
|
23
23
|
export function resolveOwnBin(fromDir) {
|
|
24
24
|
for (const up of PROBE_UP) {
|
|
25
|
-
const candidate = join(fromDir, up, 'bin', 'dsh-
|
|
25
|
+
const candidate = join(fromDir, up, 'bin', 'dsh-cli.js');
|
|
26
26
|
if (existsSync(candidate))
|
|
27
27
|
return candidate;
|
|
28
28
|
}
|
|
@@ -36,7 +36,7 @@ export declare function parseImportSummary(stdout: string): ImportSummary[];
|
|
|
36
36
|
* command is valid must never depend on the picker having been opened first
|
|
37
37
|
* (`migrateRows` is empty on a fresh mount, which used to make every
|
|
38
38
|
* `/migrate <agent>` report an unknown source), and the CLI keeps the same
|
|
39
|
-
* one-source rule (`dsh-
|
|
39
|
+
* one-source rule (`dsh-cli migrate a b` is a usage error there too).
|
|
40
40
|
*
|
|
41
41
|
* @param rawInput - arguments after `/migrate`, e.g. `" claude-code --dry-run"`.
|
|
42
42
|
* @param knownAgentIds - the adapter registry's ids (see MIGRATION_ADAPTERS).
|
|
@@ -64,7 +64,7 @@ export function parseImportSummary(stdout) {
|
|
|
64
64
|
* command is valid must never depend on the picker having been opened first
|
|
65
65
|
* (`migrateRows` is empty on a fresh mount, which used to make every
|
|
66
66
|
* `/migrate <agent>` report an unknown source), and the CLI keeps the same
|
|
67
|
-
* one-source rule (`dsh-
|
|
67
|
+
* one-source rule (`dsh-cli migrate a b` is a usage error there too).
|
|
68
68
|
*
|
|
69
69
|
* @param rawInput - arguments after `/migrate`, e.g. `" claude-code --dry-run"`.
|
|
70
70
|
* @param knownAgentIds - the adapter registry's ids (see MIGRATION_ADAPTERS).
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* @module dsh-cli/migrate/uuid
|
|
10
10
|
*/
|
|
11
11
|
import { createHash } from 'node:crypto';
|
|
12
|
-
/** This project's migration namespace: dsh-
|
|
12
|
+
/** This project's migration namespace: dsh-cli-migrate as 16 fixed bytes. */
|
|
13
13
|
const NAMESPACE = Buffer.from([0x9f, 0x1d, 0x3a, 0x72, 0x6c, 0x55, 0x4c, 0x8e, 0xb0, 0x2f, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74]);
|
|
14
14
|
/**
|
|
15
15
|
* RFC 4122 UUIDv5 over the migration namespace.
|
|
@@ -7,7 +7,7 @@ export function packagedPresetRoot(moduleUrl = import.meta.url) {
|
|
|
7
7
|
const candidates = [join(directory, '../../presets'), join(directory, '../../../presets')];
|
|
8
8
|
const found = candidates.find(candidate => existsSync(candidate));
|
|
9
9
|
if (found === undefined) {
|
|
10
|
-
throw new Error(`dsh-
|
|
10
|
+
throw new Error(`dsh-cli: packaged preset root is missing (checked ${candidates.join(', ')})`);
|
|
11
11
|
}
|
|
12
12
|
return found;
|
|
13
13
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The dsh-
|
|
2
|
+
* The dsh-cli-plugin-host row: the plugin-interop anchor every later
|
|
3
3
|
* contract surface hangs off (storage.local, messages.observe, effect
|
|
4
4
|
* ledger — each lands as a sibling service mounted by THIS row's apply, so
|
|
5
5
|
* the patch surface changed exactly once for the whole v0.15 alignment).
|
|
@@ -200,6 +200,6 @@ export declare function getHostAdmission(runtime: TuiPluginHost | TuiPluginHostR
|
|
|
200
200
|
* describe() wrapper. It remains read-only and shadow-guarded.
|
|
201
201
|
*/
|
|
202
202
|
export declare function getHostFacade(runtime: TuiPluginHost | TuiPluginHostRuntime | undefined): import("../adapter/index.js").HostFacade | undefined;
|
|
203
|
-
export declare const name = "dsh-
|
|
203
|
+
export declare const name = "dsh-cli-plugin-host";
|
|
204
204
|
export declare function apply(ctx: Context): void;
|
|
205
205
|
//# sourceMappingURL=plugin-host.d.ts.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The dsh-
|
|
2
|
+
* The dsh-cli-plugin-host row: the plugin-interop anchor every later
|
|
3
3
|
* contract surface hangs off (storage.local, messages.observe, effect
|
|
4
4
|
* ledger — each lands as a sibling service mounted by THIS row's apply, so
|
|
5
5
|
* the patch surface changed exactly once for the whole v0.15 alignment).
|
|
@@ -147,7 +147,7 @@ export class TuiPluginHostRuntime extends Service {
|
|
|
147
147
|
installDecisionGuard(ctx, rawGrants);
|
|
148
148
|
const violations = this.selfCheck();
|
|
149
149
|
if (violations.length > 0) {
|
|
150
|
-
ctx.logger.warn(`dsh-
|
|
150
|
+
ctx.logger.warn(`dsh-cli: vendored adapter registry failed self-check (${violations.length} violation(s)); ` +
|
|
151
151
|
`affected contracts are dropped from the Host Descriptor fail-closed: ${violations.join(' | ')}`);
|
|
152
152
|
}
|
|
153
153
|
}
|
|
@@ -187,7 +187,7 @@ export class TuiPluginHostRuntime extends Service {
|
|
|
187
187
|
const message = error instanceof Error ? error.message : String(error);
|
|
188
188
|
const result = Object.freeze({ status: kernelRuntime.refreshStatus(), error: message });
|
|
189
189
|
state.initialKernelRefreshResult = result;
|
|
190
|
-
this.ctx.logger.warn(`dsh-
|
|
190
|
+
this.ctx.logger.warn(`dsh-cli: kernel live refresh failed: ${message}`);
|
|
191
191
|
state.descriptorBuild = undefined;
|
|
192
192
|
state.descriptorTopology = undefined;
|
|
193
193
|
return result;
|
|
@@ -209,7 +209,7 @@ export class TuiPluginHostRuntime extends Service {
|
|
|
209
209
|
// Production mount/dispose closure: mount the kernel drivers now and
|
|
210
210
|
// dispose them when the plugin-host service's owning fiber unloads.
|
|
211
211
|
void kernelRuntime.mount().catch((error) => {
|
|
212
|
-
this.ctx.logger.warn(`dsh-
|
|
212
|
+
this.ctx.logger.warn(`dsh-cli: kernel driver mount failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
213
213
|
});
|
|
214
214
|
this.ctx.effect(() => () => {
|
|
215
215
|
kernelRuntime.dispose();
|
|
@@ -263,16 +263,16 @@ export class TuiPluginHostRuntime extends Service {
|
|
|
263
263
|
kernel.detect();
|
|
264
264
|
const build = kernel.descriptorBuild();
|
|
265
265
|
if (host.get('commands') === undefined) {
|
|
266
|
-
host.logger.warn('dsh-
|
|
266
|
+
host.logger.warn('dsh-cli: host descriptor: commands.dsh/v1alpha1#Command excluded — the commands service is not mounted on this context');
|
|
267
267
|
}
|
|
268
268
|
if (host.get('tuiPluginStorage') === undefined) {
|
|
269
|
-
host.logger.warn('dsh-
|
|
269
|
+
host.logger.warn('dsh-cli: host descriptor: storage.dsh/v1alpha1#LocalStorage excluded — the tuiPluginStorage service is not mounted on this context');
|
|
270
270
|
}
|
|
271
271
|
if (host.get('tuiMessageObserver') === undefined) {
|
|
272
|
-
host.logger.warn('dsh-
|
|
272
|
+
host.logger.warn('dsh-cli: host descriptor: messages.dsh/v1alpha1#MessageObserver excluded — the tuiMessageObserver service is not mounted on this context');
|
|
273
273
|
}
|
|
274
274
|
for (const warning of build.warnings) {
|
|
275
|
-
host.logger.warn(`dsh-
|
|
275
|
+
host.logger.warn(`dsh-cli: host descriptor: ${warning}`);
|
|
276
276
|
}
|
|
277
277
|
return build;
|
|
278
278
|
}
|
|
@@ -311,17 +311,17 @@ export class TuiPluginHostRuntime extends Service {
|
|
|
311
311
|
});
|
|
312
312
|
state.descriptorTopology = topology;
|
|
313
313
|
for (const warning of state.descriptorBuild.warnings) {
|
|
314
|
-
host.logger.warn(`dsh-
|
|
314
|
+
host.logger.warn(`dsh-cli: host descriptor: ${warning}`);
|
|
315
315
|
}
|
|
316
316
|
}
|
|
317
317
|
if (host.get('commands') === undefined) {
|
|
318
|
-
host.logger.warn('dsh-
|
|
318
|
+
host.logger.warn('dsh-cli: host descriptor: commands.dsh/v1alpha1#Command excluded — the commands service is not mounted on this context');
|
|
319
319
|
}
|
|
320
320
|
if (host.get('tuiPluginStorage') === undefined) {
|
|
321
|
-
host.logger.warn('dsh-
|
|
321
|
+
host.logger.warn('dsh-cli: host descriptor: storage.dsh/v1alpha1#LocalStorage excluded — the tuiPluginStorage service is not mounted on this context');
|
|
322
322
|
}
|
|
323
323
|
if (host.get('tuiMessageObserver') === undefined) {
|
|
324
|
-
host.logger.warn('dsh-
|
|
324
|
+
host.logger.warn('dsh-cli: host descriptor: messages.dsh/v1alpha1#MessageObserver excluded — the tuiMessageObserver service is not mounted on this context');
|
|
325
325
|
}
|
|
326
326
|
return state.descriptorBuild;
|
|
327
327
|
}
|
|
@@ -337,21 +337,21 @@ export class TuiPluginHostRuntime extends Service {
|
|
|
337
337
|
void pluginCtx;
|
|
338
338
|
void source;
|
|
339
339
|
void options;
|
|
340
|
-
throw new Error('dsh-
|
|
340
|
+
throw new Error('dsh-cli: admission is host-owned; the loader must use its admission capability');
|
|
341
341
|
}
|
|
342
342
|
/** @internal Host loader entry; the unexported production token prevents
|
|
343
343
|
* proxy calls. The test token is only reachable from the test-only adapter
|
|
344
344
|
* helper, never from the package's production admission accessor. */
|
|
345
345
|
admitInternal(pluginCtx, source, options = {}, token) {
|
|
346
346
|
if (token !== HOST_ADMISSION_TOKEN && token !== HOST_ADMISSION_TEST_TOKEN) {
|
|
347
|
-
throw new Error('dsh-
|
|
347
|
+
throw new Error('dsh-cli: admission capability is host-owned');
|
|
348
348
|
}
|
|
349
349
|
this.assertEffect('host.admission');
|
|
350
350
|
const host = hostContextFor(this);
|
|
351
351
|
const caller = assertActivationContext(host, pluginCtx);
|
|
352
352
|
const callerFiber = activationFiber(caller);
|
|
353
353
|
if (callerFiber === undefined) {
|
|
354
|
-
throw new Error('dsh-
|
|
354
|
+
throw new Error('dsh-cli: admission requires an owning Cordis activation fiber');
|
|
355
355
|
}
|
|
356
356
|
const manifest = parseManifest(source, { source: options.source });
|
|
357
357
|
// The host (not the caller) owns the activation instance identity.
|
|
@@ -365,10 +365,10 @@ export class TuiPluginHostRuntime extends Service {
|
|
|
365
365
|
: issueActivationId(callerFiber);
|
|
366
366
|
const data = loadSpecData();
|
|
367
367
|
if (data === undefined)
|
|
368
|
-
throw new Error('dsh-
|
|
368
|
+
throw new Error('dsh-cli: admission profile is unavailable');
|
|
369
369
|
const specViolations = [...verifyRegistry(data), ...verifyContractProfiles(data)];
|
|
370
370
|
if (specViolations.length > 0) {
|
|
371
|
-
throw new Error(`dsh-
|
|
371
|
+
throw new Error(`dsh-cli: admission profile self-check failed: ${specViolations.join(' | ')}`);
|
|
372
372
|
}
|
|
373
373
|
const index = createContractIndex(data.registry, data.permissions);
|
|
374
374
|
validatePlugin(index, manifest);
|
|
@@ -392,7 +392,7 @@ export class TuiPluginHostRuntime extends Service {
|
|
|
392
392
|
const missing = 'missingRequired' in decision && decision.missingRequired !== undefined
|
|
393
393
|
? ` (${decision.missingRequired.join(', ')})`
|
|
394
394
|
: '';
|
|
395
|
-
throw new Error(`dsh-
|
|
395
|
+
throw new Error(`dsh-cli: Component ${manifest.id} admission ${decision.decision}: ${'reasonCode' in decision ? decision.reasonCode : 'incompatible'}${missing}`);
|
|
396
396
|
}
|
|
397
397
|
return bindComponentIdentity(caller, manifest, projection, activationId);
|
|
398
398
|
}
|
|
@@ -410,7 +410,7 @@ export class TuiPluginHostRuntime extends Service {
|
|
|
410
410
|
assertCallerContext(this.ctx, caller, 'DecisionEvents.subscribe', this);
|
|
411
411
|
const identity = requireComponentIdentity(caller);
|
|
412
412
|
if (!requiresDecisionEvents(identity)) {
|
|
413
|
-
throw new Error(`dsh-
|
|
413
|
+
throw new Error(`dsh-cli: Component "${identity.componentId}" must require tui.dsh/v1alpha1#DecisionEvents before subscribing`);
|
|
414
414
|
}
|
|
415
415
|
const previousMetadata = decisionHandlerMetadataOf(listener);
|
|
416
416
|
const release = withDecisionRegistration(caller, () => registerDecisionHandler(caller, identity, event, listener, options, () => {
|
|
@@ -446,22 +446,22 @@ export class TuiPluginHostRuntime extends Service {
|
|
|
446
446
|
// layer. Its traceable service proxy carries this context into register().
|
|
447
447
|
const commands = caller.get('commands');
|
|
448
448
|
if (commands === undefined) {
|
|
449
|
-
throw new Error('dsh-
|
|
449
|
+
throw new Error('dsh-cli: registerCommand unavailable — the commands service is not mounted on this context');
|
|
450
450
|
}
|
|
451
451
|
const identity = requireComponentIdentity(caller);
|
|
452
452
|
if (!requiresContract(identity, 'commands.dsh/v1alpha1', 'Command')) {
|
|
453
|
-
throw new Error(`dsh-
|
|
453
|
+
throw new Error(`dsh-cli: Component "${identity.componentId}" must require commands.dsh/v1alpha1#Command before registering commands`);
|
|
454
454
|
}
|
|
455
455
|
const definition = typeof contributionOrDefinition === 'string' ? explicitDefinition : contributionOrDefinition;
|
|
456
456
|
if (definition === undefined)
|
|
457
|
-
throw new TypeError('dsh-
|
|
457
|
+
throw new TypeError('dsh-cli: registerCommand requires a command definition');
|
|
458
458
|
const name = typeof definition.name === 'string' ? definition.name : 'unknown';
|
|
459
459
|
const inferred = identity.manifest.contributes.commands.filter(command => command.id === name || command.id.endsWith(`.${name}`));
|
|
460
460
|
const contributionId = typeof contributionOrDefinition === 'string'
|
|
461
461
|
? contributionOrDefinition
|
|
462
462
|
: inferred.length === 1 ? inferred[0].id : '';
|
|
463
463
|
if (contributionId === '' || !declaresCommand(identity, contributionId)) {
|
|
464
|
-
throw new TypeError(`dsh-
|
|
464
|
+
throw new TypeError(`dsh-cli: command "${name}" is not bound to a declared contribution id`);
|
|
465
465
|
}
|
|
466
466
|
// dsh-commands normalizes into a fresh definition and intentionally drops
|
|
467
467
|
// unknown fields. A per-registration handler wrapper survives that copy,
|
|
@@ -539,10 +539,10 @@ export class TuiPluginHostRuntime extends Service {
|
|
|
539
539
|
throw new Error('commands service is not mounted for reversible command probe');
|
|
540
540
|
}
|
|
541
541
|
const service = commands;
|
|
542
|
-
const name = `
|
|
542
|
+
const name = `dsh_cli_live_probe_${randomUUID().replace(/-/g, '').slice(0, 12)}`;
|
|
543
543
|
const definition = {
|
|
544
544
|
name,
|
|
545
|
-
description: 'dsh-
|
|
545
|
+
description: 'dsh-cli adapter reversible live probe',
|
|
546
546
|
handler: () => ({ kind: 'success', text: 'ok' }),
|
|
547
547
|
};
|
|
548
548
|
let dispose;
|
|
@@ -617,8 +617,8 @@ export class TuiPluginHostRuntime extends Service {
|
|
|
617
617
|
return [...verifyRegistry(data), ...verifyContractProfiles(data)];
|
|
618
618
|
}
|
|
619
619
|
}
|
|
620
|
-
const HOST_ADMISSION_TOKEN = Symbol('dsh-
|
|
621
|
-
const HOST_ADMISSION_TEST_TOKEN = Symbol('dsh-
|
|
620
|
+
const HOST_ADMISSION_TOKEN = Symbol('dsh-cli.host-admission');
|
|
621
|
+
const HOST_ADMISSION_TEST_TOKEN = Symbol('dsh-cli.host-admission-test');
|
|
622
622
|
/** Per-activation fiber -> host-issued opaque activation id (Cordis activation scope). */
|
|
623
623
|
const activationFiberIds = new WeakMap();
|
|
624
624
|
function issueActivationId(fiber) {
|
|
@@ -651,7 +651,7 @@ export function getHostInitialKernelRefreshForTest(runtime) {
|
|
|
651
651
|
await state.initialKernelRefreshStarted;
|
|
652
652
|
const refresh = state.initialKernelRefresh;
|
|
653
653
|
if (refresh === undefined) {
|
|
654
|
-
throw new Error('dsh-
|
|
654
|
+
throw new Error('dsh-cli: host initial kernel refresh was not started');
|
|
655
655
|
}
|
|
656
656
|
return refresh;
|
|
657
657
|
},
|
|
@@ -731,17 +731,17 @@ function assertActivationContext(hostCtx, pluginCtx) {
|
|
|
731
731
|
|| caller === root
|
|
732
732
|
|| callerFiber === undefined
|
|
733
733
|
|| callerFiber === rootFiber) {
|
|
734
|
-
throw new Error('dsh-
|
|
734
|
+
throw new Error('dsh-cli: mediated capability requires a non-root activation context from the host composition');
|
|
735
735
|
}
|
|
736
736
|
return caller;
|
|
737
737
|
}
|
|
738
738
|
catch (error) {
|
|
739
|
-
if (error instanceof Error && error.message.startsWith('dsh-
|
|
739
|
+
if (error instanceof Error && error.message.startsWith('dsh-cli:'))
|
|
740
740
|
throw error;
|
|
741
|
-
throw new Error('dsh-
|
|
741
|
+
throw new Error('dsh-cli: mediated capability requires a live activation context');
|
|
742
742
|
}
|
|
743
743
|
}
|
|
744
|
-
export const name = 'dsh-
|
|
744
|
+
export const name = 'dsh-cli-plugin-host';
|
|
745
745
|
export function apply(ctx) {
|
|
746
746
|
// The plugin-host service first — the contract surfaces mounted below
|
|
747
747
|
// read its grant store (they fall back to a private read only when mounted
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* storage.local contract surface (C-040, `storage.dsh/v1alpha1#LocalStorage`):
|
|
3
|
-
* per-plugin private persistence, mounted by the dsh-
|
|
3
|
+
* per-plugin private persistence, mounted by the dsh-cli-plugin-host row as
|
|
4
4
|
* `ctx.tuiPluginStorage`.
|
|
5
5
|
*
|
|
6
6
|
* The plugin-facing API is `open(ctx)` → `{ get, set, delete }`:
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* - GRANTS AT CALL TIME: `get` requires `storage.local.read`, `set`/`delete`
|
|
12
12
|
* require `storage.local.write` — checked per call against the live grant
|
|
13
13
|
* store (a revoked grant blocks the very next operation without restart).
|
|
14
|
-
* - Backend: `~/.dsh-
|
|
14
|
+
* - Backend: `~/.dsh-cli/plugin-storage/<namespace>.json`, one flat JSON
|
|
15
15
|
* object per namespace. Writes go through dsh-atomic-write (`withFileLock`
|
|
16
16
|
* for the read-modify-write cycle + `writeFileAtomic` for the commit), and
|
|
17
17
|
* an in-process per-namespace promise chain serializes operations in
|
|
@@ -81,7 +81,7 @@ export declare const PLUGIN_STORAGE_DIR = "plugin-storage";
|
|
|
81
81
|
export declare function storageFileName(plugin: string): string;
|
|
82
82
|
/**
|
|
83
83
|
* `ctx.tuiPluginStorage` — storage.local contract surface. Mounted by the
|
|
84
|
-
* dsh-
|
|
84
|
+
* dsh-cli-plugin-host row; grants come from that row's store when present
|
|
85
85
|
* (normal path) or a private read otherwise (bare mounts in tests).
|
|
86
86
|
*/
|
|
87
87
|
export declare class TuiPluginStorageRuntime extends Service {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* storage.local contract surface (C-040, `storage.dsh/v1alpha1#LocalStorage`):
|
|
3
|
-
* per-plugin private persistence, mounted by the dsh-
|
|
3
|
+
* per-plugin private persistence, mounted by the dsh-cli-plugin-host row as
|
|
4
4
|
* `ctx.tuiPluginStorage`.
|
|
5
5
|
*
|
|
6
6
|
* The plugin-facing API is `open(ctx)` → `{ get, set, delete }`:
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* - GRANTS AT CALL TIME: `get` requires `storage.local.read`, `set`/`delete`
|
|
12
12
|
* require `storage.local.write` — checked per call against the live grant
|
|
13
13
|
* store (a revoked grant blocks the very next operation without restart).
|
|
14
|
-
* - Backend: `~/.dsh-
|
|
14
|
+
* - Backend: `~/.dsh-cli/plugin-storage/<namespace>.json`, one flat JSON
|
|
15
15
|
* object per namespace. Writes go through dsh-atomic-write (`withFileLock`
|
|
16
16
|
* for the read-modify-write cycle + `writeFileAtomic` for the commit), and
|
|
17
17
|
* an in-process per-namespace promise chain serializes operations in
|
|
@@ -212,7 +212,7 @@ function isJsonValue(value, seen) {
|
|
|
212
212
|
}
|
|
213
213
|
/**
|
|
214
214
|
* `ctx.tuiPluginStorage` — storage.local contract surface. Mounted by the
|
|
215
|
-
* dsh-
|
|
215
|
+
* dsh-cli-plugin-host row; grants come from that row's store when present
|
|
216
216
|
* (normal path) or a private read otherwise (bare mounts in tests).
|
|
217
217
|
*/
|
|
218
218
|
export class TuiPluginStorageRuntime extends Service {
|
|
@@ -280,7 +280,7 @@ export class TuiPluginStorageRuntime extends Service {
|
|
|
280
280
|
async #runReversibleProbe() {
|
|
281
281
|
assertCapabilityShadowPolicy('host.storage.liveProbe', storageStateFor(this).runtime.mode, storageStateFor(this).runtime.slices);
|
|
282
282
|
const state = storageStateFor(this);
|
|
283
|
-
const tempNamespace = `
|
|
283
|
+
const tempNamespace = `__dsh_cli_live_probe_${randomUUID().replace(/-/g, '')}`;
|
|
284
284
|
const file = join(state.dir, `${storageFileName(tempNamespace)}.json`);
|
|
285
285
|
const operations = [];
|
|
286
286
|
const identity = {
|
|
@@ -456,7 +456,7 @@ export class TuiPluginStorageRuntime extends Service {
|
|
|
456
456
|
errorCode: 'PERMISSION_NOT_GRANTED',
|
|
457
457
|
}, caller);
|
|
458
458
|
throw new PluginStorageError('PERMISSION_NOT_GRANTED', `storage.${permission.endsWith('.read') ? 'get' : 'set/delete'} from plugin "${plugin}" denied — grant "${permission}" ` +
|
|
459
|
-
`for "${plugin}" in ~/.dsh-
|
|
459
|
+
`for "${plugin}" in ~/.dsh-cli/extension-grants.json first`);
|
|
460
460
|
}
|
|
461
461
|
};
|
|
462
462
|
// withFileLock creates its lock as a SIBLING of the file and does not
|
|
@@ -12,13 +12,13 @@ export declare function initialPromptFromCmdlineArgs(args: readonly string[] | u
|
|
|
12
12
|
* How this process should treat the TUI frontend, given the terminal it runs on.
|
|
13
13
|
*
|
|
14
14
|
* Three startup identities exist:
|
|
15
|
-
* 1. `dsh-
|
|
16
|
-
* 2. Web / Tauri / other GUI hosts — the profile merely has dsh-
|
|
17
|
-
* and the current process is NOT a dsh-
|
|
15
|
+
* 1. `dsh-cli` / standalone — the user explicitly asked for the terminal UI;
|
|
16
|
+
* 2. Web / Tauri / other GUI hosts — the profile merely has dsh-cli installed
|
|
17
|
+
* and the current process is NOT a dsh-cli frontend. stdout is a pipe or
|
|
18
18
|
* null there, and mounting a TUI would fail the whole composition.
|
|
19
19
|
*
|
|
20
20
|
* The official launcher (and the standalone runtime) mark explicit launches,
|
|
21
|
-
* so an explicit `dsh-
|
|
21
|
+
* so an explicit `dsh-cli` run without a TTY keeps failing loudly, while
|
|
22
22
|
* foreign hosts skip the plugin and let the host boot.
|
|
23
23
|
*/
|
|
24
24
|
export type TuiHostMode = 'interactive' | 'invalid-explicit-launch' | 'headless-host';
|