@starlein/paperclip-plugin-company-wizard 0.4.17 → 0.4.20

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 (47) hide show
  1. package/CHANGELOG.md +91 -0
  2. package/README.md +11 -8
  3. package/dist/manifest.js +3 -1
  4. package/dist/manifest.js.map +2 -2
  5. package/dist/ui/index.css +9 -0
  6. package/dist/ui/index.css.map +2 -2
  7. package/dist/ui/index.js +164 -9
  8. package/dist/ui/index.js.map +4 -4
  9. package/dist/worker.js +2401 -635
  10. package/dist/worker.js.map +4 -4
  11. package/package.json +21 -21
  12. package/templates/bootstrap-instructions.md +0 -5
  13. package/templates/modules/auto-assign/agents/ceo/skills/auto-assign.fallback.md +2 -1
  14. package/templates/modules/auto-assign/skills/auto-assign.md +1 -0
  15. package/templates/modules/backlog/agents/ceo/skills/backlog-health.fallback.md +1 -0
  16. package/templates/modules/backlog/module.meta.json +2 -1
  17. package/templates/modules/backlog/skills/backlog-health.md +3 -1
  18. package/templates/modules/dependency-management/agents/security-engineer/skills/dependency-audit.fallback.md +18 -0
  19. package/templates/modules/game-design/agents/engineer/skills/game-design.fallback.md +17 -0
  20. package/templates/modules/github-repo/agents/engineer/skills/git-workflow.md +1 -1
  21. package/templates/modules/github-repo/docs/git-workflow.md +2 -2
  22. package/templates/modules/pr-review/README.md +2 -2
  23. package/templates/modules/pr-review/agents/code-reviewer/skills/code-review.md +3 -3
  24. package/templates/modules/pr-review/agents/engineer/skills/pr-workflow.md +6 -6
  25. package/templates/modules/pr-review/docs/pr-conventions.md +2 -2
  26. package/templates/modules/stall-detection/agents/ceo/skills/stall-detection.md +20 -17
  27. package/templates/modules/triage/agents/engineer/skills/issue-triage.fallback.md +20 -0
  28. package/templates/roles/audio-designer/HEARTBEAT.md +2 -2
  29. package/templates/roles/ceo/HEARTBEAT.md +2 -2
  30. package/templates/roles/ceo/role.meta.json +1 -1
  31. package/templates/roles/cmo/HEARTBEAT.md +2 -2
  32. package/templates/roles/code-reviewer/AGENTS.md +1 -1
  33. package/templates/roles/code-reviewer/HEARTBEAT.md +3 -2
  34. package/templates/roles/cto/HEARTBEAT.md +2 -2
  35. package/templates/roles/cto/role.meta.json +1 -1
  36. package/templates/roles/customer-success/HEARTBEAT.md +2 -2
  37. package/templates/roles/devops/HEARTBEAT.md +2 -2
  38. package/templates/roles/engineer/HEARTBEAT.md +3 -2
  39. package/templates/roles/game-artist/HEARTBEAT.md +2 -2
  40. package/templates/roles/game-designer/HEARTBEAT.md +2 -2
  41. package/templates/roles/level-designer/HEARTBEAT.md +2 -2
  42. package/templates/roles/product-owner/HEARTBEAT.md +2 -2
  43. package/templates/roles/qa/HEARTBEAT.md +2 -1
  44. package/templates/roles/security-engineer/HEARTBEAT.md +2 -2
  45. package/templates/roles/technical-writer/HEARTBEAT.md +2 -2
  46. package/templates/roles/ui-designer/HEARTBEAT.md +2 -2
  47. 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()
@@ -5752,6 +6486,97 @@ var requestConfirmationPayloadSchema = external_exports.object({
5752
6486
  supersedeOnUserComment: external_exports.boolean().optional(),
5753
6487
  target: requestConfirmationTargetSchema.nullable().optional()
5754
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()
6493
+ });
6494
+ var requestCheckboxConfirmationPayloadSchema = external_exports.object({
6495
+ version: external_exports.literal(1),
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(),
6502
+ acceptLabel: external_exports.string().trim().min(1).max(80).nullable().optional(),
6503
+ rejectLabel: external_exports.string().trim().min(1).max(80).nullable().optional(),
6504
+ rejectRequiresReason: external_exports.boolean().optional(),
6505
+ rejectReasonLabel: external_exports.string().trim().min(1).max(160).nullable().optional(),
6506
+ allowDeclineReason: external_exports.boolean().optional().default(true),
6507
+ declineReasonPlaceholder: external_exports.string().trim().min(1).max(240).nullable().optional(),
6508
+ supersedeOnUserComment: external_exports.boolean().optional(),
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
+ }
6579
+ });
5755
6580
  var requestConfirmationResultSchema = external_exports.object({
5756
6581
  version: external_exports.literal(1),
5757
6582
  outcome: external_exports.enum(["accepted", "rejected", "superseded_by_comment", "stale_target"]),
@@ -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"),
@@ -5789,10 +6630,21 @@ var createIssueThreadInteractionSchema = external_exports.discriminatedUnion("ki
5789
6630
  summary: external_exports.string().trim().max(1e3).nullable().optional(),
5790
6631
  continuationPolicy: issueThreadInteractionContinuationPolicySchema.optional().default("none"),
5791
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
5792
6643
  })
5793
6644
  ]);
5794
6645
  var acceptIssueThreadInteractionSchema = external_exports.object({
5795
- selectedClientKeys: external_exports.array(external_exports.string().trim().min(1).max(120)).min(1).max(50).optional()
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()
5796
6648
  }).superRefine((value, ctx) => {
5797
6649
  const seenClientKeys = /* @__PURE__ */ new Set();
5798
6650
  for (const [index, clientKey] of (value.selectedClientKeys ?? []).entries()) {
@@ -5806,6 +6658,18 @@ var acceptIssueThreadInteractionSchema = external_exports.object({
5806
6658
  }
5807
6659
  seenClientKeys.add(clientKey);
5808
6660
  }
6661
+ const seenOptionIds = /* @__PURE__ */ new Set();
6662
+ for (const [index, optionId] of (value.selectedOptionIds ?? []).entries()) {
6663
+ if (seenOptionIds.has(optionId)) {
6664
+ ctx.addIssue({
6665
+ code: external_exports.ZodIssueCode.custom,
6666
+ message: "selectedOptionIds must be unique",
6667
+ path: ["selectedOptionIds", index]
6668
+ });
6669
+ continue;
6670
+ }
6671
+ seenOptionIds.add(optionId);
6672
+ }
5809
6673
  });
5810
6674
  var rejectIssueThreadInteractionSchema = external_exports.object({
5811
6675
  reason: external_exports.string().trim().max(4e3).optional()
@@ -5820,267 +6684,59 @@ var respondIssueThreadInteractionSchema = external_exports.object({
5820
6684
  var linkIssueApprovalSchema = external_exports.object({
5821
6685
  approvalId: external_exports.string().uuid()
5822
6686
  });
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 })
5988
- ]);
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({})
5995
- }).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) {
6003
- ctx.addIssue({
6004
- ...issue,
6005
- path: issue.path[0] === "config" ? issue.path : ["config", ...issue.path]
6006
- });
6007
- }
6008
- }
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) {
6063
- ctx.addIssue({
6064
- ...issue,
6065
- path: issue.path[0] === "config" ? issue.path : ["config", ...issue.path]
6066
- });
6067
- }
6068
- }
6069
- });
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()
6687
+ var createIssueAttachmentMetadataSchema = external_exports.object({
6688
+ issueCommentId: external_exports.string().uuid().optional().nullable()
6077
6689
  });
