@zixt/host 0.0.130 → 0.0.131

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 +471 -8
  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.131",
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({
@@ -16913,6 +16947,77 @@ var ListSchedulesResponse = external_exports.object({
16913
16947
  schedules: external_exports.array(Schedule)
16914
16948
  });
16915
16949
 
16950
+ // ../../packages/contracts/src/automation-proposals.ts
16951
+ var ItemKey = external_exports.string().regex(/^[a-z][a-z0-9_-]{0,63}$/);
16952
+ var AutomationProposalTrigger = external_exports.discriminatedUnion("kind", [
16953
+ /** A recurring schedule; cadence hours are UTC exactly like `schedule_task`. */
16954
+ external_exports.object({ kind: external_exports.literal("schedule"), cadence: ScheduleCadence }),
16955
+ /**
16956
+ * An external system pushes events to a Webhook Automation endpoint (SCH-6).
16957
+ * `source` names who is expected to call ("Grafana"); the bearer secret is
16958
+ * cloud-generated at acceptance and never passes through the proposing run.
16959
+ */
16960
+ external_exports.object({
16961
+ kind: external_exports.literal("webhook"),
16962
+ source: external_exports.string().trim().min(1).max(120).nullable()
16963
+ })
16964
+ ]);
16965
+ var AutomationProposalItemStatus = external_exports.enum(["proposed", "created", "dismissed"]);
16966
+ var AutomationProposalItem = external_exports.object({
16967
+ key: ItemKey,
16968
+ name: external_exports.string().trim().min(1).max(120),
16969
+ instructions: external_exports.string().trim().min(1).max(1e4),
16970
+ trigger: AutomationProposalTrigger,
16971
+ /** Honest one line: why this check helps this business. */
16972
+ why: external_exports.string().trim().min(1).max(300),
16973
+ status: AutomationProposalItemStatus,
16974
+ createdScheduleId: ScheduleId.nullable(),
16975
+ createdWebhookAutomationId: WebhookAutomationId.nullable()
16976
+ });
16977
+ var AutomationProposalSetStatus = external_exports.enum(["pending", "decided"]);
16978
+ var AUTOMATION_PROPOSAL_MAX_ITEMS = 10;
16979
+ var AutomationProposalSet = external_exports.object({
16980
+ id: AutomationProposalSetId,
16981
+ orgId: OrgId,
16982
+ agentId: AgentId,
16983
+ /** Joined for display; "a removed AI teammate" when the Agent is gone. */
16984
+ agentName: external_exports.string().min(1).max(120).nullable(),
16985
+ taskId: TaskId,
16986
+ /** What was explored / why these, in the teammate's words. */
16987
+ summary: external_exports.string().trim().min(1).max(600),
16988
+ items: external_exports.array(AutomationProposalItem).max(AUTOMATION_PROPOSAL_MAX_ITEMS),
16989
+ status: AutomationProposalSetStatus,
16990
+ originTrust: external_exports.enum(["internal", "external"]),
16991
+ createdAt: IsoDate,
16992
+ decidedAt: IsoDate.nullable(),
16993
+ decidedBy: MemberId.nullable()
16994
+ });
16995
+ var ListAutomationProposalsResponse = external_exports.object({
16996
+ proposals: external_exports.array(AutomationProposalSet)
16997
+ });
16998
+ var DecideAutomationProposalsRequest = external_exports.object({
16999
+ accept: external_exports.array(ItemKey).max(AUTOMATION_PROPOSAL_MAX_ITEMS).default([]),
17000
+ dismiss: external_exports.array(ItemKey).max(AUTOMATION_PROPOSAL_MAX_ITEMS).default([])
17001
+ }).refine(
17002
+ (value) => value.accept.length + value.dismiss.length > 0,
17003
+ "name at least one proposal to accept or dismiss"
17004
+ ).refine(
17005
+ (value) => value.accept.every((key) => !value.dismiss.includes(key)),
17006
+ "a proposal cannot be both accepted and dismissed"
17007
+ );
17008
+ var CreatedWebhookSetup = external_exports.object({
17009
+ itemKey: ItemKey,
17010
+ webhookAutomationId: WebhookAutomationId,
17011
+ endpointUrl: external_exports.string().url(),
17012
+ /** Cloud-generated bearer secret, or null when a raced/recovered acceptance already consumed the one showing. */
17013
+ bearerToken: external_exports.string().min(8).max(200).nullable()
17014
+ });
17015
+ var DecideAutomationProposalsResponse = external_exports.object({
17016
+ proposalSet: AutomationProposalSet,
17017
+ createdScheduleIds: external_exports.array(ScheduleId),
17018
+ createdWebhooks: external_exports.array(CreatedWebhookSetup)
17019
+ });
17020
+
16916
17021
  // ../../packages/contracts/src/reviews.ts
16917
17022
  var TaskReviewMode = external_exports.enum(["none", "required"]);
16918
17023
  var TaskReviewStatus = external_exports.enum(["unreviewed", "accepted", "changes_requested"]);
@@ -18179,6 +18284,24 @@ var AgentOp = external_exports.union([
18179
18284
  }),
18180
18285
  external_exports.object({ kind: external_exports.literal("schedule.list") }),
18181
18286
  external_exports.object({ kind: external_exports.literal("schedule.delete"), scheduleId: ScheduleId }),
18287
+ /**
18288
+ * OB-12: record recurring Automations this teammate recommends, without
18289
+ * creating anything. The set becomes a durable Needs-attention obligation an
18290
+ * Admin decides; `schedule_task` stays the path for work a person asked for.
18291
+ * Zero items is an honest "explored; nothing recurring needed".
18292
+ */
18293
+ external_exports.object({
18294
+ kind: external_exports.literal("automation.propose"),
18295
+ summary: external_exports.string().trim().min(1).max(600),
18296
+ items: external_exports.array(
18297
+ external_exports.object({
18298
+ name: external_exports.string().trim().min(1).max(120),
18299
+ instructions: external_exports.string().trim().min(1).max(1e4),
18300
+ trigger: AutomationProposalTrigger,
18301
+ why: external_exports.string().trim().min(1).max(300)
18302
+ })
18303
+ ).max(AUTOMATION_PROPOSAL_MAX_ITEMS)
18304
+ }),
18182
18305
  external_exports.object({
18183
18306
  kind: external_exports.literal("secret.put"),
18184
18307
  name: SecretName,
@@ -19555,6 +19678,11 @@ var ManagerConfigProjection = external_exports.object({
19555
19678
  * switch for each surface without disconnecting the workspace.
19556
19679
  */
19557
19680
  slack: external_exports.object({ answerMentions: external_exports.boolean(), answerDirectMessages: external_exports.boolean() }).strict(),
19681
+ /**
19682
+ * Index into the bundled Manager portrait set shown wherever the Manager
19683
+ * speaks; every organization starts on the deployment default (0).
19684
+ */
19685
+ portrait: external_exports.number().int().min(0).max(63).default(0),
19558
19686
  revision: external_exports.number().int().min(0),
19559
19687
  updatedAt: external_exports.string().nullable()
19560
19688
  }).strict();
@@ -19569,6 +19697,7 @@ var UpdateManagerRequest = external_exports.object({
19569
19697
  answerMentions: external_exports.boolean().optional(),
19570
19698
  answerDirectMessages: external_exports.boolean().optional()
19571
19699
  }).strict().optional(),
19700
+ portrait: external_exports.number().int().min(0).max(63).optional(),
19572
19701
  /** Optimistic concurrency: refuse when another admin saved first. */
19573
19702
  expectedRevision: external_exports.number().int().min(0).optional()
19574
19703
  }).strict().superRefine((value, ctx) => {
@@ -20970,7 +21099,11 @@ var AttentionItemType = external_exports.enum([
20970
21099
  /** An Automation paused itself and cannot resume without a person's decision. */
20971
21100
  "automation_paused",
20972
21101
  /** An Automation was kept running but its Machine preference changed. */
20973
- "automation_moved"
21102
+ "automation_moved",
21103
+ /** A teammate proposed recurring Automations awaiting an Admin's decision (OB-12). */
21104
+ "automation_proposal",
21105
+ /** A previously seen Machine went offline; teammates may have no computer to work on. */
21106
+ "machine_offline"
20974
21107
  ]);
20975
21108
  var AttentionCategory = external_exports.enum([
20976
21109
  "answer_question",
@@ -21004,7 +21137,9 @@ var AttentionItem = external_exports.object({
21004
21137
  "readiness",
21005
21138
  "integration",
21006
21139
  "schedule",
21007
- "manager_questionnaire"
21140
+ "manager_questionnaire",
21141
+ "host",
21142
+ "automation_proposal_set"
21008
21143
  ]),
21009
21144
  id: external_exports.string().min(1),
21010
21145
  version: external_exports.string().min(1)
@@ -21020,7 +21155,9 @@ var AttentionItem = external_exports.object({
21020
21155
  "retry",
21021
21156
  "repair",
21022
21157
  /** Choose a Machine for a paused Automation, or set it back to automatic. */
21023
- "resume_automation"
21158
+ "resume_automation",
21159
+ /** Create or dismiss a teammate's proposed Automations (OB-12; Admin/Owner). */
21160
+ "decide_automation_proposals"
21024
21161
  ]),
21025
21162
  allowed: external_exports.boolean()
21026
21163
  })
@@ -22014,13 +22151,24 @@ var SetupGuideToolResult = external_exports.object({
22014
22151
  result: external_exports.string().trim().min(1).max(4e3),
22015
22152
  page: SetupGuidePageContext
22016
22153
  });
22154
+ var SetupGuideMission = external_exports.object({
22155
+ id: external_exports.string().regex(/^[a-z][a-z0-9_.:-]{0,120}$/),
22156
+ kind: external_exports.enum(["machine", "teammate", "integration", "automation", "first_task"]),
22157
+ goal: external_exports.string().trim().min(1).max(600),
22158
+ targetHref: external_exports.string().startsWith("/").max(2e3),
22159
+ returnHref: external_exports.string().startsWith("/").max(2e3),
22160
+ facts: external_exports.array(SetupGuideContextFact).max(12).default([]),
22161
+ /** Never a secret; the Guide only fills visible non-secure fields with these. */
22162
+ prefills: external_exports.array(SetupGuideActionParameter).max(12).default([])
22163
+ });
22017
22164
  var SetupGuideReplyRequest = external_exports.object({
22018
22165
  message: GuideText,
22019
22166
  history: external_exports.array(SetupGuideHistoryMessage).max(12).default([]),
22020
22167
  page: SetupGuidePageContext,
22021
22168
  onboarding: SetupGuideOnboardingState,
22022
22169
  actions: external_exports.array(SetupGuideAvailableAction).max(128),
22023
- toolResults: external_exports.array(SetupGuideToolResult).max(12).default([])
22170
+ toolResults: external_exports.array(SetupGuideToolResult).max(12).default([]),
22171
+ mission: SetupGuideMission.nullable().optional()
22024
22172
  });
22025
22173
  var SetupGuideProposedAction = external_exports.object({
22026
22174
  actionId: external_exports.string().regex(/^[a-z][a-z0-9_.-]{0,79}$/),
@@ -22045,6 +22193,321 @@ var SetupGuideTranscriptionResponse = external_exports.object({
22045
22193
  text: GuideText
22046
22194
  });
22047
22195
 
22196
+ // ../../packages/contracts/src/roles.ts
22197
+ var CompanyToolKind = external_exports.enum([
22198
+ "github",
22199
+ "slack",
22200
+ "linear",
22201
+ "email",
22202
+ "mcp",
22203
+ "api",
22204
+ "whatsapp",
22205
+ "browser"
22206
+ ]);
22207
+ var RoleRecommendedIntegration = external_exports.object({
22208
+ kind: CompanyToolKind,
22209
+ label: external_exports.string().trim().min(1).max(80),
22210
+ purpose: external_exports.string().trim().min(1).max(200)
22211
+ });
22212
+
22213
+ // ../../packages/contracts/src/company-setup.ts
22214
+ var Key = external_exports.string().regex(/^[a-z][a-z0-9_-]{0,63}$/);
22215
+ var CompanySetupStatus = external_exports.enum([
22216
+ /** No record exists yet. */
22217
+ "not_started",
22218
+ /** The page was opened and the first question prepared; nothing answered. */
22219
+ "offered",
22220
+ "interviewing",
22221
+ /** A plan exists and awaits edits or approval. */
22222
+ "planned",
22223
+ /** The team was created; required and recommended steps are tracked. */
22224
+ "approved"
22225
+ ]);
22226
+ var CompanySetupOrgKind = external_exports.enum(["personal", "company"]);
22227
+ var InterviewAnswer = external_exports.discriminatedUnion("kind", [
22228
+ external_exports.object({ kind: external_exports.literal("text"), text: external_exports.string().trim().min(1).max(2e3) }),
22229
+ external_exports.object({ kind: external_exports.literal("skipped") }),
22230
+ /** "Not sure, suggest for me": the planner chooses a sensible default. */
22231
+ external_exports.object({ kind: external_exports.literal("suggest") })
22232
+ ]);
22233
+ var InterviewQuestion = external_exports.object({
22234
+ id: Key,
22235
+ prompt: external_exports.string().trim().min(1).max(400),
22236
+ /** One-line explanation of a Zixt noun the first time it appears; null otherwise. */
22237
+ gloss: external_exports.string().trim().min(1).max(300).nullable(),
22238
+ examples: external_exports.array(external_exports.string().trim().min(1).max(120)).max(6),
22239
+ allowSuggest: external_exports.boolean()
22240
+ });
22241
+ var InterviewTurn = InterviewQuestion.extend({
22242
+ round: external_exports.number().int().min(1),
22243
+ answer: InterviewAnswer.nullable(),
22244
+ answeredAt: IsoDate.nullable(),
22245
+ /** Tailored options fetched by "Not sure, suggest for me"; the person picks, edits, then continues. */
22246
+ suggestions: external_exports.array(external_exports.string().trim().min(1).max(200)).max(8).default([]),
22247
+ /** The answer here was passed to the Zixt team as product feedback (MG-23); the transcript says so. */
22248
+ feedbackNoted: external_exports.boolean().default(false)
22249
+ });
22250
+ var CompanySetupInterview = external_exports.object({
22251
+ turns: external_exports.array(InterviewTurn).max(40),
22252
+ /** Increments each time the interview is re-run for an additive re-plan. */
22253
+ round: external_exports.number().int().min(1),
22254
+ complete: external_exports.boolean(),
22255
+ /** The next question is being generated; the interview is neither complete nor waiting on the person. */
22256
+ preparingQuestion: external_exports.boolean().default(false),
22257
+ minimumAnswers: external_exports.number().int().min(1),
22258
+ maximumQuestions: external_exports.number().int().min(1)
22259
+ });
22260
+ var PlannedToolAvailability = external_exports.enum([
22261
+ /** A connected Integration of this kind already exists. */
22262
+ "connected",
22263
+ /** The Integration catalog can connect it. */
22264
+ "connectable",
22265
+ /** Reachable through an API Integration (Custom API / discovery). */
22266
+ "api_catalog",
22267
+ /** The teammate uses the website through a saved sign-in in its Browser. */
22268
+ "browser",
22269
+ "not_yet"
22270
+ ]);
22271
+ var PlannedTool = external_exports.object({
22272
+ key: Key,
22273
+ label: external_exports.string().trim().min(1).max(80),
22274
+ purpose: external_exports.string().trim().min(1).max(300),
22275
+ kind: CompanyToolKind,
22276
+ availability: PlannedToolAvailability,
22277
+ /** Catalog Integration name when `availability` is connectable or api_catalog. */
22278
+ catalogName: external_exports.string().trim().min(1).max(120).nullable(),
22279
+ why: external_exports.string().trim().min(1).max(300),
22280
+ enabled: external_exports.boolean()
22281
+ });
22282
+ var PlannedCadence = external_exports.discriminatedUnion("kind", [
22283
+ external_exports.object({
22284
+ kind: external_exports.literal("daily"),
22285
+ hour: external_exports.number().int().min(0).max(23),
22286
+ minute: external_exports.number().int().min(0).max(59)
22287
+ }),
22288
+ external_exports.object({
22289
+ kind: external_exports.literal("weekly"),
22290
+ dayOfWeek: external_exports.number().int().min(0).max(6),
22291
+ hour: external_exports.number().int().min(0).max(23),
22292
+ minute: external_exports.number().int().min(0).max(59)
22293
+ }),
22294
+ external_exports.object({ kind: external_exports.literal("every"), minutes: external_exports.number().int().min(5).max(1440) })
22295
+ ]);
22296
+ var PlannedAutomationTrigger = external_exports.enum(["schedule", "webhook"]);
22297
+ var PlannedAutomation = external_exports.object({
22298
+ key: Key,
22299
+ name: external_exports.string().trim().min(1).max(120),
22300
+ instructions: external_exports.string().trim().min(1).max(4e3),
22301
+ presetId: RoutinePresetId.nullable(),
22302
+ /** Plans stored before OB-12 carry no trigger and read as schedules. */
22303
+ trigger: PlannedAutomationTrigger.default("schedule"),
22304
+ /** Null only for webhook triggers, which have no cadence. */
22305
+ cadence: PlannedCadence.nullable(),
22306
+ /** The external system expected to call, for webhook triggers ("Grafana"). */
22307
+ webhookSource: external_exports.string().trim().min(1).max(120).nullable().default(null),
22308
+ /** The Automation's work needs a person's decision before it acts. */
22309
+ requiresApproval: external_exports.boolean(),
22310
+ why: external_exports.string().trim().min(1).max(300),
22311
+ enabled: external_exports.boolean()
22312
+ });
22313
+ var PlannedExploration = external_exports.object({
22314
+ /** What to explore, in plain words ("the support inbox"). */
22315
+ target: external_exports.string().trim().min(1).max(160),
22316
+ /** The complete Task request, ready for the Manager composer. */
22317
+ request: external_exports.string().trim().min(1).max(1200),
22318
+ why: external_exports.string().trim().min(1).max(300),
22319
+ enabled: external_exports.boolean()
22320
+ });
22321
+ var PlannedTeammate = external_exports.object({
22322
+ key: Key,
22323
+ name: external_exports.string().trim().min(1).max(120),
22324
+ roleTemplate: TeammateRoleTemplate,
22325
+ title: external_exports.string().trim().min(1).max(80),
22326
+ purpose: external_exports.string().trim().min(1).max(600),
22327
+ dayToDay: external_exports.array(external_exports.string().trim().min(1).max(200)).max(6),
22328
+ instructions: external_exports.string().trim().min(1).max(5e4),
22329
+ escalation: external_exports.string().trim().max(1e4),
22330
+ skillIds: external_exports.array(SkillReferenceId).max(40),
22331
+ tools: external_exports.array(PlannedTool).max(8),
22332
+ automations: external_exports.array(PlannedAutomation).max(6),
22333
+ /** Present when the interview left this teammate's proactive needs unknown (OB-12). */
22334
+ exploration: PlannedExploration.nullable().default(null),
22335
+ /** Keys of other planned teammates (or created Agent ids) this teammate hands work to. */
22336
+ handsOffTo: external_exports.array(external_exports.string().trim().min(1).max(120)).max(6),
22337
+ /** Guardrail categories proposed as require_approval because the person said a human decides. */
22338
+ approvals: external_exports.array(ActionCategory).max(20),
22339
+ why: external_exports.string().trim().min(1).max(300),
22340
+ enabled: external_exports.boolean(),
22341
+ /**
22342
+ * Index into the bundled portrait set the person chose for this teammate;
22343
+ * null falls back to a stable name-matched default. Approval turns the
22344
+ * resolved portrait into the created Agent's avatar artwork.
22345
+ */
22346
+ portrait: external_exports.number().int().min(0).max(63).nullable().default(null),
22347
+ /** Set once approval created the Agent; never cleared by a re-plan. */
22348
+ createdAgentId: AgentId.nullable()
22349
+ });
22350
+ var PlannedMachine = external_exports.object({
22351
+ why: external_exports.string().trim().min(1).max(400),
22352
+ suggestedName: external_exports.string().trim().min(1).max(120),
22353
+ operatingSystem: external_exports.enum(["windows", "macos", "linux", "unknown"])
22354
+ });
22355
+ var PlannedFirstTask = external_exports.object({
22356
+ title: external_exports.string().trim().min(1).max(160),
22357
+ request: external_exports.string().trim().min(1).max(1200),
22358
+ teammateKey: Key.nullable()
22359
+ });
22360
+ var CompanySetupPlan = external_exports.object({
22361
+ revision: external_exports.number().int().min(1),
22362
+ summary: external_exports.string().trim().min(1).max(1200),
22363
+ businessName: external_exports.string().trim().min(1).max(120).nullable(),
22364
+ teammates: external_exports.array(PlannedTeammate).min(1).max(8),
22365
+ machine: PlannedMachine,
22366
+ firstTask: PlannedFirstTask.nullable()
22367
+ });
22368
+ var ProposedTool = PlannedTool.omit({ enabled: true });
22369
+ var ProposedAutomation = PlannedAutomation.omit({ enabled: true }).extend({
22370
+ trigger: PlannedAutomationTrigger,
22371
+ webhookSource: external_exports.string().trim().min(1).max(120).nullable()
22372
+ });
22373
+ var ProposedExploration = PlannedExploration.omit({ enabled: true });
22374
+ var ProposedTeammate = PlannedTeammate.omit({
22375
+ createdAgentId: true,
22376
+ enabled: true,
22377
+ // The person picks portraits on the plan; the planner never proposes them.
22378
+ portrait: true
22379
+ }).extend({
22380
+ tools: external_exports.array(ProposedTool).max(8),
22381
+ automations: external_exports.array(ProposedAutomation).max(6),
22382
+ exploration: ProposedExploration.nullable()
22383
+ });
22384
+ var ProposedPlan = CompanySetupPlan.omit({ revision: true }).extend({
22385
+ teammates: external_exports.array(ProposedTeammate).min(1).max(8)
22386
+ });
22387
+ var CompanySetupStepKind = external_exports.enum([
22388
+ "machine",
22389
+ "teammate",
22390
+ "integration",
22391
+ "automation",
22392
+ /** OB-12: a bounded first Task that discovers what this teammate should watch. */
22393
+ "exploration",
22394
+ "first_task"
22395
+ ]);
22396
+ var CompanySetupStepState = external_exports.enum(["open", "done", "skipped"]);
22397
+ var CompanySetupStep = external_exports.object({
22398
+ id: external_exports.string().regex(/^[a-z][a-z0-9_.:-]{0,120}$/),
22399
+ kind: CompanySetupStepKind,
22400
+ required: external_exports.boolean(),
22401
+ title: external_exports.string().trim().min(1).max(160),
22402
+ description: external_exports.string().trim().min(1).max(600),
22403
+ state: CompanySetupStepState,
22404
+ /** What was observed, when the state is done. */
22405
+ evidence: external_exports.object({ summary: external_exports.string().trim().min(1).max(300), at: IsoDate.nullable() }).nullable(),
22406
+ skip: external_exports.object({
22407
+ reason: external_exports.string().trim().min(1).max(500),
22408
+ at: IsoDate,
22409
+ by: MemberId.nullable()
22410
+ }).nullable(),
22411
+ /** The planned teammate this step belongs to, for Integration and Automation steps. */
22412
+ teammateKey: Key.nullable(),
22413
+ teammateName: external_exports.string().trim().min(1).max(120).nullable(),
22414
+ /** The plan item this step tracks (tool key or automation key). */
22415
+ planKey: Key.nullable(),
22416
+ mission: SetupGuideMission.nullable()
22417
+ });
22418
+ var CompanySetupProgress = external_exports.object({
22419
+ requiredTotal: external_exports.number().int().min(0),
22420
+ requiredDone: external_exports.number().int().min(0),
22421
+ recommendedTotal: external_exports.number().int().min(0),
22422
+ recommendedDone: external_exports.number().int().min(0),
22423
+ /** Every required step is done (skips do not count). */
22424
+ requiredComplete: external_exports.boolean(),
22425
+ /** Every recommended step is done or skipped. */
22426
+ recommendedSettled: external_exports.boolean()
22427
+ });
22428
+ var CompanySetupApproval = external_exports.object({
22429
+ at: IsoDate,
22430
+ by: MemberId.nullable(),
22431
+ createdAgentIds: external_exports.array(AgentId)
22432
+ });
22433
+ var CompanySetupView = external_exports.object({
22434
+ id: CompanySetupId.nullable(),
22435
+ orgId: OrgId,
22436
+ status: CompanySetupStatus,
22437
+ orgKind: CompanySetupOrgKind,
22438
+ interview: CompanySetupInterview.nullable(),
22439
+ /** The next unanswered question, when the interview is open. */
22440
+ currentQuestion: InterviewTurn.nullable(),
22441
+ plan: CompanySetupPlan.nullable(),
22442
+ /**
22443
+ * The plan is being proposed in the background (a planner call can take a
22444
+ * minute); the page polls until the plan lands or an error is recorded.
22445
+ */
22446
+ planning: external_exports.object({ startedAt: IsoDate, error: external_exports.string().max(500).nullable() }).nullable(),
22447
+ approval: CompanySetupApproval.nullable(),
22448
+ steps: external_exports.array(CompanySetupStep),
22449
+ progress: CompanySetupProgress,
22450
+ /** Company facts the Guide carries into missions; empty before a plan exists. */
22451
+ contextFacts: external_exports.array(SetupGuideContextFact).max(12),
22452
+ homeCardDismissedAt: IsoDate.nullable(),
22453
+ /**
22454
+ * True only for an Admin of an organization with no record, no teammates, no
22455
+ * Machines, and no Tasks: Home may open the setup page once. Opening it
22456
+ * creates the record, so the redirect never repeats.
22457
+ */
22458
+ suggestRedirect: external_exports.boolean(),
22459
+ viewerCanEdit: external_exports.boolean(),
22460
+ /** Absent when the deployment has no inference configured and no record exists. */
22461
+ interviewAvailable: external_exports.boolean(),
22462
+ startedAt: IsoDate.nullable(),
22463
+ updatedAt: IsoDate.nullable()
22464
+ });
22465
+ var AnswerCompanySetupQuestionRequest = external_exports.object({
22466
+ questionId: Key,
22467
+ answer: InterviewAnswer
22468
+ }).strict();
22469
+ var SuggestCompanySetupAnswersRequest = external_exports.object({
22470
+ questionId: Key
22471
+ }).strict();
22472
+ var UpdateCompanySetupPlanRequest = external_exports.object({
22473
+ /** The full edited plan; the revision must match the stored one. */
22474
+ plan: CompanySetupPlan
22475
+ }).strict();
22476
+ var ApproveCompanySetupRequest = external_exports.object({
22477
+ planRevision: external_exports.number().int().min(1)
22478
+ }).strict();
22479
+ var SkipCompanySetupStepRequest = external_exports.object({
22480
+ reason: external_exports.string().trim().min(1).max(500)
22481
+ }).strict();
22482
+ var ProposeTeammateRequest = external_exports.object({
22483
+ answers: external_exports.array(
22484
+ external_exports.object({
22485
+ question: external_exports.string().trim().min(1).max(400),
22486
+ answer: external_exports.string().trim().min(1).max(2e3)
22487
+ })
22488
+ ).max(6),
22489
+ requestedRole: TeammateRoleTemplate.nullable().optional()
22490
+ }).strict();
22491
+ var ProposeTeammateResponse = external_exports.object({
22492
+ teammate: ProposedTeammate
22493
+ });
22494
+ var CompanySetupFunnel = external_exports.object({
22495
+ status: CompanySetupStatus,
22496
+ startedAt: IsoDate.nullable(),
22497
+ planProposedAt: IsoDate.nullable(),
22498
+ planApprovedAt: IsoDate.nullable(),
22499
+ requiredCompletedAt: IsoDate.nullable(),
22500
+ recommendedSettledAt: IsoDate.nullable(),
22501
+ teammatesCreated: external_exports.number().int().min(0),
22502
+ stepsSkipped: external_exports.number().int().min(0)
22503
+ });
22504
+ var TEAMMATE_PORTRAIT_COUNT = 16;
22505
+ var ALL_PORTRAITS = Array.from({ length: TEAMMATE_PORTRAIT_COUNT }, (_, index) => index);
22506
+
22507
+ // ../../packages/contracts/src/product-feedback.ts
22508
+ var ProductFeedbackKind = external_exports.enum(["frustration", "missing_capability", "feature_request"]);
22509
+ var ProductFeedbackSurface = external_exports.enum(["manager", "guide", "company_setup"]);
22510
+
22048
22511
  // src/runners/mcp-client.ts
22049
22512
  var REQUEST_TIMEOUT_MS = 1e4;
22050
22513
  var MAX_BODY_BYTES = 4 * 1024 * 1024;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zixt/host",
3
- "version": "0.0.130",
3
+ "version": "0.0.131",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": "./src/client.ts",