@crewx/sdk 0.9.0-rc.103 → 0.9.0-rc.105

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/dist/activity-log/builder.d.ts +1 -0
  2. package/dist/esm/index.js +191 -181
  3. package/dist/esm/plugins/index.js +81 -78
  4. package/dist/esm/repository/index.js +69 -66
  5. package/dist/events/types.d.ts +1 -0
  6. package/dist/index.d.ts +8 -6
  7. package/dist/index.js +189 -179
  8. package/dist/lifecycle/task-stop.d.ts +4 -1
  9. package/dist/mcp-app/discovery.d.ts +105 -0
  10. package/dist/mcp-app/index.d.ts +9 -3
  11. package/dist/mcp-app/node-app-discovery-fs.d.ts +20 -0
  12. package/dist/mcp-app/registry.d.ts +9 -1
  13. package/dist/mcp-app/state-set.d.ts +9 -0
  14. package/dist/mcp-app/types.d.ts +134 -1
  15. package/dist/mcp-app/workspace-snapshot.d.ts +53 -0
  16. package/dist/migrations/0027_task_stop_scope_cleanup.sql +5 -0
  17. package/dist/migrations/0027_ui_instance_active_unique.sql +2 -0
  18. package/dist/migrations/0029_nice_rhino.sql +1 -0
  19. package/dist/migrations/meta/0029_snapshot.json +3206 -0
  20. package/dist/migrations/meta/_journal.json +21 -0
  21. package/dist/plugins/index.js +82 -79
  22. package/dist/plugins/sqlite-tracing.d.ts +2 -0
  23. package/dist/repository/index.d.ts +1 -1
  24. package/dist/repository/index.js +69 -66
  25. package/dist/repository/task.repository.d.ts +12 -1
  26. package/dist/schema/tasks.d.ts +19 -0
  27. package/dist/types/index.d.ts +1 -0
  28. package/dist/ui-instance/runtime.d.ts +7 -2
  29. package/dist/ui-instance/store.d.ts +1 -0
  30. package/dist/ui-instance/types.d.ts +1 -0
  31. package/dist/ui-plugin/index.d.ts +3 -2
  32. package/dist/ui-plugin/limits.d.ts +27 -0
  33. package/dist/ui-plugin/types.d.ts +97 -2
  34. package/dist/ui-plugin/validator.d.ts +9 -3
  35. package/dist/utils/workspace.d.ts +1 -0
  36. package/package.json +1 -1
@@ -1,4 +1,4 @@
1
- import type { FinalizeTaskForHostShutdownOptions, FinalizeTaskForHostShutdownOutcome, FinalizeTaskStopOptions, TaskRepository, TaskRow, TaskStopRequestResult } from '../repository/task.repository.js';
1
+ import type { FinalizeTaskForHostShutdownOptions, FinalizeTaskForHostShutdownOutcome, FinalizeTaskStopOptions, TaskRepository, TaskRow, TaskStopOrigin, TaskStopRequestResult } from '../repository/task.repository.js';
2
2
  import { checkProcessOwnershipAsync as defaultCheckProcessOwnershipAsync, terminateProcessTree as defaultTerminateProcessTree, type ProcessControlOptions } from '../process/process-control.js';
3
3
  export declare const TASK_STOP_DEFAULT_GRACE_MS = 5000;
4
4
  export declare const TASK_STOP_DEFAULT_POLL_MS = 250;
@@ -17,6 +17,9 @@ export interface StopTaskProcessControl {
17
17
  terminateProcessTree?: typeof defaultTerminateProcessTree;
18
18
  }
