@autohq/cli 0.1.396 → 0.1.398

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.396",
30822
+ version: "0.1.398",
30823
30823
  license: "SEE LICENSE IN README.md",
30824
30824
  publishConfig: {
30825
30825
  access: "public"
@@ -33716,6 +33716,52 @@ var SecretRevealResponseSchema = external_exports.object({
33716
33716
  value: external_exports.string()
33717
33717
  });
33718
33718
 
33719
+ // ../../packages/schemas/src/session-bindings.ts
33720
+ var BINDING_TARGET_TYPES = [
33721
+ "github.pull_request",
33722
+ "github.issue",
33723
+ "slack.thread",
33724
+ "chat.message",
33725
+ "agent.singleton"
33726
+ ];
33727
+ var TRIGGER_BINDING_TARGET_TYPES = [
33728
+ "github.pull_request",
33729
+ "github.issue",
33730
+ "slack.thread",
33731
+ "agent.singleton"
33732
+ ];
33733
+ var SESSION_BINDING_SOURCES = [
33734
+ "trigger_spawn",
33735
+ "agent_tool",
33736
+ "chat_send",
33737
+ "system"
33738
+ ];
33739
+ var SESSION_BINDING_STATUSES = ["active", "released"];
33740
+ var SESSION_BINDING_RELEASE_POLICIES = ["manual", "held"];
33741
+ var SESSION_BINDING_RELEASED_BY = [
33742
+ "agent_tool",
33743
+ "archive",
33744
+ "trigger_release",
33745
+ "operator",
33746
+ "takeover"
33747
+ ];
33748
+ var BindingTargetTypeSchema = external_exports.enum(BINDING_TARGET_TYPES);
33749
+ var TriggerBindingTargetTypeSchema = external_exports.enum(
33750
+ TRIGGER_BINDING_TARGET_TYPES
33751
+ );
33752
+ var SessionBindingSourceSchema = external_exports.enum(SESSION_BINDING_SOURCES);
33753
+ var SessionBindingStatusSchema = external_exports.enum(SESSION_BINDING_STATUSES);
33754
+ var SessionBindingReleasePolicySchema = external_exports.enum(
33755
+ SESSION_BINDING_RELEASE_POLICIES
33756
+ );
33757
+ var SessionBindingReleasedBySchema = external_exports.enum(
33758
+ SESSION_BINDING_RELEASED_BY
33759
+ );
33760
+ var BindingTargetSchema = external_exports.object({
33761
+ type: BindingTargetTypeSchema,
33762
+ externalId: external_exports.string().min(1)
33763
+ });
33764
+
33719
33765
  // ../../packages/schemas/src/tools.ts
33720
33766
  var REMOTE_MCP_TRANSPORTS = ["streamable_http"];
33721
33767
  var LOCAL_TOOL_IMPLEMENTATIONS = ["auto", "chat", "ping"];
@@ -33887,38 +33933,6 @@ var InlineAgentToolSchema = RemoteMcpToolSchema.extend({
33887
33933
  var AgentToolRefSchema = InlineAgentToolSchema;
33888
33934
  var AgentToolsSchema = external_exports.record(ToolAliasSchema, AgentToolRefSchema);
33889
33935
 
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
33936
  // ../../packages/schemas/src/trigger-router.ts
33923
33937
  var CANONICAL_ROUTE_BY_KINDS = [
33924
33938
  "allLiveSessions",
@@ -33984,7 +33998,15 @@ var CanonicalTriggerRoutingSchema = external_exports.discriminatedUnion("kind",
33984
33998
  external_exports.object({
33985
33999
  kind: external_exports.literal("bind"),
33986
34000
  target: TriggerBindingTargetTypeSchema,
33987
- onUnmatched: OnUnmatchedSchema
34001
+ onUnmatched: OnUnmatchedSchema,
34002
+ // Declarative binding release: after the router routes this event
34003
+ // (delivered, revived, or unmatched), the platform releases the target's
34004
+ // active binding as a follow-up activity. Deliver-then-release — the bound
34005
+ // session receives the message first; the binding is released after
34006
+ // routing completes. No-op when no active binding exists. `agent.singleton`
34007
+ // is rejected at apply time (singleton slots are pool-membership state
34008
+ // owned by the reconciler).
34009
+ release: external_exports.boolean().default(false)
33988
34010
  })
33989
34011
  ]);
33990
34012
  var LegacySingletonRouteBySchema = external_exports.object({
@@ -34011,7 +34033,8 @@ var LegacyOwnedArtifactDeliverRoutingSchema = external_exports.object({
34011
34033
  ({ routeBy, onUnmatched }) => ({
34012
34034
  kind: "bind",
34013
34035
  target: routeBy.artifactType,
34014
- onUnmatched
34036
+ onUnmatched,
34037
+ release: false
34015
34038
  })
34016
34039
  );
34017
34040
  var LegacyDeliverOrSpawnRoutingSchema = external_exports.object({
@@ -34397,6 +34420,30 @@ var AgentIdentitySchema = external_exports.object({
34397
34420
  }).strict().refine((identity) => Object.keys(identity).length > 0, {
34398
34421
  message: "Identity requires at least one field"
34399
34422
  });
34423
+ var BINDING_LIFECYCLE_VALUES = ["manual", "held"];
34424
+ var BindingLifecycleSpecSchema = external_exports.object({
34425
+ lifecycle: external_exports.enum(BINDING_LIFECYCLE_VALUES).default("manual")
34426
+ }).strict();
34427
+ var AgentBindingsSchema = external_exports.record(external_exports.string(), BindingLifecycleSpecSchema).superRefine((bindings, context) => {
34428
+ for (const key of Object.keys(bindings)) {
34429
+ const parsed = BindingTargetTypeSchema.safeParse(key);
34430
+ if (!parsed.success) {
34431
+ context.addIssue({
34432
+ code: external_exports.ZodIssueCode.custom,
34433
+ path: [key],
34434
+ message: `\`${key}\` is not a valid binding target type`
34435
+ });
34436
+ continue;
34437
+ }
34438
+ if (parsed.data === "agent.singleton") {
34439
+ context.addIssue({
34440
+ code: external_exports.ZodIssueCode.custom,
34441
+ path: [key],
34442
+ message: "`agent.singleton` is excluded from `bindings` constraints; the pool slot has its own release lifecycle"
34443
+ });
34444
+ }
34445
+ }
34446
+ });
34400
34447
  var AgentSpecFieldsSchema = external_exports.object({
34401
34448
  harness: external_exports.enum(AGENT_HARNESSES).optional(),
34402
34449
  model: AgentModelSelectionSchema.optional(),
@@ -34414,6 +34461,7 @@ var AgentSpecFieldsSchema = external_exports.object({
34414
34461
  replace: AgentReplacePolicySchema.optional(),
34415
34462
  onReplace: external_exports.string().trim().min(1).max(2e4).optional(),
34416
34463
  manages: AgentManagesSchema.optional(),
34464
+ bindings: AgentBindingsSchema.default({}),
34417
34465
  workingDirectory: external_exports.string().trim().min(1).optional(),
34418
34466
  tools: AgentToolsSchema.default({})
34419
34467
  });
@@ -34447,6 +34495,8 @@ var AgentApplySpecSchema = AgentSpecFieldsSchema.extend({
34447
34495
  validateRunnableConfig(spec, context);
34448
34496
  validateAgentModelFieldsForHarness(spec, context);
34449
34497
  validateConcurrencyConfig(spec, context);
34498
+ validateBindingsConfig(spec, context);
34499
+ validateTriggerReleaseConfig(spec, context);
34450
34500
  });
34451
34501
  function validateConcurrencyConfig(spec, context) {
34452
34502
  if (spec.concurrency === void 0 && spec.replace !== void 0) {
@@ -34485,6 +34535,49 @@ function validateConcurrencyConfig(spec, context) {
34485
34535
  function isSlotDeliveryTrigger(trigger) {
34486
34536
  return trigger.routing.kind === "deliver" && !trigger.routing.routeBy;
34487
34537
  }
34538
+ function validateBindingsConfig(spec, context) {
34539
+ if (!spec.bindings) {
34540
+ return;
34541
+ }
34542
+ const heldTargets = new Set(
34543
+ Object.entries(spec.bindings).filter(([, config2]) => config2.lifecycle === "held").map(([target]) => target)
34544
+ );
34545
+ if (heldTargets.size === 0) {
34546
+ return;
34547
+ }
34548
+ const releaseTargets = /* @__PURE__ */ new Set();
34549
+ for (const trigger of spec.triggers) {
34550
+ if (trigger.routing.kind !== "bind") {
34551
+ continue;
34552
+ }
34553
+ if (trigger.routing.release) {
34554
+ releaseTargets.add(trigger.routing.target);
34555
+ }
34556
+ }
34557
+ for (const target of heldTargets) {
34558
+ if (!releaseTargets.has(target)) {
34559
+ context.addIssue({
34560
+ code: external_exports.ZodIssueCode.custom,
34561
+ path: ["bindings", target, "lifecycle"],
34562
+ message: `\`lifecycle: held\` requires at least one bind-routed trigger on "${target}" with \`release: true\` so the platform can release it`
34563
+ });
34564
+ }
34565
+ }
34566
+ }
34567
+ function validateTriggerReleaseConfig(spec, context) {
34568
+ for (const [index, trigger] of spec.triggers.entries()) {
34569
+ if (trigger.routing.kind !== "bind") {
34570
+ continue;
34571
+ }
34572
+ if (trigger.routing.release && trigger.routing.target === "agent.singleton") {
34573
+ context.addIssue({
34574
+ code: external_exports.ZodIssueCode.custom,
34575
+ path: ["triggers", index, "routing", "release"],
34576
+ message: "`release: true` cannot target `agent.singleton`: singleton slots are pool-membership state owned by the reconciler, not trigger-releasable bindings"
34577
+ });
34578
+ }
34579
+ }
34580
+ }
34488
34581
  var AgentStatusSchema = external_exports.object({
34489
34582
  runCount: external_exports.number().int().nonnegative().default(0),
34490
34583
  lastActivityAt: external_exports.string().datetime().nullable().default(null)
@@ -36215,6 +36308,8 @@ var RunBindingRecordSchema = external_exports.object({
36215
36308
  externalId: external_exports.string(),
36216
36309
  source: SessionBindingSourceSchema,
36217
36310
  status: SessionBindingStatusSchema,
36311
+ releasePolicy: SessionBindingReleasePolicySchema,
36312
+ releasedBy: SessionBindingReleasedBySchema.nullable(),
36218
36313
  payload: JsonValueSchema2.nullable(),
36219
36314
  createdAt: external_exports.string().datetime(),
36220
36315
  updatedAt: external_exports.string().datetime()
@@ -36434,7 +36529,11 @@ var SetupOnboardingPullRequestCreateRequestSchema = external_exports.object({
36434
36529
  roster: external_exports.object({
36435
36530
  agents: external_exports.array(external_exports.string().trim().min(1)),
36436
36531
  customBrief: external_exports.string().trim().min(1).max(500).nullable().default(null)
36437
- }).optional()
36532
+ }).optional(),
36533
+ // When false the PR omits the onboarding concierge agent and its avatar,
36534
+ // installing only the roster picks. Used by the agents-page catalog surface
36535
+ // (post-onboarding); the onboarding welcome flow leaves this unset (true).
36536
+ concierge: external_exports.boolean().optional()
36438
36537
  });
36439
36538
  var SetupOnboardingPullRequestSchema = external_exports.object({
36440
36539
  number: external_exports.number().int().positive(),
package/dist/index.js CHANGED
@@ -17823,6 +17823,59 @@ var init_secrets = __esm({
17823
17823
  }
17824
17824
  });
17825
17825
 
17826
+ // ../../packages/schemas/src/session-bindings.ts
17827
+ 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;
17828
+ var init_session_bindings = __esm({
17829
+ "../../packages/schemas/src/session-bindings.ts"() {
17830
+ "use strict";
17831
+ init_zod();
17832
+ BINDING_TARGET_TYPES = [
17833
+ "github.pull_request",
17834
+ "github.issue",
17835
+ "slack.thread",
17836
+ "chat.message",
17837
+ "agent.singleton"
17838
+ ];
17839
+ TRIGGER_BINDING_TARGET_TYPES = [
17840
+ "github.pull_request",
17841
+ "github.issue",
17842
+ "slack.thread",
17843
+ "agent.singleton"
17844
+ ];
17845
+ SESSION_BINDING_SOURCES = [
17846
+ "trigger_spawn",
17847
+ "agent_tool",
17848
+ "chat_send",
17849
+ "system"
17850
+ ];
17851
+ SESSION_BINDING_STATUSES = ["active", "released"];
17852
+ SESSION_BINDING_RELEASE_POLICIES = ["manual", "held"];
17853
+ SESSION_BINDING_RELEASED_BY = [
17854
+ "agent_tool",
17855
+ "archive",
17856
+ "trigger_release",
17857
+ "operator",
17858
+ "takeover"
17859
+ ];
17860
+ BindingTargetTypeSchema = external_exports.enum(BINDING_TARGET_TYPES);
17861
+ TriggerBindingTargetTypeSchema = external_exports.enum(
17862
+ TRIGGER_BINDING_TARGET_TYPES
17863
+ );
17864
+ SessionBindingSourceSchema = external_exports.enum(SESSION_BINDING_SOURCES);
17865
+ SessionBindingStatusSchema = external_exports.enum(SESSION_BINDING_STATUSES);
17866
+ SessionBindingReleasePolicySchema = external_exports.enum(
17867
+ SESSION_BINDING_RELEASE_POLICIES
17868
+ );
17869
+ SessionBindingReleasedBySchema = external_exports.enum(
17870
+ SESSION_BINDING_RELEASED_BY
17871
+ );
17872
+ BindingTargetSchema = external_exports.object({
17873
+ type: BindingTargetTypeSchema,
17874
+ externalId: external_exports.string().min(1)
17875
+ });
17876
+ }
17877
+ });
17878
+
17826
17879
  // ../../packages/schemas/src/tools.ts
17827
17880
  function remoteMcpUrlSchema(input) {
17828
17881
  return external_exports.string().trim().url().refine(
@@ -18005,45 +18058,6 @@ var init_tools = __esm({
18005
18058
  }
18006
18059
  });
18007
18060
 
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
18061
  // ../../packages/schemas/src/trigger-router.ts
18048
18062
  function normalizeLegacyHeartbeatTickWorkflowInput(input) {
18049
18063
  if (!input || typeof input !== "object" || Array.isArray(input)) {
@@ -18131,7 +18145,15 @@ var init_trigger_router = __esm({
18131
18145
  external_exports.object({
18132
18146
  kind: external_exports.literal("bind"),
18133
18147
  target: TriggerBindingTargetTypeSchema,
18134
- onUnmatched: OnUnmatchedSchema
18148
+ onUnmatched: OnUnmatchedSchema,
18149
+ // Declarative binding release: after the router routes this event
18150
+ // (delivered, revived, or unmatched), the platform releases the target's
18151
+ // active binding as a follow-up activity. Deliver-then-release — the bound
18152
+ // session receives the message first; the binding is released after
18153
+ // routing completes. No-op when no active binding exists. `agent.singleton`
18154
+ // is rejected at apply time (singleton slots are pool-membership state
18155
+ // owned by the reconciler).
18156
+ release: external_exports.boolean().default(false)
18135
18157
  })
18136
18158
  ]);
18137
18159
  LegacySingletonRouteBySchema = external_exports.object({
@@ -18158,7 +18180,8 @@ var init_trigger_router = __esm({
18158
18180
  ({ routeBy, onUnmatched }) => ({
18159
18181
  kind: "bind",
18160
18182
  target: routeBy.artifactType,
18161
- onUnmatched
18183
+ onUnmatched,
18184
+ release: false
18162
18185
  })
18163
18186
  );
18164
18187
  LegacyDeliverOrSpawnRoutingSchema = external_exports.object({
@@ -18480,6 +18503,49 @@ function validateConcurrencyConfig(spec, context) {
18480
18503
  function isSlotDeliveryTrigger(trigger) {
18481
18504
  return trigger.routing.kind === "deliver" && !trigger.routing.routeBy;
18482
18505
  }
18506
+ function validateBindingsConfig(spec, context) {
18507
+ if (!spec.bindings) {
18508
+ return;
18509
+ }
18510
+ const heldTargets = new Set(
18511
+ Object.entries(spec.bindings).filter(([, config2]) => config2.lifecycle === "held").map(([target]) => target)
18512
+ );
18513
+ if (heldTargets.size === 0) {
18514
+ return;
18515
+ }
18516
+ const releaseTargets = /* @__PURE__ */ new Set();
18517
+ for (const trigger of spec.triggers) {
18518
+ if (trigger.routing.kind !== "bind") {
18519
+ continue;
18520
+ }
18521
+ if (trigger.routing.release) {
18522
+ releaseTargets.add(trigger.routing.target);
18523
+ }
18524
+ }
18525
+ for (const target of heldTargets) {
18526
+ if (!releaseTargets.has(target)) {
18527
+ context.addIssue({
18528
+ code: external_exports.ZodIssueCode.custom,
18529
+ path: ["bindings", target, "lifecycle"],
18530
+ message: `\`lifecycle: held\` requires at least one bind-routed trigger on "${target}" with \`release: true\` so the platform can release it`
18531
+ });
18532
+ }
18533
+ }
18534
+ }
18535
+ function validateTriggerReleaseConfig(spec, context) {
18536
+ for (const [index, trigger] of spec.triggers.entries()) {
18537
+ if (trigger.routing.kind !== "bind") {
18538
+ continue;
18539
+ }
18540
+ if (trigger.routing.release && trigger.routing.target === "agent.singleton") {
18541
+ context.addIssue({
18542
+ code: external_exports.ZodIssueCode.custom,
18543
+ path: ["triggers", index, "routing", "release"],
18544
+ message: "`release: true` cannot target `agent.singleton`: singleton slots are pool-membership state owned by the reconciler, not trigger-releasable bindings"
18545
+ });
18546
+ }
18547
+ }
18548
+ }
18483
18549
  function validateTriggerChecks(trigger, context, eventKeys) {
18484
18550
  const checks = trigger.checks ?? [];
18485
18551
  if (checks.length === 0) {
@@ -18603,7 +18669,7 @@ function isChatMessageEvent(trigger) {
18603
18669
  function hasFilterValue(trigger, path2, expected) {
18604
18670
  return trigger.where?.[path2] === expected;
18605
18671
  }
18606
- 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;
18672
+ 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;
18607
18673
  var init_agents = __esm({
18608
18674
  "../../packages/schemas/src/agents.ts"() {
18609
18675
  "use strict";
@@ -18614,6 +18680,7 @@ var init_agents = __esm({
18614
18680
  init_primitives();
18615
18681
  init_resources();
18616
18682
  init_secrets();
18683
+ init_session_bindings();
18617
18684
  init_tools();
18618
18685
  init_trigger_router();
18619
18686
  RESOURCE_KIND_AGENT = "agent";
@@ -18778,6 +18845,30 @@ var init_agents = __esm({
18778
18845
  }).strict().refine((identity2) => Object.keys(identity2).length > 0, {
18779
18846
  message: "Identity requires at least one field"
18780
18847
  });
18848
+ BINDING_LIFECYCLE_VALUES = ["manual", "held"];
18849
+ BindingLifecycleSpecSchema = external_exports.object({
18850
+ lifecycle: external_exports.enum(BINDING_LIFECYCLE_VALUES).default("manual")
18851
+ }).strict();
18852
+ AgentBindingsSchema = external_exports.record(external_exports.string(), BindingLifecycleSpecSchema).superRefine((bindings, context) => {
18853
+ for (const key of Object.keys(bindings)) {
18854
+ const parsed = BindingTargetTypeSchema.safeParse(key);
18855
+ if (!parsed.success) {
18856
+ context.addIssue({
18857
+ code: external_exports.ZodIssueCode.custom,
18858
+ path: [key],
18859
+ message: `\`${key}\` is not a valid binding target type`
18860
+ });
18861
+ continue;
18862
+ }
18863
+ if (parsed.data === "agent.singleton") {
18864
+ context.addIssue({
18865
+ code: external_exports.ZodIssueCode.custom,
18866
+ path: [key],
18867
+ message: "`agent.singleton` is excluded from `bindings` constraints; the pool slot has its own release lifecycle"
18868
+ });
18869
+ }
18870
+ }
18871
+ });
18781
18872
  AgentSpecFieldsSchema = external_exports.object({
18782
18873
  harness: external_exports.enum(AGENT_HARNESSES).optional(),
18783
18874
  model: AgentModelSelectionSchema.optional(),
@@ -18795,6 +18886,7 @@ var init_agents = __esm({
18795
18886
  replace: AgentReplacePolicySchema.optional(),
18796
18887
  onReplace: external_exports.string().trim().min(1).max(2e4).optional(),
18797
18888
  manages: AgentManagesSchema.optional(),
18889
+ bindings: AgentBindingsSchema.default({}),
18798
18890
  workingDirectory: external_exports.string().trim().min(1).optional(),
18799
18891
  tools: AgentToolsSchema.default({})
18800
18892
  });
@@ -18812,6 +18904,8 @@ var init_agents = __esm({
18812
18904
  validateRunnableConfig(spec, context);
18813
18905
  validateAgentModelFieldsForHarness(spec, context);
18814
18906
  validateConcurrencyConfig(spec, context);
18907
+ validateBindingsConfig(spec, context);
18908
+ validateTriggerReleaseConfig(spec, context);
18815
18909
  });
18816
18910
  AgentStatusSchema = external_exports.object({
18817
18911
  runCount: external_exports.number().int().nonnegative().default(0),
@@ -20612,6 +20706,8 @@ var init_session_introspection = __esm({
20612
20706
  externalId: external_exports.string(),
20613
20707
  source: SessionBindingSourceSchema,
20614
20708
  status: SessionBindingStatusSchema,
20709
+ releasePolicy: SessionBindingReleasePolicySchema,
20710
+ releasedBy: SessionBindingReleasedBySchema.nullable(),
20615
20711
  payload: JsonValueSchema.nullable(),
20616
20712
  createdAt: external_exports.string().datetime(),
20617
20713
  updatedAt: external_exports.string().datetime()
@@ -20856,7 +20952,11 @@ var init_setup = __esm({
20856
20952
  roster: external_exports.object({
20857
20953
  agents: external_exports.array(external_exports.string().trim().min(1)),
20858
20954
  customBrief: external_exports.string().trim().min(1).max(500).nullable().default(null)
20859
- }).optional()
20955
+ }).optional(),
20956
+ // When false the PR omits the onboarding concierge agent and its avatar,
20957
+ // installing only the roster picks. Used by the agents-page catalog surface
20958
+ // (post-onboarding); the onboarding welcome flow leaves this unset (true).
20959
+ concierge: external_exports.boolean().optional()
20860
20960
  });
20861
20961
  SetupOnboardingPullRequestSchema = external_exports.object({
20862
20962
  number: external_exports.number().int().positive(),
@@ -34861,7 +34961,7 @@ var init_package = __esm({
34861
34961
  "package.json"() {
34862
34962
  package_default = {
34863
34963
  name: "@autohq/cli",
34864
- version: "0.1.396",
34964
+ version: "0.1.398",
34865
34965
  license: "SEE LICENSE IN README.md",
34866
34966
  publishConfig: {
34867
34967
  access: "public"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@autohq/cli",
3
- "version": "0.1.396",
3
+ "version": "0.1.398",
4
4
  "license": "SEE LICENSE IN README.md",
5
5
  "publishConfig": {
6
6
  "access": "public"