@paperclipai/shared 2026.824.1 → 2026.825.0-beta.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/dist/adapter-auth-check-code.d.ts +13 -0
- package/dist/adapter-auth-check-code.d.ts.map +1 -0
- package/dist/adapter-auth-check-code.js +13 -0
- package/dist/adapter-auth-check-code.js.map +1 -0
- package/dist/adapter-auth-check-code.test.d.ts +2 -0
- package/dist/adapter-auth-check-code.test.d.ts.map +1 -0
- package/dist/adapter-auth-check-code.test.js +8 -0
- package/dist/adapter-auth-check-code.test.js.map +1 -0
- package/dist/company-import-transfer.d.ts +3 -37
- package/dist/company-import-transfer.d.ts.map +1 -1
- package/dist/config-schema.d.ts +130 -1570
- package/dist/config-schema.d.ts.map +1 -1
- package/dist/config-schema.js +3 -7
- package/dist/config-schema.js.map +1 -1
- package/dist/constants.d.ts +3 -2
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +3 -0
- package/dist/constants.js.map +1 -1
- package/dist/environment-support.d.ts +1 -1
- package/dist/environment-support.d.ts.map +1 -1
- package/dist/environment-support.js +3 -2
- package/dist/environment-support.js.map +1 -1
- package/dist/environment-support.test.js +19 -0
- package/dist/environment-support.test.js.map +1 -1
- package/dist/feature-catalog.d.ts +7 -17
- package/dist/feature-catalog.d.ts.map +1 -1
- package/dist/feature-catalog.js +9 -2
- package/dist/feature-catalog.js.map +1 -1
- package/dist/frontmatter.d.ts +3 -13
- package/dist/frontmatter.d.ts.map +1 -1
- package/dist/frontmatter.js +2 -2
- package/dist/frontmatter.js.map +1 -1
- package/dist/index.d.ts +7 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -2
- package/dist/index.js.map +1 -1
- package/dist/markdown-work-products.d.ts +26 -0
- package/dist/markdown-work-products.d.ts.map +1 -0
- package/dist/markdown-work-products.js +70 -0
- package/dist/markdown-work-products.js.map +1 -0
- package/dist/markdown-work-products.test.d.ts +2 -0
- package/dist/markdown-work-products.test.d.ts.map +1 -0
- package/dist/markdown-work-products.test.js +122 -0
- package/dist/markdown-work-products.test.js.map +1 -0
- package/dist/node-version.d.ts +6 -0
- package/dist/node-version.d.ts.map +1 -0
- package/dist/node-version.js +46 -0
- package/dist/node-version.js.map +1 -0
- package/dist/runtime-exposure/loopback-bind.d.ts +2 -2
- package/dist/runtime-exposure/loopback-bind.d.ts.map +1 -1
- package/dist/runtime-exposure/loopback-bind.js +3 -3
- package/dist/runtime-exposure/loopback-bind.js.map +1 -1
- package/dist/runtime-exposure/loopback-bind.test.js +11 -10
- package/dist/runtime-exposure/loopback-bind.test.js.map +1 -1
- package/dist/settings-visibility.d.ts +62 -0
- package/dist/settings-visibility.d.ts.map +1 -0
- package/dist/settings-visibility.js +102 -0
- package/dist/settings-visibility.js.map +1 -0
- package/dist/settings-visibility.test.d.ts +2 -0
- package/dist/settings-visibility.test.d.ts.map +1 -0
- package/dist/settings-visibility.test.js +51 -0
- package/dist/settings-visibility.test.js.map +1 -0
- package/dist/telemetry/generated/paperclip-telemetry.d.ts +4 -2
- package/dist/telemetry/generated/paperclip-telemetry.d.ts.map +1 -1
- package/dist/telemetry/generated/paperclip-telemetry.js +2 -0
- package/dist/telemetry/generated/paperclip-telemetry.js.map +1 -1
- package/dist/types/environment.d.ts +20 -0
- package/dist/types/environment.d.ts.map +1 -1
- package/dist/types/index.d.ts +5 -3
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/instance.d.ts +7 -0
- package/dist/types/instance.d.ts.map +1 -1
- package/dist/types/instance.js.map +1 -1
- package/dist/types/issue.d.ts +19 -0
- package/dist/types/issue.d.ts.map +1 -1
- package/dist/types/plugin.d.ts +36 -4
- package/dist/types/plugin.d.ts.map +1 -1
- package/dist/types/workspace-operation.d.ts +1 -1
- package/dist/types/workspace-operation.d.ts.map +1 -1
- package/dist/types/workspace-readiness.d.ts +62 -0
- package/dist/types/workspace-readiness.d.ts.map +1 -0
- package/dist/types/workspace-readiness.js +28 -0
- package/dist/types/workspace-readiness.js.map +1 -0
- package/dist/types/workspace-runtime.d.ts +6 -8
- package/dist/types/workspace-runtime.d.ts.map +1 -1
- package/dist/validators/access.d.ts +143 -277
- package/dist/validators/access.d.ts.map +1 -1
- package/dist/validators/access.js +5 -5
- package/dist/validators/adapter-auth-session.d.ts +50 -97
- package/dist/validators/adapter-auth-session.d.ts.map +1 -1
- package/dist/validators/adapter-auth-session.js +3 -3
- package/dist/validators/adapter-registry.d.ts +8 -40
- package/dist/validators/adapter-registry.d.ts.map +1 -1
- package/dist/validators/adapter-registry.js +1 -1
- package/dist/validators/adapter-registry.js.map +1 -1
- package/dist/validators/adapter-skills.d.ts +71 -170
- package/dist/validators/adapter-skills.d.ts.map +1 -1
- package/dist/validators/adapter-skills.js +3 -3
- package/dist/validators/agent.d.ts +412 -4798
- package/dist/validators/agent.d.ts.map +1 -1
- package/dist/validators/agent.js +13 -13
- package/dist/validators/agent.js.map +1 -1
- package/dist/validators/app-definition.d.ts +270 -2315
- package/dist/validators/app-definition.d.ts.map +1 -1
- package/dist/validators/approval.d.ts +15 -36
- package/dist/validators/approval.d.ts.map +1 -1
- package/dist/validators/approval.js +2 -2
- package/dist/validators/artifact.d.ts +162 -893
- package/dist/validators/artifact.d.ts.map +1 -1
- package/dist/validators/artifact.js +6 -6
- package/dist/validators/asset.d.ts +1 -5
- package/dist/validators/asset.d.ts.map +1 -1
- package/dist/validators/budget.d.ts +19 -43
- package/dist/validators/budget.d.ts.map +1 -1
- package/dist/validators/budget.js +1 -1
- package/dist/validators/claude-setup-token-session.d.ts +61 -181
- package/dist/validators/claude-setup-token-session.d.ts.map +1 -1
- package/dist/validators/claude-setup-token-session.js +4 -4
- package/dist/validators/company-portability.d.ts +318 -3616
- package/dist/validators/company-portability.d.ts.map +1 -1
- package/dist/validators/company-portability.js +2 -2
- package/dist/validators/company-skill.d.ts +722 -2934
- package/dist/validators/company-skill.d.ts.map +1 -1
- package/dist/validators/company-skill.js +63 -63
- package/dist/validators/company.d.ts +162 -289
- package/dist/validators/company.d.ts.map +1 -1
- package/dist/validators/company.js +4 -3
- package/dist/validators/company.js.map +1 -1
- package/dist/validators/cost.d.ts +29 -57
- package/dist/validators/cost.d.ts.map +1 -1
- package/dist/validators/cost.js +5 -5
- package/dist/validators/decision-queue.d.ts +60 -108
- package/dist/validators/decision-queue.d.ts.map +1 -1
- package/dist/validators/decision.d.ts +230 -1884
- package/dist/validators/decision.d.ts.map +1 -1
- package/dist/validators/decision.js +9 -9
- package/dist/validators/document-annotation.d.ts +37 -203
- package/dist/validators/document-annotation.d.ts.map +1 -1
- package/dist/validators/document-annotation.js +3 -3
- package/dist/validators/environment-custom-images.d.ts +79 -173
- package/dist/validators/environment-custom-images.d.ts.map +1 -1
- package/dist/validators/environment-custom-images.js +14 -11
- package/dist/validators/environment-custom-images.js.map +1 -1
- package/dist/validators/environment.d.ts +82 -259
- package/dist/validators/environment.d.ts.map +1 -1
- package/dist/validators/execution-workspace.d.ts +173 -513
- package/dist/validators/execution-workspace.d.ts.map +1 -1
- package/dist/validators/execution-workspace.js +13 -13
- package/dist/validators/execution-workspace.js.map +1 -1
- package/dist/validators/external-object.d.ts +55 -27
- package/dist/validators/external-object.d.ts.map +1 -1
- package/dist/validators/external-object.js +1 -1
- package/dist/validators/external-object.js.map +1 -1
- package/dist/validators/feedback.d.ts +28 -19
- package/dist/validators/feedback.d.ts.map +1 -1
- package/dist/validators/feedback.js +1 -1
- package/dist/validators/finance.d.ts +69 -74
- package/dist/validators/finance.d.ts.map +1 -1
- package/dist/validators/finance.js +6 -6
- package/dist/validators/folder.d.ts +44 -205
- package/dist/validators/folder.d.ts.map +1 -1
- package/dist/validators/folder.js +7 -7
- package/dist/validators/goal.d.ts +26 -34
- package/dist/validators/goal.d.ts.map +1 -1
- package/dist/validators/goal.js +4 -3
- package/dist/validators/goal.js.map +1 -1
- package/dist/validators/inbox-agent-policy.d.ts +12 -16
- package/dist/validators/inbox-agent-policy.d.ts.map +1 -1
- package/dist/validators/inbox-agent-policy.js +1 -1
- package/dist/validators/index.d.ts +2 -2
- package/dist/validators/index.d.ts.map +1 -1
- package/dist/validators/index.js +2 -2
- package/dist/validators/index.js.map +1 -1
- package/dist/validators/instance.d.ts +50 -563
- package/dist/validators/instance.d.ts.map +1 -1
- package/dist/validators/instance.js +16 -6
- package/dist/validators/instance.js.map +1 -1
- package/dist/validators/instance.test.js +13 -0
- package/dist/validators/instance.test.js.map +1 -1
- package/dist/validators/issue-tree-control.d.ts +41 -80
- package/dist/validators/issue-tree-control.d.ts.map +1 -1
- package/dist/validators/issue.d.ts +1772 -12251
- package/dist/validators/issue.d.ts.map +1 -1
- package/dist/validators/issue.js +150 -84
- package/dist/validators/issue.js.map +1 -1
- package/dist/validators/onboarding-seed.d.ts +3 -37
- package/dist/validators/onboarding-seed.d.ts.map +1 -1
- package/dist/validators/partial.d.ts +4 -0
- package/dist/validators/partial.d.ts.map +1 -0
- package/dist/validators/partial.js +35 -0
- package/dist/validators/partial.js.map +1 -0
- package/dist/validators/pipeline.d.ts +218 -3882
- package/dist/validators/pipeline.d.ts.map +1 -1
- package/dist/validators/pipeline.js +11 -11
- package/dist/validators/plugin.d.ts +725 -2597
- package/dist/validators/plugin.d.ts.map +1 -1
- package/dist/validators/plugin.js +38 -6
- package/dist/validators/plugin.js.map +1 -1
- package/dist/validators/plugin.test.js +54 -10
- package/dist/validators/plugin.test.js.map +1 -1
- package/dist/validators/project.d.ts +345 -2406
- package/dist/validators/project.d.ts.map +1 -1
- package/dist/validators/project.js +8 -7
- package/dist/validators/project.js.map +1 -1
- package/dist/validators/resource-memberships.d.ts +11 -27
- package/dist/validators/resource-memberships.d.ts.map +1 -1
- package/dist/validators/routine.d.ts +362 -1297
- package/dist/validators/routine.d.ts.map +1 -1
- package/dist/validators/routine.js +21 -20
- package/dist/validators/routine.js.map +1 -1
- package/dist/validators/runtime-exposure.d.ts +31 -80
- package/dist/validators/runtime-exposure.d.ts.map +1 -1
- package/dist/validators/search.d.ts +25 -93
- package/dist/validators/search.d.ts.map +1 -1
- package/dist/validators/secret.d.ts +174 -655
- package/dist/validators/secret.d.ts.map +1 -1
- package/dist/validators/secret.js +14 -14
- package/dist/validators/secret.js.map +1 -1
- package/dist/validators/sidebar-preferences.d.ts +5 -15
- package/dist/validators/sidebar-preferences.d.ts.map +1 -1
- package/dist/validators/sidebar-preferences.js +1 -1
- package/dist/validators/skill-policy.d.ts +184 -561
- package/dist/validators/skill-policy.d.ts.map +1 -1
- package/dist/validators/skill-policy.js +4 -4
- package/dist/validators/smoke-lab.d.ts +53 -37
- package/dist/validators/smoke-lab.d.ts.map +1 -1
- package/dist/validators/status-card.d.ts +139 -994
- package/dist/validators/status-card.d.ts.map +1 -1
- package/dist/validators/status-card.js +21 -21
- package/dist/validators/status-card.js.map +1 -1
- package/dist/validators/summary-slot.d.ts +28 -50
- package/dist/validators/summary-slot.d.ts.map +1 -1
- package/dist/validators/summary-slot.js +3 -3
- package/dist/validators/teams-catalog.d.ts +209 -472
- package/dist/validators/teams-catalog.d.ts.map +1 -1
- package/dist/validators/text.d.ts +1 -1
- package/dist/validators/text.d.ts.map +1 -1
- package/dist/validators/tool-access.d.ts +1088 -4670
- package/dist/validators/tool-access.d.ts.map +1 -1
- package/dist/validators/tool-access.js +96 -95
- package/dist/validators/tool-access.js.map +1 -1
- package/dist/validators/trust-policy.d.ts +62 -358
- package/dist/validators/trust-policy.d.ts.map +1 -1
- package/dist/validators/trust-policy.js +12 -12
- package/dist/validators/work-product.d.ts +110 -536
- package/dist/validators/work-product.d.ts.map +1 -1
- package/dist/validators/work-product.js +7 -6
- package/dist/validators/work-product.js.map +1 -1
- package/dist/validators/workspace-file-resource.d.ts +163 -618
- package/dist/validators/workspace-file-resource.d.ts.map +1 -1
- package/dist/validators/workspace-file-resource.js +11 -11
- package/dist/workspace-commands.d.ts +4 -2
- package/dist/workspace-commands.d.ts.map +1 -1
- package/dist/workspace-commands.js +9 -1
- package/dist/workspace-commands.js.map +1 -1
- package/dist/workspace-commands.test.js +45 -0
- package/dist/workspace-commands.test.js.map +1 -1
- package/dist/worktree-port-registry.d.ts +5 -0
- package/dist/worktree-port-registry.d.ts.map +1 -0
- package/dist/worktree-port-registry.js +382 -0
- package/dist/worktree-port-registry.js.map +1 -0
- package/dist/worktree-port-registry.test.d.ts +2 -0
- package/dist/worktree-port-registry.test.d.ts.map +1 -0
- package/dist/worktree-port-registry.test.js +118 -0
- package/dist/worktree-port-registry.test.js.map +1 -0
- package/dist/worktree-seed-source.d.ts +43 -0
- package/dist/worktree-seed-source.d.ts.map +1 -0
- package/dist/worktree-seed-source.js +180 -0
- package/dist/worktree-seed-source.js.map +1 -0
- package/dist/worktree-seed-source.test.d.ts +2 -0
- package/dist/worktree-seed-source.test.d.ts.map +1 -0
- package/dist/worktree-seed-source.test.js +166 -0
- package/dist/worktree-seed-source.test.js.map +1 -0
- package/package.json +6 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace-file-resource.d.ts","sourceRoot":"","sources":["../../src/validators/workspace-file-resource.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAQxB,eAAO,MAAM,gCAAgC,
|
|
1
|
+
{"version":3,"file":"workspace-file-resource.d.ts","sourceRoot":"","sources":["../../src/validators/workspace-file-resource.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAQxB,eAAO,MAAM,gCAAgC;;;EAAuD,CAAC;AACrG,eAAO,MAAM,2BAA2B;;;;GAA2D,CAAC;AACpG,eAAO,MAAM,2BAA2B;;;;GAAsD,CAAC;AAC/F,eAAO,MAAM,8BAA8B;;;;;;EAA2D,CAAC;AACvG,eAAO,MAAM,+BAA+B;;;;EAAmD,CAAC;AAEhG,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;iBAWjC,CAAC;AAEH,eAAO,MAAM,gCAAgC;;;;;;;;;iBAe3C,CAAC;AAEH,eAAO,MAAM,sCAAsC;;;;;;;;;;;iBAEjD,CAAC;AAEH,eAAO,MAAM,4BAA4B;;;;;;;;;;;;;;;;;iBA8BvC,CAAC;AAEH,eAAO,MAAM,+BAA+B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAmB1C,CAAC;AAEH,eAAO,MAAM,8CAA8C;;;;;;;;;iBAKzD,CAAC;AAEH,eAAO,MAAM,qCAAqC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAKhD,CAAC;AAEH,eAAO,MAAM,uCAAuC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAGlD,CAAC;AAEH,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAMrC,CAAC;AAEH,MAAM,MAAM,0BAA0B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gCAAgC,CAAC,CAAC;AAC1F,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAC;AAClF,MAAM,MAAM,qCAAqC,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sCAAsC,CAAC,CAAC"}
|
|
@@ -10,19 +10,19 @@ export const workspaceFilePreviewKindSchema = z.enum(["text", "image", "video",
|
|
|
10
10
|
export const workspaceFileResourceKindSchema = z.enum(["file", "directory", "remote_resource"]);
|
|
11
11
|
export const workspaceFileRefSchema = z.object({
|
|
12
12
|
kind: z.literal("workspace_file"),
|
|
13
|
-
issueId: z.string().
|
|
14
|
-
projectId: z.string().
|
|
13
|
+
issueId: z.string().guid().optional(),
|
|
14
|
+
projectId: z.string().guid().optional(),
|
|
15
15
|
projectName: z.string().min(1).optional(),
|
|
16
16
|
workspaceKind: workspaceFileWorkspaceKindSchema,
|
|
17
|
-
workspaceId: z.string().
|
|
17
|
+
workspaceId: z.string().guid(),
|
|
18
18
|
relativePath: z.string().min(1),
|
|
19
19
|
line: z.number().int().positive().nullable().optional(),
|
|
20
20
|
column: z.number().int().positive().nullable().optional(),
|
|
21
21
|
displayPath: z.string().min(1),
|
|
22
22
|
});
|
|
23
23
|
export const workspaceFileResourceQuerySchema = z.object({
|
|
24
|
-
projectId: z.string().
|
|
25
|
-
workspaceId: z.string().
|
|
24
|
+
projectId: z.string().guid().optional(),
|
|
25
|
+
workspaceId: z.string().guid().optional(),
|
|
26
26
|
path: z
|
|
27
27
|
.string()
|
|
28
28
|
.min(1)
|
|
@@ -40,8 +40,8 @@ export const workspaceFileAvailabilityRequestSchema = z.object({
|
|
|
40
40
|
queries: z.array(workspaceFileResourceQuerySchema).max(100),
|
|
41
41
|
});
|
|
42
42
|
export const workspaceFileListQuerySchema = z.object({
|
|
43
|
-
projectId: z.string().
|
|
44
|
-
workspaceId: z.string().
|
|
43
|
+
projectId: z.string().guid().optional(),
|
|
44
|
+
workspaceId: z.string().guid().optional(),
|
|
45
45
|
workspace: workspaceFileSelectorSchema.optional(),
|
|
46
46
|
path: z
|
|
47
47
|
.string()
|
|
@@ -77,8 +77,8 @@ export const resolvedWorkspaceResourceSchema = z.object({
|
|
|
77
77
|
displayPath: z.string().min(1),
|
|
78
78
|
workspaceLabel: z.string().min(1),
|
|
79
79
|
workspaceKind: workspaceFileWorkspaceKindSchema,
|
|
80
|
-
workspaceId: z.string().
|
|
81
|
-
projectId: z.string().
|
|
80
|
+
workspaceId: z.string().guid(),
|
|
81
|
+
projectId: z.string().guid().nullable().optional(),
|
|
82
82
|
projectName: z.string().min(1).nullable().optional(),
|
|
83
83
|
contentType: z.string().nullable().optional(),
|
|
84
84
|
byteSize: z.number().int().nonnegative().nullable().optional(),
|
|
@@ -91,8 +91,8 @@ export const resolvedWorkspaceResourceSchema = z.object({
|
|
|
91
91
|
}),
|
|
92
92
|
});
|
|
93
93
|
export const normalizedWorkspaceFileAvailabilityQuerySchema = z.object({
|
|
94
|
-
projectId: z.string().
|
|
95
|
-
workspaceId: z.string().
|
|
94
|
+
projectId: z.string().guid().nullable(),
|
|
95
|
+
workspaceId: z.string().guid().nullable(),
|
|
96
96
|
path: z.string().min(1),
|
|
97
97
|
workspace: workspaceFileSelectorSchema,
|
|
98
98
|
});
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import type { WorkspaceCommandDefinition, WorkspaceRuntimeService } from "./types/workspace-runtime.js";
|
|
2
|
+
type WorkspaceRuntimeServiceMatchCandidate = Pick<WorkspaceRuntimeService, "configIndex" | "serviceName" | "command" | "cwd"> & Pick<Partial<WorkspaceRuntimeService>, "exposure">;
|
|
2
3
|
export declare function listWorkspaceCommandDefinitions(workspaceRuntime: Record<string, unknown> | null | undefined): WorkspaceCommandDefinition[];
|
|
3
4
|
export declare function listWorkspaceServiceCommandDefinitions(workspaceRuntime: Record<string, unknown> | null | undefined): WorkspaceCommandDefinition[];
|
|
4
5
|
export declare function findWorkspaceCommandDefinition(workspaceRuntime: Record<string, unknown> | null | undefined, workspaceCommandId: string | null | undefined): WorkspaceCommandDefinition | null;
|
|
5
|
-
export declare function scoreWorkspaceRuntimeServiceMatch(command: Pick<WorkspaceCommandDefinition, "serviceIndex" | "name" | "command" | "cwd">, runtimeService:
|
|
6
|
-
export declare function matchWorkspaceRuntimeServiceToCommand<T extends
|
|
6
|
+
export declare function scoreWorkspaceRuntimeServiceMatch(command: Pick<WorkspaceCommandDefinition, "serviceIndex" | "name" | "command" | "cwd">, runtimeService: WorkspaceRuntimeServiceMatchCandidate): number;
|
|
7
|
+
export declare function matchWorkspaceRuntimeServiceToCommand<T extends WorkspaceRuntimeServiceMatchCandidate>(command: Pick<WorkspaceCommandDefinition, "serviceIndex" | "name" | "command" | "cwd">, runtimeServices: T[] | null | undefined): T | null;
|
|
8
|
+
export {};
|
|
7
9
|
//# sourceMappingURL=workspace-commands.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace-commands.d.ts","sourceRoot":"","sources":["../src/workspace-commands.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"workspace-commands.d.ts","sourceRoot":"","sources":["../src/workspace-commands.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAGxG,KAAK,qCAAqC,GACtC,IAAI,CAAC,uBAAuB,EAAE,aAAa,GAAG,aAAa,GAAG,SAAS,GAAG,KAAK,CAAC,GAChF,IAAI,CAAC,OAAO,CAAC,uBAAuB,CAAC,EAAE,UAAU,CAAC,CAAC;AAqGvD,wBAAgB,+BAA+B,CAC7C,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,GAC3D,0BAA0B,EAAE,CA4C9B;AAED,wBAAgB,sCAAsC,CACpD,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,gCAG7D;AAED,wBAAgB,8BAA8B,CAC5C,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,EAC5D,kBAAkB,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,qCAK9C;AAED,wBAAgB,iCAAiC,CAC/C,OAAO,EAAE,IAAI,CAAC,0BAA0B,EAAE,cAAc,GAAG,MAAM,GAAG,SAAS,GAAG,KAAK,CAAC,EACtF,cAAc,EAAE,qCAAqC,UAgCtD;AAED,wBAAgB,qCAAqC,CACnD,CAAC,SAAS,qCAAqC,EAE/C,OAAO,EAAE,IAAI,CAAC,0BAA0B,EAAE,cAAc,GAAG,MAAM,GAAG,SAAS,GAAG,KAAK,CAAC,EACtF,eAAe,EAAE,CAAC,EAAE,GAAG,IAAI,GAAG,SAAS,YAcxC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { forceLoopbackBindInCommand } from "./runtime-exposure/loopback-bind.js";
|
|
1
2
|
function isRecord(value) {
|
|
2
3
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
3
4
|
}
|
|
@@ -117,7 +118,14 @@ export function findWorkspaceCommandDefinition(workspaceRuntime, workspaceComman
|
|
|
117
118
|
return listWorkspaceCommandDefinitions(workspaceRuntime).find((command) => command.id === normalizedId) ?? null;
|
|
118
119
|
}
|
|
119
120
|
export function scoreWorkspaceRuntimeServiceMatch(command, runtimeService) {
|
|
120
|
-
|
|
121
|
+
const exposedCommandMatches = Boolean(command.command
|
|
122
|
+
&& runtimeService.command
|
|
123
|
+
&& runtimeService.exposure?.provider === "tailscale_https"
|
|
124
|
+
&& runtimeService.command === forceLoopbackBindInCommand(command.command));
|
|
125
|
+
if (command.command
|
|
126
|
+
&& runtimeService.command
|
|
127
|
+
&& runtimeService.command !== command.command
|
|
128
|
+
&& !exposedCommandMatches) {
|
|
121
129
|
return -1;
|
|
122
130
|
}
|
|
123
131
|
if (command.serviceIndex !== null && runtimeService.configIndex !== null && runtimeService.configIndex !== undefined) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace-commands.js","sourceRoot":"","sources":["../src/workspace-commands.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"workspace-commands.js","sourceRoot":"","sources":["../src/workspace-commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -61,5 +61,50 @@ describe("workspace command helpers", () => {
|
|
|
61
61
|
]);
|
|
62
62
|
expect(match).toBeNull();
|
|
63
63
|
});
|
|
64
|
+
it("matches an exposed dev runtime whose bind command was hardened to loopback", () => {
|
|
65
|
+
const workspaceRuntime = {
|
|
66
|
+
commands: [
|
|
67
|
+
{ id: "web", name: "paperclip-dev", kind: "service", command: "pnpm dev --bind lan" },
|
|
68
|
+
],
|
|
69
|
+
};
|
|
70
|
+
const command = findWorkspaceCommandDefinition(workspaceRuntime, "web");
|
|
71
|
+
expect(command).not.toBeNull();
|
|
72
|
+
const match = matchWorkspaceRuntimeServiceToCommand(command, [
|
|
73
|
+
{
|
|
74
|
+
id: "runtime-web",
|
|
75
|
+
serviceName: "paperclip-dev",
|
|
76
|
+
command: "pnpm dev --bind loopback",
|
|
77
|
+
cwd: "/repo",
|
|
78
|
+
configIndex: null,
|
|
79
|
+
exposure: {
|
|
80
|
+
provider: "tailscale_https",
|
|
81
|
+
state: "ready",
|
|
82
|
+
publicUrl: "https://paperclip-dev.example.ts.net:42012",
|
|
83
|
+
hostname: "paperclip-dev.example.ts.net",
|
|
84
|
+
listeners: [],
|
|
85
|
+
brokerRef: "broker-1",
|
|
86
|
+
lastError: null,
|
|
87
|
+
updatedAt: "2026-08-20T00:00:00.000Z",
|
|
88
|
+
},
|
|
89
|
+
},
|
|
90
|
+
]);
|
|
91
|
+
expect(match).toEqual(expect.objectContaining({ id: "runtime-web" }));
|
|
92
|
+
});
|
|
93
|
+
it("does not equate a loopback command with a lan command without managed exposure", () => {
|
|
94
|
+
const command = findWorkspaceCommandDefinition({
|
|
95
|
+
services: [{ name: "paperclip-dev", command: "pnpm dev --bind lan" }],
|
|
96
|
+
}, "service:paperclip-dev");
|
|
97
|
+
const match = matchWorkspaceRuntimeServiceToCommand(command, [
|
|
98
|
+
{
|
|
99
|
+
id: "runtime-web",
|
|
100
|
+
serviceName: "paperclip-dev",
|
|
101
|
+
command: "pnpm dev --bind loopback",
|
|
102
|
+
cwd: "/repo",
|
|
103
|
+
configIndex: null,
|
|
104
|
+
exposure: null,
|
|
105
|
+
},
|
|
106
|
+
]);
|
|
107
|
+
expect(match).toBeNull();
|
|
108
|
+
});
|
|
64
109
|
});
|
|
65
110
|
//# sourceMappingURL=workspace-commands.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace-commands.test.js","sourceRoot":"","sources":["../src/workspace-commands.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"workspace-commands.test.js","sourceRoot":"","sources":["../src/workspace-commands.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare function withWorktreePortRegistryLockSync<T>(homeDir: string, run: () => T): T;
|
|
2
|
+
export declare function withWorktreePortRegistryLock<T>(homeDir: string, run: () => Promise<T>): Promise<T>;
|
|
3
|
+
export declare function readWorktreePortRegistry(homeDir: string): Set<string>;
|
|
4
|
+
export declare function writeWorktreePortRegistry(homeDir: string, configPaths: Iterable<string>): void;
|
|
5
|
+
//# sourceMappingURL=worktree-port-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worktree-port-registry.d.ts","sourceRoot":"","sources":["../src/worktree-port-registry.ts"],"names":[],"mappings":"AAyVA,wBAAgB,gCAAgC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,CAcpF;AAED,wBAAsB,4BAA4B,CAAC,CAAC,EAClD,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACpB,OAAO,CAAC,CAAC,CAAC,CAcZ;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAerE;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAI,CAa9F"}
|
|
@@ -0,0 +1,382 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { execFileSync } from "node:child_process";
|
|
4
|
+
import { randomUUID } from "node:crypto";
|
|
5
|
+
import { setTimeout as delay } from "node:timers/promises";
|
|
6
|
+
import { Worker } from "node:worker_threads";
|
|
7
|
+
const WORKTREE_PORT_REGISTRY_FILE = "worktree-port-reservations.json";
|
|
8
|
+
const WORKTREE_PORT_REGISTRY_LOCK_DIR = ".worktree-port-reservations.lock";
|
|
9
|
+
const WORKTREE_PORT_REGISTRY_LOCK_OWNER_FILE = "owner.json";
|
|
10
|
+
const WORKTREE_PORT_REGISTRY_LOCK_OWNER_BACKUP_FILE = "owner.backup.json";
|
|
11
|
+
const WORKTREE_PORT_REGISTRY_LOCK_STALE_MS = 5_000;
|
|
12
|
+
const WORKTREE_PORT_REGISTRY_LOCK_TIMEOUT_MS = 10_000;
|
|
13
|
+
const WORKTREE_PORT_REGISTRY_LOCK_HEARTBEAT_MS = 1_000;
|
|
14
|
+
const WORKTREE_PORT_REGISTRY_LOCK_PROBE_TIMEOUT_MS = 500;
|
|
15
|
+
const sleepSyncBuffer = new Int32Array(new SharedArrayBuffer(4));
|
|
16
|
+
const REGISTRY_LOCK_HEARTBEAT_SOURCE = `
|
|
17
|
+
const fs = require("node:fs");
|
|
18
|
+
const net = require("node:net");
|
|
19
|
+
const path = require("node:path");
|
|
20
|
+
const { parentPort, workerData } = require("node:worker_threads");
|
|
21
|
+
const control = new Int32Array(workerData.control);
|
|
22
|
+
function touchOwnedLock() {
|
|
23
|
+
let sawDifferentOwner = false;
|
|
24
|
+
for (const ownerFile of workerData.ownerFiles) {
|
|
25
|
+
try {
|
|
26
|
+
const owner = JSON.parse(fs.readFileSync(path.join(workerData.lockPath, ownerFile), "utf8"));
|
|
27
|
+
if (owner.token === workerData.token) {
|
|
28
|
+
try {
|
|
29
|
+
const now = new Date();
|
|
30
|
+
fs.utimesSync(workerData.lockPath, now, now);
|
|
31
|
+
return "refreshed";
|
|
32
|
+
} catch {
|
|
33
|
+
return "retry";
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
sawDifferentOwner = true;
|
|
37
|
+
} catch {
|
|
38
|
+
// The redundant owner file may still be readable.
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return sawDifferentOwner ? "lost" : "retry";
|
|
42
|
+
}
|
|
43
|
+
let finished = false;
|
|
44
|
+
let timer;
|
|
45
|
+
function complete() {
|
|
46
|
+
Atomics.store(control, 0, 2);
|
|
47
|
+
Atomics.notify(control, 0);
|
|
48
|
+
}
|
|
49
|
+
function finish() {
|
|
50
|
+
if (finished) return;
|
|
51
|
+
finished = true;
|
|
52
|
+
if (timer) clearInterval(timer);
|
|
53
|
+
server.close(complete);
|
|
54
|
+
setTimeout(complete, 250).unref();
|
|
55
|
+
}
|
|
56
|
+
const server = net.createServer((socket) => {
|
|
57
|
+
socket.setEncoding("utf8");
|
|
58
|
+
socket.setTimeout(workerData.probeTimeoutMs, () => socket.destroy());
|
|
59
|
+
socket.once("data", (candidate) => {
|
|
60
|
+
socket.end(candidate === workerData.token ? "owned" : "denied");
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
parentPort.once("message", finish);
|
|
64
|
+
server.once("error", () => {
|
|
65
|
+
Atomics.store(control, 0, -1);
|
|
66
|
+
Atomics.notify(control, 0);
|
|
67
|
+
});
|
|
68
|
+
server.listen(0, "127.0.0.1", () => {
|
|
69
|
+
const address = server.address();
|
|
70
|
+
if (!address || typeof address === "string") {
|
|
71
|
+
Atomics.store(control, 0, -1);
|
|
72
|
+
Atomics.notify(control, 0);
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
Atomics.store(control, 2, address.port);
|
|
76
|
+
Atomics.store(control, 0, 1);
|
|
77
|
+
Atomics.notify(control, 0);
|
|
78
|
+
touchOwnedLock();
|
|
79
|
+
timer = setInterval(() => {
|
|
80
|
+
if (Atomics.load(control, 1) !== 0 || touchOwnedLock() === "lost") finish();
|
|
81
|
+
}, workerData.heartbeatMs);
|
|
82
|
+
});
|
|
83
|
+
`;
|
|
84
|
+
const REGISTRY_LOCK_PROBE_SOURCE = `
|
|
85
|
+
const net = require("node:net");
|
|
86
|
+
const { workerData } = require("node:worker_threads");
|
|
87
|
+
const control = new Int32Array(workerData.control);
|
|
88
|
+
let finished = false;
|
|
89
|
+
function finish(result) {
|
|
90
|
+
if (finished) return;
|
|
91
|
+
finished = true;
|
|
92
|
+
Atomics.store(control, 0, result);
|
|
93
|
+
Atomics.notify(control, 0);
|
|
94
|
+
process.exit(0);
|
|
95
|
+
}
|
|
96
|
+
const socket = net.createConnection({ host: "127.0.0.1", port: workerData.port });
|
|
97
|
+
socket.setEncoding("utf8");
|
|
98
|
+
socket.setTimeout(workerData.timeoutMs, () => finish(2));
|
|
99
|
+
socket.once("connect", () => socket.write(workerData.token));
|
|
100
|
+
socket.once("data", (response) => finish(response === "owned" ? 1 : 2));
|
|
101
|
+
socket.once("error", () => finish(2));
|
|
102
|
+
socket.once("close", () => finish(2));
|
|
103
|
+
`;
|
|
104
|
+
function resolveRegistryLockPath(homeDir) {
|
|
105
|
+
fs.mkdirSync(homeDir, { recursive: true });
|
|
106
|
+
return path.resolve(homeDir, WORKTREE_PORT_REGISTRY_LOCK_DIR);
|
|
107
|
+
}
|
|
108
|
+
function readRegistryLockOwner(lockPath) {
|
|
109
|
+
for (const ownerFile of [
|
|
110
|
+
WORKTREE_PORT_REGISTRY_LOCK_OWNER_FILE,
|
|
111
|
+
WORKTREE_PORT_REGISTRY_LOCK_OWNER_BACKUP_FILE,
|
|
112
|
+
]) {
|
|
113
|
+
try {
|
|
114
|
+
const parsed = JSON.parse(fs.readFileSync(path.join(lockPath, ownerFile), "utf8"));
|
|
115
|
+
if (parsed.version === 1
|
|
116
|
+
&& Number.isInteger(parsed.pid)
|
|
117
|
+
&& (parsed.pid ?? 0) > 0
|
|
118
|
+
&& typeof parsed.processIdentity === "string"
|
|
119
|
+
&& parsed.processIdentity.length > 0
|
|
120
|
+
&& Number.isInteger(parsed.probePort)
|
|
121
|
+
&& (parsed.probePort ?? 0) > 0
|
|
122
|
+
&& (parsed.probePort ?? 0) <= 65_535
|
|
123
|
+
&& typeof parsed.token === "string"
|
|
124
|
+
&& parsed.token.length > 0) {
|
|
125
|
+
return parsed;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
// Try the redundant owner record.
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return null;
|
|
133
|
+
}
|
|
134
|
+
function writeRegistryLockOwner(lockPath, owner) {
|
|
135
|
+
const contents = `${JSON.stringify(owner)}\n`;
|
|
136
|
+
for (const ownerFile of [
|
|
137
|
+
WORKTREE_PORT_REGISTRY_LOCK_OWNER_FILE,
|
|
138
|
+
WORKTREE_PORT_REGISTRY_LOCK_OWNER_BACKUP_FILE,
|
|
139
|
+
]) {
|
|
140
|
+
const ownerPath = path.join(lockPath, ownerFile);
|
|
141
|
+
const temporaryPath = `${ownerPath}.${owner.token}.tmp`;
|
|
142
|
+
fs.writeFileSync(temporaryPath, contents, { mode: 0o600 });
|
|
143
|
+
fs.renameSync(temporaryPath, ownerPath);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
function isProcessAlive(pid) {
|
|
147
|
+
try {
|
|
148
|
+
process.kill(pid, 0);
|
|
149
|
+
return true;
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
return !(error instanceof Error && "code" in error && error.code === "ESRCH");
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
function readProcessIdentity(pid) {
|
|
156
|
+
if (!Number.isInteger(pid) || pid <= 0)
|
|
157
|
+
return null;
|
|
158
|
+
if (process.platform === "linux") {
|
|
159
|
+
try {
|
|
160
|
+
const stat = fs.readFileSync(`/proc/${pid}/stat`, "utf8");
|
|
161
|
+
const commandEnd = stat.lastIndexOf(")");
|
|
162
|
+
if (commandEnd < 0)
|
|
163
|
+
return null;
|
|
164
|
+
const fields = stat.slice(commandEnd + 1).trim().split(/\s+/);
|
|
165
|
+
const startTicks = fields[19];
|
|
166
|
+
if (!startTicks)
|
|
167
|
+
return null;
|
|
168
|
+
const bootId = fs.readFileSync("/proc/sys/kernel/random/boot_id", "utf8").trim();
|
|
169
|
+
return bootId ? `linux:${bootId}:${startTicks}` : null;
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
return null;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
try {
|
|
176
|
+
if (process.platform === "win32") {
|
|
177
|
+
const ticks = execFileSync("powershell.exe", [
|
|
178
|
+
"-NoProfile",
|
|
179
|
+
"-NonInteractive",
|
|
180
|
+
"-Command",
|
|
181
|
+
`(Get-Process -Id ${pid}).StartTime.ToUniversalTime().Ticks`,
|
|
182
|
+
], { encoding: "utf8", windowsHide: true }).trim();
|
|
183
|
+
return ticks ? `win32:${ticks}` : null;
|
|
184
|
+
}
|
|
185
|
+
const startedAt = execFileSync("ps", ["-o", "lstart=", "-p", String(pid)], {
|
|
186
|
+
encoding: "utf8",
|
|
187
|
+
}).trim();
|
|
188
|
+
return startedAt ? `${process.platform}:${startedAt}` : null;
|
|
189
|
+
}
|
|
190
|
+
catch {
|
|
191
|
+
return null;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
function probeRegistryLockOwner(owner) {
|
|
195
|
+
const control = new Int32Array(new SharedArrayBuffer(4));
|
|
196
|
+
const worker = new Worker(REGISTRY_LOCK_PROBE_SOURCE, {
|
|
197
|
+
eval: true,
|
|
198
|
+
execArgv: [],
|
|
199
|
+
workerData: {
|
|
200
|
+
control: control.buffer,
|
|
201
|
+
port: owner.probePort,
|
|
202
|
+
timeoutMs: WORKTREE_PORT_REGISTRY_LOCK_PROBE_TIMEOUT_MS,
|
|
203
|
+
token: owner.token,
|
|
204
|
+
},
|
|
205
|
+
});
|
|
206
|
+
Atomics.wait(control, 0, 0, WORKTREE_PORT_REGISTRY_LOCK_PROBE_TIMEOUT_MS + 250);
|
|
207
|
+
const isOwner = Atomics.load(control, 0) === 1;
|
|
208
|
+
void worker.terminate();
|
|
209
|
+
return isOwner;
|
|
210
|
+
}
|
|
211
|
+
function removeStaleRegistryLock(lockPath) {
|
|
212
|
+
try {
|
|
213
|
+
const ageMs = Date.now() - fs.statSync(lockPath).mtimeMs;
|
|
214
|
+
if (ageMs <= WORKTREE_PORT_REGISTRY_LOCK_STALE_MS)
|
|
215
|
+
return false;
|
|
216
|
+
const owner = readRegistryLockOwner(lockPath);
|
|
217
|
+
if (owner && isProcessAlive(owner.pid)) {
|
|
218
|
+
if (probeRegistryLockOwner(owner))
|
|
219
|
+
return false;
|
|
220
|
+
const currentIdentity = readProcessIdentity(owner.pid);
|
|
221
|
+
if (owner.processIdentity === currentIdentity)
|
|
222
|
+
return false;
|
|
223
|
+
}
|
|
224
|
+
const currentOwner = readRegistryLockOwner(lockPath);
|
|
225
|
+
if (owner ? currentOwner?.token !== owner.token : currentOwner !== null)
|
|
226
|
+
return false;
|
|
227
|
+
const currentAgeMs = Date.now() - fs.statSync(lockPath).mtimeMs;
|
|
228
|
+
if (currentAgeMs <= WORKTREE_PORT_REGISTRY_LOCK_STALE_MS)
|
|
229
|
+
return false;
|
|
230
|
+
fs.rmSync(lockPath, { recursive: true, force: true });
|
|
231
|
+
return true;
|
|
232
|
+
}
|
|
233
|
+
catch {
|
|
234
|
+
return false;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
function startRegistryLockHeartbeat(lockPath, token) {
|
|
238
|
+
const control = new Int32Array(new SharedArrayBuffer(12));
|
|
239
|
+
const worker = new Worker(REGISTRY_LOCK_HEARTBEAT_SOURCE, {
|
|
240
|
+
eval: true,
|
|
241
|
+
execArgv: [],
|
|
242
|
+
workerData: {
|
|
243
|
+
control: control.buffer,
|
|
244
|
+
heartbeatMs: WORKTREE_PORT_REGISTRY_LOCK_HEARTBEAT_MS,
|
|
245
|
+
lockPath,
|
|
246
|
+
ownerFiles: [
|
|
247
|
+
WORKTREE_PORT_REGISTRY_LOCK_OWNER_FILE,
|
|
248
|
+
WORKTREE_PORT_REGISTRY_LOCK_OWNER_BACKUP_FILE,
|
|
249
|
+
],
|
|
250
|
+
probeTimeoutMs: WORKTREE_PORT_REGISTRY_LOCK_PROBE_TIMEOUT_MS,
|
|
251
|
+
token,
|
|
252
|
+
},
|
|
253
|
+
});
|
|
254
|
+
Atomics.wait(control, 0, 0, 2_000);
|
|
255
|
+
if (Atomics.load(control, 0) !== 1) {
|
|
256
|
+
void worker.terminate();
|
|
257
|
+
throw new Error(`Failed to start worktree port reservation lock heartbeat at ${lockPath}`);
|
|
258
|
+
}
|
|
259
|
+
const probePort = Atomics.load(control, 2);
|
|
260
|
+
if (probePort <= 0) {
|
|
261
|
+
void worker.terminate();
|
|
262
|
+
throw new Error(`Failed to start worktree port reservation lock probe at ${lockPath}`);
|
|
263
|
+
}
|
|
264
|
+
return { token, worker, control, probePort };
|
|
265
|
+
}
|
|
266
|
+
function stopRegistryLockHeartbeat(lease) {
|
|
267
|
+
Atomics.store(lease.control, 1, 1);
|
|
268
|
+
Atomics.notify(lease.control, 1);
|
|
269
|
+
lease.worker.postMessage("stop");
|
|
270
|
+
if (Atomics.load(lease.control, 0) === 1) {
|
|
271
|
+
Atomics.wait(lease.control, 0, 1, 2_000);
|
|
272
|
+
}
|
|
273
|
+
void lease.worker.terminate();
|
|
274
|
+
}
|
|
275
|
+
function acquireRegistryLock(lockPath, deadline) {
|
|
276
|
+
try {
|
|
277
|
+
fs.mkdirSync(lockPath);
|
|
278
|
+
const token = `${process.pid}-${randomUUID()}`;
|
|
279
|
+
let lease = null;
|
|
280
|
+
try {
|
|
281
|
+
const processIdentity = readProcessIdentity(process.pid);
|
|
282
|
+
if (!processIdentity) {
|
|
283
|
+
throw new Error("Cannot determine worktree port reservation lock owner identity");
|
|
284
|
+
}
|
|
285
|
+
const owner = {
|
|
286
|
+
version: 1,
|
|
287
|
+
pid: process.pid,
|
|
288
|
+
processIdentity,
|
|
289
|
+
probePort: 1,
|
|
290
|
+
token,
|
|
291
|
+
};
|
|
292
|
+
writeRegistryLockOwner(lockPath, owner);
|
|
293
|
+
lease = startRegistryLockHeartbeat(lockPath, token);
|
|
294
|
+
writeRegistryLockOwner(lockPath, { ...owner, probePort: lease.probePort });
|
|
295
|
+
return lease;
|
|
296
|
+
}
|
|
297
|
+
catch (error) {
|
|
298
|
+
if (lease)
|
|
299
|
+
stopRegistryLockHeartbeat(lease);
|
|
300
|
+
fs.rmSync(lockPath, { recursive: true, force: true });
|
|
301
|
+
throw error;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
catch (error) {
|
|
305
|
+
const code = error instanceof Error && "code" in error ? error.code : null;
|
|
306
|
+
if (code !== "EEXIST")
|
|
307
|
+
throw error;
|
|
308
|
+
if (removeStaleRegistryLock(lockPath))
|
|
309
|
+
return null;
|
|
310
|
+
if (Date.now() >= deadline) {
|
|
311
|
+
throw new Error(`Timed out waiting for worktree port reservation lock at ${lockPath}`);
|
|
312
|
+
}
|
|
313
|
+
return null;
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
function releaseRegistryLock(lockPath, lease) {
|
|
317
|
+
stopRegistryLockHeartbeat(lease);
|
|
318
|
+
const owner = readRegistryLockOwner(lockPath);
|
|
319
|
+
if (owner?.token !== lease.token) {
|
|
320
|
+
return;
|
|
321
|
+
}
|
|
322
|
+
fs.rmSync(lockPath, { recursive: true, force: true });
|
|
323
|
+
}
|
|
324
|
+
export function withWorktreePortRegistryLockSync(homeDir, run) {
|
|
325
|
+
const lockPath = resolveRegistryLockPath(homeDir);
|
|
326
|
+
const deadline = Date.now() + WORKTREE_PORT_REGISTRY_LOCK_TIMEOUT_MS;
|
|
327
|
+
let lease = null;
|
|
328
|
+
while (!(lease = acquireRegistryLock(lockPath, deadline))) {
|
|
329
|
+
Atomics.wait(sleepSyncBuffer, 0, 0, 25);
|
|
330
|
+
}
|
|
331
|
+
try {
|
|
332
|
+
return run();
|
|
333
|
+
}
|
|
334
|
+
finally {
|
|
335
|
+
releaseRegistryLock(lockPath, lease);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
export async function withWorktreePortRegistryLock(homeDir, run) {
|
|
339
|
+
const lockPath = resolveRegistryLockPath(homeDir);
|
|
340
|
+
const deadline = Date.now() + WORKTREE_PORT_REGISTRY_LOCK_TIMEOUT_MS;
|
|
341
|
+
let lease = null;
|
|
342
|
+
while (!(lease = acquireRegistryLock(lockPath, deadline))) {
|
|
343
|
+
await delay(25);
|
|
344
|
+
}
|
|
345
|
+
try {
|
|
346
|
+
return await run();
|
|
347
|
+
}
|
|
348
|
+
finally {
|
|
349
|
+
releaseRegistryLock(lockPath, lease);
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
export function readWorktreePortRegistry(homeDir) {
|
|
353
|
+
const registryPath = path.resolve(homeDir, WORKTREE_PORT_REGISTRY_FILE);
|
|
354
|
+
if (!fs.existsSync(registryPath))
|
|
355
|
+
return new Set();
|
|
356
|
+
try {
|
|
357
|
+
const parsed = JSON.parse(fs.readFileSync(registryPath, "utf8"));
|
|
358
|
+
if (parsed.version !== 1 || !Array.isArray(parsed.configPaths))
|
|
359
|
+
return new Set();
|
|
360
|
+
return new Set(parsed.configPaths
|
|
361
|
+
.filter((configPath) => typeof configPath === "string" && configPath.length > 0)
|
|
362
|
+
.map((configPath) => path.resolve(configPath)));
|
|
363
|
+
}
|
|
364
|
+
catch {
|
|
365
|
+
return new Set();
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
export function writeWorktreePortRegistry(homeDir, configPaths) {
|
|
369
|
+
fs.mkdirSync(homeDir, { recursive: true });
|
|
370
|
+
const registryPath = path.resolve(homeDir, WORKTREE_PORT_REGISTRY_FILE);
|
|
371
|
+
const persistedPaths = Array.from(new Set(Array.from(configPaths, (configPath) => path.resolve(configPath))))
|
|
372
|
+
.filter((configPath) => fs.existsSync(configPath))
|
|
373
|
+
.sort();
|
|
374
|
+
const registry = {
|
|
375
|
+
version: 1,
|
|
376
|
+
configPaths: persistedPaths,
|
|
377
|
+
};
|
|
378
|
+
const temporaryPath = `${registryPath}.${process.pid}.tmp`;
|
|
379
|
+
fs.writeFileSync(temporaryPath, `${JSON.stringify(registry, null, 2)}\n`, { mode: 0o600 });
|
|
380
|
+
fs.renameSync(temporaryPath, registryPath);
|
|
381
|
+
}
|
|
382
|
+
//# sourceMappingURL=worktree-port-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worktree-port-registry.js","sourceRoot":"","sources":["../src/worktree-port-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worktree-port-registry.test.d.ts","sourceRoot":"","sources":["../src/worktree-port-registry.test.ts"],"names":[],"mappings":""}
|