@starlein/paperclip-plugin-company-wizard 0.4.18 → 0.4.21

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 (46) hide show
  1. package/CHANGELOG.md +73 -0
  2. package/README.md +13 -9
  3. package/dist/manifest.js +3 -1
  4. package/dist/manifest.js.map +2 -2
  5. package/dist/ui/index.css +6 -0
  6. package/dist/ui/index.css.map +2 -2
  7. package/dist/ui/index.js +19 -3
  8. package/dist/ui/index.js.map +2 -2
  9. package/dist/worker.js +2212 -561
  10. package/dist/worker.js.map +3 -3
  11. package/package.json +5 -5
  12. package/templates/modules/auto-assign/agents/ceo/skills/auto-assign.fallback.md +2 -1
  13. package/templates/modules/auto-assign/skills/auto-assign.md +1 -0
  14. package/templates/modules/backlog/agents/ceo/skills/backlog-health.fallback.md +1 -0
  15. package/templates/modules/backlog/module.meta.json +2 -1
  16. package/templates/modules/backlog/skills/backlog-health.md +3 -1
  17. package/templates/modules/github-repo/agents/engineer/skills/git-workflow.md +1 -1
  18. package/templates/modules/github-repo/docs/git-workflow.md +2 -2
  19. package/templates/modules/pr-review/README.md +2 -2
  20. package/templates/modules/pr-review/agents/code-reviewer/skills/code-review.md +3 -3
  21. package/templates/modules/pr-review/agents/engineer/skills/pr-workflow.md +6 -6
  22. package/templates/modules/pr-review/docs/pr-conventions.md +2 -2
  23. package/templates/modules/stall-detection/agents/ceo/skills/stall-detection.md +20 -17
  24. package/templates/roles/audio-designer/HEARTBEAT.md +2 -2
  25. package/templates/roles/ceo/HEARTBEAT.md +2 -2
  26. package/templates/roles/ceo/role.meta.json +1 -1
  27. package/templates/roles/cmo/HEARTBEAT.md +2 -2
  28. package/templates/roles/code-reviewer/AGENTS.md +1 -1
  29. package/templates/roles/code-reviewer/HEARTBEAT.md +3 -2
  30. package/templates/roles/cto/HEARTBEAT.md +2 -2
  31. package/templates/roles/cto/role.meta.json +1 -1
  32. package/templates/roles/customer-success/HEARTBEAT.md +2 -2
  33. package/templates/roles/devops/HEARTBEAT.md +2 -2
  34. package/templates/roles/engineer/AGENTS.md +1 -0
  35. package/templates/roles/engineer/HEARTBEAT.md +3 -2
  36. package/templates/roles/game-artist/HEARTBEAT.md +2 -2
  37. package/templates/roles/game-designer/HEARTBEAT.md +2 -2
  38. package/templates/roles/level-designer/HEARTBEAT.md +2 -2
  39. package/templates/roles/product-owner/AGENTS.md +1 -0
  40. package/templates/roles/product-owner/HEARTBEAT.md +2 -2
  41. package/templates/roles/qa/HEARTBEAT.md +2 -1
  42. package/templates/roles/security-engineer/AGENTS.md +1 -0
  43. package/templates/roles/security-engineer/HEARTBEAT.md +2 -2
  44. package/templates/roles/technical-writer/HEARTBEAT.md +2 -2
  45. package/templates/roles/ui-designer/HEARTBEAT.md +2 -2
  46. package/templates/roles/ux-researcher/HEARTBEAT.md +2 -2
package/dist/worker.js CHANGED
@@ -4,7 +4,7 @@ var __export = (target, all) => {
4
4
  __defProp(target, name, { get: all[name], enumerable: true });
5
5
  };
6
6
 
7
- // node_modules/.pnpm/@paperclipai+plugin-sdk@2026.529.0_react@19.2.4/node_modules/@paperclipai/plugin-sdk/dist/define-plugin.js
7
+ // node_modules/.pnpm/@paperclipai+plugin-sdk@2026.707.0_react@19.2.4/node_modules/@paperclipai/plugin-sdk/dist/define-plugin.js
8
8
  function definePlugin(definition) {
9
9
  return Object.freeze({ definition });
10
10
  }
@@ -4050,7 +4050,7 @@ var coerce = {
4050
4050
  };
4051
4051
  var NEVER = INVALID;
4052
4052
 
4053
- // node_modules/.pnpm/@paperclipai+shared@2026.529.0/node_modules/@paperclipai/shared/dist/constants.js
4053
+ // node_modules/.pnpm/@paperclipai+shared@2026.707.0/node_modules/@paperclipai/shared/dist/constants.js
4054
4054
  var COMPANY_STATUSES = ["active", "paused", "archived"];
4055
4055
  var DEFAULT_COMPANY_ATTACHMENT_MAX_BYTES = 10 * 1024 * 1024;
4056
4056
  var MAX_COMPANY_ATTACHMENT_MAX_BYTES = 1024 * 1024 * 1024;
