@zixt/host 0.0.130 → 0.0.132

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 (2) hide show
  1. package/dist/index.js +505 -15
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -28,7 +28,7 @@ import { homedir as homedir4 } from "node:os";
28
28
  // package.json
29
29
  var package_default = {
30
30
  name: "@zixt/host",
31
- version: "0.0.130",
31
+ version: "0.0.132",
32
32
  type: "module",
33
33
  exports: {
34
34
  ".": "./src/client.ts",
@@ -14699,7 +14699,13 @@ var ID_PREFIXES = {
14699
14699
  /** One durable caller-transcript or Manager-speech delivery. */
14700
14700
  voiceTurn: "vtr",
14701
14701
  /** One signed voice-provider webhook receipt. */
14702
- voiceWebhookEvent: "vwe"
14702
+ voiceWebhookEvent: "vwe",
14703
+ /** Org-singleton Company setup record (PRD OB-5). */
14704
+ companySetup: "cst",
14705
+ /** One durable set of teammate-proposed Automations awaiting an Admin (OB-12). */
14706
+ automationProposalSet: "aps",
14707
+ /** One product-feedback report passed to the Zixt team (MG-23). */
14708
+ productFeedback: "pfb"
14703
14709
  };
14704
14710
  var idPattern = (prefix) => new RegExp(`^${prefix}_[0-9a-f]{32}$`);
14705
14711
  function newId(prefix) {
@@ -14707,6 +14713,7 @@ function newId(prefix) {
14707
14713
  }
14708
14714
  var idSchema = (prefix, name) => external_exports.string().regex(idPattern(prefix), `invalid ${name}`);
14709
14715
  var OrgId = idSchema(ID_PREFIXES.org, "org id");
14716
+ var CompanySetupId = idSchema(ID_PREFIXES.companySetup, "company setup id");
14710
14717
  var MemberId = idSchema(ID_PREFIXES.member, "member id");
14711
14718
  var AgentId = idSchema(ID_PREFIXES.agent, "agent id");
14712
14719
  var AgentAvatarId = idSchema(ID_PREFIXES.agentAvatar, "agent avatar id");
@@ -14724,6 +14731,10 @@ var IntegrationLogoId = idSchema(ID_PREFIXES.integrationLogo, "Integration logo
14724
14731
  var ApprovalId = idSchema(ID_PREFIXES.approval, "approval id");
14725
14732
  var ScheduleId = idSchema(ID_PREFIXES.schedule, "schedule id");
14726
14733
  var WebhookAutomationId = idSchema(ID_PREFIXES.webhookAutomation, "Webhook Automation id");
14734
+ var AutomationProposalSetId = idSchema(
14735
+ ID_PREFIXES.automationProposalSet,
14736
+ "automation proposal set id"
14737
+ );
14727
14738
  var WebhookDeliveryId = idSchema(ID_PREFIXES.webhookDelivery, "webhook delivery id");
14728
14739
  var OrgSkillId = idSchema(ID_PREFIXES.orgSkill, "organization skill id");
14729
14740
  var OrgRoutineId = idSchema(ID_PREFIXES.orgRoutine, "organization routine id");
@@ -15193,9 +15204,12 @@ var LinearProviderTaskOrigin = external_exports.object({
15193
15204
  // ../../packages/contracts/src/skills.ts
15194
15205
  var TeammateRoleTemplate = external_exports.enum([
15195
15206
  "developer",
15207
+ "website",
15196
15208
  "marketing",
15197
15209
  "product",
15198
15210
  "sales",
15211
+ "support",
15212
+ "operations",
15199
15213
  "custom"
15200
15214
  ]);
15201
15215
  var SkillId = external_exports.enum([
@@ -15235,7 +15249,14 @@ var SkillId = external_exports.enum([
15235
15249
  "review-pipeline-risk",
15236
15250
  "identify-expansion-opportunities",
15237
15251
  "synthesize-customer-objections",
15238
- "prepare-proposals"
15252
+ "prepare-proposals",
15253
+ "maintain-website-content",
15254
+ "keep-website-healthy",
15255
+ "resolve-customer-requests",
15256
+ "maintain-faq-answers",
15257
+ "coordinate-schedules",
15258
+ "prepare-daily-briefs",
15259
+ "maintain-records"
15239
15260
  ]);
15240
15261
  var SkillReferenceId = external_exports.union([SkillId, OrgSkillId]);
15241
15262
  var EnabledSkillIds = external_exports.array(SkillReferenceId).max(200).refine((items) => new Set(items).size === items.length, "duplicate skill").default([]);
@@ -15274,6 +15295,7 @@ var ListOrgSkillsResponse = external_exports.object({
15274
15295
  builtInCustomizations: external_exports.array(OrgBuiltInSkillCustomization)
15275
15296
  });
15276
15297
  var RoutineTemplateCadence = external_exports.discriminatedUnion("kind", [
15298
+ external_exports.object({ kind: external_exports.literal("every"), minutes: external_exports.number().int().min(5).max(1440) }),
15277
15299
  external_exports.object({
15278
15300
  kind: external_exports.literal("daily"),
15279
15301
  hour: external_exports.number().int().min(0).max(23),
@@ -15290,14 +15312,26 @@ var RoutinePresetId = external_exports.enum([
15290
15312
  "developer-weekly-architecture-review",
15291
15313
  "developer-weekly-dependency-review",
15292
15314
  "developer-weekly-release-review",
15315
+ "developer-hourly-service-health-check",
15293
15316
  "product-daily-triage",
15294
15317
  "product-weekly-feedback-review",
15295
15318
  "product-weekly-roadmap-review",
15296
15319
  "marketing-weekly-campaign-review",
15297
15320
  "marketing-weekly-editorial-review",
15321
+ "marketing-daily-review-check",
15322
+ "marketing-daily-ad-spend-check",
15323
+ "marketing-daily-social-inbox-check",
15298
15324
  "sales-daily-follow-up-review",
15299
15325
  "sales-weekly-pipeline-review",
15300
- "sales-weekly-objection-review"
15326
+ "sales-weekly-objection-review",
15327
+ "sales-daily-inbound-lead-check",
15328
+ "website-weekly-site-audit",
15329
+ "website-daily-uptime-check",
15330
+ "support-daily-inbox-triage",
15331
+ "support-weekly-question-review",
15332
+ "support-hourly-urgent-check",
15333
+ "operations-daily-schedule-brief",
15334
+ "operations-weekly-records-review"
15301
15335
  ]);
15302
15336
  var RoutineTemplateReferenceId = external_exports.union([RoutinePresetId, OrgRoutineId]);
15303
15337
  var OrgRoutine = external_exports.object({
@@ -16830,6 +16864,14 @@ var ScheduleCadence = external_exports.discriminatedUnion("kind", [
16830
16864
  dayOfWeek: external_exports.number().int().min(0).max(6),
16831
16865
  hourUtc: external_exports.number().int().min(0).max(23),
16832
16866
  minuteUtc: external_exports.number().int().min(0).max(59).default(0)
16867
+ }),
16868
+ external_exports.object({
16869
+ kind: external_exports.literal("monthly"),
16870
+ /** 1–28 (UTC) so the occurrence exists in every month; 29–31 is refused
16871
+ * rather than sliding to a guessed last day (SCH-1). */
16872
+ dayOfMonth: external_exports.number().int().min(1).max(28),
16873
+ hourUtc: external_exports.number().int().min(0).max(23),
16874
+ minuteUtc: external_exports.number().int().min(0).max(59).default(0)
16833
16875
  })
16834
16876
  ]);
16835
16877
  var ScheduleSkipReason = external_exports.enum([
@@ -16913,6 +16955,77 @@ var ListSchedulesResponse = external_exports.object({
16913
16955
  schedules: external_exports.array(Schedule)
16914
16956
  });
16915
16957
 
16958
+ // ../../packages/contracts/src/automation-proposals.ts
16959
+ var ItemKey = external_exports.string().regex(/^[a-z][a-z0-9_-]{0,63}$/);
16960
+ var AutomationProposalTrigger = external_exports.discriminatedUnion("kind", [
16961
+ /** A recurring schedule; cadence hours are UTC exactly like `schedule_task`. */
16962
+ external_exports.object({ kind: external_exports.literal("schedule"), cadence: ScheduleCadence }),
16963
+ /**
16964
+ * An external system pushes events to a Webhook Automation endpoint (SCH-6).
16965
+ * `source` names who is expected to call ("Grafana"); the bearer secret is
16966
+ * cloud-generated at acceptance and never passes through the proposing run.
16967
+ */
16968
+ external_exports.object({
16969
+ kind: external_exports.literal("webhook"),
16970
+ source: external_exports.string().trim().min(1).max(120).nullable()
16971
+ })
16972
+ ]);
16973
+ var AutomationProposalItemStatus = external_exports.enum(["proposed", "created", "dismissed"]);
16974
+ var AutomationProposalItem = external_exports.object({
16975
+ key: ItemKey,
16976
+ name: external_exports.string().trim().min(1).max(120),
16977
+ instructions: external_exports.string().trim().min(1).max(1e4),
16978
+ trigger: AutomationProposalTrigger,
16979
+ /** Honest one line: why this check helps this business. */
16980
+ why: external_exports.string().trim().min(1).max(300),
16981
+ status: AutomationProposalItemStatus,
16982
+ createdScheduleId: ScheduleId.nullable(),
16983
+ createdWebhookAutomationId: WebhookAutomationId.nullable()
16984
+ });
16985
+ var AutomationProposalSetStatus = external_exports.enum(["pending", "decided"]);
16986
+ var AUTOMATION_PROPOSAL_MAX_ITEMS = 10;
16987
+ var AutomationProposalSet = external_exports.object({
16988
+ id: AutomationProposalSetId,
16989
+ orgId: OrgId,
16990
+ agentId: AgentId,
16991
+ /** Joined for display; "a removed AI teammate" when the Agent is gone. */
16992
+ agentName: external_exports.string().min(1).max(120).nullable(),
16993
+ taskId: TaskId,
16994
+ /** What was explored / why these, in the teammate's words. */
16995
+ summary: external_exports.string().trim().min(1).max(600),
16996
+ items: external_exports.array(AutomationProposalItem).max(AUTOMATION_PROPOSAL_MAX_ITEMS),
16997
+ status: AutomationProposalSetStatus,
16998
+ originTrust: external_exports.enum(["internal", "external"]),
16999
+ createdAt: IsoDate,
17000
+ decidedAt: IsoDate.nullable(),
17001
+ decidedBy: MemberId.nullable()
17002
+ });
17003
+ var ListAutomationProposalsResponse = external_exports.object({
17004
+ proposals: external_exports.array(AutomationProposalSet)
17005
+ });
17006
+ var DecideAutomationProposalsRequest = external_exports.object({
17007
+ accept: external_exports.array(ItemKey).max(AUTOMATION_PROPOSAL_MAX_ITEMS).default([]),
17008
+ dismiss: external_exports.array(ItemKey).max(AUTOMATION_PROPOSAL_MAX_ITEMS).default([])
17009
+ }).refine(
17010
+ (value) => value.accept.length + value.dismiss.length > 0,
17011
+ "name at least one proposal to accept or dismiss"
17012
+ ).refine(
17013
+ (value) => value.accept.every((key) => !value.dismiss.includes(key)),
17014
+ "a proposal cannot be both accepted and dismissed"
17015
+ );
17016
+ var CreatedWebhookSetup = external_exports.object({
17017
+ itemKey: ItemKey,
17018
+ webhookAutomationId: WebhookAutomationId,
17019
+ endpointUrl: external_exports.string().url(),
17020
+ /** Cloud-generated bearer secret, or null when a raced/recovered acceptance already consumed the one showing. */
17021
+ bearerToken: external_exports.string().min(8).max(200).nullable()
17022
+ });
17023
+ var DecideAutomationProposalsResponse = external_exports.object({
17024
+ proposalSet: AutomationProposalSet,
17025
+ createdScheduleIds: external_exports.array(ScheduleId),
17026
+ createdWebhooks: external_exports.array(CreatedWebhookSetup)
17027
+ });
17028
+
16916
17029
  // ../../packages/contracts/src/reviews.ts
16917
17030
  var TaskReviewMode = external_exports.enum(["none", "required"]);
16918
17031
  var TaskReviewStatus = external_exports.enum(["unreviewed", "accepted", "changes_requested"]);
@@ -18179,6 +18292,24 @@ var AgentOp = external_exports.union([
18179
18292
  }),
18180
18293
  external_exports.object({ kind: external_exports.literal("schedule.list") }),
18181
18294
  external_exports.object({ kind: external_exports.literal("schedule.delete"), scheduleId: ScheduleId }),
18295
+ /**
18296
+ * OB-12: record recurring Automations this teammate recommends, without
18297
+ * creating anything. The set becomes a durable Needs-attention obligation an
18298
+ * Admin decides; `schedule_task` stays the path for work a person asked for.
18299
+ * Zero items is an honest "explored; nothing recurring needed".
18300
+ */
18301
+ external_exports.object({
18302
+ kind: external_exports.literal("automation.propose"),
18303
+ summary: external_exports.string().trim().min(1).max(600),
18304
+ items: external_exports.array(
18305
+ external_exports.object({
18306
+ name: external_exports.string().trim().min(1).max(120),
18307
+ instructions: external_exports.string().trim().min(1).max(1e4),
18308
+ trigger: AutomationProposalTrigger,
18309
+ why: external_exports.string().trim().min(1).max(300)
18310
+ })
18311
+ ).max(AUTOMATION_PROPOSAL_MAX_ITEMS)
18312
+ }),
18182
18313
  external_exports.object({
18183
18314
  kind: external_exports.literal("secret.put"),
18184
18315
  name: SecretName,
@@ -19555,6 +19686,11 @@ var ManagerConfigProjection = external_exports.object({
19555
19686
  * switch for each surface without disconnecting the workspace.
19556
19687
  */
19557
19688
  slack: external_exports.object({ answerMentions: external_exports.boolean(), answerDirectMessages: external_exports.boolean() }).strict(),
19689
+ /**
19690
+ * Index into the bundled Manager portrait set shown wherever the Manager
19691
+ * speaks; every organization starts on the deployment default (0).
19692
+ */
19693
+ portrait: external_exports.number().int().min(0).max(63).default(0),
19558
19694
  revision: external_exports.number().int().min(0),
19559
19695
  updatedAt: external_exports.string().nullable()
19560
19696
  }).strict();
@@ -19569,10 +19705,11 @@ var UpdateManagerRequest = external_exports.object({
19569
19705
  answerMentions: external_exports.boolean().optional(),
19570
19706
  answerDirectMessages: external_exports.boolean().optional()
19571
19707
  }).strict().optional(),
19708
+ portrait: external_exports.number().int().min(0).max(63).optional(),
19572
19709
  /** Optimistic concurrency: refuse when another admin saved first. */
19573
19710
  expectedRevision: external_exports.number().int().min(0).optional()
19574
19711
  }).strict().superRefine((value, ctx) => {
19575
- if (value.displayName === void 0 && value.instructions === void 0 && value.model === void 0 && value.reasoningEffort === void 0 && value.slack === void 0) {
19712
+ if (value.displayName === void 0 && value.instructions === void 0 && value.model === void 0 && value.reasoningEffort === void 0 && value.slack === void 0 && value.portrait === void 0) {
19576
19713
  ctx.addIssue({ code: "custom", message: "nothing to update" });
19577
19714
  }
19578
19715
  });
@@ -20970,7 +21107,11 @@ var AttentionItemType = external_exports.enum([
20970
21107
  /** An Automation paused itself and cannot resume without a person's decision. */
20971
21108
  "automation_paused",
20972
21109
  /** An Automation was kept running but its Machine preference changed. */
20973
- "automation_moved"
21110
+ "automation_moved",
21111
+ /** A teammate proposed recurring Automations awaiting an Admin's decision (OB-12). */
21112
+ "automation_proposal",
21113
+ /** A previously seen Machine went offline; teammates may have no computer to work on. */
21114
+ "machine_offline"
20974
21115
  ]);
20975
21116
  var AttentionCategory = external_exports.enum([
20976
21117
  "answer_question",
@@ -21004,7 +21145,9 @@ var AttentionItem = external_exports.object({
21004
21145
  "readiness",
21005
21146
  "integration",
21006
21147
  "schedule",
21007
- "manager_questionnaire"
21148
+ "manager_questionnaire",
21149
+ "host",
21150
+ "automation_proposal_set"
21008
21151
  ]),
21009
21152
  id: external_exports.string().min(1),
21010
21153
  version: external_exports.string().min(1)
@@ -21020,7 +21163,9 @@ var AttentionItem = external_exports.object({
21020
21163
  "retry",
21021
21164
  "repair",
21022
21165
  /** Choose a Machine for a paused Automation, or set it back to automatic. */
21023
- "resume_automation"
21166
+ "resume_automation",
21167
+ /** Create or dismiss a teammate's proposed Automations (OB-12; Admin/Owner). */
21168
+ "decide_automation_proposals"
21024
21169
  ]),
21025
21170
  allowed: external_exports.boolean()
21026
21171
  })
@@ -22014,13 +22159,24 @@ var SetupGuideToolResult = external_exports.object({
22014
22159
  result: external_exports.string().trim().min(1).max(4e3),
22015
22160
  page: SetupGuidePageContext
22016
22161
  });
22162
+ var SetupGuideMission = external_exports.object({
22163
+ id: external_exports.string().regex(/^[a-z][a-z0-9_.:-]{0,120}$/),
22164
+ kind: external_exports.enum(["machine", "teammate", "integration", "automation", "first_task"]),
22165
+ goal: external_exports.string().trim().min(1).max(600),
22166
+ targetHref: external_exports.string().startsWith("/").max(2e3),
22167
+ returnHref: external_exports.string().startsWith("/").max(2e3),
22168
+ facts: external_exports.array(SetupGuideContextFact).max(12).default([]),
22169
+ /** Never a secret; the Guide only fills visible non-secure fields with these. */
22170
+ prefills: external_exports.array(SetupGuideActionParameter).max(12).default([])
22171
+ });
22017
22172
  var SetupGuideReplyRequest = external_exports.object({
22018
22173
  message: GuideText,
22019
22174
  history: external_exports.array(SetupGuideHistoryMessage).max(12).default([]),
22020
22175
  page: SetupGuidePageContext,
22021
22176
  onboarding: SetupGuideOnboardingState,
22022
22177
  actions: external_exports.array(SetupGuideAvailableAction).max(128),
22023
- toolResults: external_exports.array(SetupGuideToolResult).max(12).default([])
22178
+ toolResults: external_exports.array(SetupGuideToolResult).max(12).default([]),
22179
+ mission: SetupGuideMission.nullable().optional()
22024
22180
  });
22025
22181
  var SetupGuideProposedAction = external_exports.object({
22026
22182
  actionId: external_exports.string().regex(/^[a-z][a-z0-9_.-]{0,79}$/),
@@ -22045,6 +22201,328 @@ var SetupGuideTranscriptionResponse = external_exports.object({
22045
22201
  text: GuideText
22046
22202
  });
22047
22203
 
22204
+ // ../../packages/contracts/src/roles.ts
22205
+ var CompanyToolKind = external_exports.enum([
22206
+ "github",
22207
+ "slack",
22208
+ "linear",
22209
+ "email",
22210
+ "mcp",
22211
+ "api",
22212
+ "whatsapp",
22213
+ "browser"
22214
+ ]);
22215
+ var RoleRecommendedIntegration = external_exports.object({
22216
+ kind: CompanyToolKind,
22217
+ label: external_exports.string().trim().min(1).max(80),
22218
+ purpose: external_exports.string().trim().min(1).max(200)
22219
+ });
22220
+
22221
+ // ../../packages/contracts/src/company-setup.ts
22222
+ var Key = external_exports.string().regex(/^[a-z][a-z0-9_-]{0,63}$/);
22223
+ var CompanySetupStatus = external_exports.enum([
22224
+ /** No record exists yet. */
22225
+ "not_started",
22226
+ /** The page was opened and the first question prepared; nothing answered. */
22227
+ "offered",
22228
+ "interviewing",
22229
+ /** A plan exists and awaits edits or approval. */
22230
+ "planned",
22231
+ /** The team was created; required and recommended steps are tracked. */
22232
+ "approved"
22233
+ ]);
22234
+ var CompanySetupOrgKind = external_exports.enum(["personal", "company"]);
22235
+ var InterviewAnswer = external_exports.discriminatedUnion("kind", [
22236
+ external_exports.object({ kind: external_exports.literal("text"), text: external_exports.string().trim().min(1).max(2e3) }),
22237
+ external_exports.object({ kind: external_exports.literal("skipped") }),
22238
+ /** "Not sure, suggest for me": the planner chooses a sensible default. */
22239
+ external_exports.object({ kind: external_exports.literal("suggest") })
22240
+ ]);
22241
+ var InterviewQuestion = external_exports.object({
22242
+ id: Key,
22243
+ prompt: external_exports.string().trim().min(1).max(400),
22244
+ /** One-line explanation of a Zixt noun the first time it appears; null otherwise. */
22245
+ gloss: external_exports.string().trim().min(1).max(300).nullable(),
22246
+ examples: external_exports.array(external_exports.string().trim().min(1).max(120)).max(6),
22247
+ allowSuggest: external_exports.boolean()
22248
+ });
22249
+ var InterviewTurn = InterviewQuestion.extend({
22250
+ round: external_exports.number().int().min(1),
22251
+ answer: InterviewAnswer.nullable(),
22252
+ answeredAt: IsoDate.nullable(),
22253
+ /** Tailored options fetched by "Not sure, suggest for me"; the person picks, edits, then continues. */
22254
+ suggestions: external_exports.array(external_exports.string().trim().min(1).max(200)).max(8).default([]),
22255
+ /** The answer here was passed to the Zixt team as product feedback (MG-23); the transcript says so. */
22256
+ feedbackNoted: external_exports.boolean().default(false)
22257
+ });
22258
+ var CompanySetupInterview = external_exports.object({
22259
+ turns: external_exports.array(InterviewTurn).max(40),
22260
+ /** Increments each time the interview is re-run for an additive re-plan. */
22261
+ round: external_exports.number().int().min(1),
22262
+ complete: external_exports.boolean(),
22263
+ /** The next question is being generated; the interview is neither complete nor waiting on the person. */
22264
+ preparingQuestion: external_exports.boolean().default(false),
22265
+ minimumAnswers: external_exports.number().int().min(1),
22266
+ maximumQuestions: external_exports.number().int().min(1)
22267
+ });
22268
+ var PlannedToolAvailability = external_exports.enum([
22269
+ /** A connected Integration of this kind already exists. */
22270
+ "connected",
22271
+ /** The Integration catalog can connect it. */
22272
+ "connectable",
22273
+ /** Reachable through an API Integration (Custom API / discovery). */
22274
+ "api_catalog",
22275
+ /** The teammate uses the website through a saved sign-in in its Browser. */
22276
+ "browser",
22277
+ "not_yet"
22278
+ ]);
22279
+ var PlannedTool = external_exports.object({
22280
+ key: Key,
22281
+ label: external_exports.string().trim().min(1).max(80),
22282
+ purpose: external_exports.string().trim().min(1).max(300),
22283
+ kind: CompanyToolKind,
22284
+ availability: PlannedToolAvailability,
22285
+ /** Catalog Integration name when `availability` is connectable or api_catalog. */
22286
+ catalogName: external_exports.string().trim().min(1).max(120).nullable(),
22287
+ why: external_exports.string().trim().min(1).max(300),
22288
+ enabled: external_exports.boolean()
22289
+ });
22290
+ var PlannedCadence = external_exports.discriminatedUnion("kind", [
22291
+ external_exports.object({
22292
+ kind: external_exports.literal("daily"),
22293
+ hour: external_exports.number().int().min(0).max(23),
22294
+ minute: external_exports.number().int().min(0).max(59)
22295
+ }),
22296
+ external_exports.object({
22297
+ kind: external_exports.literal("weekly"),
22298
+ dayOfWeek: external_exports.number().int().min(0).max(6),
22299
+ hour: external_exports.number().int().min(0).max(23),
22300
+ minute: external_exports.number().int().min(0).max(59)
22301
+ }),
22302
+ external_exports.object({
22303
+ kind: external_exports.literal("monthly"),
22304
+ /** 1–28, the window every month has (SCH-1); month-start work lives here. */
22305
+ dayOfMonth: external_exports.number().int().min(1).max(28),
22306
+ hour: external_exports.number().int().min(0).max(23),
22307
+ minute: external_exports.number().int().min(0).max(59)
22308
+ }),
22309
+ external_exports.object({ kind: external_exports.literal("every"), minutes: external_exports.number().int().min(5).max(1440) })
22310
+ ]);
22311
+ var PlannedAutomationTrigger = external_exports.enum(["schedule", "webhook"]);
22312
+ var PlannedAutomation = external_exports.object({
22313
+ key: Key,
22314
+ name: external_exports.string().trim().min(1).max(120),
22315
+ instructions: external_exports.string().trim().min(1).max(4e3),
22316
+ presetId: RoutinePresetId.nullable(),
22317
+ /** Plans stored before OB-12 carry no trigger and read as schedules. */
22318
+ trigger: PlannedAutomationTrigger.default("schedule"),
22319
+ /** Null only for webhook triggers, which have no cadence. */
22320
+ cadence: PlannedCadence.nullable(),
22321
+ /** The external system expected to call, for webhook triggers ("Grafana"). */
22322
+ webhookSource: external_exports.string().trim().min(1).max(120).nullable().default(null),
22323
+ /** The Automation's work needs a person's decision before it acts. */
22324
+ requiresApproval: external_exports.boolean(),
22325
+ why: external_exports.string().trim().min(1).max(300),
22326
+ enabled: external_exports.boolean()
22327
+ });
22328
+ var PlannedExploration = external_exports.object({
22329
+ /** What to explore, in plain words ("the support inbox"). */
22330
+ target: external_exports.string().trim().min(1).max(160),
22331
+ /** The complete Task request, ready for the Manager composer. */
22332
+ request: external_exports.string().trim().min(1).max(1200),
22333
+ why: external_exports.string().trim().min(1).max(300),
22334
+ enabled: external_exports.boolean()
22335
+ });
22336
+ var PlannedTeammate = external_exports.object({
22337
+ key: Key,
22338
+ name: external_exports.string().trim().min(1).max(120),
22339
+ roleTemplate: TeammateRoleTemplate,
22340
+ title: external_exports.string().trim().min(1).max(80),
22341
+ purpose: external_exports.string().trim().min(1).max(600),
22342
+ dayToDay: external_exports.array(external_exports.string().trim().min(1).max(200)).max(6),
22343
+ instructions: external_exports.string().trim().min(1).max(5e4),
22344
+ escalation: external_exports.string().trim().max(1e4),
22345
+ skillIds: external_exports.array(SkillReferenceId).max(40),
22346
+ tools: external_exports.array(PlannedTool).max(8),
22347
+ automations: external_exports.array(PlannedAutomation).max(6),
22348
+ /** Present when the interview left this teammate's proactive needs unknown (OB-12). */
22349
+ exploration: PlannedExploration.nullable().default(null),
22350
+ /** Keys of other planned teammates (or created Agent ids) this teammate hands work to. */
22351
+ handsOffTo: external_exports.array(external_exports.string().trim().min(1).max(120)).max(6),
22352
+ /** Guardrail categories proposed as require_approval because the person said a human decides. */
22353
+ approvals: external_exports.array(ActionCategory).max(20),
22354
+ why: external_exports.string().trim().min(1).max(300),
22355
+ enabled: external_exports.boolean(),
22356
+ /**
22357
+ * Index into the bundled portrait set the person chose for this teammate;
22358
+ * null falls back to a stable name-matched default. Approval turns the
22359
+ * resolved portrait into the created Agent's avatar artwork.
22360
+ */
22361
+ portrait: external_exports.number().int().min(0).max(63).nullable().default(null),
22362
+ /** Set once approval created the Agent; never cleared by a re-plan. */
22363
+ createdAgentId: AgentId.nullable()
22364
+ });
22365
+ var PlannedMachine = external_exports.object({
22366
+ why: external_exports.string().trim().min(1).max(400),
22367
+ suggestedName: external_exports.string().trim().min(1).max(120),
22368
+ operatingSystem: external_exports.enum(["windows", "macos", "linux", "unknown"])
22369
+ });
22370
+ var PlannedFirstTask = external_exports.object({
22371
+ title: external_exports.string().trim().min(1).max(160),
22372
+ request: external_exports.string().trim().min(1).max(1200),
22373
+ teammateKey: Key.nullable()
22374
+ });
22375
+ var CompanySetupPlan = external_exports.object({
22376
+ revision: external_exports.number().int().min(1),
22377
+ summary: external_exports.string().trim().min(1).max(1200),
22378
+ businessName: external_exports.string().trim().min(1).max(120).nullable(),
22379
+ teammates: external_exports.array(PlannedTeammate).min(1).max(8),
22380
+ machine: PlannedMachine,
22381
+ firstTask: PlannedFirstTask.nullable()
22382
+ });
22383
+ var ProposedTool = PlannedTool.omit({ enabled: true });
22384
+ var ProposedAutomation = PlannedAutomation.omit({ enabled: true }).extend({
22385
+ trigger: PlannedAutomationTrigger,
22386
+ webhookSource: external_exports.string().trim().min(1).max(120).nullable()
22387
+ });
22388
+ var ProposedExploration = PlannedExploration.omit({ enabled: true });
22389
+ var ProposedTeammate = PlannedTeammate.omit({
22390
+ createdAgentId: true,
22391
+ enabled: true,
22392
+ // The person picks portraits on the plan; the planner never proposes them.
22393
+ portrait: true
22394
+ }).extend({
22395
+ tools: external_exports.array(ProposedTool).max(8),
22396
+ automations: external_exports.array(ProposedAutomation).max(6),
22397
+ exploration: ProposedExploration.nullable()
22398
+ });
22399
+ var ProposedPlan = CompanySetupPlan.omit({ revision: true }).extend({
22400
+ teammates: external_exports.array(ProposedTeammate).min(1).max(8)
22401
+ });
22402
+ var CompanySetupStepKind = external_exports.enum([
22403
+ "machine",
22404
+ "teammate",
22405
+ "integration",
22406
+ "automation",
22407
+ /** OB-12: a bounded first Task that discovers what this teammate should watch. */
22408
+ "exploration",
22409
+ "first_task"
22410
+ ]);
22411
+ var CompanySetupStepState = external_exports.enum(["open", "done", "skipped"]);
22412
+ var CompanySetupStep = external_exports.object({
22413
+ id: external_exports.string().regex(/^[a-z][a-z0-9_.:-]{0,120}$/),
22414
+ kind: CompanySetupStepKind,
22415
+ required: external_exports.boolean(),
22416
+ title: external_exports.string().trim().min(1).max(160),
22417
+ description: external_exports.string().trim().min(1).max(600),
22418
+ state: CompanySetupStepState,
22419
+ /** What was observed, when the state is done. */
22420
+ evidence: external_exports.object({ summary: external_exports.string().trim().min(1).max(300), at: IsoDate.nullable() }).nullable(),
22421
+ skip: external_exports.object({
22422
+ reason: external_exports.string().trim().min(1).max(500),
22423
+ at: IsoDate,
22424
+ by: MemberId.nullable()
22425
+ }).nullable(),
22426
+ /** The planned teammate this step belongs to, for Integration and Automation steps. */
22427
+ teammateKey: Key.nullable(),
22428
+ teammateName: external_exports.string().trim().min(1).max(120).nullable(),
22429
+ /** The plan item this step tracks (tool key or automation key). */
22430
+ planKey: Key.nullable(),
22431
+ mission: SetupGuideMission.nullable()
22432
+ });
22433
+ var CompanySetupProgress = external_exports.object({
22434
+ requiredTotal: external_exports.number().int().min(0),
22435
+ requiredDone: external_exports.number().int().min(0),
22436
+ recommendedTotal: external_exports.number().int().min(0),
22437
+ recommendedDone: external_exports.number().int().min(0),
22438
+ /** Every required step is done (skips do not count). */
22439
+ requiredComplete: external_exports.boolean(),
22440
+ /** Every recommended step is done or skipped. */
22441
+ recommendedSettled: external_exports.boolean()
22442
+ });
22443
+ var CompanySetupApproval = external_exports.object({
22444
+ at: IsoDate,
22445
+ by: MemberId.nullable(),
22446
+ createdAgentIds: external_exports.array(AgentId)
22447
+ });
22448
+ var CompanySetupView = external_exports.object({
22449
+ id: CompanySetupId.nullable(),
22450
+ orgId: OrgId,
22451
+ status: CompanySetupStatus,
22452
+ orgKind: CompanySetupOrgKind,
22453
+ interview: CompanySetupInterview.nullable(),
22454
+ /** The next unanswered question, when the interview is open. */
22455
+ currentQuestion: InterviewTurn.nullable(),
22456
+ plan: CompanySetupPlan.nullable(),
22457
+ /**
22458
+ * The plan is being proposed in the background (a planner call can take a
22459
+ * minute); the page polls until the plan lands or an error is recorded.
22460
+ */
22461
+ planning: external_exports.object({ startedAt: IsoDate, error: external_exports.string().max(500).nullable() }).nullable(),
22462
+ approval: CompanySetupApproval.nullable(),
22463
+ steps: external_exports.array(CompanySetupStep),
22464
+ progress: CompanySetupProgress,
22465
+ /** Company facts the Guide carries into missions; empty before a plan exists. */
22466
+ contextFacts: external_exports.array(SetupGuideContextFact).max(12),
22467
+ homeCardDismissedAt: IsoDate.nullable(),
22468
+ /**
22469
+ * True only for an Admin of an organization with no record, no teammates, no
22470
+ * Machines, and no Tasks: Home may open the setup page once. Opening it
22471
+ * creates the record, so the redirect never repeats.
22472
+ */
22473
+ suggestRedirect: external_exports.boolean(),
22474
+ viewerCanEdit: external_exports.boolean(),
22475
+ /** Absent when the deployment has no inference configured and no record exists. */
22476
+ interviewAvailable: external_exports.boolean(),
22477
+ startedAt: IsoDate.nullable(),
22478
+ updatedAt: IsoDate.nullable()
22479
+ });
22480
+ var AnswerCompanySetupQuestionRequest = external_exports.object({
22481
+ questionId: Key,
22482
+ answer: InterviewAnswer
22483
+ }).strict();
22484
+ var SuggestCompanySetupAnswersRequest = external_exports.object({
22485
+ questionId: Key
22486
+ }).strict();
22487
+ var UpdateCompanySetupPlanRequest = external_exports.object({
22488
+ /** The full edited plan; the revision must match the stored one. */
22489
+ plan: CompanySetupPlan
22490
+ }).strict();
22491
+ var ApproveCompanySetupRequest = external_exports.object({
22492
+ planRevision: external_exports.number().int().min(1)
22493
+ }).strict();
22494
+ var SkipCompanySetupStepRequest = external_exports.object({
22495
+ reason: external_exports.string().trim().min(1).max(500)
22496
+ }).strict();
22497
+ var ProposeTeammateRequest = external_exports.object({
22498
+ answers: external_exports.array(
22499
+ external_exports.object({
22500
+ question: external_exports.string().trim().min(1).max(400),
22501
+ answer: external_exports.string().trim().min(1).max(2e3)
22502
+ })
22503
+ ).max(6),
22504
+ requestedRole: TeammateRoleTemplate.nullable().optional()
22505
+ }).strict();
22506
+ var ProposeTeammateResponse = external_exports.object({
22507
+ teammate: ProposedTeammate
22508
+ });
22509
+ var CompanySetupFunnel = external_exports.object({
22510
+ status: CompanySetupStatus,
22511
+ startedAt: IsoDate.nullable(),
22512
+ planProposedAt: IsoDate.nullable(),
22513
+ planApprovedAt: IsoDate.nullable(),
22514
+ requiredCompletedAt: IsoDate.nullable(),
22515
+ recommendedSettledAt: IsoDate.nullable(),
22516
+ teammatesCreated: external_exports.number().int().min(0),
22517
+ stepsSkipped: external_exports.number().int().min(0)
22518
+ });
22519
+ var TEAMMATE_PORTRAIT_COUNT = 16;
22520
+ var ALL_PORTRAITS = Array.from({ length: TEAMMATE_PORTRAIT_COUNT }, (_, index) => index);
22521
+
22522
+ // ../../packages/contracts/src/product-feedback.ts
22523
+ var ProductFeedbackKind = external_exports.enum(["frustration", "missing_capability", "feature_request"]);
22524
+ var ProductFeedbackSurface = external_exports.enum(["manager", "guide", "company_setup"]);
22525
+
22048
22526
  // src/runners/mcp-client.ts
22049
22527
  var REQUEST_TIMEOUT_MS = 1e4;
22050
22528
  var MAX_BODY_BYTES = 4 * 1024 * 1024;
@@ -37455,8 +37933,8 @@ import { createServer as createServer2 } from "node:http";
37455
37933
  var CADENCE_PROPS = {
37456
37934
  cadence_kind: {
37457
37935
  type: "string",
37458
- enum: ["every", "daily", "weekly"],
37459
- description: "every = every N minutes; daily/weekly run at a UTC time."
37936
+ enum: ["every", "daily", "weekly", "monthly"],
37937
+ description: "every = every N minutes; daily/weekly/monthly run at a UTC time."
37460
37938
  },
37461
37939
  minutes: {
37462
37940
  type: "integer",
@@ -37464,9 +37942,16 @@ var CADENCE_PROPS = {
37464
37942
  maximum: 10080,
37465
37943
  description: "every-only: interval in minutes (1 to 10080)."
37466
37944
  },
37467
- hour_utc: { type: "number", description: "daily/weekly: hour 0-23 (UTC)." },
37468
- minute_utc: { type: "number", description: "daily/weekly: minute 0-59 (UTC), default 0." },
37469
- day_of_week: { type: "number", description: "weekly-only: 0 = Sunday \u2026 6 = Saturday." }
37945
+ hour_utc: { type: "number", description: "daily/weekly/monthly: hour 0-23 (UTC)." },
37946
+ minute_utc: {
37947
+ type: "number",
37948
+ description: "daily/weekly/monthly: minute 0-59 (UTC), default 0."
37949
+ },
37950
+ day_of_week: { type: "number", description: "weekly-only: 0 = Sunday \u2026 6 = Saturday." },
37951
+ day_of_month: {
37952
+ type: "number",
37953
+ description: "monthly-only: day 1-28 (UTC); 1-28 exists in every month."
37954
+ }
37470
37955
  };
37471
37956
  var TOOLS = [
37472
37957
  {
@@ -37914,7 +38399,12 @@ function cadenceFrom(args) {
37914
38399
  if (!Number.isFinite(dayOfWeek)) throw new Error('cadence "weekly" needs `day_of_week`');
37915
38400
  return { kind: "weekly", dayOfWeek, hourUtc, minuteUtc };
37916
38401
  }
37917
- throw new Error("cadence_kind must be every | daily | weekly");
38402
+ if (kind === "monthly") {
38403
+ const dayOfMonth = Number(args["day_of_month"]);
38404
+ if (!Number.isFinite(dayOfMonth)) throw new Error('cadence "monthly" needs `day_of_month`');
38405
+ return { kind: "monthly", dayOfMonth, hourUtc, minuteUtc };
38406
+ }
38407
+ throw new Error("cadence_kind must be every | daily | weekly | monthly");
37918
38408
  }
37919
38409
  function opFor(name, args) {
37920
38410
  const str = (key, required2 = true) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zixt/host",
3
- "version": "0.0.130",
3
+ "version": "0.0.132",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": "./src/client.ts",