19
19
  export interface StopTaskOptions {
20
+ origin?: TaskStopOrigin;
21
+ callerPid?: number;
22
+ callerTaskId?: string;
20
23
  graceMs?: number;
21
24
  pollMs?: number;
22
25
  platform?: NodeJS.Platform;
@@ -0,0 +1,105 @@
1
+ import type { JsonObject, UiDefinition } from '../ui-instance/types.js';
2
+ import type { UiPluginHandlerMetadata, UiPluginManifestV2, UiPluginNormalizedManifestV2 } from '../ui-plugin/types.js';
3
+ import { AppDiscoveryFsError, NodeAppDiscoveryFs, NodeAppDiscoveryFsAdapter, defaultAppDiscoveryFs, defaultNodeAppDiscoveryFs, type AppDiscoveryFsErrorCode } from './node-app-discovery-fs.js';
4
+ import type { McpAppRegistry } from './types.js';
5
+ export type WorkspaceAppSource = 'apps' | 'skills';
6
+ export type WorkspaceAppDiagnosticCode = 'MANIFEST_INVALID' | 'ENTRY_INVALID' | 'INITIAL_STATE_INVALID' | 'DUPLICATE_ID' | 'RESERVED_ID' | 'PATH_ESCAPED' | 'LIMIT_EXCEEDED' | 'EXEC_DENIED';
7
+ export interface WorkspaceAppDiagnostic {
8
+ readonly code: WorkspaceAppDiagnosticCode;
9
+ readonly pluginId?: string;
10
+ readonly source: WorkspaceAppSource;
11
+ readonly relativePath: string;
12
+ }
13
+ export type McpAppDiscoveryDiagnostic = WorkspaceAppDiagnostic;
14
+ export type AppDiscoveryDiagnostic = WorkspaceAppDiagnostic;
15
+ export type AppDiscoveryDirectoryEntryKind = 'file' | 'directory' | 'symlink' | 'other';
16
+ export interface AppDiscoveryDirectoryEntry {
17
+ readonly name: string;
18
+ readonly kind: AppDiscoveryDirectoryEntryKind;
19
+ }
20
+ export type AppDiscoveryDirectoryListing = readonly AppDiscoveryDirectoryEntry[] | readonly string[];
21
+ export type AppDiscoveryBytes = Uint8Array | ArrayBuffer | readonly number[];
22
+ export type AppDiscoveryMaybePromise<T> = T | PromiseLike<T>;
23
+ export interface AppDiscoveryFileSystem {
24
+ readonly listDirectory?: (root: string, relativePath: string) => AppDiscoveryMaybePromise<AppDiscoveryDirectoryListing>;
25
+ readonly readDirectory?: (root: string, relativePath: string) => AppDiscoveryMaybePromise<AppDiscoveryDirectoryListing>;
26
+ readonly readdir?: (root: string, relativePath: string) => AppDiscoveryMaybePromise<AppDiscoveryDirectoryListing>;
27
+ readonly readVerifiedFile?: (root: string, relativePath: string, byteLimit: number) => AppDiscoveryMaybePromise<AppDiscoveryBytes>;
28
+ readonly readFileVerified?: (root: string, relativePath: string, byteLimit: number) => AppDiscoveryMaybePromise<AppDiscoveryBytes>;
29
+ }
30
+ export interface WorkspaceAppReservedCatalog {
31
+ readonly appIds?: Iterable<string>;
32
+ readonly definitionIds?: Iterable<string>;
33
+ readonly toolNames?: Iterable<string>;
34
+ }
35
+ export type WorkspaceAppBuiltinCatalog = Pick<McpAppRegistry, 'listMcpApps' | 'listMcpAppTools'>;
36
+ export interface WorkspaceAppDiscoveryOptions {
37
+ readonly filesystem?: AppDiscoveryFileSystem;
38
+ readonly fileSystem?: AppDiscoveryFileSystem;
39
+ readonly fs?: AppDiscoveryFileSystem;
40
+ readonly clock?: () => number;
41
+ readonly reserved?: WorkspaceAppReservedCatalog;
42
+ readonly builtin?: WorkspaceAppReservedCatalog;
43
+ readonly builtins?: WorkspaceAppReservedCatalog | WorkspaceAppBuiltinCatalog;
44
+ readonly builtinCatalog?: WorkspaceAppBuiltinCatalog;
45
+ readonly reservedAppIds?: Iterable<string>;
46
+ readonly reservedDefinitionIds?: Iterable<string>;
47
+ readonly reservedToolNames?: Iterable<string>;
48
+ }
49
+ export interface WorkspaceAppToolNames {
50
+ readonly read: string;
51
+ readonly action?: string;
52
+ }
53
+ export interface WorkspaceAppResourceSnapshot {
54
+ readonly entry: {
55
+ readonly path: 'ui/index.html';
56
+ readonly hash: string;
57
+ readonly bytes: readonly number[];
58
+ };
59
+ readonly initialState?: {
60
+ readonly path: 'ui/state.json';
61
+ readonly hash: string;
62
+ readonly bytes: readonly number[];
63
+ };
64
+ }
65
+ export interface WorkspaceAppCandidate {
66
+ readonly appId: string;
67
+ readonly pluginId: string;
68
+ readonly definitionId: string;
69
+ readonly version: number;
70
+ readonly source: WorkspaceAppSource;
71
+ readonly relativePath: string;
72
+ readonly manifest: UiPluginManifestV2;
73
+ readonly normalized: UiPluginNormalizedManifestV2;
74
+ readonly name: string;
75
+ readonly description: string;
76
+ readonly icon?: string;
77
+ readonly tone?: UiPluginManifestV2['tone'];
78
+ readonly definition: UiDefinition;
79
+ readonly handlers: Readonly<Record<string, UiPluginHandlerMetadata>>;
80
+ readonly resources: WorkspaceAppResourceSnapshot;
81
+ readonly html: string;
82
+ readonly entryBytes: readonly number[];
83
+ readonly entryHash: string;
84
+ readonly initialState: JsonObject;
85
+ readonly initialStateBytes?: readonly number[];
86
+ readonly initialStateHash?: string;
87
+ readonly sourceHash: string;
88
+ readonly toolNames: WorkspaceAppToolNames;
89
+ }
90
+ export interface WorkspaceAppDiscoveryResult {
91
+ readonly apps: readonly WorkspaceAppCandidate[];
92
+ readonly diagnostics: readonly WorkspaceAppDiagnostic[];
93
+ readonly candidates?: readonly WorkspaceAppCandidate[];
94
+ }
95
+ export declare const WORKSPACE_APP_TOOL_PREFIX = "crewx_local_app_";
96
+ export declare const LOCAL_APP_TOOL_PREFIX = "crewx_local_app_";
97
+ export declare const MCP_APP_WORKSPACE_TOOL_PREFIX = "crewx_local_app_";
98
+ export declare function deriveWorkspaceAppToolNames(pluginId: string): WorkspaceAppToolNames;
99
+ export declare function deriveWorkspaceAppToolName(pluginId: string, kind?: 'read' | 'action'): string;
100
+ export declare function discoverWorkspaceApps(workspaceRoot: string, fs?: AppDiscoveryFileSystem, options?: WorkspaceAppDiscoveryOptions): Promise<WorkspaceAppDiscoveryResult>;
101
+ export declare function discoverWorkspaceApps(workspaceRoot: string, options?: WorkspaceAppDiscoveryOptions): Promise<WorkspaceAppDiscoveryResult>;
102
+ export declare const discoverWorkspaceAppCandidates: typeof discoverWorkspaceApps;
103
+ export declare const scanWorkspaceApps: typeof discoverWorkspaceApps;
104
+ export { AppDiscoveryFsError, NodeAppDiscoveryFs, NodeAppDiscoveryFsAdapter, defaultAppDiscoveryFs, defaultNodeAppDiscoveryFs, };
105
+ export type { AppDiscoveryFsErrorCode };
@@ -2,7 +2,13 @@ export type { McpAppContractErrorCode } from './errors.js';
2
2
  export { McpAppContractError } from './errors.js';
3
3
  export { INSTALLED_APP_ENTRY, InstalledAppRefError, buildInstalledAppRef, validateInstalledAppRef, } from './installed-app-ref.js';
4
4
  export type { BuildInstalledAppRefInput, InstalledAppPackageFile, InstalledAppRef, InstalledAppRefErrorCode, } from './installed-app-ref.js';
5
- export { createMcpAppRegistry, createBuiltinMcpAppRegistry, registerMcpApp, resolveMcpAppResource, requireMcpAppResource, toMcpAppToolRegistration, } from './registry.js';
5
+ export { MAX_HTML_LENGTH, createMcpAppRegistry, createBuiltinMcpAppRegistry, buildMcpAppLocalRegistration, createMcpAppLocalRegistration, registerLocalMcpApp, createMcpAppWorkspaceRegistry, createWorkspaceAppRegistry, createWorkspaceMcpAppRegistry, registerMcpApp, resolveMcpAppResource, resolveLocalMcpAppResource, requireMcpAppResource, toMcpAppToolRegistration, } from './registry.js';
6
+ export { AppDiscoveryFsError, NodeAppDiscoveryFs, NodeAppDiscoveryFsAdapter, defaultAppDiscoveryFs, defaultNodeAppDiscoveryFs, deriveWorkspaceAppToolName, deriveWorkspaceAppToolNames, discoverWorkspaceAppCandidates, discoverWorkspaceApps, LOCAL_APP_TOOL_PREFIX, MCP_APP_WORKSPACE_TOOL_PREFIX, scanWorkspaceApps, WORKSPACE_APP_TOOL_PREFIX, } from './discovery.js';
7
+ export type { AppDiscoveryBytes, AppDiscoveryDiagnostic, AppDiscoveryDirectoryEntry, AppDiscoveryDirectoryEntryKind, AppDiscoveryDirectoryListing, AppDiscoveryFileSystem, AppDiscoveryFsErrorCode, AppDiscoveryMaybePromise, WorkspaceAppDiscoveryOptions as AppDiscoveryOptions, McpAppDiscoveryDiagnostic, WorkspaceAppBuiltinCatalog, WorkspaceAppCandidate, WorkspaceAppDiscoveryOptions, WorkspaceAppDiscoveryResult, WorkspaceAppDiagnostic, WorkspaceAppDiagnosticCode, WorkspaceAppResourceSnapshot, WorkspaceAppReservedCatalog, WorkspaceAppSource, WorkspaceAppToolNames, } from './discovery.js';
6
8
  export { buildMcpAppStateDescriptor, buildMcpAppStateProjections, buildTerminalMcpAppStateDescriptor, buildTerminalMcpAppStateProjections, createMcpAppToolResult, serializeMcpAppStateJson, serializeMcpAppStateXml, } from './projection.js';
7
- export { MCP_APP_HOST_TOOL_ALLOWLIST, MCP_APP_RESOURCE_MIME_TYPE, MCP_APP_RESOURCE_URI_PREFIX, } from './types.js';
8
- export type { McpAppActionDispatcherToolInput, McpAppActionToolDescriptor, McpAppActionToolInput, McpAppButtonDescriptor, McpAppButtonInput, McpAppDescriptor, McpAppDescriptorInput, McpAppInputSchema, McpAppTone, McpUiResourceCsp, McpAppRegistry, McpAppResource, McpAppServerStateInput, McpAppStateDescriptor, McpAppStateProjections, McpAppHostToolInput, McpAppHostToolName, McpAppReadToolInput, McpAppSingleActionToolInput, McpAppToolCommonInput, McpAppToolDescriptor, McpAppToolInput, McpAppToolMetadata, McpAppToolRegistration, McpAppToolResult, McpAppToolVisibility, } from './types.js';
9
+ export { buildStateSetHandler, createStateSetHandler, } from './state-set.js';
10
+ export type { StateSetHandlerBuildInput } from './state-set.js';
11
+ export { MCP_APP_HOST_TOOL_ALLOWLIST, MCP_APP_LOCAL_RESOURCE_MIME_TYPE, MCP_APP_RESOURCE_MIME_TYPE, MCP_APP_RESOURCE_URI_PREFIX, } from './types.js';
12
+ export type { McpAppActionDispatcherToolInput, McpAppActionToolDescriptor, McpAppActionToolInput, McpAppButtonDescriptor, McpAppButtonInput, McpAppDescriptor, McpAppDescriptorInput, McpAppInputSchema, McpAppTone, McpUiResourceCsp, McpAppRegistry, McpAppResource, McpAppServerStateInput, McpAppStateDescriptor, McpAppStateProjections, McpAppHostToolInput, McpAppHostToolName, McpAppReadToolInput, McpAppSingleActionToolInput, McpAppToolCommonInput, McpAppToolDescriptor, McpAppToolInput, McpAppToolMetadata, McpAppToolRegistration, McpAppToolResult, McpAppToolVisibility, McpAppInstanceResourceBinding, McpAppMcpResourceBinding, McpAppResourceBinding, McpAppLocalResource, McpAppLocalRegistrationInput, McpAppLocalReadToolDescriptor, McpAppLocalActionToolDescriptor, McpAppLocalToolDescriptor, McpAppLocalRegistration, McpAppBuiltinRegistration, McpAppResolvedRegistration, McpAppLocalLauncher, McpAppBuiltinLauncher, McpAppLauncher, WorkspaceAppLauncher, WorkspaceAppResolvedRegistration, McpAppWorkspaceRegistry, WorkspaceAppRegistry, McpAppWorkspaceRegistryInput, } from './types.js';
13
+ export { buildWorkspaceAppSnapshot, discoverWorkspaceAppSnapshot, reconfirmWorkspaceAppSnapshot, } from './workspace-snapshot.js';
14
+ export type { WorkspaceAppSnapshot, WorkspaceAppSnapshotBuildOptions, WorkspaceAppSnapshotOptions, WorkspaceAppSnapshotReconfirmResult, WorkspaceAppSnapshotResource, WorkspaceAppSnapshotInitialState, WorkspaceAppInitialState, } from './workspace-snapshot.js';
@@ -0,0 +1,20 @@
1
+ export type AppDiscoveryFsErrorCode = 'NOT_FOUND' | 'READ_DENIED' | 'LIMIT_EXCEEDED' | 'PATH_ESCAPED' | 'IDENTITY_CHANGED' | 'TOCTOU' | 'UNSUPPORTED';
2
+ export declare class AppDiscoveryFsError extends Error {
3
+ readonly code: AppDiscoveryFsErrorCode;
4
+ readonly name = "AppDiscoveryFsError";
5
+ constructor(code: AppDiscoveryFsErrorCode);
6
+ }
7
+ export interface NodeAppDiscoveryDirectoryEntry {
8
+ readonly name: string;
9
+ readonly kind: 'file' | 'directory' | 'symlink' | 'other';
10
+ }
11
+ export declare class NodeAppDiscoveryFs {
12
+ listDirectory(root: string, relativePath: string): Promise<readonly NodeAppDiscoveryDirectoryEntry[]>;
13
+ readdir(root: string, relativePath: string): Promise<readonly NodeAppDiscoveryDirectoryEntry[]>;
14
+ readDirectory(root: string, relativePath: string): Promise<readonly NodeAppDiscoveryDirectoryEntry[]>;
15
+ readVerifiedFile(root: string, relativePath: string, byteLimit: number): Promise<Uint8Array>;
16
+ readFileVerified(root: string, relativePath: string, byteLimit: number): Promise<Uint8Array>;
17
+ }
18
+ export declare const defaultAppDiscoveryFs: NodeAppDiscoveryFs;
19
+ export declare const defaultNodeAppDiscoveryFs: NodeAppDiscoveryFs;
20
+ export declare const NodeAppDiscoveryFsAdapter: typeof NodeAppDiscoveryFs;
@@ -1,7 +1,15 @@
1
- import { type McpAppDescriptor, type McpAppDescriptorInput, type McpAppRegistry, type McpAppResource, type McpAppToolDescriptor, type McpAppToolRegistration } from './types.js';
1
+ import { type McpAppDescriptor, type McpAppDescriptorInput, type McpAppLocalRegistration, type McpAppLocalRegistrationInput, type McpAppLocalResource, type McpAppRegistry, type McpAppResource, type McpAppWorkspaceRegistry, type McpAppWorkspaceRegistryInput, type McpAppToolDescriptor, type McpAppToolRegistration } from './types.js';
2
+ export declare const MAX_HTML_LENGTH: number;
2
3
  export declare function createMcpAppRegistry(): McpAppRegistry;
3
4
  export declare function createBuiltinMcpAppRegistry(): McpAppRegistry;
4
5
  export declare function registerMcpApp(registry: McpAppRegistry, input: McpAppDescriptorInput): McpAppDescriptor;
5
6
  export declare function resolveMcpAppResource(registry: McpAppRegistry, uri: string): McpAppResource | null;
6
7
  export declare function requireMcpAppResource(registry: McpAppRegistry, uri: string): McpAppResource;
7
8
  export declare function toMcpAppToolRegistration(tool: McpAppToolDescriptor): McpAppToolRegistration;
9
+ export declare function buildMcpAppLocalRegistration(input: McpAppLocalRegistrationInput): McpAppLocalRegistration;
10
+ export declare const createMcpAppLocalRegistration: typeof buildMcpAppLocalRegistration;
11
+ export declare const registerLocalMcpApp: typeof buildMcpAppLocalRegistration;
12
+ export declare function createMcpAppWorkspaceRegistry(input?: McpAppWorkspaceRegistryInput): McpAppWorkspaceRegistry;
13
+ export declare const createWorkspaceAppRegistry: typeof createMcpAppWorkspaceRegistry;
14
+ export declare const createWorkspaceMcpAppRegistry: typeof createMcpAppWorkspaceRegistry;
15
+ export declare function resolveLocalMcpAppResource(registry: McpAppWorkspaceRegistry, appId: string, definitionHash?: string): McpAppLocalResource | null;
@@ -0,0 +1,9 @@
1
+ import type { UiStateActionHandlerRegistration } from '../ui-instance/types.js';
2
+ import type { UiPluginNormalizedManifestV2 } from '../ui-plugin/types.js';
3
+ export interface StateSetHandlerBuildInput {
4
+ readonly normalized: UiPluginNormalizedManifestV2;
5
+ readonly actionId: string;
6
+ }
7
+ export declare function buildStateSetHandler(normalized: UiPluginNormalizedManifestV2, actionId: string): UiStateActionHandlerRegistration | undefined;
8
+ export declare function buildStateSetHandler(input: StateSetHandlerBuildInput): UiStateActionHandlerRegistration | undefined;
9
+ export declare const createStateSetHandler: typeof buildStateSetHandler;
@@ -1,4 +1,4 @@
1
- import type { JsonObject, UiDefinition, UiDefinitionRef, UiInstance, UiInstanceStatus, UiActionConfirmation } from '../ui-instance/types.js';
1
+ import type { JsonObject, UiDefinition, UiDefinitionRef, UiInstance, UiInstanceStatus, UiActionConfirmation, UiActionHandlerRegistration } from '../ui-instance/types.js';
2
2
  export declare const MCP_APP_RESOURCE_MIME_TYPE: "text/html;profile=mcp-app";
3
3
  export declare const MCP_APP_RESOURCE_URI_PREFIX = "ui://crewx/";
4
4
  export type McpAppToolVisibility = 'model' | 'app';
@@ -72,6 +72,139 @@ export interface McpAppResource {
72
72
  };
73
73
  };
