@paperclipai/shared 2026.817.0 → 2026.818.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-session.d.ts +16 -0
- package/dist/adapter-auth-session.d.ts.map +1 -0
- package/dist/adapter-auth-session.js +37 -0
- package/dist/adapter-auth-session.js.map +1 -0
- package/dist/company-import-transfer.d.ts +97 -0
- package/dist/company-import-transfer.d.ts.map +1 -0
- package/dist/company-import-transfer.js +50 -0
- package/dist/company-import-transfer.js.map +1 -0
- package/dist/constants.d.ts +19 -3
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +50 -3
- package/dist/constants.js.map +1 -1
- package/dist/environment-support.d.ts +16 -1
- package/dist/environment-support.d.ts.map +1 -1
- package/dist/environment-support.js +25 -2
- package/dist/environment-support.js.map +1 -1
- package/dist/environment-support.test.js +20 -0
- package/dist/environment-support.test.js.map +1 -1
- package/dist/feature-catalog.d.ts.map +1 -1
- package/dist/feature-catalog.js +10 -3
- package/dist/feature-catalog.js.map +1 -1
- package/dist/index.d.ts +13 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -3
- package/dist/index.js.map +1 -1
- package/dist/issue-thread-interactions.test.js +45 -1
- package/dist/issue-thread-interactions.test.js.map +1 -1
- package/dist/runtime-exposure/loopback-bind.d.ts +52 -0
- package/dist/runtime-exposure/loopback-bind.d.ts.map +1 -0
- package/dist/runtime-exposure/loopback-bind.js +93 -0
- package/dist/runtime-exposure/loopback-bind.js.map +1 -0
- package/dist/runtime-exposure/loopback-bind.test.d.ts +2 -0
- package/dist/runtime-exposure/loopback-bind.test.d.ts.map +1 -0
- package/dist/runtime-exposure/loopback-bind.test.js +93 -0
- package/dist/runtime-exposure/loopback-bind.test.js.map +1 -0
- package/dist/runtime-exposure/ports.d.ts +61 -0
- package/dist/runtime-exposure/ports.d.ts.map +1 -0
- package/dist/runtime-exposure/ports.js +96 -0
- package/dist/runtime-exposure/ports.js.map +1 -0
- package/dist/runtime-exposure/ports.test.d.ts +2 -0
- package/dist/runtime-exposure/ports.test.d.ts.map +1 -0
- package/dist/runtime-exposure/ports.test.js +46 -0
- package/dist/runtime-exposure/ports.test.js.map +1 -0
- package/dist/summary-slot.test.js +10 -1
- package/dist/summary-slot.test.js.map +1 -1
- package/dist/telemetry/events.d.ts +5 -0
- package/dist/telemetry/events.d.ts.map +1 -1
- package/dist/telemetry/events.js +7 -0
- package/dist/telemetry/events.js.map +1 -1
- package/dist/telemetry/generated/paperclip-telemetry.d.ts +20 -2
- package/dist/telemetry/generated/paperclip-telemetry.d.ts.map +1 -1
- package/dist/telemetry/generated/paperclip-telemetry.js +12 -0
- package/dist/telemetry/generated/paperclip-telemetry.js.map +1 -1
- package/dist/telemetry/index.d.ts +1 -1
- package/dist/telemetry/index.d.ts.map +1 -1
- package/dist/telemetry/index.js +1 -1
- package/dist/telemetry/index.js.map +1 -1
- package/dist/telemetry/retention.d.ts.map +1 -1
- package/dist/telemetry/retention.js +2 -0
- package/dist/telemetry/retention.js.map +1 -1
- package/dist/telemetry/retention.test.js +4 -0
- package/dist/telemetry/retention.test.js.map +1 -1
- package/dist/types/agent.adapter-auth-session.test.d.ts +2 -0
- package/dist/types/agent.adapter-auth-session.test.d.ts.map +1 -0
- package/dist/types/agent.adapter-auth-session.test.js +103 -0
- package/dist/types/agent.adapter-auth-session.test.js.map +1 -0
- package/dist/types/agent.d.ts +56 -0
- package/dist/types/agent.d.ts.map +1 -1
- package/dist/types/agent.js +50 -1
- package/dist/types/agent.js.map +1 -1
- package/dist/types/attention.d.ts +35 -0
- package/dist/types/attention.d.ts.map +1 -1
- package/dist/types/attention.js.map +1 -1
- package/dist/types/company-portability.d.ts +8 -0
- package/dist/types/company-portability.d.ts.map +1 -1
- package/dist/types/document-annotation.d.ts +17 -0
- package/dist/types/document-annotation.d.ts.map +1 -1
- package/dist/types/environment.d.ts +15 -12
- package/dist/types/environment.d.ts.map +1 -1
- package/dist/types/index.d.ts +7 -6
- 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 +6 -1
- package/dist/types/instance.d.ts.map +1 -1
- package/dist/types/instance.js.map +1 -1
- package/dist/types/issue.d.ts +35 -7
- package/dist/types/issue.d.ts.map +1 -1
- package/dist/types/plugin.d.ts +46 -0
- package/dist/types/plugin.d.ts.map +1 -1
- package/dist/types/runtime-exposure.d.ts +74 -0
- package/dist/types/runtime-exposure.d.ts.map +1 -0
- package/dist/types/runtime-exposure.js +12 -0
- package/dist/types/runtime-exposure.js.map +1 -0
- package/dist/types/workspace-file-resource.d.ts +25 -0
- package/dist/types/workspace-file-resource.d.ts.map +1 -1
- package/dist/types/workspace-runtime.d.ts +9 -0
- package/dist/types/workspace-runtime.d.ts.map +1 -1
- package/dist/validators/access.d.ts +6 -6
- package/dist/validators/adapter-auth-session.d.ts +129 -0
- package/dist/validators/adapter-auth-session.d.ts.map +1 -0
- package/dist/validators/adapter-auth-session.js +34 -0
- package/dist/validators/adapter-auth-session.js.map +1 -0
- package/dist/validators/adapter-registry.d.ts +2 -2
- package/dist/validators/adapter-skills.d.ts +22 -22
- package/dist/validators/agent.d.ts +316 -298
- package/dist/validators/agent.d.ts.map +1 -1
- package/dist/validators/agent.js +9 -0
- package/dist/validators/agent.js.map +1 -1
- package/dist/validators/app-definition.d.ts +156 -156
- package/dist/validators/artifact.d.ts +64 -64
- package/dist/validators/claude-setup-token-session.d.ts +244 -0
- package/dist/validators/claude-setup-token-session.d.ts.map +1 -0
- package/dist/validators/claude-setup-token-session.js +128 -0
- package/dist/validators/claude-setup-token-session.js.map +1 -0
- package/dist/validators/claude-setup-token-session.test.d.ts +2 -0
- package/dist/validators/claude-setup-token-session.test.d.ts.map +1 -0
- package/dist/validators/claude-setup-token-session.test.js +107 -0
- package/dist/validators/claude-setup-token-session.test.js.map +1 -0
- package/dist/validators/company-portability.d.ts +342 -294
- package/dist/validators/company-portability.d.ts.map +1 -1
- package/dist/validators/company-portability.js +6 -0
- package/dist/validators/company-portability.js.map +1 -1
- package/dist/validators/company-skill.d.ts +386 -386
- package/dist/validators/company.d.ts +120 -120
- package/dist/validators/cost.d.ts +8 -8
- package/dist/validators/decision-queue.d.ts +6 -6
- package/dist/validators/decision.d.ts +124 -124
- package/dist/validators/environment-custom-images.d.ts +8 -8
- package/dist/validators/environment.d.ts +16 -16
- package/dist/validators/execution-workspace.d.ts +38 -38
- package/dist/validators/finance.d.ts +12 -12
- package/dist/validators/folder.d.ts +38 -38
- package/dist/validators/index.d.ts +4 -3
- package/dist/validators/index.d.ts.map +1 -1
- package/dist/validators/index.js +4 -3
- package/dist/validators/index.js.map +1 -1
- package/dist/validators/instance.d.ts +30 -16
- package/dist/validators/instance.d.ts.map +1 -1
- package/dist/validators/instance.js +2 -1
- package/dist/validators/instance.js.map +1 -1
- package/dist/validators/issue-tree-control.d.ts +4 -4
- package/dist/validators/issue.d.ts +1254 -1156
- package/dist/validators/issue.d.ts.map +1 -1
- package/dist/validators/issue.js +59 -5
- package/dist/validators/issue.js.map +1 -1
- package/dist/validators/onboarding-seed.d.ts +64 -0
- package/dist/validators/onboarding-seed.d.ts.map +1 -0
- package/dist/validators/onboarding-seed.js +33 -0
- package/dist/validators/onboarding-seed.js.map +1 -0
- package/dist/validators/pipeline.d.ts +96 -96
- package/dist/validators/plugin.d.ts +325 -184
- package/dist/validators/plugin.d.ts.map +1 -1
- package/dist/validators/plugin.js +14 -0
- package/dist/validators/plugin.js.map +1 -1
- package/dist/validators/plugin.test.js +80 -0
- package/dist/validators/plugin.test.js.map +1 -1
- package/dist/validators/project.d.ts +216 -216
- package/dist/validators/routine.d.ts +148 -148
- package/dist/validators/runtime-exposure.d.ts +149 -0
- package/dist/validators/runtime-exposure.d.ts.map +1 -0
- package/dist/validators/runtime-exposure.js +138 -0
- package/dist/validators/runtime-exposure.js.map +1 -0
- package/dist/validators/runtime-exposure.test.d.ts +2 -0
- package/dist/validators/runtime-exposure.test.d.ts.map +1 -0
- package/dist/validators/runtime-exposure.test.js +112 -0
- package/dist/validators/runtime-exposure.test.js.map +1 -0
- package/dist/validators/search.d.ts +13 -13
- package/dist/validators/secret.d.ts +53 -53
- package/dist/validators/status-card.d.ts +34 -34
- package/dist/validators/summary-slot.d.ts +6 -6
- package/dist/validators/summary-slot.d.ts.map +1 -1
- package/dist/validators/teams-catalog.d.ts +30 -30
- package/dist/validators/tool-access.d.ts +179 -179
- package/dist/validators/trust-policy.d.ts +18 -18
- package/dist/validators/work-product.d.ts +21 -21
- package/dist/validators/workspace-file-resource.d.ts +430 -16
- package/dist/validators/workspace-file-resource.d.ts.map +1 -1
- package/dist/validators/workspace-file-resource.js +19 -0
- package/dist/validators/workspace-file-resource.js.map +1 -1
- package/dist/workspace-file-resource.test.d.ts +2 -0
- package/dist/workspace-file-resource.test.d.ts.map +1 -0
- package/dist/workspace-file-resource.test.js +52 -0
- package/dist/workspace-file-resource.test.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
/**
|
|
3
|
+
* Validators for the opt-in `tailscale_https` runtime exposure contract.
|
|
4
|
+
* Strict-by-default: unknown fields are rejected so a malformed or injected
|
|
5
|
+
* config cannot smuggle an arbitrary target, path, or hostname suffix through
|
|
6
|
+
* the runtime configuration into the broker (PAP-17050 verdict).
|
|
7
|
+
*/
|
|
8
|
+
export declare const runtimeExposureProviderSchema: z.ZodLiteral<"tailscale_https">;
|
|
9
|
+
export declare const runtimeExposureFailurePolicySchema: z.ZodLiteral<"fail_closed">;
|
|
10
|
+
export declare const runtimeExposureConfigSchema: z.ZodObject<{
|
|
11
|
+
type: z.ZodLiteral<"tailscale_https">;
|
|
12
|
+
hostname: z.ZodLiteral<"auto">;
|
|
13
|
+
publicPort: z.ZodLiteral<"same">;
|
|
14
|
+
includePaperclipViteHmr: z.ZodBoolean;
|
|
15
|
+
failurePolicy: z.ZodLiteral<"fail_closed">;
|
|
16
|
+
}, "strict", z.ZodTypeAny, {
|
|
17
|
+
type: "tailscale_https";
|
|
18
|
+
hostname: "auto";
|
|
19
|
+
publicPort: "same";
|
|
20
|
+
includePaperclipViteHmr: boolean;
|
|
21
|
+
failurePolicy: "fail_closed";
|
|
22
|
+
}, {
|
|
23
|
+
type: "tailscale_https";
|
|
24
|
+
hostname: "auto";
|
|
25
|
+
publicPort: "same";
|
|
26
|
+
includePaperclipViteHmr: boolean;
|
|
27
|
+
failurePolicy: "fail_closed";
|
|
28
|
+
}>;
|
|
29
|
+
export declare const runtimeExposureStateSchema: z.ZodEnum<["pending", "ready", "failed", "cleanup_pending", "removed"]>;
|
|
30
|
+
export declare const runtimeExposureListenerPurposeSchema: z.ZodEnum<["app", "vite_hmr"]>;
|
|
31
|
+
export declare const runtimeExposureListenerSchema: z.ZodEffects<z.ZodObject<{
|
|
32
|
+
purpose: z.ZodEnum<["app", "vite_hmr"]>;
|
|
33
|
+
publicPort: z.ZodNumber;
|
|
34
|
+
targetPort: z.ZodNumber;
|
|
35
|
+
}, "strict", z.ZodTypeAny, {
|
|
36
|
+
publicPort: number;
|
|
37
|
+
purpose: "app" | "vite_hmr";
|
|
38
|
+
targetPort: number;
|
|
39
|
+
}, {
|
|
40
|
+
publicPort: number;
|
|
41
|
+
purpose: "app" | "vite_hmr";
|
|
42
|
+
targetPort: number;
|
|
43
|
+
}>, {
|
|
44
|
+
publicPort: number;
|
|
45
|
+
purpose: "app" | "vite_hmr";
|
|
46
|
+
targetPort: number;
|
|
47
|
+
}, {
|
|
48
|
+
publicPort: number;
|
|
49
|
+
purpose: "app" | "vite_hmr";
|
|
50
|
+
targetPort: number;
|
|
51
|
+
}>;
|
|
52
|
+
export declare const runtimeExposureStatusSchema: z.ZodObject<{
|
|
53
|
+
provider: z.ZodLiteral<"tailscale_https">;
|
|
54
|
+
state: z.ZodEnum<["pending", "ready", "failed", "cleanup_pending", "removed"]>;
|
|
55
|
+
publicUrl: z.ZodNullable<z.ZodString>;
|
|
56
|
+
hostname: z.ZodNullable<z.ZodString>;
|
|
57
|
+
listeners: z.ZodArray<z.ZodEffects<z.ZodObject<{
|
|
58
|
+
purpose: z.ZodEnum<["app", "vite_hmr"]>;
|
|
59
|
+
publicPort: z.ZodNumber;
|
|
60
|
+
targetPort: z.ZodNumber;
|
|
61
|
+
}, "strict", z.ZodTypeAny, {
|
|
62
|
+
publicPort: number;
|
|
63
|
+
purpose: "app" | "vite_hmr";
|
|
64
|
+
targetPort: number;
|
|
65
|
+
}, {
|
|
66
|
+
publicPort: number;
|
|
67
|
+
purpose: "app" | "vite_hmr";
|
|
68
|
+
targetPort: number;
|
|
69
|
+
}>, {
|
|
70
|
+
publicPort: number;
|
|
71
|
+
purpose: "app" | "vite_hmr";
|
|
72
|
+
targetPort: number;
|
|
73
|
+
}, {
|
|
74
|
+
publicPort: number;
|
|
75
|
+
purpose: "app" | "vite_hmr";
|
|
76
|
+
targetPort: number;
|
|
77
|
+
}>, "many">;
|
|
78
|
+
brokerRef: z.ZodNullable<z.ZodString>;
|
|
79
|
+
lastError: z.ZodNullable<z.ZodString>;
|
|
80
|
+
updatedAt: z.ZodNullable<z.ZodString>;
|
|
81
|
+
}, "strict", z.ZodTypeAny, {
|
|
82
|
+
provider: "tailscale_https";
|
|
83
|
+
state: "failed" | "pending" | "ready" | "removed" | "cleanup_pending";
|
|
84
|
+
updatedAt: string | null;
|
|
85
|
+
lastError: string | null;
|
|
86
|
+
hostname: string | null;
|
|
87
|
+
publicUrl: string | null;
|
|
88
|
+
listeners: {
|
|
89
|
+
publicPort: number;
|
|
90
|
+
purpose: "app" | "vite_hmr";
|
|
91
|
+
targetPort: number;
|
|
92
|
+
}[];
|
|
93
|
+
brokerRef: string | null;
|
|
94
|
+
}, {
|
|
95
|
+
provider: "tailscale_https";
|
|
96
|
+
state: "failed" | "pending" | "ready" | "removed" | "cleanup_pending";
|
|
97
|
+
updatedAt: string | null;
|
|
98
|
+
lastError: string | null;
|
|
99
|
+
hostname: string | null;
|
|
100
|
+
publicUrl: string | null;
|
|
101
|
+
listeners: {
|
|
102
|
+
publicPort: number;
|
|
103
|
+
purpose: "app" | "vite_hmr";
|
|
104
|
+
targetPort: number;
|
|
105
|
+
}[];
|
|
106
|
+
brokerRef: string | null;
|
|
107
|
+
}>;
|
|
108
|
+
export type RuntimeExposureConfigInput = z.infer<typeof runtimeExposureConfigSchema>;
|
|
109
|
+
export type RuntimeExposureStatusInput = z.infer<typeof runtimeExposureStatusSchema>;
|
|
110
|
+
/**
|
|
111
|
+
* Default exposure config used when a project/workspace enables HTTPS exposure
|
|
112
|
+
* without overriding sub-fields. Fail-closed and HMR-inclusive by default so
|
|
113
|
+
* dev-mode hot reload works over the exposed HTTPS origin.
|
|
114
|
+
*/
|
|
115
|
+
export declare const DEFAULT_TAILSCALE_HTTPS_EXPOSURE: RuntimeExposureConfigInput;
|
|
116
|
+
/**
|
|
117
|
+
* Parse an untrusted `expose` block off a workspace runtime service config.
|
|
118
|
+
* Returns null when exposure is absent; throws (via zod) on a malformed block
|
|
119
|
+
* so misconfiguration fails closed rather than silently exposing nothing.
|
|
120
|
+
*/
|
|
121
|
+
export declare function parseRuntimeExposureConfig(value: unknown): RuntimeExposureConfigInput | null;
|
|
122
|
+
/**
|
|
123
|
+
* What an `expose` block says about HTTPS exposure, independent of whether the
|
|
124
|
+
* runtime is eligible for it.
|
|
125
|
+
*
|
|
126
|
+
* `unset` is the common case: legacy templates only declare
|
|
127
|
+
* `{ type: "url", urlTemplate }` for the backend readiness URL and say nothing
|
|
128
|
+
* about exposure. Those runtimes are defaulted to `tailscale_https` by the
|
|
129
|
+
* server start path when they are eligible (PAP-17158), so no project template
|
|
130
|
+
* or UI caller has to supply an exposure block.
|
|
131
|
+
*/
|
|
132
|
+
export type RuntimeExposureIntent = "enabled" | "disabled" | "unset";
|
|
133
|
+
/**
|
|
134
|
+
* Read the declared intent off an `expose` block.
|
|
135
|
+
*
|
|
136
|
+
* An explicit negative always wins over an explicit positive so a deliberate
|
|
137
|
+
* opt-out can never be re-enabled by a stale `type` left in the same block.
|
|
138
|
+
*/
|
|
139
|
+
export declare function readRuntimeExposureIntent(value: unknown): RuntimeExposureIntent;
|
|
140
|
+
/**
|
|
141
|
+
* Resolve the exposure config a service *declared* (as opposed to the one it
|
|
142
|
+
* inherits by default). Returns null unless the block explicitly opts in.
|
|
143
|
+
*
|
|
144
|
+
* Recognized sub-fields fall back to {@link DEFAULT_TAILSCALE_HTTPS_EXPOSURE},
|
|
145
|
+
* so `{ type: "tailscale_https" }` is a complete declaration; unknown keys still
|
|
146
|
+
* throw rather than being silently dropped.
|
|
147
|
+
*/
|
|
148
|
+
export declare function resolveDeclaredRuntimeExposureConfig(value: unknown): RuntimeExposureConfigInput | null;
|
|
149
|
+
//# sourceMappingURL=runtime-exposure.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-exposure.d.ts","sourceRoot":"","sources":["../../src/validators/runtime-exposure.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;GAKG;AAEH,eAAO,MAAM,6BAA6B,iCAA+B,CAAC;AAE1E,eAAO,MAAM,kCAAkC,6BAA2B,CAAC;AAE3E,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;EAQ7B,CAAC;AAEZ,eAAO,MAAM,0BAA0B,yEAMrC,CAAC;AAEH,eAAO,MAAM,oCAAoC,gCAA8B,CAAC;AAEhF,eAAO,MAAM,6BAA6B;;;;;;;;;;;;;;;;;;;;EAatC,CAAC;AAEL,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAW7B,CAAC;AAEZ,MAAM,MAAM,0BAA0B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AACrF,MAAM,MAAM,0BAA0B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAErF;;;;GAIG;AACH,eAAO,MAAM,gCAAgC,EAAE,0BAM9C,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,OAAO,GACb,0BAA0B,GAAG,IAAI,CAGnC;AAED;;;;;;;;;GASG;AACH,MAAM,MAAM,qBAAqB,GAAG,SAAS,GAAG,UAAU,GAAG,OAAO,CAAC;AAsBrE;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,qBAAqB,CAQ/E;AAED;;;;;;;GAOG;AACH,wBAAgB,oCAAoC,CAClD,KAAK,EAAE,OAAO,GACb,0BAA0B,GAAG,IAAI,CAenC"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
/**
|
|
3
|
+
* Validators for the opt-in `tailscale_https` runtime exposure contract.
|
|
4
|
+
* Strict-by-default: unknown fields are rejected so a malformed or injected
|
|
5
|
+
* config cannot smuggle an arbitrary target, path, or hostname suffix through
|
|
6
|
+
* the runtime configuration into the broker (PAP-17050 verdict).
|
|
7
|
+
*/
|
|
8
|
+
export const runtimeExposureProviderSchema = z.literal("tailscale_https");
|
|
9
|
+
export const runtimeExposureFailurePolicySchema = z.literal("fail_closed");
|
|
10
|
+
export const runtimeExposureConfigSchema = z
|
|
11
|
+
.object({
|
|
12
|
+
type: runtimeExposureProviderSchema,
|
|
13
|
+
hostname: z.literal("auto"),
|
|
14
|
+
publicPort: z.literal("same"),
|
|
15
|
+
includePaperclipViteHmr: z.boolean(),
|
|
16
|
+
failurePolicy: runtimeExposureFailurePolicySchema,
|
|
17
|
+
})
|
|
18
|
+
.strict();
|
|
19
|
+
export const runtimeExposureStateSchema = z.enum([
|
|
20
|
+
"pending",
|
|
21
|
+
"ready",
|
|
22
|
+
"failed",
|
|
23
|
+
"cleanup_pending",
|
|
24
|
+
"removed",
|
|
25
|
+
]);
|
|
26
|
+
export const runtimeExposureListenerPurposeSchema = z.enum(["app", "vite_hmr"]);
|
|
27
|
+
export const runtimeExposureListenerSchema = z
|
|
28
|
+
.object({
|
|
29
|
+
purpose: runtimeExposureListenerPurposeSchema,
|
|
30
|
+
publicPort: z.number().int().positive(),
|
|
31
|
+
targetPort: z.number().int().positive(),
|
|
32
|
+
})
|
|
33
|
+
.strict()
|
|
34
|
+
// Same-number invariant: the public HTTPS port must equal the loopback
|
|
35
|
+
// target port. The broker enforces this too, but rejecting here keeps
|
|
36
|
+
// persisted/serialized state honest.
|
|
37
|
+
.refine((listener) => listener.publicPort === listener.targetPort, {
|
|
38
|
+
message: "publicPort must equal targetPort (same-number exposure)",
|
|
39
|
+
path: ["publicPort"],
|
|
40
|
+
});
|
|
41
|
+
export const runtimeExposureStatusSchema = z
|
|
42
|
+
.object({
|
|
43
|
+
provider: runtimeExposureProviderSchema,
|
|
44
|
+
state: runtimeExposureStateSchema,
|
|
45
|
+
publicUrl: z.string().url().nullable(),
|
|
46
|
+
hostname: z.string().min(1).nullable(),
|
|
47
|
+
listeners: z.array(runtimeExposureListenerSchema),
|
|
48
|
+
brokerRef: z.string().min(1).nullable(),
|
|
49
|
+
lastError: z.string().nullable(),
|
|
50
|
+
updatedAt: z.string().nullable(),
|
|
51
|
+
})
|
|
52
|
+
.strict();
|
|
53
|
+
/**
|
|
54
|
+
* Default exposure config used when a project/workspace enables HTTPS exposure
|
|
55
|
+
* without overriding sub-fields. Fail-closed and HMR-inclusive by default so
|
|
56
|
+
* dev-mode hot reload works over the exposed HTTPS origin.
|
|
57
|
+
*/
|
|
58
|
+
export const DEFAULT_TAILSCALE_HTTPS_EXPOSURE = {
|
|
59
|
+
type: "tailscale_https",
|
|
60
|
+
hostname: "auto",
|
|
61
|
+
publicPort: "same",
|
|
62
|
+
includePaperclipViteHmr: true,
|
|
63
|
+
failurePolicy: "fail_closed",
|
|
64
|
+
};
|
|
65
|
+
/**
|
|
66
|
+
* Parse an untrusted `expose` block off a workspace runtime service config.
|
|
67
|
+
* Returns null when exposure is absent; throws (via zod) on a malformed block
|
|
68
|
+
* so misconfiguration fails closed rather than silently exposing nothing.
|
|
69
|
+
*/
|
|
70
|
+
export function parseRuntimeExposureConfig(value) {
|
|
71
|
+
if (value === undefined || value === null)
|
|
72
|
+
return null;
|
|
73
|
+
return runtimeExposureConfigSchema.parse(value);
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Keys of the exposure contract itself. Anything a declared `tailscale_https`
|
|
77
|
+
* block sets outside this list (and {@link RUNTIME_EXPOSURE_TRANSPORT_KEYS}) is
|
|
78
|
+
* rejected, so a malformed or injected config still cannot smuggle an arbitrary
|
|
79
|
+
* target, path, or hostname suffix through to the broker (PAP-17050 verdict).
|
|
80
|
+
*/
|
|
81
|
+
const RUNTIME_EXPOSURE_CONFIG_KEYS = [
|
|
82
|
+
"type",
|
|
83
|
+
"hostname",
|
|
84
|
+
"publicPort",
|
|
85
|
+
"includePaperclipViteHmr",
|
|
86
|
+
"failurePolicy",
|
|
87
|
+
];
|
|
88
|
+
/**
|
|
89
|
+
* Pre-existing `expose` keys that describe the *backend* URL rather than the
|
|
90
|
+
* exposure, and may legitimately sit next to a `tailscale_https` declaration.
|
|
91
|
+
*/
|
|
92
|
+
const RUNTIME_EXPOSURE_TRANSPORT_KEYS = ["urlTemplate", "tailscaleHttps"];
|
|
93
|
+
/**
|
|
94
|
+
* Read the declared intent off an `expose` block.
|
|
95
|
+
*
|
|
96
|
+
* An explicit negative always wins over an explicit positive so a deliberate
|
|
97
|
+
* opt-out can never be re-enabled by a stale `type` left in the same block.
|
|
98
|
+
*/
|
|
99
|
+
export function readRuntimeExposureIntent(value) {
|
|
100
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
101
|
+
return "unset";
|
|
102
|
+
const expose = value;
|
|
103
|
+
// Deliberate opt-outs, checked first.
|
|
104
|
+
if (expose.tailscaleHttps === false)
|
|
105
|
+
return "disabled";
|
|
106
|
+
if (expose.type === "none")
|
|
107
|
+
return "disabled";
|
|
108
|
+
if (expose.type === "tailscale_https" || expose.tailscaleHttps === true)
|
|
109
|
+
return "enabled";
|
|
110
|
+
return "unset";
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Resolve the exposure config a service *declared* (as opposed to the one it
|
|
114
|
+
* inherits by default). Returns null unless the block explicitly opts in.
|
|
115
|
+
*
|
|
116
|
+
* Recognized sub-fields fall back to {@link DEFAULT_TAILSCALE_HTTPS_EXPOSURE},
|
|
117
|
+
* so `{ type: "tailscale_https" }` is a complete declaration; unknown keys still
|
|
118
|
+
* throw rather than being silently dropped.
|
|
119
|
+
*/
|
|
120
|
+
export function resolveDeclaredRuntimeExposureConfig(value) {
|
|
121
|
+
if (readRuntimeExposureIntent(value) !== "enabled")
|
|
122
|
+
return null;
|
|
123
|
+
const expose = value;
|
|
124
|
+
const known = new Set([...RUNTIME_EXPOSURE_CONFIG_KEYS, ...RUNTIME_EXPOSURE_TRANSPORT_KEYS]);
|
|
125
|
+
const unknownKeys = Object.keys(expose).filter((key) => !known.has(key));
|
|
126
|
+
if (unknownKeys.length > 0) {
|
|
127
|
+
throw new Error(`Unsupported expose field(s): ${unknownKeys.sort().join(", ")}`);
|
|
128
|
+
}
|
|
129
|
+
const merged = { ...DEFAULT_TAILSCALE_HTTPS_EXPOSURE };
|
|
130
|
+
for (const key of RUNTIME_EXPOSURE_CONFIG_KEYS) {
|
|
131
|
+
if (expose[key] !== undefined)
|
|
132
|
+
merged[key] = expose[key];
|
|
133
|
+
}
|
|
134
|
+
// `tailscaleHttps: true` is shorthand for the provider; normalize it away.
|
|
135
|
+
merged.type = "tailscale_https";
|
|
136
|
+
return runtimeExposureConfigSchema.parse(merged);
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=runtime-exposure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-exposure.js","sourceRoot":"","sources":["../../src/validators/runtime-exposure.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-exposure.test.d.ts","sourceRoot":"","sources":["../../src/validators/runtime-exposure.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { DEFAULT_TAILSCALE_HTTPS_EXPOSURE, parseRuntimeExposureConfig, readRuntimeExposureIntent, resolveDeclaredRuntimeExposureConfig, runtimeExposureConfigSchema, runtimeExposureListenerSchema, runtimeExposureStatusSchema, } from "./runtime-exposure.js";
|
|
3
|
+
describe("runtimeExposureConfigSchema", () => {
|
|
4
|
+
it("accepts the default fail-closed config", () => {
|
|
5
|
+
expect(() => runtimeExposureConfigSchema.parse(DEFAULT_TAILSCALE_HTTPS_EXPOSURE)).not.toThrow();
|
|
6
|
+
});
|
|
7
|
+
it("rejects unknown fields (no smuggled target/path/hostname suffix)", () => {
|
|
8
|
+
expect(() => runtimeExposureConfigSchema.parse({
|
|
9
|
+
...DEFAULT_TAILSCALE_HTTPS_EXPOSURE,
|
|
10
|
+
target: "http://127.0.0.1:5432",
|
|
11
|
+
})).toThrow();
|
|
12
|
+
});
|
|
13
|
+
it("rejects arbitrary hostname / publicPort / provider / failure policy", () => {
|
|
14
|
+
expect(() => runtimeExposureConfigSchema.parse({ ...DEFAULT_TAILSCALE_HTTPS_EXPOSURE, hostname: "evil.example" })).toThrow();
|
|
15
|
+
expect(() => runtimeExposureConfigSchema.parse({ ...DEFAULT_TAILSCALE_HTTPS_EXPOSURE, publicPort: 443 })).toThrow();
|
|
16
|
+
expect(() => runtimeExposureConfigSchema.parse({ ...DEFAULT_TAILSCALE_HTTPS_EXPOSURE, type: "funnel" })).toThrow();
|
|
17
|
+
expect(() => runtimeExposureConfigSchema.parse({ ...DEFAULT_TAILSCALE_HTTPS_EXPOSURE, failurePolicy: "fail_open" })).toThrow();
|
|
18
|
+
});
|
|
19
|
+
it("parseRuntimeExposureConfig returns null when absent and throws when malformed", () => {
|
|
20
|
+
expect(parseRuntimeExposureConfig(undefined)).toBeNull();
|
|
21
|
+
expect(parseRuntimeExposureConfig(null)).toBeNull();
|
|
22
|
+
expect(parseRuntimeExposureConfig(DEFAULT_TAILSCALE_HTTPS_EXPOSURE)).toEqual(DEFAULT_TAILSCALE_HTTPS_EXPOSURE);
|
|
23
|
+
expect(() => parseRuntimeExposureConfig({ type: "tailscale_https" })).toThrow();
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
describe("readRuntimeExposureIntent", () => {
|
|
27
|
+
it("treats a legacy expose block with no exposure fields as unset", () => {
|
|
28
|
+
// The pre-feature Paperclip App template shape: an `expose` block that only
|
|
29
|
+
// describes the backend URL. This must be defaultable, not opted out.
|
|
30
|
+
expect(readRuntimeExposureIntent({ urlTemplate: "http://paperclip-dev:{{port}}" })).toBe("unset");
|
|
31
|
+
expect(readRuntimeExposureIntent(undefined)).toBe("unset");
|
|
32
|
+
expect(readRuntimeExposureIntent(null)).toBe("unset");
|
|
33
|
+
expect(readRuntimeExposureIntent({})).toBe("unset");
|
|
34
|
+
expect(readRuntimeExposureIntent([])).toBe("unset");
|
|
35
|
+
expect(readRuntimeExposureIntent("tailscale_https")).toBe("unset");
|
|
36
|
+
});
|
|
37
|
+
it("reads explicit opt-in", () => {
|
|
38
|
+
expect(readRuntimeExposureIntent({ type: "tailscale_https" })).toBe("enabled");
|
|
39
|
+
expect(readRuntimeExposureIntent(DEFAULT_TAILSCALE_HTTPS_EXPOSURE)).toBe("enabled");
|
|
40
|
+
expect(readRuntimeExposureIntent({ tailscaleHttps: true })).toBe("enabled");
|
|
41
|
+
});
|
|
42
|
+
it("reads deliberate opt-out", () => {
|
|
43
|
+
expect(readRuntimeExposureIntent({ tailscaleHttps: false })).toBe("disabled");
|
|
44
|
+
expect(readRuntimeExposureIntent({ type: "none" })).toBe("disabled");
|
|
45
|
+
});
|
|
46
|
+
it("lets an explicit negative win over a stale positive in the same block", () => {
|
|
47
|
+
expect(readRuntimeExposureIntent({ type: "tailscale_https", tailscaleHttps: false })).toBe("disabled");
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
describe("resolveDeclaredRuntimeExposureConfig", () => {
|
|
51
|
+
it("returns null unless the block explicitly opts in", () => {
|
|
52
|
+
expect(resolveDeclaredRuntimeExposureConfig(undefined)).toBeNull();
|
|
53
|
+
expect(resolveDeclaredRuntimeExposureConfig({ urlTemplate: "http://paperclip-dev:{{port}}" })).toBeNull();
|
|
54
|
+
expect(resolveDeclaredRuntimeExposureConfig({ tailscaleHttps: false })).toBeNull();
|
|
55
|
+
});
|
|
56
|
+
it("completes a bare declaration from the fail-closed defaults", () => {
|
|
57
|
+
expect(resolveDeclaredRuntimeExposureConfig({ type: "tailscale_https" })).toEqual(DEFAULT_TAILSCALE_HTTPS_EXPOSURE);
|
|
58
|
+
// Shorthand normalizes to the provider literal.
|
|
59
|
+
expect(resolveDeclaredRuntimeExposureConfig({ tailscaleHttps: true })).toEqual(DEFAULT_TAILSCALE_HTTPS_EXPOSURE);
|
|
60
|
+
});
|
|
61
|
+
it("keeps the backend urlTemplate alongside an opt-in without leaking it into the config", () => {
|
|
62
|
+
expect(resolveDeclaredRuntimeExposureConfig({
|
|
63
|
+
type: "tailscale_https",
|
|
64
|
+
urlTemplate: "http://127.0.0.1:{{port}}",
|
|
65
|
+
})).toEqual(DEFAULT_TAILSCALE_HTTPS_EXPOSURE);
|
|
66
|
+
});
|
|
67
|
+
it("honors an explicit sub-field override", () => {
|
|
68
|
+
expect(resolveDeclaredRuntimeExposureConfig({ type: "tailscale_https", includePaperclipViteHmr: false })).toEqual({ ...DEFAULT_TAILSCALE_HTTPS_EXPOSURE, includePaperclipViteHmr: false });
|
|
69
|
+
});
|
|
70
|
+
it("still rejects smuggled fields and invalid sub-field values", () => {
|
|
71
|
+
expect(() => resolveDeclaredRuntimeExposureConfig({ type: "tailscale_https", target: "http://127.0.0.1:5432" })).toThrow(/Unsupported expose field/);
|
|
72
|
+
expect(() => resolveDeclaredRuntimeExposureConfig({ type: "tailscale_https", hostname: "evil.example" })).toThrow();
|
|
73
|
+
expect(() => resolveDeclaredRuntimeExposureConfig({ type: "tailscale_https", failurePolicy: "fail_open" })).toThrow();
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
describe("runtimeExposureListenerSchema", () => {
|
|
77
|
+
it("enforces the same-number invariant", () => {
|
|
78
|
+
expect(() => runtimeExposureListenerSchema.parse({ purpose: "app", publicPort: 42010, targetPort: 42010 })).not.toThrow();
|
|
79
|
+
expect(() => runtimeExposureListenerSchema.parse({ purpose: "app", publicPort: 42010, targetPort: 5432 })).toThrow();
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
describe("runtimeExposureStatusSchema", () => {
|
|
83
|
+
it("accepts a well-formed ready status", () => {
|
|
84
|
+
expect(() => runtimeExposureStatusSchema.parse({
|
|
85
|
+
provider: "tailscale_https",
|
|
86
|
+
state: "ready",
|
|
87
|
+
publicUrl: "https://paperclip-dev.tail29c1aa.ts.net:42010",
|
|
88
|
+
hostname: "paperclip-dev.tail29c1aa.ts.net",
|
|
89
|
+
listeners: [
|
|
90
|
+
{ purpose: "app", publicPort: 42010, targetPort: 42010 },
|
|
91
|
+
{ purpose: "vite_hmr", publicPort: 52010, targetPort: 52010 },
|
|
92
|
+
],
|
|
93
|
+
brokerRef: "rs-1",
|
|
94
|
+
lastError: null,
|
|
95
|
+
updatedAt: "2026-08-11T00:00:00.000Z",
|
|
96
|
+
})).not.toThrow();
|
|
97
|
+
});
|
|
98
|
+
it("rejects unknown fields in serialized status", () => {
|
|
99
|
+
expect(() => runtimeExposureStatusSchema.parse({
|
|
100
|
+
provider: "tailscale_https",
|
|
101
|
+
state: "ready",
|
|
102
|
+
publicUrl: null,
|
|
103
|
+
hostname: null,
|
|
104
|
+
listeners: [],
|
|
105
|
+
brokerRef: null,
|
|
106
|
+
lastError: null,
|
|
107
|
+
updatedAt: null,
|
|
108
|
+
leaseHandle: "secret",
|
|
109
|
+
})).toThrow();
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
//# sourceMappingURL=runtime-exposure.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-exposure.test.js","sourceRoot":"","sources":["../../src/validators/runtime-exposure.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,36 +26,36 @@ export declare const companySearchQuerySchema: z.ZodObject<{
|
|
|
26
26
|
}, "strip", z.ZodTypeAny, {
|
|
27
27
|
status: ("backlog" | "todo" | "in_progress" | "in_review" | "done" | "blocked" | "cancelled")[];
|
|
28
28
|
sort: "priority" | "relevance" | "updated" | "created";
|
|
29
|
-
priority: ("critical" | "high" | "medium" | "low")[];
|
|
30
29
|
offset: number;
|
|
31
|
-
q: string;
|
|
32
30
|
scope: "projects" | "agents" | "issues" | "all" | "comments" | "documents" | "artifacts";
|
|
31
|
+
priority: ("critical" | "high" | "medium" | "low")[];
|
|
32
|
+
q: string;
|
|
33
33
|
limit: number;
|
|
34
|
+
projectId?: string | undefined;
|
|
34
35
|
assigneeAgentId?: string | null | undefined;
|
|
35
36
|
assigneeUserId?: string | undefined;
|
|
36
|
-
projectId?: string | undefined;
|
|
37
37
|
labelId?: string | undefined;
|
|
38
38
|
updatedWithin?: string | undefined;
|
|
39
39
|
updatedAfter?: string | undefined;
|
|
40
40
|
}, {
|
|
41
41
|
status?: unknown;
|
|
42
42
|
sort?: unknown;
|
|
43
|
+
projectId?: unknown;
|
|
44
|
+
offset?: unknown;
|
|
45
|
+
scope?: unknown;
|
|
43
46
|
assigneeAgentId?: unknown;
|
|
44
47
|
assigneeUserId?: unknown;
|
|
45
|
-
projectId?: unknown;
|
|
46
48
|
priority?: unknown;
|
|
47
|
-
offset?: unknown;
|
|
48
49
|
labelId?: unknown;
|
|
49
50
|
updatedWithin?: unknown;
|
|
50
51
|
updatedAfter?: unknown;
|
|
51
52
|
q?: unknown;
|
|
52
|
-
scope?: unknown;
|
|
53
53
|
limit?: unknown;
|
|
54
54
|
}>;
|
|
55
55
|
export type CompanySearchQuery = z.infer<typeof companySearchQuerySchema>;
|
|
56
56
|
export declare const companySearchExtractQuerySchema: z.ZodEffects<z.ZodObject<{
|
|
57
57
|
contains: z.ZodEffects<z.ZodUnknown, string, unknown>;
|
|
58
|
-
kind: z.ZodEffects<z.ZodOptional<z.ZodUnknown>, "
|
|
58
|
+
kind: z.ZodEffects<z.ZodOptional<z.ZodUnknown>, "url" | "literal", unknown>;
|
|
59
59
|
scope: z.ZodEffects<z.ZodOptional<z.ZodUnknown>, "issues" | "all" | "comments" | "documents", unknown>;
|
|
60
60
|
limit: z.ZodEffects<z.ZodOptional<z.ZodUnknown>, number, unknown>;
|
|
61
61
|
offset: z.ZodEffects<z.ZodOptional<z.ZodUnknown>, number, unknown>;
|
|
@@ -66,8 +66,8 @@ export declare const companySearchExtractQuerySchema: z.ZodEffects<z.ZodObject<{
|
|
|
66
66
|
}, "strip", z.ZodTypeAny, {
|
|
67
67
|
contains: string;
|
|
68
68
|
status: ("backlog" | "todo" | "in_progress" | "in_review" | "done" | "blocked" | "cancelled")[];
|
|
69
|
-
kind: "literal" | "url";
|
|
70
69
|
offset: number;
|
|
70
|
+
kind: "url" | "literal";
|
|
71
71
|
scope: "issues" | "all" | "comments" | "documents";
|
|
72
72
|
limit: number;
|
|
73
73
|
matchesPerIssue: number;
|
|
@@ -76,18 +76,18 @@ export declare const companySearchExtractQuerySchema: z.ZodEffects<z.ZodObject<{
|
|
|
76
76
|
}, {
|
|
77
77
|
contains?: unknown;
|
|
78
78
|
status?: unknown;
|
|
79
|
-
kind?: unknown;
|
|
80
79
|
offset?: unknown;
|
|
80
|
+
kind?: unknown;
|
|
81
|
+
scope?: unknown;
|
|
81
82
|
updatedWithin?: unknown;
|
|
82
83
|
updatedAfter?: unknown;
|
|
83
|
-
scope?: unknown;
|
|
84
84
|
limit?: unknown;
|
|
85
85
|
matchesPerIssue?: unknown;
|
|
86
86
|
}>, {
|
|
87
87
|
contains: string;
|
|
88
88
|
status: ("backlog" | "todo" | "in_progress" | "in_review" | "done" | "blocked" | "cancelled")[];
|
|
89
|
-
kind: "literal" | "url";
|
|
90
89
|
offset: number;
|
|
90
|
+
kind: "url" | "literal";
|
|
91
91
|
scope: "issues" | "all" | "comments" | "documents";
|
|
92
92
|
limit: number;
|
|
93
93
|
matchesPerIssue: number;
|
|
@@ -96,11 +96,11 @@ export declare const companySearchExtractQuerySchema: z.ZodEffects<z.ZodObject<{
|
|
|
96
96
|
}, {
|
|
97
97
|
contains?: unknown;
|
|
98
98
|
status?: unknown;
|
|
99
|
-
kind?: unknown;
|
|
100
99
|
offset?: unknown;
|
|
100
|
+
kind?: unknown;
|
|
101
|
+
scope?: unknown;
|
|
101
102
|
updatedWithin?: unknown;
|
|
102
103
|
updatedAfter?: unknown;
|
|
103
|
-
scope?: unknown;
|
|
104
104
|
limit?: unknown;
|
|
105
105
|
matchesPerIssue?: unknown;
|
|
106
106
|
}>;
|