@zixt/host 0.0.51 → 0.0.52

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 +326 -306
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -31,7 +31,7 @@ import { homedir } from "node:os";
31
31
  // package.json
32
32
  var package_default = {
33
33
  name: "@zixt/host",
34
- version: "0.0.51",
34
+ version: "0.0.52",
35
35
  type: "module",
36
36
  exports: {
37
37
  ".": "./src/client.ts",
@@ -17929,6 +17929,304 @@ var CLOSE_CODES = {
17929
17929
  revoked: 4004
17930
17930
  };
17931
17931
 
17932
+ // ../../packages/contracts/src/manager.ts
17933
+ var MANAGER_DEFAULT_MODEL = "gpt-5.6-luna";
17934
+ var MANAGER_DISPLAY_NAME_MAX = 60;
17935
+ var MANAGER_INSTRUCTIONS_MAX = 2e4;
17936
+ var CONVERSATION_MESSAGE_MAX = 1e5;
17937
+ var CONVERSATION_LIST_LIMIT = 50;
17938
+ var ManagerReasoningEffort = external_exports.enum([
17939
+ "none",
17940
+ "minimal",
17941
+ "low",
17942
+ "medium",
17943
+ "high",
17944
+ "xhigh",
17945
+ "max"
17946
+ ]);
17947
+ var ManagerConfigProjection = external_exports.object({
17948
+ id: ManagerId,
17949
+ /** Shown in the UI and on chat channels; the persona carries the personality (MG-7). */
17950
+ displayName: external_exports.string().min(1).max(MANAGER_DISPLAY_NAME_MAX),
17951
+ /** Appended to the product-owned built-in system prompt; never replaces it. */
17952
+ instructions: external_exports.string().max(MANAGER_INSTRUCTIONS_MAX),
17953
+ model: external_exports.string().min(1).max(100),
17954
+ reasoningEffort: ManagerReasoningEffort,
17955
+ /**
17956
+ * Where the Manager answers on Slack. The workspace bot speaks for the
17957
+ * Manager (MG-1), so the per-teammate mention/DM switches that used to
17958
+ * decide this belong here now — an organization keeps a truthful off
17959
+ * switch for each surface without disconnecting the workspace.
17960
+ */
17961
+ slack: external_exports.object({ answerMentions: external_exports.boolean(), answerDirectMessages: external_exports.boolean() }).strict(),
17962
+ revision: external_exports.number().int().min(0),
17963
+ updatedAt: external_exports.string().nullable()
17964
+ }).strict();
17965
+ var ManagerMode = external_exports.enum(["openai", "demo", "unconfigured"]);
17966
+ var GetManagerResponse = external_exports.object({ manager: ManagerConfigProjection, mode: ManagerMode }).strict();
17967
+ var UpdateManagerRequest = external_exports.object({
17968
+ displayName: external_exports.string().min(1).max(MANAGER_DISPLAY_NAME_MAX).optional(),
17969
+ instructions: external_exports.string().max(MANAGER_INSTRUCTIONS_MAX).optional(),
17970
+ model: external_exports.string().min(1).max(100).optional(),
17971
+ reasoningEffort: ManagerReasoningEffort.optional(),
17972
+ slack: external_exports.object({
17973
+ answerMentions: external_exports.boolean().optional(),
17974
+ answerDirectMessages: external_exports.boolean().optional()
17975
+ }).strict().optional(),
17976
+ /** Optimistic concurrency: refuse when another admin saved first. */
17977
+ expectedRevision: external_exports.number().int().min(0).optional()
17978
+ }).strict().superRefine((value, ctx) => {
17979
+ if (value.displayName === void 0 && value.instructions === void 0 && value.model === void 0 && value.reasoningEffort === void 0 && value.slack === void 0) {
17980
+ ctx.addIssue({ code: "custom", message: "nothing to update" });
17981
+ }
17982
+ });
17983
+ var ManagerMemoryKind = external_exports.enum([
17984
+ /** How recurring organization work is actually done ("releases ship Thursday"). */
17985
+ "process",
17986
+ /** A settled organization decision and, ideally, why. */
17987
+ "decision",
17988
+ /** A standing preference for how the organization wants to be served. */
17989
+ "preference",
17990
+ /** A durable organization fact that is not derivable from configuration. */
17991
+ "fact"
17992
+ ]);
17993
+ var MANAGER_MEMORY_SUBJECT_MAX = 60;
17994
+ var MANAGER_MEMORY_TEXT_MAX = 300;
17995
+ var MANAGER_MEMORY_MAX_ITEMS = 60;
17996
+ var ManagerMemoryProjection = external_exports.object({
17997
+ id: ManagerMemoryId,
17998
+ kind: ManagerMemoryKind,
17999
+ /** Short normalized topic; (kind, subject) is the deduplication key. */
18000
+ subject: external_exports.string().min(1).max(MANAGER_MEMORY_SUBJECT_MAX),
18001
+ text: external_exports.string().min(1).max(MANAGER_MEMORY_TEXT_MAX),
18002
+ /** Thread the Manager learned it in, for provenance. */
18003
+ sourceConversationId: ConversationId.nullable(),
18004
+ createdAt: external_exports.string(),
18005
+ updatedAt: external_exports.string()
18006
+ }).strict();
18007
+ var ListManagerMemoriesResponse = external_exports.object({
18008
+ memories: external_exports.array(ManagerMemoryProjection).max(MANAGER_MEMORY_MAX_ITEMS),
18009
+ limit: external_exports.number().int().min(1)
18010
+ }).strict();
18011
+ var ConversationChannel = external_exports.enum(["web", "slack", "whatsapp", "phone"]);
18012
+ var ConversationStatus = external_exports.enum(["idle", "thinking"]);
18013
+ var ConversationProjection = external_exports.object({
18014
+ id: ConversationId,
18015
+ /** First-message prefix until the one creation-time Manager title call settles. */
18016
+ title: external_exports.string().min(1).max(200),
18017
+ channel: ConversationChannel,
18018
+ status: ConversationStatus,
18019
+ /** TS-10 origin trust of the channel; propagated into every delegated Task. */
18020
+ trust: external_exports.enum(["internal", "external"]),
18021
+ /** One-use override for the next Task delegated from this thread. */
18022
+ nextDelegationRunner: TaskRunnerSelection.nullable(),
18023
+ createdAt: external_exports.string(),
18024
+ lastActivityAt: external_exports.string(),
18025
+ /** Archived, but at least one executor has not yet proven it stopped. */
18026
+ archiveState: external_exports.literal("stopping").nullable().optional(),
18027
+ archivedAt: external_exports.string().nullable()
18028
+ }).strict().superRefine((conversation, ctx) => {
18029
+ if (conversation.archiveState === "stopping" && conversation.archivedAt === null) {
18030
+ ctx.addIssue({
18031
+ code: "custom",
18032
+ path: ["archivedAt"],
18033
+ message: "a stopping Manager Task must already be in Archived"
18034
+ });
18035
+ }
18036
+ });
18037
+ var conversationEventBase = {
18038
+ id: ConversationEventId,
18039
+ at: external_exports.string()
18040
+ };
18041
+ var ConversationEventProjection = external_exports.discriminatedUnion("kind", [
18042
+ /** A human message into the Conversation. */
18043
+ external_exports.object({
18044
+ ...conversationEventBase,
18045
+ kind: external_exports.literal("user"),
18046
+ text: external_exports.string(),
18047
+ /** Display attribution only; authentication subjects remain internal. */
18048
+ author: external_exports.object({ displayName: external_exports.string().nullable() }).strict(),
18049
+ /** Transport that supplied this turn; legacy events omit it. */
18050
+ sourceChannel: ConversationChannel.optional(),
18051
+ /** Input affordance within the trusted transport; legacy/typed turns omit it. */
18052
+ inputModality: external_exports.literal("voice").optional(),
18053
+ attachments: external_exports.array(TaskAttachmentRef).max(TASK_MESSAGE_MAX_ATTACHMENTS).optional()
18054
+ }).strict(),
18055
+ /** The Manager's prose reply. */
18056
+ external_exports.object({ ...conversationEventBase, kind: external_exports.literal("manager"), text: external_exports.string() }).strict(),
18057
+ /** One Manager tool step: a delegation, follow-up, or status check. */
18058
+ external_exports.object({
18059
+ ...conversationEventBase,
18060
+ kind: external_exports.literal("tool"),
18061
+ tool: external_exports.string(),
18062
+ summary: external_exports.string(),
18063
+ taskId: TaskId.nullable(),
18064
+ agentId: AgentId.nullable(),
18065
+ /** Present only for a confirmation card; OAuth authority never appears here. */
18066
+ integrationActionId: ManagerIntegrationActionId.nullable().optional()
18067
+ }).strict(),
18068
+ /** A mirrored child-Task event: what the teammate wrote or became. */
18069
+ external_exports.object({
18070
+ ...conversationEventBase,
18071
+ kind: external_exports.literal("task"),
18072
+ taskId: TaskId,
18073
+ agentId: AgentId.nullable(),
18074
+ eventKind: external_exports.enum(["response", "error", "status", "question", "message"]),
18075
+ summary: external_exports.string(),
18076
+ taskStatus: TaskStatus.nullable(),
18077
+ /**
18078
+ * Opaque presentation key shared by the useful report and its synthetic
18079
+ * terminal wake-up. It is never shown to people; clients use it only to
18080
+ * render one outcome when recovery commits those records out of order.
18081
+ * Missing on legacy/non-terminal events.
18082
+ */
18083
+ terminalGroup: external_exports.string().min(1).max(200).nullable().optional()
18084
+ }).strict(),
18085
+ /** A Manager loop failure a person should see (provider outage, refusal). */
18086
+ external_exports.object({ ...conversationEventBase, kind: external_exports.literal("error"), message: external_exports.string() }).strict()
18087
+ ]);
18088
+ var ManagerIntegrationProvider = external_exports.enum(["slack"]);
18089
+ var ManagerIntegrationOperation = external_exports.enum(["connect", "reconnect", "check", "remove"]);
18090
+ var ManagerIntegrationActionStatus = external_exports.enum([
18091
+ "awaiting_confirmation",
18092
+ "working",
18093
+ "authorizing",
18094
+ "completed",
18095
+ "cancelled",
18096
+ "failed",
18097
+ "expired"
18098
+ ]);
18099
+ var ManagerIntegrationActionProjection = external_exports.object({
18100
+ id: ManagerIntegrationActionId,
18101
+ conversationId: ConversationId,
18102
+ provider: ManagerIntegrationProvider,
18103
+ providerName: external_exports.string().min(1).max(80),
18104
+ operation: ManagerIntegrationOperation,
18105
+ status: ManagerIntegrationActionStatus,
18106
+ title: external_exports.string().min(1).max(200),
18107
+ description: external_exports.string().min(1).max(1e3),
18108
+ confirmLabel: external_exports.string().min(1).max(100),
18109
+ outcome: external_exports.string().max(1e3).nullable(),
18110
+ createdAt: external_exports.string(),
18111
+ expiresAt: external_exports.string()
18112
+ }).strict();
18113
+ var ManagerIntegrationOAuthStart = external_exports.object({
18114
+ authorizeUrl: external_exports.url().max(4e3),
18115
+ callbackOrigin: external_exports.url().max(2e3)
18116
+ }).strict();
18117
+ var ConfirmManagerIntegrationActionRequest = external_exports.object({ requestId: external_exports.string().uuid() }).strict();
18118
+ var ManagerIntegrationActionResponse = external_exports.object({
18119
+ action: ManagerIntegrationActionProjection,
18120
+ oauth: ManagerIntegrationOAuthStart.nullable()
18121
+ }).strict();
18122
+ var NonEmptyTaskRunnerSelection = TaskRunnerSelection.refine(
18123
+ (selection) => selection.type !== void 0 || selection.model !== void 0 || selection.effort !== void 0,
18124
+ "choose at least one runtime preference"
18125
+ );
18126
+ var CreateConversationRequest = external_exports.object({
18127
+ /** Stable client-generated key: retrying the same submission returns one Conversation. */
18128
+ requestId: external_exports.uuid(),
18129
+ message: external_exports.string().max(CONVERSATION_MESSAGE_MAX),
18130
+ attachmentIds: external_exports.array(AttachmentId).max(TASK_MESSAGE_MAX_ATTACHMENTS).refine((ids) => new Set(ids).size === ids.length, "duplicate attachment").optional(),
18131
+ /**
18132
+ * Teammate whose persistent Browser is selected beside this web turn.
18133
+ * This is bounded routing context for Browser-directed requests only; it
18134
+ * is never a general delegation preference.
18135
+ */
18136
+ browserAgentId: AgentId.optional(),
18137
+ /**
18138
+ * One-time runtime override for the first Task this thread delegates.
18139
+ * Omission preserves the selected teammate's configured defaults.
18140
+ */
18141
+ initialDelegation: external_exports.object({
18142
+ runner: NonEmptyTaskRunnerSelection
18143
+ }).strict().optional()
18144
+ }).strict().superRefine((value, ctx) => {
18145
+ if (!value.message.trim() && !value.attachmentIds?.length) {
18146
+ ctx.addIssue({
18147
+ code: "custom",
18148
+ path: ["message"],
18149
+ message: "a message needs text or an attachment"
18150
+ });
18151
+ }
18152
+ });
18153
+ var PostConversationMessageRequest = external_exports.object({
18154
+ /** Stable client-generated key: an ambiguous retry appends exactly once. */
18155
+ requestId: external_exports.uuid(),
18156
+ message: external_exports.string().max(CONVERSATION_MESSAGE_MAX),
18157
+ attachmentIds: external_exports.array(AttachmentId).max(TASK_MESSAGE_MAX_ATTACHMENTS).refine((ids) => new Set(ids).size === ids.length, "duplicate attachment").optional(),
18158
+ /** Selected Manager Browser teammate for Browser-directed requests only. */
18159
+ browserAgentId: AgentId.optional()
18160
+ }).strict().superRefine((value, ctx) => {
18161
+ if (!value.message.trim() && !value.attachmentIds?.length) {
18162
+ ctx.addIssue({
18163
+ code: "custom",
18164
+ path: ["message"],
18165
+ message: "a message needs text or an attachment"
18166
+ });
18167
+ }
18168
+ });
18169
+ var UpdateNextDelegationRuntimeRequest = external_exports.object({ runner: NonEmptyTaskRunnerSelection.nullable() }).strict();
18170
+ var UpdateConversationRequest = external_exports.object({
18171
+ title: external_exports.string().trim().min(1).max(200).optional(),
18172
+ archived: external_exports.boolean().optional()
18173
+ }).strict().superRefine((value, ctx) => {
18174
+ if (value.title === void 0 && value.archived === void 0) {
18175
+ ctx.addIssue({ code: "custom", message: "nothing to update" });
18176
+ }
18177
+ });
18178
+ var ConversationResponse = external_exports.object({ conversation: ConversationProjection }).strict();
18179
+ var ListConversationsResponse = external_exports.object({
18180
+ conversations: external_exports.array(ConversationProjection).max(CONVERSATION_LIST_LIMIT),
18181
+ nextCursor: external_exports.string().nullable()
18182
+ }).strict();
18183
+ var ManagerTaskRailSummariesRequest = external_exports.object({
18184
+ conversationIds: external_exports.array(ConversationId).min(1).max(CONVERSATION_LIST_LIMIT),
18185
+ archived: external_exports.boolean(),
18186
+ agentId: AgentId.optional(),
18187
+ statuses: external_exports.array(TaskStatus).min(1).max(TaskStatus.options.length).optional()
18188
+ }).strict().superRefine((value, ctx) => {
18189
+ if (new Set(value.conversationIds).size !== value.conversationIds.length) {
18190
+ ctx.addIssue({
18191
+ code: "custom",
18192
+ path: ["conversationIds"],
18193
+ message: "conversationIds must be unique"
18194
+ });
18195
+ }
18196
+ if (value.statuses && new Set(value.statuses).size !== value.statuses.length) {
18197
+ ctx.addIssue({
18198
+ code: "custom",
18199
+ path: ["statuses"],
18200
+ message: "statuses must be unique"
18201
+ });
18202
+ }
18203
+ });
18204
+ var ManagerTaskRailRepresentative = external_exports.object({
18205
+ id: TaskId,
18206
+ agentId: AgentId,
18207
+ status: TaskStatus,
18208
+ gitSummary: TaskGitSummary.nullable(),
18209
+ createdAt: external_exports.string(),
18210
+ updatedAt: external_exports.string()
18211
+ }).strict();
18212
+ var ManagerTaskRailSummary = external_exports.object({
18213
+ conversationId: ConversationId,
18214
+ hasChildren: external_exports.boolean(),
18215
+ hasAgentMatch: external_exports.boolean(),
18216
+ hasStatusMatch: external_exports.boolean(),
18217
+ representative: ManagerTaskRailRepresentative.nullable()
18218
+ }).strict();
18219
+ var ManagerTaskRailSummariesResponse = external_exports.object({ summaries: external_exports.array(ManagerTaskRailSummary).max(CONVERSATION_LIST_LIMIT) }).strict();
18220
+ var ConversationDetailResponse = external_exports.object({
18221
+ conversation: ConversationProjection,
18222
+ events: external_exports.array(ConversationEventProjection)
18223
+ }).strict();
18224
+ var ManagerStreamFrame = external_exports.discriminatedUnion("type", [
18225
+ external_exports.object({ type: external_exports.literal("event"), event: ConversationEventProjection }).strict(),
18226
+ external_exports.object({ type: external_exports.literal("delta"), text: external_exports.string() }).strict(),
18227
+ external_exports.object({ type: external_exports.literal("conversation"), conversation: ConversationProjection }).strict()
18228
+ ]);
18229
+
17932
18230
  // ../../packages/contracts/src/api.ts
17933
18231
  var ProblemCode = external_exports.enum([
17934
18232
  "network_unavailable",
@@ -18033,6 +18331,19 @@ var CreateAgentRequest = external_exports.object({
18033
18331
  workspaces: Agent.shape.workspaces.removeDefault().optional(),
18034
18332
  requiredConnectionIds: Agent.shape.requiredConnectionIds.removeDefault().optional()
18035
18333
  });
18334
+ var GenerateAgentInstructionDraftRequest = external_exports.object({
18335
+ target: external_exports.enum(["instructions", "escalation"]),
18336
+ name: external_exports.string().max(120),
18337
+ roleDescription: external_exports.string().max(2e3),
18338
+ roleTemplate: Agent.shape.roleTemplate.removeDefault(),
18339
+ existingText: external_exports.string().max(5e4),
18340
+ projectContext: external_exports.string().max(4e3)
18341
+ }).strict();
18342
+ var GenerateAgentInstructionDraftResponse = external_exports.object({
18343
+ text: external_exports.string().min(1).max(5e4),
18344
+ /** Evidence of the fixed product route; ordinary UI copy does not expose it. */
18345
+ model: external_exports.literal(MANAGER_DEFAULT_MODEL)
18346
+ }).strict();
18036
18347
  var UpdateAgentRequest = external_exports.object({
18037
18348
  name: Agent.shape.name,
18038
18349
  roleDescription: external_exports.string().max(2e3),
@@ -18757,303 +19068,6 @@ var LinearOAuthPopupMessage = external_exports.discriminatedUnion("ok", [
18757
19068
  LinearOAuthPopupFailure
18758
19069
  ]);
18759
19070
 
18760
- // ../../packages/contracts/src/manager.ts
18761
- var MANAGER_DISPLAY_NAME_MAX = 60;
18762
- var MANAGER_INSTRUCTIONS_MAX = 2e4;
18763
- var CONVERSATION_MESSAGE_MAX = 1e5;
18764
- var CONVERSATION_LIST_LIMIT = 50;
18765
- var ManagerReasoningEffort = external_exports.enum([
18766
- "none",
18767
- "minimal",
18768
- "low",
18769
- "medium",
18770
- "high",
18771
- "xhigh",
18772
- "max"
18773
- ]);
18774
- var ManagerConfigProjection = external_exports.object({
18775
- id: ManagerId,
18776
- /** Shown in the UI and on chat channels; the persona carries the personality (MG-7). */
18777
- displayName: external_exports.string().min(1).max(MANAGER_DISPLAY_NAME_MAX),
18778
- /** Appended to the product-owned built-in system prompt; never replaces it. */
18779
- instructions: external_exports.string().max(MANAGER_INSTRUCTIONS_MAX),
18780
- model: external_exports.string().min(1).max(100),
18781
- reasoningEffort: ManagerReasoningEffort,
18782
- /**
18783
- * Where the Manager answers on Slack. The workspace bot speaks for the
18784
- * Manager (MG-1), so the per-teammate mention/DM switches that used to
18785
- * decide this belong here now — an organization keeps a truthful off
18786
- * switch for each surface without disconnecting the workspace.
18787
- */
18788
- slack: external_exports.object({ answerMentions: external_exports.boolean(), answerDirectMessages: external_exports.boolean() }).strict(),
18789
- revision: external_exports.number().int().min(0),
18790
- updatedAt: external_exports.string().nullable()
18791
- }).strict();
18792
- var ManagerMode = external_exports.enum(["openai", "demo", "unconfigured"]);
18793
- var GetManagerResponse = external_exports.object({ manager: ManagerConfigProjection, mode: ManagerMode }).strict();
18794
- var UpdateManagerRequest = external_exports.object({
18795
- displayName: external_exports.string().min(1).max(MANAGER_DISPLAY_NAME_MAX).optional(),
18796
- instructions: external_exports.string().max(MANAGER_INSTRUCTIONS_MAX).optional(),
18797
- model: external_exports.string().min(1).max(100).optional(),
18798
- reasoningEffort: ManagerReasoningEffort.optional(),
18799
- slack: external_exports.object({
18800
- answerMentions: external_exports.boolean().optional(),
18801
- answerDirectMessages: external_exports.boolean().optional()
18802
- }).strict().optional(),
18803
- /** Optimistic concurrency: refuse when another admin saved first. */
18804
- expectedRevision: external_exports.number().int().min(0).optional()
18805
- }).strict().superRefine((value, ctx) => {
18806
- if (value.displayName === void 0 && value.instructions === void 0 && value.model === void 0 && value.reasoningEffort === void 0 && value.slack === void 0) {
18807
- ctx.addIssue({ code: "custom", message: "nothing to update" });
18808
- }
18809
- });
18810
- var ManagerMemoryKind = external_exports.enum([
18811
- /** How recurring organization work is actually done ("releases ship Thursday"). */
18812
- "process",
18813
- /** A settled organization decision and, ideally, why. */
18814
- "decision",
18815
- /** A standing preference for how the organization wants to be served. */
18816
- "preference",
18817
- /** A durable organization fact that is not derivable from configuration. */
18818
- "fact"
18819
- ]);
18820
- var MANAGER_MEMORY_SUBJECT_MAX = 60;
18821
- var MANAGER_MEMORY_TEXT_MAX = 300;
18822
- var MANAGER_MEMORY_MAX_ITEMS = 60;
18823
- var ManagerMemoryProjection = external_exports.object({
18824
- id: ManagerMemoryId,
18825
- kind: ManagerMemoryKind,
18826
- /** Short normalized topic; (kind, subject) is the deduplication key. */
18827
- subject: external_exports.string().min(1).max(MANAGER_MEMORY_SUBJECT_MAX),
18828
- text: external_exports.string().min(1).max(MANAGER_MEMORY_TEXT_MAX),
18829
- /** Thread the Manager learned it in, for provenance. */
18830
- sourceConversationId: ConversationId.nullable(),
18831
- createdAt: external_exports.string(),
18832
- updatedAt: external_exports.string()
18833
- }).strict();
18834
- var ListManagerMemoriesResponse = external_exports.object({
18835
- memories: external_exports.array(ManagerMemoryProjection).max(MANAGER_MEMORY_MAX_ITEMS),
18836
- limit: external_exports.number().int().min(1)
18837
- }).strict();
18838
- var ConversationChannel = external_exports.enum(["web", "slack", "whatsapp", "phone"]);
18839
- var ConversationStatus = external_exports.enum(["idle", "thinking"]);
18840
- var ConversationProjection = external_exports.object({
18841
- id: ConversationId,
18842
- /** First-message prefix until the one creation-time Manager title call settles. */
18843
- title: external_exports.string().min(1).max(200),
18844
- channel: ConversationChannel,
18845
- status: ConversationStatus,
18846
- /** TS-10 origin trust of the channel; propagated into every delegated Task. */
18847
- trust: external_exports.enum(["internal", "external"]),
18848
- /** One-use override for the next Task delegated from this thread. */
18849
- nextDelegationRunner: TaskRunnerSelection.nullable(),
18850
- createdAt: external_exports.string(),
18851
- lastActivityAt: external_exports.string(),
18852
- /** Archived, but at least one executor has not yet proven it stopped. */
18853
- archiveState: external_exports.literal("stopping").nullable().optional(),
18854
- archivedAt: external_exports.string().nullable()
18855
- }).strict().superRefine((conversation, ctx) => {
18856
- if (conversation.archiveState === "stopping" && conversation.archivedAt === null) {
18857
- ctx.addIssue({
18858
- code: "custom",
18859
- path: ["archivedAt"],
18860
- message: "a stopping Manager Task must already be in Archived"
18861
- });
18862
- }
18863
- });
18864
- var conversationEventBase = {
18865
- id: ConversationEventId,
18866
- at: external_exports.string()
18867
- };
18868
- var ConversationEventProjection = external_exports.discriminatedUnion("kind", [
18869
- /** A human message into the Conversation. */
18870
- external_exports.object({
18871
- ...conversationEventBase,
18872
- kind: external_exports.literal("user"),
18873
- text: external_exports.string(),
18874
- /** Display attribution only; authentication subjects remain internal. */
18875
- author: external_exports.object({ displayName: external_exports.string().nullable() }).strict(),
18876
- /** Transport that supplied this turn; legacy events omit it. */
18877
- sourceChannel: ConversationChannel.optional(),
18878
- /** Input affordance within the trusted transport; legacy/typed turns omit it. */
18879
- inputModality: external_exports.literal("voice").optional(),
18880
- attachments: external_exports.array(TaskAttachmentRef).max(TASK_MESSAGE_MAX_ATTACHMENTS).optional()
18881
- }).strict(),
18882
- /** The Manager's prose reply. */
18883
- external_exports.object({ ...conversationEventBase, kind: external_exports.literal("manager"), text: external_exports.string() }).strict(),
18884
- /** One Manager tool step: a delegation, follow-up, or status check. */
18885
- external_exports.object({
18886
- ...conversationEventBase,
18887
- kind: external_exports.literal("tool"),
18888
- tool: external_exports.string(),
18889
- summary: external_exports.string(),
18890
- taskId: TaskId.nullable(),
18891
- agentId: AgentId.nullable(),
18892
- /** Present only for a confirmation card; OAuth authority never appears here. */
18893
- integrationActionId: ManagerIntegrationActionId.nullable().optional()
18894
- }).strict(),
18895
- /** A mirrored child-Task event: what the teammate wrote or became. */
18896
- external_exports.object({
18897
- ...conversationEventBase,
18898
- kind: external_exports.literal("task"),
18899
- taskId: TaskId,
18900
- agentId: AgentId.nullable(),
18901
- eventKind: external_exports.enum(["response", "error", "status", "question", "message"]),
18902
- summary: external_exports.string(),
18903
- taskStatus: TaskStatus.nullable(),
18904
- /**
18905
- * Opaque presentation key shared by the useful report and its synthetic
18906
- * terminal wake-up. It is never shown to people; clients use it only to
18907
- * render one outcome when recovery commits those records out of order.
18908
- * Missing on legacy/non-terminal events.
18909
- */
18910
- terminalGroup: external_exports.string().min(1).max(200).nullable().optional()
18911
- }).strict(),
18912
- /** A Manager loop failure a person should see (provider outage, refusal). */
18913
- external_exports.object({ ...conversationEventBase, kind: external_exports.literal("error"), message: external_exports.string() }).strict()
18914
- ]);
18915
- var ManagerIntegrationProvider = external_exports.enum(["slack"]);
18916
- var ManagerIntegrationOperation = external_exports.enum(["connect", "reconnect", "check", "remove"]);
18917
- var ManagerIntegrationActionStatus = external_exports.enum([
18918
- "awaiting_confirmation",
18919
- "working",
18920
- "authorizing",
18921
- "completed",
18922
- "cancelled",
18923
- "failed",
18924
- "expired"
18925
- ]);
18926
- var ManagerIntegrationActionProjection = external_exports.object({
18927
- id: ManagerIntegrationActionId,
18928
- conversationId: ConversationId,
18929
- provider: ManagerIntegrationProvider,
18930
- providerName: external_exports.string().min(1).max(80),
18931
- operation: ManagerIntegrationOperation,
18932
- status: ManagerIntegrationActionStatus,
18933
- title: external_exports.string().min(1).max(200),
18934
- description: external_exports.string().min(1).max(1e3),
18935
- confirmLabel: external_exports.string().min(1).max(100),
18936
- outcome: external_exports.string().max(1e3).nullable(),
18937
- createdAt: external_exports.string(),
18938
- expiresAt: external_exports.string()
18939
- }).strict();
18940
- var ManagerIntegrationOAuthStart = external_exports.object({
18941
- authorizeUrl: external_exports.url().max(4e3),
18942
- callbackOrigin: external_exports.url().max(2e3)
18943
- }).strict();
18944
- var ConfirmManagerIntegrationActionRequest = external_exports.object({ requestId: external_exports.string().uuid() }).strict();
18945
- var ManagerIntegrationActionResponse = external_exports.object({
18946
- action: ManagerIntegrationActionProjection,
18947
- oauth: ManagerIntegrationOAuthStart.nullable()
18948
- }).strict();
18949
- var NonEmptyTaskRunnerSelection = TaskRunnerSelection.refine(
18950
- (selection) => selection.type !== void 0 || selection.model !== void 0 || selection.effort !== void 0,
18951
- "choose at least one runtime preference"
18952
- );
18953
- var CreateConversationRequest = external_exports.object({
18954
- /** Stable client-generated key: retrying the same submission returns one Conversation. */
18955
- requestId: external_exports.uuid(),
18956
- message: external_exports.string().max(CONVERSATION_MESSAGE_MAX),
18957
- attachmentIds: external_exports.array(AttachmentId).max(TASK_MESSAGE_MAX_ATTACHMENTS).refine((ids) => new Set(ids).size === ids.length, "duplicate attachment").optional(),
18958
- /**
18959
- * Teammate whose persistent Browser is selected beside this web turn.
18960
- * This is bounded routing context for Browser-directed requests only; it
18961
- * is never a general delegation preference.
18962
- */
18963
- browserAgentId: AgentId.optional(),
18964
- /**
18965
- * One-time runtime override for the first Task this thread delegates.
18966
- * Omission preserves the selected teammate's configured defaults.
18967
- */
18968
- initialDelegation: external_exports.object({
18969
- runner: NonEmptyTaskRunnerSelection
18970
- }).strict().optional()
18971
- }).strict().superRefine((value, ctx) => {
18972
- if (!value.message.trim() && !value.attachmentIds?.length) {
18973
- ctx.addIssue({
18974
- code: "custom",
18975
- path: ["message"],
18976
- message: "a message needs text or an attachment"
18977
- });
18978
- }
18979
- });
18980
- var PostConversationMessageRequest = external_exports.object({
18981
- /** Stable client-generated key: an ambiguous retry appends exactly once. */
18982
- requestId: external_exports.uuid(),
18983
- message: external_exports.string().max(CONVERSATION_MESSAGE_MAX),
18984
- attachmentIds: external_exports.array(AttachmentId).max(TASK_MESSAGE_MAX_ATTACHMENTS).refine((ids) => new Set(ids).size === ids.length, "duplicate attachment").optional(),
18985
- /** Selected Manager Browser teammate for Browser-directed requests only. */
18986
- browserAgentId: AgentId.optional()
18987
- }).strict().superRefine((value, ctx) => {
18988
- if (!value.message.trim() && !value.attachmentIds?.length) {
18989
- ctx.addIssue({
18990
- code: "custom",
18991
- path: ["message"],
18992
- message: "a message needs text or an attachment"
18993
- });
18994
- }
18995
- });
18996
- var UpdateNextDelegationRuntimeRequest = external_exports.object({ runner: NonEmptyTaskRunnerSelection.nullable() }).strict();
18997
- var UpdateConversationRequest = external_exports.object({
18998
- title: external_exports.string().trim().min(1).max(200).optional(),
18999
- archived: external_exports.boolean().optional()
19000
- }).strict().superRefine((value, ctx) => {
19001
- if (value.title === void 0 && value.archived === void 0) {
19002
- ctx.addIssue({ code: "custom", message: "nothing to update" });
19003
- }
19004
- });
19005
- var ConversationResponse = external_exports.object({ conversation: ConversationProjection }).strict();
19006
- var ListConversationsResponse = external_exports.object({
19007
- conversations: external_exports.array(ConversationProjection).max(CONVERSATION_LIST_LIMIT),
19008
- nextCursor: external_exports.string().nullable()
19009
- }).strict();
19010
- var ManagerTaskRailSummariesRequest = external_exports.object({
19011
- conversationIds: external_exports.array(ConversationId).min(1).max(CONVERSATION_LIST_LIMIT),
19012
- archived: external_exports.boolean(),
19013
- agentId: AgentId.optional(),
19014
- statuses: external_exports.array(TaskStatus).min(1).max(TaskStatus.options.length).optional()
19015
- }).strict().superRefine((value, ctx) => {
19016
- if (new Set(value.conversationIds).size !== value.conversationIds.length) {
19017
- ctx.addIssue({
19018
- code: "custom",
19019
- path: ["conversationIds"],
19020
- message: "conversationIds must be unique"
19021
- });
19022
- }
19023
- if (value.statuses && new Set(value.statuses).size !== value.statuses.length) {
19024
- ctx.addIssue({
19025
- code: "custom",
19026
- path: ["statuses"],
19027
- message: "statuses must be unique"
19028
- });
19029
- }
19030
- });
19031
- var ManagerTaskRailRepresentative = external_exports.object({
19032
- id: TaskId,
19033
- agentId: AgentId,
19034
- status: TaskStatus,
19035
- gitSummary: TaskGitSummary.nullable(),
19036
- createdAt: external_exports.string(),
19037
- updatedAt: external_exports.string()
19038
- }).strict();
19039
- var ManagerTaskRailSummary = external_exports.object({
19040
- conversationId: ConversationId,
19041
- hasChildren: external_exports.boolean(),
19042
- hasAgentMatch: external_exports.boolean(),
19043
- hasStatusMatch: external_exports.boolean(),
19044
- representative: ManagerTaskRailRepresentative.nullable()
19045
- }).strict();
19046
- var ManagerTaskRailSummariesResponse = external_exports.object({ summaries: external_exports.array(ManagerTaskRailSummary).max(CONVERSATION_LIST_LIMIT) }).strict();
19047
- var ConversationDetailResponse = external_exports.object({
19048
- conversation: ConversationProjection,
19049
- events: external_exports.array(ConversationEventProjection)
19050
- }).strict();
19051
- var ManagerStreamFrame = external_exports.discriminatedUnion("type", [
19052
- external_exports.object({ type: external_exports.literal("event"), event: ConversationEventProjection }).strict(),
19053
- external_exports.object({ type: external_exports.literal("delta"), text: external_exports.string() }).strict(),
19054
- external_exports.object({ type: external_exports.literal("conversation"), conversation: ConversationProjection }).strict()
19055
- ]);
19056
-
19057
19071
  // ../../packages/contracts/src/voice.ts
19058
19072
  var VOICE_MAX_CALL_MINUTES = 30;
19059
19073
  var VoiceE164Number = external_exports.string().regex(/^\+[1-9]\d{7,14}$/, "must be an international phone number");
@@ -24805,6 +24819,7 @@ async function nextSupervisorEntry(current) {
24805
24819
  }
24806
24820
  async function launchHostSupervisor(options = {}) {
24807
24821
  const platform = options.platform ?? process.platform;
24822
+ const managedLifecycle = options.managedLifecycle ?? true;
24808
24823
  const argv = options.argv ?? process.argv.slice(2);
24809
24824
  const log2 = options.log ?? ((message) => console.error(message));
24810
24825
  let entry = options.entry ?? process.argv[1] ?? "";
@@ -24949,18 +24964,21 @@ async function launchHostSupervisor(options = {}) {
24949
24964
  const onTerm = () => stop("SIGTERM");
24950
24965
  process.on("SIGINT", onInt);
24951
24966
  process.on("SIGTERM", onTerm);
24952
- let stdinIsPipe2 = false;
24953
- try {
24954
- const stat3 = fstatSync(0);
24955
- stdinIsPipe2 = !stat3.isCharacterDevice() && !stat3.isFile() && !process.stdin.isTTY;
24956
- } catch {
24967
+ let stdinIsPipe2 = options.parentStdinIsPipe ?? false;
24968
+ if (options.parentStdinIsPipe === void 0) {
24969
+ try {
24970
+ const stat3 = fstatSync(0);
24971
+ stdinIsPipe2 = !stat3.isCharacterDevice() && !stat3.isFile() && !process.stdin.isTTY;
24972
+ } catch {
24973
+ }
24957
24974
  }
24975
+ const observesParentStdin = managedLifecycle && stdinIsPipe2;
24958
24976
  const onStdinEnd = () => stop("SIGTERM");
24959
24977
  const onStdinError = () => stop("SIGTERM");
24960
24978
  const onStdinData = (chunk) => {
24961
24979
  if (chunk.includes(3)) stop("SIGINT");
24962
24980
  };
24963
- if (stdinIsPipe2) {
24981
+ if (observesParentStdin) {
24964
24982
  process.stdin.on("end", onStdinEnd);
24965
24983
  process.stdin.on("error", onStdinError);
24966
24984
  process.stdin.on("data", onStdinData);
@@ -25086,7 +25104,7 @@ async function launchHostSupervisor(options = {}) {
25086
25104
  if (stopEscalation) clearTimeout(stopEscalation);
25087
25105
  process.off("SIGINT", onInt);
25088
25106
  process.off("SIGTERM", onTerm);
25089
- if (stdinIsPipe2) {
25107
+ if (observesParentStdin) {
25090
25108
  process.stdin.off("end", onStdinEnd);
25091
25109
  process.stdin.off("error", onStdinError);
25092
25110
  process.stdin.off("data", onStdinData);
@@ -36212,6 +36230,7 @@ function runCliProcess(options) {
36212
36230
  let settled = false;
36213
36231
  let terminalResult;
36214
36232
  let forcedResult;
36233
+ let runnerReleased = !options.guardian;
36215
36234
  let resolveChildExited;
36216
36235
  const childExited = new Promise((resolveExited) => {
36217
36236
  resolveChildExited = resolveExited;
@@ -36244,7 +36263,7 @@ function runCliProcess(options) {
36244
36263
  if (settled || forcedResult) return;
36245
36264
  forcedResult = result;
36246
36265
  clearInterval(timer);
36247
- child.stdin?.end();
36266
+ if (runnerReleased) child.stdin?.end();
36248
36267
  void containmentReady.then(async () => {
36249
36268
  if (windowsContainment) {
36250
36269
  await windowsContainment.terminate();
@@ -36427,6 +36446,7 @@ function runCliProcess(options) {
36427
36446
  child.stdin?.write(`${RUNNER_RELEASE_MARKER} ${release.byteLength}
36428
36447
  `);
36429
36448
  child.stdin?.write(release);
36449
+ runnerReleased = true;
36430
36450
  } else {
36431
36451
  }
36432
36452
  if (parser.start) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zixt/host",
3
- "version": "0.0.51",
3
+ "version": "0.0.52",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": "./src/client.ts",