74
74
  }
75
+ export declare const MCP_APP_LOCAL_RESOURCE_MIME_TYPE: "text/html";
76
+ export interface McpAppInstanceResourceBinding {
77
+ readonly kind: 'instance';
78
+ }
79
+ export interface McpAppMcpResourceBinding {
80
+ readonly kind: 'mcp';
81
+ readonly uri: string;
82
+ }
83
+ export type McpAppResourceBinding = McpAppInstanceResourceBinding | McpAppMcpResourceBinding;
84
+ export interface McpAppLocalResource {
85
+ readonly mimeType: typeof MCP_APP_LOCAL_RESOURCE_MIME_TYPE;
86
+ readonly entryHash: string;
87
+ readonly html: string;
88
+ readonly bytes: readonly number[];
89
+ readonly initialState?: {
90
+ readonly hash: string;
91
+ readonly bytes: readonly number[];
92
+ };
93
+ }
94
+ export interface McpAppLocalRegistrationInput {
95
+ readonly appId: string;
96
+ readonly name: string;
97
+ readonly description: string;
98
+ readonly icon?: string;
99
+ readonly tone?: McpAppTone;
100
+ readonly csp?: McpUiResourceCsp;
101
+ readonly definition: UiDefinition;
102
+ readonly html: string;
103
+ readonly entryHash: string;
104
+ readonly entryBytes?: readonly number[];
105
+ readonly initialState?: JsonObject;
106
+ readonly initialStateHash?: string;
107
+ readonly initialStateBytes?: readonly number[];
108
+ readonly readToolName: string;
109
+ readonly actionToolName?: string;
110
+ readonly actions: readonly {
111
+ readonly actionId: string;
112
+ readonly inputSchema: McpAppInputSchema;
113
+ }[];
114
+ }
115
+ export interface McpAppLocalReadToolDescriptor extends McpAppToolCommonInput {
116
+ readonly kind: 'read';
117
+ readonly resourceBinding: McpAppInstanceResourceBinding;
118
+ readonly actionIds?: never;
119
+ }
120
+ export interface McpAppLocalActionToolDescriptor extends McpAppToolCommonInput {
121
+ readonly kind: 'action';
122
+ readonly resourceBinding: McpAppInstanceResourceBinding;
123
+ readonly actionIds: readonly string[];
124
+ }
125
+ export type McpAppLocalToolDescriptor = McpAppLocalReadToolDescriptor | McpAppLocalActionToolDescriptor;
126
+ export interface McpAppLocalRegistration {
127
+ readonly appId: string;
128
+ readonly name: string;
129
+ readonly description: string;
130
+ readonly icon?: string;
131
+ readonly tone?: McpAppTone;
132
+ readonly builtinOnly: false;
133
+ readonly definition: UiDefinition;
134
+ readonly resourceBinding: McpAppInstanceResourceBinding;
135
+ readonly resource: McpAppLocalResource;
136
+ readonly tools: readonly McpAppLocalToolDescriptor[];
137
+ }
138
+ export interface McpAppBuiltinRegistration {
139
+ readonly appId: string;
140
+ readonly name: string;
141
+ readonly description: string;
142
+ readonly icon?: string;
143
+ readonly tone?: McpAppTone;
144
+ readonly builtinOnly: boolean;
145
+ readonly uiUri: string;
146
+ readonly definition?: UiDefinition;
147
+ readonly resourceBinding: McpAppMcpResourceBinding;
148
+ readonly resource: McpAppResource;
149
+ readonly tools: readonly McpAppToolDescriptor[];
150
+ readonly descriptor: McpAppDescriptor;
151
+ }
152
+ export type McpAppResolvedRegistration = McpAppLocalRegistration | McpAppBuiltinRegistration;
153
+ export interface McpAppLocalLauncher {
154
+ readonly appId: string;
155
+ readonly name: string;
156
+ readonly description: string;
157
+ readonly icon?: string;
158
+ readonly tone?: McpAppTone;
159
+ readonly builtinOnly: false;
160
+ readonly definition: UiDefinitionRef;
161
+ readonly entryHash: string;
162
+ readonly resourceBinding: McpAppInstanceResourceBinding;
163
+ readonly tools: readonly McpAppLocalToolDescriptor[];
164
+ }
165
+ export interface McpAppBuiltinLauncher {
166
+ readonly appId: string;
167
+ readonly name: string;
168
+ readonly description: string;
169
+ readonly icon?: string;
170
+ readonly tone?: McpAppTone;
171
+ readonly builtinOnly: boolean;
172
+ readonly uiUri: string;
173
+ readonly definition?: UiDefinitionRef;
174
+ readonly resourceBinding: McpAppMcpResourceBinding;
175
+ readonly tools: readonly McpAppToolDescriptor[];
176
+ }
177
+ export type McpAppLauncher = McpAppLocalLauncher | McpAppBuiltinLauncher;
178
+ export type WorkspaceAppLauncher = McpAppLauncher;
179
+ export type WorkspaceAppResolvedRegistration = McpAppResolvedRegistration;
180
+ export interface McpAppWorkspaceRegistry {
181
+ getMcpApp(appId: string): McpAppDescriptor | null;
182
+ listMcpApps(): readonly McpAppDescriptor[];
183
+ listMcpAppTools(): readonly McpAppToolDescriptor[];
184
+ resolveMcpAppTool(toolName: string): McpAppToolDescriptor | null;
185
+ resolveMcpAppResource(uri: string): McpAppResource | null;
186
+ requireMcpAppResource(uri: string): McpAppResource;
187
+ listLocalMcpApps(): readonly McpAppLocalRegistration[];
188
+ getLocalMcpApp(appId: string): McpAppLocalRegistration | null;
189
+ listLocalMcpAppTools(): readonly McpAppLocalToolDescriptor[];
190
+ resolveLocalMcpAppTool(toolName: string): McpAppLocalToolDescriptor | null;
191
+ resolveLocalMcpAppResource(appId: string, definitionHash?: string): McpAppLocalResource | null;
192
+ listRegistrations(): readonly McpAppResolvedRegistration[];
193
+ getRegistration(appId: string): McpAppResolvedRegistration | null;
194
+ listLaunchers(): readonly McpAppLauncher[];
195
+ getLauncher(appId: string): McpAppLauncher | null;
196
+ resolveDefinition(ref: UiDefinitionRef): UiDefinition | null;
197
+ resolveActionHandler(definitionId: string, version: number, actionId: string): UiActionHandlerRegistration | null;
198
+ }
199
+ export type WorkspaceAppRegistry = McpAppWorkspaceRegistry;
200
+ export interface McpAppWorkspaceRegistryInput {
201
+ readonly builtins?: McpAppRegistry;
202
+ readonly builtin?: McpAppRegistry;
203
+ readonly localApps?: readonly McpAppLocalRegistration[];
204
+ readonly locals?: readonly McpAppLocalRegistration[];
205
+ readonly definitions?: readonly UiDefinition[];
206
+ readonly handlers?: readonly UiActionHandlerRegistration[];
207
+ }
75
208
  export interface McpAppToolMetadata {
76
209
  readonly ui: {
77
210
  readonly resourceUri: string;
@@ -0,0 +1,53 @@
1
+ import { type AppDiscoveryFileSystem, type WorkspaceAppDiagnostic, type WorkspaceAppDiscoveryOptions, type WorkspaceAppDiscoveryResult } from './discovery.js';
2
+ import type { JsonObject, UiActionHandlerRegistration, UiDefinition, UiDefinitionRef } from '../ui-instance/types.js';
3
+ import type { McpAppLauncher, McpAppLocalResource, McpAppRegistry, McpAppWorkspaceRegistry } from './types.js';
4
+ export interface WorkspaceAppSnapshotResource extends McpAppLocalResource {
5
+ readonly appId: string;
6
+ readonly definition: UiDefinitionRef;
7
+ }
8
+ export interface WorkspaceAppSnapshotInitialState {
9
+ readonly appId: string;
10
+ readonly definition: UiDefinitionRef;
11
+ readonly hash: string;
12
+ readonly bytes: readonly number[];
13
+ readonly state: JsonObject;
14
+ }
15
+ export type WorkspaceAppInitialState = WorkspaceAppSnapshotInitialState;
16
+ export interface WorkspaceAppSnapshotBuildOptions {
17
+ readonly builtins?: McpAppRegistry;
18
+ readonly builtin?: McpAppRegistry;
19
+ readonly registry?: McpAppRegistry;
20
+ }
21
+ export type WorkspaceAppSnapshotOptions = WorkspaceAppDiscoveryOptions & WorkspaceAppSnapshotBuildOptions;
22
+ export interface WorkspaceAppSnapshot {
23
+ readonly snapshotHash: string;
24
+ readonly launchers: readonly McpAppLauncher[];
25
+ readonly definitions: readonly UiDefinition[];
26
+ readonly actionHandlers: readonly UiActionHandlerRegistration[];
27
+ readonly resources: readonly WorkspaceAppSnapshotResource[];
28
+ readonly initialStates: readonly WorkspaceAppSnapshotInitialState[];
29
+ readonly diagnostics: readonly WorkspaceAppDiagnostic[];
30
+ readonly registry: McpAppWorkspaceRegistry;
31
+ resolveDefinition(ref: UiDefinitionRef): UiDefinition | null;
32
+ resolveActionHandler(definitionId: string, version: number, actionId: string): UiActionHandlerRegistration | null;
33
+ resolveResource(appId: string, definitionHash?: string): WorkspaceAppSnapshotResource | null;
34
+ }
35
+ export type WorkspaceAppSnapshotReconfirmResult = {
36
+ readonly kind: 'same_generation';
37
+ readonly snapshot: WorkspaceAppSnapshot;
38
+ readonly diagnostics: readonly WorkspaceAppDiagnostic[];
39
+ } | {
40
+ readonly kind: 'new_generation';
41
+ readonly previousSnapshot: WorkspaceAppSnapshot;
42
+ readonly snapshot: WorkspaceAppSnapshot;
43
+ readonly diagnostics: readonly WorkspaceAppDiagnostic[];
44
+ } | {
45
+ readonly kind: 'io_error';
46
+ readonly snapshot: WorkspaceAppSnapshot;
47
+ readonly diagnostics: readonly WorkspaceAppDiagnostic[];
48
+ };
49
+ export declare function buildWorkspaceAppSnapshot(discovery: WorkspaceAppDiscoveryResult, options?: WorkspaceAppSnapshotBuildOptions): WorkspaceAppSnapshot;
50
+ export declare function discoverWorkspaceAppSnapshot(workspaceRoot: string, options?: WorkspaceAppSnapshotOptions): Promise<WorkspaceAppSnapshot>;
51
+ export declare function discoverWorkspaceAppSnapshot(workspaceRoot: string, filesystem: AppDiscoveryFileSystem, options?: WorkspaceAppSnapshotOptions): Promise<WorkspaceAppSnapshot>;
52
+ export declare function reconfirmWorkspaceAppSnapshot(workspaceRoot: string, currentSnapshot: WorkspaceAppSnapshot, options?: WorkspaceAppSnapshotOptions): Promise<WorkspaceAppSnapshotReconfirmResult>;
53
+ export declare function reconfirmWorkspaceAppSnapshot(workspaceRoot: string, currentSnapshot: WorkspaceAppSnapshot, filesystem: AppDiscoveryFileSystem, options?: WorkspaceAppSnapshotOptions): Promise<WorkspaceAppSnapshotReconfirmResult>;
@@ -0,0 +1,5 @@
1
+ UPDATE `tasks`
2
+ SET `stop_requested_at` = NULL,
3
+ `stop_requested_epoch` = NULL
4
+ WHERE `status` IN ('success', 'failed')
5
+ AND (`stop_requested_at` IS NOT NULL OR `stop_requested_epoch` IS NOT NULL);
@@ -0,0 +1,2 @@
1
+ DROP INDEX IF EXISTS `ui_instances_workspace_thread_app_uq`;--> statement-breakpoint
2
+ CREATE UNIQUE INDEX IF NOT EXISTS `ui_instances_workspace_thread_app_uq` ON `ui_instances` (`workspace_id`,`thread_id`,`app_id`) WHERE "status" = 'active';
@@ -0,0 +1 @@
1
+ ALTER TABLE `tasks` ADD `cwd` text;