@tickernelz/wardmote 2026.1112.1 → 2026.1114.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1538,7 +1538,7 @@ var init_native_finalization2 = __esm({
1538
1538
  companyId: z6.string().uuid(),
1539
1539
  result: z6.record(z6.string(), z6.unknown()),
1540
1540
  terminal: z6.object({
1541
- schema: z6.literal("paperclip.prp.terminal.v1"),
1541
+ schema: z6.literal("wardmote.prp.terminal.v1"),
1542
1542
  turnTerminalState: z6.enum(["completed", "failed", "interrupted", "cancelled"]),
1543
1543
  runTerminalState: z6.enum(["succeeded", "failed", "cancelled"]),
1544
1544
  reportedWorkDisposition: z6.enum(["done", "blocked", "needs_review", "yielded"])
@@ -1989,7 +1989,9 @@ var init_work_product = __esm({
1989
1989
  executionWorkspaceId: z11.string().guid().optional().nullable(),
1990
1990
  runtimeServiceId: z11.string().guid().optional().nullable(),
1991
1991
  type: issueWorkProductTypeSchema,
1992
- provider: z11.string().min(1),
1992
+ provider: z11.string().min(1).refine((provider) => provider !== "paperclip", {
1993
+ message: 'The work product provider "paperclip" was renamed to "wardmote"'
1994
+ }),
1993
1995
  externalId: z11.string().optional().nullable(),
1994
1996
  title: z11.string().min(1),
1995
1997
  url: z11.string().url().optional().nullable(),
@@ -2081,12 +2083,12 @@ function questionSetToAskUserQuestionsPayload(questionSet) {
2081
2083
  ...description !== void 0 ? { description } : {}
2082
2084
  }));
2083
2085
  const freeTextOption = question.answerMode === "text" ? {
2084
- id: "paperclip_text_answer",
2086
+ id: "wardmote_text_answer",
2085
2087
  label: question.header || "Type an answer",
2086
2088
  ...question.textValidation?.inputType ? { description: `Expected ${question.textValidation.inputType} input` } : {},
2087
2089
  freeText: true
2088
2090
  } : question.customAnswer?.enabled ? {
2089
- id: syntheticOptionId(options.map((option) => option.id), "paperclip_custom_answer"),
2091
+ id: syntheticOptionId(options.map((option) => option.id), "wardmote_custom_answer"),
2090
2092
  label: question.customAnswer.label || "Other",
2091
2093
  ...question.customAnswer.placeholder !== void 0 ? { description: question.customAnswer.placeholder } : {},
2092
2094
  freeText: true
@@ -4267,7 +4269,7 @@ var init_cognee = __esm({
4267
4269
  ],
4268
4270
  whenToUse: "Connect your Cloud tenant through the official Cognee MCP client.",
4269
4271
  defaults: {
4270
- templateKey: "paperclip.cognee-cloud"
4272
+ templateKey: "wardmote.cognee-cloud"
4271
4273
  },
4272
4274
  guidanceMd: "Copy the API Base URL and create an API key on Cognee's API Keys page. Use a Cloud workspace with an active subscription. Wardmote uses its bundled Cloud client; no extra runtime installation is required.",
4273
4275
  riskTier: "S3",
@@ -9289,7 +9291,7 @@ var init_google_sheets = __esm({
9289
9291
  ],
9290
9292
  whenToUse: "Share selected spreadsheets with the Wardmote robot account instead of connecting a Google identity.",
9291
9293
  defaults: {
9292
- templateKey: "paperclip.google-sheets"
9294
+ templateKey: "wardmote.google-sheets"
9293
9295
  },
9294
9296
  guidanceMd: "Share each spreadsheet with the Wardmote robot email, then paste the sheet links.",
9295
9297
  riskTier: "S3",
@@ -16614,7 +16616,7 @@ var init_smoke_lab = __esm({
16614
16616
  });
16615
16617
 
16616
16618
  // ../packages/shared/src/types/instance.ts
16617
- var DAILY_RETENTION_PRESETS, WEEKLY_RETENTION_PRESETS, MONTHLY_RETENTION_PRESETS, BACKUP_MAX_FILES_MIN, BACKUP_MAX_FILES_MAX, DEFAULT_BACKUP_RETENTION, SPEECH_TO_TEXT_DEFAULTS, ATTACHMENT_MAX_MEGABYTES_MIN, ATTACHMENT_MAX_MEGABYTES_MAX, ATTACHMENT_ORPHAN_AFTER_DAYS_MIN, ATTACHMENT_ORPHAN_AFTER_DAYS_MAX, ATTACHMENT_CLOSED_TASK_AFTER_DAYS_MIN, ATTACHMENT_CLOSED_TASK_AFTER_DAYS_MAX, DEFAULT_ATTACHMENT_RETENTION, DEFAULT_LOCAL_RUN_LIMITS_SETTINGS, DEFAULT_MESSAGE_DELIVERY;
16619
+ var DAILY_RETENTION_PRESETS, WEEKLY_RETENTION_PRESETS, MONTHLY_RETENTION_PRESETS, BACKUP_MAX_FILES_MIN, BACKUP_MAX_FILES_MAX, DEFAULT_BACKUP_RETENTION, SPEECH_TO_TEXT_PROVIDERS, SPEECH_TO_TEXT_GOOGLE_MAX_LANGUAGES, SPEECH_TO_TEXT_KEYTERMS_MAX, SPEECH_TO_TEXT_KEYTERM_MAX_LENGTH, SPEECH_TO_TEXT_MAX_SPEAKERS, SPEECH_TO_TEXT_DEFAULTS, ATTACHMENT_MAX_MEGABYTES_MIN, ATTACHMENT_MAX_MEGABYTES_MAX, ATTACHMENT_ORPHAN_AFTER_DAYS_MIN, ATTACHMENT_ORPHAN_AFTER_DAYS_MAX, ATTACHMENT_CLOSED_TASK_AFTER_DAYS_MIN, ATTACHMENT_CLOSED_TASK_AFTER_DAYS_MAX, DEFAULT_ATTACHMENT_RETENTION, DEFAULT_LOCAL_RUN_LIMITS_SETTINGS, DEFAULT_MESSAGE_DELIVERY;
16618
16620
  var init_instance = __esm({
16619
16621
  "../packages/shared/src/types/instance.ts"() {
16620
16622
  "use strict";
@@ -16629,11 +16631,23 @@ var init_instance = __esm({
16629
16631
  monthlyMonths: 1,
16630
16632
  maxFiles: 2
16631
16633
  };
16634
+ SPEECH_TO_TEXT_PROVIDERS = ["openai_compatible", "deepgram", "elevenlabs", "google"];
16635
+ SPEECH_TO_TEXT_GOOGLE_MAX_LANGUAGES = 3;
16636
+ SPEECH_TO_TEXT_KEYTERMS_MAX = 100;
16637
+ SPEECH_TO_TEXT_KEYTERM_MAX_LENGTH = 50;
16638
+ SPEECH_TO_TEXT_MAX_SPEAKERS = 32;
16632
16639
  SPEECH_TO_TEXT_DEFAULTS = {
16633
16640
  enabled: false,
16641
+ provider: "openai_compatible",
16634
16642
  baseUrl: "",
16635
16643
  model: "",
16636
16644
  apiKeyEnvVar: "",
16645
+ language: "",
16646
+ diarize: false,
16647
+ keyterms: [],
16648
+ deepgram: { smartFormat: true },
16649
+ elevenlabs: { tagAudioEvents: false, numSpeakers: null },
16650
+ google: { location: "us", projectId: "", autoPunctuation: true, alternativeLanguages: [] },
16637
16651
  maxAudioSeconds: 600,
16638
16652
  sttWaitSeconds: 15
16639
16653
  };
@@ -17213,7 +17227,10 @@ function isSpeechToTextBaseUrl(value) {
17213
17227
  if (url.username || url.password || url.search || url.hash) return false;
17214
17228
  return ["/", "/v1", "/v1/"].includes(url.pathname);
17215
17229
  }
17216
- var messageDeliverySchema, backupRetentionPolicySchema, speechToTextSettingsSchema, attachmentMaxMegabytesSchema, attachmentRetentionSettingsSchema, localRunLimitsSettingsSchema, instanceGeneralSettingsSchema, patchInstanceGeneralSettingsSchema, instanceExperimentalSettingsSchema, patchInstanceExperimentalSettingsSchema, patchInstanceSettingsSchema, MAX_TASK_DRAIN_TTL_MS, startTaskDrainRequestSchema, instanceSettingsSchema;
17230
+ function isGoogleChirpModel(model) {
17231
+ return model.startsWith("chirp");
17232
+ }
17233
+ var messageDeliverySchema, backupRetentionPolicySchema, speechToTextProviderSchema, speechToTextBaseUrlSchema, speechToTextApiKeyEnvVarSchema, speechToTextKeytermSchema, speechToTextGoogleLocationSchema, speechToTextGoogleProjectIdSchema, speechToTextLanguageCodeSchema, speechToTextSettingsSchema, speechToTextModelListRequestSchema, attachmentMaxMegabytesSchema, attachmentRetentionSettingsSchema, localRunLimitsSettingsSchema, instanceGeneralSettingsSchema, patchInstanceGeneralSettingsSchema, instanceExperimentalSettingsSchema, patchInstanceExperimentalSettingsSchema, patchInstanceSettingsSchema, MAX_TASK_DRAIN_TTL_MS, startTaskDrainRequestSchema, instanceSettingsSchema;
17217
17234
  var init_instance2 = __esm({
17218
17235
  "../packages/shared/src/validators/instance.ts"() {
17219
17236
  "use strict";
@@ -17229,20 +17246,69 @@ var init_instance2 = __esm({
17229
17246
  monthlyMonths: presetSchema(MONTHLY_RETENTION_PRESETS, "monthlyMonths").default(DEFAULT_BACKUP_RETENTION.monthlyMonths),
17230
17247
  maxFiles: z40.number().int().min(BACKUP_MAX_FILES_MIN).max(BACKUP_MAX_FILES_MAX).nullable().default(DEFAULT_BACKUP_RETENTION.maxFiles)
17231
17248
  });
17249
+ speechToTextProviderSchema = z40.enum(SPEECH_TO_TEXT_PROVIDERS);
17250
+ speechToTextBaseUrlSchema = z40.string().trim().max(2048).refine(isSpeechToTextBaseUrl, {
17251
+ message: "Speech-to-text base URL must be an http(s) origin or end at /v1, without credentials, query or fragment"
17252
+ });
17253
+ speechToTextApiKeyEnvVarSchema = z40.string().trim().max(128).regex(/^(?:[A-Za-z_][A-Za-z0-9_]*)?$/, {
17254
+ message: "Speech-to-text API key must name a server environment variable, not hold the key itself"
17255
+ });
17256
+ speechToTextKeytermSchema = z40.string().trim().min(1).max(SPEECH_TO_TEXT_KEYTERM_MAX_LENGTH).regex(/^[^<>{}[\]\\]+$/, { message: "Keyterms cannot contain < > { } [ ] or \\" });
17257
+ speechToTextGoogleLocationSchema = z40.string().trim().regex(/^[a-z][a-z0-9-]{1,39}$/, { message: "Google speech-to-text location must be global, us, eu or a region such as asia-southeast1" });
17258
+ speechToTextGoogleProjectIdSchema = z40.string().trim().regex(/^(?:[a-z][a-z0-9-]{4,28}[a-z0-9])?$/, { message: "Google Cloud project id must be 6 to 30 lowercase letters, digits or hyphens" });
17259
+ speechToTextLanguageCodeSchema = z40.string().trim().regex(/^[A-Za-z]{2,3}(?:-[A-Za-z0-9]{2,8})*$/, { message: "Speech-to-text language must be a code such as en or pt-BR" });
17232
17260
  speechToTextSettingsSchema = z40.object({
17233
17261
  enabled: z40.boolean().default(SPEECH_TO_TEXT_DEFAULTS.enabled),
17234
- baseUrl: z40.string().trim().max(2048).refine(isSpeechToTextBaseUrl, {
17235
- message: "Speech-to-text base URL must be an http(s) origin or end at /v1, without credentials, query or fragment"
17236
- }).default(SPEECH_TO_TEXT_DEFAULTS.baseUrl),
17262
+ provider: speechToTextProviderSchema.default(SPEECH_TO_TEXT_DEFAULTS.provider),
17263
+ baseUrl: speechToTextBaseUrlSchema.default(SPEECH_TO_TEXT_DEFAULTS.baseUrl),
17237
17264
  model: z40.string().trim().max(200).default(SPEECH_TO_TEXT_DEFAULTS.model),
17238
- apiKeyEnvVar: z40.string().trim().max(128).regex(/^(?:[A-Za-z_][A-Za-z0-9_]*)?$/, {
17239
- message: "Speech-to-text API key must name a server environment variable, not hold the key itself"
17240
- }).default(SPEECH_TO_TEXT_DEFAULTS.apiKeyEnvVar),
17265
+ apiKeyEnvVar: speechToTextApiKeyEnvVarSchema.default(SPEECH_TO_TEXT_DEFAULTS.apiKeyEnvVar),
17266
+ language: z40.string().trim().max(35).regex(/^(?:multi|[A-Za-z]{2,3}(?:-[A-Za-z0-9]{2,8})*)?$/, {
17267
+ message: "Speech-to-text language must be empty for automatic detection, a language code such as en or pt-BR, or multi"
17268
+ }).default(SPEECH_TO_TEXT_DEFAULTS.language),
17269
+ diarize: z40.boolean().default(SPEECH_TO_TEXT_DEFAULTS.diarize),
17270
+ keyterms: z40.array(speechToTextKeytermSchema).max(SPEECH_TO_TEXT_KEYTERMS_MAX).default(SPEECH_TO_TEXT_DEFAULTS.keyterms),
17271
+ deepgram: z40.object({ smartFormat: z40.boolean().default(SPEECH_TO_TEXT_DEFAULTS.deepgram.smartFormat) }).strict().default(SPEECH_TO_TEXT_DEFAULTS.deepgram),
17272
+ elevenlabs: z40.object({
17273
+ tagAudioEvents: z40.boolean().default(SPEECH_TO_TEXT_DEFAULTS.elevenlabs.tagAudioEvents),
17274
+ numSpeakers: z40.number().int().min(1).max(SPEECH_TO_TEXT_MAX_SPEAKERS).nullable().default(SPEECH_TO_TEXT_DEFAULTS.elevenlabs.numSpeakers)
17275
+ }).strict().default(SPEECH_TO_TEXT_DEFAULTS.elevenlabs),
17276
+ google: z40.object({
17277
+ location: speechToTextGoogleLocationSchema.default(SPEECH_TO_TEXT_DEFAULTS.google.location),
17278
+ projectId: speechToTextGoogleProjectIdSchema.default(SPEECH_TO_TEXT_DEFAULTS.google.projectId),
17279
+ autoPunctuation: z40.boolean().default(SPEECH_TO_TEXT_DEFAULTS.google.autoPunctuation),
17280
+ alternativeLanguages: z40.array(speechToTextLanguageCodeSchema).max(SPEECH_TO_TEXT_GOOGLE_MAX_LANGUAGES - 1).default(SPEECH_TO_TEXT_DEFAULTS.google.alternativeLanguages)
17281
+ }).strict().default(SPEECH_TO_TEXT_DEFAULTS.google),
17241
17282
  maxAudioSeconds: z40.number().int().min(1).max(7200).default(SPEECH_TO_TEXT_DEFAULTS.maxAudioSeconds),
17242
17283
  sttWaitSeconds: z40.number().int().min(1).max(120).default(SPEECH_TO_TEXT_DEFAULTS.sttWaitSeconds)
17243
- }).strict().refine((value) => !value.enabled || value.baseUrl !== "" && value.model !== "" && value.apiKeyEnvVar !== "", {
17244
- message: "Speech-to-text needs a base URL, a model and an API key environment variable before it can be enabled"
17284
+ }).strict().refine(
17285
+ (value) => !value.enabled || value.model !== "" && value.apiKeyEnvVar !== "" && (value.provider !== "openai_compatible" || value.baseUrl !== ""),
17286
+ {
17287
+ message: "Speech-to-text needs a model, an API key environment variable and, for OpenAI-compatible endpoints, a base URL before it can be enabled"
17288
+ }
17289
+ ).superRefine((value, ctx) => {
17290
+ if (value.provider !== "google") return;
17291
+ if (value.language === "multi")
17292
+ ctx.addIssue({ code: "custom", path: ["language"], message: "Google speech-to-text has no multi language; leave it empty for Chirp automatic detection or add alternative languages" });
17293
+ const chirp = isGoogleChirpModel(value.model);
17294
+ if (value.model !== "" && !chirp && value.language === "")
17295
+ ctx.addIssue({ code: "custom", path: ["language"], message: "Google models other than Chirp need a language; only Chirp detects it automatically" });
17296
+ if (value.google.alternativeLanguages.length > 0 && (chirp || value.language === ""))
17297
+ ctx.addIssue({
17298
+ code: "custom",
17299
+ path: ["google", "alternativeLanguages"],
17300
+ message: "Google alternative languages need a primary language and the long, short or telephony model"
17301
+ });
17245
17302
  });
17303
+ speechToTextModelListRequestSchema = z40.object({
17304
+ provider: speechToTextProviderSchema,
17305
+ baseUrl: speechToTextBaseUrlSchema.default(""),
17306
+ apiKeyEnvVar: speechToTextApiKeyEnvVarSchema.default(""),
17307
+ google: z40.object({
17308
+ location: speechToTextGoogleLocationSchema.default(SPEECH_TO_TEXT_DEFAULTS.google.location),
17309
+ projectId: speechToTextGoogleProjectIdSchema.default(SPEECH_TO_TEXT_DEFAULTS.google.projectId)
17310
+ }).strict().optional()
17311
+ }).strict();
17246
17312
  attachmentMaxMegabytesSchema = z40.number().int().min(ATTACHMENT_MAX_MEGABYTES_MIN).max(ATTACHMENT_MAX_MEGABYTES_MAX);
17247
17313
  attachmentRetentionSettingsSchema = z40.object({
17248
17314
  enabled: z40.boolean().default(DEFAULT_ATTACHMENT_RETENTION.enabled),
@@ -17733,7 +17799,7 @@ var init_company_skill = __esm({
17733
17799
  companySkillSourceTypeSchema = z47.enum(["local_path", "github", "url", "catalog", "skills_sh"]);
17734
17800
  companySkillTrustLevelSchema = z47.enum(["markdown_only", "assets", "scripts_executables"]);
17735
17801
  companySkillCompatibilitySchema = z47.enum(["compatible", "unknown", "invalid"]);
17736
- companySkillSourceBadgeSchema = z47.enum(["paperclip", "github", "local", "url", "catalog", "skills_sh"]);
17802
+ companySkillSourceBadgeSchema = z47.enum(["wardmote", "github", "local", "url", "catalog", "skills_sh"]);
17737
17803
  companySkillSharingScopeSchema = z47.enum(["private", "company", "public_link"]);
17738
17804
  companySkillListSortSchema = z47.enum(["alphabetical", "recent", "installs", "stars", "agents", "forks"]);
17739
17805
  companySkillListIncludeSchema = z47.enum(["lastEditor"]);
@@ -20505,7 +20571,7 @@ var init_config_schema = __esm({
20505
20571
  baseDir: z70.string().default("~/.wardmote/instances/default/data/storage")
20506
20572
  }).passthrough();
20507
20573
  storageS3ConfigSchema = z70.object({
20508
- bucket: z70.string().min(1).default("paperclip"),
20574
+ bucket: z70.string().min(1).default("wardmote"),
20509
20575
  region: z70.string().min(1).default("us-east-1"),
20510
20576
  endpoint: z70.string().optional(),
20511
20577
  prefix: z70.string().default(""),
@@ -20517,7 +20583,7 @@ var init_config_schema = __esm({
20517
20583
  baseDir: "~/.wardmote/instances/default/data/storage"
20518
20584
  }),
20519
20585
  s3: storageS3ConfigSchema.default({
20520
- bucket: "paperclip",
20586
+ bucket: "wardmote",
20521
20587
  region: "us-east-1",
20522
20588
  prefix: "",
20523
20589
  forcePathStyle: false
@@ -20582,7 +20648,7 @@ var init_config_schema = __esm({
20582
20648
  baseDir: "~/.wardmote/instances/default/data/storage"
20583
20649
  },
20584
20650
  s3: {
20585
- bucket: "paperclip",
20651
+ bucket: "wardmote",
20586
20652
  region: "us-east-1",
20587
20653
  prefix: "",
20588
20654
  forcePathStyle: false
@@ -20886,7 +20952,7 @@ var init_feature_catalog = __esm({
20886
20952
  },
20887
20953
  enableBetaSkills: {
20888
20954
  title: "Beta skills",
20889
- description: "Allow agents to pin beta releases of the core paperclip skill.",
20955
+ description: "Allow agents to pin beta releases of the core wardmote skill.",
20890
20956
  selfHostedDefault: false
20891
20957
  },
20892
20958
  enableSummaries: {
@@ -21730,7 +21796,7 @@ var init_announcements = __esm({
21730
21796
  secondaryLink: announcementActionSchema.optional(),
21731
21797
  primaryAction: announcementActionSchema,
21732
21798
  expiresAt: z80.string().datetime({ offset: true }).optional(),
21733
- minimumPaperclipVersion: z80.string().regex(/^\d+\.\d+\.\d+$/).optional()
21799
+ minimumWardmoteVersion: z80.string().regex(/^\d+\.\d+\.\d+$/).optional()
21734
21800
  }).strict().refine((value) => !value.animation || Boolean(value.image), {
21735
21801
  message: "An animation requires a static fallback image",
21736
21802
  path: ["image"]
@@ -21917,7 +21983,7 @@ var init_openwa_tools = __esm({
21917
21983
  "read",
21918
21984
  "List OpenWA gateway operations with category and availability on this engine and key. Filter by category or text; page with cursor.",
21919
21985
  {
21920
- category: z81.enum(["read", "write", "wa_admin", "gateway_admin", "paperclip"]).optional(),
21986
+ category: z81.enum(["read", "write", "wa_admin", "gateway_admin", "wardmote"]).optional(),
21921
21987
  query: z81.string().min(1).max(100).optional(),
21922
21988
  cursor: cursor2
21923
21989
  }
@@ -26727,6 +26793,13 @@ var init_wardmote_updates = __esm({
26727
26793
  }
26728
26794
  });
26729
26795
 
26796
+ // ../packages/shared/src/speech-to-text-languages.ts
26797
+ var init_speech_to_text_languages = __esm({
26798
+ "../packages/shared/src/speech-to-text-languages.ts"() {
26799
+ "use strict";
26800
+ }
26801
+ });
26802
+
26730
26803
  // ../packages/shared/src/index.ts
26731
26804
  var init_src = __esm({
26732
26805
  "../packages/shared/src/index.ts"() {
@@ -26875,6 +26948,7 @@ var init_src = __esm({
26875
26948
  init_agent_lifecycle();
26876
26949
  init_fast_response();
26877
26950
  init_wardmote_updates();
26951
+ init_speech_to_text_languages();
26878
26952
  }
26879
26953
  });
26880
26954
 
@@ -27968,7 +28042,7 @@ async function promptDatabase(current) {
27968
28042
  const value = await p.text({
27969
28043
  message: "PostgreSQL connection string",
27970
28044
  defaultValue: connectionStringDefault,
27971
- placeholder: "postgres://user:pass@localhost:5432/paperclip",
28045
+ placeholder: "postgres://user:pass@localhost:5432/wardmote",
27972
28046
  validate: (val) => {
27973
28047
  const candidate = val || connectionStringDefault;
27974
28048
  if (!candidate) return "Connection string is required for PostgreSQL mode";
@@ -28261,7 +28335,7 @@ function defaultStorageConfig() {
28261
28335
  baseDir: defaultStorageBaseDir()
28262
28336
  },
28263
28337
  s3: {
28264
- bucket: "paperclip",
28338
+ bucket: "wardmote",
28265
28339
  region: "us-east-1",
28266
28340
  endpoint: void 0,
28267
28341
  prefix: "",
@@ -28313,12 +28387,12 @@ async function promptStorage(current) {
28313
28387
  s3: base.s3
28314
28388
  };
28315
28389
  }
28316
- const bucketDefault = base.s3.bucket || "paperclip";
28390
+ const bucketDefault = base.s3.bucket || "wardmote";
28317
28391
  const regionDefault = base.s3.region || "us-east-1";
28318
28392
  const bucket = await p5.text({
28319
28393
  message: "S3 bucket",
28320
28394
  defaultValue: bucketDefault,
28321
- placeholder: "paperclip",
28395
+ placeholder: "wardmote",
28322
28396
  validate: (value) => {
28323
28397
  if ((value || bucketDefault).trim().length === 0) return "Bucket is required";
28324
28398
  }
@@ -28351,7 +28425,7 @@ async function promptStorage(current) {
28351
28425
  const prefix = await p5.text({
28352
28426
  message: "Object key prefix (optional)",
28353
28427
  defaultValue: base.s3.prefix ?? "",
28354
- placeholder: "paperclip/"
28428
+ placeholder: "wardmote/"
28355
28429
  });
28356
28430
  if (p5.isCancel(prefix)) {
28357
28431
  p5.cancel("Setup cancelled.");
@@ -30997,7 +31071,7 @@ var init_chat_channels3 = __esm({
30997
31071
  companyId: uuid17("company_id").notNull().references(() => companies.id, { onDelete: "cascade" }),
30998
31072
  endpointId: uuid17("endpoint_id").notNull(),
30999
31073
  principalId: uuid17("principal_id").notNull(),
31000
- wardmoteUserId: text23("paperclip_user_id"),
31074
+ wardmoteUserId: text23("wardmote_user_id"),
31001
31075
  status: text23("status").$type().notNull().default("pending"),
31002
31076
  confirmationTokenHash: text23("confirmation_token_hash"),
31003
31077
  expiresAt: timestamp18("expires_at", { withTimezone: true }),
@@ -35994,9 +36068,9 @@ var init_feedback_exports = __esm({
35994
36068
  destination: text98("destination"),
35995
36069
  exportId: text98("export_id"),
35996
36070
  consentVersion: text98("consent_version"),
35997
- schemaVersion: text98("schema_version").notNull().default("paperclip-feedback-envelope-v2"),
35998
- bundleVersion: text98("bundle_version").notNull().default("paperclip-feedback-bundle-v2"),
35999
- payloadVersion: text98("payload_version").notNull().default("paperclip-feedback-v1"),
36071
+ schemaVersion: text98("schema_version").notNull().default("wardmote-feedback-envelope-v2"),
36072
+ bundleVersion: text98("bundle_version").notNull().default("wardmote-feedback-bundle-v2"),
36073
+ payloadVersion: text98("payload_version").notNull().default("wardmote-feedback-v1"),
36000
36074
  payloadDigest: text98("payload_digest"),
36001
36075
  payloadSnapshot: jsonb61("payload_snapshot"),
36002
36076
  targetSummary: jsonb61("target_summary").notNull(),
@@ -41063,6 +41137,15 @@ var init_schema2 = __esm({
41063
41137
  }
41064
41138
  });
41065
41139
 
41140
+ // ../packages/db/src/retired-migration-lock.ts
41141
+ var RETIRED_MIGRATION_LOCK_KEY;
41142
+ var init_retired_migration_lock = __esm({
41143
+ "../packages/db/src/retired-migration-lock.ts"() {
41144
+ "use strict";
41145
+ RETIRED_MIGRATION_LOCK_KEY = "paperclip:migrations";
41146
+ }
41147
+ });
41148
+
41066
41149
  // ../packages/db/src/client.ts
41067
41150
  import { createHash as createHash2 } from "node:crypto";
41068
41151
  import { drizzle as drizzlePg } from "drizzle-orm/postgres-js";
@@ -41207,7 +41290,7 @@ function createDbClient(url, resolved, owner) {
41207
41290
  dedicatedDbFactories.set(db, () => createDbClient(url, {
41208
41291
  ...resolved,
41209
41292
  maxConnections: 1,
41210
- applicationName: "paperclip-workspace-finalization-lock"
41293
+ applicationName: "wardmote-workspace-finalization-lock"
41211
41294
  }, db));
41212
41295
  return db;
41213
41296
  }
@@ -41347,8 +41430,11 @@ async function applyPendingMigrationsManually(url, pendingMigrations) {
41347
41430
  try {
41348
41431
  const sql72 = await pool.reserve();
41349
41432
  try {
41350
- while (!(await sql72`
41351
- SELECT pg_try_advisory_lock(hashtextextended('paperclip:migrations', 0)) AS locked`)[0]?.locked) {
41433
+ for (; ; ) {
41434
+ const [held] = await sql72.unsafe(MIGRATION_LOCK_TRY_SQL);
41435
+ if (held?.current && held.retired) break;
41436
+ if (held?.current) await sql72.unsafe(`SELECT pg_advisory_unlock(hashtextextended('${MIGRATION_LOCK_KEY}', 0))`);
41437
+ if (held?.retired) await sql72.unsafe(`SELECT pg_advisory_unlock(hashtextextended('${RETIRED_MIGRATION_LOCK_KEY}', 0))`);
41352
41438
  await new Promise((resolve3) => setTimeout(resolve3, 100));
41353
41439
  }
41354
41440
  const { migrationTableSchema, columnNames } = await ensureMigrationJournalTable(sql72);
@@ -41402,7 +41488,7 @@ async function applyPendingMigrationsManually(url, pendingMigrations) {
41402
41488
  }
41403
41489
  } finally {
41404
41490
  try {
41405
- await sql72`SELECT pg_advisory_unlock(hashtextextended('paperclip:migrations', 0))`;
41491
+ await sql72.unsafe(MIGRATION_LOCK_RELEASE_SQL);
41406
41492
  } catch {
41407
41493
  }
41408
41494
  sql72.release();
@@ -41880,15 +41966,19 @@ async function resetPostgresDatabase(url, databaseName) {
41880
41966
  await sql72.end();
41881
41967
  }
41882
41968
  }
41883
- var MIGRATIONS_FOLDER, DRIZZLE_MIGRATIONS_TABLE, MIGRATIONS_JOURNAL_JSON, clientsByHostPort, clientFinalizer, DEFAULT_DATABASE_IDLE_TIMEOUT_SECONDS, DEFAULT_DATABASE_APPLICATION_NAME, dedicatedDbFactories, MIGRATIONS_WITH_TOP_LEVEL_STATEMENTS;
41969
+ var MIGRATIONS_FOLDER, DRIZZLE_MIGRATIONS_TABLE, MIGRATIONS_JOURNAL_JSON, MIGRATION_LOCK_KEY, MIGRATION_LOCK_TRY_SQL, MIGRATION_LOCK_RELEASE_SQL, clientsByHostPort, clientFinalizer, DEFAULT_DATABASE_IDLE_TIMEOUT_SECONDS, DEFAULT_DATABASE_APPLICATION_NAME, dedicatedDbFactories, MIGRATIONS_WITH_TOP_LEVEL_STATEMENTS;
41884
41970
  var init_client = __esm({
41885
41971
  "../packages/db/src/client.ts"() {
41886
41972
  "use strict";
41887
41973
  init_work_signals();
41888
41974
  init_schema2();
41975
+ init_retired_migration_lock();
41889
41976
  MIGRATIONS_FOLDER = fileURLToPath2(new URL("./migrations", import.meta.url));
41890
41977
  DRIZZLE_MIGRATIONS_TABLE = "__drizzle_migrations";
41891
41978
  MIGRATIONS_JOURNAL_JSON = fileURLToPath2(new URL("./migrations/meta/_journal.json", import.meta.url));
41979
+ MIGRATION_LOCK_KEY = "wardmote:migrations";
41980
+ MIGRATION_LOCK_TRY_SQL = `SELECT pg_try_advisory_lock(hashtextextended('${MIGRATION_LOCK_KEY}', 0)) AS current, pg_try_advisory_lock(hashtextextended('${RETIRED_MIGRATION_LOCK_KEY}', 0)) AS retired`;
41981
+ MIGRATION_LOCK_RELEASE_SQL = `SELECT pg_advisory_unlock(hashtextextended('${MIGRATION_LOCK_KEY}', 0)), pg_advisory_unlock(hashtextextended('${RETIRED_MIGRATION_LOCK_KEY}', 0))`;
41892
41982
  clientsByHostPort = /* @__PURE__ */ new Map();
41893
41983
  clientFinalizer = new FinalizationRegistry(
41894
41984
  ({ hostPortKey: hostPortKey2, ref }) => {
@@ -47886,6 +47976,16 @@ var init_test_embedded_postgres = __esm({
47886
47976
  }
47887
47977
  });
47888
47978
 
47979
+ // ../packages/db/src/retired-backup-names.ts
47980
+ var RETIRED_BACKUP_FILENAME_PREFIX, RETIRED_STATEMENT_BREAKPOINT;
47981
+ var init_retired_backup_names = __esm({
47982
+ "../packages/db/src/retired-backup-names.ts"() {
47983
+ "use strict";
47984
+ RETIRED_BACKUP_FILENAME_PREFIX = "paperclip";
47985
+ RETIRED_STATEMENT_BREAKPOINT = "-- paperclip statement breakpoint 69f6f3f1-42fd-46a6-bf17-d1d85f8f3900";
47986
+ }
47987
+ });
47988
+
47889
47989
  // ../packages/db/src/backup-lib.ts
47890
47990
  import { createReadStream, createWriteStream, existsSync, mkdirSync, readdirSync, renameSync, rmSync, statfsSync, statSync, unlinkSync, writeFileSync } from "node:fs";
47891
47991
  import { basename, join as join2, resolve as resolve2 } from "node:path";
@@ -47897,6 +47997,9 @@ import { pipeline } from "node:stream/promises";
47897
47997
  import { createGunzip, createGzip } from "node:zlib";
47898
47998
  import postgres3 from "postgres";
47899
47999
  import { randomUUID as randomUUID3 } from "node:crypto";
48000
+ function isStatementBreakpoint(line) {
48001
+ return line === STATEMENT_BREAKPOINT || line === RETIRED_STATEMENT_BREAKPOINT;
48002
+ }
47900
48003
  function sanitizeRestoreErrorMessage(error) {
47901
48004
  if (error && typeof error === "object") {
47902
48005
  const record2 = error;
@@ -48155,9 +48258,9 @@ function formatBackupSize(sizeBytes) {
48155
48258
  }
48156
48259
  function formatSqlLiteral(value) {
48157
48260
  const sanitized = value.replace(/\u0000/g, "");
48158
- let tag = "$paperclip$";
48261
+ let tag = "$wardmote$";
48159
48262
  while (sanitized.includes(tag)) {
48160
- tag = `$paperclip_${Math.random().toString(36).slice(2, 8)}$`;
48263
+ tag = `$wardmote_${Math.random().toString(36).slice(2, 8)}$`;
48161
48264
  }
48162
48265
  return `${tag}${sanitized}${tag}`;
48163
48266
  }
@@ -48310,10 +48413,10 @@ async function hasStatementBreakpoints(backupFile) {
48310
48413
  try {
48311
48414
  for await (const chunk of stream) {
48312
48415
  text169 += Buffer.isBuffer(chunk) ? chunk.toString("utf8") : String(chunk);
48313
- if (text169.includes(STATEMENT_BREAKPOINT)) return true;
48416
+ if (text169.includes(STATEMENT_BREAKPOINT) || text169.includes(RETIRED_STATEMENT_BREAKPOINT)) return true;
48314
48417
  if (Buffer.byteLength(text169, "utf8") >= BACKUP_BREAKPOINT_DETECT_BYTES) return false;
48315
48418
  }
48316
- return text169.includes(STATEMENT_BREAKPOINT);
48419
+ return text169.includes(STATEMENT_BREAKPOINT) || text169.includes(RETIRED_STATEMENT_BREAKPOINT);
48317
48420
  } finally {
48318
48421
  stream.destroy();
48319
48422
  raw.destroy();
@@ -48335,7 +48438,7 @@ async function* readRestoreStatements(backupFile) {
48335
48438
  };
48336
48439
  try {
48337
48440
  for await (const line of reader) {
48338
- if (line === STATEMENT_BREAKPOINT) {
48441
+ if (isStatementBreakpoint(line)) {
48339
48442
  const statement = flushStatement();
48340
48443
  if (statement.length > 0) {
48341
48444
  yield statement;
@@ -48959,15 +49062,16 @@ function formatDatabaseBackupResult(result) {
48959
49062
  const unreadable = result.unreadableBackups?.length ? `; kept ${result.unreadableBackups.length} unreadable backup(s)` : "";
48960
49063
  return `${result.backupFile} (${size}${pruned}${unreadable})`;
48961
49064
  }
48962
- var DEFAULT_BACKUP_WRITE_BUFFER_BYTES, BACKUP_DATA_CURSOR_ROWS, BACKUP_CLI_STDERR_BYTES, BACKUP_BREAKPOINT_DETECT_BYTES, STATEMENT_BREAKPOINT, DATABASE_BACKUP_FILENAME_PREFIX, PINNED_BACKUP_DIRNAME, DATABASE_BACKUP_SKIPPED_MARKER, DEFAULT_BACKUP_HEADROOM_FACTOR, DAY_MS2, DatabaseBackupSkippedError, verifiedBackups, RETIRED_BACKUP_FILENAME_PREFIX, PARTIAL_BACKUP_PATTERN, ABANDONED_PARTIAL_BACKUP_AGE_MS, activePartialBackupFiles;
49065
+ var DEFAULT_BACKUP_WRITE_BUFFER_BYTES, BACKUP_DATA_CURSOR_ROWS, BACKUP_CLI_STDERR_BYTES, BACKUP_BREAKPOINT_DETECT_BYTES, STATEMENT_BREAKPOINT, DATABASE_BACKUP_FILENAME_PREFIX, PINNED_BACKUP_DIRNAME, DATABASE_BACKUP_SKIPPED_MARKER, DEFAULT_BACKUP_HEADROOM_FACTOR, DAY_MS2, DatabaseBackupSkippedError, verifiedBackups, PARTIAL_BACKUP_PATTERN, ABANDONED_PARTIAL_BACKUP_AGE_MS, activePartialBackupFiles;
48963
49066
  var init_backup_lib = __esm({
48964
49067
  "../packages/db/src/backup-lib.ts"() {
48965
49068
  "use strict";
49069
+ init_retired_backup_names();
48966
49070
  DEFAULT_BACKUP_WRITE_BUFFER_BYTES = 1024 * 1024;
48967
49071
  BACKUP_DATA_CURSOR_ROWS = 100;
48968
49072
  BACKUP_CLI_STDERR_BYTES = 64 * 1024;
48969
49073
  BACKUP_BREAKPOINT_DETECT_BYTES = 64 * 1024;
48970
- STATEMENT_BREAKPOINT = "-- paperclip statement breakpoint 69f6f3f1-42fd-46a6-bf17-d1d85f8f3900";
49074
+ STATEMENT_BREAKPOINT = "-- wardmote statement breakpoint 69f6f3f1-42fd-46a6-bf17-d1d85f8f3900";
48971
49075
  DATABASE_BACKUP_FILENAME_PREFIX = "wardmote";
48972
49076
  PINNED_BACKUP_DIRNAME = "pinned";
48973
49077
  DATABASE_BACKUP_SKIPPED_MARKER = "backup-skipped.json";
@@ -48989,7 +49093,6 @@ var init_backup_lib = __esm({
48989
49093
  code = "database_backup_skipped_low_disk";
48990
49094
  };
48991
49095
  verifiedBackups = /* @__PURE__ */ new Map();
48992
- RETIRED_BACKUP_FILENAME_PREFIX = "paperclip";
48993
49096
  PARTIAL_BACKUP_PATTERN = /\.(\d+)\.partial$/;
48994
49097
  ABANDONED_PARTIAL_BACKUP_AGE_MS = 24 * 60 * 60 * 1e3;
48995
49098
  activePartialBackupFiles = /* @__PURE__ */ new Set();
@@ -49734,7 +49837,7 @@ var init_client2 = __esm({
49734
49837
  buildEnvelope(events, batchId) {
49735
49838
  const state = this.getState();
49736
49839
  return {
49737
- app: this.config.app ?? "paperclip",
49840
+ app: this.config.app ?? "wardmote",
49738
49841
  schemaVersion: this.config.schemaVersion ?? "1",
49739
49842
  installId: state.installId,
49740
49843
  version: this.version,
@@ -50501,7 +50604,7 @@ var init_release_packages = __esm({
50501
50604
  "@tickernelz/wardmote",
50502
50605
  "@tickernelz/wardmote-adapter-omp-local",
50503
50606
  "@tickernelz/wardmote-adapter-utils",
50504
- "@tickernelz/wardmote-create-paperclip-plugin",
50607
+ "@tickernelz/wardmote-create-plugin",
50505
50608
  "@tickernelz/wardmote-db",
50506
50609
  "@tickernelz/wardmote-mcp-server",
50507
50610
  "@tickernelz/wardmote-plugin-cloudflare-sandbox",
@@ -50614,9 +50717,26 @@ async function resolvePublishedVersion(spec, runCommand2) {
50614
50717
  );
50615
50718
  return parseResolvedVersion(result.stdout);
50616
50719
  }
50720
+ async function resolveReleasePackageNames(version, runCommand2) {
50721
+ try {
50722
+ const result = await runCommand2(
50723
+ "npm",
50724
+ ["view", `@tickernelz/wardmote@${version}`, "wardmoteReleasePackages", "--json", `--registry=${PUBLIC_NPM_REGISTRY}`],
50725
+ { maxBuffer: 1024 * 1024 }
50726
+ );
50727
+ const declared = JSON.parse(result.stdout.trim() || "null");
50728
+ if (Array.isArray(declared) && declared.length > 0 && declared.every((name) => typeof name === "string" && name.startsWith("@tickernelz/"))) {
50729
+ return declared;
50730
+ }
50731
+ } catch {
50732
+ return RELEASE_PACKAGE_NAMES;
50733
+ }
50734
+ return RELEASE_PACKAGE_NAMES;
50735
+ }
50617
50736
  async function assertReleaseSetPublished(version, runCommand2) {
50737
+ const names = await resolveReleasePackageNames(version, runCommand2);
50618
50738
  const missing = [];
50619
- const queue = [...RELEASE_PACKAGE_NAMES];
50739
+ const queue = [...names];
50620
50740
  const probe = async () => {
50621
50741
  for (let name = queue.pop(); name !== void 0; name = queue.pop()) {
50622
50742
  try {
@@ -50631,10 +50751,10 @@ async function assertReleaseSetPublished(version, runCommand2) {
50631
50751
  }
50632
50752
  }
50633
50753
  };
50634
- await Promise.all(Array.from({ length: Math.min(8, RELEASE_PACKAGE_NAMES.length) }, probe));
50754
+ await Promise.all(Array.from({ length: Math.min(8, names.length) }, probe));
50635
50755
  if (missing.length > 0) {
50636
50756
  throw new Error(
50637
- `Release ${version} is incomplete on ${PUBLIC_NPM_REGISTRY}: ${missing.length} of ${RELEASE_PACKAGE_NAMES.length} packages are not published at that version (${missing.sort().join(", ")}). Installing it would mix versions across packages. Wait for the release to finish publishing, or pass --version with a complete release.`
50757
+ `Release ${version} is incomplete on ${PUBLIC_NPM_REGISTRY}: ${missing.length} of ${names.length} packages are not published at that version (${missing.sort().join(", ")}). Installing it would mix versions across packages. Wait for the release to finish publishing, or pass --version with a complete release.`
50638
50758
  );
50639
50759
  }
50640
50760
  }
@@ -50910,7 +51030,7 @@ async function installCommand(options, dependencies = {}) {
50910
51030
  const request = resolveNpmInstallRequest(options);
50911
51031
  console.log(`Resolving @tickernelz/wardmote@${request.spec} from ${PUBLIC_NPM_REGISTRY}...`);
50912
51032
  const version = await resolvePublishedVersion(request.spec, runCommand2);
50913
- console.log(`Verifying all ${RELEASE_PACKAGE_NAMES.length} packages of release ${version}...`);
51033
+ console.log(`Verifying the packages of release ${version}...`);
50914
51034
  await assertReleaseSetPublished(version, runCommand2);
50915
51035
  console.log(`Installing @tickernelz/wardmote@${version}...`);
50916
51036
  const paths = resolveInstallStorePaths();
@@ -51918,7 +52038,7 @@ async function createSshAuthArgs(config) {
51918
52038
  ];
51919
52039
  if (config.strictHostKeyChecking) {
51920
52040
  if (config.knownHosts) {
51921
- const knownHosts = await withTempFile("paperclip-ssh-known-hosts-", config.knownHosts, 384);
52041
+ const knownHosts = await withTempFile("wardmote-ssh-known-hosts-", config.knownHosts, 384);
51922
52042
  tempFiles.push(knownHosts.cleanup);
51923
52043
  sshArgs.push("-o", `UserKnownHostsFile=${knownHosts.path}`);
51924
52044
  }
@@ -51926,7 +52046,7 @@ async function createSshAuthArgs(config) {
51926
52046
  sshArgs.push("-o", "UserKnownHostsFile=/dev/null");
51927
52047
  }
51928
52048
  if (config.privateKey) {
51929
- const privateKey = await withTempFile("paperclip-ssh-key-", config.privateKey, 384);
52049
+ const privateKey = await withTempFile("wardmote-ssh-key-", config.privateKey, 384);
51930
52050
  tempFiles.push(privateKey.cleanup);
51931
52051
  sshArgs.push("-i", privateKey.path);
51932
52052
  }
@@ -61289,7 +61409,7 @@ import pc7 from "picocolors";
61289
61409
  async function doctor(opts) {
61290
61410
  await printUpdateNotice(opts.config);
61291
61411
  printWardmoteCliBanner();
61292
- p10.intro(pc7.bgCyan(pc7.black(" paperclip doctor ")));
61412
+ p10.intro(pc7.bgCyan(pc7.black(" wardmote doctor ")));
61293
61413
  const configPath = resolveConfigPath(opts.config);
61294
61414
  loadWardmoteEnvFile(configPath);
61295
61415
  const results = [];
@@ -62115,7 +62235,7 @@ function buildWorktreeConfig(input2) {
62115
62235
  baseDir: paths.storageDir
62116
62236
  },
62117
62237
  s3: {
62118
- bucket: source?.storage.s3.bucket ?? "paperclip",
62238
+ bucket: source?.storage.s3.bucket ?? "wardmote",
62119
62239
  region: source?.storage.s3.region ?? "us-east-1",
62120
62240
  endpoint: source?.storage.s3.endpoint,
62121
62241
  prefix: source?.storage.s3.prefix ?? "",
@@ -65255,7 +65375,7 @@ async function worktreeListCommand(opts) {
65255
65375
  for (const choice of choices) {
65256
65376
  const flags = [
65257
65377
  choice.isCurrent ? "current" : null,
65258
- choice.hasWardmoteConfig ? "paperclip" : "no-paperclip-config"
65378
+ choice.hasWardmoteConfig ? "wardmote" : "no-wardmote-config"
65259
65379
  ].filter((value) => value !== null);
65260
65380
  p11.log.message(`${choice.branchLabel} ${choice.worktree} [${flags.join(", ")}]`);
65261
65381
  }
@@ -68012,7 +68132,7 @@ function collectDeploymentEnvRows(config, configPath) {
68012
68132
  const secretsKeyFilePath = process.env.WARDMOTE_SECRETS_MASTER_KEY_FILE ?? config?.secrets?.localEncrypted?.keyFilePath ?? defaultSecretsKeyFilePath();
68013
68133
  const storageProvider = process.env.WARDMOTE_STORAGE_PROVIDER ?? config?.storage?.provider ?? DEFAULT_STORAGE_PROVIDER;
68014
68134
  const storageLocalDir = process.env.WARDMOTE_STORAGE_LOCAL_DIR ?? config?.storage?.localDisk?.baseDir ?? defaultStorageBaseDir2();
68015
- const storageS3Bucket = process.env.WARDMOTE_STORAGE_S3_BUCKET ?? config?.storage?.s3?.bucket ?? "paperclip";
68135
+ const storageS3Bucket = process.env.WARDMOTE_STORAGE_S3_BUCKET ?? config?.storage?.s3?.bucket ?? "wardmote";
68016
68136
  const storageS3Region = process.env.WARDMOTE_STORAGE_S3_REGION ?? config?.storage?.s3?.region ?? "us-east-1";
68017
68137
  const storageS3Endpoint = process.env.WARDMOTE_STORAGE_S3_ENDPOINT ?? config?.storage?.s3?.endpoint ?? "";
68018
68138
  const storageS3Prefix = process.env.WARDMOTE_STORAGE_S3_PREFIX ?? config?.storage?.s3?.prefix ?? "";
@@ -68272,7 +68392,7 @@ async function channelsCommand(options = {}, runCommand2 = defaultRunCommand) {
68272
68392
  } else {
68273
68393
  console.log(`This install is version ${pc12.bold(packageVersion)} on the ${pc12.bold(currentChannel)} channel.`);
68274
68394
  }
68275
- console.log(`Docker images use the same names: ghcr.io/paperclipai/paperclip:{latest,beta,nightly,canary}`);
68395
+ console.log("Docker images are built from source; see doc/DOCKER.md.");
68276
68396
  }
68277
68397
 
68278
68398
  // src/commands/configure.ts
@@ -68342,7 +68462,7 @@ function defaultConfig() {
68342
68462
  }
68343
68463
  async function configure(opts) {
68344
68464
  printWardmoteCliBanner();
68345
- p15.intro(pc13.bgCyan(pc13.black(" paperclip configure ")));
68465
+ p15.intro(pc13.bgCyan(pc13.black(" wardmote configure ")));
68346
68466
  const configPath = resolveConfigPath(opts.config);
68347
68467
  if (!configExists(opts.config)) {
68348
68468
  p15.log.error("No config file found. Run `wardmote onboard` first.");
@@ -69336,7 +69456,7 @@ function resolveBackupDir(raw) {
69336
69456
  }
69337
69457
  async function dbBackupCommand(opts) {
69338
69458
  printWardmoteCliBanner();
69339
- p17.intro(pc17.bgCyan(pc17.black(" paperclip db:backup ")));
69459
+ p17.intro(pc17.bgCyan(pc17.black(" wardmote db:backup ")));
69340
69460
  const configPath = resolveConfigPath(opts.config);
69341
69461
  const config = readConfig(opts.config);
69342
69462
  const connection = resolveConnectionString(opts.config);
@@ -71611,11 +71731,8 @@ function registerCompanyCommands(program2) {
71611
71731
  })
71612
71732
  );
71613
71733
  addCommonClientOptions(
71614
- company.command("import").description("Import a portable markdown company package from local path, URL, or GitHub").argument("<fromPathOrUrl>", "Source path or URL").option("--include <values>", "Comma-separated include set: company,agents,projects,issues,tasks,skills").option("--target <mode>", "Target mode: new | existing").option("-C, --company-id <id>", "Existing target company ID").option("--new-company-name <name>", "Name override for --target new").option("--agents <list>", "Comma-separated agent slugs to import, or all", "all").option("--collision <mode>", "Collision strategy: rename | skip | replace", "rename").option("--ref <value>", "Git ref to use for GitHub imports (branch, tag, or commit)").option("--paperclip-url <url>", "Alias for --api-base on this command").option("--yes", "Accept default selection and skip the pre-import confirmation prompt", false).option("--dry-run", "Run preview only without applying", false).action(async (fromPathOrUrl, opts) => {
71734
+ company.command("import").description("Import a portable markdown company package from local path, URL, or GitHub").argument("<fromPathOrUrl>", "Source path or URL").option("--include <values>", "Comma-separated include set: company,agents,projects,issues,tasks,skills").option("--target <mode>", "Target mode: new | existing").option("-C, --company-id <id>", "Existing target company ID").option("--new-company-name <name>", "Name override for --target new").option("--agents <list>", "Comma-separated agent slugs to import, or all", "all").option("--collision <mode>", "Collision strategy: rename | skip | replace", "rename").option("--ref <value>", "Git ref to use for GitHub imports (branch, tag, or commit)").option("--yes", "Accept default selection and skip the pre-import confirmation prompt", false).option("--dry-run", "Run preview only without applying", false).action(async (fromPathOrUrl, opts) => {
71615
71735
  try {
71616
- if (!opts.apiBase?.trim() && opts.wardmoteUrl?.trim()) {
71617
- opts.apiBase = opts.wardmoteUrl.trim();
71618
- }
71619
71736
  const ctx = resolveCommandContext(opts);
71620
71737
  const interactiveView = isInteractiveTerminal() && !ctx.json;
71621
71738
  const from = fromPathOrUrl.trim();
@@ -76410,7 +76527,7 @@ function packLocalPackage(packagePath, outputDir) {
76410
76527
  const packageName = packageJson.name ?? path46.basename(packagePath);
76411
76528
  const packageVersion2 = packageJson.version ?? "0.0.0";
76412
76529
  const tarballFileName = `${packageName.replace(/^@/, "").replace("/", "-")}-${packageVersion2}.tgz`;
76413
- const sdkBundleDir = path46.join(outputDir, ".paperclip-sdk");
76530
+ const sdkBundleDir = path46.join(outputDir, ".wardmote-sdk");
76414
76531
  fs34.mkdirSync(sdkBundleDir, { recursive: true });
76415
76532
  execFileSync5("pnpm", ["build"], { cwd: packagePath, stdio: "pipe" });
76416
76533
  execFileSync5("pnpm", ["pack", "--pack-destination", sdkBundleDir], { cwd: packagePath, stdio: "pipe" });
@@ -76466,7 +76583,7 @@ function scaffoldPluginProject(options) {
76466
76583
  worker: "./dist/worker.js",
76467
76584
  ui: "./dist/ui/"
76468
76585
  },
76469
- keywords: ["paperclip", "plugin", category],
76586
+ keywords: ["wardmote", "plugin", category],
76470
76587
  author,
76471
76588
  license: "MIT",
76472
76589
  ...packedSharedTarball ? {
@@ -76956,7 +77073,7 @@ ${sdkDependency.startsWith("file:") ? `This scaffold snapshots \`@tickernelz/war
76956
77073
 
76957
77074
  \`${toPosixPath(localSdkPath)}\`
76958
77075
 
76959
- The packed tarballs live in \`.paperclip-sdk/\` for local development. Before publishing this plugin, switch those dependencies to published package versions once they are available on npm.
77076
+ The packed tarballs live in \`.wardmote-sdk/\` for local development. Before publishing this plugin, switch those dependencies to published package versions once they are available on npm.
76960
77077
 
76961
77078
  ` : ""}
76962
77079
 
@@ -76972,7 +77089,7 @@ wardmote plugin install ${shellQuote3(toPosixPath(outputDir))}
76972
77089
  - \`pnpm build:rollup\` uses rollup presets from the same SDK.
76973
77090
  `
76974
77091
  );
76975
- writeFile4(path46.join(outputDir, ".gitignore"), "dist\nnode_modules\n.paperclip-sdk\n");
77092
+ writeFile4(path46.join(outputDir, ".gitignore"), "dist\nnode_modules\n.wardmote-sdk\n");
76976
77093
  return outputDir;
76977
77094
  }
76978
77095
 
@@ -79509,7 +79626,7 @@ async function listAll(key, path53) {
79509
79626
  }
79510
79627
  function resourceByProfile(resources, profileKey, resourceLabel) {
79511
79628
  const matches = resources.filter(
79512
- (resource) => typeof resource.id === "string" && record(resource.metadata).paperclip_profile === profileKey
79629
+ (resource) => typeof resource.id === "string" && record(resource.metadata).wardmote_profile === profileKey
79513
79630
  );
79514
79631
  if (matches.length > 1) {
79515
79632
  throw new Error(
@@ -79577,7 +79694,7 @@ async function resolveEnvironment(key, options) {
79577
79694
  pip: []
79578
79695
  }
79579
79696
  },
79580
- metadata: { paperclip_profile: options.profileKey }
79697
+ metadata: { wardmote_profile: options.profileKey }
79581
79698
  });
79582
79699
  assertSafeManagedEnvironment(environment);
79583
79700
  return environment;
@@ -79612,7 +79729,7 @@ async function resolveAgent3(key, options) {
79612
79729
  tools: [],
79613
79730
  mcp_servers: [],
79614
79731
  skills: [],
79615
- metadata: { paperclip_profile: options.profileKey }
79732
+ metadata: { wardmote_profile: options.profileKey }
79616
79733
  });
79617
79734
  assertSafeManagedAgent(agent);
79618
79735
  assertManagedAgentModel(agent, options.model);