@autohq/cli 0.1.187 → 0.1.196

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -16491,12 +16491,13 @@ var init_connections = __esm({
16491
16491
  });
16492
16492
 
16493
16493
  // ../../packages/schemas/src/github-sync.ts
16494
- var GITHUB_SYNC_AUTO_PATH, GithubSyncRepositoryFullNameSchema, GithubSyncProductionBranchSchema, GithubSyncBindingSchema, GithubSyncBindingCreateRequestSchema, GithubSyncBindingCreateResponseSchema, GithubSyncBindingListResponseSchema, GithubSyncWorkflowInputSchema, GithubSyncWorkflowResultSchema;
16494
+ var GITHUB_SYNC_AUTO_PATH, GithubSyncRepositoryFullNameSchema, GithubSyncProductionBranchSchema, GithubSyncBindingSchema, GithubSyncBindingCreateRequestSchema, GithubSyncBindingCreateResponseSchema, GithubSyncBindingListResponseSchema, GithubSyncTriggerArtifactSchema, GithubSyncWorkflowInputSchema, GithubSyncWorkflowResultSchema;
16495
16495
  var init_github_sync = __esm({
16496
16496
  "../../packages/schemas/src/github-sync.ts"() {
16497
16497
  "use strict";
16498
16498
  init_zod();
16499
16499
  init_ids();
16500
+ init_primitives();
16500
16501
  GITHUB_SYNC_AUTO_PATH = ".auto";
16501
16502
  GithubSyncRepositoryFullNameSchema = external_exports.string().trim().min(1).regex(/^[^/\s]+\/[^/\s]+$/, {
16502
16503
  message: "repository must be in owner/name form"
@@ -16533,6 +16534,11 @@ var init_github_sync = __esm({
16533
16534
  GithubSyncBindingListResponseSchema = external_exports.object({
16534
16535
  bindings: external_exports.array(GithubSyncBindingSchema)
16535
16536
  });
16537
+ GithubSyncTriggerArtifactSchema = external_exports.object({
16538
+ type: external_exports.string().trim().min(1),
16539
+ externalId: external_exports.string().trim().min(1),
16540
+ payload: JsonValueSchema.optional()
16541
+ }).strict();
16536
16542
  GithubSyncWorkflowInputSchema = external_exports.discriminatedUnion("kind", [
16537
16543
  external_exports.object({
16538
16544
  kind: external_exports.literal("pull_request"),
@@ -16548,7 +16554,8 @@ var init_github_sync = __esm({
16548
16554
  pullRequestNumber: external_exports.number().int().positive(),
16549
16555
  headSha: external_exports.string().trim().min(1),
16550
16556
  baseSha: external_exports.string().trim().min(1).optional(),
16551
- baseRef: GithubSyncProductionBranchSchema
16557
+ baseRef: GithubSyncProductionBranchSchema,
16558
+ triggerArtifact: GithubSyncTriggerArtifactSchema.optional()
16552
16559
  }),
16553
16560
  external_exports.object({
16554
16561
  kind: external_exports.literal("push"),
@@ -16564,7 +16571,8 @@ var init_github_sync = __esm({
16564
16571
  ref: external_exports.string().trim().min(1),
16565
16572
  branch: GithubSyncProductionBranchSchema,
16566
16573
  before: external_exports.string().trim().min(1).optional(),
16567
- after: external_exports.string().trim().min(1)
16574
+ after: external_exports.string().trim().min(1),
16575
+ triggerArtifact: GithubSyncTriggerArtifactSchema.optional()
16568
16576
  })
16569
16577
  ]);
16570
16578
  GithubSyncWorkflowResultSchema = external_exports.discriminatedUnion("status", [
@@ -17147,6 +17155,84 @@ var init_trigger_router = __esm({
17147
17155
  });
17148
17156
 
17149
17157
  // ../../packages/schemas/src/agents.ts
17158
+ function refineNoPayloadPrefixedTemplateTokens(value, context) {
17159
+ if (value === void 0) {
17160
+ return;
17161
+ }
17162
+ const offending = new Set(
17163
+ [...value.matchAll(PAYLOAD_PREFIXED_TEMPLATE_TOKEN)].map(
17164
+ (match) => match[0]
17165
+ )
17166
+ );
17167
+ if (offending.size > 0) {
17168
+ context.addIssue({
17169
+ code: external_exports.ZodIssueCode.custom,
17170
+ message: `Template renders against the event payload; drop the "payload." prefix (use "{{github.\u2026}}", not "{{payload.github.\u2026}}"). Offending tokens: ${[...offending].join(", ")}`
17171
+ });
17172
+ }
17173
+ }
17174
+ function templateField(guard) {
17175
+ const field = external_exports.string().trim().min(1).max(2e4).optional();
17176
+ return guard === "authoring" ? field.superRefine(refineNoPayloadPrefixedTemplateTokens) : field;
17177
+ }
17178
+ function triggerSharedFields(guard) {
17179
+ return {
17180
+ message: templateField(guard),
17181
+ checks: TriggerChecksField,
17182
+ routing: TriggerRoutingSchema
17183
+ };
17184
+ }
17185
+ function triggerBaseSchema(guard) {
17186
+ return external_exports.object({
17187
+ event: TriggerEventSchema,
17188
+ ...triggerSharedFields(guard),
17189
+ ...TriggerEventSourceFields
17190
+ }).strict().superRefine((trigger, context) => {
17191
+ validateTriggerChecks(trigger, context, [trigger.event]);
17192
+ });
17193
+ }
17194
+ function triggerDefinitionBaseSchema(guard) {
17195
+ return external_exports.object({
17196
+ event: TriggerEventSchema.optional(),
17197
+ events: TriggerEventsSchema.optional(),
17198
+ ...triggerSharedFields(guard),
17199
+ ...TriggerEventSourceFields
17200
+ }).strict().superRefine((trigger, context) => {
17201
+ if (trigger.event && trigger.events) {
17202
+ context.addIssue({
17203
+ code: external_exports.ZodIssueCode.custom,
17204
+ path: ["events"],
17205
+ message: "Use either event or events, not both"
17206
+ });
17207
+ }
17208
+ if (!trigger.event && !trigger.events) {
17209
+ context.addIssue({
17210
+ code: external_exports.ZodIssueCode.custom,
17211
+ path: ["event"],
17212
+ message: "Trigger requires event or events"
17213
+ });
17214
+ }
17215
+ validateTriggerChecks(
17216
+ trigger,
17217
+ context,
17218
+ trigger.event ? [trigger.event] : trigger.events ?? []
17219
+ );
17220
+ });
17221
+ }
17222
+ function heartbeatTriggerBaseSchema(guard) {
17223
+ return external_exports.object({
17224
+ kind: external_exports.literal("heartbeat"),
17225
+ event: external_exports.never().optional(),
17226
+ connection: external_exports.never().optional(),
17227
+ endpoint: external_exports.never().optional(),
17228
+ auth: external_exports.never().optional(),
17229
+ cron: external_exports.string().trim().min(1).max(512),
17230
+ timezone: external_exports.string().trim().min(1).max(128).default("UTC"),
17231
+ ...triggerSharedFields(guard)
17232
+ }).strict().superRefine((trigger, context) => {
17233
+ validateTriggerChecks(trigger, context, ["heartbeat"]);
17234
+ });
17235
+ }
17150
17236
  function avatarAssetDimensions(bytes) {
17151
17237
  return pngDimensions(bytes) ?? jpegDimensions(bytes);
17152
17238
  }
@@ -17363,7 +17449,7 @@ function isChatMessageEvent(trigger) {
17363
17449
  function hasFilterValue(trigger, path2, expected) {
17364
17450
  return trigger.where?.[path2] === expected;
17365
17451
  }
17366
- var RESOURCE_KIND_AGENT, AGENT_HARNESSES, TriggerFilterScalarSchema, TriggerFilterPathSchema, TriggerFilterClauseSchema, TriggerFilterSchema, TriggerCheckTimeoutSchema, TriggerEventSchema, TriggerEventsSchema, TriggerSharedFields, TriggerEventSourceFields, TriggerBaseSchema, TriggerDefinitionBaseSchema, TriggerSchema, ApplyTriggerSchema, HeartbeatTriggerBaseSchema, HeartbeatTriggerSchema, ApplyHeartbeatTriggerSchema, TriggerDefinitionSchema, ApplyTriggerDefinitionSchema, TriggersSchema, ApplyTriggersSchema, AVATAR_ASSET_EXTENSIONS, MAX_AVATAR_ASSET_BYTES, MIN_AVATAR_ASSET_DIMENSION_PX, MAX_AVATAR_ASSET_DIMENSION_PX, PNG_SIGNATURE, AGENT_IDENTITY_DESCRIPTION_MAX_LENGTH, SHA256_HEX_PATTERN, AgentIdentitySchema, AgentSpecFieldsSchema, AgentSpecSchema, AgentApplySpecSchema, AgentStatusSchema, AgentResourceSchema, AgentApplyRequestSchema, ApplyTriggerReceiptSchema, AgentApplyResponseSchema, AGENT_TELEGRAM_IDENTITY_STATUSES, AgentTelegramIdentityStatusSchema, AgentPresenceIdentitySchema, AgentPresenceResponseSchema, AgentPresenceConnectRequestSchema, AgentPresenceConnectPendingSchema, AgentPresenceConnectResponseSchema, AgentPresenceIconRequestSchema, AgentPresenceIconResponseSchema, AgentPresenceCompleteResponseSchema;
17452
+ var RESOURCE_KIND_AGENT, AGENT_HARNESSES, TriggerFilterScalarSchema, TriggerFilterPathSchema, TriggerFilterClauseSchema, TriggerFilterSchema, TriggerCheckTimeoutSchema, TriggerEventSchema, TriggerEventsSchema, PAYLOAD_PREFIXED_TEMPLATE_TOKEN, TriggerChecksField, TriggerEventSourceFields, TriggerSchema, ApplyTriggerSchema, HeartbeatTriggerSchema, ApplyHeartbeatTriggerSchema, TriggerDefinitionSchema, ApplyTriggerDefinitionSchema, TriggersSchema, ApplyTriggersSchema, AVATAR_ASSET_EXTENSIONS, MAX_AVATAR_ASSET_BYTES, MIN_AVATAR_ASSET_DIMENSION_PX, MAX_AVATAR_ASSET_DIMENSION_PX, PNG_SIGNATURE, AGENT_IDENTITY_DESCRIPTION_MAX_LENGTH, SHA256_HEX_PATTERN, AgentIdentitySchema, AgentSpecFieldsSchema, AgentSpecSchema, AgentApplySpecSchema, AgentStatusSchema, AgentResourceSchema, AgentApplyRequestSchema, ApplyTriggerReceiptSchema, AgentApplyResponseSchema, AGENT_TELEGRAM_IDENTITY_STATUSES, AgentTelegramIdentityStatusSchema, AgentPresenceIdentitySchema, AgentPresenceResponseSchema, AgentPresenceConnectRequestSchema, AgentPresenceConnectPendingSchema, AgentPresenceConnectResponseSchema, AgentPresenceIconRequestSchema, AgentPresenceIconResponseSchema, AgentPresenceCompleteResponseSchema;
17367
17453
  var init_agents = __esm({
17368
17454
  "../../packages/schemas/src/agents.ts"() {
17369
17455
  "use strict";
@@ -17427,29 +17513,26 @@ var init_agents = __esm({
17427
17513
  seen.add(event);
17428
17514
  }
17429
17515
  });
17430
- TriggerSharedFields = {
17431
- message: external_exports.string().trim().min(1).max(2e4).optional(),
17432
- checks: external_exports.array(
17433
- external_exports.object({
17434
- name: ResourceNameSchema,
17435
- displayName: external_exports.string().trim().min(1).max(256),
17436
- description: external_exports.string().trim().min(1).max(65535),
17437
- instructions: external_exports.string().trim().min(1).max(2e4).optional(),
17438
- timeout: TriggerCheckTimeoutSchema.optional(),
17439
- beginTimeout: TriggerCheckTimeoutSchema.optional(),
17440
- completeTimeout: TriggerCheckTimeoutSchema.optional()
17441
- }).strict().superRefine((check2, context) => {
17442
- if (check2.timeout && check2.beginTimeout) {
17443
- context.addIssue({
17444
- code: external_exports.ZodIssueCode.custom,
17445
- path: ["beginTimeout"],
17446
- message: "Use either timeout or beginTimeout for the creation-to-begin timeout, not both"
17447
- });
17448
- }
17449
- })
17450
- ).optional(),
17451
- routing: TriggerRoutingSchema
17452
- };
17516
+ PAYLOAD_PREFIXED_TEMPLATE_TOKEN = /\{\{\s*(payload(?:\.[A-Za-z0-9_.-]+)?)\s*\}\}/g;
17517
+ TriggerChecksField = external_exports.array(
17518
+ external_exports.object({
17519
+ name: ResourceNameSchema,
17520
+ displayName: external_exports.string().trim().min(1).max(256),
17521
+ description: external_exports.string().trim().min(1).max(65535),
17522
+ instructions: external_exports.string().trim().min(1).max(2e4).optional(),
17523
+ timeout: TriggerCheckTimeoutSchema.optional(),
17524
+ beginTimeout: TriggerCheckTimeoutSchema.optional(),
17525
+ completeTimeout: TriggerCheckTimeoutSchema.optional()
17526
+ }).strict().superRefine((check2, context) => {
17527
+ if (check2.timeout && check2.beginTimeout) {
17528
+ context.addIssue({
17529
+ code: external_exports.ZodIssueCode.custom,
17530
+ path: ["beginTimeout"],
17531
+ message: "Use either timeout or beginTimeout for the creation-to-begin timeout, not both"
17532
+ });
17533
+ }
17534
+ })
17535
+ ).optional();
17453
17536
  TriggerEventSourceFields = {
17454
17537
  connection: ConnectionNameSchema.optional(),
17455
17538
  endpoint: external_exports.string().trim().min(1).optional(),
@@ -17467,67 +17550,28 @@ var init_agents = __esm({
17467
17550
  })
17468
17551
  ]).optional()
17469
17552
  };
17470
- TriggerBaseSchema = external_exports.object({
17471
- event: TriggerEventSchema,
17472
- ...TriggerSharedFields,
17473
- ...TriggerEventSourceFields
17474
- }).strict().superRefine((trigger, context) => {
17475
- validateTriggerChecks(trigger, context, [trigger.event]);
17476
- });
17477
- TriggerDefinitionBaseSchema = external_exports.object({
17478
- event: TriggerEventSchema.optional(),
17479
- events: TriggerEventsSchema.optional(),
17480
- ...TriggerSharedFields,
17481
- ...TriggerEventSourceFields
17482
- }).strict().superRefine((trigger, context) => {
17483
- if (trigger.event && trigger.events) {
17484
- context.addIssue({
17485
- code: external_exports.ZodIssueCode.custom,
17486
- path: ["events"],
17487
- message: "Use either event or events, not both"
17488
- });
17489
- }
17490
- if (!trigger.event && !trigger.events) {
17491
- context.addIssue({
17492
- code: external_exports.ZodIssueCode.custom,
17493
- path: ["event"],
17494
- message: "Trigger requires event or events"
17495
- });
17496
- }
17497
- validateTriggerChecks(
17498
- trigger,
17499
- context,
17500
- trigger.event ? [trigger.event] : trigger.events ?? []
17501
- );
17502
- });
17503
- TriggerSchema = TriggerBaseSchema.extend({
17553
+ TriggerSchema = triggerBaseSchema("stored").extend({
17504
17554
  where: external_exports.record(external_exports.string(), JsonValueSchema).default({})
17505
17555
  });
17506
- ApplyTriggerSchema = TriggerBaseSchema.extend({
17556
+ ApplyTriggerSchema = triggerBaseSchema("authoring").extend({
17507
17557
  where: TriggerFilterSchema
17508
17558
  });
17509
- HeartbeatTriggerBaseSchema = external_exports.object({
17510
- kind: external_exports.literal("heartbeat"),
17511
- event: external_exports.never().optional(),
17512
- connection: external_exports.never().optional(),
17513
- endpoint: external_exports.never().optional(),
17514
- auth: external_exports.never().optional(),
17515
- cron: external_exports.string().trim().min(1).max(512),
17516
- timezone: external_exports.string().trim().min(1).max(128).default("UTC"),
17517
- ...TriggerSharedFields
17518
- }).strict().superRefine((trigger, context) => {
17519
- validateTriggerChecks(trigger, context, ["heartbeat"]);
17520
- });
17521
- HeartbeatTriggerSchema = HeartbeatTriggerBaseSchema.extend({
17559
+ HeartbeatTriggerSchema = heartbeatTriggerBaseSchema(
17560
+ "stored"
17561
+ ).extend({
17522
17562
  where: external_exports.record(external_exports.string(), JsonValueSchema).default({})
17523
17563
  });
17524
- ApplyHeartbeatTriggerSchema = HeartbeatTriggerBaseSchema.extend({
17564
+ ApplyHeartbeatTriggerSchema = heartbeatTriggerBaseSchema(
17565
+ "authoring"
17566
+ ).extend({
17525
17567
  where: TriggerFilterSchema
17526
17568
  });
17527
- TriggerDefinitionSchema = TriggerDefinitionBaseSchema.extend({
17569
+ TriggerDefinitionSchema = triggerDefinitionBaseSchema("stored").extend({
17528
17570
  where: external_exports.record(external_exports.string(), JsonValueSchema).default({})
17529
17571
  });
17530
- ApplyTriggerDefinitionSchema = TriggerDefinitionBaseSchema.extend({
17572
+ ApplyTriggerDefinitionSchema = triggerDefinitionBaseSchema(
17573
+ "authoring"
17574
+ ).extend({
17531
17575
  where: TriggerFilterSchema
17532
17576
  });
17533
17577
  TriggersSchema = external_exports.array(external_exports.union([TriggerDefinitionSchema, HeartbeatTriggerSchema])).transform(expandTriggerDefinitions).superRefine(validateAttributedRunsTriggerPairing);
@@ -17565,7 +17609,7 @@ var init_agents = __esm({
17565
17609
  systemPrompt: external_exports.string().trim().min(1).max(1e5).optional(),
17566
17610
  environment: ResourceNameSchema.optional(),
17567
17611
  identity: external_exports.union([ResourceNameSchema, AgentIdentitySchema]).optional(),
17568
- initialPrompt: external_exports.string().trim().min(1).max(2e4).optional(),
17612
+ initialPrompt: templateField("stored"),
17569
17613
  env: SecretEnvSchema.default({}),
17570
17614
  mounts: external_exports.array(AgentMountSchema).default([]),
17571
17615
  triggers: TriggersSchema.default([]),
@@ -17576,6 +17620,7 @@ var init_agents = __esm({
17576
17620
  validateRunnableConfig
17577
17621
  );
17578
17622
  AgentApplySpecSchema = AgentSpecFieldsSchema.extend({
17623
+ initialPrompt: templateField("authoring"),
17579
17624
  triggers: ApplyTriggersSchema.default([])
17580
17625
  }).superRefine(validateRunnableConfig);
17581
17626
  AgentStatusSchema = external_exports.object({
@@ -17888,7 +17933,7 @@ var init_project_service_accounts = __esm({
17888
17933
  function projectApplyBundleStorageKey(sha256) {
17889
17934
  return `project-apply-bundles/${sha256}.json`;
17890
17935
  }
17891
- var EnvironmentApplyDocumentSchema, IdentityApplyDocumentSchema, AgentApplyDocumentSchema, ProjectApplyResourceSchema, PROJECT_RESOURCE_APPLY_ORDER, PROJECT_RESOURCE_KINDS, PROJECT_APPLY_RESOURCE_KINDS, PROJECT_APPLY_BUNDLE_VERSION, MAX_PROJECT_APPLY_BUNDLE_BYTES, PROJECT_APPLY_BUNDLE_CONTENT_TYPE, ProjectDeleteResourceBaseSchema, ProjectDeleteResourceSchema, AVATAR_ASSET_CONTENT_TYPES, MAX_AVATAR_ASSET_BASE64_LENGTH, ProjectApplyAssetSchema, ProjectApplyAssetsSchema, AvatarAssetUploadResponseSchema, ApplyBundlePathSchema, ProjectApplyBundleFileSchema, ProjectApplyBundleSchema, ProjectApplyBundleRefSchema, ProjectApplyBundleUploadRequestSchema, ProjectApplyBundleUploadResponseSchema, ProjectApplyBundleDirectoryEntrypointSchema, ProjectApplyBundleFileEntrypointSchema, ProjectApplyBundleEntrypointSchema, ProjectApplySourceSchema, ProjectApplySourceRequestSchema, ProjectApplyRequestSchema, ProjectApplySystemConfigSchema, ProjectAppliedResourceSchema, ProjectApplyDiagnosticSchema, ProjectApplyResponsePrunedSchema, ProjectApplyPlanDiffSchema, ProjectApplyResponseSchema, ProjectResourceApplyResultSchema, ProjectResourceApplyAuditActionSchema, ProjectResourceApplyOperationIdSchema, ProjectResourceApplyWorkflowErrorSchema, ProjectResourceApplyWorkflowInputSchema, ProjectResourceApplyWorkflowResultSchema;
17936
+ var EnvironmentApplyDocumentSchema, IdentityApplyDocumentSchema, AgentApplyDocumentSchema, ProjectApplyResourceSchema, PROJECT_RESOURCE_APPLY_ORDER, PROJECT_RESOURCE_KINDS, PROJECT_APPLY_RESOURCE_KINDS, PROJECT_APPLY_BUNDLE_VERSION, MAX_PROJECT_APPLY_BUNDLE_BYTES, PROJECT_APPLY_BUNDLE_CONTENT_TYPE, ProjectDeleteResourceBaseSchema, ProjectDeleteResourceSchema, AVATAR_ASSET_CONTENT_TYPES, MAX_AVATAR_ASSET_BASE64_LENGTH, ProjectApplyAssetSchema, ProjectApplyAssetsSchema, AvatarAssetUploadResponseSchema, ApplyBundlePathSchema, ProjectApplyBundleFileSchema, ProjectApplyBundleSchema, ProjectApplyBundleRefSchema, ProjectApplyBundleUploadRequestSchema, ProjectApplyBundleUploadResponseSchema, ProjectApplyBundleDirectoryEntrypointSchema, ProjectApplyBundleFileEntrypointSchema, ProjectApplyBundleEntrypointSchema, ProjectApplySourceSchema, ProjectApplySourceRequestSchema, ProjectApplyRequestSchema, ProjectApplySystemConfigSchema, ProjectAppliedResourceSchema, ProjectApplyDiagnosticSchema, ProjectApplyResponsePrunedSchema, ProjectApplyPlanDiffSchema, ProjectApplyResponseSchema, ProjectResourceApplyResultSchema, ProjectResourceApplyAuditActionSchema, ProjectResourceApplyOperationIdSchema, ProjectResourceApplyTriggerArtifactSchema, ProjectResourceApplyWorkflowErrorSchema, ProjectResourceApplyWorkflowInputSchema, ProjectResourceApplyWorkflowResultSchema;
17892
17937
  var init_project_resources = __esm({
17893
17938
  "../../packages/schemas/src/project-resources.ts"() {
17894
17939
  "use strict";
@@ -17899,6 +17944,7 @@ var init_project_resources = __esm({
17899
17944
  init_environments();
17900
17945
  init_identities();
17901
17946
  init_ids();
17947
+ init_primitives();
17902
17948
  init_resources();
17903
17949
  init_trigger_router();
17904
17950
  EnvironmentApplyDocumentSchema = resourceApplyDocumentSchema(
@@ -18095,6 +18141,11 @@ var init_project_resources = __esm({
18095
18141
  "github_sync.apply"
18096
18142
  ]);
18097
18143
  ProjectResourceApplyOperationIdSchema = external_exports.string().trim().min(1).max(512);
18144
+ ProjectResourceApplyTriggerArtifactSchema = external_exports.object({
18145
+ type: external_exports.string().trim().min(1),
18146
+ externalId: external_exports.string().trim().min(1),
18147
+ payload: JsonValueSchema.optional()
18148
+ }).strict();
18098
18149
  ProjectResourceApplyWorkflowErrorSchema = external_exports.object({
18099
18150
  name: external_exports.string().trim().min(1),
18100
18151
  message: external_exports.string().trim().min(1)
@@ -18106,7 +18157,8 @@ var init_project_resources = __esm({
18106
18157
  organizationId: OrganizationIdSchema,
18107
18158
  projectId: ProjectIdSchema.nullable().optional(),
18108
18159
  actor: AuthActorSchema,
18109
- auditAction: ProjectResourceApplyAuditActionSchema
18160
+ auditAction: ProjectResourceApplyAuditActionSchema,
18161
+ triggerArtifact: ProjectResourceApplyTriggerArtifactSchema.optional()
18110
18162
  }).superRefine((input, context) => {
18111
18163
  if ((input.request ? 1 : 0) + (input.sourceRequest ? 1 : 0) !== 1) {
18112
18164
  context.addIssue({
@@ -18502,7 +18554,7 @@ var init_session_introspection = __esm({
18502
18554
  });
18503
18555
 
18504
18556
  // ../../packages/schemas/src/session-commands.ts
18505
- var SESSION_COMMAND_KINDS, SESSION_DISPATCH_COMMAND_KINDS, SESSION_PERSISTED_COMMAND_KINDS, SESSION_LIFECYCLE_COMMAND_KINDS, SESSION_COMMAND_STATUSES, SESSION_DISPATCH_COMMAND_STATUSES, SessionCommandKindSchema, SessionPersistedCommandKindSchema, SessionDispatchCommandKindSchema, RunLifecycleCommandKindSchema, SessionCommandStatusSchema, SessionDispatchCommandStatusSchema, SessionCommandSenderSchema, RunMessageCommandPayloadSchema, RunAnswerCommandPayloadSchema, RunLifecycleCommandPayloadSchema, SessionCommandPayloadSchema, CreateRunMessageCommandRequestSchema, CreateRunAnswerCommandRequestSchema, CreateRunLifecycleCommandRequestSchema, CreateSessionCommandRequestSchema, RunResolutionPolicySchema, AgentAddressedCommandTargetSchema, SessionCommandRecordBaseSchema, RunStartCommandPayloadSchema, RunStartWithMessageCommandPayloadSchema, SessionPersistedCommandPayloadSchema, SessionCommandRecordSchema, SessionDispatchMessageCommandPayloadSchema, SessionDispatchAnswerCommandPayloadSchema, SessionDispatchStopCommandPayloadSchema, SessionDispatchCommandPayloadSchema, SessionDispatchCommandRecordBaseSchema, SessionDispatchCommandRecordSchema;
18557
+ var SESSION_COMMAND_KINDS, SESSION_DISPATCH_COMMAND_KINDS, SESSION_PERSISTED_COMMAND_KINDS, SESSION_LIFECYCLE_COMMAND_KINDS, SESSION_COMMAND_STATUSES, SESSION_DISPATCH_COMMAND_STATUSES, SessionCommandKindSchema, SessionPersistedCommandKindSchema, SessionDispatchCommandKindSchema, RunLifecycleCommandKindSchema, SessionCommandStatusSchema, SessionDispatchCommandStatusSchema, SessionCommandSenderSchema, MESSAGE_DELIVERY_MODES, MessageDeliveryModeSchema, TRIGGER_INJECTION_MODALITIES, TriggerInjectionModalitySchema, RunMessageCommandPayloadSchema, RunAnswerCommandPayloadSchema, RunLifecycleCommandPayloadSchema, SessionCommandPayloadSchema, CreateRunMessageCommandRequestSchema, CreateRunAnswerCommandRequestSchema, CreateRunLifecycleCommandRequestSchema, CreateSessionCommandRequestSchema, RunResolutionPolicySchema, AgentAddressedCommandTargetSchema, SessionCommandRecordBaseSchema, RunStartCommandPayloadSchema, RunStartWithMessageCommandPayloadSchema, SessionPersistedCommandPayloadSchema, SessionCommandRecordSchema, SessionDispatchMessageCommandPayloadSchema, SessionDispatchAnswerCommandPayloadSchema, SessionDispatchStopCommandPayloadSchema, SessionDispatchCommandPayloadSchema, SessionDispatchCommandRecordBaseSchema, SessionDispatchCommandRecordSchema;
18506
18558
  var init_session_commands = __esm({
18507
18559
  "../../packages/schemas/src/session-commands.ts"() {
18508
18560
  "use strict";
@@ -18584,8 +18636,27 @@ var init_session_commands = __esm({
18584
18636
  type: external_exports.literal("system")
18585
18637
  })
18586
18638
  ]);
18639
+ MESSAGE_DELIVERY_MODES = ["interrupt", "deferred"];
18640
+ MessageDeliveryModeSchema = external_exports.enum(MESSAGE_DELIVERY_MODES);
18641
+ TRIGGER_INJECTION_MODALITIES = [
18642
+ "chat",
18643
+ "githubCheck",
18644
+ "githubCheckAction",
18645
+ "githubPullRequest",
18646
+ "other"
18647
+ ];
18648
+ TriggerInjectionModalitySchema = external_exports.enum(
18649
+ TRIGGER_INJECTION_MODALITIES
18650
+ );
18587
18651
  RunMessageCommandPayloadSchema = external_exports.object({
18588
18652
  message: external_exports.string().trim().min(1),
18653
+ // Optional so existing payloads and direct operator/agent messages stay
18654
+ // valid without it; trigger routing sets "deferred" for GitHub check
18655
+ // events. An absent mode is treated as "interrupt" at the delivery
18656
+ // boundary (commandDeliveryPayload / the runtime handler), so the default
18657
+ // lives where the value is consumed rather than as a required field every
18658
+ // call site must construct.
18659
+ deliveryMode: MessageDeliveryModeSchema.optional(),
18589
18660
  metadata: JsonValueSchema.optional()
18590
18661
  }).strict();
18591
18662
  RunAnswerCommandPayloadSchema = external_exports.object({
@@ -21194,6 +21265,7 @@ function renderOAuthLoopbackPage(input) {
21194
21265
  ).join("");
21195
21266
  const hasDetails = detailRows.length > 0;
21196
21267
  const statusLabel = input.status === "success" ? "Authorization received" : "Authorization failed";
21268
+ const badge = input.eyebrow ?? statusLabel;
21197
21269
  return `<!doctype html>
21198
21270
  <html lang="en">
21199
21271
  <head>
@@ -21202,151 +21274,251 @@ function renderOAuthLoopbackPage(input) {
21202
21274
  <title>${escapeHtml(input.title)} | Auto</title>
21203
21275
  <style>
21204
21276
  :root {
21205
- color-scheme: light dark;
21206
- font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
21207
- background: #f6f7f2;
21208
- color: #171814;
21277
+ color-scheme: light;
21278
+ --ease-out-strong: cubic-bezier(0.23, 1, 0.32, 1);
21279
+ --canvas: #f9f9f6;
21280
+ --ink: #262323;
21281
+ --ink-80: rgba(38, 35, 35, 0.8);
21282
+ --ink-70: rgba(38, 35, 35, 0.7);
21283
+ --ink-43: rgba(38, 35, 35, 0.43);
21284
+ --surface: #ffffff;
21285
+ --surface-muted: #f8f8f7;
21286
+ --hairline: #ebebeb;
21287
+ --hairline-strong: #dedede;
21288
+ --text-muted: #656362;
21289
+ --danger: #b42318;
21290
+ --danger-border: rgba(180, 35, 24, 0.3);
21291
+ --danger-surface: rgba(180, 35, 24, 0.05);
21292
+ --success: #297a3a;
21293
+ --success-border: rgba(41, 122, 58, 0.3);
21294
+ --radius-panel: 7px;
21295
+ --radius-pill: 27px;
21296
+ --font-sans: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
21297
+ --font-mono: ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;
21298
+ background: var(--canvas);
21299
+ color: var(--ink);
21300
+ font-family: var(--font-sans);
21209
21301
  }
21210
21302
  * {
21211
21303
  box-sizing: border-box;
21212
21304
  }
21213
21305
  body {
21214
21306
  min-height: 100vh;
21307
+ min-height: 100dvh;
21215
21308
  margin: 0;
21216
- display: grid;
21217
- place-items: center;
21218
- padding: 32px;
21219
- background:
21220
- linear-gradient(135deg, rgba(35, 108, 96, 0.18), transparent 34%),
21221
- linear-gradient(315deg, rgba(194, 90, 62, 0.16), transparent 38%),
21222
- #f6f7f2;
21223
- }
21224
- main {
21225
- width: min(680px, 100%);
21226
- border: 1px solid rgba(23, 24, 20, 0.12);
21227
- border-radius: 8px;
21228
- background: rgba(255, 255, 252, 0.88);
21229
- box-shadow: 0 24px 70px rgba(23, 24, 20, 0.14);
21230
- padding: 32px;
21231
- }
21232
- .mark {
21309
+ background: var(--canvas);
21310
+ color: var(--ink);
21311
+ font-family: var(--font-sans);
21312
+ }
21313
+ .page {
21314
+ min-height: 100vh;
21315
+ min-height: 100dvh;
21316
+ padding: 118px 28px 128px;
21317
+ }
21318
+ .content {
21319
+ display: flex;
21320
+ flex-direction: column;
21321
+ align-items: flex-start;
21322
+ width: min(560px, 100%);
21323
+ margin: 0 auto;
21324
+ animation: riseIn 600ms var(--ease-out-strong) backwards;
21325
+ }
21326
+ .header {
21327
+ display: flex;
21328
+ align-items: center;
21329
+ justify-content: space-between;
21330
+ gap: 24px;
21331
+ width: 100%;
21332
+ margin-bottom: 30px;
21333
+ }
21334
+ .logoLockup {
21233
21335
  display: inline-flex;
21234
21336
  align-items: center;
21235
- gap: 10px;
21236
- margin-bottom: 28px;
21237
- color: #4d554b;
21238
- font-size: 13px;
21239
- font-weight: 700;
21337
+ gap: 4px;
21338
+ color: var(--ink);
21339
+ text-decoration: none;
21340
+ }
21341
+ .logoMark {
21342
+ display: block;
21343
+ width: 54px;
21344
+ height: 54px;
21345
+ transform: translateY(3px);
21346
+ }
21347
+ .wordmark {
21348
+ color: var(--ink);
21349
+ font: 500 50px / 1 var(--font-mono);
21240
21350
  letter-spacing: 0;
21241
- text-transform: uppercase;
21351
+ transform: translateY(-2.4px);
21242
21352
  }
21243
- .dot {
21244
- width: 12px;
21245
- height: 12px;
21246
- border-radius: 999px;
21247
- background: ${input.status === "success" ? "#22863a" : "#b42318"};
21248
- box-shadow: 0 0 0 6px ${input.status === "success" ? "rgba(34, 134, 58, 0.14)" : "rgba(180, 35, 24, 0.14)"};
21353
+ .heading {
21354
+ display: flex;
21355
+ flex-direction: column;
21356
+ align-items: flex-start;
21357
+ margin-bottom: 22px;
21249
21358
  }
21250
- h1 {
21251
- margin: 0;
21252
- max-width: 12ch;
21253
- font-size: 44px;
21254
- line-height: 1;
21359
+ .badge {
21360
+ display: inline-flex;
21361
+ align-items: center;
21362
+ justify-content: center;
21363
+ height: 22px;
21364
+ padding: 0 12px;
21365
+ border: 0.5px solid var(--ink-43);
21366
+ border-radius: var(--radius-pill);
21367
+ background: linear-gradient(
21368
+ to top,
21369
+ var(--surface-muted),
21370
+ var(--surface) 93.3%
21371
+ );
21372
+ color: var(--ink-43);
21373
+ font: 400 12px / 1 var(--font-sans);
21255
21374
  letter-spacing: 0;
21256
21375
  }
21257
- p {
21258
- margin: 18px 0 0;
21259
- max-width: 58ch;
21260
- color: #4d554b;
21261
- font-size: 16px;
21262
- line-height: 1.55;
21376
+ h1 {
21377
+ margin: 16px 0 0;
21378
+ color: var(--ink-80);
21379
+ font: 400 29px / 1.2 var(--font-sans);
21380
+ letter-spacing: 0;
21381
+ text-wrap: balance;
21382
+ }
21383
+ .body {
21384
+ display: flex;
21385
+ flex-direction: column;
21386
+ align-items: flex-start;
21387
+ gap: 20px;
21388
+ width: 100%;
21389
+ }
21390
+ .feedback {
21391
+ display: flex;
21392
+ align-items: flex-start;
21393
+ gap: 10px;
21394
+ width: 100%;
21395
+ margin: 0;
21396
+ padding: 12px 14px;
21397
+ border: 1px solid var(--hairline-strong);
21398
+ border-radius: var(--radius-panel);
21399
+ background: var(--surface);
21400
+ color: var(--ink-70);
21401
+ font: 400 15px / 22px var(--font-sans);
21402
+ }
21403
+ .feedbackIcon {
21404
+ display: flex;
21405
+ flex-shrink: 0;
21406
+ margin-top: 3px;
21407
+ color: var(--ink-43);
21408
+ }
21409
+ .feedback[data-status="success"] {
21410
+ border-color: var(--success-border);
21411
+ color: var(--success);
21412
+ }
21413
+ .feedback[data-status="failure"] {
21414
+ border-color: var(--danger-border);
21415
+ background: var(--danger-surface);
21416
+ color: var(--danger);
21263
21417
  }
21264
21418
  dl {
21265
- display: grid;
21266
- gap: 0;
21267
- margin: 28px 0 0;
21268
- border-block: 1px solid rgba(23, 24, 20, 0.13);
21419
+ width: 100%;
21420
+ margin: 4px 0 0;
21421
+ border-top: 1px solid var(--hairline);
21422
+ border-bottom: 1px solid var(--surface);
21269
21423
  }
21270
21424
  .detail {
21271
21425
  display: grid;
21272
- grid-template-columns: minmax(118px, 0.42fr) 1fr;
21426
+ grid-template-columns: minmax(120px, 0.42fr) minmax(0, 1fr);
21273
21427
  gap: 18px;
21274
- padding: 14px 0;
21275
- border-bottom: 1px solid rgba(23, 24, 20, 0.09);
21276
- }
21277
- .detail:last-child {
21278
- border-bottom: 0;
21428
+ padding: 12px 0;
21429
+ border-top: 1px solid var(--surface);
21430
+ border-bottom: 1px solid var(--hairline);
21279
21431
  }
21280
21432
  dt {
21281
- color: #697066;
21282
- font-size: 13px;
21433
+ color: var(--text-muted);
21434
+ font: 400 13px / 19px var(--font-sans);
21283
21435
  }
21284
21436
  dd {
21285
21437
  margin: 0;
21286
21438
  min-width: 0;
21287
21439
  overflow-wrap: anywhere;
21288
- font-weight: 700;
21440
+ color: var(--ink-80);
21441
+ font: 500 14px / 19px var(--font-sans);
21289
21442
  }
21290
21443
  .footer {
21291
- margin-top: 28px;
21292
- color: #697066;
21293
- font-size: 13px;
21444
+ max-width: 58ch;
21445
+ margin: 0;
21446
+ color: var(--text-muted);
21447
+ font: 400 13px / 19px var(--font-sans);
21294
21448
  }
21295
- @media (max-width: 560px) {
21296
- body {
21297
- padding: 18px;
21298
- }
21299
- main {
21300
- padding: 24px;
21301
- }
21302
- h1 {
21303
- max-width: none;
21304
- font-size: 34px;
21305
- }
21306
- .detail {
21307
- grid-template-columns: 1fr;
21308
- gap: 4px;
21449
+ @keyframes riseIn {
21450
+ from {
21451
+ opacity: 0;
21452
+ transform: translateY(12px);
21309
21453
  }
21310
21454
  }
21311
- @media (prefers-color-scheme: dark) {
21312
- :root {
21313
- background: #10120f;
21314
- color: #f2f4ec;
21455
+ @media (prefers-reduced-motion: reduce) {
21456
+ .content {
21457
+ animation-name: fadeOnly;
21458
+ animation-duration: 300ms;
21459
+ animation-timing-function: ease;
21315
21460
  }
21316
- body {
21317
- background:
21318
- linear-gradient(135deg, rgba(70, 165, 148, 0.2), transparent 34%),
21319
- linear-gradient(315deg, rgba(222, 116, 82, 0.16), transparent 38%),
21320
- #10120f;
21461
+ }
21462
+ @keyframes fadeOnly {
21463
+ from {
21464
+ opacity: 0;
21321
21465
  }
21322
- main {
21323
- border-color: rgba(242, 244, 236, 0.13);
21324
- background: rgba(24, 27, 22, 0.9);
21325
- box-shadow: 0 24px 70px rgba(0, 0, 0, 0.4);
21466
+ }
21467
+ @media (max-width: 640px) {
21468
+ .page {
21469
+ padding: 78px 24px 96px;
21326
21470
  }
21327
- p, dt, .mark, .footer {
21328
- color: #aeb6a8;
21471
+ .header {
21472
+ margin-bottom: 28px;
21329
21473
  }
21330
- dl {
21331
- border-color: rgba(242, 244, 236, 0.14);
21474
+ h1 {
21475
+ font-size: 26px;
21332
21476
  }
21333
21477
  .detail {
21334
- border-bottom-color: rgba(242, 244, 236, 0.09);
21478
+ grid-template-columns: 1fr;
21479
+ gap: 4px;
21335
21480
  }
21336
21481
  }
21337
21482
  </style>
21338
21483
  </head>
21339
21484
  <body>
21340
- <main>
21341
- <div class="mark"><span class="dot"></span>${escapeHtml(input.eyebrow ?? statusLabel)}</div>
21342
- <h1>${escapeHtml(input.title)}</h1>
21343
- <p>${escapeHtml(input.message)}</p>
21344
- ${hasDetails ? `<dl>${detailRows}</dl>` : ""}
21345
- <div class="footer">You can close this window and return to Auto.</div>
21346
- </main>
21485
+ <div class="page">
21486
+ <main class="content">
21487
+ <header class="header">
21488
+ <div class="logoLockup" aria-label="Auto">
21489
+ ${AUTO_LOGO_SVG}
21490
+ <span class="wordmark">auto</span>
21491
+ </div>
21492
+ </header>
21493
+ <div class="heading">
21494
+ <span class="badge">${escapeHtml(badge)}</span>
21495
+ <h1>${escapeHtml(input.title)}</h1>
21496
+ </div>
21497
+ <div class="body">
21498
+ <p class="feedback" data-status="${input.status}">
21499
+ <span class="feedbackIcon">${renderStatusIcon(input.status)}</span>
21500
+ <span>${escapeHtml(input.message)}</span>
21501
+ </p>
21502
+ ${hasDetails ? `<dl>${detailRows}</dl>` : ""}
21503
+ <p class="footer">You can close this window and return to Auto.</p>
21504
+ </div>
21505
+ </main>
21506
+ </div>
21347
21507
  </body>
21348
21508
  </html>`;
21349
21509
  }
21510
+ function renderStatusIcon(status) {
21511
+ if (status === "success") {
21512
+ return `<svg width="16" height="16" viewBox="0 0 20 20" fill="none" aria-hidden="true">
21513
+ <path d="M4.167 10.833 8.125 14.79l7.708-9.583" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
21514
+ </svg>`;
21515
+ }
21516
+ return `<svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true">
21517
+ <circle cx="8" cy="8" r="6.75" stroke="currentColor" stroke-width="1.25"/>
21518
+ <path d="M8 7.25v3.5" stroke="currentColor" stroke-width="1.25" stroke-linecap="round"/>
21519
+ <circle cx="8" cy="5.125" r="0.875" fill="currentColor"/>
21520
+ </svg>`;
21521
+ }
21350
21522
  function resolveHtml(html, result) {
21351
21523
  return typeof html === "function" ? html(result) : html;
21352
21524
  }
@@ -21398,11 +21570,50 @@ async function listen(server, port) {
21398
21570
  server.listen(port, "127.0.0.1");
21399
21571
  });
21400
21572
  }
21401
- var DEFAULT_CALLBACK_PORT;
21573
+ var DEFAULT_CALLBACK_PORT, AUTO_LOGO_SVG;
21402
21574
  var init_loopback = __esm({
21403
21575
  "src/lib/oauth/loopback.ts"() {
21404
21576
  "use strict";
21405
21577
  DEFAULT_CALLBACK_PORT = 4670;
21578
+ AUTO_LOGO_SVG = `<svg class="logoMark" width="54" height="54" viewBox="0 0 54 54" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
21579
+ <path d="M7.59195 13.5C7.12791 13.5063 6.75454 13.8839 6.75666 14.348V39.6605C6.76299 40.1182 7.13213 40.4895 7.59195 40.4937H46.409H46.4069C46.8709 40.4958 47.2485 40.1225 47.2548 39.6605V14.348C47.2548 14.1223 47.1662 13.9071 47.008 13.7468C46.8477 13.5886 46.6326 13.5 46.4069 13.5L7.59195 13.5ZM20.2523 15.1812H21.9398V16.8687H23.6273V15.1812H27.0023V16.8687H28.6898V15.1812H33.7523V16.8687H35.4398V15.1812H45.5603V38.8125H32.0648V37.125H30.3773V38.8125H25.3148V37.125H23.6273V38.8125H21.9398V37.125H20.2523V38.8125H18.5648V37.125H20.2523V35.4375H18.5648V33.75H20.2523V32.0625H18.5648V30.375H20.2523V28.6875H18.5648V27H20.2523V25.3125H18.5648V23.625H20.2523V21.9375H18.5648V20.25H20.2523V18.5625H18.5648V16.8686H20.2523V15.1812Z" fill="#0D8CF3"/>
21580
+ <path d="M20.25 16.875H21.9375V18.5625H20.25V16.875Z" fill="#0D8CF3"/>
21581
+ <path d="M20.25 20.25H21.9375V21.9375H20.25V20.25Z" fill="#0D8CF3"/>
21582
+ <path d="M20.25 23.625H21.9375V25.3125H20.25V23.625Z" fill="#0D8CF3"/>
21583
+ <path d="M20.25 27H21.9375V28.6875H20.25V27Z" fill="#0D8CF3"/>
21584
+ <path d="M20.25 30.375H21.9375V32.0625H20.25V30.375Z" fill="#0D8CF3"/>
21585
+ <path d="M20.25 33.75H21.9375V35.4375H20.25V33.75Z" fill="#0D8CF3"/>
21586
+ <path d="M21.9375 21.9375H23.625V23.625H21.9375V21.9375Z" fill="#0D8CF3"/>
21587
+ <path d="M21.9375 28.6875H23.625V30.375H21.9375V28.6875Z" fill="#0D8CF3"/>
21588
+ <path d="M21.9375 35.4375H23.625V37.125H21.9375V35.4375Z" fill="#0D8CF3"/>
21589
+ <path d="M21.9375 18.5625H23.625V20.25H21.9375V18.5625Z" fill="#0D8CF3"/>
21590
+ <path d="M21.9375 25.3125H23.625V27H21.9375V25.3125Z" fill="#0D8CF3"/>
21591
+ <path d="M21.9375 32.0625H23.625V33.75H21.9375V32.0625Z" fill="#0D8CF3"/>
21592
+ <path d="M23.625 16.875H25.3125V18.5625H23.625V16.875Z" fill="#0D8CF3"/>
21593
+ <path d="M23.625 23.625H25.3125V25.3125H23.625V23.625Z" fill="#0D8CF3"/>
21594
+ <path d="M23.625 30.375H25.3125V32.0625H23.625V30.375Z" fill="#0D8CF3"/>
21595
+ <path d="M23.625 20.25H25.3125V21.9375H23.625V20.25Z" fill="#0D8CF3"/>
21596
+ <path d="M23.625 27H25.3125V28.6875H23.625V27Z" fill="#0D8CF3"/>
21597
+ <path d="M23.625 33.75H25.3125V35.4375H23.625V33.75Z" fill="#0D8CF3"/>
21598
+ <path d="M27 18.5625H28.6875V20.25H27V18.5625Z" fill="#0D8CF3"/>
21599
+ <path d="M27 21.9375H28.6875V23.625H27V21.9375Z" fill="#0D8CF3"/>
21600
+ <path d="M27 25.3125H28.6875V27H27V25.3125Z" fill="#0D8CF3"/>
21601
+ <path d="M27 28.6875H28.6875V30.375H27V28.6875Z" fill="#0D8CF3"/>
21602
+ <path d="M27 32.0625H28.6875V33.75H27V32.0625Z" fill="#0D8CF3"/>
21603
+ <path d="M27 35.4375H28.6875V37.125H27V35.4375Z" fill="#0D8CF3"/>
21604
+ <path d="M30.375 16.875H32.0625V18.5625H30.375V16.875Z" fill="#0D8CF3"/>
21605
+ <path d="M30.375 20.25H32.0625V21.9375H30.375V20.25Z" fill="#0D8CF3"/>
21606
+ <path d="M30.375 23.625H32.0625V25.3125H30.375V23.625Z" fill="#0D8CF3"/>
21607
+ <path d="M30.375 27H32.0625V28.6875H30.375V27Z" fill="#0D8CF3"/>
21608
+ <path d="M30.375 30.375H32.0625V32.0625H30.375V30.375Z" fill="#0D8CF3"/>
21609
+ <path d="M30.375 33.75H32.0625V35.4375H30.375V33.75Z" fill="#0D8CF3"/>
21610
+ <path d="M33.75 18.5625H35.4375V20.25H33.75V18.5625Z" fill="#0D8CF3"/>
21611
+ <path d="M33.75 21.9375H35.4375V23.625H33.75V21.9375Z" fill="#0D8CF3"/>
21612
+ <path d="M33.75 25.3125H35.4375V27H33.75V25.3125Z" fill="#0D8CF3"/>
21613
+ <path d="M33.75 28.6875H35.4375V30.375H33.75V28.6875Z" fill="#0D8CF3"/>
21614
+ <path d="M33.75 32.0625H35.4375V33.75H33.75V32.0625Z" fill="#0D8CF3"/>
21615
+ <path d="M33.75 35.4375H35.4375V37.125H33.75V35.4375Z" fill="#0D8CF3"/>
21616
+ </svg>`;
21406
21617
  }
21407
21618
  });
21408
21619
 
@@ -21412,7 +21623,7 @@ var init_package = __esm({
21412
21623
  "package.json"() {
21413
21624
  package_default = {
21414
21625
  name: "@autohq/cli",
21415
- version: "0.1.187",
21626
+ version: "0.1.196",
21416
21627
  license: "SEE LICENSE IN README.md",
21417
21628
  publishConfig: {
21418
21629
  access: "public"
@@ -23932,14 +24143,14 @@ async function login(input) {
23932
24143
  const callback = await createOAuthLoopbackCallback({
23933
24144
  successHtml: () => renderOAuthLoopbackPage({
23934
24145
  status: "success",
23935
- eyebrow: "Auto CLI",
24146
+ eyebrow: "CLI login",
23936
24147
  title: "Login authorized",
23937
24148
  message: "Auto received the browser authorization. The CLI will finish signing you in from your terminal.",
23938
24149
  details: [{ label: "Server", value: serverUrl }]
23939
24150
  }),
23940
24151
  failureHtml: () => renderOAuthLoopbackPage({
23941
24152
  status: "failure",
23942
- eyebrow: "Auto CLI",
24153
+ eyebrow: "CLI login",
23943
24154
  title: "Login failed",
23944
24155
  message: "The browser authorization did not complete. Return to your terminal to retry or inspect the error.",
23945
24156
  details: [{ label: "Server", value: serverUrl }]
@@ -31764,6 +31975,7 @@ function withClaudeStderrDiagnosticsPointer(error51, capturedStderr) {
31764
31975
 
31765
31976
  // src/commands/agent-bridge/harness/claude-code/session.ts
31766
31977
  var CLAUDE_AGENT_STARTUP_TIMEOUT_MS = 3e4;
31978
+ var CLAUDE_INTERRUPT_SETTLE_TIMEOUT_MS = 1e4;
31767
31979
  var CLAUDE_STARTUP_PROFILE_HOOK_EVENTS = [
31768
31980
  "Setup",
31769
31981
  "SessionStart",
@@ -31796,6 +32008,21 @@ var ClaudeAgentBridgeSessionImpl = class {
31796
32008
  activeTurnCount = 0;
31797
32009
  interruptInFlight = null;
31798
32010
  exitReported = false;
32011
+ // Messages delivered in "deferred" mode while a turn is in flight. They are
32012
+ // held here instead of injected mid-turn (which would reject a pending
32013
+ // tool_use) and flushed once the turn ends and the session is idle.
32014
+ deferredMessages = [];
32015
+ // tool_use ids the assistant has emitted whose tool_result has not yet been
32016
+ // observed. A non-empty set means a tool call is in flight, so an immediate
32017
+ // interrupt would append the new user message after an unresolved
32018
+ // stop_reason=tool_use — the invalid transcript that trips Claude Code's
32019
+ // ede_diagnostic and auto-restarts the session (FRA-3049).
32020
+ pendingToolUseIds = /* @__PURE__ */ new Set();
32021
+ // Incremented on every turn-terminal `result`. An interrupt that aborts an
32022
+ // in-flight tool call waits for this to advance before injecting, so the
32023
+ // message lands only once the interrupted turn has settled its tool_use.
32024
+ turnResultCount = 0;
32025
+ turnSettlementWaiters = /* @__PURE__ */ new Set();
31799
32026
  constructor(input) {
31800
32027
  const optionsStartedAt = Date.now();
31801
32028
  this.input = input;
@@ -31838,13 +32065,17 @@ var ClaudeAgentBridgeSessionImpl = class {
31838
32065
  throw error51;
31839
32066
  }
31840
32067
  }
31841
- async sendMessage(message) {
32068
+ async sendMessage(message, options) {
32069
+ const mode = options?.mode ?? "interrupt";
32070
+ if (mode === "deferred" && this.hasInterruptibleTurn()) {
32071
+ this.deferredMessages.push(message);
32072
+ this.input.writeOutput?.(
32073
+ `agent_bridge_claude_message_deferred active_turn_count=${this.activeTurnCount}`
32074
+ );
32075
+ return;
32076
+ }
31842
32077
  await this.interruptActiveTurnBeforeMessage();
31843
- this.inputQueue.push(claudeAgentUserMessage(message));
31844
- this.activeTurnCount += 1;
31845
- void this.ensureRunningQuery().catch((error51) => {
31846
- void this.input.onError(error51);
31847
- });
32078
+ this.enqueueUserMessage(message);
31848
32079
  }
31849
32080
  close() {
31850
32081
  const previousState = this.state;
@@ -31853,6 +32084,14 @@ var ClaudeAgentBridgeSessionImpl = class {
31853
32084
  }
31854
32085
  this.state = { kind: "closed" };
31855
32086
  this.activeTurnCount = 0;
32087
+ this.pendingToolUseIds.clear();
32088
+ this.resolveTurnSettlement(false);
32089
+ if (this.deferredMessages.length > 0) {
32090
+ this.input.writeOutput?.(
32091
+ `agent_bridge_claude_deferred_dropped count=${this.deferredMessages.length} reason=session_closed`
32092
+ );
32093
+ this.deferredMessages.length = 0;
32094
+ }
31856
32095
  this.stderr.flush();
31857
32096
  this.inputQueue.close();
31858
32097
  if (previousState.kind === "started") {
@@ -31935,8 +32174,15 @@ var ClaudeAgentBridgeSessionImpl = class {
31935
32174
  void (async () => {
31936
32175
  try {
31937
32176
  for await (const message of query) {
32177
+ this.trackToolUseLifecycle(message);
31938
32178
  if (isClaudeAgentTurnResult(message)) {
31939
32179
  this.activeTurnCount = Math.max(0, this.activeTurnCount - 1);
32180
+ this.pendingToolUseIds.clear();
32181
+ this.turnResultCount += 1;
32182
+ this.resolveTurnSettlement(true);
32183
+ if (this.activeTurnCount === 0) {
32184
+ this.flushDeferredMessages();
32185
+ }
31940
32186
  }
31941
32187
  const failure = probeClaudeAgentMessage(
31942
32188
  message,
@@ -31960,23 +32206,116 @@ var ClaudeAgentBridgeSessionImpl = class {
31960
32206
  }
31961
32207
  } finally {
31962
32208
  this.activeTurnCount = 0;
32209
+ this.pendingToolUseIds.clear();
32210
+ this.resolveTurnSettlement(false);
31963
32211
  this.state = { kind: "closed" };
31964
32212
  this.reportExit();
31965
32213
  }
31966
32214
  })();
31967
32215
  }
32216
+ // Queue a user message as a fresh turn. Pushing before ensureRunningQuery()
32217
+ // lets injection work while the SDK session is still starting; the queue
32218
+ // drains once the query attaches. Startup failures surface through onError
32219
+ // instead of failing injection.
32220
+ enqueueUserMessage(message) {
32221
+ this.inputQueue.push(claudeAgentUserMessage(message));
32222
+ this.activeTurnCount += 1;
32223
+ void this.ensureRunningQuery().catch((error51) => {
32224
+ void this.input.onError(error51);
32225
+ });
32226
+ }
32227
+ // A turn the SDK is actively running, so a new user message would either
32228
+ // interrupt it or land mid-turn. Startup/idle states have nothing to disturb.
32229
+ hasInterruptibleTurn() {
32230
+ return this.activeTurnCount > 0 && this.state.kind === "running";
32231
+ }
32232
+ // True while the assistant has an emitted tool_use with no matching
32233
+ // tool_result yet — the window where an immediate interrupt would strand an
32234
+ // unresolved stop_reason=tool_use ahead of the injected user message.
32235
+ hasInFlightToolUse() {
32236
+ return this.pendingToolUseIds.size > 0;
32237
+ }
32238
+ // Track tool_use/tool_result pairs as they stream so hasInFlightToolUse()
32239
+ // reflects the live transcript. tool_use opens a call; the matching
32240
+ // tool_result closes it; the turn's terminal result clears any remainder.
32241
+ trackToolUseLifecycle(message) {
32242
+ for (const id of toolUseIds(message)) {
32243
+ this.pendingToolUseIds.add(id);
32244
+ }
32245
+ for (const id of toolResultIds(message)) {
32246
+ this.pendingToolUseIds.delete(id);
32247
+ }
32248
+ }
32249
+ // Resolve once the interrupted turn emits its terminal `result` (turnResultCount
32250
+ // advances past the pre-interrupt baseline), bounded so a tool that never
32251
+ // returns after interrupt cannot wedge delivery. On timeout the caller falls
32252
+ // back to immediate injection rather than hanging or dropping the message.
32253
+ awaitTurnSettlement(baseline, startedAt) {
32254
+ if (this.turnResultCount > baseline) {
32255
+ return Promise.resolve();
32256
+ }
32257
+ return new Promise((resolve4) => {
32258
+ let done = false;
32259
+ const finish = (outcome) => {
32260
+ if (done) {
32261
+ return;
32262
+ }
32263
+ done = true;
32264
+ clearTimeout(timer);
32265
+ this.turnSettlementWaiters.delete(waiter);
32266
+ this.input.writeOutput?.(
32267
+ `agent_bridge_claude_interrupt_settle_${outcome} duration_ms=${Date.now() - startedAt}`
32268
+ );
32269
+ resolve4();
32270
+ };
32271
+ const waiter = (settled) => finish(settled ? "ready" : "aborted");
32272
+ const timer = setTimeout(
32273
+ () => finish("timeout"),
32274
+ CLAUDE_INTERRUPT_SETTLE_TIMEOUT_MS
32275
+ );
32276
+ timer.unref?.();
32277
+ this.turnSettlementWaiters.add(waiter);
32278
+ });
32279
+ }
32280
+ resolveTurnSettlement(settled) {
32281
+ if (this.turnSettlementWaiters.size === 0) {
32282
+ return;
32283
+ }
32284
+ const waiters = [...this.turnSettlementWaiters];
32285
+ this.turnSettlementWaiters.clear();
32286
+ for (const waiter of waiters) {
32287
+ waiter(settled);
32288
+ }
32289
+ }
32290
+ flushDeferredMessages() {
32291
+ if (this.deferredMessages.length === 0) {
32292
+ return;
32293
+ }
32294
+ const pending = this.deferredMessages.splice(0);
32295
+ this.input.writeOutput?.(
32296
+ `agent_bridge_claude_deferred_flush count=${pending.length}`
32297
+ );
32298
+ for (const message of pending) {
32299
+ this.enqueueUserMessage(message);
32300
+ }
32301
+ }
31968
32302
  async interruptActiveTurnBeforeMessage() {
31969
- if (this.activeTurnCount === 0 || this.state.kind !== "running") {
32303
+ if (!this.hasInterruptibleTurn()) {
31970
32304
  return;
31971
32305
  }
31972
32306
  if (this.interruptInFlight) {
31973
32307
  await this.interruptInFlight;
31974
32308
  return;
31975
32309
  }
32310
+ if (this.state.kind !== "running") {
32311
+ return;
32312
+ }
31976
32313
  const query = this.state.query;
32314
+ const hadInFlightToolUse = this.hasInFlightToolUse();
32315
+ const settlementBaseline = this.turnResultCount;
31977
32316
  const startedAt = Date.now();
31978
32317
  this.input.writeOutput?.(
31979
- `agent_bridge_claude_mid_turn_interrupt_started at=${new Date(startedAt).toISOString()}`
32318
+ `agent_bridge_claude_mid_turn_interrupt_started at=${new Date(startedAt).toISOString()} in_flight_tool_use=${hadInFlightToolUse}`
31980
32319
  );
31981
32320
  const interruptPromise = (async () => {
31982
32321
  try {
@@ -31989,6 +32328,9 @@ var ClaudeAgentBridgeSessionImpl = class {
31989
32328
  `agent_bridge_claude_mid_turn_interrupt_failed duration_ms=${Date.now() - startedAt} error=${error51 instanceof Error ? error51.message : String(error51)}`
31990
32329
  );
31991
32330
  }
32331
+ if (hadInFlightToolUse) {
32332
+ await this.awaitTurnSettlement(settlementBaseline, startedAt);
32333
+ }
31992
32334
  })();
31993
32335
  this.interruptInFlight = interruptPromise;
31994
32336
  try {
@@ -32146,6 +32488,30 @@ function claudeAgentUserMessage(message) {
32146
32488
  function isClaudeAgentTurnResult(message) {
32147
32489
  return message.type === "result";
32148
32490
  }
32491
+ function toolUseIds(message) {
32492
+ if (message.type !== "assistant") {
32493
+ return [];
32494
+ }
32495
+ return contentBlocks(message.message.content).flatMap(
32496
+ (block) => block.type === "tool_use" && typeof block.id === "string" ? [block.id] : []
32497
+ );
32498
+ }
32499
+ function toolResultIds(message) {
32500
+ if (message.type !== "user") {
32501
+ return [];
32502
+ }
32503
+ return contentBlocks(message.message.content).flatMap(
32504
+ (block) => block.type === "tool_result" && typeof block.tool_use_id === "string" ? [block.tool_use_id] : []
32505
+ );
32506
+ }
32507
+ function contentBlocks(content) {
32508
+ if (!Array.isArray(content)) {
32509
+ return [];
32510
+ }
32511
+ return content.filter(
32512
+ (block) => typeof block === "object" && block !== null
32513
+ );
32514
+ }
32149
32515
 
32150
32516
  // src/commands/agent-bridge/harness/claude-code/index.ts
32151
32517
  async function runAgentBridgeClaudeCode(options) {
@@ -32249,7 +32615,9 @@ var ClaudeCodeCommandHandler = class {
32249
32615
  }
32250
32616
  }
32251
32617
  });
32252
- await this.ensureAgentSession().sendMessage(message);
32618
+ await this.ensureAgentSession().sendMessage(message, {
32619
+ mode: deliveryMode(delivery)
32620
+ });
32253
32621
  } catch (error51) {
32254
32622
  this.injectedCommands.delete(delivery.commandId);
32255
32623
  return commandAck({
@@ -32495,6 +32863,16 @@ function deliveryMessage(delivery) {
32495
32863
  }
32496
32864
  return null;
32497
32865
  }
32866
+ function deliveryMode(delivery) {
32867
+ const payload = delivery.payload;
32868
+ if (payload && typeof payload === "object" && "deliveryMode" in payload) {
32869
+ const parsed = MessageDeliveryModeSchema.safeParse(payload.deliveryMode);
32870
+ if (parsed.success) {
32871
+ return parsed.data;
32872
+ }
32873
+ }
32874
+ return "interrupt";
32875
+ }
32498
32876
 
32499
32877
  // src/commands/agent-bridge/entrypoint.ts
32500
32878
  async function runAgentBridgeProcess(input) {