@@ -4075,6 +4075,8 @@ var AGENT_ADAPTER_TYPES = [
4075
4075
  "codex_local",
4076
4076
  "cursor_cloud",
4077
4077
  "gemini_local",
4078
+ "hermes_gateway",
4079
+ "hermes_local",
4078
4080
  "opencode_local",
4079
4081
  "pi_local",
4080
4082
  "cursor",
@@ -4138,6 +4140,47 @@ var AGENT_ICON_NAMES = [
4138
4140
  "pentagon",
4139
4141
  "fingerprint"
4140
4142
  ];
4143
+ var PROJECT_ICON_NAMES = [
4144
+ "folder",
4145
+ "rocket",
4146
+ "code",
4147
+ "terminal",
4148
+ "database",
4149
+ "globe",
4150
+ "package",
4151
+ "boxes",
4152
+ "box",
4153
+ "layers",
4154
+ "briefcase",
4155
+ "compass",
4156
+ "target",
4157
+ "flame",
4158
+ "zap",
4159
+ "star",
4160
+ "bug",
4161
+ "wrench",
4162
+ "hammer",
4163
+ "lightbulb",
4164
+ "sparkles",
4165
+ "shield",
4166
+ "lock",
4167
+ "search",
4168
+ "cog",
4169
+ "brain",
4170
+ "cpu",
4171
+ "git-branch",
4172
+ "file-code",
4173
+ "puzzle",
4174
+ "gem",
4175
+ "atom",
4176
+ "heart",
4177
+ "mail",
4178
+ "message-square",
4179
+ "crown",
4180
+ "radar",
4181
+ "telescope",
4182
+ "hexagon"
4183
+ ];
4141
4184
  var ISSUE_STATUSES = [
4142
4185
  "backlog",
4143
4186
  "todo",
@@ -4157,7 +4200,7 @@ var INBOX_MINE_ISSUE_STATUSES = [
4157
4200
  ];
4158
4201
  var INBOX_MINE_ISSUE_STATUS_FILTER = INBOX_MINE_ISSUE_STATUSES.join(",");
4159
4202
  var ISSUE_PRIORITIES = ["critical", "high", "medium", "low"];
4160
- var ISSUE_WORK_MODES = ["standard", "planning"];
4203
+ var ISSUE_WORK_MODES = ["standard", "ask", "planning"];
4161
4204
  var MAX_ISSUE_REQUEST_DEPTH = 1024;
4162
4205
  var ISSUE_COMMENT_AUTHOR_TYPES = ["user", "agent", "system"];
4163
4206
  var ISSUE_COMMENT_PRESENTATION_KINDS = ["message", "system_notice"];
@@ -4178,8 +4221,10 @@ function clampIssueRequestDepth(value) {
4178
4221
  var ISSUE_THREAD_INTERACTION_KINDS = [
4179
4222
  "suggest_tasks",
4180
4223
  "ask_user_questions",
4181
- "request_confirmation"
4224
+ "request_confirmation",
4225
+ "request_checkbox_confirmation"
4182
4226
  ];
4227
+ var REQUEST_CHECKBOX_CONFIRMATION_OPTION_LIMIT = 200;
4183
4228
  var ISSUE_THREAD_INTERACTION_STATUSES = [
4184
4229
  "pending",
4185
4230
  "accepted",
@@ -4194,10 +4239,13 @@ var ISSUE_THREAD_INTERACTION_CONTINUATION_POLICIES = [
4194
4239
  "wake_assignee",
4195
4240
  "wake_assignee_on_accept"
4196
4241
  ];
4242
+ var ISSUE_WATCHDOG_DISCOVERY_KINDS = ["product_bug", "platform_bug"];
4197
4243
  var ISSUE_SURFACE_VISIBILITIES = ["default", "plugin_operation"];
4198
4244
  var ISSUE_RECOVERY_ACTION_KINDS = [
4199
4245
  "missing_disposition",
4200
4246
  "stranded_assigned_issue",
4247
+ "workspace_validation",
4248
+ "configuration_validation",
4201
4249
  "active_run_watchdog",
4202
4250
  "issue_graph_liveness"
4203
4251
  ];
@@ -4224,7 +4272,11 @@ var ISSUE_RECOVERY_ACTION_OUTCOMES = [
4224
4272
  var ISSUE_TREE_CONTROL_MODES = ["pause", "resume", "cancel", "restore"];
4225
4273
  var ISSUE_TREE_HOLD_RELEASE_POLICY_STRATEGIES = ["manual", "after_active_runs_finish"];
4226
4274
  var ISSUE_CONTINUATION_SUMMARY_DOCUMENT_KEY = "continuation-summary";
4227
- var SYSTEM_ISSUE_DOCUMENT_KEYS = [ISSUE_CONTINUATION_SUMMARY_DOCUMENT_KEY];
4275
+ var PIPELINE_CASE_BODY_DOCUMENT_KEY = "pipeline-case-body";
4276
+ var SYSTEM_ISSUE_DOCUMENT_KEYS = [
4277
+ ISSUE_CONTINUATION_SUMMARY_DOCUMENT_KEY,
4278
+ PIPELINE_CASE_BODY_DOCUMENT_KEY
4279
+ ];
4228
4280
  var SYSTEM_ISSUE_DOCUMENT_KEY_SET = new Set(SYSTEM_ISSUE_DOCUMENT_KEYS);
4229
4281
  var DOCUMENT_ANNOTATION_THREAD_STATUSES = ["open", "resolved"];
4230
4282
  var DOCUMENT_ANNOTATION_ANCHOR_STATES = ["active", "stale", "orphaned"];
@@ -4235,6 +4287,43 @@ var DOCUMENT_ANNOTATION_ANCHOR_CONFIDENCES = [
4235
4287
  "ambiguous",
4236
4288
  "missing"
4237
4289
  ];
4290
+ var EXTERNAL_OBJECT_STATUS_CATEGORIES = [
4291
+ "unknown",
4292
+ "open",
4293
+ "waiting",
4294
+ "running",
4295
+ "succeeded",
4296
+ "failed",
4297
+ "blocked",
4298
+ "closed",
4299
+ "archived",
4300
+ "auth_required",
4301
+ "unreachable"
4302
+ ];
4303
+ var EXTERNAL_OBJECT_STATUS_TONES = [
4304
+ "neutral",
4305
+ "info",
4306
+ "success",
4307
+ "warning",
4308
+ "danger",
4309
+ "muted"
4310
+ ];
4311
+ var EXTERNAL_OBJECT_LIVENESS_STATES = [
4312
+ "unknown",
4313
+ "fresh",
4314
+ "stale",
4315
+ "auth_required",
4316
+ "unreachable"
4317
+ ];
4318
+ var EXTERNAL_OBJECT_MENTION_SOURCE_KINDS = [
4319
+ "title",
4320
+ "description",
4321
+ "comment",
4322
+ "document",
4323
+ "property",
4324
+ "plugin"
4325
+ ];
4326
+ var EXTERNAL_OBJECT_MENTION_CONFIDENCES = ["exact", "likely", "possible"];
4238
4327
  var ISSUE_EXECUTION_POLICY_MODES = ["normal", "auto"];
4239
4328
  var ISSUE_EXECUTION_STAGE_TYPES = ["review", "approval"];
4240
4329
  var ISSUE_MONITOR_SCHEDULED_BY = ["assignee", "board"];
@@ -4269,14 +4358,40 @@ var PROJECT_STATUSES = [
4269
4358
  ];
4270
4359
  var ENVIRONMENT_DRIVERS = ["local", "ssh", "sandbox", "plugin"];
4271
4360
  var ENVIRONMENT_STATUSES = ["active", "archived"];
4272
- var ENVIRONMENT_LEASE_STATUSES = ["active", "released", "expired", "failed", "retained"];
4361
+ var ENVIRONMENT_LEASE_STATUSES = ["active", "released", "expired", "failed", "retained", "pending_cleanup"];
4273
4362
  var ENVIRONMENT_LEASE_CLEANUP_STATUSES = ["pending", "success", "failed"];
4363
+ var ENVIRONMENT_CUSTOM_IMAGE_TEMPLATE_KINDS = [
4364
+ "snapshot",
4365
+ "image",
4366
+ "provider_template",
4367
+ "unknown"
4368
+ ];
4369
+ var ENVIRONMENT_CUSTOM_IMAGE_TEMPLATE_STATUSES = [
4370
+ "active",
4371
+ "superseded",
4372
+ "revoked",
4373
+ "failed"
4374
+ ];
4375
+ var ENVIRONMENT_CUSTOM_IMAGE_SETUP_SESSION_STATUSES = [
4376
+ "starting",
4377
+ "waiting_for_user",
4378
+ "capturing",
4379
+ "promoted",
4380
+ "cancelled",
4381
+ "timed_out",
4382
+ "failed"
4383
+ ];
4384
+ var ENVIRONMENT_CUSTOM_IMAGE_SETUP_CONNECTION_TYPES = [
4385
+ "ssh",
4386
+ "browser_terminal",
4387
+ "unknown"
4388
+ ];
4274
4389
  var ROUTINE_STATUSES = ["active", "paused", "archived"];
4275
4390
  var ROUTINE_CONCURRENCY_POLICIES = ["coalesce_if_active", "always_enqueue", "skip_if_active"];
4276
4391
  var ROUTINE_CATCH_UP_POLICIES = ["skip_missed", "enqueue_missed_with_cap"];
4277
4392
  var ROUTINE_TRIGGER_KINDS = ["schedule", "webhook", "api"];
4278
4393
  var ROUTINE_TRIGGER_SIGNING_MODES = ["bearer", "hmac_sha256", "github_hmac", "none"];
4279
- var ROUTINE_VARIABLE_TYPES = ["text", "textarea", "number", "boolean", "select"];
4394
+ var ROUTINE_VARIABLE_TYPES = ["text", "textarea", "number", "boolean", "select", "date"];
4280
4395
  var APPROVAL_TYPES = [
4281
4396
  "hire_agent",
4282
4397
  "approve_ceo_strategy",
@@ -4364,12 +4479,14 @@ var JOIN_REQUEST_TYPES = ["human", "agent"];
4364
4479
  var JOIN_REQUEST_STATUSES = ["pending_approval", "approved", "rejected"];
4365
4480
  var PERMISSION_KEYS = [
4366
4481
  "agents:create",
4482
+ "skills:create",
4367
4483
  "environments:manage",
4368
4484
  "users:invite",
4369
4485
  "users:manage_permissions",
4370
4486
  "tasks:assign",
4371
4487
  "tasks:assign_scope",
4372
4488
  "tasks:manage_active_checkouts",
4489
+ "pipelines:write",
4373
4490
  "joins:approve"
4374
4491
  ];
4375
4492
  var PLUGIN_STATUSES = [
@@ -4439,6 +4556,10 @@ var PLUGIN_CAPABILITIES = [
4439
4556
  "telemetry.track",
4440
4557
  "database.namespace.migrate",
4441
4558
  "database.namespace.write",
4559
+ "external.objects.detect",
4560
+ "external.objects.read",
4561
+ "external.objects.write",
4562
+ "external.objects.refresh",
4442
4563
  // Plugin State
4443
4564
  "plugin.state.read",
4444
4565
  "plugin.state.write",
@@ -4502,6 +4623,8 @@ var PLUGIN_UI_SLOT_TYPES = [
4502
4623
  "settingsPage",
4503
4624
  "companySettingsPage"
4504
4625
  ];
4626
+ var WORKSPACE_OVERVIEW_DEFAULT_LIMIT = 50;
4627
+ var WORKSPACE_OVERVIEW_MAX_LIMIT = 100;
4505
4628
  var PLUGIN_RESERVED_COMPANY_ROUTE_SEGMENTS = [
4506
4629
  "dashboard",
4507
4630
  "onboarding",
@@ -4518,6 +4641,7 @@ var PLUGIN_RESERVED_COMPANY_ROUTE_SEGMENTS = [
4518
4641
  "costs",
4519
4642
  "activity",
4520
4643
  "inbox",
4644
+ "workspaces",
4521
4645
  "design-guide",
4522
4646
  "tests"
4523
4647
  ];
@@ -4527,7 +4651,8 @@ var PLUGIN_RESERVED_COMPANY_SETTINGS_ROUTE_SEGMENTS = [
4527
4651
  "access",
4528
4652
  "members",
4529
4653
  "invites",
4530
- "secrets"
4654
+ "secrets",
4655
+ "instance"
4531
4656
  ];
4532
4657
  var PLUGIN_LAUNCHER_PLACEMENT_ZONES = [
4533
4658
  "page",
@@ -4587,11 +4712,17 @@ var PLUGIN_STATE_SCOPE_KINDS = [
4587
4712
  "run"
4588
4713
  ];
4589
4714
 
4590
- // node_modules/.pnpm/@paperclipai+shared@2026.529.0/node_modules/@paperclipai/shared/dist/adapter-type.js
4715
+ // node_modules/.pnpm/@paperclipai+shared@2026.707.0/node_modules/@paperclipai/shared/dist/adapter-type.js
4591
4716
  var agentAdapterTypeSchema = external_exports.string().trim().min(1).default("process").describe(`Known built-in adapters: ${AGENT_ADAPTER_TYPES.join(", ")}. External adapters may register additional non-empty string types at runtime.`);
4592
4717
  var optionalAgentAdapterTypeSchema = external_exports.string().trim().min(1).optional();
4593
4718
 
4594
- // node_modules/.pnpm/@paperclipai+shared@2026.529.0/node_modules/@paperclipai/shared/dist/network-bind.js
4719
+ // node_modules/.pnpm/@paperclipai+shared@2026.707.0/node_modules/@paperclipai/shared/dist/trust-policy.js
4720
+ var TRUST_PRESETS = ["standard", "low_trust_review"];
4721
+ var LOW_TRUST_REVIEW_PRESET = "low_trust_review";
4722
+ var LOW_TRUST_REVIEW_PRESET_VERSION = 1;
4723
+ var LOW_TRUST_REVIEW_RAW_OUTPUT_DISPOSITION = "quarantine";
4724
+
4725
+ // node_modules/.pnpm/@paperclipai+shared@2026.707.0/node_modules/@paperclipai/shared/dist/network-bind.js
4595
4726
  function normalizeHost(host) {
4596
4727
  const trimmed = host?.trim();
4597
4728
  return trimmed ? trimmed : void 0;
@@ -4634,7 +4765,7 @@ function validateConfiguredBindMode(input) {
4634
4765
  return errors;
4635
4766
  }
4636
4767
 
4637
- // node_modules/.pnpm/@paperclipai+shared@2026.529.0/node_modules/@paperclipai/shared/dist/types/instance.js
4768
+ // node_modules/.pnpm/@paperclipai+shared@2026.707.0/node_modules/@paperclipai/shared/dist/types/instance.js
4638
4769
  var DAILY_RETENTION_PRESETS = [3, 7, 14];
4639
4770
  var WEEKLY_RETENTION_PRESETS = [1, 2, 4];
4640
4771
  var MONTHLY_RETENTION_PRESETS = [1, 3, 6];
@@ -4647,13 +4778,13 @@ var DEFAULT_BACKUP_RETENTION = {
4647
4778
  monthlyMonths: 1
4648
4779
  };
4649
4780
 
4650
- // node_modules/.pnpm/@paperclipai+shared@2026.529.0/node_modules/@paperclipai/shared/dist/types/search.js
4651
- var COMPANY_SEARCH_SCOPES = ["all", "issues", "comments", "documents", "agents", "projects"];
4781
+ // node_modules/.pnpm/@paperclipai+shared@2026.707.0/node_modules/@paperclipai/shared/dist/types/search.js
4782
+ var COMPANY_SEARCH_SCOPES = ["all", "issues", "comments", "documents", "artifacts", "agents", "projects"];
4652
4783
 
4653
- // node_modules/.pnpm/@paperclipai+shared@2026.529.0/node_modules/@paperclipai/shared/dist/types/resource-memberships.js
4784
+ // node_modules/.pnpm/@paperclipai+shared@2026.707.0/node_modules/@paperclipai/shared/dist/types/resource-memberships.js
4654
4785
  var RESOURCE_MEMBERSHIP_STATES = ["joined", "left"];
4655
4786
 
4656
- // node_modules/.pnpm/@paperclipai+shared@2026.529.0/node_modules/@paperclipai/shared/dist/validators/sidebar-preferences.js
4787
+ // node_modules/.pnpm/@paperclipai+shared@2026.707.0/node_modules/@paperclipai/shared/dist/validators/sidebar-preferences.js
4657
4788
  var sidebarOrderedIdSchema = external_exports.string().uuid();
4658
4789
  var sidebarOrderPreferenceSchema = external_exports.object({
4659
4790
  orderedIds: external_exports.array(sidebarOrderedIdSchema),
@@ -4663,13 +4794,19 @@ var upsertSidebarOrderPreferenceSchema = external_exports.object({
4663
4794
  orderedIds: external_exports.array(sidebarOrderedIdSchema)
4664
4795
  });
4665
4796
 
4666
- // node_modules/.pnpm/@paperclipai+shared@2026.529.0/node_modules/@paperclipai/shared/dist/validators/resource-memberships.js
4797
+ // node_modules/.pnpm/@paperclipai+shared@2026.707.0/node_modules/@paperclipai/shared/dist/validators/resource-memberships.js
4667
4798
  var resourceMembershipStateSchema = external_exports.enum(RESOURCE_MEMBERSHIP_STATES);
4668
4799
  var updateResourceMembershipSchema = external_exports.object({
4669
- state: resourceMembershipStateSchema
4800
+ state: resourceMembershipStateSchema.optional(),
4801
+ starred: external_exports.boolean().optional()
4802
+ }).refine((value) => value.state !== void 0 || value.starred !== void 0, {
4803
+ message: "state or starred is required"
4804
+ }).refine((value) => !(value.state === "left" && value.starred === true), {
4805
+ message: "starred resources must be joined",
4806
+ path: ["starred"]
4670
4807
  });
4671
4808
 
4672
- // node_modules/.pnpm/@paperclipai+shared@2026.529.0/node_modules/@paperclipai/shared/dist/validators/execution-workspace.js
4809
+ // node_modules/.pnpm/@paperclipai+shared@2026.707.0/node_modules/@paperclipai/shared/dist/validators/execution-workspace.js
4673
4810
  var executionWorkspaceStatusSchema = external_exports.enum([
4674
4811
  "active",
4675
4812
  "idle",
@@ -4677,6 +4814,23 @@ var executionWorkspaceStatusSchema = external_exports.enum([
4677
4814
  "archived",
4678
4815
  "cleanup_failed"
4679
4816
  ]);
4817
+ var workspaceOverviewStatusFilterSchema = external_exports.preprocess((value) => {
4818
+ if (value === void 0 || value === null)
4819
+ return void 0;
4820
+ const rawValues = Array.isArray(value) ? value : [value];
4821
+ const statuses = rawValues.flatMap((entry) => {
4822
+ if (typeof entry !== "string")
4823
+ return [];
4824
+ return entry.split(",").map((part) => part.trim()).filter(Boolean);
4825
+ });
4826
+ return statuses.length > 0 ? statuses : void 0;
4827
+ }, external_exports.array(executionWorkspaceStatusSchema).optional());
4828
+ var workspaceOverviewQuerySchema = external_exports.object({
4829
+ projectId: external_exports.string().uuid().optional(),
4830
+ status: workspaceOverviewStatusFilterSchema,
4831
+ limit: external_exports.coerce.number().int().min(1).max(WORKSPACE_OVERVIEW_MAX_LIMIT).optional().default(WORKSPACE_OVERVIEW_DEFAULT_LIMIT),
4832
+ offset: external_exports.coerce.number().int().min(0).optional().default(0)
4833
+ }).strict();
4680
4834
  var executionWorkspaceConfigSchema = external_exports.object({
4681
4835
  environmentId: external_exports.string().uuid().optional().nullable(),
4682
4836
  provisionCommand: external_exports.string().optional().nullable(),
@@ -4789,14 +4943,14 @@ var updateExecutionWorkspaceSchema = external_exports.object({
4789
4943
  metadata: external_exports.record(external_exports.string(), external_exports.unknown()).optional().nullable()
4790
4944
  }).strict();
4791
4945
 
4792
- // node_modules/.pnpm/@paperclipai+shared@2026.529.0/node_modules/@paperclipai/shared/dist/types/feedback.js
4946
+ // node_modules/.pnpm/@paperclipai+shared@2026.707.0/node_modules/@paperclipai/shared/dist/types/feedback.js
4793
4947
  var FEEDBACK_TARGET_TYPES = ["issue_comment", "issue_document_revision"];
4794
4948
  var FEEDBACK_VOTE_VALUES = ["up", "down"];
4795
4949
  var FEEDBACK_DATA_SHARING_PREFERENCES = ["allowed", "not_allowed", "prompt"];
4796
4950
  var DEFAULT_FEEDBACK_DATA_SHARING_PREFERENCE = "prompt";
4797
4951
  var FEEDBACK_TRACE_STATUSES = ["local_only", "pending", "sent", "failed"];
4798
4952
 
4799
- // node_modules/.pnpm/@paperclipai+shared@2026.529.0/node_modules/@paperclipai/shared/dist/validators/feedback.js
4953
+ // node_modules/.pnpm/@paperclipai+shared@2026.707.0/node_modules/@paperclipai/shared/dist/validators/feedback.js
4800
4954
  var feedbackTargetTypeSchema = external_exports.enum(FEEDBACK_TARGET_TYPES);
4801
4955
  var feedbackTraceStatusSchema = external_exports.enum(FEEDBACK_TRACE_STATUSES);
4802
4956
  var feedbackVoteValueSchema = external_exports.enum(FEEDBACK_VOTE_VALUES);
@@ -4809,7 +4963,7 @@ var upsertIssueFeedbackVoteSchema = external_exports.object({
4809
4963
  allowSharing: external_exports.boolean().optional()
4810
4964
  });
4811
4965
 
4812
- // node_modules/.pnpm/@paperclipai+shared@2026.529.0/node_modules/@paperclipai/shared/dist/validators/instance.js
4966
+ // node_modules/.pnpm/@paperclipai+shared@2026.707.0/node_modules/@paperclipai/shared/dist/validators/instance.js
4813
4967
  function presetSchema(presets, label) {
4814
4968
  return external_exports.number().refine((v) => presets.includes(v), { message: `${label} must be one of: ${presets.join(", ")}` });
4815
4969
  }
@@ -4822,24 +4976,46 @@ var instanceGeneralSettingsSchema = external_exports.object({
4822
4976
  censorUsernameInLogs: external_exports.boolean().default(false),
4823
4977
  keyboardShortcuts: external_exports.boolean().default(false),
4824
4978
  feedbackDataSharingPreference: feedbackDataSharingPreferenceSchema.default(DEFAULT_FEEDBACK_DATA_SHARING_PREFERENCE),
4825
- backupRetention: backupRetentionPolicySchema.default(DEFAULT_BACKUP_RETENTION)
4979
+ backupRetention: backupRetentionPolicySchema.default(DEFAULT_BACKUP_RETENTION),
4980
+ // Execution policy. Absent/"any" = unrestricted; "kubernetes" forces the
4981
+ // Kubernetes sandbox provider and denies local/ssh execution (cloud_tenant).
4982
+ executionMode: external_exports.enum(["kubernetes", "any"]).optional()
4826
4983
  }).strict();
4827
4984
  var patchInstanceGeneralSettingsSchema = instanceGeneralSettingsSchema.partial();
4828
4985
  var instanceExperimentalSettingsSchema = external_exports.object({
4829
4986
  enableEnvironments: external_exports.boolean().default(false),
4830
4987
  enableIsolatedWorkspaces: external_exports.boolean().default(false),
4988
+ enableStreamlinedLeftNavigation: external_exports.boolean().default(true),
4989
+ enablePipelines: external_exports.boolean().default(false),
4990
+ enableConferenceRoomChat: external_exports.boolean().default(false),
4991
+ enableTaskWatchdogs: external_exports.boolean().default(false),
4831
4992
  enableIssuePlanDecompositions: external_exports.boolean().default(false),
4993
+ enableExperimentalFileViewer: external_exports.boolean().default(false),
4832
4994
  enableCloudSync: external_exports.boolean().default(false),
4995
+ enableExternalObjects: external_exports.boolean().default(false),
4996
+ enableServerInfoDebugView: external_exports.boolean().default(false),
4833
4997
  autoRestartDevServerWhenIdle: external_exports.boolean().default(false),
4834
4998
  enableIssueGraphLivenessAutoRecovery: external_exports.boolean().default(false),
4999
+ enableWorkspaceBranchReconcileForward: external_exports.boolean().default(false),
4835
5000
  issueGraphLivenessAutoRecoveryLookbackHours: external_exports.number().int().min(MIN_ISSUE_GRAPH_LIVENESS_AUTO_RECOVERY_LOOKBACK_HOURS).max(MAX_ISSUE_GRAPH_LIVENESS_AUTO_RECOVERY_LOOKBACK_HOURS).default(DEFAULT_ISSUE_GRAPH_LIVENESS_AUTO_RECOVERY_LOOKBACK_HOURS)
4836
5001
  }).strict();
4837
5002
  var patchInstanceExperimentalSettingsSchema = instanceExperimentalSettingsSchema.partial();
5003
+ var patchInstanceSettingsSchema = external_exports.object({
5004
+ defaultEnvironmentId: external_exports.string().uuid().nullable().optional()
5005
+ }).strict();
4838
5006
  var issueGraphLivenessAutoRecoveryRequestSchema = external_exports.object({
4839
5007
  lookbackHours: external_exports.number().int().min(MIN_ISSUE_GRAPH_LIVENESS_AUTO_RECOVERY_LOOKBACK_HOURS).max(MAX_ISSUE_GRAPH_LIVENESS_AUTO_RECOVERY_LOOKBACK_HOURS).optional()
4840
5008
  }).strict();
5009
+ var instanceSettingsSchema = external_exports.object({
5010
+ id: external_exports.string().uuid(),
5011
+ defaultEnvironmentId: external_exports.string().uuid().nullable(),
5012
+ general: instanceGeneralSettingsSchema,
5013
+ experimental: instanceExperimentalSettingsSchema,
5014
+ createdAt: external_exports.union([external_exports.date(), external_exports.string().datetime()]),
5015
+ updatedAt: external_exports.union([external_exports.date(), external_exports.string().datetime()])
5016
+ }).strict();
4841
5017
 
4842
- // node_modules/.pnpm/@paperclipai+shared@2026.529.0/node_modules/@paperclipai/shared/dist/validators/budget.js
5018
+ // node_modules/.pnpm/@paperclipai+shared@2026.707.0/node_modules/@paperclipai/shared/dist/validators/budget.js
4843
5019
  var upsertBudgetPolicySchema = external_exports.object({
4844
5020
  scopeType: external_exports.enum(BUDGET_SCOPE_TYPES),
4845
5021
  scopeId: external_exports.string().uuid(),
@@ -4865,7 +5041,7 @@ var resolveBudgetIncidentSchema = external_exports.object({
4865
5041
  }
4866
5042
  });
4867
5043
 
4868
- // node_modules/.pnpm/@paperclipai+shared@2026.529.0/node_modules/@paperclipai/shared/dist/validators/company.js
5044
+ // node_modules/.pnpm/@paperclipai+shared@2026.707.0/node_modules/@paperclipai/shared/dist/validators/company.js
4869
5045
  var logoAssetIdSchema = external_exports.string().uuid().nullable().optional();
4870
5046
  var brandColorSchema = external_exports.string().regex(/^#[0-9a-fA-F]{6}$/).nullable().optional();
4871
5047
  var feedbackDataSharingTermsVersionSchema = external_exports.string().min(1).nullable().optional();
@@ -4874,7 +5050,8 @@ var createCompanySchema = external_exports.object({
4874
5050
  name: external_exports.string().min(1),
4875
5051
  description: external_exports.string().optional().nullable(),
4876
5052
  budgetMonthlyCents: external_exports.number().int().nonnegative().optional().default(0),
4877
- attachmentMaxBytes: attachmentMaxBytesSchema.optional()
5053
+ attachmentMaxBytes: attachmentMaxBytesSchema.optional(),
5054
+ defaultResponsibleUserId: external_exports.string().min(1).nullable().optional()
4878
5055
  });
4879
5056
  var updateCompanySchema = createCompanySchema.partial().extend({
4880
5057
  status: external_exports.enum(COMPANY_STATUSES).optional(),
@@ -4895,109 +5072,622 @@ var updateCompanyBrandingSchema = external_exports.object({
4895
5072
  logoAssetId: logoAssetIdSchema
4896
5073
  }).strict().refine((value) => value.name !== void 0 || value.description !== void 0 || value.brandColor !== void 0 || value.logoAssetId !== void 0, "At least one branding field must be provided");
4897
5074
 
4898
- // node_modules/.pnpm/@paperclipai+shared@2026.529.0/node_modules/@paperclipai/shared/dist/validators/environment.js
4899
- var environmentDriverSchema = external_exports.enum(ENVIRONMENT_DRIVERS);
4900
- var environmentStatusSchema = external_exports.enum(ENVIRONMENT_STATUSES);
4901
- var environmentLeaseStatusSchema = external_exports.enum(ENVIRONMENT_LEASE_STATUSES);
4902
- var environmentLeaseCleanupStatusSchema = external_exports.enum(ENVIRONMENT_LEASE_CLEANUP_STATUSES);
4903
- var environmentFields = {
5075
+ // node_modules/.pnpm/@paperclipai+shared@2026.707.0/node_modules/@paperclipai/shared/dist/validators/secret.js
5076
+ var secretKeySchema = external_exports.string().trim().min(1).max(120).regex(/^[a-zA-Z0-9_.-]+$/);
5077
+ var secretVersionSelectorSchema = external_exports.union([external_exports.literal("latest"), external_exports.number().int().positive()]);
5078
+ var creatableSecretStatusSchema = external_exports.enum(["active", "disabled", "archived"]);
5079
+ var envBindingPlainSchema = external_exports.object({
5080
+ type: external_exports.literal("plain"),
5081
+ value: external_exports.string()
5082
+ });
5083
+ var envBindingSecretRefSchema = external_exports.object({
5084
+ type: external_exports.literal("secret_ref"),
5085
+ secretId: external_exports.string().uuid(),
5086
+ version: secretVersionSelectorSchema.optional()
5087
+ });
5088
+ var envBindingUserSecretRefSchema = external_exports.object({
5089
+ type: external_exports.literal("user_secret_ref"),
5090
+ key: secretKeySchema,
5091
+ version: secretVersionSelectorSchema.optional(),
5092
+ required: external_exports.boolean().optional().default(true),
5093
+ allowMissingOverride: external_exports.boolean().optional().default(false)
5094
+ });
5095
+ var envBindingSchema = external_exports.union([
5096
+ external_exports.string(),
5097
+ envBindingPlainSchema,
5098
+ envBindingSecretRefSchema,
5099
+ envBindingUserSecretRefSchema
5100
+ ]);
5101
+ var envConfigSchema = external_exports.record(external_exports.string(), envBindingSchema);
5102
+ var createSecretSchema = external_exports.object({
4904
5103
  name: external_exports.string().min(1),
5104
+ key: secretKeySchema.optional(),
5105
+ provider: external_exports.enum(SECRET_PROVIDERS).optional(),
5106
+ providerConfigId: external_exports.string().uuid().optional().nullable(),
5107
+ managedMode: external_exports.enum(SECRET_MANAGED_MODES).optional(),
5108
+ value: external_exports.string().min(1).optional().nullable(),
4905
5109
  description: external_exports.string().optional().nullable(),
4906
- driver: environmentDriverSchema,
4907
- status: environmentStatusSchema.optional().default("active"),
4908
- config: external_exports.record(external_exports.string(), external_exports.unknown()).optional().default({}),
4909
- metadata: external_exports.record(external_exports.string(), external_exports.unknown()).optional().nullable()
4910
- };
4911
- var createEnvironmentSchema = external_exports.object(environmentFields).strict();
4912
- var updateEnvironmentSchema = external_exports.object({
4913
- name: external_exports.string().min(1).optional(),
4914
- description: external_exports.string().optional().nullable(),
4915
- driver: environmentDriverSchema.optional(),
4916
- status: environmentStatusSchema.optional(),
4917
- config: external_exports.record(external_exports.string(), external_exports.unknown()).optional(),
4918
- metadata: external_exports.record(external_exports.string(), external_exports.unknown()).optional().nullable()
4919
- }).strict();
4920
- var probeEnvironmentConfigSchema = external_exports.object({
5110
+ externalRef: external_exports.string().optional().nullable(),
5111
+ providerMetadata: external_exports.record(external_exports.string(), external_exports.unknown()).optional().nullable(),
5112
+ providerVersionRef: external_exports.string().optional().nullable()
5113
+ }).superRefine((value, ctx) => {
5114
+ if ((value.managedMode ?? "paperclip_managed") === "external_reference") {
5115
+ if (!value.externalRef?.trim()) {
5116
+ ctx.addIssue({
5117
+ code: external_exports.ZodIssueCode.custom,
5118
+ path: ["externalRef"],
5119
+ message: "External reference secrets require externalRef"
5120
+ });
5121
+ }
5122
+ return;
5123
+ }
5124
+ if (value.externalRef?.trim()) {
5125
+ ctx.addIssue({
5126
+ code: external_exports.ZodIssueCode.custom,
5127
+ path: ["externalRef"],
5128
+ message: "Managed secrets cannot set externalRef"
5129
+ });
5130
+ }
5131
+ if (!value.value?.trim()) {
5132
+ ctx.addIssue({
5133
+ code: external_exports.ZodIssueCode.custom,
5134
+ path: ["value"],
5135
+ message: "Managed secrets require value"
5136
+ });
5137
+ }
5138
+ });
5139
+ function requireSecretRotationInput(value, ctx) {
5140
+ if (!value.value?.trim() && !value.externalRef?.trim() && value.providerVersionRef == null && value.providerConfigId == null) {
5141
+ ctx.addIssue({
5142
+ code: external_exports.ZodIssueCode.custom,
5143
+ path: ["value"],
5144
+ message: "Secret rotation requires value, externalRef, providerVersionRef, or providerConfigId"
5145
+ });
5146
+ }
5147
+ }
5148
+ var rotateSecretSchema = external_exports.object({
5149
+ value: external_exports.string().min(1).optional().nullable(),
5150
+ externalRef: external_exports.string().optional().nullable(),
5151
+ providerVersionRef: external_exports.string().optional().nullable(),
5152
+ providerConfigId: external_exports.string().uuid().optional().nullable()
5153
+ }).superRefine(requireSecretRotationInput);
5154
+ var updateSecretSchema = external_exports.object({
4921
5155
  name: external_exports.string().min(1).optional(),
5156
+ key: secretKeySchema.optional(),
5157
+ status: external_exports.enum(SECRET_STATUSES).optional(),
5158
+ providerConfigId: external_exports.string().uuid().optional().nullable(),
4922
5159
  description: external_exports.string().optional().nullable(),
4923
- driver: environmentDriverSchema,
4924
- config: external_exports.record(external_exports.string(), external_exports.unknown()).optional().default({}),
4925
- metadata: external_exports.record(external_exports.string(), external_exports.unknown()).optional().nullable()
4926
- }).strict();
4927
-
4928
- // node_modules/.pnpm/@paperclipai+shared@2026.529.0/node_modules/@paperclipai/shared/dist/validators/company-skill.js
4929
- var companySkillSourceTypeSchema = external_exports.enum(["local_path", "github", "url", "catalog", "skills_sh"]);
4930
- var companySkillTrustLevelSchema = external_exports.enum(["markdown_only", "assets", "scripts_executables"]);
4931
- var companySkillCompatibilitySchema = external_exports.enum(["compatible", "unknown", "invalid"]);
4932
- var companySkillSourceBadgeSchema = external_exports.enum(["paperclip", "github", "local", "url", "catalog", "skills_sh"]);
4933
- var companySkillFileInventoryEntrySchema = external_exports.object({
4934
- path: external_exports.string().min(1),
4935
- kind: external_exports.enum(["skill", "markdown", "reference", "script", "asset", "other"])
5160
+ externalRef: external_exports.string().optional().nullable(),
5161
+ providerMetadata: external_exports.record(external_exports.string(), external_exports.unknown()).optional().nullable()
4936
5162
  });
4937
- var companySkillSchema = external_exports.object({
4938
- id: external_exports.string().uuid(),
4939
- companyId: external_exports.string().uuid(),
4940
- key: external_exports.string().min(1),
4941
- slug: external_exports.string().min(1),
4942
- name: external_exports.string().min(1),
4943
- description: external_exports.string().nullable(),
4944
- markdown: external_exports.string(),
4945
- sourceType: companySkillSourceTypeSchema,
4946
- sourceLocator: external_exports.string().nullable(),
4947
- sourceRef: external_exports.string().nullable(),
4948
- trustLevel: companySkillTrustLevelSchema,
4949
- compatibility: companySkillCompatibilitySchema,
4950
- fileInventory: external_exports.array(companySkillFileInventoryEntrySchema).default([]),
4951
- metadata: external_exports.record(external_exports.string(), external_exports.unknown()).nullable(),
4952
- createdAt: external_exports.coerce.date(),
4953
- updatedAt: external_exports.coerce.date()
5163
+ var secretBindingTargetSchema = external_exports.object({
5164
+ targetType: external_exports.enum(SECRET_BINDING_TARGET_TYPES),
5165
+ targetId: external_exports.string().min(1),
5166
+ configPath: external_exports.string().min(1)
4954
5167
  });
4955
- var companySkillListItemSchema = companySkillSchema.extend({
4956
- attachedAgentCount: external_exports.number().int().nonnegative(),
4957
- editable: external_exports.boolean(),
4958
- editableReason: external_exports.string().nullable(),
4959
- sourceLabel: external_exports.string().nullable(),
4960
- sourceBadge: companySkillSourceBadgeSchema,
4961
- catalogKind: external_exports.enum(["bundled", "optional"]).nullable(),
4962
- originHash: external_exports.string().nullable(),
4963
- packageName: external_exports.string().nullable(),
4964
- packageVersion: external_exports.string().nullable()
5168
+ var createSecretBindingSchema = secretBindingTargetSchema.extend({
5169
+ secretId: external_exports.string().uuid(),
5170
+ versionSelector: secretVersionSelectorSchema.default("latest"),
5171
+ required: external_exports.boolean().default(true),
5172
+ label: external_exports.string().optional().nullable()
4965
5173
  });
4966
- var companySkillUsageAgentSchema = external_exports.object({
4967
- id: external_exports.string().uuid(),
4968
- name: external_exports.string().min(1),
4969
- urlKey: external_exports.string().min(1),
4970
- adapterType: external_exports.string().min(1),
4971
- desired: external_exports.boolean(),
4972
- actualState: external_exports.string().nullable().describe("Runtime adapter skill state when explicitly fetched; company skill detail reads return null without probing agent runtimes.")
5174
+ var createUserSecretDefinitionSchema = external_exports.object({
5175
+ key: secretKeySchema,
5176
+ name: external_exports.string().trim().min(1).max(160),
5177
+ description: external_exports.string().trim().max(500).optional().nullable(),
5178
+ status: creatableSecretStatusSchema.optional(),
5179
+ provider: external_exports.enum(SECRET_PROVIDERS).optional(),
5180
+ providerConfigId: external_exports.string().uuid().optional().nullable(),
5181
+ managedMode: external_exports.enum(SECRET_MANAGED_MODES).optional(),
5182
+ providerMetadata: external_exports.record(external_exports.string(), external_exports.unknown()).optional().nullable(),
5183
+ usageGuidance: external_exports.string().trim().max(1e3).optional().nullable()
4973
5184
  });
4974
- var companySkillDetailSchema = companySkillSchema.extend({
4975
- attachedAgentCount: external_exports.number().int().nonnegative(),
4976
- usedByAgents: external_exports.array(companySkillUsageAgentSchema).default([]),
4977
- editable: external_exports.boolean(),
4978
- editableReason: external_exports.string().nullable(),
4979
- sourceLabel: external_exports.string().nullable(),
4980
- sourceBadge: companySkillSourceBadgeSchema
5185
+ var updateUserSecretDefinitionSchema = external_exports.object({
5186
+ name: external_exports.string().trim().min(1).max(160).optional(),
5187
+ description: external_exports.string().trim().max(500).optional().nullable(),
5188
+ status: external_exports.enum(SECRET_STATUSES).optional(),
5189
+ providerConfigId: external_exports.string().uuid().optional().nullable(),
5190
+ providerMetadata: external_exports.record(external_exports.string(), external_exports.unknown()).optional().nullable(),
5191
+ usageGuidance: external_exports.string().trim().max(1e3).optional().nullable()
4981
5192
  });
4982
- var companySkillUpdateStatusSchema = external_exports.object({
4983
- supported: external_exports.boolean(),
4984
- reason: external_exports.string().nullable(),
4985
- trackingRef: external_exports.string().nullable(),
4986
- currentRef: external_exports.string().nullable(),
4987
- latestRef: external_exports.string().nullable(),
4988
- hasUpdate: external_exports.boolean(),
4989
- installedHash: external_exports.string().nullable(),
4990
- originHash: external_exports.string().nullable(),
4991
- userModifiedAt: external_exports.string().nullable(),
4992
- updateHoldReason: external_exports.enum([
4993
- "local_modifications",
4994
- "audit_hard_stop",
4995
- "origin_unavailable",
4996
- "compatibility_invalid",
4997
- "operator_hold"
4998
- ]).nullable(),
4999
- auditVerdict: external_exports.enum(["pass", "warning", "fail"]).nullable(),
5000
- auditCodes: external_exports.array(external_exports.string())
5193
+ var createUserSecretValueSchema = external_exports.object({
5194
+ definitionKey: secretKeySchema.optional(),
5195
+ definitionId: external_exports.string().uuid().optional(),
5196
+ value: external_exports.string().min(1).optional().nullable(),
5197
+ externalRef: external_exports.string().optional().nullable(),
5198
+ providerVersionRef: external_exports.string().optional().nullable(),
5199
+ providerConfigId: external_exports.string().uuid().optional().nullable()
5200
+ }).superRefine((value, ctx) => {
5201
+ if (!value.definitionKey && !value.definitionId) {
5202
+ ctx.addIssue({
5203
+ code: external_exports.ZodIssueCode.custom,
5204
+ path: ["definitionId"],
5205
+ message: "User secret value requires definitionId or definitionKey"
5206
+ });
5207
+ }
5208
+ if (!value.value?.trim() && !value.externalRef?.trim()) {
5209
+ ctx.addIssue({
5210
+ code: external_exports.ZodIssueCode.custom,
5211
+ path: ["value"],
5212
+ message: "User secret value requires value or externalRef"
5213
+ });
5214
+ }
5215
+ });
5216
+ var updateUserSecretValueSchema = external_exports.object({
5217
+ status: external_exports.enum(SECRET_STATUSES).optional(),
5218
+ value: external_exports.string().min(1).optional().nullable(),
5219
+ externalRef: external_exports.string().min(1).optional().nullable(),
5220
+ providerVersionRef: external_exports.string().min(1).optional().nullable(),
5221
+ providerConfigId: external_exports.string().uuid().optional().nullable()
5222
+ });
5223
+ var rotateUserSecretValueSchema = external_exports.object({
5224
+ value: external_exports.string().min(1).optional().nullable(),
5225
+ externalRef: external_exports.string().min(1).optional().nullable(),
5226
+ providerVersionRef: external_exports.string().min(1).optional().nullable(),
5227
+ providerConfigId: external_exports.string().uuid().optional().nullable()
5228
+ }).superRefine(requireSecretRotationInput);
5229
+ var createUserSecretDeclarationSchema = secretBindingTargetSchema.extend({
5230
+ definitionKey: secretKeySchema,
5231
+ envKey: external_exports.string().trim().min(1),
5232
+ versionSelector: secretVersionSelectorSchema.default("latest"),
5233
+ required: external_exports.boolean().default(true),
5234
+ allowMissingOverride: external_exports.boolean().default(false),
5235
+ label: external_exports.string().optional().nullable()
5236
+ });
5237
+ var safeShortText = external_exports.string().trim().min(1).max(160);
5238
+ var optionalSafeShortText = safeShortText.optional().nullable();
5239
+ var deniedProviderConfigKeyPattern = /^(access[-_]?key([-_]?id)?|secret[-_]?access[-_]?key|secret[-_]?key|token|password|passwd|credential|credentials|private[-_]?key|pem|jwt|session[-_]?token|service[-_]?account([-_]?json)?|client[-_]?secret|secret[-_]?id|unseal[-_]?key|recovery[-_]?key|key[-_]?file([-_]?path)?|token[-_]?file([-_]?path)?)$/i;
5240
+ function rejectSensitiveProviderConfigKeys(value, ctx) {
5241
+ if (!value || typeof value !== "object" || Array.isArray(value))
5242
+ return;
5243
+ for (const key of Object.keys(value)) {
5244
+ if (!deniedProviderConfigKeyPattern.test(key))
5245
+ continue;
5246
+ ctx.addIssue({
5247
+ code: external_exports.ZodIssueCode.custom,
5248
+ path: ["config", key],
5249
+ message: `Provider vault config cannot persist sensitive field: ${key}`
5250
+ });
5251
+ }
5252
+ }
5253
+ var localEncryptedProviderConfigSchema = external_exports.object({
5254
+ backupReminderAcknowledged: external_exports.boolean().optional()
5255
+ }).strict();
5256
+ var awsSecretsManagerProviderConfigSchema = external_exports.object({
5257
+ region: external_exports.string().trim().regex(/^[a-z]{2}(?:-gov)?-[a-z]+-\d+$/, "Invalid AWS region"),
5258
+ namespace: optionalSafeShortText,
5259
+ secretNamePrefix: optionalSafeShortText,
5260
+ kmsKeyId: external_exports.string().trim().min(1).max(512).optional().nullable(),
5261
+ ownerTag: optionalSafeShortText,
5262
+ environmentTag: optionalSafeShortText
5263
+ }).strict();
5264
+ var gcpSecretManagerProviderConfigSchema = external_exports.object({
5265
+ projectId: external_exports.string().trim().min(1).max(128).regex(/^[a-z][a-z0-9-]{4,127}$/).optional().nullable(),
5266
+ location: optionalSafeShortText,
5267
+ namespace: optionalSafeShortText,
5268
+ secretNamePrefix: optionalSafeShortText
5269
+ }).strict();
5270
+ var vaultAddressSchema = external_exports.preprocess((value) => typeof value === "string" ? value.trim() : value, external_exports.string().url().superRefine((value, ctx) => {
5271
+ let url;
5272
+ try {
5273
+ url = new URL(value);
5274
+ } catch {
5275
+ return;
5276
+ }
5277
+ const hasPath = url.pathname !== "" && url.pathname !== "/";
5278
+ if (url.protocol !== "http:" && url.protocol !== "https:" || url.username || url.password || url.search || url.hash || hasPath) {
5279
+ ctx.addIssue({
5280
+ code: external_exports.ZodIssueCode.custom,
5281
+ message: "Vault address must be an origin-only HTTP(S) URL without credentials, path, query, or fragment"
5282
+ });
5283
+ }
5284
+ }).transform((value) => new URL(value).origin));
5285
+ function rejectUnsafeVaultAddress(value, ctx) {
5286
+ if (value === void 0 || value === null)
5287
+ return;
5288
+ const parsed = vaultAddressSchema.safeParse(value);
5289
+ if (parsed.success)
5290
+ return;
5291
+ for (const issue of parsed.error.issues) {
5292
+ ctx.addIssue({
5293
+ ...issue,
5294
+ path: ["config", "address", ...issue.path]
5295
+ });
5296
+ }
5297
+ }
5298
+ var vaultProviderConfigSchema = external_exports.object({
5299
+ address: vaultAddressSchema.optional().nullable(),
5300
+ namespace: optionalSafeShortText,
5301
+ mountPath: optionalSafeShortText,
5302
+ secretPathPrefix: optionalSafeShortText
5303
+ }).strict();
5304
+ var secretProviderConfigPayloadSchema = external_exports.discriminatedUnion("provider", [
5305
+ external_exports.object({ provider: external_exports.literal("local_encrypted"), config: localEncryptedProviderConfigSchema }),
5306
+ external_exports.object({ provider: external_exports.literal("aws_secrets_manager"), config: awsSecretsManagerProviderConfigSchema }),
5307
+ external_exports.object({ provider: external_exports.literal("gcp_secret_manager"), config: gcpSecretManagerProviderConfigSchema }),
5308
+ external_exports.object({ provider: external_exports.literal("vault"), config: vaultProviderConfigSchema })
5309
+ ]);
5310
+ var createSecretProviderConfigSchema = external_exports.object({
5311
+ provider: external_exports.enum(SECRET_PROVIDERS),
5312
+ displayName: external_exports.string().trim().min(1).max(120),
5313
+ status: external_exports.enum(SECRET_PROVIDER_CONFIG_STATUSES).optional(),
5314
+ isDefault: external_exports.boolean().optional(),
5315
+ config: external_exports.record(external_exports.string(), external_exports.unknown()).default({})
5316
+ }).superRefine((value, ctx) => {
5317
+ rejectSensitiveProviderConfigKeys(value.config, ctx);
5318
+ const parsed = secretProviderConfigPayloadSchema.safeParse({
5319
+ provider: value.provider,
5320
+ config: value.config
5321
+ });
5322
+ if (!parsed.success) {
5323
+ for (const issue of parsed.error.issues) {
5324
+ ctx.addIssue({
5325
+ ...issue,
5326
+ path: issue.path[0] === "config" ? issue.path : ["config", ...issue.path]
5327
+ });
5328
+ }
5329
+ }
5330
+ const status = value.status ?? (["gcp_secret_manager", "vault"].includes(value.provider) ? "coming_soon" : "ready");
5331
+ if ((value.provider === "gcp_secret_manager" || value.provider === "vault") && status !== "coming_soon" && status !== "disabled") {
5332
+ ctx.addIssue({
5333
+ code: external_exports.ZodIssueCode.custom,
5334
+ path: ["status"],
5335
+ message: `${value.provider} provider vaults are locked while coming soon`
5336
+ });
5337
+ }
5338
+ if ((status === "coming_soon" || status === "disabled") && value.isDefault) {
5339
+ ctx.addIssue({
5340
+ code: external_exports.ZodIssueCode.custom,
5341
+ path: ["isDefault"],
5342
+ message: "Only ready or warning provider vaults can be default"
5343
+ });
5344
+ }
5345
+ });
5346
+ var updateSecretProviderConfigSchema = external_exports.object({
5347
+ displayName: external_exports.string().trim().min(1).max(120).optional(),
5348
+ status: external_exports.enum(SECRET_PROVIDER_CONFIG_STATUSES).optional(),
5349
+ isDefault: external_exports.boolean().optional(),
5350
+ config: external_exports.record(external_exports.string(), external_exports.unknown()).optional()
5351
+ }).superRefine((value, ctx) => {
5352
+ if (value.config !== void 0) {
5353
+ rejectSensitiveProviderConfigKeys(value.config, ctx);
5354
+ rejectUnsafeVaultAddress(value.config.address, ctx);
5355
+ }
5356
+ if ((value.status === "coming_soon" || value.status === "disabled") && value.isDefault) {
5357
+ ctx.addIssue({
5358
+ code: external_exports.ZodIssueCode.custom,
5359
+ path: ["isDefault"],
5360
+ message: "Only ready or warning provider vaults can be default"
5361
+ });
5362
+ }
5363
+ });
5364
+ var remoteSecretImportPreviewSchema = external_exports.object({
5365
+ providerConfigId: external_exports.string().uuid(),
5366
+ query: external_exports.string().trim().max(200).optional().nullable(),
5367
+ nextToken: external_exports.string().trim().min(1).max(4096).optional().nullable(),
5368
+ pageSize: external_exports.number().int().min(1).max(100).optional()
5369
+ });
5370
+ var secretProviderConfigDiscoveryPreviewSchema = external_exports.object({
5371
+ provider: external_exports.enum(SECRET_PROVIDERS),
5372
+ config: external_exports.record(external_exports.unknown()).default({}),
5373
+ query: external_exports.string().trim().max(200).optional().nullable(),
5374
+ nextToken: external_exports.string().trim().min(1).max(4096).optional().nullable(),
5375
+ pageSize: external_exports.number().int().min(1).max(100).optional()
5376
+ }).superRefine((value, ctx) => {
5377
+ rejectSensitiveProviderConfigKeys(value.config, ctx);
5378
+ const parsed = secretProviderConfigPayloadSchema.safeParse({
5379
+ provider: value.provider,
5380
+ config: value.config
5381
+ });
5382
+ if (!parsed.success) {
5383
+ for (const issue of parsed.error.issues) {
5384
+ ctx.addIssue({
5385
+ ...issue,
5386
+ path: issue.path[0] === "config" ? issue.path : ["config", ...issue.path]
5387
+ });
5388
+ }
5389
+ }
5390
+ });
5391
+ var remoteSecretImportSelectionSchema = external_exports.object({
5392
+ externalRef: external_exports.string().trim().min(1).max(2048),
5393
+ name: external_exports.string().trim().min(1).max(160).optional().nullable(),
5394
+ key: external_exports.string().trim().min(1).max(120).regex(/^[a-zA-Z0-9_.-]+$/).optional().nullable(),
5395
+ description: external_exports.string().trim().max(500).optional().nullable(),
5396
+ providerVersionRef: external_exports.string().trim().min(1).max(512).optional().nullable(),
5397
+ providerMetadata: external_exports.record(external_exports.string(), external_exports.unknown()).optional().nullable()
5398
+ });
5399
+ var remoteSecretImportSchema = external_exports.object({
5400
+ providerConfigId: external_exports.string().uuid(),
5401
+ secrets: external_exports.array(remoteSecretImportSelectionSchema).min(1).max(100)
5402
+ });
5403
+
5404
+ // node_modules/.pnpm/@paperclipai+shared@2026.707.0/node_modules/@paperclipai/shared/dist/validators/environment.js
5405
+ var environmentDriverSchema = external_exports.enum(ENVIRONMENT_DRIVERS);
5406
+ var environmentStatusSchema = external_exports.enum(ENVIRONMENT_STATUSES);
5407
+ var environmentLeaseStatusSchema = external_exports.enum(ENVIRONMENT_LEASE_STATUSES);
5408
+ var environmentLeaseCleanupStatusSchema = external_exports.enum(ENVIRONMENT_LEASE_CLEANUP_STATUSES);
5409
+ var environmentFields = {
5410
+ name: external_exports.string().min(1),
5411
+ description: external_exports.string().optional().nullable(),
5412
+ driver: environmentDriverSchema,
5413
+ status: environmentStatusSchema.optional().default("active"),
5414
+ config: external_exports.record(external_exports.string(), external_exports.unknown()).optional().default({}),
5415
+ envVars: envConfigSchema.optional().default({}),
5416
+ metadata: external_exports.record(external_exports.string(), external_exports.unknown()).optional().nullable()
5417
+ };
5418
+ var createEnvironmentSchema = external_exports.object(environmentFields).strict();
5419
+ var updateEnvironmentSchema = external_exports.object({
5420
+ name: external_exports.string().min(1).optional(),
5421
+ description: external_exports.string().optional().nullable(),
5422
+ driver: environmentDriverSchema.optional(),
5423
+ status: environmentStatusSchema.optional(),
5424
+ config: external_exports.record(external_exports.string(), external_exports.unknown()).optional(),
5425
+ envVars: envConfigSchema.optional(),
5426
+ metadata: external_exports.record(external_exports.string(), external_exports.unknown()).optional().nullable()
5427
+ }).strict();
5428
+ var probeEnvironmentConfigSchema = external_exports.object({
5429
+ name: external_exports.string().min(1).optional(),
5430
+ description: external_exports.string().optional().nullable(),
5431
+ driver: environmentDriverSchema,
5432
+ config: external_exports.record(external_exports.string(), external_exports.unknown()).optional().default({}),
5433
+ envVars: envConfigSchema.optional().default({}),
5434
+ metadata: external_exports.record(external_exports.string(), external_exports.unknown()).optional().nullable()
5435
+ }).strict();
5436
+
5437
+ // node_modules/.pnpm/@paperclipai+shared@2026.707.0/node_modules/@paperclipai/shared/dist/validators/environment-custom-images.js
5438
+ var isoDateTime = external_exports.union([external_exports.date(), external_exports.string().datetime()]);
5439
+ var providerKeySchema = external_exports.string().min(1).max(200);
5440
+ var optionalRecordSchema = external_exports.record(external_exports.string(), external_exports.unknown()).optional().nullable();
5441
+ var environmentCustomImageTemplateKindSchema = external_exports.enum(ENVIRONMENT_CUSTOM_IMAGE_TEMPLATE_KINDS);
5442
+ var environmentCustomImageTemplateStatusSchema = external_exports.enum(ENVIRONMENT_CUSTOM_IMAGE_TEMPLATE_STATUSES);
5443
+ var environmentCustomImageSetupSessionStatusSchema = external_exports.enum(ENVIRONMENT_CUSTOM_IMAGE_SETUP_SESSION_STATUSES);
5444
+ var environmentCustomImageSetupConnectionTypeSchema = external_exports.enum(ENVIRONMENT_CUSTOM_IMAGE_SETUP_CONNECTION_TYPES);
5445
+ var environmentCustomImageSetupConnectionSummarySchema = external_exports.object({
5446
+ type: environmentCustomImageSetupConnectionTypeSchema,
5447
+ username: external_exports.string().min(1).max(200).optional().nullable(),
5448
+ hostRedacted: external_exports.literal(true).optional().default(true),
5449
+ portRedacted: external_exports.literal(true).optional().default(true),
5450
+ label: external_exports.string().min(1).max(200).optional().nullable(),
5451
+ instructions: external_exports.string().min(1).max(1e3).optional().nullable()
5452
+ }).strict();
5453
+ var environmentCustomImageTemplateSchema = external_exports.object({
5454
+ id: external_exports.string().uuid(),
5455
+ environmentId: external_exports.string().uuid(),
5456
+ provider: providerKeySchema,
5457
+ templateKind: environmentCustomImageTemplateKindSchema,
5458
+ templateRef: external_exports.string().min(1).nullable(),
5459
+ sourceTemplateRef: external_exports.string().min(1).nullable(),
5460
+ sourceEnvironmentConfigFingerprint: external_exports.string().min(1).nullable(),
5461
+ status: environmentCustomImageTemplateStatusSchema,
5462
+ createdByUserId: external_exports.string().min(1).nullable(),
5463
+ createdByAgentId: external_exports.string().uuid().nullable(),
5464
+ capturedAt: isoDateTime.nullable(),
5465
+ lastUsedAt: isoDateTime.nullable(),
5466
+ supersededByTemplateId: external_exports.string().uuid().nullable(),
5467
+ metadata: optionalRecordSchema,
5468
+ createdAt: isoDateTime,
5469
+ updatedAt: isoDateTime
5470
+ }).strict();
5471
+ var environmentCustomImageSetupSessionSchema = external_exports.object({
5472
+ id: external_exports.string().uuid(),
5473
+ environmentId: external_exports.string().uuid(),
5474
+ templateId: external_exports.string().uuid().nullable(),
5475
+ promotedTemplateId: external_exports.string().uuid().nullable(),
5476
+ provider: providerKeySchema,
5477
+ providerLeaseId: external_exports.string().min(1).nullable(),
5478
+ environmentLeaseId: external_exports.string().uuid().nullable(),
5479
+ status: environmentCustomImageSetupSessionStatusSchema,
5480
+ startedByUserId: external_exports.string().min(1).nullable(),
5481
+ startedByAgentId: external_exports.string().uuid().nullable(),
5482
+ baseTemplateRef: external_exports.string().min(1).nullable(),
5483
+ expiresAt: isoDateTime.nullable(),
5484
+ finishedAt: isoDateTime.nullable(),
5485
+ failureReason: external_exports.string().min(1).nullable(),
5486
+ connectionSummary: environmentCustomImageSetupConnectionSummarySchema.nullable(),
5487
+ connectionSecretRef: external_exports.string().min(1).nullable(),
5488
+ metadata: optionalRecordSchema,
5489
+ createdAt: isoDateTime,
5490
+ updatedAt: isoDateTime
5491
+ }).strict();
5492
+ var startEnvironmentCustomImageSetupSessionSchema = external_exports.object({
5493
+ templateId: external_exports.string().uuid().optional().nullable(),
5494
+ ttlSeconds: external_exports.number().int().min(60).max(24 * 60 * 60).optional()
5495
+ }).strict();
5496
+ var finishEnvironmentCustomImageSetupSessionSchema = external_exports.object({
5497
+ metadata: external_exports.record(external_exports.string(), external_exports.unknown()).optional()
5498
+ }).strict();
5499
+ var cancelEnvironmentCustomImageSetupSessionSchema = external_exports.object({
5500
+ reason: external_exports.string().min(1).max(1e3).optional()
5501
+ }).strict();
5502
+ var createEnvironmentCustomImageTerminalSessionTokenSchema = external_exports.object({}).strict().default({});
5503
+ var environmentCustomImageTerminalSessionTokenSchema = external_exports.object({
5504
+ id: external_exports.string().min(1),
5505
+ token: external_exports.string().min(32),
5506
+ expiresAt: isoDateTime,
5507
+ setupSessionId: external_exports.string().min(1),
5508
+ environmentId: external_exports.string().min(1),
5509
+ connectionType: external_exports.literal("ssh"),
5510
+ websocketPath: external_exports.string().min(1)
5511
+ }).strict();
5512
+
5513
+ // node_modules/.pnpm/@paperclipai+shared@2026.707.0/node_modules/@paperclipai/shared/dist/validators/external-object.js
5514
+ var externalObjectStatusCategorySchema = external_exports.enum(EXTERNAL_OBJECT_STATUS_CATEGORIES);
5515
+ var externalObjectStatusToneSchema = external_exports.enum(EXTERNAL_OBJECT_STATUS_TONES);
5516
+ var externalObjectLivenessStateSchema = external_exports.enum(EXTERNAL_OBJECT_LIVENESS_STATES);
5517
+ var externalObjectMentionSourceKindSchema = external_exports.enum(EXTERNAL_OBJECT_MENTION_SOURCE_KINDS);
5518
+ var externalObjectMentionConfidenceSchema = external_exports.enum(EXTERNAL_OBJECT_MENTION_CONFIDENCES);
5519
+ var externalObjectProviderKeySchema = external_exports.string().trim().min(1).max(80).regex(/^[a-z][a-z0-9_.-]*$/);
5520
+ var externalObjectTypeSchema = external_exports.string().trim().min(1).max(80).regex(/^[a-z][a-z0-9_]*$/);
5521
+ var externalObjectCanonicalIdentitySchema = external_exports.object({
5522
+ scheme: external_exports.enum(["http", "https"]),
5523
+ host: external_exports.string().trim().min(1),
5524
+ path: external_exports.string().trim().min(1),
5525
+ queryParamHashes: external_exports.record(external_exports.string().regex(/^[a-f0-9]{64}$/)).optional()
5526
+ }).strict();
5527
+ var externalObjectMentionSourceSchema = external_exports.object({
5528
+ sourceKind: externalObjectMentionSourceKindSchema,
5529
+ documentKey: external_exports.string().trim().min(1).optional().nullable(),
5530
+ propertyKey: external_exports.string().trim().min(1).optional().nullable()
5531
+ }).strict();
5532
+
5533
+ // node_modules/.pnpm/@paperclipai+shared@2026.707.0/node_modules/@paperclipai/shared/dist/validators/company-skill.js
5534
+ var companySkillSourceTypeSchema = external_exports.enum(["local_path", "github", "url", "catalog", "skills_sh"]);
5535
+ var companySkillTrustLevelSchema = external_exports.enum(["markdown_only", "assets", "scripts_executables"]);
5536
+ var companySkillCompatibilitySchema = external_exports.enum(["compatible", "unknown", "invalid"]);
5537
+ var companySkillSourceBadgeSchema = external_exports.enum(["paperclip", "github", "local", "url", "catalog", "skills_sh"]);
5538
+ var companySkillSharingScopeSchema = external_exports.enum(["private", "company", "public_link"]);
5539
+ var companySkillListSortSchema = external_exports.enum(["alphabetical", "recent", "installs", "stars", "agents", "forks"]);
5540
+ var companySkillFileInventoryEntrySchema = external_exports.object({
5541
+ path: external_exports.string().min(1),
5542
+ kind: external_exports.enum(["skill", "markdown", "reference", "script", "asset", "other"])
5543
+ });
5544
+ var companySkillVersionFileInventoryEntrySchema = companySkillFileInventoryEntrySchema.extend({
5545
+ content: external_exports.string()
5546
+ });
5547
+ var companySkillSchema = external_exports.object({
5548
+ id: external_exports.string().uuid(),
5549
+ companyId: external_exports.string().uuid(),
5550
+ key: external_exports.string().min(1),
5551
+ slug: external_exports.string().min(1),
5552
+ name: external_exports.string().min(1),
5553
+ description: external_exports.string().nullable(),
5554
+ markdown: external_exports.string(),
5555
+ sourceType: companySkillSourceTypeSchema,
5556
+ sourceLocator: external_exports.string().nullable(),
5557
+ sourceRef: external_exports.string().nullable(),
5558
+ trustLevel: companySkillTrustLevelSchema,
5559
+ compatibility: companySkillCompatibilitySchema,
5560
+ fileInventory: external_exports.array(companySkillFileInventoryEntrySchema).default([]),
5561
+ iconUrl: external_exports.string().nullable(),
5562
+ color: external_exports.string().nullable(),
5563
+ tagline: external_exports.string().nullable(),
5564
+ authorName: external_exports.string().nullable(),
5565
+ homepageUrl: external_exports.string().nullable(),
5566
+ categories: external_exports.array(external_exports.string().min(1)).default([]),
5567
+ sharingScope: companySkillSharingScopeSchema,
5568
+ publicShareToken: external_exports.string().nullable(),
5569
+ forkedFromSkillId: external_exports.string().uuid().nullable(),
5570
+ forkedFromCompanyId: external_exports.string().uuid().nullable(),
5571
+ starCount: external_exports.number().int().nonnegative(),
5572
+ installCount: external_exports.number().int().nonnegative(),
5573
+ forkCount: external_exports.number().int().nonnegative(),
5574
+ currentVersionId: external_exports.string().uuid().nullable(),
5575
+ metadata: external_exports.record(external_exports.string(), external_exports.unknown()).nullable(),
5576
+ createdAt: external_exports.coerce.date(),
5577
+ updatedAt: external_exports.coerce.date()
5578
+ });
5579
+ var companySkillListItemSchema = companySkillSchema.extend({
5580
+ attachedAgentCount: external_exports.number().int().nonnegative(),
5581
+ editable: external_exports.boolean(),
5582
+ editableReason: external_exports.string().nullable(),
5583
+ sourceLabel: external_exports.string().nullable(),
5584
+ sourceBadge: companySkillSourceBadgeSchema,
5585
+ catalogKind: external_exports.enum(["bundled", "optional"]).nullable(),
5586
+ originHash: external_exports.string().nullable(),
5587
+ packageName: external_exports.string().nullable(),
5588
+ packageVersion: external_exports.string().nullable()
5589
+ });
5590
+ var companySkillUsageAgentSchema = external_exports.object({
5591
+ id: external_exports.string().uuid(),
5592
+ name: external_exports.string().min(1),
5593
+ urlKey: external_exports.string().min(1),
5594
+ adapterType: external_exports.string().min(1),
5595
+ desired: external_exports.boolean(),
5596
+ actualState: external_exports.string().nullable().describe("Runtime adapter skill state when explicitly fetched; company skill detail reads return null without probing agent runtimes."),
5597
+ versionId: external_exports.string().uuid().nullable()
5598
+ });
5599
+ var companySkillListQuerySchema = external_exports.object({
5600
+ q: external_exports.string().min(1).optional(),
5601
+ sort: companySkillListSortSchema.optional(),
5602
+ categories: external_exports.array(external_exports.string().min(1)).optional(),
5603
+ scope: companySkillSharingScopeSchema.optional()
5604
+ });
5605
+ var companySkillCategoryCountSchema = external_exports.object({
5606
+ slug: external_exports.string().min(1),
5607
+ count: external_exports.number().int().nonnegative()
5608
+ });
5609
+ var companySkillVersionSchema = external_exports.object({
5610
+ id: external_exports.string().uuid(),
5611
+ companyId: external_exports.string().uuid(),
5612
+ companySkillId: external_exports.string().uuid(),
5613
+ revisionNumber: external_exports.number().int().positive(),
5614
+ label: external_exports.string().nullable(),
5615
+ fileInventory: external_exports.array(companySkillVersionFileInventoryEntrySchema).default([]),
5616
+ authorAgentId: external_exports.string().uuid().nullable(),
5617
+ authorUserId: external_exports.string().nullable(),
5618
+ createdAt: external_exports.coerce.date()
5619
+ });
5620
+ var companySkillDetailSchema = companySkillSchema.extend({
5621
+ attachedAgentCount: external_exports.number().int().nonnegative(),
5622
+ usedByAgents: external_exports.array(companySkillUsageAgentSchema).default([]),
5623
+ editable: external_exports.boolean(),
5624
+ editableReason: external_exports.string().nullable(),
5625
+ sourceLabel: external_exports.string().nullable(),
5626
+ sourceBadge: companySkillSourceBadgeSchema,
5627
+ currentVersion: companySkillVersionSchema.nullable(),
5628
+ starredByCurrentActor: external_exports.boolean()
5629
+ });
5630
+ var companySkillVersionCreateSchema = external_exports.object({
5631
+ label: external_exports.string().trim().min(1).nullable().optional()
5632
+ }).default({});
5633
+ var companySkillStarResultSchema = external_exports.object({
5634
+ skillId: external_exports.string().uuid(),
5635
+ starred: external_exports.boolean(),
5636
+ starCount: external_exports.number().int().nonnegative()
5637
+ });
5638
+ var companySkillCommentSchema = external_exports.object({
5639
+ id: external_exports.string().uuid(),
5640
+ companyId: external_exports.string().uuid(),
5641
+ companySkillId: external_exports.string().uuid(),
5642
+ parentCommentId: external_exports.string().uuid().nullable(),
5643
+ authorAgentId: external_exports.string().uuid().nullable(),
5644
+ authorUserId: external_exports.string().nullable(),
5645
+ body: external_exports.string(),
5646
+ deletedAt: external_exports.coerce.date().nullable(),
5647
+ createdAt: external_exports.coerce.date(),
5648
+ updatedAt: external_exports.coerce.date()
5649
+ });
5650
+ var companySkillCommentCreateSchema = external_exports.object({
5651
+ body: external_exports.string().min(1),
5652
+ parentCommentId: external_exports.string().uuid().nullable().optional()
5653
+ });
5654
+ var companySkillCommentUpdateSchema = external_exports.object({
5655
+ body: external_exports.string().min(1)
5656
+ });
5657
+ var companySkillForkSchema = external_exports.object({
5658
+ name: external_exports.string().min(1).nullable().optional(),
5659
+ slug: external_exports.string().min(1).nullable().optional(),
5660
+ sharingScope: companySkillSharingScopeSchema.optional()
5661
+ }).default({});
5662
+ var companySkillUpdateSchema = external_exports.object({
5663
+ description: external_exports.string().nullable().optional(),
5664
+ iconUrl: external_exports.string().nullable().optional(),
5665
+ color: external_exports.string().nullable().optional(),
5666
+ tagline: external_exports.string().max(120).nullable().optional(),
5667
+ authorName: external_exports.string().nullable().optional(),
5668
+ homepageUrl: external_exports.string().nullable().optional(),
5669
+ categories: external_exports.array(external_exports.string().min(1)).optional(),
5670
+ sharingScope: companySkillSharingScopeSchema.optional()
5671
+ }).default({});
5672
+ var companySkillUpdateStatusSchema = external_exports.object({
5673
+ supported: external_exports.boolean(),
5674
+ reason: external_exports.string().nullable(),
5675
+ trackingRef: external_exports.string().nullable(),
5676
+ currentRef: external_exports.string().nullable(),
5677
+ latestRef: external_exports.string().nullable(),
5678
+ hasUpdate: external_exports.boolean(),
5679
+ installedHash: external_exports.string().nullable(),
5680
+ originHash: external_exports.string().nullable(),
5681
+ userModifiedAt: external_exports.string().nullable(),
5682
+ updateHoldReason: external_exports.enum([
5683
+ "local_modifications",
5684
+ "audit_hard_stop",
5685
+ "origin_unavailable",
5686
+ "compatibility_invalid",
5687
+ "operator_hold"
5688
+ ]).nullable(),
5689
+ auditVerdict: external_exports.enum(["pass", "warning", "fail"]).nullable(),
5690
+ auditCodes: external_exports.array(external_exports.string())
5001
5691
  });
5002
5692
  var companySkillAuditFindingSchema = external_exports.object({
5003
5693
  code: external_exports.string().min(1),
@@ -5063,7 +5753,15 @@ var companySkillCreateSchema = external_exports.object({
5063
5753
  name: external_exports.string().min(1),
5064
5754
  slug: external_exports.string().min(1).nullable().optional(),
5065
5755
  description: external_exports.string().nullable().optional(),
5066
- markdown: external_exports.string().nullable().optional()
5756
+ markdown: external_exports.string().nullable().optional(),
5757
+ iconUrl: external_exports.string().nullable().optional(),
5758
+ color: external_exports.string().nullable().optional(),
5759
+ tagline: external_exports.string().max(120).nullable().optional(),
5760
+ authorName: external_exports.string().nullable().optional(),
5761
+ homepageUrl: external_exports.string().nullable().optional(),
5762
+ categories: external_exports.array(external_exports.string().min(1)).optional(),
5763
+ sharingScope: companySkillSharingScopeSchema.optional(),
5764
+ forkedFromSkillId: external_exports.string().uuid().nullable().optional()
5067
5765
  });
5068
5766
  var companySkillFileDetailSchema = external_exports.object({
5069
5767
  skillId: external_exports.string().uuid(),
@@ -5085,6 +5783,17 @@ var catalogSkillFileSchema = external_exports.object({
5085
5783
  sizeBytes: external_exports.number().int().nonnegative(),
5086
5784
  sha256: external_exports.string().min(1)
5087
5785
  });
5786
+ var catalogSkillGitHubSourceSchema = external_exports.object({
5787
+ type: external_exports.literal("github"),
5788
+ hostname: external_exports.string().min(1),
5789
+ owner: external_exports.string().min(1),
5790
+ repo: external_exports.string().min(1),
5791
+ ref: external_exports.string().min(1),
5792
+ commit: external_exports.string().regex(/^[0-9a-f]{40}$/i),
5793
+ path: external_exports.string(),
5794
+ url: external_exports.string().url()
5795
+ });
5796
+ var catalogSkillSourceSchema = catalogSkillGitHubSourceSchema;
5088
5797
  var catalogSkillSchema = external_exports.object({
5089
5798
  id: external_exports.string().min(1),
5090
5799
  key: external_exports.string().min(1),
@@ -5103,6 +5812,7 @@ var catalogSkillSchema = external_exports.object({
5103
5812
  tags: external_exports.array(external_exports.string()),
5104
5813
  files: external_exports.array(catalogSkillFileSchema),
5105
5814
  contentHash: external_exports.string().min(1),
5815
+ source: catalogSkillSourceSchema.optional(),
5106
5816
  packageName: external_exports.string().min(1).optional(),
5107
5817
  packageVersion: external_exports.string().min(1).optional()
5108
5818
  });
@@ -5131,61 +5841,57 @@ var companySkillInstallCatalogResultSchema = external_exports.object({
5131
5841
  warnings: external_exports.array(external_exports.string())
5132
5842
  });
5133
5843
 
5134
- // node_modules/.pnpm/@paperclipai+shared@2026.529.0/node_modules/@paperclipai/shared/dist/validators/adapter-skills.js
5135
- var agentSkillStateSchema = external_exports.enum([
5136
- "available",
5137
- "configured",
5138
- "installed",
5139
- "missing",
5140
- "stale",
5141
- "external"
5142
- ]);
5143
- var agentSkillOriginSchema = external_exports.enum([
5144
- "company_managed",
5145
- "paperclip_required",
5146
- "user_installed",
5147
- "external_unknown"
5148
- ]);
5149
- var agentSkillSyncModeSchema = external_exports.enum([
5150
- "unsupported",
5151
- "persistent",
5152
- "ephemeral"
5153
- ]);
5154
- var agentSkillEntrySchema = external_exports.object({
5155
- key: external_exports.string().min(1),
5156
- runtimeName: external_exports.string().min(1).nullable(),
5157
- desired: external_exports.boolean(),
5158
- managed: external_exports.boolean(),
5159
- required: external_exports.boolean().optional(),
5160
- requiredReason: external_exports.string().nullable().optional(),
5161
- state: agentSkillStateSchema,
5162
- origin: agentSkillOriginSchema.optional(),
5163
- originLabel: external_exports.string().nullable().optional(),
5164
- locationLabel: external_exports.string().nullable().optional(),
5165
- readOnly: external_exports.boolean().optional(),
5166
- sourcePath: external_exports.string().nullable().optional(),
5167
- targetPath: external_exports.string().nullable().optional(),
5168
- detail: external_exports.string().nullable().optional()
5169
- });
5170
- var agentSkillSnapshotSchema = external_exports.object({
5171
- adapterType: external_exports.string().min(1),
5172
- supported: external_exports.boolean(),
5173
- mode: agentSkillSyncModeSchema,
5174
- desiredSkills: external_exports.array(external_exports.string().min(1)),
5175
- entries: external_exports.array(agentSkillEntrySchema),
5176
- warnings: external_exports.array(external_exports.string())
5177
- });
5178
- var agentSkillSyncSchema = external_exports.object({
5179
- desiredSkills: external_exports.array(external_exports.string().min(1))
5180
- });
5181
-
5182
- // node_modules/.pnpm/@paperclipai+shared@2026.529.0/node_modules/@paperclipai/shared/dist/validators/text.js
5844
+ // node_modules/.pnpm/@paperclipai+shared@2026.707.0/node_modules/@paperclipai/shared/dist/validators/text.js
5183
5845
  function normalizeEscapedLineBreaks(value) {
5184
5846
  return value.replace(/\\r\\n/g, "\n").replace(/\\n/g, "\n").replace(/\\r/g, "\n");
5185
5847
  }
5186
5848
  var multilineTextSchema = external_exports.string().transform(normalizeEscapedLineBreaks);
5187
5849
 
5188
- // node_modules/.pnpm/@paperclipai+shared@2026.529.0/node_modules/@paperclipai/shared/dist/validators/issue.js
5850
+ // node_modules/.pnpm/@paperclipai+shared@2026.707.0/node_modules/@paperclipai/shared/dist/validators/trust-policy.js
5851
+ var trustPresetSchema = external_exports.enum(TRUST_PRESETS);
5852
+ var lowTrustOutputPromotionTargetSchema = external_exports.object({
5853
+ type: external_exports.literal("issue"),
5854
+ issueId: external_exports.string().uuid()
5855
+ }).strict();
5856
+ var lowTrustBoundarySchema = external_exports.object({
5857
+ mode: external_exports.literal(LOW_TRUST_REVIEW_PRESET),
5858
+ companyId: external_exports.string().uuid().optional(),
5859
+ projectIds: external_exports.array(external_exports.string().uuid()).optional(),
5860
+ rootIssueId: external_exports.string().uuid().optional(),
5861
+ issueIds: external_exports.array(external_exports.string().uuid()).optional(),
5862
+ allowedAgentIds: external_exports.array(external_exports.string().uuid()).optional(),
5863
+ allowedSecretBindingIds: external_exports.array(external_exports.string().uuid()).optional(),
5864
+ allowedToolClasses: external_exports.array(external_exports.string().trim().min(1)).optional(),
5865
+ outputPromotionTarget: lowTrustOutputPromotionTargetSchema.optional()
5866
+ }).strict();
5867
+ var lowTrustReviewPresetPolicySchema = external_exports.object({
5868
+ id: external_exports.literal(LOW_TRUST_REVIEW_PRESET),
5869
+ version: external_exports.literal(LOW_TRUST_REVIEW_PRESET_VERSION),
5870
+ rawOutputDisposition: external_exports.literal(LOW_TRUST_REVIEW_RAW_OUTPUT_DISPOSITION)
5871
+ }).strict();
5872
+ var trustAuthorizationPolicySchema = external_exports.object({
5873
+ trustPreset: trustPresetSchema.optional(),
5874
+ reviewPreset: lowTrustReviewPresetPolicySchema.optional(),
5875
+ trustBoundary: lowTrustBoundarySchema.optional()
5876
+ }).catchall(external_exports.unknown());
5877
+ var sourceTrustArtifactKindSchema = external_exports.enum(["issue", "comment", "document", "work_product"]);
5878
+ var sourceTrustMetadataSchema = external_exports.object({
5879
+ preset: trustPresetSchema,
5880
+ disposition: external_exports.enum(["quarantined", "promoted"]),
5881
+ sourceIssueId: external_exports.string().uuid().nullable().optional(),
5882
+ sourceRunId: external_exports.string().uuid().nullable().optional(),
5883
+ sourceAgentId: external_exports.string().uuid().nullable().optional(),
5884
+ promotedFrom: external_exports.object({
5885
+ artifactKind: sourceTrustArtifactKindSchema,
5886
+ artifactId: external_exports.string().uuid(),
5887
+ issueId: external_exports.string().uuid().nullable().optional()
5888
+ }).strict().nullable().optional(),
5889
+ promotedByActorType: external_exports.enum(["agent", "user", "system"]).nullable().optional(),
5890
+ promotedByActorId: external_exports.string().trim().min(1).nullable().optional(),
5891
+ promotedAt: external_exports.string().datetime({ offset: true }).nullable().optional()
5892
+ }).strict();
5893
+
5894
+ // node_modules/.pnpm/@paperclipai+shared@2026.707.0/node_modules/@paperclipai/shared/dist/validators/issue.js
5189
5895
  var issueBlockedInboxStateSchema = external_exports.enum([
5190
5896
  "needs_attention",
5191
5897
  "awaiting_decision",
@@ -5333,7 +6039,9 @@ var issueExecutionPolicySchema = external_exports.object({
5333
6039
  mode: external_exports.enum(ISSUE_EXECUTION_POLICY_MODES).optional().default("normal"),
5334
6040
  commentRequired: external_exports.boolean().optional().default(true),
5335
6041
  stages: external_exports.array(issueExecutionStageSchema).default([]),
5336
- monitor: issueExecutionMonitorPolicySchema.optional().nullable()
6042
+ monitor: issueExecutionMonitorPolicySchema.optional().nullable(),
6043
+ reviewPreset: lowTrustReviewPresetPolicySchema.optional(),
6044
+ authorizationPolicy: trustAuthorizationPolicySchema.optional()
5337
6045
  });
5338
6046
  var issueExecutionMonitorStateSchema = external_exports.object({
5339
6047
  status: external_exports.enum(ISSUE_EXECUTION_MONITOR_STATE_STATUSES),
@@ -5482,21 +6190,36 @@ var createIssueBaseSchema = external_exports.object({
5482
6190
  assigneeAgentId: external_exports.string().uuid().optional().nullable(),
5483
6191
  assigneeUserId: external_exports.string().optional().nullable(),
5484
6192
  requestDepth: issueRequestDepthInputSchema.optional().default(0),
6193
+ createdByUserId: external_exports.string().optional().nullable(),
6194
+ responsibleUserId: external_exports.string().optional().nullable(),
5485
6195
  billingCode: external_exports.string().optional().nullable(),
5486
6196
  assigneeAdapterOverrides: issueAssigneeAdapterOverridesSchema.optional().nullable(),
5487
6197
  executionPolicy: issueExecutionPolicySchema.optional().nullable(),
5488
6198
  executionWorkspaceId: external_exports.string().uuid().optional().nullable(),
5489
6199
  executionWorkspacePreference: external_exports.enum(ISSUE_EXECUTION_WORKSPACE_PREFERENCES).optional().nullable(),
5490
6200
  executionWorkspaceSettings: issueExecutionWorkspaceSettingsSchema.optional().nullable(),
5491
- labelIds: external_exports.array(external_exports.string().uuid()).optional()
6201
+ labelIds: external_exports.array(external_exports.string().uuid()).optional(),
6202
+ watchdogDiscovery: external_exports.object({
6203
+ kind: external_exports.enum(ISSUE_WATCHDOG_DISCOVERY_KINDS),
6204
+ evidenceMarkdown: multilineTextSchema.optional().nullable()
6205
+ }).strict().optional().nullable(),
6206
+ watchdog: external_exports.object({
6207
+ agentId: external_exports.string().uuid(),
6208
+ instructions: multilineTextSchema.optional().nullable()
6209
+ }).strict().optional().nullable()
5492
6210
  });
5493
6211
  var createIssueInputSchema = createIssueBaseSchema.extend({
5494
6212
  status: createIssueBaseSchema.shape.status.optional()
5495
6213
  });
5496
6214
  var createIssueSchema = withCreateIssueStatusDefault(createIssueBaseSchema);
6215
+ var upsertIssueWatchdogSchema = external_exports.object({
6216
+ agentId: external_exports.string().uuid(),
6217
+ instructions: multilineTextSchema.optional().nullable()
6218
+ }).strict();
5497
6219
  var createChildIssueSchema = withCreateIssueStatusDefault(createIssueBaseSchema.omit({
5498
6220
  parentId: true,
5499
- inheritExecutionWorkspaceFromIssueId: true
6221
+ inheritExecutionWorkspaceFromIssueId: true,
6222
+ watchdogDiscovery: true
5500
6223
  }).extend({
5501
6224
  acceptanceCriteria: external_exports.array(external_exports.string().trim().min(1).max(500)).max(20).optional(),
5502
6225
  blockParentUntilDone: external_exports.boolean().optional().default(false)
@@ -5509,7 +6232,11 @@ var createIssueLabelSchema = external_exports.object({
5509
6232
  name: external_exports.string().trim().min(1).max(48),
5510
6233
  color: external_exports.string().regex(/^#(?:[0-9a-fA-F]{6})$/, "Color must be a 6-digit hex value")
5511
6234
  });
5512
- var updateIssueSchema = createIssueBaseSchema.partial().extend({
6235
+ var updateIssueSchema = createIssueBaseSchema.omit({
6236
+ createdByUserId: true,
6237
+ responsibleUserId: true,
6238
+ watchdog: true
6239
+ }).partial().extend({
5513
6240
  requestDepth: issueRequestDepthInputSchema.optional(),
5514
6241
  assigneeAgentId: external_exports.string().trim().min(1).optional().nullable(),
5515
6242
  comment: multilineTextSchema.pipe(external_exports.string().min(1)).optional(),
@@ -5677,6 +6404,7 @@ var askUserQuestionsPayloadSchema = external_exports.object({
5677
6404
  version: external_exports.literal(1),
5678
6405
  title: external_exports.string().trim().max(240).nullable().optional(),
5679
6406
  submitLabel: external_exports.string().trim().max(120).nullable().optional(),
6407
+ supersedeOnUserComment: external_exports.boolean().optional(),
5680
6408
  questions: external_exports.array(askUserQuestionsQuestionSchema).min(1).max(10)
5681
6409
  }).superRefine((value, ctx) => {
5682
6410
  const seenQuestionIds = /* @__PURE__ */ new Set();
@@ -5704,19 +6432,25 @@ var askUserQuestionsPayloadSchema = external_exports.object({
5704
6432
  });
5705
6433
  var askUserQuestionsAnswerSchema = external_exports.object({
5706
6434
  questionId: external_exports.string().trim().min(1).max(120),
5707
- optionIds: external_exports.array(external_exports.string().trim().min(1).max(120)).max(20)
6435
+ optionIds: external_exports.array(external_exports.string().trim().min(1).max(120)).max(20),
6436
+ otherText: multilineTextSchema.pipe(external_exports.string().trim().max(4e3)).nullable().optional()
5708
6437
  });
5709
6438
  var askUserQuestionsResultSchema = external_exports.object({
5710
6439
  version: external_exports.literal(1),
5711
6440
  answers: external_exports.array(askUserQuestionsAnswerSchema).max(20),
5712
6441
  cancelled: external_exports.literal(true).optional(),
5713
6442
  cancellationReason: external_exports.string().trim().max(4e3).nullable().optional(),
6443
+ expirationReason: external_exports.literal("superseded_by_comment").optional(),
6444
+ commentId: external_exports.string().uuid().nullable().optional(),
5714
6445
  summaryMarkdown: external_exports.string().max(2e4).nullable().optional()
5715
6446
  });
5716
6447
  var requestConfirmationHrefSchema = external_exports.string().trim().min(1).max(2e3).refine((value) => {
5717
- const lower = value.toLowerCase();
5718
- return !lower.startsWith("javascript:") && !lower.startsWith("data:") && !value.startsWith("//");
5719
- }, "href must not use javascript:, data:, or protocol-relative URLs");
6448
+ if (value.startsWith("#"))
6449
+ return true;
6450
+ if (value.startsWith("/"))
6451
+ return !value.startsWith("//");
6452
+ return /^https?:\/\//i.test(value);
6453
+ }, "href must be a root-relative path, same-page fragment, or http(s) URL");
5720
6454
  var requestConfirmationTargetBaseSchema = external_exports.object({
5721
6455
  label: external_exports.string().trim().min(1).max(120).nullable().optional(),
5722
6456
  href: requestConfirmationHrefSchema.nullable().optional()
@@ -5729,28 +6463,119 @@ var requestConfirmationIssueDocumentTargetSchema = requestConfirmationTargetBase
5729
6463
  revisionId: external_exports.string().uuid(),
5730
6464
  revisionNumber: external_exports.number().int().positive().nullable().optional()
5731
6465
  });
5732
- var requestConfirmationCustomTargetSchema = requestConfirmationTargetBaseSchema.extend({
5733
- type: external_exports.literal("custom"),
5734
- key: external_exports.string().trim().min(1).max(120),
5735
- revisionId: external_exports.string().trim().min(1).max(255).nullable().optional(),
5736
- revisionNumber: external_exports.number().int().positive().nullable().optional()
6466
+ var requestConfirmationCustomTargetSchema = requestConfirmationTargetBaseSchema.extend({
6467
+ type: external_exports.literal("custom"),
6468
+ key: external_exports.string().trim().min(1).max(120),
6469
+ revisionId: external_exports.string().trim().min(1).max(255).nullable().optional(),
6470
+ revisionNumber: external_exports.number().int().positive().nullable().optional()
6471
+ });
6472
+ var requestConfirmationTargetSchema = external_exports.discriminatedUnion("type", [
6473
+ requestConfirmationIssueDocumentTargetSchema,
6474
+ requestConfirmationCustomTargetSchema
6475
+ ]);
6476
+ var requestConfirmationPayloadSchema = external_exports.object({
6477
+ version: external_exports.literal(1),
6478
+ prompt: external_exports.string().trim().min(1).max(1e3),
6479
+ acceptLabel: external_exports.string().trim().min(1).max(80).nullable().optional(),
6480
+ rejectLabel: external_exports.string().trim().min(1).max(80).nullable().optional(),
6481
+ rejectRequiresReason: external_exports.boolean().optional(),
6482
+ rejectReasonLabel: external_exports.string().trim().min(1).max(160).nullable().optional(),
6483
+ allowDeclineReason: external_exports.boolean().optional().default(true),
6484
+ declineReasonPlaceholder: external_exports.string().trim().min(1).max(240).nullable().optional(),
6485
+ detailsMarkdown: external_exports.string().max(2e4).nullable().optional(),
6486
+ supersedeOnUserComment: external_exports.boolean().optional(),
6487
+ target: requestConfirmationTargetSchema.nullable().optional()
6488
+ });
6489
+ var requestCheckboxConfirmationOptionSchema = external_exports.object({
6490
+ id: external_exports.string().trim().min(1).max(120),
6491
+ label: external_exports.string().trim().min(1).max(120),
6492
+ description: external_exports.string().trim().max(500).nullable().optional()
5737
6493
  });
5738
- var requestConfirmationTargetSchema = external_exports.discriminatedUnion("type", [
5739
- requestConfirmationIssueDocumentTargetSchema,
5740
- requestConfirmationCustomTargetSchema
5741
- ]);
5742
- var requestConfirmationPayloadSchema = external_exports.object({
6494
+ var requestCheckboxConfirmationPayloadSchema = external_exports.object({
5743
6495
  version: external_exports.literal(1),
5744
6496
  prompt: external_exports.string().trim().min(1).max(1e3),
6497
+ detailsMarkdown: external_exports.string().max(2e4).nullable().optional(),
6498
+ options: external_exports.array(requestCheckboxConfirmationOptionSchema).min(1).max(REQUEST_CHECKBOX_CONFIRMATION_OPTION_LIMIT),
6499
+ defaultSelectedOptionIds: external_exports.array(external_exports.string().trim().min(1).max(120)).max(REQUEST_CHECKBOX_CONFIRMATION_OPTION_LIMIT).optional().default([]),
6500
+ minSelected: external_exports.number().int().min(0).optional().default(0),
6501
+ maxSelected: external_exports.number().int().min(0).nullable().optional(),
5745
6502
  acceptLabel: external_exports.string().trim().min(1).max(80).nullable().optional(),
5746
6503
  rejectLabel: external_exports.string().trim().min(1).max(80).nullable().optional(),
5747
6504
  rejectRequiresReason: external_exports.boolean().optional(),
5748
6505
  rejectReasonLabel: external_exports.string().trim().min(1).max(160).nullable().optional(),
5749
6506
  allowDeclineReason: external_exports.boolean().optional().default(true),
5750
6507
  declineReasonPlaceholder: external_exports.string().trim().min(1).max(240).nullable().optional(),
5751
- detailsMarkdown: external_exports.string().max(2e4).nullable().optional(),
5752
6508
  supersedeOnUserComment: external_exports.boolean().optional(),
5753
6509
  target: requestConfirmationTargetSchema.nullable().optional()
6510
+ }).superRefine((value, ctx) => {
6511
+ const optionIds = /* @__PURE__ */ new Set();
6512
+ for (const [index, option] of value.options.entries()) {
6513
+ if (optionIds.has(option.id)) {
6514
+ ctx.addIssue({
6515
+ code: external_exports.ZodIssueCode.custom,
6516
+ message: "Option ids must be unique within one checkbox confirmation",
6517
+ path: ["options", index, "id"]
6518
+ });
6519
+ }
6520
+ optionIds.add(option.id);
6521
+ }
6522
+ const defaultSelectedOptionIds = /* @__PURE__ */ new Set();
6523
+ for (const [index, optionId] of value.defaultSelectedOptionIds.entries()) {
6524
+ if (defaultSelectedOptionIds.has(optionId)) {
6525
+ ctx.addIssue({
6526
+ code: external_exports.ZodIssueCode.custom,
6527
+ message: "defaultSelectedOptionIds must be unique",
6528
+ path: ["defaultSelectedOptionIds", index]
6529
+ });
6530
+ continue;
6531
+ }
6532
+ defaultSelectedOptionIds.add(optionId);
6533
+ if (!optionIds.has(optionId)) {
6534
+ ctx.addIssue({
6535
+ code: external_exports.ZodIssueCode.custom,
6536
+ message: "defaultSelectedOptionIds must reference existing option ids",
6537
+ path: ["defaultSelectedOptionIds", index]
6538
+ });
6539
+ }
6540
+ }
6541
+ const maxSelected = value.maxSelected ?? null;
6542
+ if (value.minSelected > value.options.length) {
6543
+ ctx.addIssue({
6544
+ code: external_exports.ZodIssueCode.custom,
6545
+ message: "minSelected cannot exceed the option count",
6546
+ path: ["minSelected"]
6547
+ });
6548
+ }
6549
+ if (value.defaultSelectedOptionIds.length < value.minSelected) {
6550
+ ctx.addIssue({
6551
+ code: external_exports.ZodIssueCode.custom,
6552
+ message: "defaultSelectedOptionIds must satisfy minSelected",
6553
+ path: ["defaultSelectedOptionIds"]
6554
+ });
6555
+ }
6556
+ if (maxSelected != null) {
6557
+ if (maxSelected < value.minSelected) {
6558
+ ctx.addIssue({
6559
+ code: external_exports.ZodIssueCode.custom,
6560
+ message: "maxSelected must be greater than or equal to minSelected",
6561
+ path: ["maxSelected"]
6562
+ });
6563
+ }
6564
+ if (maxSelected > value.options.length) {
6565
+ ctx.addIssue({
6566
+ code: external_exports.ZodIssueCode.custom,
6567
+ message: "maxSelected cannot exceed the option count",
6568
+ path: ["maxSelected"]
6569
+ });
6570
+ }
6571
+ if (value.defaultSelectedOptionIds.length > maxSelected) {
6572
+ ctx.addIssue({
6573
+ code: external_exports.ZodIssueCode.custom,
6574
+ message: "defaultSelectedOptionIds cannot exceed maxSelected",
6575
+ path: ["defaultSelectedOptionIds"]
6576
+ });
6577
+ }
6578
+ }
5754
6579
  });
5755
6580
  var requestConfirmationResultSchema = external_exports.object({
5756
6581
  version: external_exports.literal(1),
@@ -5759,6 +6584,22 @@ var requestConfirmationResultSchema = external_exports.object({
5759
6584
  commentId: external_exports.string().uuid().nullable().optional(),
5760
6585
  staleTarget: requestConfirmationTargetSchema.nullable().optional()
5761
6586
  });
6587
+ var requestCheckboxConfirmationResultSchema = requestConfirmationResultSchema.extend({
6588
+ selectedOptionIds: external_exports.array(external_exports.string().trim().min(1).max(120)).max(REQUEST_CHECKBOX_CONFIRMATION_OPTION_LIMIT).optional()
6589
+ }).superRefine((value, ctx) => {
6590
+ const selectedOptionIds = value.selectedOptionIds ?? [];
6591
+ const seenOptionIds = /* @__PURE__ */ new Set();
6592
+ for (const [index, optionId] of selectedOptionIds.entries()) {
6593
+ if (seenOptionIds.has(optionId)) {
6594
+ ctx.addIssue({
6595
+ code: external_exports.ZodIssueCode.custom,
6596
+ message: "selectedOptionIds must be unique",
6597
+ path: ["selectedOptionIds", index]
6598
+ });
6599
+ }
6600
+ seenOptionIds.add(optionId);
6601
+ }
6602
+ });
5762
6603
  var createIssueThreadInteractionSchema = external_exports.discriminatedUnion("kind", [
5763
6604
  external_exports.object({
5764
6605
  kind: external_exports.literal("suggest_tasks"),
@@ -5781,306 +6622,121 @@ var createIssueThreadInteractionSchema = external_exports.discriminatedUnion("ki
5781
6622
  payload: askUserQuestionsPayloadSchema
5782
6623
  }),
5783
6624
  external_exports.object({
5784
- kind: external_exports.literal("request_confirmation"),
5785
- idempotencyKey: external_exports.string().trim().max(255).nullable().optional(),
5786
- sourceCommentId: external_exports.string().uuid().nullable().optional(),
5787
- sourceRunId: external_exports.string().uuid().nullable().optional(),
5788
- title: external_exports.string().trim().max(240).nullable().optional(),
5789
- summary: external_exports.string().trim().max(1e3).nullable().optional(),
5790
- continuationPolicy: issueThreadInteractionContinuationPolicySchema.optional().default("none"),
5791
- payload: requestConfirmationPayloadSchema
5792
- })
5793
- ]);
5794
- var acceptIssueThreadInteractionSchema = external_exports.object({
5795
- selectedClientKeys: external_exports.array(external_exports.string().trim().min(1).max(120)).min(1).max(50).optional()
5796
- }).superRefine((value, ctx) => {
5797
- const seenClientKeys = /* @__PURE__ */ new Set();
5798
- for (const [index, clientKey] of (value.selectedClientKeys ?? []).entries()) {
5799
- if (seenClientKeys.has(clientKey)) {
5800
- ctx.addIssue({
5801
- code: external_exports.ZodIssueCode.custom,
5802
- message: "selectedClientKeys must be unique",
5803
- path: ["selectedClientKeys", index]
5804
- });
5805
- continue;
5806
- }
5807
- seenClientKeys.add(clientKey);
5808
- }
5809
- });
5810
- var rejectIssueThreadInteractionSchema = external_exports.object({
5811
- reason: external_exports.string().trim().max(4e3).optional()
5812
- });
5813
- var cancelIssueThreadInteractionSchema = external_exports.object({
5814
- reason: external_exports.string().trim().max(4e3).optional()
5815
- });
5816
- var respondIssueThreadInteractionSchema = external_exports.object({
5817
- answers: external_exports.array(askUserQuestionsAnswerSchema).max(20),
5818
- summaryMarkdown: multilineTextSchema.pipe(external_exports.string().max(2e4)).nullable().optional()
5819
- });
5820
- var linkIssueApprovalSchema = external_exports.object({
5821
- approvalId: external_exports.string().uuid()
5822
- });
5823
- var createIssueAttachmentMetadataSchema = external_exports.object({
5824
- issueCommentId: external_exports.string().uuid().optional().nullable()
5825
- });
5826
- var ISSUE_DOCUMENT_FORMATS = ["markdown"];
5827
- var issueDocumentFormatSchema = external_exports.enum(ISSUE_DOCUMENT_FORMATS);
5828
- var upsertIssueDocumentSchema = external_exports.object({
5829
- title: external_exports.string().trim().max(200).nullable().optional(),
5830
- format: issueDocumentFormatSchema,
5831
- body: multilineTextSchema.pipe(external_exports.string().max(524288)),
5832
- changeSummary: external_exports.string().trim().max(500).nullable().optional(),
5833
- baseRevisionId: external_exports.string().uuid().nullable().optional()
5834
- });
5835
- var restoreIssueDocumentRevisionSchema = external_exports.object({});
5836
-
5837
- // node_modules/.pnpm/@paperclipai+shared@2026.529.0/node_modules/@paperclipai/shared/dist/validators/secret.js
5838
- var envBindingPlainSchema = external_exports.object({
5839
- type: external_exports.literal("plain"),
5840
- value: external_exports.string()
5841
- });
5842
- var envBindingSecretRefSchema = external_exports.object({
5843
- type: external_exports.literal("secret_ref"),
5844
- secretId: external_exports.string().uuid(),
5845
- version: external_exports.union([external_exports.literal("latest"), external_exports.number().int().positive()]).optional()
5846
- });
5847
- var envBindingSchema = external_exports.union([
5848
- external_exports.string(),
5849
- envBindingPlainSchema,
5850
- envBindingSecretRefSchema
5851
- ]);
5852
- var envConfigSchema = external_exports.record(external_exports.string(), envBindingSchema);
5853
- var createSecretSchema = external_exports.object({
5854
- name: external_exports.string().min(1),
5855
- key: external_exports.string().min(1).regex(/^[a-zA-Z0-9_.-]+$/).optional(),
5856
- provider: external_exports.enum(SECRET_PROVIDERS).optional(),
5857
- providerConfigId: external_exports.string().uuid().optional().nullable(),
5858
- managedMode: external_exports.enum(SECRET_MANAGED_MODES).optional(),
5859
- value: external_exports.string().min(1).optional().nullable(),
5860
- description: external_exports.string().optional().nullable(),
5861
- externalRef: external_exports.string().optional().nullable(),
5862
- providerMetadata: external_exports.record(external_exports.string(), external_exports.unknown()).optional().nullable(),
5863
- providerVersionRef: external_exports.string().optional().nullable()
5864
- }).superRefine((value, ctx) => {
5865
- if ((value.managedMode ?? "paperclip_managed") === "external_reference") {
5866
- if (!value.externalRef?.trim()) {
5867
- ctx.addIssue({
5868
- code: external_exports.ZodIssueCode.custom,
5869
- path: ["externalRef"],
5870
- message: "External reference secrets require externalRef"
5871
- });
5872
- }
5873
- return;
5874
- }
5875
- if (value.externalRef?.trim()) {
5876
- ctx.addIssue({
5877
- code: external_exports.ZodIssueCode.custom,
5878
- path: ["externalRef"],
5879
- message: "Managed secrets cannot set externalRef"
5880
- });
5881
- }
5882
- if (!value.value?.trim()) {
5883
- ctx.addIssue({
5884
- code: external_exports.ZodIssueCode.custom,
5885
- path: ["value"],
5886
- message: "Managed secrets require value"
5887
- });
5888
- }
5889
- });
5890
- var rotateSecretSchema = external_exports.object({
5891
- value: external_exports.string().min(1).optional().nullable(),
5892
- externalRef: external_exports.string().optional().nullable(),
5893
- providerVersionRef: external_exports.string().optional().nullable(),
5894
- providerConfigId: external_exports.string().uuid().optional().nullable()
5895
- });
5896
- var updateSecretSchema = external_exports.object({
5897
- name: external_exports.string().min(1).optional(),
5898
- key: external_exports.string().min(1).regex(/^[a-zA-Z0-9_.-]+$/).optional(),
5899
- status: external_exports.enum(SECRET_STATUSES).optional(),
5900
- providerConfigId: external_exports.string().uuid().optional().nullable(),
5901
- description: external_exports.string().optional().nullable(),
5902
- externalRef: external_exports.string().optional().nullable(),
5903
- providerMetadata: external_exports.record(external_exports.string(), external_exports.unknown()).optional().nullable()
5904
- });
5905
- var secretBindingTargetSchema = external_exports.object({
5906
- targetType: external_exports.enum(SECRET_BINDING_TARGET_TYPES),
5907
- targetId: external_exports.string().min(1),
5908
- configPath: external_exports.string().min(1)
5909
- });
5910
- var createSecretBindingSchema = secretBindingTargetSchema.extend({
5911
- secretId: external_exports.string().uuid(),
5912
- versionSelector: external_exports.union([external_exports.literal("latest"), external_exports.number().int().positive()]).default("latest"),
5913
- required: external_exports.boolean().default(true),
5914
- label: external_exports.string().optional().nullable()
5915
- });
5916
- var safeShortText = external_exports.string().trim().min(1).max(160);
5917
- var optionalSafeShortText = safeShortText.optional().nullable();
5918
- var deniedProviderConfigKeyPattern = /^(access[-_]?key([-_]?id)?|secret[-_]?access[-_]?key|secret[-_]?key|token|password|passwd|credential|credentials|private[-_]?key|pem|jwt|session[-_]?token|service[-_]?account([-_]?json)?|client[-_]?secret|secret[-_]?id|unseal[-_]?key|recovery[-_]?key|key[-_]?file([-_]?path)?|token[-_]?file([-_]?path)?)$/i;
5919
- function rejectSensitiveProviderConfigKeys(value, ctx) {
5920
- if (!value || typeof value !== "object" || Array.isArray(value))
5921
- return;
5922
- for (const key of Object.keys(value)) {
5923
- if (!deniedProviderConfigKeyPattern.test(key))
5924
- continue;
5925
- ctx.addIssue({
5926
- code: external_exports.ZodIssueCode.custom,
5927
- path: ["config", key],
5928
- message: `Provider vault config cannot persist sensitive field: ${key}`
5929
- });
5930
- }
5931
- }
5932
- var localEncryptedProviderConfigSchema = external_exports.object({
5933
- backupReminderAcknowledged: external_exports.boolean().optional()
5934
- }).strict();
5935
- var awsSecretsManagerProviderConfigSchema = external_exports.object({
5936
- region: external_exports.string().trim().regex(/^[a-z]{2}(?:-gov)?-[a-z]+-\d+$/, "Invalid AWS region"),
5937
- namespace: optionalSafeShortText,
5938
- secretNamePrefix: optionalSafeShortText,
5939
- kmsKeyId: external_exports.string().trim().min(1).max(512).optional().nullable(),
5940
- ownerTag: optionalSafeShortText,
5941
- environmentTag: optionalSafeShortText
5942
- }).strict();
5943
- var gcpSecretManagerProviderConfigSchema = external_exports.object({
5944
- projectId: external_exports.string().trim().min(1).max(128).regex(/^[a-z][a-z0-9-]{4,127}$/).optional().nullable(),
5945
- location: optionalSafeShortText,
5946
- namespace: optionalSafeShortText,
5947
- secretNamePrefix: optionalSafeShortText
5948
- }).strict();
5949
- var vaultAddressSchema = external_exports.preprocess((value) => typeof value === "string" ? value.trim() : value, external_exports.string().url().superRefine((value, ctx) => {
5950
- let url;
5951
- try {
5952
- url = new URL(value);
5953
- } catch {
5954
- return;
5955
- }
5956
- const hasPath = url.pathname !== "" && url.pathname !== "/";
5957
- if (url.protocol !== "http:" && url.protocol !== "https:" || url.username || url.password || url.search || url.hash || hasPath) {
5958
- ctx.addIssue({
5959
- code: external_exports.ZodIssueCode.custom,
5960
- message: "Vault address must be an origin-only HTTP(S) URL without credentials, path, query, or fragment"
5961
- });
5962
- }
5963
- }).transform((value) => new URL(value).origin));
5964
- function rejectUnsafeVaultAddress(value, ctx) {
5965
- if (value === void 0 || value === null)
5966
- return;
5967
- const parsed = vaultAddressSchema.safeParse(value);
5968
- if (parsed.success)
5969
- return;
5970
- for (const issue of parsed.error.issues) {
5971
- ctx.addIssue({
5972
- ...issue,
5973
- path: ["config", "address", ...issue.path]
5974
- });
5975
- }
5976
- }
5977
- var vaultProviderConfigSchema = external_exports.object({
5978
- address: vaultAddressSchema.optional().nullable(),
5979
- namespace: optionalSafeShortText,
5980
- mountPath: optionalSafeShortText,
5981
- secretPathPrefix: optionalSafeShortText
5982
- }).strict();
5983
- var secretProviderConfigPayloadSchema = external_exports.discriminatedUnion("provider", [
5984
- external_exports.object({ provider: external_exports.literal("local_encrypted"), config: localEncryptedProviderConfigSchema }),
5985
- external_exports.object({ provider: external_exports.literal("aws_secrets_manager"), config: awsSecretsManagerProviderConfigSchema }),
5986
- external_exports.object({ provider: external_exports.literal("gcp_secret_manager"), config: gcpSecretManagerProviderConfigSchema }),
5987
- external_exports.object({ provider: external_exports.literal("vault"), config: vaultProviderConfigSchema })
6625
+ kind: external_exports.literal("request_confirmation"),
6626
+ idempotencyKey: external_exports.string().trim().max(255).nullable().optional(),
6627
+ sourceCommentId: external_exports.string().uuid().nullable().optional(),
6628
+ sourceRunId: external_exports.string().uuid().nullable().optional(),
6629
+ title: external_exports.string().trim().max(240).nullable().optional(),
6630
+ summary: external_exports.string().trim().max(1e3).nullable().optional(),
6631
+ continuationPolicy: issueThreadInteractionContinuationPolicySchema.optional().default("none"),
6632
+ payload: requestConfirmationPayloadSchema
6633
+ }),
6634
+ external_exports.object({
6635
+ kind: external_exports.literal("request_checkbox_confirmation"),
6636
+ idempotencyKey: external_exports.string().trim().max(255).nullable().optional(),
6637
+ sourceCommentId: external_exports.string().uuid().nullable().optional(),
6638
+ sourceRunId: external_exports.string().uuid().nullable().optional(),
6639
+ title: external_exports.string().trim().max(240).nullable().optional(),
6640
+ summary: external_exports.string().trim().max(1e3).nullable().optional(),
6641
+ continuationPolicy: issueThreadInteractionContinuationPolicySchema.optional().default("wake_assignee"),
6642
+ payload: requestCheckboxConfirmationPayloadSchema
6643
+ })
5988
6644
  ]);
5989
- var createSecretProviderConfigSchema = external_exports.object({
5990
- provider: external_exports.enum(SECRET_PROVIDERS),
5991
- displayName: external_exports.string().trim().min(1).max(120),
5992
- status: external_exports.enum(SECRET_PROVIDER_CONFIG_STATUSES).optional(),
5993
- isDefault: external_exports.boolean().optional(),
5994
- config: external_exports.record(external_exports.string(), external_exports.unknown()).default({})
6645
+ var acceptIssueThreadInteractionSchema = external_exports.object({
6646
+ selectedClientKeys: external_exports.array(external_exports.string().trim().min(1).max(120)).min(1).max(50).optional(),
6647
+ selectedOptionIds: external_exports.array(external_exports.string().trim().min(1).max(120)).max(REQUEST_CHECKBOX_CONFIRMATION_OPTION_LIMIT).optional()
5995
6648
  }).superRefine((value, ctx) => {
5996
- rejectSensitiveProviderConfigKeys(value.config, ctx);
5997
- const parsed = secretProviderConfigPayloadSchema.safeParse({
5998
- provider: value.provider,
5999
- config: value.config
6000
- });
6001
- if (!parsed.success) {
6002
- for (const issue of parsed.error.issues) {
6649
+ const seenClientKeys = /* @__PURE__ */ new Set();
6650
+ for (const [index, clientKey] of (value.selectedClientKeys ?? []).entries()) {
6651
+ if (seenClientKeys.has(clientKey)) {
6003
6652
  ctx.addIssue({
6004
- ...issue,
6005
- path: issue.path[0] === "config" ? issue.path : ["config", ...issue.path]
6653
+ code: external_exports.ZodIssueCode.custom,
6654
+ message: "selectedClientKeys must be unique",
6655
+ path: ["selectedClientKeys", index]
6006
6656
  });
6657
+ continue;
6007
6658
  }
6659
+ seenClientKeys.add(clientKey);
6008
6660
  }
6009
- const status = value.status ?? (["gcp_secret_manager", "vault"].includes(value.provider) ? "coming_soon" : "ready");
6010
- if ((value.provider === "gcp_secret_manager" || value.provider === "vault") && status !== "coming_soon" && status !== "disabled") {
6011
- ctx.addIssue({
6012
- code: external_exports.ZodIssueCode.custom,
6013
- path: ["status"],
6014
- message: `${value.provider} provider vaults are locked while coming soon`
6015
- });
6016
- }
6017
- if ((status === "coming_soon" || status === "disabled") && value.isDefault) {
6018
- ctx.addIssue({
6019
- code: external_exports.ZodIssueCode.custom,
6020
- path: ["isDefault"],
6021
- message: "Only ready or warning provider vaults can be default"
6022
- });
6023
- }
6024
- });
6025
- var updateSecretProviderConfigSchema = external_exports.object({
6026
- displayName: external_exports.string().trim().min(1).max(120).optional(),
6027
- status: external_exports.enum(SECRET_PROVIDER_CONFIG_STATUSES).optional(),
6028
- isDefault: external_exports.boolean().optional(),
6029
- config: external_exports.record(external_exports.string(), external_exports.unknown()).optional()
6030
- }).superRefine((value, ctx) => {
6031
- if (value.config !== void 0) {
6032
- rejectSensitiveProviderConfigKeys(value.config, ctx);
6033
- rejectUnsafeVaultAddress(value.config.address, ctx);
6034
- }
6035
- if ((value.status === "coming_soon" || value.status === "disabled") && value.isDefault) {
6036
- ctx.addIssue({
6037
- code: external_exports.ZodIssueCode.custom,
6038
- path: ["isDefault"],
6039
- message: "Only ready or warning provider vaults can be default"
6040
- });
6041
- }
6042
- });
6043
- var remoteSecretImportPreviewSchema = external_exports.object({
6044
- providerConfigId: external_exports.string().uuid(),
6045
- query: external_exports.string().trim().max(200).optional().nullable(),
6046
- nextToken: external_exports.string().trim().min(1).max(4096).optional().nullable(),
6047
- pageSize: external_exports.number().int().min(1).max(100).optional()
6048
- });
6049
- var secretProviderConfigDiscoveryPreviewSchema = external_exports.object({
6050
- provider: external_exports.enum(SECRET_PROVIDERS),
6051
- config: external_exports.record(external_exports.unknown()).default({}),
6052
- query: external_exports.string().trim().max(200).optional().nullable(),
6053
- nextToken: external_exports.string().trim().min(1).max(4096).optional().nullable(),
6054
- pageSize: external_exports.number().int().min(1).max(100).optional()
6055
- }).superRefine((value, ctx) => {
6056
- rejectSensitiveProviderConfigKeys(value.config, ctx);
6057
- const parsed = secretProviderConfigPayloadSchema.safeParse({
6058
- provider: value.provider,
6059
- config: value.config
6060
- });
6061
- if (!parsed.success) {
6062
- for (const issue of parsed.error.issues) {
6661
+ const seenOptionIds = /* @__PURE__ */ new Set();
6662
+ for (const [index, optionId] of (value.selectedOptionIds ?? []).entries()) {
6663
+ if (seenOptionIds.has(optionId)) {
6063
6664
  ctx.addIssue({
6064
- ...issue,
6065
- path: issue.path[0] === "config" ? issue.path : ["config", ...issue.path]
6665
+ code: external_exports.ZodIssueCode.custom,
6666
+ message: "selectedOptionIds must be unique",
6667
+ path: ["selectedOptionIds", index]
6066
6668
  });
6669
+ continue;
6067
6670
  }
6671
+ seenOptionIds.add(optionId);
6068
6672
  }
6069
6673
  });
6070
- var remoteSecretImportSelectionSchema = external_exports.object({
6071
- externalRef: external_exports.string().trim().min(1).max(2048),
6072
- name: external_exports.string().trim().min(1).max(160).optional().nullable(),
6073
- key: external_exports.string().trim().min(1).max(120).regex(/^[a-zA-Z0-9_.-]+$/).optional().nullable(),
6074
- description: external_exports.string().trim().max(500).optional().nullable(),
6075
- providerVersionRef: external_exports.string().trim().min(1).max(512).optional().nullable(),
6076
- providerMetadata: external_exports.record(external_exports.string(), external_exports.unknown()).optional().nullable()
6674
+ var rejectIssueThreadInteractionSchema = external_exports.object({
6675
+ reason: external_exports.string().trim().max(4e3).optional()
6077
6676
  });
6078
- var remoteSecretImportSchema = external_exports.object({
6079
- providerConfigId: external_exports.string().uuid(),
6080
- secrets: external_exports.array(remoteSecretImportSelectionSchema).min(1).max(100)
6677
+ var cancelIssueThreadInteractionSchema = external_exports.object({
6678
+ reason: external_exports.string().trim().max(4e3).optional()
6679
+ });
6680
+ var respondIssueThreadInteractionSchema = external_exports.object({
6681
+ answers: external_exports.array(askUserQuestionsAnswerSchema).max(20),
6682
+ summaryMarkdown: multilineTextSchema.pipe(external_exports.string().max(2e4)).nullable().optional()
6683
+ });
6684
+ var linkIssueApprovalSchema = external_exports.object({
6685
+ approvalId: external_exports.string().uuid()
6686
+ });
6687
+ var createIssueAttachmentMetadataSchema = external_exports.object({
6688
+ issueCommentId: external_exports.string().uuid().optional().nullable()
6689
+ });
6690
+ var ISSUE_DOCUMENT_FORMATS = ["markdown"];
6691
+ var issueDocumentFormatSchema = external_exports.enum(ISSUE_DOCUMENT_FORMATS);
6692
+ var upsertIssueDocumentSchema = external_exports.object({
6693
+ title: external_exports.string().trim().max(200).nullable().optional(),
6694
+ format: issueDocumentFormatSchema,
6695
+ body: multilineTextSchema.pipe(external_exports.string().max(524288)),
6696
+ changeSummary: external_exports.string().trim().max(500).nullable().optional(),
6697
+ baseRevisionId: external_exports.string().uuid().nullable().optional()
6698
+ });
6699
+ var restoreIssueDocumentRevisionSchema = external_exports.object({});
6700
+
6701
+ // node_modules/.pnpm/@paperclipai+shared@2026.707.0/node_modules/@paperclipai/shared/dist/routine-variables.js
6702
+ var HUMAN_TIMESTAMP_FORMATTER = new Intl.DateTimeFormat("en-US", {
6703
+ year: "numeric",
6704
+ month: "long",
6705
+ day: "numeric",
6706
+ hour: "numeric",
6707
+ minute: "2-digit",
6708
+ hour12: true,
6709
+ timeZone: "UTC",
6710
+ timeZoneName: "short"
6081
6711
  });
6712
+ function isValidRoutineDateString(value) {
6713
+ const match = /^(\d{4})-(\d{2})-(\d{2})$/.exec(value);
6714
+ if (!match)
6715
+ return false;
6716
+ const year = Number(match[1]);
6717
+ const month = Number(match[2]);
6718
+ const day = Number(match[3]);
6719
+ if (month < 1 || month > 12)
6720
+ return false;
6721
+ const leapYear = year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);
6722
+ const daysInMonth = [
6723
+ 31,
6724
+ leapYear ? 29 : 28,
6725
+ 31,
6726
+ 30,
6727
+ 31,
6728
+ 30,
6729
+ 31,
6730
+ 31,
6731
+ 30,
6732
+ 31,
6733
+ 30,
6734
+ 31
6735
+ ][month - 1];
6736
+ return day >= 1 && day <= daysInMonth;
6737
+ }
6082
6738
 
6083
- // node_modules/.pnpm/@paperclipai+shared@2026.529.0/node_modules/@paperclipai/shared/dist/validators/routine.js
6739
+ // node_modules/.pnpm/@paperclipai+shared@2026.707.0/node_modules/@paperclipai/shared/dist/validators/routine.js
6084
6740
  var routineVariableValueSchema = external_exports.union([external_exports.string(), external_exports.number().finite(), external_exports.boolean()]);
6085
6741
  var routineVariableSchema = external_exports.object({
6086
6742
  name: external_exports.string().trim().regex(/^[A-Za-z][A-Za-z0-9_]*$/),
@@ -6113,6 +6769,15 @@ var routineVariableSchema = external_exports.object({
6113
6769
  });
6114
6770
  }
6115
6771
  }
6772
+ if (value.type === "date" && value.defaultValue != null) {
6773
+ if (typeof value.defaultValue !== "string" || !isValidRoutineDateString(value.defaultValue)) {
6774
+ ctx.addIssue({
6775
+ code: external_exports.ZodIssueCode.custom,
6776
+ path: ["defaultValue"],
6777
+ message: "Date variable defaults must be valid YYYY-MM-DD calendar dates"
6778
+ });
6779
+ }
6780
+ }
6116
6781
  });
6117
6782
  var createRoutineSchema = external_exports.object({
6118
6783
  projectId: external_exports.string().uuid().optional().nullable(),
@@ -6145,7 +6810,8 @@ var routineRevisionSnapshotRoutineV1Schema = external_exports.object({
6145
6810
  concurrencyPolicy: external_exports.enum(ROUTINE_CONCURRENCY_POLICIES),
6146
6811
  catchUpPolicy: external_exports.enum(ROUTINE_CATCH_UP_POLICIES),
6147
6812
  variables: external_exports.array(routineVariableSchema),
6148
- env: envConfigSchema.nullable().default(null)
6813
+ env: envConfigSchema.nullable().default(null),
6814
+ responsibleUserId: external_exports.string().nullable().default(null)
6149
6815
  }).strict();
6150
6816
  var routineRevisionSnapshotTriggerV1Schema = external_exports.object({
6151
6817
  id: external_exports.string().uuid(),
@@ -6195,6 +6861,7 @@ var runRoutineSchema = external_exports.object({
6195
6861
  payload: external_exports.record(external_exports.string(), external_exports.unknown()).optional().nullable(),
6196
6862
  variables: external_exports.record(external_exports.string(), routineVariableValueSchema).optional().nullable(),
6197
6863
  projectId: external_exports.string().uuid().optional().nullable(),
6864
+ projectWorkspaceId: external_exports.string().uuid().optional().nullable(),
6198
6865
  assigneeAgentId: external_exports.string().uuid().optional().nullable(),
6199
6866
  idempotencyKey: external_exports.string().trim().max(255).optional().nullable(),
6200
6867
  source: external_exports.enum(["manual", "api"]).optional().default("manual"),
@@ -6204,7 +6871,7 @@ var runRoutineSchema = external_exports.object({
6204
6871
  });
6205
6872
  var rotateRoutineTriggerSecretSchema = external_exports.object({});
6206
6873
 
6207
- // node_modules/.pnpm/@paperclipai+shared@2026.529.0/node_modules/@paperclipai/shared/dist/validators/company-portability.js
6874
+ // node_modules/.pnpm/@paperclipai+shared@2026.707.0/node_modules/@paperclipai/shared/dist/validators/company-portability.js
6208
6875
  var portabilityIncludeSchema = external_exports.object({
6209
6876
  company: external_exports.boolean().optional(),
6210
6877
  agents: external_exports.boolean().optional(),
@@ -6425,13 +7092,219 @@ var portabilityAdapterOverrideSchema = external_exports.object({
6425
7092
  adapterConfig: external_exports.record(external_exports.string(), external_exports.unknown()).optional()
6426
7093
  });
6427
7094
  var companyPortabilityImportSchema = companyPortabilityPreviewSchema.extend({
6428
- adapterOverrides: external_exports.record(external_exports.string().min(1), portabilityAdapterOverrideSchema).optional()
7095
+ adapterOverrides: external_exports.record(external_exports.string().min(1), portabilityAdapterOverrideSchema).optional(),
7096
+ secretValues: external_exports.record(external_exports.string().min(1), external_exports.string()).optional()
6429
7097
  });
6430
7098
 
6431
- // node_modules/.pnpm/@paperclipai+shared@2026.529.0/node_modules/@paperclipai/shared/dist/validators/agent.js
6432
- var agentPermissionsSchema = external_exports.object({
6433
- canCreateAgents: external_exports.boolean().optional().default(false)
7099
+ // node_modules/.pnpm/@paperclipai+shared@2026.707.0/node_modules/@paperclipai/shared/dist/validators/teams-catalog.js
7100
+ var catalogTeamKindSchema = external_exports.enum(["bundled", "optional"]);
7101
+ var catalogTeamTrustLevelSchema = external_exports.enum([
7102
+ "markdown_only",
7103
+ "assets",
7104
+ "scripts_executables",
7105
+ "external_sources"
7106
+ ]);
7107
+ var catalogTeamCompatibilitySchema = external_exports.enum(["compatible", "unknown", "invalid"]);
7108
+ var catalogTeamFileKindSchema = external_exports.enum([
7109
+ "team",
7110
+ "agent",
7111
+ "project",
7112
+ "task",
7113
+ "skill",
7114
+ "extension",
7115
+ "readme",
7116
+ "reference",
7117
+ "script",
7118
+ "asset",
7119
+ "markdown",
7120
+ "other"
7121
+ ]);
7122
+ var catalogTeamSkillRequirementTypeSchema = external_exports.enum([
7123
+ "catalog",
7124
+ "local",
7125
+ "skills_sh",
7126
+ "github",
7127
+ "url",
7128
+ "local_path",
7129
+ "agent_package"
7130
+ ]);
7131
+ var catalogTeamSkillRequirementSchema = external_exports.object({
7132
+ type: catalogTeamSkillRequirementTypeSchema,
7133
+ ref: external_exports.string().min(1),
7134
+ agentSlugs: external_exports.array(external_exports.string().min(1)),
7135
+ resolved: external_exports.boolean(),
7136
+ catalogSkillId: external_exports.string().min(1).optional(),
7137
+ catalogSkillKey: external_exports.string().min(1).optional(),
7138
+ localPath: external_exports.string().min(1).optional(),
7139
+ sourceLocator: external_exports.string().min(1).optional(),
7140
+ sourceRef: external_exports.string().min(1).optional()
7141
+ });
7142
+ var catalogTeamEnvInputSummarySchema = external_exports.object({
7143
+ key: external_exports.string().min(1),
7144
+ agentSlug: external_exports.string().min(1).nullable(),
7145
+ projectSlug: external_exports.string().min(1).nullable(),
7146
+ kind: external_exports.enum(["secret", "plain"]),
7147
+ requirement: external_exports.enum(["required", "optional"])
7148
+ });
7149
+ var catalogTeamSourceRefSchema = external_exports.object({
7150
+ type: external_exports.enum(["skills_sh", "github", "url", "local_path", "agent_package", "include"]),
7151
+ ref: external_exports.string().min(1),
7152
+ pinned: external_exports.boolean()
7153
+ });
7154
+ var catalogTeamFileSchema = external_exports.object({
7155
+ path: external_exports.string().min(1),
7156
+ kind: catalogTeamFileKindSchema,
7157
+ sizeBytes: external_exports.number().int().nonnegative(),
7158
+ sha256: external_exports.string().min(1)
7159
+ });
7160
+ var catalogTeamSchema = external_exports.object({
7161
+ id: external_exports.string().min(1),
7162
+ key: external_exports.string().min(1),
7163
+ kind: catalogTeamKindSchema,
7164
+ category: external_exports.string().min(1),
7165
+ slug: external_exports.string().min(1),
7166
+ name: external_exports.string().min(1),
7167
+ description: external_exports.string(),
7168
+ path: external_exports.string().min(1),
7169
+ entrypoint: external_exports.literal("TEAM.md"),
7170
+ schema: external_exports.literal("agentcompanies/v1"),
7171
+ defaultInstall: external_exports.boolean(),
7172
+ recommendedForCompanyTypes: external_exports.array(external_exports.string()),
7173
+ tags: external_exports.array(external_exports.string()),
7174
+ counts: external_exports.object({
7175
+ agents: external_exports.number().int().nonnegative(),
7176
+ projects: external_exports.number().int().nonnegative(),
7177
+ tasks: external_exports.number().int().nonnegative(),
7178
+ routines: external_exports.number().int().nonnegative(),
7179
+ localSkills: external_exports.number().int().nonnegative(),
7180
+ catalogSkills: external_exports.number().int().nonnegative(),
7181
+ externalSkillSources: external_exports.number().int().nonnegative()
7182
+ }),
7183
+ rootAgentSlugs: external_exports.array(external_exports.string()),
7184
+ agentSlugs: external_exports.array(external_exports.string()),
7185
+ projectSlugs: external_exports.array(external_exports.string()),
7186
+ requiredSkills: external_exports.array(catalogTeamSkillRequirementSchema),
7187
+ envInputs: external_exports.array(catalogTeamEnvInputSummarySchema),
7188
+ sourceRefs: external_exports.array(catalogTeamSourceRefSchema),
7189
+ files: external_exports.array(catalogTeamFileSchema),
7190
+ trustLevel: catalogTeamTrustLevelSchema,
7191
+ compatibility: catalogTeamCompatibilitySchema,
7192
+ contentHash: external_exports.string().min(1),
7193
+ packageName: external_exports.string().min(1).optional(),
7194
+ packageVersion: external_exports.string().min(1).optional()
7195
+ });
7196
+ var catalogTeamListQuerySchema = external_exports.object({
7197
+ kind: catalogTeamKindSchema.optional(),
7198
+ category: external_exports.string().min(1).optional(),
7199
+ q: external_exports.string().min(1).optional()
7200
+ });
7201
+ var catalogTeamFileDetailSchema = external_exports.object({
7202
+ catalogTeamId: external_exports.string().min(1),
7203
+ path: external_exports.string().min(1),
7204
+ kind: catalogTeamFileKindSchema,
7205
+ content: external_exports.string(),
7206
+ language: external_exports.string().nullable(),
7207
+ markdown: external_exports.boolean()
7208
+ });
7209
+ var catalogTeamSourcePolicySchema = external_exports.object({
7210
+ allowExternalSources: external_exports.boolean().optional(),
7211
+ allowUnpinnedOptionalSources: external_exports.boolean().optional(),
7212
+ allowLocalPathSources: external_exports.boolean().optional()
7213
+ }).strict();
7214
+ var catalogTeamPreviewSchema = external_exports.object({
7215
+ targetManagerAgentId: external_exports.string().min(1).nullable().optional(),
7216
+ targetManagerSlug: external_exports.string().min(1).nullable().optional(),
7217
+ include: portabilityIncludeSchema.omit({ company: true }).strict().optional(),
7218
+ agents: portabilityAgentSelectionSchema.optional(),
7219
+ collisionStrategy: portabilityCollisionStrategySchema.optional(),
7220
+ nameOverrides: external_exports.record(external_exports.string().min(1), external_exports.string().min(1)).optional(),
7221
+ selectedFiles: external_exports.array(external_exports.string().min(1)).optional(),
7222
+ sourcePolicy: catalogTeamSourcePolicySchema.optional()
7223
+ }).strict();
7224
+ var catalogTeamInstallSchema = catalogTeamPreviewSchema.extend({
7225
+ adapterOverrides: external_exports.record(external_exports.string().min(1), portabilityAdapterOverrideSchema).optional(),
7226
+ secretValues: external_exports.record(external_exports.string().min(1), external_exports.string()).optional()
7227
+ }).strict();
7228
+ var catalogTeamSkillPreparationSchema = external_exports.object({
7229
+ type: catalogTeamSkillRequirementTypeSchema,
7230
+ ref: external_exports.string().min(1),
7231
+ agentSlugs: external_exports.array(external_exports.string().min(1)),
7232
+ action: external_exports.enum([
7233
+ "already_in_package",
7234
+ "catalog_install_required",
7235
+ "external_import_required",
7236
+ "blocked"
7237
+ ]),
7238
+ catalogSkillId: external_exports.string().min(1).nullable(),
7239
+ catalogSkillKey: external_exports.string().min(1).nullable(),
7240
+ sourceLocator: external_exports.string().min(1).nullable(),
7241
+ sourceRef: external_exports.string().min(1).nullable(),
7242
+ reason: external_exports.string().min(1).nullable()
7243
+ });
7244
+
7245
+ // node_modules/.pnpm/@paperclipai+shared@2026.707.0/node_modules/@paperclipai/shared/dist/validators/adapter-skills.js
7246
+ var agentSkillStateSchema = external_exports.enum([
7247
+ "available",
7248
+ "configured",
7249
+ "installed",
7250
+ "missing",
7251
+ "stale",
7252
+ "external"
7253
+ ]);
7254
+ var agentSkillOriginSchema = external_exports.enum([
7255
+ "company_managed",
7256
+ "user_installed",
7257
+ "external_unknown"
7258
+ ]);
7259
+ var agentSkillSyncModeSchema = external_exports.enum([
7260
+ "unsupported",
7261
+ "persistent",
7262
+ "ephemeral"
7263
+ ]);
7264
+ var agentDesiredSkillEntrySchema = external_exports.object({
7265
+ key: external_exports.string().min(1),
7266
+ versionId: external_exports.string().uuid().nullable()
7267
+ });
7268
+ var agentDesiredSkillSelectionSchema = external_exports.union([
7269
+ external_exports.string().min(1),
7270
+ agentDesiredSkillEntrySchema
7271
+ ]);
7272
+ var agentSkillEntrySchema = external_exports.object({
7273
+ key: external_exports.string().min(1),
7274
+ runtimeName: external_exports.string().min(1).nullable(),
7275
+ versionId: external_exports.string().uuid().nullable().optional(),
7276
+ currentVersionId: external_exports.string().uuid().nullable().optional(),
7277
+ desired: external_exports.boolean(),
7278
+ managed: external_exports.boolean(),
7279
+ state: agentSkillStateSchema,
7280
+ origin: agentSkillOriginSchema.optional(),
7281
+ originLabel: external_exports.string().nullable().optional(),
7282
+ locationLabel: external_exports.string().nullable().optional(),
7283
+ readOnly: external_exports.boolean().optional(),
7284
+ sourcePath: external_exports.string().nullable().optional(),
7285
+ targetPath: external_exports.string().nullable().optional(),
7286
+ detail: external_exports.string().nullable().optional()
7287
+ });
7288
+ var agentSkillSnapshotSchema = external_exports.object({
7289
+ adapterType: external_exports.string().min(1),
7290
+ supported: external_exports.boolean(),
7291
+ mode: agentSkillSyncModeSchema,
7292
+ desiredSkills: external_exports.array(external_exports.string().min(1)),
7293
+ desiredSkillEntries: external_exports.array(agentDesiredSkillEntrySchema).optional(),
7294
+ entries: external_exports.array(agentSkillEntrySchema),
7295
+ warnings: external_exports.array(external_exports.string())
7296
+ });
7297
+ var agentSkillSyncSchema = external_exports.object({
7298
+ desiredSkills: external_exports.array(agentDesiredSkillSelectionSchema)
6434
7299
  });
7300
+
7301
+ // node_modules/.pnpm/@paperclipai+shared@2026.707.0/node_modules/@paperclipai/shared/dist/validators/agent.js
7302
+ var agentPermissionsSchema = external_exports.object({
7303
+ canCreateAgents: external_exports.boolean().optional().default(false),
7304
+ canCreateSkills: external_exports.boolean().optional().default(true),
7305
+ trustPreset: trustPresetSchema.optional(),
7306
+ authorizationPolicy: trustAuthorizationPolicySchema.optional()
7307
+ }).catchall(external_exports.unknown());
6435
7308
  var agentInstructionsBundleModeSchema = external_exports.enum(["managed", "external"]);
6436
7309
  var updateAgentInstructionsBundleSchema = external_exports.object({
6437
7310
  mode: agentInstructionsBundleModeSchema.optional(),
@@ -6480,7 +7353,7 @@ var createAgentSchema = external_exports.object({
6480
7353
  icon: external_exports.enum(AGENT_ICON_NAMES).optional().nullable(),
6481
7354
  reportsTo: external_exports.string().uuid().optional().nullable(),
6482
7355
  capabilities: external_exports.string().optional().nullable(),
6483
- desiredSkills: external_exports.array(external_exports.string().min(1)).optional(),
7356
+ desiredSkills: external_exports.array(agentDesiredSkillSelectionSchema).optional(),
6484
7357
  adapterType: agentAdapterTypeSchema,
6485
7358
  adapterConfig: adapterConfigSchema.optional().default({}),
6486
7359
  instructionsBundle: createAgentInstructionsBundleSchema.optional(),
@@ -6504,8 +7377,34 @@ var updateAgentInstructionsPathSchema = external_exports.object({
6504
7377
  path: external_exports.string().trim().min(1).nullable(),
6505
7378
  adapterConfigKey: external_exports.string().trim().min(1).optional()
6506
7379
  });
7380
+ var taskBridgeAgentKeyScopeSchema = external_exports.object({
7381
+ kind: external_exports.literal("task_bridge"),
7382
+ projectId: external_exports.string().uuid().optional().nullable(),
7383
+ projectIds: external_exports.array(external_exports.string().uuid()).max(50).optional(),
7384
+ parentIssueId: external_exports.string().uuid().optional().nullable(),
7385
+ parentIssueIds: external_exports.array(external_exports.string().uuid()).max(50).optional(),
7386
+ allowedAssigneeAgentIds: external_exports.array(external_exports.string().uuid()).max(50).optional()
7387
+ }).strict().superRefine((value, ctx) => {
7388
+ const hasProjectBoundary = Boolean(value.projectId) || Boolean(value.projectIds?.length);
7389
+ const hasParentBoundary = Boolean(value.parentIssueId) || Boolean(value.parentIssueIds?.length);
7390
+ if (!hasProjectBoundary && !hasParentBoundary) {
7391
+ ctx.addIssue({
7392
+ code: external_exports.ZodIssueCode.custom,
7393
+ message: "task_bridge keys require at least one project or parent issue boundary",
7394
+ path: ["projectId"]
7395
+ });
7396
+ }
7397
+ });
7398
+ var standardAgentKeyScopeSchema = external_exports.object({
7399
+ kind: external_exports.literal("standard")
7400
+ }).strict();
7401
+ var agentApiKeyScopeSchema = external_exports.union([
7402
+ standardAgentKeyScopeSchema,
7403
+ taskBridgeAgentKeyScopeSchema
7404
+ ]);
6507
7405
  var createAgentKeySchema = external_exports.object({
6508
- name: external_exports.string().min(1).default("default")
7406
+ name: external_exports.string().min(1).default("default"),
7407
+ scope: agentApiKeyScopeSchema.optional().default({ kind: "standard" })
6509
7408
  });
6510
7409
  var agentMineInboxQuerySchema = external_exports.object({
6511
7410
  userId: external_exports.string().trim().min(1),
@@ -6534,10 +7433,13 @@ var testAdapterEnvironmentSchema = external_exports.object({
6534
7433
  });
6535
7434
  var updateAgentPermissionsSchema = external_exports.object({
6536
7435
  canCreateAgents: external_exports.boolean(),
6537
- canAssignTasks: external_exports.boolean()
7436
+ canCreateSkills: external_exports.boolean().optional(),
7437
+ canAssignTasks: external_exports.boolean(),
7438
+ trustPreset: trustPresetSchema.optional(),
7439
+ authorizationPolicy: trustAuthorizationPolicySchema.optional()
6538
7440
  });
6539
7441
 
6540
- // node_modules/.pnpm/@paperclipai+shared@2026.529.0/node_modules/@paperclipai/shared/dist/validators/project.js
7442
+ // node_modules/.pnpm/@paperclipai+shared@2026.707.0/node_modules/@paperclipai/shared/dist/validators/project.js
6541
7443
  var executionWorkspaceStrategySchema2 = external_exports.object({
6542
7444
  type: external_exports.enum(["project_primary", "git_worktree", "adapter_managed", "cloud_sandbox"]).optional(),
6543
7445
  baseRef: external_exports.string().optional().nullable(),
@@ -6557,7 +7459,8 @@ var projectExecutionWorkspacePolicySchema = external_exports.object({
6557
7459
  branchPolicy: external_exports.record(external_exports.string(), external_exports.unknown()).optional().nullable(),
6558
7460
  pullRequestPolicy: external_exports.record(external_exports.string(), external_exports.unknown()).optional().nullable(),
6559
7461
  runtimePolicy: external_exports.record(external_exports.string(), external_exports.unknown()).optional().nullable(),
6560
- cleanupPolicy: external_exports.record(external_exports.string(), external_exports.unknown()).optional().nullable()
7462
+ cleanupPolicy: external_exports.record(external_exports.string(), external_exports.unknown()).optional().nullable(),
7463
+ authorizationPolicy: trustAuthorizationPolicySchema.optional().nullable()
6561
7464
  }).strict();
6562
7465
  var projectWorkspaceRuntimeConfigSchema = external_exports.object({
6563
7466
  workspaceRuntime: external_exports.record(external_exports.string(), external_exports.unknown()).optional().nullable(),
@@ -6623,6 +7526,7 @@ var projectFields = {
6623
7526
  leadAgentId: external_exports.string().uuid().optional().nullable(),
6624
7527
  targetDate: external_exports.string().optional().nullable(),
6625
7528
  color: external_exports.string().optional().nullable(),
7529
+ icon: external_exports.enum(PROJECT_ICON_NAMES).optional().nullable(),
6626
7530
  env: envConfigSchema.optional().nullable(),
6627
7531
  executionWorkspacePolicy: projectExecutionWorkspacePolicySchema.optional().nullable(),
6628
7532
  archivedAt: external_exports.string().datetime().optional().nullable()
@@ -6633,7 +7537,7 @@ var createProjectSchema = external_exports.object({
6633
7537
  });
6634
7538
  var updateProjectSchema = external_exports.object(projectFields).partial();
6635
7539
 
6636
- // node_modules/.pnpm/@paperclipai+shared@2026.529.0/node_modules/@paperclipai/shared/dist/validators/document-annotation.js
7540
+ // node_modules/.pnpm/@paperclipai+shared@2026.707.0/node_modules/@paperclipai/shared/dist/validators/document-annotation.js
6637
7541
  var documentAnnotationThreadStatusSchema = external_exports.enum(DOCUMENT_ANNOTATION_THREAD_STATUSES);
6638
7542
  var documentAnnotationAnchorStateSchema = external_exports.enum(DOCUMENT_ANNOTATION_ANCHOR_STATES);
6639
7543
  var documentAnnotationAnchorConfidenceSchema = external_exports.enum(DOCUMENT_ANNOTATION_ANCHOR_CONFIDENCES);
@@ -6671,10 +7575,12 @@ var createDocumentAnnotationThreadSchema = external_exports.object({
6671
7575
  baseRevisionId: external_exports.string().uuid(),
6672
7576
  baseRevisionNumber: external_exports.number().int().positive(),
6673
7577
  selector: documentAnnotationAnchorSelectorSchema,
6674
- body: multilineTextSchema.pipe(external_exports.string().min(1).max(2e4))
7578
+ body: multilineTextSchema.pipe(external_exports.string().min(1).max(2e4)),
7579
+ issueCommentId: external_exports.string().uuid().nullable().optional()
6675
7580
  }).strict();
6676
7581
  var createDocumentAnnotationCommentSchema = external_exports.object({
6677
- body: multilineTextSchema.pipe(external_exports.string().min(1).max(2e4))
7582
+ body: multilineTextSchema.pipe(external_exports.string().min(1).max(2e4)),
7583
+ issueCommentId: external_exports.string().uuid().nullable().optional()
6678
7584
  }).strict();
6679
7585
  var updateDocumentAnnotationThreadSchema = external_exports.object({
6680
7586
  status: documentAnnotationThreadStatusSchema.optional()
@@ -6682,7 +7588,7 @@ var updateDocumentAnnotationThreadSchema = external_exports.object({
6682
7588
  message: "At least one field must be provided"
6683
7589
  });
6684
7590
 
6685
- // node_modules/.pnpm/@paperclipai+shared@2026.529.0/node_modules/@paperclipai/shared/dist/validators/search.js
7591
+ // node_modules/.pnpm/@paperclipai+shared@2026.707.0/node_modules/@paperclipai/shared/dist/validators/search.js
6686
7592
  var COMPANY_SEARCH_MAX_QUERY_LENGTH = 200;
6687
7593
  var COMPANY_SEARCH_DEFAULT_LIMIT = 20;
6688
7594
  var COMPANY_SEARCH_MAX_LIMIT = 50;
@@ -6704,7 +7610,7 @@ var companySearchQuerySchema = external_exports.object({
6704
7610
  offset: external_exports.unknown().optional().transform((value) => clampInteger(value, 0, 0, COMPANY_SEARCH_MAX_OFFSET))
6705
7611
  });
6706
7612
 
6707
- // node_modules/.pnpm/@paperclipai+shared@2026.529.0/node_modules/@paperclipai/shared/dist/validators/issue-tree-control.js
7613
+ // node_modules/.pnpm/@paperclipai+shared@2026.707.0/node_modules/@paperclipai/shared/dist/validators/issue-tree-control.js
6708
7614
  var issueTreeControlModeSchema = external_exports.enum(ISSUE_TREE_CONTROL_MODES);
6709
7615
  var issueTreeHoldReleasePolicySchema = external_exports.object({
6710
7616
  strategy: external_exports.enum(ISSUE_TREE_HOLD_RELEASE_POLICY_STRATEGIES).default("manual"),
@@ -6726,7 +7632,96 @@ var releaseIssueTreeHoldSchema = external_exports.object({
6726
7632
  metadata: external_exports.record(external_exports.string(), external_exports.unknown()).optional().nullable()
6727
7633
  }).strict();
6728
7634
 
6729
- // node_modules/.pnpm/@paperclipai+shared@2026.529.0/node_modules/@paperclipai/shared/dist/validators/work-product.js
7635
+ // node_modules/.pnpm/@paperclipai+shared@2026.707.0/node_modules/@paperclipai/shared/dist/validators/workspace-file-resource.js
7636
+ var workspaceFileListSearchMaxBytes = 128;
7637
+ function utf8ByteLength(value) {
7638
+ return new TextEncoder().encode(value).length;
7639
+ }
7640
+ var workspaceFileWorkspaceKindSchema = external_exports.enum(["execution_workspace", "project_workspace"]);
7641
+ var workspaceFileSelectorSchema = external_exports.enum(["auto", "execution", "project"]).default("auto");
7642
+ var workspaceFileListModeSchema = external_exports.enum(["all", "recent", "changed"]).default("all");
7643
+ var workspaceFilePreviewKindSchema = external_exports.enum(["text", "image", "video", "pdf", "unsupported"]);
7644
+ var workspaceFileResourceKindSchema = external_exports.enum(["file", "directory", "remote_resource"]);
7645
+ var workspaceFileRefSchema = external_exports.object({
7646
+ kind: external_exports.literal("workspace_file"),
7647
+ issueId: external_exports.string().uuid().optional(),
7648
+ projectId: external_exports.string().uuid().optional(),
7649
+ projectName: external_exports.string().min(1).optional(),
7650
+ workspaceKind: workspaceFileWorkspaceKindSchema,
7651
+ workspaceId: external_exports.string().uuid(),
7652
+ relativePath: external_exports.string().min(1),
7653
+ line: external_exports.number().int().positive().nullable().optional(),
7654
+ column: external_exports.number().int().positive().nullable().optional(),
7655
+ displayPath: external_exports.string().min(1)
7656
+ });
7657
+ var workspaceFileResourceQuerySchema = external_exports.object({
7658
+ projectId: external_exports.string().uuid().optional(),
7659
+ workspaceId: external_exports.string().uuid().optional(),
7660
+ path: external_exports.string().min(1).refine((value) => !/[\x00-\x1f\x7f]/.test(value), {
7661
+ message: "Workspace file path contains an invalid character",
7662
+ params: { code: "invalid_path" }
7663
+ }),
7664
+ workspace: workspaceFileSelectorSchema.optional()
7665
+ }).refine((value) => Boolean(value.projectId) === Boolean(value.workspaceId), {
7666
+ message: "Workspace file target requires both projectId and workspaceId",
7667
+ path: ["workspaceId"],
7668
+ params: { code: "invalid_target" }
7669
+ });
7670
+ var workspaceFileListQuerySchema = external_exports.object({
7671
+ projectId: external_exports.string().uuid().optional(),
7672
+ workspaceId: external_exports.string().uuid().optional(),
7673
+ workspace: workspaceFileSelectorSchema.optional(),
7674
+ path: external_exports.string().min(1).refine((value) => !/[\x00-\x1f\x7f]/.test(value), {
7675
+ message: "Workspace folder path contains an invalid character",
7676
+ params: { code: "invalid_path" }
7677
+ }).optional(),
7678
+ mode: workspaceFileListModeSchema.optional(),
7679
+ q: external_exports.string().refine((value) => !/[\x00-\x1f\x7f]/.test(value), {
7680
+ message: "Workspace file search contains an invalid character",
7681
+ params: { code: "invalid_query" }
7682
+ }).refine((value) => utf8ByteLength(value.trim()) <= workspaceFileListSearchMaxBytes, {
7683
+ message: "Workspace file search is too long",
7684
+ params: { code: "invalid_query" }
7685
+ }).optional(),
7686
+ limit: external_exports.coerce.number().int().min(1).max(100).default(25),
7687
+ offset: external_exports.coerce.number().int().min(0).max(1e4).default(0)
7688
+ }).refine((value) => Boolean(value.projectId) === Boolean(value.workspaceId), {
7689
+ message: "Workspace file target requires both projectId and workspaceId",
7690
+ path: ["workspaceId"],
7691
+ params: { code: "invalid_target" }
7692
+ });
7693
+ var resolvedWorkspaceResourceSchema = external_exports.object({
7694
+ kind: workspaceFileResourceKindSchema,
7695
+ provider: external_exports.string().min(1),
7696
+ title: external_exports.string().min(1),
7697
+ displayPath: external_exports.string().min(1),
7698
+ workspaceLabel: external_exports.string().min(1),
7699
+ workspaceKind: workspaceFileWorkspaceKindSchema,
7700
+ workspaceId: external_exports.string().uuid(),
7701
+ projectId: external_exports.string().uuid().nullable().optional(),
7702
+ projectName: external_exports.string().min(1).nullable().optional(),
7703
+ contentType: external_exports.string().nullable().optional(),
7704
+ byteSize: external_exports.number().int().nonnegative().nullable().optional(),
7705
+ previewKind: workspaceFilePreviewKindSchema,
7706
+ denialReason: external_exports.string().nullable().optional(),
7707
+ capabilities: external_exports.object({
7708
+ preview: external_exports.boolean(),
7709
+ download: external_exports.boolean(),
7710
+ listChildren: external_exports.boolean()
7711
+ })
7712
+ });
7713
+ var workspaceFileContentSchema = external_exports.object({
7714
+ resource: resolvedWorkspaceResourceSchema,
7715
+ content: external_exports.object({
7716
+ encoding: external_exports.enum(["utf8", "base64"]),
7717
+ data: external_exports.string()
7718
+ })
7719
+ });
7720
+
7721
+ // node_modules/.pnpm/@paperclipai+shared@2026.707.0/node_modules/@paperclipai/shared/dist/validators/work-product.js
7722
+ function attachmentContentPath(attachmentId) {
7723
+ return `/api/attachments/${attachmentId}/content`;
7724
+ }
6730
7725
  var issueWorkProductTypeSchema = external_exports.enum([
6731
7726
  "preview_url",
6732
7727
  "runtime_service",
@@ -6753,6 +7748,41 @@ var issueWorkProductReviewStateSchema = external_exports.enum([
6753
7748
  "approved",
6754
7749
  "changes_requested"
6755
7750
  ]);
7751
+ var attachmentArtifactWorkProductMetadataSchema = external_exports.object({
7752
+ attachmentId: external_exports.string().uuid(),
7753
+ contentType: external_exports.string().min(1),
7754
+ byteSize: external_exports.number().int().nonnegative(),
7755
+ contentPath: external_exports.string().min(1),
7756
+ openPath: external_exports.string().min(1),
7757
+ downloadPath: external_exports.string().min(1),
7758
+ originalFilename: external_exports.string().optional().nullable()
7759
+ }).superRefine((value, ctx) => {
7760
+ const contentPath = attachmentContentPath(value.attachmentId);
7761
+ if (value.contentPath !== contentPath) {
7762
+ ctx.addIssue({
7763
+ code: external_exports.ZodIssueCode.custom,
7764
+ path: ["contentPath"],
7765
+ message: "contentPath must point to the same-origin attachment content route"
7766
+ });
7767
+ }
7768
+ if (value.openPath !== contentPath) {
7769
+ ctx.addIssue({
7770
+ code: external_exports.ZodIssueCode.custom,
7771
+ path: ["openPath"],
7772
+ message: "openPath must point to the same-origin attachment content route"
7773
+ });
7774
+ }
7775
+ if (value.downloadPath !== `${contentPath}?download=1`) {
7776
+ ctx.addIssue({
7777
+ code: external_exports.ZodIssueCode.custom,
7778
+ path: ["downloadPath"],
7779
+ message: "downloadPath must point to the same-origin attachment download route"
7780
+ });
7781
+ }
7782
+ });
7783
+ var issueWorkProductMetadataSchema = external_exports.object({
7784
+ resourceRef: workspaceFileRefSchema.optional().nullable()
7785
+ }).passthrough();
6756
7786
  var createIssueWorkProductSchema = external_exports.object({
6757
7787
  projectId: external_exports.string().uuid().optional().nullable(),
6758
7788
  executionWorkspaceId: external_exports.string().uuid().optional().nullable(),
@@ -6767,12 +7797,76 @@ var createIssueWorkProductSchema = external_exports.object({
6767
7797
  isPrimary: external_exports.boolean().optional().default(false),
6768
7798
  healthStatus: external_exports.enum(["unknown", "healthy", "unhealthy"]).optional().default("unknown"),
6769
7799
  summary: external_exports.string().optional().nullable(),
6770
- metadata: external_exports.record(external_exports.string(), external_exports.unknown()).optional().nullable(),
7800
+ metadata: issueWorkProductMetadataSchema.optional().nullable(),
6771
7801
  createdByRunId: external_exports.string().uuid().optional().nullable()
6772
7802
  });
6773
7803
  var updateIssueWorkProductSchema = createIssueWorkProductSchema.partial();
6774
7804
 
6775
- // node_modules/.pnpm/@paperclipai+shared@2026.529.0/node_modules/@paperclipai/shared/dist/validators/goal.js
7805
+ // node_modules/.pnpm/@paperclipai+shared@2026.707.0/node_modules/@paperclipai/shared/dist/validators/artifact.js
7806
+ var COMPANY_ARTIFACTS_DEFAULT_LIMIT = 30;
7807
+ var COMPANY_ARTIFACTS_MAX_LIMIT = 100;
7808
+ var COMPANY_ARTIFACTS_MAX_QUERY_LENGTH = 160;
7809
+ var companyArtifactSourceSchema = external_exports.enum(["document", "attachment", "work_product"]);
7810
+ var companyArtifactMediaKindSchema = external_exports.enum(["image", "video", "text", "document", "file", "empty"]);
7811
+ var companyArtifactGroupBySchema = external_exports.enum(["none", "task", "parent_task"]);
7812
+ var companyArtifactsQuerySchema = external_exports.object({
7813
+ kind: external_exports.enum(["image", "video", "text", "document", "file", "all"]).optional().default("all"),
7814
+ projectId: external_exports.string().uuid().optional(),
7815
+ q: external_exports.string().trim().max(COMPANY_ARTIFACTS_MAX_QUERY_LENGTH).optional(),
7816
+ groupBy: companyArtifactGroupBySchema.optional().default("none"),
7817
+ groupIssueId: external_exports.string().uuid().optional(),
7818
+ limit: external_exports.coerce.number().int().min(1).max(COMPANY_ARTIFACTS_MAX_LIMIT).optional().default(COMPANY_ARTIFACTS_DEFAULT_LIMIT),
7819
+ cursor: external_exports.string().min(1).optional()
7820
+ });
7821
+ var companyArtifactSchema = external_exports.object({
7822
+ id: external_exports.string().min(1),
7823
+ source: companyArtifactSourceSchema,
7824
+ mediaKind: companyArtifactMediaKindSchema,
7825
+ title: external_exports.string(),
7826
+ previewText: external_exports.string().nullable(),
7827
+ contentType: external_exports.string().nullable(),
7828
+ contentPath: external_exports.string().nullable(),
7829
+ openPath: external_exports.string().nullable(),
7830
+ downloadPath: external_exports.string().nullable(),
7831
+ issue: external_exports.object({
7832
+ id: external_exports.string().uuid(),
7833
+ identifier: external_exports.string(),
7834
+ title: external_exports.string()
7835
+ }),
7836
+ project: external_exports.object({
7837
+ id: external_exports.string().uuid(),
7838
+ name: external_exports.string()
7839
+ }).nullable(),
7840
+ createdByAgent: external_exports.object({
7841
+ id: external_exports.string().uuid(),
7842
+ name: external_exports.string()
7843
+ }).nullable(),
7844
+ updatedAt: external_exports.string().datetime(),
7845
+ href: external_exports.string().min(1)
7846
+ });
7847
+ var companyArtifactGroupSchema = external_exports.object({
7848
+ id: external_exports.string().min(1),
7849
+ groupBy: companyArtifactGroupBySchema.exclude(["none"]),
7850
+ issue: external_exports.object({
7851
+ id: external_exports.string().uuid(),
7852
+ identifier: external_exports.string(),
7853
+ title: external_exports.string()
7854
+ }),
7855
+ title: external_exports.string(),
7856
+ count: external_exports.number().int().min(0),
7857
+ mediaKinds: external_exports.array(companyArtifactMediaKindSchema),
7858
+ previewArtifacts: external_exports.array(companyArtifactSchema),
7859
+ updatedAt: external_exports.string().datetime(),
7860
+ href: external_exports.string().min(1)
7861
+ });
7862
+ var companyArtifactsResponseSchema = external_exports.object({
7863
+ artifacts: external_exports.array(companyArtifactSchema),
7864
+ groups: external_exports.array(companyArtifactGroupSchema).optional(),
7865
+ selectedGroup: companyArtifactGroupSchema.nullable().optional(),
7866
+ nextCursor: external_exports.string().nullable()
7867
+ });
7868
+
7869
+ // node_modules/.pnpm/@paperclipai+shared@2026.707.0/node_modules/@paperclipai/shared/dist/validators/goal.js
6776
7870
  var createGoalSchema = external_exports.object({
6777
7871
  title: external_exports.string().min(1),
6778
7872
  description: external_exports.string().optional().nullable(),
@@ -6783,7 +7877,7 @@ var createGoalSchema = external_exports.object({
6783
7877
  });
6784
7878
  var updateGoalSchema = createGoalSchema.partial();
6785
7879
 
6786
- // node_modules/.pnpm/@paperclipai+shared@2026.529.0/node_modules/@paperclipai/shared/dist/validators/approval.js
7880
+ // node_modules/.pnpm/@paperclipai+shared@2026.707.0/node_modules/@paperclipai/shared/dist/validators/approval.js
6787
7881
  var createApprovalSchema = external_exports.object({
6788
7882
  type: external_exports.enum(APPROVAL_TYPES),
6789
7883
  requestedByAgentId: external_exports.string().uuid().optional().nullable(),
@@ -6803,7 +7897,7 @@ var addApprovalCommentSchema = external_exports.object({
6803
7897
  body: multilineTextSchema.pipe(external_exports.string().min(1))
6804
7898
  });
6805
7899
 
6806
- // node_modules/.pnpm/@paperclipai+shared@2026.529.0/node_modules/@paperclipai/shared/dist/validators/cost.js
7900
+ // node_modules/.pnpm/@paperclipai+shared@2026.707.0/node_modules/@paperclipai/shared/dist/validators/cost.js
6807
7901
  var createCostEventSchema = external_exports.object({
6808
7902
  agentId: external_exports.string().uuid(),
6809
7903
  issueId: external_exports.string().uuid().optional().nullable(),
@@ -6828,7 +7922,7 @@ var updateBudgetSchema = external_exports.object({
6828
7922
  budgetMonthlyCents: external_exports.number().int().nonnegative()
6829
7923
  });
6830
7924
 
6831
- // node_modules/.pnpm/@paperclipai+shared@2026.529.0/node_modules/@paperclipai/shared/dist/validators/finance.js
7925
+ // node_modules/.pnpm/@paperclipai+shared@2026.707.0/node_modules/@paperclipai/shared/dist/validators/finance.js
6832
7926
  var createFinanceEventSchema = external_exports.object({
6833
7927
  agentId: external_exports.string().uuid().optional().nullable(),
6834
7928
  issueId: external_exports.string().uuid().optional().nullable(),
@@ -6859,12 +7953,144 @@ var createFinanceEventSchema = external_exports.object({
6859
7953
  currency: value.currency.toUpperCase()
6860
7954
  }));
6861
7955
 
6862
- // node_modules/.pnpm/@paperclipai+shared@2026.529.0/node_modules/@paperclipai/shared/dist/validators/asset.js
7956
+ // node_modules/.pnpm/@paperclipai+shared@2026.707.0/node_modules/@paperclipai/shared/dist/validators/asset.js
6863
7957
  var createAssetImageMetadataSchema = external_exports.object({
6864
7958
  namespace: external_exports.string().trim().min(1).max(120).regex(/^[a-zA-Z0-9/_-]+$/).optional()
6865
7959
  });
6866
7960
 
6867
- // node_modules/.pnpm/@paperclipai+shared@2026.529.0/node_modules/@paperclipai/shared/dist/validators/access.js
7961
+ // node_modules/.pnpm/@paperclipai+shared@2026.707.0/node_modules/@paperclipai/shared/dist/validators/pipeline.js
7962
+ var routineVariableLikeNameSchema = external_exports.string().trim().regex(/^[A-Za-z][A-Za-z0-9_]*$/);
7963
+ var pipelineStageKindSchema = external_exports.enum(["working", "review", "done", "cancelled"]);
7964
+ var legacyPipelineStageKindSchema = external_exports.enum(["open", "working", "review", "done", "cancelled"]);
7965
+ var pipelineStageApproverSchema = external_exports.object({
7966
+ kind: external_exports.enum(["any_human", "user", "agent"]).optional().default("any_human"),
7967
+ id: external_exports.string().trim().min(1).max(200).optional()
7968
+ }).superRefine((value, ctx) => {
7969
+ if (value.kind !== "any_human" && (typeof value.id !== "string" || value.id.length === 0)) {
7970
+ ctx.addIssue({
7971
+ code: external_exports.ZodIssueCode.custom,
7972
+ path: ["id"],
7973
+ message: "Specific stage approvers require an id"
7974
+ });
7975
+ }
7976
+ });
7977
+ var pipelineStageOnEnterSchema = external_exports.object({
7978
+ type: external_exports.literal("run_routine"),
7979
+ routineId: external_exports.string().uuid(),
7980
+ id: external_exports.string().trim().min(1).max(200).optional(),
7981
+ projectId: external_exports.string().uuid().optional().nullable(),
7982
+ projectWorkspaceId: external_exports.string().uuid().optional().nullable(),
7983
+ executionWorkspaceId: external_exports.string().uuid().optional().nullable(),
7984
+ executionWorkspacePreference: external_exports.enum(ISSUE_EXECUTION_WORKSPACE_PREFERENCES).optional().nullable(),
7985
+ executionWorkspaceSettings: issueExecutionWorkspaceSettingsSchema.optional().nullable()
7986
+ }).passthrough();
7987
+ var pipelineStageAutomationSchema = external_exports.object({
7988
+ routineId: external_exports.string().uuid().optional().nullable(),
7989
+ assigneeAgentId: external_exports.string().uuid().optional().nullable(),
7990
+ instructionsBody: external_exports.string().optional().nullable(),
7991
+ projectId: external_exports.string().uuid().optional().nullable(),
7992
+ projectWorkspaceId: external_exports.string().uuid().optional().nullable(),
7993
+ executionWorkspaceId: external_exports.string().uuid().optional().nullable(),
7994
+ executionWorkspacePreference: external_exports.enum(ISSUE_EXECUTION_WORKSPACE_PREFERENCES).optional().nullable(),
7995
+ executionWorkspaceSettings: issueExecutionWorkspaceSettingsSchema.optional().nullable()
7996
+ }).passthrough();
7997
+ var pipelineStageCarryOverPolicySchema = external_exports.object({
7998
+ version: external_exports.literal(1).default(1),
7999
+ mode: external_exports.enum(["all_except", "only"]).default("all_except"),
8000
+ includeFields: external_exports.array(routineVariableLikeNameSchema).max(100).default([]),
8001
+ excludeFields: external_exports.array(routineVariableLikeNameSchema).max(100).default([])
8002
+ });
8003
+ var pipelineStageBreakdownSchema = external_exports.object({
8004
+ targetPipelineId: external_exports.string().uuid(),
8005
+ targetStageKey: external_exports.string().trim().min(1).max(120),
8006
+ pieceNoun: external_exports.string().trim().min(1).max(80).default("piece"),
8007
+ carryOverPolicy: pipelineStageCarryOverPolicySchema.optional(),
8008
+ inheritFields: external_exports.array(routineVariableLikeNameSchema).max(100).default([]),
8009
+ advanceTo: external_exports.string().trim().min(1).max(120).optional(),
8010
+ waitForPieces: external_exports.boolean().optional().default(false),
8011
+ whenFinishedMoveTo: external_exports.string().trim().min(1).max(120).optional()
8012
+ }).superRefine((value, ctx) => {
8013
+ if (value.waitForPieces && !value.whenFinishedMoveTo) {
8014
+ ctx.addIssue({
8015
+ code: external_exports.ZodIssueCode.custom,
8016
+ path: ["whenFinishedMoveTo"],
8017
+ message: "Breakdown stages that wait for pieces need a destination stage"
8018
+ });
8019
+ }
8020
+ });
8021
+ var pipelineStageVariableSchema = external_exports.object({
8022
+ key: routineVariableLikeNameSchema,
8023
+ label: external_exports.string().trim().max(120),
8024
+ type: external_exports.enum(["select", "text", "multiline"]).default("text"),
8025
+ options: external_exports.array(external_exports.string().trim().min(1).max(120)).max(50).optional().default([]),
8026
+ required: external_exports.boolean().optional().default(false),
8027
+ showInAddForm: external_exports.boolean().optional().default(false)
8028
+ }).superRefine((value, ctx) => {
8029
+ if (value.type === "select" && value.options.length === 0) {
8030
+ ctx.addIssue({
8031
+ code: external_exports.ZodIssueCode.custom,
8032
+ path: ["options"],
8033
+ message: "Select variables require at least one option"
8034
+ });
8035
+ }
8036
+ if (value.type !== "select" && value.options.length > 0) {
8037
+ ctx.addIssue({
8038
+ code: external_exports.ZodIssueCode.custom,
8039
+ path: ["options"],
8040
+ message: "Only select variables can define options"
8041
+ });
8042
+ }
8043
+ });
8044
+ var pipelineStageConfigSchema = external_exports.object({
8045
+ variables: external_exports.array(pipelineStageVariableSchema).default([]),
8046
+ disabled: external_exports.boolean().optional(),
8047
+ disabledReason: external_exports.string().trim().max(1e3).nullable().optional(),
8048
+ requireApproval: external_exports.boolean().optional(),
8049
+ approver: pipelineStageApproverSchema.optional(),
8050
+ /** Legacy input only; the server migrates it to requireApproval/approver. */
8051
+ reviewerKind: external_exports.enum(["human", "any"]).optional(),
8052
+ whatHappensHere: external_exports.string().trim().max(1e4).optional(),
8053
+ onEnter: pipelineStageOnEnterSchema.optional(),
8054
+ automation: pipelineStageAutomationSchema.optional(),
8055
+ breakdown: pipelineStageBreakdownSchema.optional(),
8056
+ approveToStageKey: external_exports.string().trim().min(1).max(120).optional(),
8057
+ rejectToStageKey: external_exports.string().trim().min(1).max(120).optional(),
8058
+ requestChangesToStageKey: external_exports.string().trim().min(1).max(120).optional(),
8059
+ requireRejectReason: external_exports.boolean().optional(),
8060
+ requireRequestChangesReason: external_exports.boolean().optional(),
8061
+ requireChildrenTerminal: external_exports.boolean().optional(),
8062
+ requireNoUnresolvedDrift: external_exports.boolean().optional()
8063
+ }).passthrough().superRefine((value, ctx) => {
8064
+ const keys = /* @__PURE__ */ new Set();
8065
+ value.variables.forEach((variable, index) => {
8066
+ if (keys.has(variable.key)) {
8067
+ ctx.addIssue({
8068
+ code: external_exports.ZodIssueCode.custom,
8069
+ path: ["variables", index, "key"],
8070
+ message: "Pipeline stage variable keys must be unique"
8071
+ });
8072
+ }
8073
+ keys.add(variable.key);
8074
+ });
8075
+ });
8076
+ var pipelineAutomationRetryScopeSchema = external_exports.enum(["current_stage", "previous_stage"]);
8077
+ var pipelineAutomationRetryCleanupOptionsSchema = external_exports.object({
8078
+ retireDirectChildren: external_exports.boolean().default(true),
8079
+ retireDescendants: external_exports.boolean().default(true),
8080
+ cancelLinkedAutomationIssues: external_exports.boolean().default(true)
8081
+ });
8082
+ var pipelineAutomationRetryRequestSchema = external_exports.object({
8083
+ scope: pipelineAutomationRetryScopeSchema,
8084
+ targetStageId: external_exports.string().uuid().nullable().optional(),
8085
+ expectedVersion: external_exports.number().int().positive(),
8086
+ cleanup: pipelineAutomationRetryCleanupOptionsSchema.default({
8087
+ retireDirectChildren: true,
8088
+ retireDescendants: true,
8089
+ cancelLinkedAutomationIssues: true
8090
+ })
8091
+ });
8092
+
8093
+ // node_modules/.pnpm/@paperclipai+shared@2026.707.0/node_modules/@paperclipai/shared/dist/validators/access.js
6868
8094
  var createCompanyInviteSchema = external_exports.object({
6869
8095
  allowedJoinTypes: external_exports.enum(INVITE_JOIN_TYPES).default("both"),
6870
8096
  humanRole: external_exports.enum(HUMAN_COMPANY_MEMBERSHIP_ROLES).optional().nullable(),
@@ -6912,6 +8138,11 @@ var createCliAuthChallengeSchema = external_exports.object({
6912
8138
  var resolveCliAuthChallengeSchema = external_exports.object({
6913
8139
  token: external_exports.string().min(16).max(256)
6914
8140
  });
8141
+ var createBoardApiKeySchema = external_exports.object({
8142
+ name: external_exports.string().trim().min(1).max(120).default("paperclipai cli"),
8143
+ expiresAt: external_exports.coerce.date().optional().nullable(),
8144
+ requestedCompanyId: external_exports.string().uuid().optional().nullable()
8145
+ });
6915
8146
  var updateMemberPermissionsSchema = external_exports.object({
6916
8147
  grants: external_exports.array(external_exports.object({
6917
8148
  permissionKey: external_exports.enum(PERMISSION_KEYS),
@@ -6982,7 +8213,7 @@ var updateCurrentUserProfileSchema = external_exports.object({
6982
8213
  image: external_exports.union([profileImageSchema, external_exports.literal(""), external_exports.null()]).optional().transform((value) => value === "" ? null : value)
6983
8214
  });
6984
8215
 
6985
- // node_modules/.pnpm/@paperclipai+shared@2026.529.0/node_modules/@paperclipai/shared/dist/validators/plugin.js
8216
+ // node_modules/.pnpm/@paperclipai+shared@2026.707.0/node_modules/@paperclipai/shared/dist/validators/plugin.js
6986
8217
  var jsonSchemaSchema = external_exports.record(external_exports.string(), external_exports.unknown()).refine((val) => {
6987
8218
  if (Object.keys(val).length === 0)
6988
8219
  return true;
@@ -7015,11 +8246,45 @@ var pluginToolDeclarationSchema = external_exports.object({
7015
8246
  description: external_exports.string().min(1),
7016
8247
  parametersSchema: jsonSchemaSchema
7017
8248
  });
8249
+ var pluginEnvironmentTemplateConfigFieldSchema = external_exports.string().min(1).max(100).regex(/^[A-Za-z_][A-Za-z0-9_-]*$/, "Template config binding fields must be top-level config keys using letters, digits, underscores, or hyphens").refine((value) => value !== "provider", {
8250
+ message: "Template config binding must not replace the sandbox provider key"
8251
+ });
8252
+ var pluginEnvironmentTemplateConfigBindingSchema = external_exports.object({
8253
+ field: pluginEnvironmentTemplateConfigFieldSchema,
8254
+ unsetFields: external_exports.array(pluginEnvironmentTemplateConfigFieldSchema).max(20).optional()
8255
+ }).strict().superRefine((value, ctx) => {
8256
+ const unsetFields = value.unsetFields ?? [];
8257
+ const seen = /* @__PURE__ */ new Set();
8258
+ for (const [index, field] of unsetFields.entries()) {
8259
+ if (field === value.field) {
8260
+ ctx.addIssue({
8261
+ code: external_exports.ZodIssueCode.custom,
8262
+ message: "Template config binding cannot unset the same field it sets",
8263
+ path: ["unsetFields", index]
8264
+ });
8265
+ }
8266
+ if (seen.has(field)) {
8267
+ ctx.addIssue({
8268
+ code: external_exports.ZodIssueCode.custom,
8269
+ message: "Template config binding unsetFields must be unique",
8270
+ path: ["unsetFields", index]
8271
+ });
8272
+ }
8273
+ seen.add(field);
8274
+ }
8275
+ });
7018
8276
  var pluginEnvironmentDriverDeclarationSchema = external_exports.object({
7019
8277
  driverKey: external_exports.string().min(1).regex(/^[a-z0-9][a-z0-9._-]*$/, "Environment driver key must start with a lowercase alphanumeric and contain only lowercase letters, digits, dots, hyphens, or underscores"),
7020
8278
  kind: external_exports.enum(["environment_driver", "sandbox_provider"]).optional(),
7021
8279
  displayName: external_exports.string().min(1).max(100),
7022
8280
  description: external_exports.string().max(500).optional(),
8281
+ supportsReusableLeases: external_exports.boolean().optional(),
8282
+ supportsInteractiveSetup: external_exports.boolean().optional(),
8283
+ interactiveSetupConnectionTypes: external_exports.array(external_exports.string().min(1).max(100)).max(10).optional(),
8284
+ supportsTemplateCapture: external_exports.boolean().optional(),
8285
+ templateRefKind: external_exports.string().min(1).max(100).optional(),
8286
+ templateConfigBinding: pluginEnvironmentTemplateConfigBindingSchema.optional(),
8287
+ supportsTemplateDelete: external_exports.boolean().optional(),
7023
8288
  configSchema: jsonSchemaSchema
7024
8289
  });
7025
8290
  var pluginManagedAgentDeclarationSchema = external_exports.object({
@@ -7340,6 +8605,44 @@ var pluginApiRouteDeclarationSchema = external_exports.object({
7340
8605
  external_exports.object({ from: external_exports.literal("issue"), param: external_exports.string().min(1) })
7341
8606
  ]).optional()
7342
8607
  });
8608
+ var pluginObjectReferenceRefreshPolicySchema = external_exports.object({
8609
+ defaultTtlSeconds: external_exports.number().int().positive().max(86400).optional(),
8610
+ staleAfterSeconds: external_exports.number().int().positive().max(604800).optional()
8611
+ }).superRefine((value, ctx) => {
8612
+ if (value.defaultTtlSeconds != null && value.staleAfterSeconds != null && value.staleAfterSeconds < value.defaultTtlSeconds) {
8613
+ ctx.addIssue({
8614
+ code: external_exports.ZodIssueCode.custom,
8615
+ message: "staleAfterSeconds must be greater than or equal to defaultTtlSeconds",
8616
+ path: ["staleAfterSeconds"]
8617
+ });
8618
+ }
8619
+ });
8620
+ var pluginObjectReferenceProviderDeclarationSchema = external_exports.object({
8621
+ providerKey: externalObjectProviderKeySchema,
8622
+ displayName: external_exports.string().min(1).max(100),
8623
+ objectTypes: external_exports.array(externalObjectTypeSchema).min(1),
8624
+ urlPatterns: external_exports.array(external_exports.string().trim().min(1).max(500)).optional(),
8625
+ refreshPolicy: pluginObjectReferenceRefreshPolicySchema.optional(),
8626
+ webhookEndpointKeys: external_exports.array(external_exports.string().min(1)).optional()
8627
+ }).superRefine((value, ctx) => {
8628
+ const duplicateObjectTypes = value.objectTypes.filter((type, i) => value.objectTypes.indexOf(type) !== i);
8629
+ if (duplicateObjectTypes.length > 0) {
8630
+ ctx.addIssue({
8631
+ code: external_exports.ZodIssueCode.custom,
8632
+ message: `Duplicate objectTypes: ${[...new Set(duplicateObjectTypes)].join(", ")}`,
8633
+ path: ["objectTypes"]
8634
+ });
8635
+ }
8636
+ const webhookKeys = value.webhookEndpointKeys ?? [];
8637
+ const duplicateWebhookKeys = webhookKeys.filter((key, i) => webhookKeys.indexOf(key) !== i);
8638
+ if (duplicateWebhookKeys.length > 0) {
8639
+ ctx.addIssue({
8640
+ code: external_exports.ZodIssueCode.custom,
8641
+ message: `Duplicate webhookEndpointKeys: ${[...new Set(duplicateWebhookKeys)].join(", ")}`,
8642
+ path: ["webhookEndpointKeys"]
8643
+ });
8644
+ }
8645
+ });
7343
8646
  var pluginManifestV1Schema = external_exports.object({
7344
8647
  id: external_exports.string().min(1).regex(/^[a-z0-9][a-z0-9._-]*$/, "Plugin id must start with a lowercase alphanumeric and contain only lowercase letters, digits, dots, hyphens, or underscores"),
7345
8648
  apiVersion: external_exports.literal(1),
@@ -7367,6 +8670,7 @@ var pluginManifestV1Schema = external_exports.object({
7367
8670
  routines: external_exports.array(pluginManagedRoutineDeclarationSchema).optional(),
7368
8671
  skills: external_exports.array(pluginManagedSkillDeclarationSchema).optional(),
7369
8672
  localFolders: external_exports.array(pluginLocalFolderDeclarationSchema).optional(),
8673
+ objectReferences: external_exports.array(pluginObjectReferenceProviderDeclarationSchema).optional(),
7370
8674
  launchers: external_exports.array(pluginLauncherDeclarationSchema).optional(),
7371
8675
  ui: external_exports.object({
7372
8676
  slots: external_exports.array(pluginUiSlotDeclarationSchema).min(1).optional(),
@@ -7479,6 +8783,29 @@ var pluginManifestV1Schema = external_exports.object({
7479
8783
  });
7480
8784
  }
7481
8785
  }
8786
+ if (manifest2.objectReferences && manifest2.objectReferences.length > 0) {
8787
+ for (const capability of ["external.objects.detect", "external.objects.read"]) {
8788
+ if (!manifest2.capabilities.includes(capability)) {
8789
+ ctx.addIssue({
8790
+ code: external_exports.ZodIssueCode.custom,
8791
+ message: `Capability '${capability}' is required when objectReferences are declared`,
8792
+ path: ["capabilities"]
8793
+ });
8794
+ }
8795
+ }
8796
+ const declaredWebhookKeys = new Set((manifest2.webhooks ?? []).map((webhook) => webhook.endpointKey));
8797
+ for (const [providerIndex, provider] of manifest2.objectReferences.entries()) {
8798
+ for (const endpointKey of provider.webhookEndpointKeys ?? []) {
8799
+ if (!declaredWebhookKeys.has(endpointKey)) {
8800
+ ctx.addIssue({
8801
+ code: external_exports.ZodIssueCode.custom,
8802
+ message: `objectReferences webhookEndpointKey "${endpointKey}" must match a declared webhook endpoint`,
8803
+ path: ["objectReferences", providerIndex, "webhookEndpointKeys"]
8804
+ });
8805
+ }
8806
+ }
8807
+ }
8808
+ }
7482
8809
  if (manifest2.database) {
7483
8810
  const requiredCapabilities = [
7484
8811
  "database.namespace.migrate",
@@ -7622,6 +8949,17 @@ var pluginManifestV1Schema = external_exports.object({
7622
8949
  });
7623
8950
  }
7624
8951
  }
8952
+ if (manifest2.objectReferences) {
8953
+ const providerKeys = manifest2.objectReferences.map((provider) => provider.providerKey);
8954
+ const duplicateProviders = providerKeys.filter((key, i) => providerKeys.indexOf(key) !== i);
8955
+ if (duplicateProviders.length > 0) {
8956
+ ctx.addIssue({
8957
+ code: external_exports.ZodIssueCode.custom,
8958
+ message: `Duplicate object reference provider keys: ${[...new Set(duplicateProviders)].join(", ")}`,
8959
+ path: ["objectReferences"]
8960
+ });
8961
+ }
8962
+ }
7625
8963
  if (manifest2.ui) {
7626
8964
  if (manifest2.ui.slots) {
7627
8965
  const slotIds = manifest2.ui.slots.map((s) => s.id);
@@ -7690,19 +9028,35 @@ var listPluginStateSchema = external_exports.object({
7690
9028
  namespace: external_exports.string().min(1).optional()
7691
9029
  });
7692
9030
 
7693
- // node_modules/.pnpm/@paperclipai+shared@2026.529.0/node_modules/@paperclipai/shared/dist/api.js
9031
+ // node_modules/.pnpm/@paperclipai+shared@2026.707.0/node_modules/@paperclipai/shared/dist/api.js
7694
9032
  var API_PREFIX = "/api";
7695
9033
  var API = {
7696
9034
  health: `${API_PREFIX}/health`,
7697
9035
  companies: `${API_PREFIX}/companies`,
7698
9036
  agents: `${API_PREFIX}/agents`,
7699
9037
  projects: `${API_PREFIX}/projects`,
9038
+ environments: `${API_PREFIX}/environments`,
9039
+ environmentCustomImageTemplate: `${API_PREFIX}/environments/:environmentId/custom-image-template`,
9040
+ environmentCustomImageTemplateDisable: `${API_PREFIX}/environments/:environmentId/custom-image-template`,
9041
+ environmentCustomImageTemplateRollback: `${API_PREFIX}/environments/:environmentId/custom-image-template/rollback`,
9042
+ environmentCustomImageSetupSessions: `${API_PREFIX}/environments/:environmentId/custom-image-setup-sessions`,
9043
+ environmentCustomImageSetupSession: `${API_PREFIX}/environment-custom-image-setup-sessions/:sessionId`,
9044
+ environmentCustomImageSetupSessionTerminalToken: `${API_PREFIX}/environment-custom-image-setup-sessions/:sessionId/terminal-session-token`,
9045
+ environmentCustomImageSetupSessionTerminalWs: `${API_PREFIX}/environment-custom-image-setup-sessions/:sessionId/terminal/ws`,
9046
+ environmentCustomImageSetupSessionFinish: `${API_PREFIX}/environment-custom-image-setup-sessions/:sessionId/finish`,
9047
+ environmentCustomImageSetupSessionCancel: `${API_PREFIX}/environment-custom-image-setup-sessions/:sessionId/cancel`,
7700
9048
  issues: `${API_PREFIX}/issues`,
9049
+ issueWatchdog: `${API_PREFIX}/issues/:issueId/watchdog`,
7701
9050
  issueTreeControl: `${API_PREFIX}/issues/:issueId/tree-control`,
7702
9051
  issueTreeHolds: `${API_PREFIX}/issues/:issueId/tree-holds`,
7703
9052
  goals: `${API_PREFIX}/goals`,
7704
9053
  approvals: `${API_PREFIX}/approvals`,
7705
9054
  secrets: `${API_PREFIX}/secrets`,
9055
+ userSecretDefinitions: `${API_PREFIX}/companies/:companyId/user-secret-definitions`,
9056
+ userSecretDefinition: `${API_PREFIX}/companies/:companyId/user-secret-definitions/:definitionId`,
9057
+ userSecretDefinitionCoverage: `${API_PREFIX}/companies/:companyId/user-secret-definitions/:definitionId/coverage`,
9058
+ myUserSecrets: `${API_PREFIX}/companies/:companyId/me/user-secrets`,
9059
+ myUserSecret: `${API_PREFIX}/companies/:companyId/me/user-secrets/:secretId`,
7706
9060
  secretProviderConfigs: `${API_PREFIX}/secret-provider-configs`,
7707
9061
  secretProviderConfigDiscoveryPreview: `${API_PREFIX}/companies/:companyId/secret-provider-configs/discovery/preview`,
7708
9062
  costs: `${API_PREFIX}/costs`,
@@ -7717,19 +9071,7 @@ var API = {
7717
9071
  admin: `${API_PREFIX}/admin`
7718
9072
  };
7719
9073
 
7720
- // node_modules/.pnpm/@paperclipai+shared@2026.529.0/node_modules/@paperclipai/shared/dist/routine-variables.js
7721
- var HUMAN_TIMESTAMP_FORMATTER = new Intl.DateTimeFormat("en-US", {
7722
- year: "numeric",
7723
- month: "long",
7724
- day: "numeric",
7725
- hour: "numeric",
7726
- minute: "2-digit",
7727
- hour12: true,
7728
- timeZone: "UTC",
7729
- timeZoneName: "short"
7730
- });
7731
-
7732
- // node_modules/.pnpm/@paperclipai+shared@2026.529.0/node_modules/@paperclipai/shared/dist/config-schema.js
9074
+ // node_modules/.pnpm/@paperclipai+shared@2026.707.0/node_modules/@paperclipai/shared/dist/config-schema.js
7733
9075
  var configMetaSchema = external_exports.object({
7734
9076
  version: external_exports.literal(1),
7735
9077
  updatedAt: external_exports.string(),
@@ -7885,14 +9227,26 @@ var paperclipConfigSchema = external_exports.object({
7885
9227
  }
7886
9228
  });
7887
9229
 
7888
- // node_modules/.pnpm/@paperclipai+plugin-sdk@2026.529.0_react@19.2.4/node_modules/@paperclipai/plugin-sdk/dist/worker-rpc-host.js
9230
+ // node_modules/.pnpm/@paperclipai+shared@2026.707.0/node_modules/@paperclipai/shared/dist/validators/adapter-registry.js
9231
+ var adapterRegistryEntrySchema = external_exports.object({
9232
+ adapterType: external_exports.string().min(1),
9233
+ enabled: external_exports.boolean().default(true),
9234
+ runtimeImage: external_exports.string().optional(),
9235
+ envKeys: external_exports.array(external_exports.string()).optional(),
9236
+ allowFqdns: external_exports.array(external_exports.string()).optional(),
9237
+ probeCommand: external_exports.array(external_exports.string()).optional(),
9238
+ defaultEnv: external_exports.record(external_exports.string()).optional()
9239
+ }).strict();
9240
+ var adapterRegistrySchema = external_exports.array(adapterRegistryEntrySchema);
9241
+
9242
+ // node_modules/.pnpm/@paperclipai+plugin-sdk@2026.707.0_react@19.2.4/node_modules/@paperclipai/plugin-sdk/dist/worker-rpc-host.js
7889
9243
  import fs from "node:fs";
7890
9244
  import { AsyncLocalStorage } from "node:async_hooks";
7891
9245
  import path from "node:path";
7892
9246
  import { createInterface } from "node:readline";
7893
9247
  import { fileURLToPath } from "node:url";
7894
9248
 
7895
- // node_modules/.pnpm/@paperclipai+plugin-sdk@2026.529.0_react@19.2.4/node_modules/@paperclipai/plugin-sdk/dist/protocol.js
9249
+ // node_modules/.pnpm/@paperclipai+plugin-sdk@2026.707.0_react@19.2.4/node_modules/@paperclipai/plugin-sdk/dist/protocol.js
7896
9250
  var JSONRPC_VERSION = "2.0";
7897
9251
  var JSONRPC_ERROR_CODES = {
7898
9252
  /** Invalid JSON was received by the server. */
@@ -8024,7 +9378,7 @@ var JsonRpcCallError = class extends Error {
8024
9378
  }
8025
9379
  };
8026
9380
 
8027
- // node_modules/.pnpm/@paperclipai+plugin-sdk@2026.529.0_react@19.2.4/node_modules/@paperclipai/plugin-sdk/dist/worker-rpc-host.js
9381
+ // node_modules/.pnpm/@paperclipai+plugin-sdk@2026.707.0_react@19.2.4/node_modules/@paperclipai/plugin-sdk/dist/worker-rpc-host.js
8028
9382
  var DEFAULT_RPC_TIMEOUT_MS = 3e4;
8029
9383
  function realpathOrResolvedPath(filePath) {
8030
9384
  const resolvedPath = path.resolve(filePath);
@@ -8572,6 +9926,17 @@ function startWorkerRpcHost(options) {
8572
9926
  authorAgentId: options2?.authorAgentId
8573
9927
  });
8574
9928
  },
9929
+ async requestCheckboxConfirmation(issueId, interaction, companyId, options2) {
9930
+ return callHost("issues.createInteraction", {
9931
+ issueId,
9932
+ companyId,
9933
+ interaction: {
9934
+ ...interaction,
9935
+ kind: "request_checkbox_confirmation"
9936
+ },
9937
+ authorAgentId: options2?.authorAgentId
9938
+ });
9939
+ },
8575
9940
  documents: {
8576
9941
  async list(issueId, companyId) {
8577
9942
  return callHost("issues.documents.list", { issueId, companyId });
@@ -8901,6 +10266,12 @@ function startWorkerRpcHost(options) {
8901
10266
  return handlePerformAction(params);
8902
10267
  case "executeTool":
8903
10268
  return handleExecuteTool(params);
10269
+ case "detectExternalObjects":
10270
+ return handleDetectExternalObjects(params);
10271
+ case "resolveExternalObject":
10272
+ return handleResolveExternalObject(params);
10273
+ case "refreshExternalObjects":
10274
+ return handleRefreshExternalObjects(params);
8904
10275
  case "environmentValidateConfig":
8905
10276
  return handleEnvironmentValidateConfig(params);
8906
10277
  case "environmentProbe":
@@ -8917,6 +10288,16 @@ function startWorkerRpcHost(options) {
8917
10288
  return handleEnvironmentRealizeWorkspace(params);
8918
10289
  case "environmentExecute":
8919
10290
  return handleEnvironmentExecute(params);
10291
+ case "environmentStartInteractiveSetup":
10292
+ return handleEnvironmentStartInteractiveSetup(params);
10293
+ case "environmentGetInteractiveSetup":
10294
+ return handleEnvironmentGetInteractiveSetup(params);
10295
+ case "environmentCaptureTemplate":
10296
+ return handleEnvironmentCaptureTemplate(params);
10297
+ case "environmentCancelInteractiveSetup":
10298
+ return handleEnvironmentCancelInteractiveSetup(params);
10299
+ case "environmentDeleteTemplate":
10300
+ return handleEnvironmentDeleteTemplate(params);
8920
10301
  default:
8921
10302
  throw Object.assign(new Error(`Unknown method: ${method}`), { code: JSONRPC_ERROR_CODES.METHOD_NOT_FOUND });
8922
10303
  }
@@ -8941,6 +10322,12 @@ function startWorkerRpcHost(options) {
8941
10322
  supportedMethods.push("shutdown");
8942
10323
  if (plugin2.definition.onApiRequest)
8943
10324
  supportedMethods.push("handleApiRequest");
10325
+ if (plugin2.definition.onDetectExternalObjects)
10326
+ supportedMethods.push("detectExternalObjects");
10327
+ if (plugin2.definition.onResolveExternalObject)
10328
+ supportedMethods.push("resolveExternalObject");
10329
+ if (plugin2.definition.onRefreshExternalObjects)
10330
+ supportedMethods.push("refreshExternalObjects");
8944
10331
  if (plugin2.definition.onEnvironmentValidateConfig)
8945
10332
  supportedMethods.push("environmentValidateConfig");
8946
10333
  if (plugin2.definition.onEnvironmentProbe)
@@ -8957,6 +10344,16 @@ function startWorkerRpcHost(options) {
8957
10344
  supportedMethods.push("environmentRealizeWorkspace");
8958
10345
  if (plugin2.definition.onEnvironmentExecute)
8959
10346
  supportedMethods.push("environmentExecute");
10347
+ if (plugin2.definition.onEnvironmentStartInteractiveSetup)
10348
+ supportedMethods.push("environmentStartInteractiveSetup");
10349
+ if (plugin2.definition.onEnvironmentGetInteractiveSetup)
10350
+ supportedMethods.push("environmentGetInteractiveSetup");
10351
+ if (plugin2.definition.onEnvironmentCaptureTemplate)
10352
+ supportedMethods.push("environmentCaptureTemplate");
10353
+ if (plugin2.definition.onEnvironmentCancelInteractiveSetup)
10354
+ supportedMethods.push("environmentCancelInteractiveSetup");
10355
+ if (plugin2.definition.onEnvironmentDeleteTemplate)
10356
+ supportedMethods.push("environmentDeleteTemplate");
8960
10357
  return { ok: true, supportedMethods };
8961
10358
  }
8962
10359
  async function handleHealth() {
@@ -9077,6 +10474,24 @@ function startWorkerRpcHost(options) {
9077
10474
  }
9078
10475
  return entry.fn(params.parameters, params.runContext);
9079
10476
  }
10477
+ async function handleDetectExternalObjects(params) {
10478
+ if (!plugin2.definition.onDetectExternalObjects) {
10479
+ throw methodNotImplemented("detectExternalObjects");
10480
+ }
10481
+ return plugin2.definition.onDetectExternalObjects(params);
10482
+ }
10483
+ async function handleResolveExternalObject(params) {
10484
+ if (!plugin2.definition.onResolveExternalObject) {
10485
+ throw methodNotImplemented("resolveExternalObject");
10486
+ }
10487
+ return plugin2.definition.onResolveExternalObject(params);
10488
+ }
10489
+ async function handleRefreshExternalObjects(params) {
10490
+ if (!plugin2.definition.onRefreshExternalObjects) {
10491
+ throw methodNotImplemented("refreshExternalObjects");
10492
+ }
10493
+ return plugin2.definition.onRefreshExternalObjects(params);
10494
+ }
9080
10495
  function methodNotImplemented(method) {
9081
10496
  return Object.assign(new Error(`${method} is not implemented by this plugin`), { code: PLUGIN_RPC_ERROR_CODES.METHOD_NOT_IMPLEMENTED });
9082
10497
  }
@@ -9128,6 +10543,36 @@ function startWorkerRpcHost(options) {
9128
10543
  }
9129
10544
  return plugin2.definition.onEnvironmentExecute(params);
9130
10545
  }
10546
+ async function handleEnvironmentStartInteractiveSetup(params) {
10547
+ if (!plugin2.definition.onEnvironmentStartInteractiveSetup) {
10548
+ throw methodNotImplemented("environmentStartInteractiveSetup");
10549
+ }
10550
+ return plugin2.definition.onEnvironmentStartInteractiveSetup(params);
10551
+ }
10552
+ async function handleEnvironmentGetInteractiveSetup(params) {
10553
+ if (!plugin2.definition.onEnvironmentGetInteractiveSetup) {
10554
+ throw methodNotImplemented("environmentGetInteractiveSetup");
10555
+ }
10556
+ return plugin2.definition.onEnvironmentGetInteractiveSetup(params);
10557
+ }
10558
+ async function handleEnvironmentCaptureTemplate(params) {
10559
+ if (!plugin2.definition.onEnvironmentCaptureTemplate) {
10560
+ throw methodNotImplemented("environmentCaptureTemplate");
10561
+ }
10562
+ return plugin2.definition.onEnvironmentCaptureTemplate(params);
10563
+ }
10564
+ async function handleEnvironmentCancelInteractiveSetup(params) {
10565
+ if (!plugin2.definition.onEnvironmentCancelInteractiveSetup) {
10566
+ throw methodNotImplemented("environmentCancelInteractiveSetup");
10567
+ }
10568
+ return plugin2.definition.onEnvironmentCancelInteractiveSetup(params);
10569
+ }
10570
+ async function handleEnvironmentDeleteTemplate(params) {
10571
+ if (!plugin2.definition.onEnvironmentDeleteTemplate) {
10572
+ throw methodNotImplemented("environmentDeleteTemplate");
10573
+ }
10574
+ return plugin2.definition.onEnvironmentDeleteTemplate(params);
10575
+ }
9131
10576
  function allowsEvent(filter, event) {
9132
10577
  const payload = event.payload;
9133
10578
  if (filter.companyId !== void 0) {
@@ -9270,11 +10715,12 @@ import { fileURLToPath as fileURLToPath2 } from "node:url";
9270
10715
  var manifest = {
9271
10716
  id: "starlein.paperclip-plugin-company-wizard",
9272
10717
  apiVersion: 1,
9273
- version: "0.4.18",
10718
+ version: "0.4.21",
9274
10719
  displayName: "Company Wizard",
9275
10720
  description: "AI-powered wizard to bootstrap agent companies from composable templates",
9276
10721
  author: "Sascha Pietrowski <sp@speednetwork.de>",
9277
10722
  categories: ["workspace", "ui"],
10723
+ minimumHostVersion: "2026.707.0",
9278
10724
  capabilities: [
9279
10725
  "companies.read",
9280
10726
  "issues.create",
@@ -9284,6 +10730,7 @@ var manifest = {
9284
10730
  "goals.read",
9285
10731
  "agents.read",
9286
10732
  "projects.read",
10733
+ "skills.managed",
9287
10734
  "plugin.state.read",
9288
10735
  "plugin.state.write",
9289
10736
  "secrets.read-ref",
@@ -9363,12 +10810,12 @@ import { join } from "node:path";
9363
10810
 
9364
10811
  // src/logic/ceo-defaults.js
9365
10812
  var DEFAULT_CEO_ADAPTER_TYPE = "codex_local";
9366
- var DEFAULT_CEO_MODEL = "gpt-5.5";
10813
+ var DEFAULT_CEO_MODEL = "gpt-5.6";
9367
10814
  var DEFAULT_CEO_THINKING_LEVEL = "high";
9368
10815
  var DEFAULT_WORKER_THINKING_LEVEL = "auto";
9369
10816
  var DEFAULT_CEO_MAX_CONCURRENT_RUNS = 1;
9370
10817
  var DEFAULT_CEO_HEARTBEAT_INTERVAL_SEC = 3600;
9371
- var DEFAULT_CLAUDE_CEO_MODEL = "claude-opus-4-6";
10818
+ var DEFAULT_CLAUDE_CEO_MODEL = "claude-opus-4-8";
9372
10819
  function asTrimmedString(value) {
9373
10820
  return typeof value === "string" ? value.trim() : "";
9374
10821
  }
@@ -9446,6 +10893,66 @@ function buildWorkerAgentRuntimeConfig() {
9446
10893
  };
9447
10894
  }
9448
10895
 
10896
+ // src/logic/resolve.js
10897
+ import { createHash } from "node:crypto";
10898
+ function skillSlug(baseName, variant) {
10899
+ return variant === "fallback" ? `${baseName}-fallback` : baseName;
10900
+ }
10901
+ function humanizeSkillName(baseName, variant) {
10902
+ const words = String(baseName).split(/[-_]/).filter(Boolean).map((w) => w.charAt(0).toUpperCase() + w.slice(1)).join(" ");
10903
+ return variant === "fallback" ? `${words} (fallback)` : words;
10904
+ }
10905
+ function hashSkillContent(markdown) {
10906
+ return createHash("sha256").update(String(markdown), "utf-8").digest("hex").slice(0, 16);
10907
+ }
10908
+ function buildCompanySkillSet(records) {
10909
+ const byBaseSlug = /* @__PURE__ */ new Map();
10910
+ for (const rec of records) {
10911
+ if (!byBaseSlug.has(rec.baseSlug)) byBaseSlug.set(rec.baseSlug, []);
10912
+ byBaseSlug.get(rec.baseSlug).push(rec);
10913
+ }
10914
+ const companySkills = [];
10915
+ const roleSkillSlugs = /* @__PURE__ */ new Map();
10916
+ const addRoleSlug = (roleName, slug) => {
10917
+ if (!roleSkillSlugs.has(roleName)) roleSkillSlugs.set(roleName, []);
10918
+ const list = roleSkillSlugs.get(roleName);
10919
+ if (!list.includes(slug)) list.push(slug);
10920
+ };
10921
+ for (const baseSlug of [...byBaseSlug.keys()].sort()) {
10922
+ const byHash = /* @__PURE__ */ new Map();
10923
+ for (const rec of byBaseSlug.get(baseSlug)) {
10924
+ const hash = hashSkillContent(rec.markdown);
10925
+ if (!byHash.has(hash)) byHash.set(hash, { hash, rec, roles: [] });
10926
+ byHash.get(hash).roles.push(rec.roleName);
10927
+ }
10928
+ const groups = [...byHash.values()].map((g) => ({ ...g, repRole: [...g.roles].sort()[0] })).sort((a, b) => a.repRole.localeCompare(b.repRole));
10929
+ groups.forEach((group, idx) => {
10930
+ const slug = idx === 0 ? baseSlug : `${baseSlug}-${group.repRole}`;
10931
+ companySkills.push({
10932
+ slug,
10933
+ name: group.rec.name,
10934
+ description: group.rec.description,
10935
+ categories: group.rec.categories,
10936
+ markdown: group.rec.markdown,
10937
+ contentHash: group.hash
10938
+ });
10939
+ for (const roleName of group.roles) addRoleSlug(roleName, slug);
10940
+ });
10941
+ }
10942
+ return { companySkills, roleSkillSlugs };
10943
+ }
10944
+
10945
+ // src/logic/routines.js
10946
+ function routineUsesProjectWorkspace(routine) {
10947
+ return routine?.useProjectWorkspace !== false;
10948
+ }
10949
+ function routineProjectPayload(routine, mainProjectId, { sync = false } = {}) {
10950
+ if (!routineUsesProjectWorkspace(routine)) {
10951
+ return sync ? { projectId: null } : {};
10952
+ }
10953
+ return mainProjectId ? { projectId: mainProjectId } : {};
10954
+ }
10955
+
9449
10956
  // src/logic/assemble.js
9450
10957
  async function exists(p) {
9451
10958
  try {
@@ -9704,6 +11211,7 @@ ${stages.join("\n")}
9704
11211
  });
9705
11212
  }
9706
11213
  initialIssues.unshift(...resolvedUserIssues);
11214
+ const skillRecords = [];
9707
11215
  for (const moduleName of moduleNames) {
9708
11216
  const moduleDir = join(templatesDir, "modules", moduleName);
9709
11217
  if (!await exists(moduleDir)) {
@@ -9799,30 +11307,33 @@ ${stages.join("\n")}
9799
11307
  async function installSkill(roleName, fileName, label) {
9800
11308
  const resolved = await resolveSkillFile(roleName, fileName);
9801
11309
  if (!resolved) return false;
9802
- const destSkillsDir = join(companyDir, "agents", roleName, "skills");
9803
- await mkdir(destSkillsDir, { recursive: true });
9804
- const destFile = join(destSkillsDir, fileName);
9805
- await copyFile(resolved.path, destFile);
11310
+ const baseName = fileName.replace(/\.md$/, "").replace(/\.fallback$/, "");
11311
+ const variant = fileName.endsWith(".fallback.md") ? "fallback" : "primary";
11312
+ let markdown = await readFile(resolved.path, "utf-8");
9806
11313
  let barApplied = false;
9807
11314
  if (enableEnrichedPersonas && label === "primary") {
9808
- const barFileName = fileName.replace(/\.md$/, ".bar.md");
9809
- const bar = await resolveSkillFile(roleName, barFileName);
11315
+ const bar = await resolveSkillFile(roleName, fileName.replace(/\.md$/, ".bar.md"));
9810
11316
  if (bar) {
9811
11317
  const barContent = await readFile(bar.path, "utf-8");
9812
- await appendToFile(destFile, "\n" + barContent.trim() + "\n");
11318
+ markdown = `${markdown.trimEnd()}
11319
+
11320
+ ${barContent.trim()}
11321
+ `;
9813
11322
  barApplied = true;
9814
11323
  }
9815
11324
  }
9816
- await appendToFile(
9817
- join(companyDir, "agents", roleName, "AGENTS.md"),
9818
- `
9819
- Read and follow: \`skills/${fileName}\`
9820
- `
9821
- );
11325
+ skillRecords.push({
11326
+ roleName,
11327
+ baseSlug: skillSlug(baseName, variant),
11328
+ name: humanizeSkillName(baseName, variant),
11329
+ description: `${moduleName} \u2014 ${variant} skill`,
11330
+ categories: [moduleName],
11331
+ markdown
11332
+ });
9822
11333
  const sourceTag = resolved.source === "shared" ? ", shared" : "";
9823
11334
  const barTag = barApplied ? ", output bar" : "";
9824
11335
  onProgress(
9825
- `+ agents/${roleName}/skills/${fileName} (${moduleName}, ${label}${sourceTag}${barTag})`
11336
+ `+ skill ${skillSlug(baseName, variant)} \u2192 ${roleName} (${moduleName}, ${label}${sourceTag}${barTag})`
9826
11337
  );
9827
11338
  return true;
9828
11339
  }
@@ -9849,20 +11360,38 @@ Read and follow: \`skills/${fileName}\`
9849
11360
  const skillName = skillFile.replace(/\.md$/, "");
9850
11361
  const skillBaseName = skillName.replace(/\.fallback$/, "");
9851
11362
  if (capabilityOwners.has(skillBaseName)) continue;
9852
- const destSkillsDir = join(companyDir, "agents", role.name, "skills");
9853
- await mkdir(destSkillsDir, { recursive: true });
9854
- await copyFile(join(skillsDir, skillFile), join(destSkillsDir, skillFile));
9855
- await appendToFile(
9856
- join(companyDir, "agents", role.name, "AGENTS.md"),
9857
- `
9858
- Read and follow: \`skills/${skillFile}\`
9859
- `
9860
- );
9861
- onProgress(`+ agents/${role.name}/skills/${skillFile} (${moduleName})`);
11363
+ const baseName = skillName.replace(/\.fallback$/, "");
11364
+ const variant = skillFile.endsWith(".fallback.md") ? "fallback" : "primary";
11365
+ const markdown = await readFile(join(skillsDir, skillFile), "utf-8");
11366
+ skillRecords.push({
11367
+ roleName: role.name,
11368
+ baseSlug: skillSlug(baseName, variant),
11369
+ name: humanizeSkillName(baseName, variant),
11370
+ description: `${moduleName} \u2014 ${variant} skill`,
11371
+ categories: [moduleName],
11372
+ markdown
11373
+ });
11374
+ onProgress(`+ skill ${skillSlug(baseName, variant)} \u2192 ${role.name} (${moduleName})`);
9862
11375
  }
9863
11376
  }
9864
11377
  }
9865
11378
  }
11379
+ const { companySkills, roleSkillSlugs } = buildCompanySkillSet(skillRecords);
11380
+ const slugToSkillName = new Map(companySkills.map((s) => [s.slug, s.name]));
11381
+ for (const [roleName, slugs] of roleSkillSlugs) {
11382
+ if (!slugs.length) continue;
11383
+ const lines = slugs.map((slug) => `- ${slugToSkillName.get(slug) ?? slug}`).join("\n");
11384
+ await appendToFile(
11385
+ join(companyDir, "agents", roleName, "AGENTS.md"),
11386
+ `
11387
+ ## Installed skills
11388
+
11389
+ These skills are installed into your runtime and auto-discovered by your harness. Use them when relevant:
11390
+
11391
+ ${lines}
11392
+ `
11393
+ );
11394
+ }
9866
11395
  const HEARTBEAT_MARKER = "<!-- Module heartbeat sections are inserted above this line during assembly -->";
9867
11396
  for (const moduleName of moduleNames) {
9868
11397
  const moduleDir = join(templatesDir, "modules", moduleName);
@@ -10270,7 +11799,7 @@ Read: \`../../docs/${doc}\`
10270
11799
  ...executionWorkspacePolicy ? { executionWorkspacePolicy } : {}
10271
11800
  };
10272
11801
  })() : null;
10273
- const mainProjectPreCreated = initialRoutines.length > 0 && mainProjectInfo !== null;
11802
+ const mainProjectPreCreated = initialRoutines.some(routineUsesProjectWorkspace) && mainProjectInfo !== null;
10274
11803
  if (resolvedProjects.length > 0) {
10275
11804
  bootstrap += `## Projects
10276
11805
 
@@ -10446,7 +11975,10 @@ Read: \`../../docs/${doc}\`
10446
11975
  ["schedule", routine.schedule],
10447
11976
  ["priority", routine.priority || "medium"],
10448
11977
  ["concurrencyPolicy", routine.concurrencyPolicy || "skip_if_active"],
10449
- ["projectId", `\u2192 "${mainProjectName}"`]
11978
+ [
11979
+ "projectId",
11980
+ routineUsesProjectWorkspace(routine) ? `\u2192 "${mainProjectName}"` : "none (control-plane routine; no project worktree)"
11981
+ ]
10450
11982
  ]);
10451
11983
  if (routine.description) {
10452
11984
  bootstrap += `${escapeBody(routine.description)}
@@ -10503,6 +12035,20 @@ Read: \`../../docs/${doc}\`
10503
12035
  }
10504
12036
  bootstrap += `${stepN}. **Start CEO heartbeat** (one-time initial wakeup)
10505
12037
  `;
12038
+ if (companySkills.length > 0) {
12039
+ bootstrap += `
12040
+ ## Company Skills (pre-provisioned)
12041
+
12042
+ These skills are installed in the Skills Store and assigned to agents via \`desiredSkills\`. Do not recreate them:
12043
+
12044
+ `;
12045
+ for (const skill of companySkills) {
12046
+ bootstrap += `- \`${skill.slug}\` \u2014 ${skill.name}
12047
+ `;
12048
+ }
12049
+ bootstrap += `
12050
+ `;
12051
+ }
10506
12052
  await writeFile(join(companyDir, "BOOTSTRAP.md"), bootstrap);
10507
12053
  onProgress("+ BOOTSTRAP.md");
10508
12054
  return {
@@ -10511,6 +12057,8 @@ Read: \`../../docs/${doc}\`
10511
12057
  initialIssues,
10512
12058
  initialRoutines,
10513
12059
  roleAdapterOverrides,
12060
+ companySkills,
12061
+ roleSkillSlugs,
10514
12062
  mainProject: mainProjectInfo
10515
12063
  };
10516
12064
  }
@@ -10683,6 +12231,27 @@ var PaperclipClient = class {
10683
12231
  async getCompany(companyId) {
10684
12232
  return this._fetch(`/api/companies/${companyId}`, { method: "GET" });
10685
12233
  }
12234
+ async listCompanySkills(companyId) {
12235
+ return this._fetch(`/api/companies/${companyId}/skills`, { method: "GET" });
12236
+ }
12237
+ async createCompanySkill(companyId, { name, slug, description, markdown, categories }) {
12238
+ return this._fetch(`/api/companies/${companyId}/skills`, {
12239
+ method: "POST",
12240
+ body: JSON.stringify({
12241
+ name,
12242
+ ...slug !== void 0 ? { slug } : {},
12243
+ ...description !== void 0 ? { description } : {},
12244
+ ...markdown !== void 0 ? { markdown } : {},
12245
+ ...categories !== void 0 ? { categories } : {}
12246
+ })
12247
+ });
12248
+ }
12249
+ async updateCompanySkill(companyId, skillId, updates) {
12250
+ return this._fetch(`/api/companies/${companyId}/skills/${skillId}`, {
12251
+ method: "PATCH",
12252
+ body: JSON.stringify(updates || {})
12253
+ });
12254
+ }
10686
12255
  async listAgents(companyId) {
10687
12256
  return this._fetch(`/api/companies/${companyId}/agents`, { method: "GET" });
10688
12257
  }
@@ -10826,14 +12395,14 @@ var PaperclipClient = class {
10826
12395
  executionWorkspaceSettings,
10827
12396
  executionPolicy,
10828
12397
  blockedByIssueIds,
10829
- blockParentUntilDone
12398
+ watchdog
10830
12399
  }) {
10831
12400
  return this._fetch(`/api/companies/${companyId}/issues`, {
10832
12401
  method: "POST",
10833
12402
  body: JSON.stringify({
10834
12403
  title,
10835
12404
  description: description || null,
10836
- status: status || void 0,
12405
+ status: status || "todo",
10837
12406
  priority: priority || "medium",
10838
12407
  parentId: parentId || void 0,
10839
12408
  projectId: projectId || void 0,
@@ -10846,7 +12415,9 @@ var PaperclipClient = class {
10846
12415
  executionWorkspaceSettings: executionWorkspaceSettings || void 0,
10847
12416
  executionPolicy: executionPolicy || void 0,
10848
12417
  blockedByIssueIds: blockedByIssueIds || void 0,
10849
- blockParentUntilDone: blockParentUntilDone || void 0
12418
+ // Task watchdog (native stall recovery): { agentId, instructions? }.
12419
+ // The named agent is woken to recover the issue's subtree if it stalls.
12420
+ watchdog: watchdog && watchdog.agentId ? watchdog : void 0
10850
12421
  })
10851
12422
  });
10852
12423
  }
@@ -10856,6 +12427,26 @@ var PaperclipClient = class {
10856
12427
  body: JSON.stringify(updates || {})
10857
12428
  });
10858
12429
  }
12430
+ // Upsert a task watchdog on an existing issue. The watching agent must be
12431
+ // invokable (active), so callers should treat failures as non-fatal.
12432
+ async setIssueWatchdog(issueId, { agentId, instructions } = {}) {
12433
+ if (!agentId) {
12434
+ throw new Error("setIssueWatchdog requires agentId");
12435
+ }
12436
+ return this._fetch(`/api/issues/${issueId}/watchdog`, {
12437
+ method: "PUT",
12438
+ body: JSON.stringify({
12439
+ agentId,
12440
+ ...instructions ? { instructions } : {}
12441
+ })
12442
+ });
12443
+ }
12444
+ async getIssueWatchdog(issueId) {
12445
+ return this._fetch(`/api/issues/${issueId}/watchdog`, { method: "GET" });
12446
+ }
12447
+ async deleteIssueWatchdog(issueId) {
12448
+ return this._fetch(`/api/issues/${issueId}/watchdog`, { method: "DELETE" });
12449
+ }
10859
12450
  async putIssueDocument(issueId, key, { title, format, body, baseRevisionId }) {
10860
12451
  return this._fetch(`/api/issues/${issueId}/documents/${encodeURIComponent(key)}`, {
10861
12452
  method: "PUT",
@@ -11482,15 +13073,50 @@ async function setExternalInstructionsBundle({
11482
13073
  );
11483
13074
  }
11484
13075
  }
11485
- function preserveExistingSkillSync(existingAgent, nextAdapterConfig) {
11486
- const existingSync = existingAgent?.adapterConfig && typeof existingAgent.adapterConfig === "object" && "paperclipSkillSync" in existingAgent.adapterConfig ? existingAgent.adapterConfig.paperclipSkillSync : void 0;
11487
- if (!existingSync) {
11488
- return nextAdapterConfig;
13076
+ async function provisionCompanySkills(client, companyId, companySkills, log) {
13077
+ const slugToKey = /* @__PURE__ */ new Map();
13078
+ if (!Array.isArray(companySkills) || companySkills.length === 0) return slugToKey;
13079
+ let existing = [];
13080
+ try {
13081
+ const listed = await client.listCompanySkills(companyId);
13082
+ existing = Array.isArray(listed) ? listed : [];
13083
+ } catch (err) {
13084
+ log(
13085
+ `\u26A0 Could not list existing company skills: ${err instanceof Error ? err.message : String(err)}`
13086
+ );
11489
13087
  }
11490
- return {
11491
- ...nextAdapterConfig,
11492
- paperclipSkillSync: existingSync
11493
- };
13088
+ const bySlug = /* @__PURE__ */ new Map();
13089
+ for (const s of existing) {
13090
+ if (s && typeof s.slug === "string") bySlug.set(s.slug, s);
13091
+ }
13092
+ for (const skill of companySkills) {
13093
+ const found = bySlug.get(skill.slug);
13094
+ if (!found) {
13095
+ const created = await client.createCompanySkill(companyId, {
13096
+ name: skill.name,
13097
+ slug: skill.slug,
13098
+ description: skill.description,
13099
+ markdown: skill.markdown,
13100
+ categories: skill.categories
13101
+ });
13102
+ slugToKey.set(skill.slug, created?.key || created?.slug || skill.slug);
13103
+ log(`\u2713 Created company skill "${skill.slug}"`);
13104
+ continue;
13105
+ }
13106
+ slugToKey.set(skill.slug, found.key || skill.slug);
13107
+ const updates = {};
13108
+ if ((found.name ?? "") !== skill.name) updates.name = skill.name;
13109
+ if ((found.description ?? "") !== (skill.description ?? "")) {
13110
+ updates.description = skill.description ?? null;
13111
+ }
13112
+ if (Array.isArray(skill.categories)) updates.categories = skill.categories;
13113
+ if ((found.markdown ?? "") !== skill.markdown) updates.markdown = skill.markdown;
13114
+ if (Object.keys(updates).length > 0) {
13115
+ await client.updateCompanySkill(companyId, found.id, updates);
13116
+ log(`\u2713 Updated company skill "${skill.slug}"`);
13117
+ }
13118
+ }
13119
+ return slugToKey;
11494
13120
  }
11495
13121
  function routineTemplateTitle(routine) {
11496
13122
  if (typeof routine?.title === "string" && routine.title.trim()) return routine.title.trim();
@@ -11596,6 +13222,7 @@ async function syncExistingCompanyRoutines({
11596
13222
  title,
11597
13223
  description: routine.description || null,
11598
13224
  assigneeAgentId,
13225
+ ...routineProjectPayload(routine, void 0, { sync: true }),
11599
13226
  priority: routine.priority || "medium",
11600
13227
  status: routine.status || "active",
11601
13228
  concurrencyPolicy: routine.concurrencyPolicy || "skip_if_active",
@@ -12248,6 +13875,14 @@ var plugin = definePlugin({
12248
13875
  let routines = [];
12249
13876
  try {
12250
13877
  allRoleNames = [...assembleResult.allRoles ?? []].filter(Boolean).sort();
13878
+ log("Provisioning company skills...");
13879
+ const slugToKey = await provisionCompanySkills(
13880
+ client,
13881
+ companyId,
13882
+ assembleResult.companySkills ?? [],
13883
+ log
13884
+ );
13885
+ const desiredSkillsForRole = (roleName) => (assembleResult.roleSkillSlugs?.get(roleName) ?? []).map((slug) => slugToKey.get(slug)).filter((key) => Boolean(key));
12251
13886
  if (existingCompanyId) {
12252
13887
  try {
12253
13888
  const pluginId = await findPluginId(client);
@@ -12345,7 +13980,8 @@ var plugin = definePlugin({
12345
13980
  try {
12346
13981
  const ceoPatch = {
12347
13982
  adapterType,
12348
- adapterConfig: preserveExistingSkillSync(existingCeo, adapterConfig),
13983
+ adapterConfig,
13984
+ desiredSkills: desiredSkillsForRole("ceo"),
12349
13985
  runtimeConfig: ceoRuntimeConfig,
12350
13986
  ...ceoMetadata ? { metadata: { ...existingCeo.metadata ?? {}, ...ceoMetadata } } : {}
12351
13987
  };
@@ -12376,6 +14012,7 @@ var plugin = definePlugin({
12376
14012
  reportsTo: null,
12377
14013
  adapterType,
12378
14014
  adapterConfig,
14015
+ desiredSkills: desiredSkillsForRole("ceo"),
12379
14016
  runtimeConfig: ceoRuntimeConfig,
12380
14017
  permissions: { canCreateAgents: true },
12381
14018
  ...boardOperationsIssue?.id ? { sourceIssueId: boardOperationsIssue.id } : {}
@@ -12395,6 +14032,7 @@ var plugin = definePlugin({
12395
14032
  reportsTo: null,
12396
14033
  adapterType,
12397
14034
  adapterConfig,
14035
+ desiredSkills: desiredSkillsForRole("ceo"),
12398
14036
  runtimeConfig: ceoRuntimeConfig,
12399
14037
  permissions: { canCreateAgents: true },
12400
14038
  ...boardOperationsIssue?.id ? { sourceIssueId: boardOperationsIssue.id } : {}
@@ -12461,7 +14099,8 @@ var plugin = definePlugin({
12461
14099
  try {
12462
14100
  await client.updateAgent(existingAgent.id, {
12463
14101
  adapterType,
12464
- adapterConfig: preserveExistingSkillSync(existingAgent, roleAdapterConfig),
14102
+ adapterConfig: roleAdapterConfig,
14103
+ desiredSkills: desiredSkillsForRole(roleName),
12465
14104
  runtimeConfig: roleRuntimeConfig,
12466
14105
  metadata: { ...existingAgent.metadata ?? {}, ...roleMetadata },
12467
14106
  ...!existingAgent.title && roleTitle ? { title: roleTitle } : {},
@@ -12493,6 +14132,7 @@ var plugin = definePlugin({
12493
14132
  reportsTo: ceoAgentId,
12494
14133
  adapterType,
12495
14134
  adapterConfig: roleAdapterConfig,
14135
+ desiredSkills: desiredSkillsForRole(roleName),
12496
14136
  runtimeConfig: roleRuntimeConfig,
12497
14137
  ...hiringPlanIssue?.id ? { sourceIssueId: hiringPlanIssue.id } : {}
12498
14138
  });
@@ -12515,7 +14155,7 @@ var plugin = definePlugin({
12515
14155
  if (!existingCompanyId) {
12516
14156
  let mainProjectId;
12517
14157
  const mainProject = assembleResult.mainProject;
12518
- if (routines.length > 0 && mainProject?.name) {
14158
+ if (routines.some(routineUsesProjectWorkspace) && mainProject?.name) {
12519
14159
  try {
12520
14160
  const createdProject = await client.createProject(companyId, {
12521
14161
  name: mainProject.name,
@@ -12543,7 +14183,7 @@ var plugin = definePlugin({
12543
14183
  title,
12544
14184
  description: routine.description,
12545
14185
  assigneeAgentId,
12546
- projectId: mainProjectId,
14186
+ ...routineProjectPayload(routine, mainProjectId),
12547
14187
  priority: routine.priority || "medium",
12548
14188
  concurrencyPolicy: routine.concurrencyPolicy || "skip_if_active",
12549
14189
  catchUpPolicy: routine.catchUpPolicy || "skip_missed"
@@ -12587,6 +14227,17 @@ var plugin = definePlugin({
12587
14227
  });
12588
14228
  bootstrapIssue = issue;
12589
14229
  log(`\u2713 Bootstrap task created: ${bootstrapIssue.identifier || bootstrapIssue.id}`);
14230
+ try {
14231
+ await client.setIssueWatchdog(bootstrapIssue.id, {
14232
+ agentId: ceoAgentId,
14233
+ instructions: "Bootstrap/setup stalled. Re-read this issue and BOOTSTRAP.md, then resume: create any missing goals/issues, link the pre-created projects and routines, and unblock or reassign whatever stopped. Do not archive or delete any execution workspace as part of recovery. Leave the issue in a clear final state."
14234
+ });
14235
+ log("\u2713 Watchdog attached to bootstrap task (CEO self-recovery).");
14236
+ } catch (wdErr) {
14237
+ log(
14238
+ `\u26A0 Could not attach bootstrap watchdog (non-fatal \u2014 likely CEO pending approval): ${wdErr instanceof Error ? wdErr.message : String(wdErr)}`
14239
+ );
14240
+ }
12590
14241
  } catch (err) {
12591
14242
  log(`\u2717 Provisioning failed: ${err instanceof Error ? err.message : String(err)}`);
12592
14243
  if (createdCompany) {