@tutti-os/workspace-terminal 0.0.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/workbench/index.ts","../../src/workbench/bodyProps.ts","../../src/workbench/launchAnalytics.ts","../../src/workbench/windowCloseEffect.ts"],"sourcesContent":["import { createElement, type PointerEvent, type ReactNode } from \"react\";\nimport type {\n WorkbenchContribution,\n WorkbenchFrame,\n WorkbenchHostDockEntry,\n WorkbenchHostExternalStateSource,\n WorkbenchHostLaunchRequest,\n WorkbenchHostLaunchResult,\n WorkbenchHostNodeCloseDecision,\n WorkbenchHostNodeCloseRequest,\n WorkbenchHostNodeDefinition\n} from \"@tutti-os/workbench-surface\";\nimport type {\n TerminalCloseGuardResult,\n TerminalHeaderAccessoryRenderer,\n TerminalLaunchInput,\n TerminalNodeExternalState\n} from \"../contracts/index.ts\";\nimport { closeTerminalSession } from \"../core/index.ts\";\nimport type { TerminalNodeFeature } from \"../core/feature.ts\";\nimport { acquireTerminalSessionController } from \"../core/sessionController.ts\";\nimport { resolveTerminalWorkbenchBodyProps } from \"./bodyProps.ts\";\nimport { resolveTerminalLaunchAnalyticsTrigger } from \"./launchAnalytics.ts\";\nimport { resolveTerminalWindowCloseEffect } from \"./windowCloseEffect.ts\";\nimport { TerminalNode, TerminalNodeHeader } from \"../react/TerminalNode.tsx\";\n\nexport interface TerminalWorkbenchIntent {\n cwd?: string | null;\n initialInput?: string | null;\n profileId?: string | null;\n}\n\nexport interface CreateTerminalWorkbenchNodeDefinitionInput {\n feature: TerminalNodeFeature;\n frame?: WorkbenchFrame;\n headerAccessory?: TerminalHeaderAccessoryRenderer;\n title?: string;\n typeId?: string;\n}\n\nexport type TerminalWorkbenchLaunchInputResolver = (\n request: WorkbenchHostLaunchRequest\n) =>\n | Promise<Partial<Omit<TerminalLaunchInput, \"reason\" | \"workspaceId\">>>\n | Partial<Omit<TerminalLaunchInput, \"reason\" | \"workspaceId\">>;\n\nexport interface CreateTerminalWorkbenchLaunchHandlerInput {\n feature: TerminalNodeFeature;\n frame?: WorkbenchFrame;\n resolveLaunchInput?: TerminalWorkbenchLaunchInputResolver;\n typeId?: string;\n}\n\nexport interface CreateTerminalDockEntryInput {\n dockIcon?: ReactNode;\n feature: TerminalNodeFeature;\n id?: string;\n order?: number;\n sectionId?: string;\n typeId?: string;\n}\n\nexport interface TerminalWorkbenchContributionCloseFailure {\n error: unknown;\n sessionId: string;\n status?: TerminalNodeExternalState[\"status\"];\n}\n\nexport interface CreateTerminalWorkbenchContributionInput {\n contributionId?: string;\n dockEntry?: Omit<CreateTerminalDockEntryInput, \"feature\">;\n externalStateSource?: WorkbenchHostExternalStateSource<\n TerminalNodeExternalState | null,\n unknown\n >;\n feature: TerminalNodeFeature;\n getTerminalState?: (sessionId: string) => TerminalNodeExternalState | null;\n node?: Omit<CreateTerminalWorkbenchNodeDefinitionInput, \"feature\">;\n onCloseFailure?: (failure: TerminalWorkbenchContributionCloseFailure) => void;\n onConfirmClose?: (\n guard: TerminalCloseGuardResult\n ) => Promise<boolean> | boolean;\n resolveLaunchInput?: TerminalWorkbenchLaunchInputResolver;\n shouldCloseAfterCloseFailure?: (\n failure: TerminalWorkbenchContributionCloseFailure\n ) => boolean;\n typeId?: string;\n}\n\nexport const defaultTerminalWorkbenchTypeId = \"workspace-terminal\";\n\nconst defaultTerminalNodeFrame: WorkbenchFrame = {\n height: 520,\n width: 860,\n x: 260,\n y: 140\n};\n\nexport function createTerminalWorkbenchNodeDefinition({\n feature,\n frame = defaultTerminalNodeFrame,\n headerAccessory,\n title,\n typeId = defaultTerminalWorkbenchTypeId\n}: CreateTerminalWorkbenchNodeDefinitionInput): WorkbenchHostNodeDefinition<TerminalNodeExternalState> {\n return {\n frame,\n instance: {\n mode: \"multi\"\n },\n renderBody: (context) =>\n createElement(\n TerminalNode,\n resolveTerminalWorkbenchBodyProps({ context, feature })\n ),\n createLease: ({ node }) => {\n const sessionId = node.data.instanceKey ?? null;\n if (!sessionId) {\n return null;\n }\n const controller = acquireTerminalSessionController({\n feature,\n nodeId: node.id,\n sessionId\n });\n controller.retain();\n return {\n release() {\n controller.release();\n }\n };\n },\n getWindowCloseEffect: ({ externalNodeState, node }) =>\n resolveTerminalWindowCloseEffect({\n closeGuard: feature.closeGuard,\n description: feature.i18n.t(\"closeGuard.description\"),\n externalNodeState,\n nodeId: node.id,\n sessionId: node.data.instanceKey ?? null,\n title: node.title,\n typeId\n }),\n renderHeader: ({\n defaultActions,\n dragHandleProps,\n externalNodeState,\n isFocused,\n node,\n windowActions\n }) =>\n createElement(TerminalNodeHeader, {\n defaultActions,\n externalState: externalNodeState,\n feature,\n headerAccessory,\n onCloseRequest: () => windowActions.close(),\n sessionId: node.data.instanceKey ?? null,\n ...dragHandleProps,\n onPointerDown: (event: PointerEvent<HTMLElement>) => {\n dragHandleProps.onPointerDown?.(event);\n if (!isFocused) {\n windowActions.focus();\n }\n }\n }),\n title: title ?? feature.i18n.t(\"title\"),\n typeId,\n window: {\n closable: true,\n defaultOpen: false,\n minimizedDock: {\n kind: \"snapshot\"\n },\n minimizable: true,\n restoreOnLoad: true\n }\n };\n}\n\nexport function createTerminalDockEntry({\n dockIcon,\n feature,\n id,\n order,\n sectionId,\n typeId = defaultTerminalWorkbenchTypeId\n}: CreateTerminalDockEntryInput): WorkbenchHostDockEntry {\n return {\n icon: dockIcon ?? createElement(DefaultTerminalDockIcon),\n id: id ?? typeId,\n label: feature.i18n.t(\"dockLabel\"),\n launchBehavior: \"enabled\",\n matchNode: (node) => node.data.typeId === typeId,\n order,\n resolvePopupItem: ({ node }) => ({\n subtitle: node.data.instanceKey ?? node.data.instanceId,\n title: node.title\n }),\n sectionId,\n typeId,\n visibility: \"always\"\n };\n}\n\nexport function createTerminalWorkbenchLaunchHandler({\n feature,\n frame = defaultTerminalNodeFrame,\n resolveLaunchInput,\n typeId = defaultTerminalWorkbenchTypeId\n}: CreateTerminalWorkbenchLaunchHandlerInput): (\n request: WorkbenchHostLaunchRequest\n) => Promise<WorkbenchHostLaunchResult | null> {\n return async (request) => {\n if (request.typeId !== typeId) {\n return null;\n }\n\n const resolved = (await resolveLaunchInput?.(request)) ?? {};\n const descriptor = await feature.launchService.create({\n cwd: resolved.cwd,\n initialInput: resolved.initialInput,\n profileId: resolved.profileId,\n reason: request.reason === \"dock\" ? \"dock\" : \"intent\",\n workspaceId: request.workspaceId\n });\n\n return {\n activation: {\n payload: {\n trigger: resolveTerminalLaunchAnalyticsTrigger(request)\n },\n type: \"terminal-launch\"\n },\n defaultFrame: frame,\n dockEntryId: request.dockEntryId ?? typeId,\n framePolicy: \"cascade\",\n instanceId: descriptor.sessionId,\n instanceKey: descriptor.sessionId,\n title: descriptor.title,\n typeId\n };\n };\n}\n\nexport function createTerminalWorkbenchContribution({\n contributionId,\n dockEntry,\n externalStateSource,\n feature,\n getTerminalState,\n node,\n onCloseFailure,\n onConfirmClose,\n resolveLaunchInput,\n shouldCloseAfterCloseFailure,\n typeId = defaultTerminalWorkbenchTypeId\n}: CreateTerminalWorkbenchContributionInput): WorkbenchContribution {\n return {\n dockEntries: [\n createTerminalDockEntry({\n ...dockEntry,\n feature,\n typeId\n })\n ],\n externalStateSource,\n id: contributionId ?? typeId,\n nodes: [\n createTerminalWorkbenchNodeDefinition({\n ...node,\n feature,\n typeId\n })\n ],\n onLaunchRequest: createTerminalWorkbenchLaunchHandler({\n feature,\n frame: node?.frame,\n resolveLaunchInput,\n typeId\n }),\n onNodeCloseRequest: onConfirmClose\n ? (request) =>\n handleTerminalContributionNodeCloseRequest({\n feature,\n getTerminalState,\n onCloseFailure,\n onConfirmClose,\n request,\n shouldCloseAfterCloseFailure,\n typeId\n })\n : undefined\n };\n}\n\nasync function handleTerminalContributionNodeCloseRequest(input: {\n feature: TerminalNodeFeature;\n getTerminalState?: (sessionId: string) => TerminalNodeExternalState | null;\n onCloseFailure?: (failure: TerminalWorkbenchContributionCloseFailure) => void;\n onConfirmClose: (\n guard: TerminalCloseGuardResult\n ) => Promise<boolean> | boolean;\n request: WorkbenchHostNodeCloseRequest;\n shouldCloseAfterCloseFailure?: (\n failure: TerminalWorkbenchContributionCloseFailure\n ) => boolean;\n typeId: string;\n}): Promise<WorkbenchHostNodeCloseDecision | void> {\n if (input.request.typeId !== input.typeId) {\n return undefined;\n }\n\n const sessionId = input.request.instanceKey ?? input.request.instanceId;\n const terminalState = input.getTerminalState?.(sessionId) ?? null;\n try {\n const result = await closeTerminalSession({\n confirm: input.onConfirmClose,\n feature: input.feature,\n sessionId,\n status: terminalState?.status\n });\n return result === \"closed\" ? \"close\" : \"keep-open\";\n } catch (error) {\n const failure = {\n error,\n sessionId,\n status: terminalState?.status\n };\n input.onCloseFailure?.(failure);\n return input.shouldCloseAfterCloseFailure?.(failure)\n ? \"close\"\n : \"keep-open\";\n }\n}\n\nfunction DefaultTerminalDockIcon() {\n return createElement(\n \"span\",\n {\n \"aria-hidden\": \"true\",\n className: \"workspace-terminal__dock-icon\"\n },\n \">\"\n );\n}\n","import type { WorkbenchHostNodeBodyContext } from \"@tutti-os/workbench-surface\";\nimport type { TerminalNodeExternalState } from \"../contracts/index.ts\";\nimport type { TerminalNodeFeature } from \"../core/feature.ts\";\n\nexport interface TerminalWorkbenchBodyProps {\n externalState: TerminalNodeExternalState | null;\n feature: TerminalNodeFeature;\n nodeId: string;\n onFocusRequest?: () => void;\n sessionId: string | null;\n showHeader: boolean;\n}\n\nexport function resolveTerminalWorkbenchBodyProps({\n context,\n feature\n}: {\n context: WorkbenchHostNodeBodyContext<\n TerminalNodeExternalState | null,\n unknown\n >;\n feature: TerminalNodeFeature;\n}): TerminalWorkbenchBodyProps {\n // Keep this resolver narrower than TerminalNodeProps on purpose. The workbench\n // lease keeps the session alive while the node exists, but the mounted surface\n // must still retain the controller so snapshot hydration starts immediately.\n // Passing controllerLeaseRetainedExternally here makes a newly opened terminal\n // render blank until the first user input triggers controller.write().\n return {\n externalState: context.externalNodeState,\n feature,\n nodeId: context.node.id,\n onFocusRequest: context.isFocused ? undefined : () => context.focus(),\n sessionId: context.node.data.instanceKey ?? null,\n showHeader: false\n };\n}\n","import type { WorkbenchHostLaunchRequest } from \"@tutti-os/workbench-surface\";\n\nexport type TerminalLaunchAnalyticsTrigger =\n | \"agent_command\"\n | \"dock\"\n | \"keyboard\"\n | \"launchpad\";\n\nexport function resolveTerminalLaunchAnalyticsTrigger(\n request: WorkbenchHostLaunchRequest\n): TerminalLaunchAnalyticsTrigger {\n switch (request.reason) {\n case \"dock\":\n return \"dock\";\n case \"launchpad\":\n return \"launchpad\";\n case \"shortcut\":\n return \"keyboard\";\n case \"host\":\n return hasInitialInput(request.payload) ? \"agent_command\" : \"launchpad\";\n default:\n return \"launchpad\";\n }\n}\n\nfunction hasInitialInput(payload: unknown): boolean {\n if (!payload || typeof payload !== \"object\") {\n return false;\n }\n const typed = payload as { initialInput?: unknown };\n return (\n typeof typed.initialInput === \"string\" &&\n typed.initialInput.trim().length > 0\n );\n}\n","import type {\n TerminalCloseGuardService,\n TerminalNodeExternalState\n} from \"../contracts/index.ts\";\nimport { isTerminalSessionEndedStatus } from \"../core/sessionProjection.ts\";\n\nexport interface ResolveTerminalWindowCloseEffectInput {\n closeGuard: TerminalCloseGuardService;\n description: string;\n externalNodeState: TerminalNodeExternalState | null;\n nodeId: string;\n sessionId?: string | null;\n title: string;\n typeId: string;\n}\n\nexport async function resolveTerminalWindowCloseEffect({\n closeGuard,\n description,\n externalNodeState,\n nodeId,\n sessionId,\n title,\n typeId\n}: ResolveTerminalWindowCloseEffectInput) {\n const status = externalNodeState?.status ?? \"created\";\n if (status === \"created\" || isTerminalSessionEndedStatus(status)) {\n return null;\n }\n\n const resolvedSessionId = sessionId ?? externalNodeState?.sessionId ?? null;\n if (resolvedSessionId) {\n try {\n const guard = await closeGuard.check({ sessionId: resolvedSessionId });\n if (\n !guard.requiresConfirmation ||\n guard.reason === \"not-running\" ||\n isTerminalSessionEndedStatus(guard.status)\n ) {\n return null;\n }\n } catch {\n // Fall back to a conservative close effect when guard lookup fails.\n }\n }\n\n return {\n description,\n nodeId,\n title: externalNodeState?.title?.trim() || title,\n typeId\n };\n}\n"],"mappings":"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","names":[]}
package/package.json ADDED
@@ -0,0 +1,74 @@
1
+ {
2
+ "name": "@tutti-os/workspace-terminal",
3
+ "version": "0.0.1",
4
+ "private": false,
5
+ "type": "module",
6
+ "types": "./dist/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "types": "./dist/index.d.ts",
10
+ "import": "./dist/index.js"
11
+ },
12
+ "./contracts": {
13
+ "types": "./dist/contracts/index.d.ts",
14
+ "import": "./dist/contracts/index.js"
15
+ },
16
+ "./i18n": {
17
+ "types": "./dist/i18n/index.d.ts",
18
+ "import": "./dist/i18n/index.js"
19
+ },
20
+ "./react": {
21
+ "types": "./dist/react/index.d.ts",
22
+ "import": "./dist/react/index.js"
23
+ },
24
+ "./styles.css": "./dist/styles/terminal.css",
25
+ "./workbench": {
26
+ "types": "./dist/workbench/index.d.ts",
27
+ "import": "./dist/workbench/index.js"
28
+ }
29
+ },
30
+ "files": [
31
+ "dist",
32
+ "README.md"
33
+ ],
34
+ "repository": {
35
+ "type": "git",
36
+ "url": "git+https://github.com/tutti-os/tutti.git",
37
+ "directory": "packages/workspace/terminal"
38
+ },
39
+ "dependencies": {
40
+ "@tutti-os/ui-i18n-runtime": "0.0.1",
41
+ "@tutti-os/ui-react-hooks": "0.0.1",
42
+ "@tutti-os/ui-system": "0.0.1",
43
+ "@tutti-os/workbench-surface": "0.0.1",
44
+ "@xterm/addon-fit": "^0.11.0",
45
+ "@xterm/addon-search": "^0.16.0",
46
+ "@xterm/addon-serialize": "^0.14.0",
47
+ "@xterm/addon-web-links": "^0.12.0",
48
+ "@xterm/xterm": "^6.0.0"
49
+ },
50
+ "devDependencies": {
51
+ "@types/node": "^24.0.1",
52
+ "@types/react": "^19.1.6",
53
+ "@types/react-dom": "^19.1.5",
54
+ "react": "^19.1.0",
55
+ "react-dom": "^19.1.0",
56
+ "typescript": "^5.8.3",
57
+ "@tutti-os/config-tsconfig": "0.0.0"
58
+ },
59
+ "peerDependencies": {
60
+ "react": "^19.1.0",
61
+ "react-dom": "^19.1.0"
62
+ },
63
+ "nextop": {
64
+ "tailwindSourceRoot": "src"
65
+ },
66
+ "publishConfig": {
67
+ "access": "public"
68
+ },
69
+ "scripts": {
70
+ "build": "tsup --config tsup.config.ts && node ../../../tools/scripts/copy-package-assets.mjs src/styles dist/styles",
71
+ "test": "node --test --experimental-strip-types ./src/**/*.test.ts",
72
+ "typecheck": "tsc --noEmit -p tsconfig.json"
73
+ }
74
+ }