6078
- var remoteSecretImportSchema = external_exports.object({
6079
- providerConfigId: external_exports.string().uuid(),
6080
- secrets: external_exports.array(remoteSecretImportSelectionSchema).min(1).max(100)
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(),
@@ -6827,44 +7921,176 @@ var createCostEventSchema = external_exports.object({
6827
7921
  var updateBudgetSchema = external_exports.object({
6828
7922
  budgetMonthlyCents: external_exports.number().int().nonnegative()
6829
7923
  });
6830
-
6831
- // node_modules/.pnpm/@paperclipai+shared@2026.529.0/node_modules/@paperclipai/shared/dist/validators/finance.js
6832
- var createFinanceEventSchema = external_exports.object({
6833
- agentId: external_exports.string().uuid().optional().nullable(),
6834
- issueId: external_exports.string().uuid().optional().nullable(),
6835
- projectId: external_exports.string().uuid().optional().nullable(),
6836
- goalId: external_exports.string().uuid().optional().nullable(),
6837
- heartbeatRunId: external_exports.string().uuid().optional().nullable(),
6838
- costEventId: external_exports.string().uuid().optional().nullable(),
6839
- billingCode: external_exports.string().optional().nullable(),
6840
- description: external_exports.string().max(500).optional().nullable(),
6841
- eventKind: external_exports.enum(FINANCE_EVENT_KINDS),
6842
- direction: external_exports.enum(FINANCE_DIRECTIONS).optional().default("debit"),
6843
- biller: external_exports.string().min(1),
6844
- provider: external_exports.string().min(1).optional().nullable(),
6845
- executionAdapterType: external_exports.enum(AGENT_ADAPTER_TYPES).optional().nullable(),
6846
- pricingTier: external_exports.string().min(1).optional().nullable(),
6847
- region: external_exports.string().min(1).optional().nullable(),
6848
- model: external_exports.string().min(1).optional().nullable(),
6849
- quantity: external_exports.number().int().nonnegative().optional().nullable(),
6850
- unit: external_exports.enum(FINANCE_UNITS).optional().nullable(),
6851
- amountCents: external_exports.number().int().nonnegative(),
6852
- currency: external_exports.string().length(3).optional().default("USD"),
6853
- estimated: external_exports.boolean().optional().default(false),
6854
- externalInvoiceId: external_exports.string().optional().nullable(),
6855
- metadataJson: external_exports.record(external_exports.string(), external_exports.unknown()).optional().nullable(),
6856
- occurredAt: external_exports.string().datetime()
6857
- }).transform((value) => ({
6858
- ...value,
6859
- currency: value.currency.toUpperCase()
6860
- }));
6861
-
6862
- // node_modules/.pnpm/@paperclipai+shared@2026.529.0/node_modules/@paperclipai/shared/dist/validators/asset.js
6863
- var createAssetImageMetadataSchema = external_exports.object({
6864
- namespace: external_exports.string().trim().min(1).max(120).regex(/^[a-zA-Z0-9/_-]+$/).optional()
7924
+
7925
+ // node_modules/.pnpm/@paperclipai+shared@2026.707.0/node_modules/@paperclipai/shared/dist/validators/finance.js
7926
+ var createFinanceEventSchema = external_exports.object({
7927
+ agentId: external_exports.string().uuid().optional().nullable(),
7928
+ issueId: external_exports.string().uuid().optional().nullable(),
7929
+ projectId: external_exports.string().uuid().optional().nullable(),
7930
+ goalId: external_exports.string().uuid().optional().nullable(),
7931
+ heartbeatRunId: external_exports.string().uuid().optional().nullable(),
7932
+ costEventId: external_exports.string().uuid().optional().nullable(),
7933
+ billingCode: external_exports.string().optional().nullable(),
7934
+ description: external_exports.string().max(500).optional().nullable(),
7935
+ eventKind: external_exports.enum(FINANCE_EVENT_KINDS),
7936
+ direction: external_exports.enum(FINANCE_DIRECTIONS).optional().default("debit"),
7937
+ biller: external_exports.string().min(1),
7938
+ provider: external_exports.string().min(1).optional().nullable(),
7939
+ executionAdapterType: external_exports.enum(AGENT_ADAPTER_TYPES).optional().nullable(),
7940
+ pricingTier: external_exports.string().min(1).optional().nullable(),
7941
+ region: external_exports.string().min(1).optional().nullable(),
7942
+ model: external_exports.string().min(1).optional().nullable(),
7943
+ quantity: external_exports.number().int().nonnegative().optional().nullable(),
7944
+ unit: external_exports.enum(FINANCE_UNITS).optional().nullable(),
7945
+ amountCents: external_exports.number().int().nonnegative(),
7946
+ currency: external_exports.string().length(3).optional().default("USD"),
7947
+ estimated: external_exports.boolean().optional().default(false),
7948
+ externalInvoiceId: external_exports.string().optional().nullable(),
7949
+ metadataJson: external_exports.record(external_exports.string(), external_exports.unknown()).optional().nullable(),
7950
+ occurredAt: external_exports.string().datetime()
7951
+ }).transform((value) => ({
7952
+ ...value,
7953
+ currency: value.currency.toUpperCase()
7954
+ }));
7955
+
7956
+ // node_modules/.pnpm/@paperclipai+shared@2026.707.0/node_modules/@paperclipai/shared/dist/validators/asset.js
7957
+ var createAssetImageMetadataSchema = external_exports.object({
7958
+ namespace: external_exports.string().trim().min(1).max(120).regex(/^[a-zA-Z0-9/_-]+$/).optional()
7959
+ });
7960
+
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
+ })
6865
8091
  });
6866
8092
 
6867
- // node_modules/.pnpm/@paperclipai+shared@2026.529.0/node_modules/@paperclipai/shared/dist/validators/access.js
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,30 +8670,31 @@ 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(),
7373
8677
  launchers: external_exports.array(pluginLauncherDeclarationSchema).optional()
7374
8678
  }).optional()
