@autohq/cli 0.1.397 → 0.1.399

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.
@@ -30819,7 +30819,7 @@ Object.assign(lookup, {
30819
30819
  // package.json
30820
30820
  var package_default = {
30821
30821
  name: "@autohq/cli",
30822
- version: "0.1.397",
30822
+ version: "0.1.399",
30823
30823
  license: "SEE LICENSE IN README.md",
30824
30824
  publishConfig: {
30825
30825
  access: "public"
@@ -31832,6 +31832,12 @@ var ChatAttachmentSchema = external_exports.object({
31832
31832
  name: external_exports.string().trim().min(1).optional(),
31833
31833
  mimeType: external_exports.string().trim().min(1).optional(),
31834
31834
  size: external_exports.number().int().nonnegative().optional(),
31835
+ /**
31836
+ * Provider-internal file id (Slack file `id`). Stable across re-reads; used as
31837
+ * the canonical reference for `chat.attachment_download` when present, since
31838
+ * `url_private` can rotate on Slack-initiated file revisions.
31839
+ */
31840
+ fileId: external_exports.string().trim().min(1).optional(),
31835
31841
  /**
31836
31842
  * Provider file URL. May require provider credentials to fetch (Slack
31837
31843
  * `url_private` needs the installation bot token as a bearer header), so
@@ -31849,6 +31855,71 @@ var ChatHistoryMessageSchema = external_exports.object({
31849
31855
  var ChatHistoryToolOutputSchema = external_exports.object({
31850
31856
  messages: external_exports.array(ChatHistoryMessageSchema)
31851
31857
  });
31858
+ var ChatAttachmentDownloadAllowedMimeTypes = [
31859
+ // Images
31860
+ "image/png",
31861
+ "image/jpeg",
31862
+ "image/gif",
31863
+ "image/webp",
31864
+ // Documents
31865
+ "application/pdf",
31866
+ "text/markdown",
31867
+ "text/plain",
31868
+ // Archives
31869
+ "application/zip",
31870
+ "application/gzip",
31871
+ "application/x-gzip",
31872
+ "application/x-tar",
31873
+ "application/x-compressed-tar",
31874
+ // Video
31875
+ "video/mp4",
31876
+ "video/quicktime",
31877
+ "video/webm"
31878
+ ];
31879
+ var ChatAttachmentDownloadAllowedMimeTypeSchema = external_exports.enum(
31880
+ ChatAttachmentDownloadAllowedMimeTypes
31881
+ );
31882
+ var ChatAttachmentDownloadMaxSizeBytesByType = {
31883
+ // Images and small documents: 20 MB.
31884
+ "image/png": 20 * 1024 * 1024,
31885
+ "image/jpeg": 20 * 1024 * 1024,
31886
+ "image/gif": 20 * 1024 * 1024,
31887
+ "image/webp": 20 * 1024 * 1024,
31888
+ "application/pdf": 20 * 1024 * 1024,
31889
+ "text/markdown": 20 * 1024 * 1024,
31890
+ "text/plain": 20 * 1024 * 1024,
31891
+ // Archives: 100 MB.
31892
+ "application/zip": 100 * 1024 * 1024,
31893
+ "application/gzip": 100 * 1024 * 1024,
31894
+ "application/x-gzip": 100 * 1024 * 1024,
31895
+ "application/x-tar": 100 * 1024 * 1024,
31896
+ "application/x-compressed-tar": 100 * 1024 * 1024,
31897
+ // Video: 200 MB.
31898
+ "video/mp4": 200 * 1024 * 1024,
31899
+ "video/quicktime": 200 * 1024 * 1024,
31900
+ "video/webm": 200 * 1024 * 1024
31901
+ };
31902
+ var ChatAttachmentDownloadMaxSizeBytes = 20 * 1024 * 1024;
31903
+ var ChatAttachmentDownloadToolInputSchema = external_exports.object({
31904
+ target: ChatAddressSchema,
31905
+ /** A message/file ref from `chat.history` or a trigger delivery's Attachment line. */
31906
+ attachment: external_exports.object({
31907
+ /** Provider file id (Slack `file.id`), the stable canonical reference. */
31908
+ fileId: external_exports.string().trim().min(1),
31909
+ mimeType: external_exports.string().trim().min(1),
31910
+ size: external_exports.number().int().nonnegative().optional(),
31911
+ name: external_exports.string().trim().min(1).optional()
31912
+ })
31913
+ });
31914
+ var ChatAttachmentDownloadToolOutputSchema = external_exports.object({
31915
+ /** Short-lived, signed URL the session curls from its sandbox to fetch the bytes. */
31916
+ downloadUrl: external_exports.string().url(),
31917
+ /** When the signed download URL expires (ISO 8601). */
31918
+ expiresAt: external_exports.string().datetime(),
31919
+ mimeType: external_exports.string().trim().min(1),
31920
+ size: external_exports.number().int().nonnegative(),
31921
+ filename: external_exports.string().trim().min(1)
31922
+ });
31852
31923
  var ChatIssueParticipantSchema = external_exports.object({
31853
31924
  id: external_exports.string().trim().min(1),
31854
31925
  name: external_exports.string().trim().min(1).optional(),
@@ -33716,6 +33787,54 @@ var SecretRevealResponseSchema = external_exports.object({
33716
33787
  value: external_exports.string()
33717
33788
  });
33718
33789
 
33790
+ // ../../packages/schemas/src/session-bindings.ts
33791
+ var BINDING_TARGET_TYPES = [
33792
+ "github.pull_request",
33793
+ "github.issue",
33794
+ "slack.thread",
33795
+ "chat.message",
33796
+ "agent.singleton"
33797
+ ];
33798
+ var TRIGGER_BINDING_TARGET_TYPES = [
33799
+ "github.pull_request",
33800
+ "github.issue",
33801
+ "slack.thread",
33802
+ "agent.singleton"
33803
+ ];
33804
+ var SESSION_BINDING_SOURCES = [
33805
+ "trigger_spawn",
33806
+ "agent_tool",
33807
+ "chat_send",
33808
+ "system"
33809
+ ];
33810
+ var SESSION_BINDING_STATUSES = ["active", "released"];
33811
+ var SESSION_BINDING_RELEASE_POLICIES = ["manual", "held"];
33812
+ var SESSION_BINDING_RELEASED_BY = [
33813
+ "agent_tool",
33814
+ "archive",
33815
+ "trigger_release",
33816
+ "operator",
33817
+ "takeover"
33818
+ ];
33819
+ var BindingTargetTypeSchema = external_exports.enum(BINDING_TARGET_TYPES);
33820
+ var TriggerBindingTargetTypeSchema = external_exports.enum(
33821
+ TRIGGER_BINDING_TARGET_TYPES
33822
+ );
33823
+ var SessionBindingSourceSchema = external_exports.enum(SESSION_BINDING_SOURCES);
33824
+ var SessionBindingStatusSchema = external_exports.enum(SESSION_BINDING_STATUSES);
33825
+ var SessionBindingReleasePolicySchema = external_exports.enum(
33826
+ SESSION_BINDING_RELEASE_POLICIES
33827
+ );
33828
+ var SessionBindingReleasedBySchema = external_exports.enum(
33829
+ SESSION_BINDING_RELEASED_BY
33830
+ );
33831
+ var BindingTargetSchema = external_exports.object({
33832
+ type: BindingTargetTypeSchema,
33833
+ externalId: external_exports.string().min(1)
33834
+ });
33835
+ var BINDING_AUTO_BIND_VALUES = ["onAttributedEvent"];
33836
+ var BindingAutoBindSchema = external_exports.enum(BINDING_AUTO_BIND_VALUES);
33837
+
33719
33838
  // ../../packages/schemas/src/tools.ts
33720
33839
  var REMOTE_MCP_TRANSPORTS = ["streamable_http"];
33721
33840
  var LOCAL_TOOL_IMPLEMENTATIONS = ["auto", "chat", "ping"];
@@ -33887,38 +34006,6 @@ var InlineAgentToolSchema = RemoteMcpToolSchema.extend({
33887
34006
  var AgentToolRefSchema = InlineAgentToolSchema;
33888
34007
  var AgentToolsSchema = external_exports.record(ToolAliasSchema, AgentToolRefSchema);
33889
34008
 
33890
- // ../../packages/schemas/src/session-bindings.ts
33891
- var BINDING_TARGET_TYPES = [
33892
- "github.pull_request",
33893
- "github.issue",
33894
- "slack.thread",
33895
- "chat.message",
33896
- "agent.singleton"
33897
- ];
33898
- var TRIGGER_BINDING_TARGET_TYPES = [
33899
- "github.pull_request",
33900
- "github.issue",
33901
- "slack.thread",
33902
- "agent.singleton"
33903
- ];
33904
- var SESSION_BINDING_SOURCES = [
33905
- "trigger_spawn",
33906
- "agent_tool",
33907
- "chat_send",
33908
- "system"
33909
- ];
33910
- var SESSION_BINDING_STATUSES = ["active", "released"];
33911
- var BindingTargetTypeSchema = external_exports.enum(BINDING_TARGET_TYPES);
33912
- var TriggerBindingTargetTypeSchema = external_exports.enum(
33913
- TRIGGER_BINDING_TARGET_TYPES
33914
- );
33915
- var SessionBindingSourceSchema = external_exports.enum(SESSION_BINDING_SOURCES);
33916
- var SessionBindingStatusSchema = external_exports.enum(SESSION_BINDING_STATUSES);
33917
- var BindingTargetSchema = external_exports.object({
33918
- type: BindingTargetTypeSchema,
33919
- externalId: external_exports.string().min(1)
33920
- });
33921
-
33922
34009
  // ../../packages/schemas/src/trigger-router.ts
33923
34010
  var CANONICAL_ROUTE_BY_KINDS = [
33924
34011
  "allLiveSessions",
@@ -34406,6 +34493,31 @@ var AgentIdentitySchema = external_exports.object({
34406
34493
  }).strict().refine((identity) => Object.keys(identity).length > 0, {
34407
34494
  message: "Identity requires at least one field"
34408
34495
  });
34496
+ var BINDING_LIFECYCLE_VALUES = ["manual", "held"];
34497
+ var BindingLifecycleSpecSchema = external_exports.object({
34498
+ lifecycle: external_exports.enum(BINDING_LIFECYCLE_VALUES).default("manual"),
34499
+ bind: BindingAutoBindSchema.optional()
34500
+ }).strict();
34501
+ var AgentBindingsSchema = external_exports.record(external_exports.string(), BindingLifecycleSpecSchema).superRefine((bindings, context) => {
34502
+ for (const key of Object.keys(bindings)) {
34503
+ const parsed = BindingTargetTypeSchema.safeParse(key);
34504
+ if (!parsed.success) {
34505
+ context.addIssue({
34506
+ code: external_exports.ZodIssueCode.custom,
34507
+ path: [key],
34508
+ message: `\`${key}\` is not a valid binding target type`
34509
+ });
34510
+ continue;
34511
+ }
34512
+ if (parsed.data === "agent.singleton") {
34513
+ context.addIssue({
34514
+ code: external_exports.ZodIssueCode.custom,
34515
+ path: [key],
34516
+ message: "`agent.singleton` is excluded from `bindings` constraints; the pool slot has its own release lifecycle"
34517
+ });
34518
+ }
34519
+ }
34520
+ });
34409
34521
  var AgentSpecFieldsSchema = external_exports.object({
34410
34522
  harness: external_exports.enum(AGENT_HARNESSES).optional(),
34411
34523
  model: AgentModelSelectionSchema.optional(),
@@ -34423,6 +34535,7 @@ var AgentSpecFieldsSchema = external_exports.object({
34423
34535
  replace: AgentReplacePolicySchema.optional(),
34424
34536
  onReplace: external_exports.string().trim().min(1).max(2e4).optional(),
34425
34537
  manages: AgentManagesSchema.optional(),
34538
+ bindings: AgentBindingsSchema.default({}),
34426
34539
  workingDirectory: external_exports.string().trim().min(1).optional(),
34427
34540
  tools: AgentToolsSchema.default({})
34428
34541
  });
@@ -34456,6 +34569,7 @@ var AgentApplySpecSchema = AgentSpecFieldsSchema.extend({
34456
34569
  validateRunnableConfig(spec, context);
34457
34570
  validateAgentModelFieldsForHarness(spec, context);
34458
34571
  validateConcurrencyConfig(spec, context);
34572
+ validateBindingsConfig(spec, context);
34459
34573
  validateTriggerReleaseConfig(spec, context);
34460
34574
  });
34461
34575
  function validateConcurrencyConfig(spec, context) {
@@ -34495,6 +34609,35 @@ function validateConcurrencyConfig(spec, context) {
34495
34609
  function isSlotDeliveryTrigger(trigger) {
34496
34610
  return trigger.routing.kind === "deliver" && !trigger.routing.routeBy;
34497
34611
  }
34612
+ function validateBindingsConfig(spec, context) {
34613
+ if (!spec.bindings) {
34614
+ return;
34615
+ }
34616
+ const heldTargets = new Set(
34617
+ Object.entries(spec.bindings).filter(([, config2]) => config2.lifecycle === "held").map(([target]) => target)
34618
+ );
34619
+ if (heldTargets.size === 0) {
34620
+ return;
34621
+ }
34622
+ const releaseTargets = /* @__PURE__ */ new Set();
34623
+ for (const trigger of spec.triggers) {
34624
+ if (trigger.routing.kind !== "bind") {
34625
+ continue;
34626
+ }
34627
+ if (trigger.routing.release) {
34628
+ releaseTargets.add(trigger.routing.target);
34629
+ }
34630
+ }
34631
+ for (const target of heldTargets) {
34632
+ if (!releaseTargets.has(target)) {
34633
+ context.addIssue({
34634
+ code: external_exports.ZodIssueCode.custom,
34635
+ path: ["bindings", target, "lifecycle"],
34636
+ message: `\`lifecycle: held\` requires at least one bind-routed trigger on "${target}" with \`release: true\` so the platform can release it`
34637
+ });
34638
+ }
34639
+ }
34640
+ }
34498
34641
  function validateTriggerReleaseConfig(spec, context) {
34499
34642
  for (const [index, trigger] of spec.triggers.entries()) {
34500
34643
  if (trigger.routing.kind !== "bind") {
@@ -35582,6 +35725,10 @@ var OrganizationBillingSettingsSchema = external_exports.object({
35582
35725
  // amount. Both must be set for auto-top-up to arm.
35583
35726
  autoTopUpThresholdUsd: NonNegativeUsdSchema.nullable(),
35584
35727
  autoTopUpAmountUsd: PositiveUsdSchema.nullable(),
35728
+ // System-managed pause marker: set by the circuit breaker when the org's
35729
+ // balance drops below its reserve, cleared by the credit-event resume hook.
35730
+ // Never set by the settings PATCH (the request schema is strict without it).
35731
+ billingPausedAt: external_exports.string().datetime().nullable(),
35585
35732
  // Stripe linkage, set by the payment flow (never by the settings PATCH):
35586
35733
  // the org's Stripe customer, and the saved card auto-top-up charges
35587
35734
  // off-session. A non-null payment method is what "card on file" means.
@@ -36239,6 +36386,8 @@ var RunBindingRecordSchema = external_exports.object({
36239
36386
  externalId: external_exports.string(),
36240
36387
  source: SessionBindingSourceSchema,
36241
36388
  status: SessionBindingStatusSchema,
36389
+ releasePolicy: SessionBindingReleasePolicySchema,
36390
+ releasedBy: SessionBindingReleasedBySchema.nullable(),
36242
36391
  payload: JsonValueSchema2.nullable(),
36243
36392
  createdAt: external_exports.string().datetime(),
36244
36393
  updatedAt: external_exports.string().datetime()
@@ -36374,9 +36523,12 @@ var RunSummarySchema = external_exports.object({
36374
36523
 
36375
36524
  // ../../packages/schemas/src/session-parks.ts
36376
36525
  var BILLING_SESSION_PARK_TTL_MS = 7 * 24 * 60 * 60 * 1e3;
36526
+ var PROVIDER_OUTAGE_SESSION_PARK_TTL_MS = 6 * 60 * 60 * 1e3;
36527
+ var PROVIDER_OUTAGE_SESSION_PARK_REPROBE_MS = 5 * 6e4;
36377
36528
  var SESSION_PARK_REASON_KINDS = [
36378
36529
  "billing_insufficient_credits",
36379
- "billing_spending_limit_exceeded"
36530
+ "billing_spending_limit_exceeded",
36531
+ "provider_outage"
36380
36532
  ];
36381
36533
  var SESSION_PARK_RESUME_CONDITIONS = [
36382
36534
  "organization_credits_added",
package/dist/index.js CHANGED
@@ -15538,7 +15538,7 @@ var init_auth = __esm({
15538
15538
  });
15539
15539
 
15540
15540
  // ../../packages/schemas/src/chat.ts
15541
- var ChatMessageKindSchema, ChatMessageRefSchema, ChatToolBindingSchema, ChatMessageEventPayloadSchema, ChatReactionEventPayloadSchema, ChatMessageContentSchema, ChatThreadSelectorSchema, SlackChatDestinationSchema, LinearChatDestinationSchema, TelegramChatDestinationSchema, ChatDestinationSchema, SlackChatRecipientSchema, LinearChatRecipientSchema, TelegramChatRecipientSchema, ChatRecipientSchema, SlackChatAddressSchema, LinearChatAddressSchema, TelegramChatAddressSchema, ChatAddressSchema, ChatToolDefaultsSchema, ChatSendToolInputSchema, ChatSendToolOutputSchema, ChatHistoryToolInputSchema, ChatAttachmentSchema, ChatHistoryMessageSchema, ChatHistoryToolOutputSchema, ChatIssueParticipantSchema, ChatIssueNamedRefSchema, ChatIssueRefSchema, ChatIssueSchema, ChatIssueGetToolInputSchema, ChatIssueGetToolOutputSchema, ChatIssueUpdateToolInputSchema, ChatIssueUpdateToolOutputSchema, ChatReplyToolInputSchema, ChatReplyToolOutputSchema, ChatReactionToolInputSchema, ChatReactionToolOutputSchema, ChatSearchResultTypeSchema, ChatSearchToolInputSchema, ChatSearchWorkspaceSchema, SlackChatSearchResultSchema, ChatSearchResultSchema, ChatSearchToolOutputSchema;
15541
+ var ChatMessageKindSchema, ChatMessageRefSchema, ChatToolBindingSchema, ChatMessageEventPayloadSchema, ChatReactionEventPayloadSchema, ChatMessageContentSchema, ChatThreadSelectorSchema, SlackChatDestinationSchema, LinearChatDestinationSchema, TelegramChatDestinationSchema, ChatDestinationSchema, SlackChatRecipientSchema, LinearChatRecipientSchema, TelegramChatRecipientSchema, ChatRecipientSchema, SlackChatAddressSchema, LinearChatAddressSchema, TelegramChatAddressSchema, ChatAddressSchema, ChatToolDefaultsSchema, ChatSendToolInputSchema, ChatSendToolOutputSchema, ChatHistoryToolInputSchema, ChatAttachmentSchema, ChatHistoryMessageSchema, ChatHistoryToolOutputSchema, ChatAttachmentDownloadAllowedMimeTypes, ChatAttachmentDownloadAllowedMimeTypeSchema, ChatAttachmentDownloadMaxSizeBytesByType, ChatAttachmentDownloadMaxSizeBytes, ChatAttachmentDownloadToolInputSchema, ChatAttachmentDownloadToolOutputSchema, ChatIssueParticipantSchema, ChatIssueNamedRefSchema, ChatIssueRefSchema, ChatIssueSchema, ChatIssueGetToolInputSchema, ChatIssueGetToolOutputSchema, ChatIssueUpdateToolInputSchema, ChatIssueUpdateToolOutputSchema, ChatReplyToolInputSchema, ChatReplyToolOutputSchema, ChatReactionToolInputSchema, ChatReactionToolOutputSchema, ChatSearchResultTypeSchema, ChatSearchToolInputSchema, ChatSearchWorkspaceSchema, SlackChatSearchResultSchema, ChatSearchResultSchema, ChatSearchToolOutputSchema;
15542
15542
  var init_chat = __esm({
15543
15543
  "../../packages/schemas/src/chat.ts"() {
15544
15544
  "use strict";
@@ -15748,6 +15748,12 @@ var init_chat = __esm({
15748
15748
  name: external_exports.string().trim().min(1).optional(),
15749
15749
  mimeType: external_exports.string().trim().min(1).optional(),
15750
15750
  size: external_exports.number().int().nonnegative().optional(),
15751
+ /**
15752
+ * Provider-internal file id (Slack file `id`). Stable across re-reads; used as
15753
+ * the canonical reference for `chat.attachment_download` when present, since
15754
+ * `url_private` can rotate on Slack-initiated file revisions.
15755
+ */
15756
+ fileId: external_exports.string().trim().min(1).optional(),
15751
15757
  /**
15752
15758
  * Provider file URL. May require provider credentials to fetch (Slack
15753
15759
  * `url_private` needs the installation bot token as a bearer header), so
@@ -15765,6 +15771,71 @@ var init_chat = __esm({
15765
15771
  ChatHistoryToolOutputSchema = external_exports.object({
15766
15772
  messages: external_exports.array(ChatHistoryMessageSchema)
15767
15773
  });
15774
+ ChatAttachmentDownloadAllowedMimeTypes = [
15775
+ // Images
15776
+ "image/png",
15777
+ "image/jpeg",
15778
+ "image/gif",
15779
+ "image/webp",
15780
+ // Documents
15781
+ "application/pdf",
15782
+ "text/markdown",
15783
+ "text/plain",
15784
+ // Archives
15785
+ "application/zip",
15786
+ "application/gzip",
15787
+ "application/x-gzip",
15788
+ "application/x-tar",
15789
+ "application/x-compressed-tar",
15790
+ // Video
15791
+ "video/mp4",
15792
+ "video/quicktime",
15793
+ "video/webm"
15794
+ ];
15795
+ ChatAttachmentDownloadAllowedMimeTypeSchema = external_exports.enum(
15796
+ ChatAttachmentDownloadAllowedMimeTypes
15797
+ );
15798
+ ChatAttachmentDownloadMaxSizeBytesByType = {
15799
+ // Images and small documents: 20 MB.
15800
+ "image/png": 20 * 1024 * 1024,
15801
+ "image/jpeg": 20 * 1024 * 1024,
15802
+ "image/gif": 20 * 1024 * 1024,
15803
+ "image/webp": 20 * 1024 * 1024,
15804
+ "application/pdf": 20 * 1024 * 1024,
15805
+ "text/markdown": 20 * 1024 * 1024,
15806
+ "text/plain": 20 * 1024 * 1024,
15807
+ // Archives: 100 MB.
15808
+ "application/zip": 100 * 1024 * 1024,
15809
+ "application/gzip": 100 * 1024 * 1024,
15810
+ "application/x-gzip": 100 * 1024 * 1024,
15811
+ "application/x-tar": 100 * 1024 * 1024,
15812
+ "application/x-compressed-tar": 100 * 1024 * 1024,
15813
+ // Video: 200 MB.
15814
+ "video/mp4": 200 * 1024 * 1024,
15815
+ "video/quicktime": 200 * 1024 * 1024,
15816
+ "video/webm": 200 * 1024 * 1024
15817
+ };
15818
+ ChatAttachmentDownloadMaxSizeBytes = 20 * 1024 * 1024;
15819
+ ChatAttachmentDownloadToolInputSchema = external_exports.object({
15820
+ target: ChatAddressSchema,
15821
+ /** A message/file ref from `chat.history` or a trigger delivery's Attachment line. */
15822
+ attachment: external_exports.object({
15823
+ /** Provider file id (Slack `file.id`), the stable canonical reference. */
15824
+ fileId: external_exports.string().trim().min(1),
15825
+ mimeType: external_exports.string().trim().min(1),
15826
+ size: external_exports.number().int().nonnegative().optional(),
15827
+ name: external_exports.string().trim().min(1).optional()
15828
+ })
15829
+ });
15830
+ ChatAttachmentDownloadToolOutputSchema = external_exports.object({
15831
+ /** Short-lived, signed URL the session curls from its sandbox to fetch the bytes. */
15832
+ downloadUrl: external_exports.string().url(),
15833
+ /** When the signed download URL expires (ISO 8601). */
15834
+ expiresAt: external_exports.string().datetime(),
15835
+ mimeType: external_exports.string().trim().min(1),
15836
+ size: external_exports.number().int().nonnegative(),
15837
+ filename: external_exports.string().trim().min(1)
15838
+ });
15768
15839
  ChatIssueParticipantSchema = external_exports.object({
15769
15840
  id: external_exports.string().trim().min(1),
15770
15841
  name: external_exports.string().trim().min(1).optional(),
@@ -17823,6 +17894,61 @@ var init_secrets = __esm({
17823
17894
  }
17824
17895
  });
17825
17896
 
17897
+ // ../../packages/schemas/src/session-bindings.ts
17898
+ var BINDING_TARGET_TYPES, TRIGGER_BINDING_TARGET_TYPES, SESSION_BINDING_SOURCES, SESSION_BINDING_STATUSES, SESSION_BINDING_RELEASE_POLICIES, SESSION_BINDING_RELEASED_BY, BindingTargetTypeSchema, TriggerBindingTargetTypeSchema, SessionBindingSourceSchema, SessionBindingStatusSchema, SessionBindingReleasePolicySchema, SessionBindingReleasedBySchema, BindingTargetSchema, BINDING_AUTO_BIND_VALUES, BindingAutoBindSchema;
17899
+ var init_session_bindings = __esm({
17900
+ "../../packages/schemas/src/session-bindings.ts"() {
17901
+ "use strict";
17902
+ init_zod();
17903
+ BINDING_TARGET_TYPES = [
17904
+ "github.pull_request",
17905
+ "github.issue",
17906
+ "slack.thread",
17907
+ "chat.message",
17908
+ "agent.singleton"
17909
+ ];
17910
+ TRIGGER_BINDING_TARGET_TYPES = [
17911
+ "github.pull_request",
17912
+ "github.issue",
17913
+ "slack.thread",
17914
+ "agent.singleton"
17915
+ ];
17916
+ SESSION_BINDING_SOURCES = [
17917
+ "trigger_spawn",
17918
+ "agent_tool",
17919
+ "chat_send",
17920
+ "system"
17921
+ ];
17922
+ SESSION_BINDING_STATUSES = ["active", "released"];
17923
+ SESSION_BINDING_RELEASE_POLICIES = ["manual", "held"];
17924
+ SESSION_BINDING_RELEASED_BY = [
17925
+ "agent_tool",
17926
+ "archive",
17927
+ "trigger_release",
17928
+ "operator",
17929
+ "takeover"
17930
+ ];
17931
+ BindingTargetTypeSchema = external_exports.enum(BINDING_TARGET_TYPES);
17932
+ TriggerBindingTargetTypeSchema = external_exports.enum(
17933
+ TRIGGER_BINDING_TARGET_TYPES
17934
+ );
17935
+ SessionBindingSourceSchema = external_exports.enum(SESSION_BINDING_SOURCES);
17936
+ SessionBindingStatusSchema = external_exports.enum(SESSION_BINDING_STATUSES);
17937
+ SessionBindingReleasePolicySchema = external_exports.enum(
17938
+ SESSION_BINDING_RELEASE_POLICIES
17939
+ );
17940
+ SessionBindingReleasedBySchema = external_exports.enum(
17941
+ SESSION_BINDING_RELEASED_BY
17942
+ );
17943
+ BindingTargetSchema = external_exports.object({
17944
+ type: BindingTargetTypeSchema,
17945
+ externalId: external_exports.string().min(1)
17946
+ });
17947
+ BINDING_AUTO_BIND_VALUES = ["onAttributedEvent"];
17948
+ BindingAutoBindSchema = external_exports.enum(BINDING_AUTO_BIND_VALUES);
17949
+ }
17950
+ });
17951
+
17826
17952
  // ../../packages/schemas/src/tools.ts
17827
17953
  function remoteMcpUrlSchema(input) {
17828
17954
  return external_exports.string().trim().url().refine(
@@ -18005,45 +18131,6 @@ var init_tools = __esm({
18005
18131
  }
18006
18132
  });
18007
18133
 
18008
- // ../../packages/schemas/src/session-bindings.ts
18009
- var BINDING_TARGET_TYPES, TRIGGER_BINDING_TARGET_TYPES, SESSION_BINDING_SOURCES, SESSION_BINDING_STATUSES, BindingTargetTypeSchema, TriggerBindingTargetTypeSchema, SessionBindingSourceSchema, SessionBindingStatusSchema, BindingTargetSchema;
18010
- var init_session_bindings = __esm({
18011
- "../../packages/schemas/src/session-bindings.ts"() {
18012
- "use strict";
18013
- init_zod();
18014
- BINDING_TARGET_TYPES = [
18015
- "github.pull_request",
18016
- "github.issue",
18017
- "slack.thread",
18018
- "chat.message",
18019
- "agent.singleton"
18020
- ];
18021
- TRIGGER_BINDING_TARGET_TYPES = [
18022
- "github.pull_request",
18023
- "github.issue",
18024
- "slack.thread",
18025
- "agent.singleton"
18026
- ];
18027
- SESSION_BINDING_SOURCES = [
18028
- "trigger_spawn",
18029
- "agent_tool",
18030
- "chat_send",
18031
- "system"
18032
- ];
18033
- SESSION_BINDING_STATUSES = ["active", "released"];
18034
- BindingTargetTypeSchema = external_exports.enum(BINDING_TARGET_TYPES);
18035
- TriggerBindingTargetTypeSchema = external_exports.enum(
18036
- TRIGGER_BINDING_TARGET_TYPES
18037
- );
18038
- SessionBindingSourceSchema = external_exports.enum(SESSION_BINDING_SOURCES);
18039
- SessionBindingStatusSchema = external_exports.enum(SESSION_BINDING_STATUSES);
18040
- BindingTargetSchema = external_exports.object({
18041
- type: BindingTargetTypeSchema,
18042
- externalId: external_exports.string().min(1)
18043
- });
18044
- }
18045
- });
18046
-
18047
18134
  // ../../packages/schemas/src/trigger-router.ts
18048
18135
  function normalizeLegacyHeartbeatTickWorkflowInput(input) {
18049
18136
  if (!input || typeof input !== "object" || Array.isArray(input)) {
@@ -18489,6 +18576,35 @@ function validateConcurrencyConfig(spec, context) {
18489
18576
  function isSlotDeliveryTrigger(trigger) {
18490
18577
  return trigger.routing.kind === "deliver" && !trigger.routing.routeBy;
18491
18578
  }
18579
+ function validateBindingsConfig(spec, context) {
18580
+ if (!spec.bindings) {
18581
+ return;
18582
+ }
18583
+ const heldTargets = new Set(
18584
+ Object.entries(spec.bindings).filter(([, config2]) => config2.lifecycle === "held").map(([target]) => target)
18585
+ );
18586
+ if (heldTargets.size === 0) {
18587
+ return;
18588
+ }
18589
+ const releaseTargets = /* @__PURE__ */ new Set();
18590
+ for (const trigger of spec.triggers) {
18591
+ if (trigger.routing.kind !== "bind") {
18592
+ continue;
18593
+ }
18594
+ if (trigger.routing.release) {
18595
+ releaseTargets.add(trigger.routing.target);
18596
+ }
18597
+ }
18598
+ for (const target of heldTargets) {
18599
+ if (!releaseTargets.has(target)) {
18600
+ context.addIssue({
18601
+ code: external_exports.ZodIssueCode.custom,
18602
+ path: ["bindings", target, "lifecycle"],
18603
+ message: `\`lifecycle: held\` requires at least one bind-routed trigger on "${target}" with \`release: true\` so the platform can release it`
18604
+ });
18605
+ }
18606
+ }
18607
+ }
18492
18608
  function validateTriggerReleaseConfig(spec, context) {
18493
18609
  for (const [index, trigger] of spec.triggers.entries()) {
18494
18610
  if (trigger.routing.kind !== "bind") {
@@ -18626,7 +18742,7 @@ function isChatMessageEvent(trigger) {
18626
18742
  function hasFilterValue(trigger, path2, expected) {
18627
18743
  return trigger.where?.[path2] === expected;
18628
18744
  }
18629
- var RESOURCE_KIND_AGENT, AGENT_HARNESSES, AgentHarnessSchema, TriggerFilterScalarSchema, TriggerFilterPathSchema, TriggerFilterClauseSchema, TriggerFilterSchema, TriggerCheckTimeoutSchema, AgentArchiveAfterInactiveSchema, AgentSessionPolicySchema, AgentConcurrencySchema, AgentReplacePolicySchema, AgentManagesSchema, 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;
18745
+ var RESOURCE_KIND_AGENT, AGENT_HARNESSES, AgentHarnessSchema, TriggerFilterScalarSchema, TriggerFilterPathSchema, TriggerFilterClauseSchema, TriggerFilterSchema, TriggerCheckTimeoutSchema, AgentArchiveAfterInactiveSchema, AgentSessionPolicySchema, AgentConcurrencySchema, AgentReplacePolicySchema, AgentManagesSchema, 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, BINDING_LIFECYCLE_VALUES, BindingLifecycleSpecSchema, AgentBindingsSchema, AgentSpecFieldsSchema, AgentSpecSchema, AgentApplySpecSchema, AgentStatusSchema, AgentResourceSchema, AgentApplyRequestSchema, ApplyTriggerReceiptSchema, AgentApplyResponseSchema, AGENT_TELEGRAM_IDENTITY_STATUSES, AgentTelegramIdentityStatusSchema, AgentPresenceIdentitySchema, AgentPresenceResponseSchema, AgentPresenceConnectRequestSchema, AgentPresenceConnectPendingSchema, AgentPresenceConnectResponseSchema, AgentPresenceIconRequestSchema, AgentPresenceIconResponseSchema, AgentPresenceCompleteResponseSchema;
18630
18746
  var init_agents = __esm({
18631
18747
  "../../packages/schemas/src/agents.ts"() {
18632
18748
  "use strict";
@@ -18637,6 +18753,7 @@ var init_agents = __esm({
18637
18753
  init_primitives();
18638
18754
  init_resources();
18639
18755
  init_secrets();
18756
+ init_session_bindings();
18640
18757
  init_tools();
18641
18758
  init_trigger_router();
18642
18759
  RESOURCE_KIND_AGENT = "agent";
@@ -18801,6 +18918,31 @@ var init_agents = __esm({
18801
18918
  }).strict().refine((identity2) => Object.keys(identity2).length > 0, {
18802
18919
  message: "Identity requires at least one field"
18803
18920
  });
18921
+ BINDING_LIFECYCLE_VALUES = ["manual", "held"];
18922
+ BindingLifecycleSpecSchema = external_exports.object({
18923
+ lifecycle: external_exports.enum(BINDING_LIFECYCLE_VALUES).default("manual"),
18924
+ bind: BindingAutoBindSchema.optional()
18925
+ }).strict();
18926
+ AgentBindingsSchema = external_exports.record(external_exports.string(), BindingLifecycleSpecSchema).superRefine((bindings, context) => {
18927
+ for (const key of Object.keys(bindings)) {
18928
+ const parsed = BindingTargetTypeSchema.safeParse(key);
18929
+ if (!parsed.success) {
18930
+ context.addIssue({
18931
+ code: external_exports.ZodIssueCode.custom,
18932
+ path: [key],
18933
+ message: `\`${key}\` is not a valid binding target type`
18934
+ });
18935
+ continue;
18936
+ }
18937
+ if (parsed.data === "agent.singleton") {
18938
+ context.addIssue({
18939
+ code: external_exports.ZodIssueCode.custom,
18940
+ path: [key],
18941
+ message: "`agent.singleton` is excluded from `bindings` constraints; the pool slot has its own release lifecycle"
18942
+ });
18943
+ }
18944
+ }
18945
+ });
18804
18946
  AgentSpecFieldsSchema = external_exports.object({
18805
18947
  harness: external_exports.enum(AGENT_HARNESSES).optional(),
18806
18948
  model: AgentModelSelectionSchema.optional(),
@@ -18818,6 +18960,7 @@ var init_agents = __esm({
18818
18960
  replace: AgentReplacePolicySchema.optional(),
18819
18961
  onReplace: external_exports.string().trim().min(1).max(2e4).optional(),
18820
18962
  manages: AgentManagesSchema.optional(),
18963
+ bindings: AgentBindingsSchema.default({}),
18821
18964
  workingDirectory: external_exports.string().trim().min(1).optional(),
18822
18965
  tools: AgentToolsSchema.default({})
18823
18966
  });
@@ -18835,6 +18978,7 @@ var init_agents = __esm({
18835
18978
  validateRunnableConfig(spec, context);
18836
18979
  validateAgentModelFieldsForHarness(spec, context);
18837
18980
  validateConcurrencyConfig(spec, context);
18981
+ validateBindingsConfig(spec, context);
18838
18982
  validateTriggerReleaseConfig(spec, context);
18839
18983
  });
18840
18984
  AgentStatusSchema = external_exports.object({
@@ -19894,6 +20038,10 @@ var init_billing = __esm({
19894
20038
  // amount. Both must be set for auto-top-up to arm.
19895
20039
  autoTopUpThresholdUsd: NonNegativeUsdSchema.nullable(),
19896
20040
  autoTopUpAmountUsd: PositiveUsdSchema.nullable(),
20041
+ // System-managed pause marker: set by the circuit breaker when the org's
20042
+ // balance drops below its reserve, cleared by the credit-event resume hook.
20043
+ // Never set by the settings PATCH (the request schema is strict without it).
20044
+ billingPausedAt: external_exports.string().datetime().nullable(),
19897
20045
  // Stripe linkage, set by the payment flow (never by the settings PATCH):
19898
20046
  // the org's Stripe customer, and the saved card auto-top-up charges
19899
20047
  // off-session. A non-null payment method is what "card on file" means.
@@ -20636,6 +20784,8 @@ var init_session_introspection = __esm({
20636
20784
  externalId: external_exports.string(),
20637
20785
  source: SessionBindingSourceSchema,
20638
20786
  status: SessionBindingStatusSchema,
20787
+ releasePolicy: SessionBindingReleasePolicySchema,
20788
+ releasedBy: SessionBindingReleasedBySchema.nullable(),
20639
20789
  payload: JsonValueSchema.nullable(),
20640
20790
  createdAt: external_exports.string().datetime(),
20641
20791
  updatedAt: external_exports.string().datetime()
@@ -20772,16 +20922,19 @@ var init_session_introspection = __esm({
20772
20922
  });
20773
20923
 
20774
20924
  // ../../packages/schemas/src/session-parks.ts
20775
- var BILLING_SESSION_PARK_TTL_MS, SESSION_PARK_REASON_KINDS, SESSION_PARK_RESUME_CONDITIONS, SESSION_PARK_RESOLUTIONS, SessionParkReasonKindSchema, SessionParkResumeConditionSchema, SessionParkResolutionSchema, SessionParkRecordSchema;
20925
+ var BILLING_SESSION_PARK_TTL_MS, PROVIDER_OUTAGE_SESSION_PARK_TTL_MS, PROVIDER_OUTAGE_SESSION_PARK_REPROBE_MS, SESSION_PARK_REASON_KINDS, SESSION_PARK_RESUME_CONDITIONS, SESSION_PARK_RESOLUTIONS, SessionParkReasonKindSchema, SessionParkResumeConditionSchema, SessionParkResolutionSchema, SessionParkRecordSchema;
20776
20926
  var init_session_parks = __esm({
20777
20927
  "../../packages/schemas/src/session-parks.ts"() {
20778
20928
  "use strict";
20779
20929
  init_zod();
20780
20930
  init_ids();
20781
20931
  BILLING_SESSION_PARK_TTL_MS = 7 * 24 * 60 * 60 * 1e3;
20932
+ PROVIDER_OUTAGE_SESSION_PARK_TTL_MS = 6 * 60 * 60 * 1e3;
20933
+ PROVIDER_OUTAGE_SESSION_PARK_REPROBE_MS = 5 * 6e4;
20782
20934
  SESSION_PARK_REASON_KINDS = [
20783
20935
  "billing_insufficient_credits",
20784
- "billing_spending_limit_exceeded"
20936
+ "billing_spending_limit_exceeded",
20937
+ "provider_outage"
20785
20938
  ];
20786
20939
  SESSION_PARK_RESUME_CONDITIONS = [
20787
20940
  "organization_credits_added",
@@ -34889,7 +35042,7 @@ var init_package = __esm({
34889
35042
  "package.json"() {
34890
35043
  package_default = {
34891
35044
  name: "@autohq/cli",
34892
- version: "0.1.397",
35045
+ version: "0.1.399",
34893
35046
  license: "SEE LICENSE IN README.md",
34894
35047
  publishConfig: {
34895
35048
  access: "public"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@autohq/cli",
3
- "version": "0.1.397",
3
+ "version": "0.1.399",
4
4
  "license": "SEE LICENSE IN README.md",
5
5
  "publishConfig": {
6
6
  "access": "public"