@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.
Files changed (185) hide show
  1. package/dist/adapter-auth-session.d.ts +16 -0
  2. package/dist/adapter-auth-session.d.ts.map +1 -0
  3. package/dist/adapter-auth-session.js +37 -0
  4. package/dist/adapter-auth-session.js.map +1 -0
  5. package/dist/company-import-transfer.d.ts +97 -0
  6. package/dist/company-import-transfer.d.ts.map +1 -0
  7. package/dist/company-import-transfer.js +50 -0
  8. package/dist/company-import-transfer.js.map +1 -0
  9. package/dist/constants.d.ts +19 -3
  10. package/dist/constants.d.ts.map +1 -1
  11. package/dist/constants.js +50 -3
  12. package/dist/constants.js.map +1 -1
  13. package/dist/environment-support.d.ts +16 -1
  14. package/dist/environment-support.d.ts.map +1 -1
  15. package/dist/environment-support.js +25 -2
  16. package/dist/environment-support.js.map +1 -1
  17. package/dist/environment-support.test.js +20 -0
  18. package/dist/environment-support.test.js.map +1 -1
  19. package/dist/feature-catalog.d.ts.map +1 -1
  20. package/dist/feature-catalog.js +10 -3
  21. package/dist/feature-catalog.js.map +1 -1
  22. package/dist/index.d.ts +13 -5
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +10 -3
  25. package/dist/index.js.map +1 -1
  26. package/dist/issue-thread-interactions.test.js +45 -1
  27. package/dist/issue-thread-interactions.test.js.map +1 -1
  28. package/dist/runtime-exposure/loopback-bind.d.ts +52 -0
  29. package/dist/runtime-exposure/loopback-bind.d.ts.map +1 -0
  30. package/dist/runtime-exposure/loopback-bind.js +93 -0
  31. package/dist/runtime-exposure/loopback-bind.js.map +1 -0
  32. package/dist/runtime-exposure/loopback-bind.test.d.ts +2 -0
  33. package/dist/runtime-exposure/loopback-bind.test.d.ts.map +1 -0
  34. package/dist/runtime-exposure/loopback-bind.test.js +93 -0
  35. package/dist/runtime-exposure/loopback-bind.test.js.map +1 -0
  36. package/dist/runtime-exposure/ports.d.ts +61 -0
  37. package/dist/runtime-exposure/ports.d.ts.map +1 -0
  38. package/dist/runtime-exposure/ports.js +96 -0
  39. package/dist/runtime-exposure/ports.js.map +1 -0
  40. package/dist/runtime-exposure/ports.test.d.ts +2 -0
  41. package/dist/runtime-exposure/ports.test.d.ts.map +1 -0
  42. package/dist/runtime-exposure/ports.test.js +46 -0
  43. package/dist/runtime-exposure/ports.test.js.map +1 -0
  44. package/dist/summary-slot.test.js +10 -1
  45. package/dist/summary-slot.test.js.map +1 -1
  46. package/dist/telemetry/events.d.ts +5 -0
  47. package/dist/telemetry/events.d.ts.map +1 -1
  48. package/dist/telemetry/events.js +7 -0
  49. package/dist/telemetry/events.js.map +1 -1
  50. package/dist/telemetry/generated/paperclip-telemetry.d.ts +20 -2
  51. package/dist/telemetry/generated/paperclip-telemetry.d.ts.map +1 -1
  52. package/dist/telemetry/generated/paperclip-telemetry.js +12 -0
  53. package/dist/telemetry/generated/paperclip-telemetry.js.map +1 -1
  54. package/dist/telemetry/index.d.ts +1 -1
  55. package/dist/telemetry/index.d.ts.map +1 -1
  56. package/dist/telemetry/index.js +1 -1
  57. package/dist/telemetry/index.js.map +1 -1
  58. package/dist/telemetry/retention.d.ts.map +1 -1
  59. package/dist/telemetry/retention.js +2 -0
  60. package/dist/telemetry/retention.js.map +1 -1
  61. package/dist/telemetry/retention.test.js +4 -0
  62. package/dist/telemetry/retention.test.js.map +1 -1
  63. package/dist/types/agent.adapter-auth-session.test.d.ts +2 -0
  64. package/dist/types/agent.adapter-auth-session.test.d.ts.map +1 -0
  65. package/dist/types/agent.adapter-auth-session.test.js +103 -0
  66. package/dist/types/agent.adapter-auth-session.test.js.map +1 -0
  67. package/dist/types/agent.d.ts +56 -0
  68. package/dist/types/agent.d.ts.map +1 -1
  69. package/dist/types/agent.js +50 -1
  70. package/dist/types/agent.js.map +1 -1
  71. package/dist/types/attention.d.ts +35 -0
  72. package/dist/types/attention.d.ts.map +1 -1
  73. package/dist/types/attention.js.map +1 -1
  74. package/dist/types/company-portability.d.ts +8 -0
  75. package/dist/types/company-portability.d.ts.map +1 -1
  76. package/dist/types/document-annotation.d.ts +17 -0
  77. package/dist/types/document-annotation.d.ts.map +1 -1
  78. package/dist/types/environment.d.ts +15 -12
  79. package/dist/types/environment.d.ts.map +1 -1
  80. package/dist/types/index.d.ts +7 -6
  81. package/dist/types/index.d.ts.map +1 -1
  82. package/dist/types/index.js +1 -0
  83. package/dist/types/index.js.map +1 -1
  84. package/dist/types/instance.d.ts +6 -1
  85. package/dist/types/instance.d.ts.map +1 -1
  86. package/dist/types/instance.js.map +1 -1
  87. package/dist/types/issue.d.ts +35 -7
  88. package/dist/types/issue.d.ts.map +1 -1
  89. package/dist/types/plugin.d.ts +46 -0
  90. package/dist/types/plugin.d.ts.map +1 -1
  91. package/dist/types/runtime-exposure.d.ts +74 -0
  92. package/dist/types/runtime-exposure.d.ts.map +1 -0
  93. package/dist/types/runtime-exposure.js +12 -0
  94. package/dist/types/runtime-exposure.js.map +1 -0
  95. package/dist/types/workspace-file-resource.d.ts +25 -0
  96. package/dist/types/workspace-file-resource.d.ts.map +1 -1
  97. package/dist/types/workspace-runtime.d.ts +9 -0
  98. package/dist/types/workspace-runtime.d.ts.map +1 -1
  99. package/dist/validators/access.d.ts +6 -6
  100. package/dist/validators/adapter-auth-session.d.ts +129 -0
  101. package/dist/validators/adapter-auth-session.d.ts.map +1 -0
  102. package/dist/validators/adapter-auth-session.js +34 -0
  103. package/dist/validators/adapter-auth-session.js.map +1 -0
  104. package/dist/validators/adapter-registry.d.ts +2 -2
  105. package/dist/validators/adapter-skills.d.ts +22 -22
  106. package/dist/validators/agent.d.ts +316 -298
  107. package/dist/validators/agent.d.ts.map +1 -1
  108. package/dist/validators/agent.js +9 -0
  109. package/dist/validators/agent.js.map +1 -1
  110. package/dist/validators/app-definition.d.ts +156 -156
  111. package/dist/validators/artifact.d.ts +64 -64
  112. package/dist/validators/claude-setup-token-session.d.ts +244 -0
  113. package/dist/validators/claude-setup-token-session.d.ts.map +1 -0
  114. package/dist/validators/claude-setup-token-session.js +128 -0
  115. package/dist/validators/claude-setup-token-session.js.map +1 -0
  116. package/dist/validators/claude-setup-token-session.test.d.ts +2 -0
  117. package/dist/validators/claude-setup-token-session.test.d.ts.map +1 -0
  118. package/dist/validators/claude-setup-token-session.test.js +107 -0
  119. package/dist/validators/claude-setup-token-session.test.js.map +1 -0
  120. package/dist/validators/company-portability.d.ts +342 -294
  121. package/dist/validators/company-portability.d.ts.map +1 -1
  122. package/dist/validators/company-portability.js +6 -0
  123. package/dist/validators/company-portability.js.map +1 -1
  124. package/dist/validators/company-skill.d.ts +386 -386
  125. package/dist/validators/company.d.ts +120 -120
  126. package/dist/validators/cost.d.ts +8 -8
  127. package/dist/validators/decision-queue.d.ts +6 -6
  128. package/dist/validators/decision.d.ts +124 -124
  129. package/dist/validators/environment-custom-images.d.ts +8 -8
  130. package/dist/validators/environment.d.ts +16 -16
  131. package/dist/validators/execution-workspace.d.ts +38 -38
  132. package/dist/validators/finance.d.ts +12 -12
  133. package/dist/validators/folder.d.ts +38 -38
  134. package/dist/validators/index.d.ts +4 -3
  135. package/dist/validators/index.d.ts.map +1 -1
  136. package/dist/validators/index.js +4 -3
  137. package/dist/validators/index.js.map +1 -1
  138. package/dist/validators/instance.d.ts +30 -16
  139. package/dist/validators/instance.d.ts.map +1 -1
  140. package/dist/validators/instance.js +2 -1
  141. package/dist/validators/instance.js.map +1 -1
  142. package/dist/validators/issue-tree-control.d.ts +4 -4
  143. package/dist/validators/issue.d.ts +1254 -1156
  144. package/dist/validators/issue.d.ts.map +1 -1
  145. package/dist/validators/issue.js +59 -5
  146. package/dist/validators/issue.js.map +1 -1
  147. package/dist/validators/onboarding-seed.d.ts +64 -0
  148. package/dist/validators/onboarding-seed.d.ts.map +1 -0
  149. package/dist/validators/onboarding-seed.js +33 -0
  150. package/dist/validators/onboarding-seed.js.map +1 -0
  151. package/dist/validators/pipeline.d.ts +96 -96
  152. package/dist/validators/plugin.d.ts +325 -184
  153. package/dist/validators/plugin.d.ts.map +1 -1
  154. package/dist/validators/plugin.js +14 -0
  155. package/dist/validators/plugin.js.map +1 -1
  156. package/dist/validators/plugin.test.js +80 -0
  157. package/dist/validators/plugin.test.js.map +1 -1
  158. package/dist/validators/project.d.ts +216 -216
  159. package/dist/validators/routine.d.ts +148 -148
  160. package/dist/validators/runtime-exposure.d.ts +149 -0
  161. package/dist/validators/runtime-exposure.d.ts.map +1 -0
  162. package/dist/validators/runtime-exposure.js +138 -0
  163. package/dist/validators/runtime-exposure.js.map +1 -0
  164. package/dist/validators/runtime-exposure.test.d.ts +2 -0
  165. package/dist/validators/runtime-exposure.test.d.ts.map +1 -0
  166. package/dist/validators/runtime-exposure.test.js +112 -0
  167. package/dist/validators/runtime-exposure.test.js.map +1 -0
  168. package/dist/validators/search.d.ts +13 -13
  169. package/dist/validators/secret.d.ts +53 -53
  170. package/dist/validators/status-card.d.ts +34 -34
  171. package/dist/validators/summary-slot.d.ts +6 -6
  172. package/dist/validators/summary-slot.d.ts.map +1 -1
  173. package/dist/validators/teams-catalog.d.ts +30 -30
  174. package/dist/validators/tool-access.d.ts +179 -179
  175. package/dist/validators/trust-policy.d.ts +18 -18
  176. package/dist/validators/work-product.d.ts +21 -21
  177. package/dist/validators/workspace-file-resource.d.ts +430 -16
  178. package/dist/validators/workspace-file-resource.d.ts.map +1 -1
  179. package/dist/validators/workspace-file-resource.js +19 -0
  180. package/dist/validators/workspace-file-resource.js.map +1 -1
  181. package/dist/workspace-file-resource.test.d.ts +2 -0
  182. package/dist/workspace-file-resource.test.d.ts.map +1 -0
  183. package/dist/workspace-file-resource.test.js +52 -0
  184. package/dist/workspace-file-resource.test.js.map +1 -0
  185. 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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=runtime-exposure.test.d.ts.map
@@ -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>, "literal" | "url", unknown>;
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
  }>;