7375
- }).superRefine((manifest, ctx) => {
7376
- const hasUiSlots = (manifest.ui?.slots?.length ?? 0) > 0;
7377
- const hasUiLaunchers = (manifest.ui?.launchers?.length ?? 0) > 0;
7378
- if ((hasUiSlots || hasUiLaunchers) && !manifest.entrypoints.ui) {
8679
+ }).superRefine((manifest2, ctx) => {
8680
+ const hasUiSlots = (manifest2.ui?.slots?.length ?? 0) > 0;
8681
+ const hasUiLaunchers = (manifest2.ui?.launchers?.length ?? 0) > 0;
8682
+ if ((hasUiSlots || hasUiLaunchers) && !manifest2.entrypoints.ui) {
7379
8683
  ctx.addIssue({
7380
8684
  code: external_exports.ZodIssueCode.custom,
7381
8685
  message: "entrypoints.ui is required when ui.slots or ui.launchers are declared",
7382
8686
  path: ["entrypoints", "ui"]
7383
8687
  });
7384
8688
  }
7385
- if (manifest.minimumHostVersion && manifest.minimumPaperclipVersion && manifest.minimumHostVersion !== manifest.minimumPaperclipVersion) {
8689
+ if (manifest2.minimumHostVersion && manifest2.minimumPaperclipVersion && manifest2.minimumHostVersion !== manifest2.minimumPaperclipVersion) {
7386
8690
  ctx.addIssue({
7387
8691
  code: external_exports.ZodIssueCode.custom,
7388
8692
  message: "minimumHostVersion and minimumPaperclipVersion must match when both are declared",
7389
8693
  path: ["minimumHostVersion"]
7390
8694
  });
7391
8695
  }
7392
- if (manifest.tools && manifest.tools.length > 0) {
7393
- if (!manifest.capabilities.includes("agent.tools.register")) {
8696
+ if (manifest2.tools && manifest2.tools.length > 0) {
8697
+ if (!manifest2.capabilities.includes("agent.tools.register")) {
7394
8698
  ctx.addIssue({
7395
8699
  code: external_exports.ZodIssueCode.custom,
7396
8700
  message: "Capability 'agent.tools.register' is required when tools are declared",
@@ -7398,8 +8702,8 @@ var pluginManifestV1Schema = external_exports.object({
7398
8702
  });
7399
8703
  }
7400
8704
  }
7401
- if (manifest.environmentDrivers && manifest.environmentDrivers.length > 0) {
7402
- if (!manifest.capabilities.includes("environment.drivers.register")) {
8705
+ if (manifest2.environmentDrivers && manifest2.environmentDrivers.length > 0) {
8706
+ if (!manifest2.capabilities.includes("environment.drivers.register")) {
7403
8707
  ctx.addIssue({
7404
8708
  code: external_exports.ZodIssueCode.custom,
7405
8709
  message: "Capability 'environment.drivers.register' is required when environmentDrivers are declared",
@@ -7407,8 +8711,8 @@ var pluginManifestV1Schema = external_exports.object({
7407
8711
  });
7408
8712
  }
7409
8713
  }
7410
- if (manifest.agents && manifest.agents.length > 0) {
7411
- if (!manifest.capabilities.includes("agents.managed")) {
8714
+ if (manifest2.agents && manifest2.agents.length > 0) {
8715
+ if (!manifest2.capabilities.includes("agents.managed")) {
7412
8716
  ctx.addIssue({
7413
8717
  code: external_exports.ZodIssueCode.custom,
7414
8718
  message: "Capability 'agents.managed' is required when managed agents are declared",
@@ -7416,8 +8720,8 @@ var pluginManifestV1Schema = external_exports.object({
7416
8720
  });
7417
8721
  }
7418
8722
  }
7419
- if (manifest.projects && manifest.projects.length > 0) {
7420
- if (!manifest.capabilities.includes("projects.managed")) {
8723
+ if (manifest2.projects && manifest2.projects.length > 0) {
8724
+ if (!manifest2.capabilities.includes("projects.managed")) {
7421
8725
  ctx.addIssue({
7422
8726
  code: external_exports.ZodIssueCode.custom,
7423
8727
  message: "Capability 'projects.managed' is required when managed projects are declared",
@@ -7425,8 +8729,8 @@ var pluginManifestV1Schema = external_exports.object({
7425
8729
  });
7426
8730
  }
7427
8731
  }
7428
- if (manifest.routines && manifest.routines.length > 0) {
7429
- if (!manifest.capabilities.includes("routines.managed")) {
8732
+ if (manifest2.routines && manifest2.routines.length > 0) {
8733
+ if (!manifest2.capabilities.includes("routines.managed")) {
7430
8734
  ctx.addIssue({
7431
8735
  code: external_exports.ZodIssueCode.custom,
7432
8736
  message: "Capability 'routines.managed' is required when managed routines are declared",
@@ -7434,8 +8738,8 @@ var pluginManifestV1Schema = external_exports.object({
7434
8738
  });
7435
8739
  }
7436
8740
  }
7437
- if (manifest.skills && manifest.skills.length > 0) {
7438
- if (!manifest.capabilities.includes("skills.managed")) {
8741
+ if (manifest2.skills && manifest2.skills.length > 0) {
8742
+ if (!manifest2.capabilities.includes("skills.managed")) {
7439
8743
  ctx.addIssue({
7440
8744
  code: external_exports.ZodIssueCode.custom,
7441
8745
  message: "Capability 'skills.managed' is required when managed skills are declared",
@@ -7443,8 +8747,8 @@ var pluginManifestV1Schema = external_exports.object({
7443
8747
  });
7444
8748
  }
7445
8749
  }
7446
- if (manifest.localFolders && manifest.localFolders.length > 0) {
7447
- if (!manifest.capabilities.includes("local.folders")) {
8750
+ if (manifest2.localFolders && manifest2.localFolders.length > 0) {
8751
+ if (!manifest2.capabilities.includes("local.folders")) {
7448
8752
  ctx.addIssue({
7449
8753
  code: external_exports.ZodIssueCode.custom,
7450
8754
  message: "Capability 'local.folders' is required when local folders are declared",
@@ -7452,8 +8756,8 @@ var pluginManifestV1Schema = external_exports.object({
7452
8756
  });
7453
8757
  }
7454
8758
  }
7455
- if (manifest.jobs && manifest.jobs.length > 0) {
7456
- if (!manifest.capabilities.includes("jobs.schedule")) {
8759
+ if (manifest2.jobs && manifest2.jobs.length > 0) {
8760
+ if (!manifest2.capabilities.includes("jobs.schedule")) {
7457
8761
  ctx.addIssue({
7458
8762
  code: external_exports.ZodIssueCode.custom,
7459
8763
  message: "Capability 'jobs.schedule' is required when jobs are declared",
@@ -7461,8 +8765,8 @@ var pluginManifestV1Schema = external_exports.object({
7461
8765
  });
7462
8766
  }
7463
8767
  }
7464
- if (manifest.webhooks && manifest.webhooks.length > 0) {
7465
- if (!manifest.capabilities.includes("webhooks.receive")) {
8768
+ if (manifest2.webhooks && manifest2.webhooks.length > 0) {
8769
+ if (!manifest2.capabilities.includes("webhooks.receive")) {
7466
8770
  ctx.addIssue({
7467
8771
  code: external_exports.ZodIssueCode.custom,
7468
8772
  message: "Capability 'webhooks.receive' is required when webhooks are declared",
@@ -7470,8 +8774,8 @@ var pluginManifestV1Schema = external_exports.object({
7470
8774
  });
7471
8775
  }
7472
8776
  }
7473
- if (manifest.apiRoutes && manifest.apiRoutes.length > 0) {
7474
- if (!manifest.capabilities.includes("api.routes.register")) {
8777
+ if (manifest2.apiRoutes && manifest2.apiRoutes.length > 0) {
8778
+ if (!manifest2.capabilities.includes("api.routes.register")) {
7475
8779
  ctx.addIssue({
7476
8780
  code: external_exports.ZodIssueCode.custom,
7477
8781
  message: "Capability 'api.routes.register' is required when apiRoutes are declared",
@@ -7479,13 +8783,36 @@ var pluginManifestV1Schema = external_exports.object({
7479
8783
  });
7480
8784
  }
7481
8785
  }
7482
- if (manifest.database) {
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
+ }
8809
+ if (manifest2.database) {
7483
8810
  const requiredCapabilities = [
7484
8811
  "database.namespace.migrate",
7485
8812
  "database.namespace.read"
7486
8813
  ];
7487
8814
  for (const capability of requiredCapabilities) {
7488
- if (!manifest.capabilities.includes(capability)) {
8815
+ if (!manifest2.capabilities.includes(capability)) {
7489
8816
  ctx.addIssue({
7490
8817
  code: external_exports.ZodIssueCode.custom,
7491
8818
  message: `Capability '${capability}' is required when database migrations are declared`,
@@ -7493,7 +8820,7 @@ var pluginManifestV1Schema = external_exports.object({
7493
8820
  });
7494
8821
  }
7495
8822
  }
7496
- const coreReadTables = manifest.database.coreReadTables ?? [];
8823
+ const coreReadTables = manifest2.database.coreReadTables ?? [];
7497
8824
  const duplicates = coreReadTables.filter((table, i) => coreReadTables.indexOf(table) !== i);
7498
8825
  if (duplicates.length > 0) {
7499
8826
  ctx.addIssue({
@@ -7503,8 +8830,8 @@ var pluginManifestV1Schema = external_exports.object({
7503
8830
  });
7504
8831
  }
7505
8832
  }
7506
- if (manifest.jobs) {
7507
- const jobKeys = manifest.jobs.map((j) => j.jobKey);
8833
+ if (manifest2.jobs) {
8834
+ const jobKeys = manifest2.jobs.map((j) => j.jobKey);
7508
8835
  const duplicates = jobKeys.filter((key, i) => jobKeys.indexOf(key) !== i);
7509
8836
  if (duplicates.length > 0) {
7510
8837
  ctx.addIssue({
@@ -7514,8 +8841,8 @@ var pluginManifestV1Schema = external_exports.object({
7514
8841
  });
7515
8842
  }
7516
8843
  }
7517
- if (manifest.webhooks) {
7518
- const endpointKeys = manifest.webhooks.map((w) => w.endpointKey);
8844
+ if (manifest2.webhooks) {
8845
+ const endpointKeys = manifest2.webhooks.map((w) => w.endpointKey);
7519
8846
  const duplicates = endpointKeys.filter((key, i) => endpointKeys.indexOf(key) !== i);
7520
8847
  if (duplicates.length > 0) {
7521
8848
  ctx.addIssue({
@@ -7525,8 +8852,8 @@ var pluginManifestV1Schema = external_exports.object({
7525
8852
  });
7526
8853
  }
7527
8854
  }
7528
- if (manifest.apiRoutes) {
7529
- const routeKeys = manifest.apiRoutes.map((route) => route.routeKey);
8855
+ if (manifest2.apiRoutes) {
8856
+ const routeKeys = manifest2.apiRoutes.map((route) => route.routeKey);
7530
8857
  const duplicateKeys = routeKeys.filter((key, i) => routeKeys.indexOf(key) !== i);
7531
8858
  if (duplicateKeys.length > 0) {
7532
8859
  ctx.addIssue({
@@ -7535,7 +8862,7 @@ var pluginManifestV1Schema = external_exports.object({
7535
8862
  path: ["apiRoutes"]
7536
8863
  });
7537
8864
  }
7538
- const routeSignatures = manifest.apiRoutes.map((route) => `${route.method} ${route.path}`);
8865
+ const routeSignatures = manifest2.apiRoutes.map((route) => `${route.method} ${route.path}`);
7539
8866
  const duplicateRoutes = routeSignatures.filter((sig, i) => routeSignatures.indexOf(sig) !== i);
7540
8867
  if (duplicateRoutes.length > 0) {
7541
8868
  ctx.addIssue({
@@ -7545,8 +8872,8 @@ var pluginManifestV1Schema = external_exports.object({
7545
8872
  });
7546
8873
  }
7547
8874
  }
7548
- if (manifest.tools) {
7549
- const toolNames = manifest.tools.map((t) => t.name);
8875
+ if (manifest2.tools) {
8876
+ const toolNames = manifest2.tools.map((t) => t.name);
7550
8877
  const duplicates = toolNames.filter((name, i) => toolNames.indexOf(name) !== i);
7551
8878
  if (duplicates.length > 0) {
7552
8879
  ctx.addIssue({
@@ -7556,8 +8883,8 @@ var pluginManifestV1Schema = external_exports.object({
7556
8883
  });
7557
8884
  }
7558
8885
  }
7559
- if (manifest.environmentDrivers) {
7560
- const driverKeys = manifest.environmentDrivers.map((d) => d.driverKey);
8886
+ if (manifest2.environmentDrivers) {
8887
+ const driverKeys = manifest2.environmentDrivers.map((d) => d.driverKey);
7561
8888
  const duplicates = driverKeys.filter((key, i) => driverKeys.indexOf(key) !== i);
7562
8889
  if (duplicates.length > 0) {
7563
8890
  ctx.addIssue({
@@ -7567,8 +8894,8 @@ var pluginManifestV1Schema = external_exports.object({
7567
8894
  });
7568
8895
  }
7569
8896
  }
7570
- if (manifest.localFolders) {
7571
- const folderKeys = manifest.localFolders.map((folder) => folder.folderKey);
8897
+ if (manifest2.localFolders) {
8898
+ const folderKeys = manifest2.localFolders.map((folder) => folder.folderKey);
7572
8899
  const duplicates = folderKeys.filter((key, i) => folderKeys.indexOf(key) !== i);
7573
8900
  if (duplicates.length > 0) {
7574
8901
  ctx.addIssue({
@@ -7578,8 +8905,8 @@ var pluginManifestV1Schema = external_exports.object({
7578
8905
  });
7579
8906
  }
7580
8907
  }
7581
- if (manifest.agents) {
7582
- const agentKeys = manifest.agents.map((agent) => agent.agentKey);
8908
+ if (manifest2.agents) {
8909
+ const agentKeys = manifest2.agents.map((agent) => agent.agentKey);
7583
8910
  const duplicates = agentKeys.filter((key, i) => agentKeys.indexOf(key) !== i);
7584
8911
  if (duplicates.length > 0) {
7585
8912
  ctx.addIssue({
@@ -7589,8 +8916,8 @@ var pluginManifestV1Schema = external_exports.object({
7589
8916
  });
7590
8917
  }
7591
8918
  }
7592
- if (manifest.projects) {
7593
- const projectKeys = manifest.projects.map((project) => project.projectKey);
8919
+ if (manifest2.projects) {
8920
+ const projectKeys = manifest2.projects.map((project) => project.projectKey);
7594
8921
  const duplicates = projectKeys.filter((key, i) => projectKeys.indexOf(key) !== i);
7595
8922
  if (duplicates.length > 0) {
7596
8923
  ctx.addIssue({
@@ -7600,8 +8927,8 @@ var pluginManifestV1Schema = external_exports.object({
7600
8927
  });
7601
8928
  }
7602
8929
  }
7603
- if (manifest.routines) {
7604
- const routineKeys = manifest.routines.map((routine) => routine.routineKey);
8930
+ if (manifest2.routines) {
8931
+ const routineKeys = manifest2.routines.map((routine) => routine.routineKey);
7605
8932
  const duplicates = routineKeys.filter((key, i) => routineKeys.indexOf(key) !== i);
7606
8933
  if (duplicates.length > 0) {
7607
8934
  ctx.addIssue({
@@ -7611,8 +8938,8 @@ var pluginManifestV1Schema = external_exports.object({
7611
8938
  });
7612
8939
  }
7613
8940
  }
7614
- if (manifest.skills) {
7615
- const skillKeys = manifest.skills.map((skill) => skill.skillKey);
8941
+ if (manifest2.skills) {
8942
+ const skillKeys = manifest2.skills.map((skill) => skill.skillKey);
7616
8943
  const duplicates = skillKeys.filter((key, i) => skillKeys.indexOf(key) !== i);
7617
8944
  if (duplicates.length > 0) {
7618
8945
  ctx.addIssue({
@@ -7622,9 +8949,20 @@ var pluginManifestV1Schema = external_exports.object({
7622
8949
  });
7623
8950
  }
7624
8951
  }
7625
- if (manifest.ui) {
7626
- if (manifest.ui.slots) {
7627
- const slotIds = manifest.ui.slots.map((s) => s.id);
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
+ }
8963
+ if (manifest2.ui) {
8964
+ if (manifest2.ui.slots) {
8965
+ const slotIds = manifest2.ui.slots.map((s) => s.id);
7628
8966
  const duplicates = slotIds.filter((id, i) => slotIds.indexOf(id) !== i);
7629
8967
  if (duplicates.length > 0) {
7630
8968
  ctx.addIssue({
@@ -7636,8 +8974,8 @@ var pluginManifestV1Schema = external_exports.object({
7636
8974
  }
7637
8975
  }
7638
8976
  const allLaunchers = [
7639
- ...manifest.launchers ?? [],
7640
- ...manifest.ui?.launchers ?? []
8977
+ ...manifest2.launchers ?? [],
8978
+ ...manifest2.ui?.launchers ?? []
7641
8979
  ];
7642
8980
  if (allLaunchers.length > 0) {
7643
8981
  const launcherIds = allLaunchers.map((launcher) => launcher.id);
@@ -7646,7 +8984,7 @@ var pluginManifestV1Schema = external_exports.object({
7646
8984
  ctx.addIssue({
7647
8985
  code: external_exports.ZodIssueCode.custom,
7648
8986
  message: `Duplicate launcher ids: ${[...new Set(duplicates)].join(", ")}`,
7649
- path: manifest.ui?.launchers ? ["ui", "launchers"] : ["launchers"]
8987
+ path: manifest2.ui?.launchers ? ["ui", "launchers"] : ["launchers"]
7650
8988
  });
7651
8989
  }
7652
8990
  }
@@ -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);
@@ -8061,7 +9415,7 @@ function startWorkerRpcHost(options) {
8061
9415
  const rpcTimeoutMs = options.rpcTimeoutMs ?? DEFAULT_RPC_TIMEOUT_MS;
8062
9416
  let running = true;
8063
9417
  let initialized = false;
8064
- let manifest = null;
9418
+ let manifest2 = null;
8065
9419
  let currentConfig = {};
8066
9420
  let databaseNamespace = null;
8067
9421
  const invocationContextStorage = new AsyncLocalStorage();
@@ -8144,9 +9498,9 @@ function startWorkerRpcHost(options) {
8144
9498
  function buildContext() {
8145
9499
  return {
8146
9500
  get manifest() {
8147
- if (!manifest)
9501
+ if (!manifest2)
8148
9502
  throw new Error("Plugin context accessed before initialization");
8149
- return manifest;
9503
+ return manifest2;
8150
9504
  },
8151
9505
  config: {
8152
9506
  async get() {
@@ -8155,9 +9509,9 @@ function startWorkerRpcHost(options) {
8155
9509
  },
8156
9510
  localFolders: {
8157
9511
  declarations() {
8158
- if (!manifest)
9512
+ if (!manifest2)
8159
9513
  throw new Error("Plugin context accessed before initialization");
8160
- return manifest.localFolders ?? [];
9514
+ return manifest2.localFolders ?? [];
8161
9515
  },
8162
9516
  async configure(input) {
8163
9517
  return callHost("localFolders.configure", {
@@ -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
  }
@@ -8925,7 +10306,7 @@ function startWorkerRpcHost(options) {
8925
10306
  if (initialized) {
8926
10307
  throw new Error("Worker already initialized");
8927
10308
  }
8928
- manifest = params.manifest;
10309
+ manifest2 = params.manifest;
8929
10310
  currentConfig = params.config;
8930
10311
  databaseNamespace = params.databaseNamespace ?? null;
8931
10312
  await plugin2.definition.setup(ctx);
@@ -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) {
@@ -9266,6 +10711,91 @@ import os from "node:os";
9266
10711
  import path2 from "node:path";
9267
10712
  import { fileURLToPath as fileURLToPath2 } from "node:url";
9268
10713
 
10714
+ // src/manifest.ts
10715
+ var manifest = {
10716
+ id: "starlein.paperclip-plugin-company-wizard",
10717
+ apiVersion: 1,
10718
+ version: "0.4.20",
10719
+ displayName: "Company Wizard",
10720
+ description: "AI-powered wizard to bootstrap agent companies from composable templates",
10721
+ author: "Sascha Pietrowski <sp@speednetwork.de>",
10722
+ categories: ["workspace", "ui"],
10723
+ minimumHostVersion: "2026.707.0",
10724
+ capabilities: [
10725
+ "companies.read",
10726
+ "issues.create",
10727
+ "issues.read",
10728
+ "issues.update",
10729
+ "goals.create",
10730
+ "goals.read",
10731
+ "agents.read",
10732
+ "projects.read",
10733
+ "skills.managed",
10734
+ "plugin.state.read",
10735
+ "plugin.state.write",
10736
+ "secrets.read-ref",
10737
+ "events.subscribe",
10738
+ "ui.page.register",
10739
+ "ui.sidebar.register"
10740
+ ],
10741
+ instanceConfigSchema: {
10742
+ type: "object",
10743
+ properties: {
10744
+ companiesDir: {
10745
+ type: "string",
10746
+ description: "Directory where assembled company workspaces are written. Auto-detected: ~/instances/default/companies in Docker setups, ~/.paperclip/instances/default/companies otherwise. Rarely needs manual override."
10747
+ },
10748
+ templatesPath: {
10749
+ type: "string",
10750
+ description: "Path to the templates directory. Auto-detected: ~/plugin-templates in Docker setups, ~/.paperclip/plugin-templates otherwise. Rarely needs manual override."
10751
+ },
10752
+ templatesRepoUrl: {
10753
+ type: "string",
10754
+ default: "https://github.com/starlein/paperclip-plugin-company-wizard/tree/main/templates",
10755
+ description: "GitHub tree URL for template downloads. The default is correct for most setups \u2014 only change this if using a custom fork."
10756
+ },
10757
+ anthropicApiKey: {
10758
+ type: "string",
10759
+ description: "Anthropic API key for the AI wizard (e.g. sk-ant-...). Required to use the AI-powered company setup path."
10760
+ },
10761
+ paperclipUrl: {
10762
+ type: "string",
10763
+ description: "Paperclip instance URL. Defaults to http://localhost:3100 or the PAPERCLIP_PUBLIC_URL env var."
10764
+ },
10765
+ paperclipEmail: {
10766
+ type: "string",
10767
+ description: "Board login email (for authenticated instances)."
10768
+ },
10769
+ paperclipPassword: {
10770
+ type: "string",
10771
+ description: "Board login password (for authenticated instances)."
10772
+ }
10773
+ }
10774
+ },
10775
+ entrypoints: {
10776
+ worker: "./dist/worker.js",
10777
+ ui: "./dist/ui"
10778
+ },
10779
+ ui: {
10780
+ slots: [
10781
+ {
10782
+ type: "page",
10783
+ id: "company-wizard",
10784
+ displayName: "Company Wizard",
10785
+ exportName: "WizardPage",
10786
+ routePath: "company-creator"
10787
+ },
10788
+ {
10789
+ type: "sidebar",
10790
+ id: "company-wizard-link",
10791
+ displayName: "Create Company",
10792
+ exportName: "SidebarLink"
10793
+ }
10794
+ ]
10795
+ }
10796
+ };
10797
+ var manifest_default = manifest;
10798
+
9269
10799
  // src/logic/assemble.js
9270
10800
  import {
9271
10801
  access,
@@ -9280,12 +10810,12 @@ import { join } from "node:path";
9280
10810
 
9281
10811
  // src/logic/ceo-defaults.js
9282
10812
  var DEFAULT_CEO_ADAPTER_TYPE = "codex_local";
9283
- var DEFAULT_CEO_MODEL = "gpt-5.5";
10813
+ var DEFAULT_CEO_MODEL = "gpt-5.6";
9284
10814
  var DEFAULT_CEO_THINKING_LEVEL = "high";
9285
10815
  var DEFAULT_WORKER_THINKING_LEVEL = "auto";
9286
10816
  var DEFAULT_CEO_MAX_CONCURRENT_RUNS = 1;
9287
10817
  var DEFAULT_CEO_HEARTBEAT_INTERVAL_SEC = 3600;
9288
- var DEFAULT_CLAUDE_CEO_MODEL = "claude-opus-4-6";
10818
+ var DEFAULT_CLAUDE_CEO_MODEL = "claude-opus-4-8";
9289
10819
  function asTrimmedString(value) {
9290
10820
  return typeof value === "string" ? value.trim() : "";
9291
10821
  }
@@ -9363,6 +10893,66 @@ function buildWorkerAgentRuntimeConfig() {
9363
10893
  };
9364
10894
  }
9365
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
+
9366
10956
  // src/logic/assemble.js
9367
10957
  async function exists(p) {
9368
10958
  try {
@@ -9621,6 +11211,7 @@ ${stages.join("\n")}
9621
11211
  });
9622
11212
  }
9623
11213
  initialIssues.unshift(...resolvedUserIssues);
11214
+ const skillRecords = [];
9624
11215
  for (const moduleName of moduleNames) {
9625
11216
  const moduleDir = join(templatesDir, "modules", moduleName);
9626
11217
  if (!await exists(moduleDir)) {
@@ -9716,30 +11307,33 @@ ${stages.join("\n")}
9716
11307
  async function installSkill(roleName, fileName, label) {
9717
11308
  const resolved = await resolveSkillFile(roleName, fileName);
9718
11309
  if (!resolved) return false;
9719
- const destSkillsDir = join(companyDir, "agents", roleName, "skills");
9720
- await mkdir(destSkillsDir, { recursive: true });
9721
- const destFile = join(destSkillsDir, fileName);
9722
- 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");
9723
11313
  let barApplied = false;
9724
11314
  if (enableEnrichedPersonas && label === "primary") {
9725
- const barFileName = fileName.replace(/\.md$/, ".bar.md");
9726
- const bar = await resolveSkillFile(roleName, barFileName);
11315
+ const bar = await resolveSkillFile(roleName, fileName.replace(/\.md$/, ".bar.md"));
9727
11316
  if (bar) {
9728
11317
  const barContent = await readFile(bar.path, "utf-8");
9729
- await appendToFile(destFile, "\n" + barContent.trim() + "\n");
11318
+ markdown = `${markdown.trimEnd()}
11319
+
11320
+ ${barContent.trim()}
11321
+ `;
9730
11322
  barApplied = true;
9731
11323
  }
9732
11324
  }
9733
- await appendToFile(
9734
- join(companyDir, "agents", roleName, "AGENTS.md"),
9735
- `
9736
- Read and follow: \`skills/${fileName}\`
9737
- `
9738
- );
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
+ });
9739
11333
  const sourceTag = resolved.source === "shared" ? ", shared" : "";
9740
11334
  const barTag = barApplied ? ", output bar" : "";
9741
11335
  onProgress(
9742
- `+ agents/${roleName}/skills/${fileName} (${moduleName}, ${label}${sourceTag}${barTag})`
11336
+ `+ skill ${skillSlug(baseName, variant)} \u2192 ${roleName} (${moduleName}, ${label}${sourceTag}${barTag})`
9743
11337
  );
9744
11338
  return true;
9745
11339
  }
@@ -9766,20 +11360,38 @@ Read and follow: \`skills/${fileName}\`
9766
11360
  const skillName = skillFile.replace(/\.md$/, "");
9767
11361
  const skillBaseName = skillName.replace(/\.fallback$/, "");
9768
11362
  if (capabilityOwners.has(skillBaseName)) continue;
9769
- const destSkillsDir = join(companyDir, "agents", role.name, "skills");
9770
- await mkdir(destSkillsDir, { recursive: true });
9771
- await copyFile(join(skillsDir, skillFile), join(destSkillsDir, skillFile));
9772
- await appendToFile(
9773
- join(companyDir, "agents", role.name, "AGENTS.md"),
9774
- `
9775
- Read and follow: \`skills/${skillFile}\`
9776
- `
9777
- );
9778
- 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})`);
9779
11375
  }
9780
11376
  }
9781
11377
  }
9782
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
+ }
9783
11395
  const HEARTBEAT_MARKER = "<!-- Module heartbeat sections are inserted above this line during assembly -->";
9784
11396
  for (const moduleName of moduleNames) {
9785
11397
  const moduleDir = join(templatesDir, "modules", moduleName);
@@ -10187,7 +11799,7 @@ Read: \`../../docs/${doc}\`
10187
11799
  ...executionWorkspacePolicy ? { executionWorkspacePolicy } : {}
10188
11800
  };
10189
11801
  })() : null;
10190
- const mainProjectPreCreated = initialRoutines.length > 0 && mainProjectInfo !== null;
11802
+ const mainProjectPreCreated = initialRoutines.some(routineUsesProjectWorkspace) && mainProjectInfo !== null;
10191
11803
  if (resolvedProjects.length > 0) {
10192
11804
  bootstrap += `## Projects
10193
11805
 
@@ -10363,7 +11975,10 @@ Read: \`../../docs/${doc}\`
10363
11975
  ["schedule", routine.schedule],
10364
11976
  ["priority", routine.priority || "medium"],
10365
11977
  ["concurrencyPolicy", routine.concurrencyPolicy || "skip_if_active"],
10366
- ["projectId", `\u2192 "${mainProjectName}"`]
11978
+ [
11979
+ "projectId",
11980
+ routineUsesProjectWorkspace(routine) ? `\u2192 "${mainProjectName}"` : "none (control-plane routine; no project worktree)"
11981
+ ]
10367
11982
  ]);
10368
11983
  if (routine.description) {
10369
11984
  bootstrap += `${escapeBody(routine.description)}
@@ -10420,6 +12035,20 @@ Read: \`../../docs/${doc}\`
10420
12035
  }
10421
12036
  bootstrap += `${stepN}. **Start CEO heartbeat** (one-time initial wakeup)
10422
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
+ }
10423
12052
  await writeFile(join(companyDir, "BOOTSTRAP.md"), bootstrap);
10424
12053
  onProgress("+ BOOTSTRAP.md");
10425
12054
  return {
@@ -10428,6 +12057,8 @@ Read: \`../../docs/${doc}\`
10428
12057
  initialIssues,
10429
12058
  initialRoutines,
10430
12059
  roleAdapterOverrides,
12060
+ companySkills,
12061
+ roleSkillSlugs,
10431
12062
  mainProject: mainProjectInfo
10432
12063
  };
10433
12064
  }
@@ -10600,6 +12231,27 @@ var PaperclipClient = class {
10600
12231
  async getCompany(companyId) {
10601
12232
  return this._fetch(`/api/companies/${companyId}`, { method: "GET" });
10602
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
+ }
10603
12255
  async listAgents(companyId) {
10604
12256
  return this._fetch(`/api/companies/${companyId}/agents`, { method: "GET" });
10605
12257
  }
@@ -10743,14 +12395,14 @@ var PaperclipClient = class {
10743
12395
  executionWorkspaceSettings,
10744
12396
  executionPolicy,
10745
12397
  blockedByIssueIds,
10746
- blockParentUntilDone
12398
+ watchdog
10747
12399
  }) {
10748
12400
  return this._fetch(`/api/companies/${companyId}/issues`, {
10749
12401
  method: "POST",
10750
12402
  body: JSON.stringify({
10751
12403
  title,
10752
12404
  description: description || null,
10753
- status: status || void 0,
12405
+ status: status || "todo",
10754
12406
  priority: priority || "medium",
10755
12407
  parentId: parentId || void 0,
10756
12408
  projectId: projectId || void 0,
@@ -10763,7 +12415,9 @@ var PaperclipClient = class {
10763
12415
  executionWorkspaceSettings: executionWorkspaceSettings || void 0,
10764
12416
  executionPolicy: executionPolicy || void 0,
10765
12417
  blockedByIssueIds: blockedByIssueIds || void 0,
10766
- 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
10767
12421
  })
10768
12422
  });
10769
12423
  }
@@ -10773,6 +12427,26 @@ var PaperclipClient = class {
10773
12427
  body: JSON.stringify(updates || {})
10774
12428
  });
10775
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
+ }
10776
12450
  async putIssueDocument(issueId, key, { title, format, body, baseRevisionId }) {
10777
12451
  return this._fetch(`/api/issues/${issueId}/documents/${encodeURIComponent(key)}`, {
10778
12452
  method: "PUT",
@@ -11028,8 +12702,22 @@ var __dirname = path2.dirname(fileURLToPath2(import.meta.url));
11028
12702
  var DEFAULT_TEMPLATES_REPO_URL = "https://github.com/starlein/paperclip-plugin-company-wizard/tree/main/templates";
11029
12703
  var BUNDLED_TEMPLATES_DIR = path2.resolve(__dirname, "..", "templates");
11030
12704
  var PLUGIN_PACKAGE_NAME = "@starlein/paperclip-plugin-company-wizard";
11031
- var CURRENT_PLUGIN_VERSION = "0.4.16";
12705
+ var CURRENT_PLUGIN_VERSION = manifest_default.version;
11032
12706
  var NPM_LATEST_URL = "https://registry.npmjs.org/@starlein%2Fpaperclip-plugin-company-wizard/latest";
12707
+ async function fetchLatestPluginVersion() {
12708
+ const response = await fetch(NPM_LATEST_URL, {
12709
+ headers: { accept: "application/json" }
12710
+ });
12711
+ if (!response.ok) {
12712
+ throw new Error(`npm registry returned ${response.status}`);
12713
+ }
12714
+ const data = await response.json();
12715
+ const latestVersion = typeof data.version === "string" ? data.version.trim() : "";
12716
+ if (!latestVersion) {
12717
+ throw new Error("npm registry response did not include a version");
12718
+ }
12719
+ return latestVersion;
12720
+ }
11033
12721
  function copyDirSync(src, dest) {
11034
12722
  fs2.mkdirSync(dest, { recursive: true });
11035
12723
  for (const entry of fs2.readdirSync(src, { withFileTypes: true })) {
@@ -11385,15 +13073,50 @@ async function setExternalInstructionsBundle({
11385
13073
  );
11386
13074
  }
11387
13075
  }
11388
- function preserveExistingSkillSync(existingAgent, nextAdapterConfig) {
11389
- const existingSync = existingAgent?.adapterConfig && typeof existingAgent.adapterConfig === "object" && "paperclipSkillSync" in existingAgent.adapterConfig ? existingAgent.adapterConfig.paperclipSkillSync : void 0;
11390
- if (!existingSync) {
11391
- 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
+ );
11392
13087
  }
11393
- return {
11394
- ...nextAdapterConfig,
11395
- paperclipSkillSync: existingSync
11396
- };
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;
11397
13120
  }
11398
13121
  function routineTemplateTitle(routine) {
11399
13122
  if (typeof routine?.title === "string" && routine.title.trim()) return routine.title.trim();
@@ -11499,6 +13222,7 @@ async function syncExistingCompanyRoutines({
11499
13222
  title,
11500
13223
  description: routine.description || null,
11501
13224
  assigneeAgentId,
13225
+ ...routineProjectPayload(routine, void 0, { sync: true }),
11502
13226
  priority: routine.priority || "medium",
11503
13227
  status: routine.status || "active",
11504
13228
  concurrencyPolicy: routine.concurrencyPolicy || "skip_if_active",
@@ -11622,34 +13346,52 @@ var plugin = definePlugin({
11622
13346
  });
11623
13347
  ctx.actions.register("check-update", async () => {
11624
13348
  try {
11625
- const response = await fetch(NPM_LATEST_URL, {
11626
- headers: { accept: "application/json" }
11627
- });
11628
- if (!response.ok) {
11629
- return {
11630
- ok: false,
11631
- currentVersion: CURRENT_PLUGIN_VERSION,
11632
- packageName: PLUGIN_PACKAGE_NAME,
11633
- error: `npm registry returned ${response.status}`
11634
- };
11635
- }
11636
- const data = await response.json();
11637
- const latestVersion = typeof data.version === "string" ? data.version.trim() : "";
11638
- if (!latestVersion) {
13349
+ const latestVersion = await fetchLatestPluginVersion();
13350
+ return {
13351
+ ok: true,
13352
+ packageName: PLUGIN_PACKAGE_NAME,
13353
+ currentVersion: CURRENT_PLUGIN_VERSION,
13354
+ latestVersion,
13355
+ updateAvailable: isNewerVersion(latestVersion, CURRENT_PLUGIN_VERSION),
13356
+ url: "https://www.npmjs.com/package/@starlein/paperclip-plugin-company-wizard"
13357
+ };
13358
+ } catch (err) {
13359
+ return {
13360
+ ok: false,
13361
+ currentVersion: CURRENT_PLUGIN_VERSION,
13362
+ packageName: PLUGIN_PACKAGE_NAME,
13363
+ error: err instanceof Error ? err.message : String(err)
13364
+ };
13365
+ }
13366
+ });
13367
+ ctx.actions.register("prepare-plugin-update", async () => {
13368
+ try {
13369
+ const latestVersion = await fetchLatestPluginVersion();
13370
+ const updateAvailable = isNewerVersion(latestVersion, CURRENT_PLUGIN_VERSION);
13371
+ const cfg = await ctx.config.get() ?? {};
13372
+ const targetDir = refreshTemplatesCache(cfg);
13373
+ const { client } = await connectSharedClient(cfg);
13374
+ const pluginId = await findPluginId(client);
13375
+ if (!pluginId) {
11639
13376
  return {
11640
13377
  ok: false,
11641
13378
  currentVersion: CURRENT_PLUGIN_VERSION,
11642
- packageName: PLUGIN_PACKAGE_NAME,
11643
- error: "npm registry response did not include a version"
13379
+ latestVersion,
13380
+ updateAvailable,
13381
+ templatesUpdated: true,
13382
+ templatesTargetDir: targetDir,
13383
+ error: "Could not find the installed Company Wizard plugin record."
11644
13384
  };
11645
13385
  }
11646
13386
  return {
11647
13387
  ok: true,
13388
+ pluginId,
11648
13389
  packageName: PLUGIN_PACKAGE_NAME,
11649
13390
  currentVersion: CURRENT_PLUGIN_VERSION,
11650
13391
  latestVersion,
11651
- updateAvailable: isNewerVersion(latestVersion, CURRENT_PLUGIN_VERSION),
11652
- url: "https://www.npmjs.com/package/@starlein/paperclip-plugin-company-wizard"
13392
+ updateAvailable,
13393
+ templatesUpdated: true,
13394
+ templatesTargetDir: targetDir
11653
13395
  };
11654
13396
  } catch (err) {
11655
13397
  return {
@@ -12133,6 +13875,14 @@ var plugin = definePlugin({
12133
13875
  let routines = [];
12134
13876
  try {
12135
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));
12136
13886
  if (existingCompanyId) {
12137
13887
  try {
12138
13888
  const pluginId = await findPluginId(client);
@@ -12230,7 +13980,8 @@ var plugin = definePlugin({
12230
13980
  try {
12231
13981
  const ceoPatch = {
12232
13982
  adapterType,
12233
- adapterConfig: preserveExistingSkillSync(existingCeo, adapterConfig),
13983
+ adapterConfig,
13984
+ desiredSkills: desiredSkillsForRole("ceo"),
12234
13985
  runtimeConfig: ceoRuntimeConfig,
12235
13986
  ...ceoMetadata ? { metadata: { ...existingCeo.metadata ?? {}, ...ceoMetadata } } : {}
12236
13987
  };
@@ -12261,6 +14012,7 @@ var plugin = definePlugin({
12261
14012
  reportsTo: null,
12262
14013
  adapterType,
12263
14014
  adapterConfig,
14015
+ desiredSkills: desiredSkillsForRole("ceo"),
12264
14016
  runtimeConfig: ceoRuntimeConfig,
12265
14017
  permissions: { canCreateAgents: true },
12266
14018
  ...boardOperationsIssue?.id ? { sourceIssueId: boardOperationsIssue.id } : {}
@@ -12280,6 +14032,7 @@ var plugin = definePlugin({
12280
14032
  reportsTo: null,
12281
14033
  adapterType,
12282
14034
  adapterConfig,
14035
+ desiredSkills: desiredSkillsForRole("ceo"),
12283
14036
  runtimeConfig: ceoRuntimeConfig,
12284
14037
  permissions: { canCreateAgents: true },
12285
14038
  ...boardOperationsIssue?.id ? { sourceIssueId: boardOperationsIssue.id } : {}
@@ -12346,7 +14099,8 @@ var plugin = definePlugin({
12346
14099
  try {
12347
14100
  await client.updateAgent(existingAgent.id, {
12348
14101
  adapterType,
12349
- adapterConfig: preserveExistingSkillSync(existingAgent, roleAdapterConfig),
14102
+ adapterConfig: roleAdapterConfig,
14103
+ desiredSkills: desiredSkillsForRole(roleName),
12350
14104
  runtimeConfig: roleRuntimeConfig,
12351
14105
  metadata: { ...existingAgent.metadata ?? {}, ...roleMetadata },
12352
14106
  ...!existingAgent.title && roleTitle ? { title: roleTitle } : {},
@@ -12378,6 +14132,7 @@ var plugin = definePlugin({
12378
14132
  reportsTo: ceoAgentId,
12379
14133
  adapterType,
12380
14134
  adapterConfig: roleAdapterConfig,
14135
+ desiredSkills: desiredSkillsForRole(roleName),
12381
14136
  runtimeConfig: roleRuntimeConfig,
12382
14137
  ...hiringPlanIssue?.id ? { sourceIssueId: hiringPlanIssue.id } : {}
12383
14138
  });
@@ -12400,7 +14155,7 @@ var plugin = definePlugin({
12400
14155
  if (!existingCompanyId) {
12401
14156
  let mainProjectId;
12402
14157
  const mainProject = assembleResult.mainProject;
12403
- if (routines.length > 0 && mainProject?.name) {
14158
+ if (routines.some(routineUsesProjectWorkspace) && mainProject?.name) {
12404
14159
  try {
12405
14160
  const createdProject = await client.createProject(companyId, {
12406
14161
  name: mainProject.name,
@@ -12428,7 +14183,7 @@ var plugin = definePlugin({
12428
14183
  title,
12429
14184
  description: routine.description,
12430
14185
  assigneeAgentId,
12431
- projectId: mainProjectId,
14186
+ ...routineProjectPayload(routine, mainProjectId),
12432
14187
  priority: routine.priority || "medium",
12433
14188
  concurrencyPolicy: routine.concurrencyPolicy || "skip_if_active",
12434
14189
  catchUpPolicy: routine.catchUpPolicy || "skip_missed"
@@ -12472,6 +14227,17 @@ var plugin = definePlugin({
12472
14227
  });
12473
14228
  bootstrapIssue = issue;
12474
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
+ }
12475
14241
  } catch (err) {
12476
14242
  log(`\u2717 Provisioning failed: ${err instanceof Error ? err.message : String(err)}`);
12477
14243
  if (createdCompany) {