agentix-cli 0.21.0 → 0.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/dist/{agent-I3ILI3MO.js → agent-FSE4KRLX.js} +2 -2
  2. package/dist/{board-dashboard-ASI6MDKX.js → board-dashboard-PUACKWAN.js} +4 -4
  3. package/dist/builtin-TQKMR42Z.js +2 -0
  4. package/dist/chunk-3SHMHYPD.js +450 -0
  5. package/dist/chunk-3SHMHYPD.js.map +1 -0
  6. package/dist/{chunk-FUYZUGNQ.js → chunk-4INOOHND.js} +2 -2
  7. package/dist/chunk-72PAN7UI.js +103 -0
  8. package/dist/chunk-72PAN7UI.js.map +1 -0
  9. package/dist/chunk-BHSPAP4U.js +44 -0
  10. package/dist/chunk-BHSPAP4U.js.map +1 -0
  11. package/dist/chunk-BOUKM2PS.js +163 -0
  12. package/dist/chunk-BOUKM2PS.js.map +1 -0
  13. package/dist/{chunk-AANSVC5A.js → chunk-DXTIG5YV.js} +2 -2
  14. package/dist/chunk-EK37JHJI.js +13 -0
  15. package/dist/chunk-EK37JHJI.js.map +1 -0
  16. package/dist/chunk-EQPUB7CZ.js +685 -0
  17. package/dist/chunk-EQPUB7CZ.js.map +1 -0
  18. package/dist/{chunk-4MREHZP5.js → chunk-GOLZ6NEL.js} +2 -2
  19. package/dist/chunk-GOLZ6NEL.js.map +1 -0
  20. package/dist/{chunk-2B2DIQKD.js → chunk-KWUWZQGV.js} +2 -2
  21. package/dist/{chunk-K6MC66D6.js → chunk-PD5Q7D6Z.js} +2 -2
  22. package/dist/{chunk-AGINLNAW.js → chunk-Q6CAFGXT.js} +2 -2
  23. package/dist/chunk-ZZFXI3CS.js +8 -0
  24. package/dist/chunk-ZZFXI3CS.js.map +1 -0
  25. package/dist/cli.js +1 -1
  26. package/dist/cli.js.map +1 -1
  27. package/dist/{config-RWHSEE4N.js → config-ADS54KLC.js} +2 -2
  28. package/dist/config-mutator-WTRMBZTO.js +2 -0
  29. package/dist/doctor-T6RB4Q5X.js +2 -0
  30. package/dist/index.d.ts +191 -3
  31. package/dist/index.js +1 -1
  32. package/dist/index.js.map +1 -1
  33. package/dist/program-V7NGFB2R.js +2 -0
  34. package/dist/registry-42HEWCLA.js +2 -0
  35. package/dist/scheduler-C56ABAVP.js +2 -0
  36. package/dist/web/workflow-editor.global.js +11 -11
  37. package/dist/web/workflow-editor.global.js.map +1 -1
  38. package/dist/workspace-setup-DQCZX2NE.js +2 -0
  39. package/dist/workspace-setup-DQCZX2NE.js.map +1 -0
  40. package/package.json +2 -1
  41. package/dist/chunk-4MREHZP5.js.map +0 -1
  42. package/dist/chunk-5GDCJ2SF.js +0 -13
  43. package/dist/chunk-5GDCJ2SF.js.map +0 -1
  44. package/dist/chunk-5XZ73VM4.js +0 -102
  45. package/dist/chunk-5XZ73VM4.js.map +0 -1
  46. package/dist/chunk-BLRLUF2H.js +0 -743
  47. package/dist/chunk-BLRLUF2H.js.map +0 -1
  48. package/dist/chunk-EQNM3TOF.js +0 -15
  49. package/dist/chunk-EQNM3TOF.js.map +0 -1
  50. package/dist/chunk-IFQQVDM6.js +0 -442
  51. package/dist/chunk-IFQQVDM6.js.map +0 -1
  52. package/dist/chunk-ZE2YFX4K.js +0 -45
  53. package/dist/chunk-ZE2YFX4K.js.map +0 -1
  54. package/dist/config-mutator-JKCNCY2F.js +0 -2
  55. package/dist/doctor-KWN7NUFQ.js +0 -2
  56. package/dist/program-JEKM7SCS.js +0 -2
  57. package/dist/registry-EGKDMVSP.js +0 -2
  58. package/dist/scheduler-ED4FCI2Y.js +0 -2
  59. package/dist/workspace-setup-FPGN5VNY.js +0 -2
  60. /package/dist/{agent-I3ILI3MO.js.map → agent-FSE4KRLX.js.map} +0 -0
  61. /package/dist/{board-dashboard-ASI6MDKX.js.map → board-dashboard-PUACKWAN.js.map} +0 -0
  62. /package/dist/{config-RWHSEE4N.js.map → builtin-TQKMR42Z.js.map} +0 -0
  63. /package/dist/{chunk-FUYZUGNQ.js.map → chunk-4INOOHND.js.map} +0 -0
  64. /package/dist/{chunk-AANSVC5A.js.map → chunk-DXTIG5YV.js.map} +0 -0
  65. /package/dist/{chunk-2B2DIQKD.js.map → chunk-KWUWZQGV.js.map} +0 -0
  66. /package/dist/{chunk-K6MC66D6.js.map → chunk-PD5Q7D6Z.js.map} +0 -0
  67. /package/dist/{chunk-AGINLNAW.js.map → chunk-Q6CAFGXT.js.map} +0 -0
  68. /package/dist/{config-mutator-JKCNCY2F.js.map → config-ADS54KLC.js.map} +0 -0
  69. /package/dist/{doctor-KWN7NUFQ.js.map → config-mutator-WTRMBZTO.js.map} +0 -0
  70. /package/dist/{program-JEKM7SCS.js.map → doctor-T6RB4Q5X.js.map} +0 -0
  71. /package/dist/{registry-EGKDMVSP.js.map → program-V7NGFB2R.js.map} +0 -0
  72. /package/dist/{scheduler-ED4FCI2Y.js.map → registry-42HEWCLA.js.map} +0 -0
  73. /package/dist/{workspace-setup-FPGN5VNY.js.map → scheduler-C56ABAVP.js.map} +0 -0
package/dist/index.d.ts CHANGED
@@ -1366,6 +1366,34 @@ declare const agentConfigSchema: z.ZodObject<{
1366
1366
  * agents that do long investigations or multi-file refactors. */
1367
1367
  maxExecutionMinutes: z.ZodDefault<z.ZodNumber>;
1368
1368
  permissionMode: z.ZodDefault<z.ZodString>;
1369
+ /** Improvement plan #3 — tool-use-required preset. When set,
1370
+ * AgentX inspects the stream-json events from each task and
1371
+ * fails the response with `tool_required_not_called: <name>`
1372
+ * when none of the listed tool names was invoked. Catches the
1373
+ * silent-degrade pattern observed when a model below the
1374
+ * capability bar (e.g. Haiku on a Write-required prompt)
1375
+ * produces a plausible-looking text response without ever
1376
+ * calling the required tool. Caller can retry with a stronger
1377
+ * model or sharpen the prompt.
1378
+ *
1379
+ * Tool names match the canonical Claude Code names ("Write",
1380
+ * "Edit", "Bash", "Read", …). Free-form so future tools work
1381
+ * without a schema bump. Empty/unset means no enforcement
1382
+ * (default — backward compatible). */
1383
+ toolUseRequired: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
1384
+ /** When true, this agent's claude-code dispatches reuse a long-lived
1385
+ * subprocess per (channel, chatId) instead of spawning a fresh
1386
+ * `claude -p` per turn. Driven over stdin via stream-json input,
1387
+ * which keeps the prompt cache warm across turns within a chat
1388
+ * (turn 1 cache_create=12897 → turn 2 cache_create=20 + cache_read
1389
+ * =24575 in the 2026-05-03 spike — 3-5× latency win on chat-shaped
1390
+ * workloads). When the registry can't allocate a slot (global or
1391
+ * per-agent cap exceeded), the dispatch falls back to spawn-per-task
1392
+ * silently with a warning log. Other tiers (sdk, orchestrator)
1393
+ * ignore this flag. Default false until the persistent path
1394
+ * finishes its soak; flip per-agent first, then per-fleet.
1395
+ * See docs/architecture/persistent-claude-process.md for the design. */
1396
+ persistentProcess: z.ZodDefault<z.ZodBoolean>;
1369
1397
  queueMode: z.ZodDefault<z.ZodEnum<["collect", "followup", "drop"]>>;
1370
1398
  heartbeat: z.ZodDefault<z.ZodObject<{
1371
1399
  enabled: z.ZodDefault<z.ZodBoolean>;
@@ -1399,6 +1427,8 @@ declare const agentConfigSchema: z.ZodObject<{
1399
1427
  maxConcurrent: number;
1400
1428
  maxExecutionMinutes: number;
1401
1429
  permissionMode: string;
1430
+ toolUseRequired: string[];
1431
+ persistentProcess: boolean;
1402
1432
  queueMode: "collect" | "followup" | "drop";
1403
1433
  heartbeat: {
1404
1434
  enabled: boolean;
@@ -1436,6 +1466,8 @@ declare const agentConfigSchema: z.ZodObject<{
1436
1466
  maxConcurrent?: number | undefined;
1437
1467
  maxExecutionMinutes?: number | undefined;
1438
1468
  permissionMode?: string | undefined;
1469
+ toolUseRequired?: string[] | undefined;
1470
+ persistentProcess?: boolean | undefined;
1439
1471
  queueMode?: "collect" | "followup" | "drop" | undefined;
1440
1472
  heartbeat?: {
1441
1473
  enabled?: boolean | undefined;
@@ -1606,6 +1638,34 @@ declare const daemonConfigSchema: z.ZodObject<{
1606
1638
  * agents that do long investigations or multi-file refactors. */
1607
1639
  maxExecutionMinutes: z.ZodDefault<z.ZodNumber>;
1608
1640
  permissionMode: z.ZodDefault<z.ZodString>;
1641
+ /** Improvement plan #3 — tool-use-required preset. When set,
1642
+ * AgentX inspects the stream-json events from each task and
1643
+ * fails the response with `tool_required_not_called: <name>`
1644
+ * when none of the listed tool names was invoked. Catches the
1645
+ * silent-degrade pattern observed when a model below the
1646
+ * capability bar (e.g. Haiku on a Write-required prompt)
1647
+ * produces a plausible-looking text response without ever
1648
+ * calling the required tool. Caller can retry with a stronger
1649
+ * model or sharpen the prompt.
1650
+ *
1651
+ * Tool names match the canonical Claude Code names ("Write",
1652
+ * "Edit", "Bash", "Read", …). Free-form so future tools work
1653
+ * without a schema bump. Empty/unset means no enforcement
1654
+ * (default — backward compatible). */
1655
+ toolUseRequired: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
1656
+ /** When true, this agent's claude-code dispatches reuse a long-lived
1657
+ * subprocess per (channel, chatId) instead of spawning a fresh
1658
+ * `claude -p` per turn. Driven over stdin via stream-json input,
1659
+ * which keeps the prompt cache warm across turns within a chat
1660
+ * (turn 1 cache_create=12897 → turn 2 cache_create=20 + cache_read
1661
+ * =24575 in the 2026-05-03 spike — 3-5× latency win on chat-shaped
1662
+ * workloads). When the registry can't allocate a slot (global or
1663
+ * per-agent cap exceeded), the dispatch falls back to spawn-per-task
1664
+ * silently with a warning log. Other tiers (sdk, orchestrator)
1665
+ * ignore this flag. Default false until the persistent path
1666
+ * finishes its soak; flip per-agent first, then per-fleet.
1667
+ * See docs/architecture/persistent-claude-process.md for the design. */
1668
+ persistentProcess: z.ZodDefault<z.ZodBoolean>;
1609
1669
  queueMode: z.ZodDefault<z.ZodEnum<["collect", "followup", "drop"]>>;
1610
1670
  heartbeat: z.ZodDefault<z.ZodObject<{
1611
1671
  enabled: z.ZodDefault<z.ZodBoolean>;
@@ -1639,6 +1699,8 @@ declare const daemonConfigSchema: z.ZodObject<{
1639
1699
  maxConcurrent: number;
1640
1700
  maxExecutionMinutes: number;
1641
1701
  permissionMode: string;
1702
+ toolUseRequired: string[];
1703
+ persistentProcess: boolean;
1642
1704
  queueMode: "collect" | "followup" | "drop";
1643
1705
  heartbeat: {
1644
1706
  enabled: boolean;
@@ -1676,6 +1738,8 @@ declare const daemonConfigSchema: z.ZodObject<{
1676
1738
  maxConcurrent?: number | undefined;
1677
1739
  maxExecutionMinutes?: number | undefined;
1678
1740
  permissionMode?: string | undefined;
1741
+ toolUseRequired?: string[] | undefined;
1742
+ persistentProcess?: boolean | undefined;
1679
1743
  queueMode?: "collect" | "followup" | "drop" | undefined;
1680
1744
  heartbeat?: {
1681
1745
  enabled?: boolean | undefined;
@@ -2888,6 +2952,22 @@ declare const daemonConfigSchema: z.ZodObject<{
2888
2952
  }>, "many">>;
2889
2953
  workTickMinutes: z.ZodDefault<z.ZodNumber>;
2890
2954
  idleQueueThreshold: z.ZodDefault<z.ZodNumber>;
2955
+ standup: z.ZodDefault<z.ZodObject<{
2956
+ enabled: z.ZodDefault<z.ZodBoolean>;
2957
+ plansDir: z.ZodDefault<z.ZodString>;
2958
+ maxAgentsPerDay: z.ZodDefault<z.ZodNumber>;
2959
+ dryRun: z.ZodDefault<z.ZodBoolean>;
2960
+ }, "strip", z.ZodTypeAny, {
2961
+ enabled: boolean;
2962
+ plansDir: string;
2963
+ maxAgentsPerDay: number;
2964
+ dryRun: boolean;
2965
+ }, {
2966
+ enabled?: boolean | undefined;
2967
+ plansDir?: string | undefined;
2968
+ maxAgentsPerDay?: number | undefined;
2969
+ dryRun?: boolean | undefined;
2970
+ }>>;
2891
2971
  }, "strip", z.ZodTypeAny, {
2892
2972
  enabled: boolean;
2893
2973
  projects: {
@@ -2943,6 +3023,12 @@ declare const daemonConfigSchema: z.ZodObject<{
2943
3023
  }[];
2944
3024
  workTickMinutes: number;
2945
3025
  idleQueueThreshold: number;
3026
+ standup: {
3027
+ enabled: boolean;
3028
+ plansDir: string;
3029
+ maxAgentsPerDay: number;
3030
+ dryRun: boolean;
3031
+ };
2946
3032
  }, {
2947
3033
  mainChannel: {
2948
3034
  channel: string;
@@ -2998,6 +3084,12 @@ declare const daemonConfigSchema: z.ZodObject<{
2998
3084
  }[] | undefined;
2999
3085
  workTickMinutes?: number | undefined;
3000
3086
  idleQueueThreshold?: number | undefined;
3087
+ standup?: {
3088
+ enabled?: boolean | undefined;
3089
+ plansDir?: string | undefined;
3090
+ maxAgentsPerDay?: number | undefined;
3091
+ dryRun?: boolean | undefined;
3092
+ } | undefined;
3001
3093
  }>>;
3002
3094
  boards: z.ZodDefault<z.ZodArray<z.ZodObject<{
3003
3095
  id: z.ZodString;
@@ -3399,6 +3491,8 @@ declare const daemonConfigSchema: z.ZodObject<{
3399
3491
  maxConcurrent: number;
3400
3492
  maxExecutionMinutes: number;
3401
3493
  permissionMode: string;
3494
+ toolUseRequired: string[];
3495
+ persistentProcess: boolean;
3402
3496
  queueMode: "collect" | "followup" | "drop";
3403
3497
  heartbeat: {
3404
3498
  enabled: boolean;
@@ -3750,6 +3844,12 @@ declare const daemonConfigSchema: z.ZodObject<{
3750
3844
  }[];
3751
3845
  workTickMinutes: number;
3752
3846
  idleQueueThreshold: number;
3847
+ standup: {
3848
+ enabled: boolean;
3849
+ plansDir: string;
3850
+ maxAgentsPerDay: number;
3851
+ dryRun: boolean;
3852
+ };
3753
3853
  } | undefined;
3754
3854
  }, {
3755
3855
  node: {
@@ -3778,6 +3878,8 @@ declare const daemonConfigSchema: z.ZodObject<{
3778
3878
  maxConcurrent?: number | undefined;
3779
3879
  maxExecutionMinutes?: number | undefined;
3780
3880
  permissionMode?: string | undefined;
3881
+ toolUseRequired?: string[] | undefined;
3882
+ persistentProcess?: boolean | undefined;
3781
3883
  queueMode?: "collect" | "followup" | "drop" | undefined;
3782
3884
  heartbeat?: {
3783
3885
  enabled?: boolean | undefined;
@@ -4042,6 +4144,12 @@ declare const daemonConfigSchema: z.ZodObject<{
4042
4144
  }[] | undefined;
4043
4145
  workTickMinutes?: number | undefined;
4044
4146
  idleQueueThreshold?: number | undefined;
4147
+ standup?: {
4148
+ enabled?: boolean | undefined;
4149
+ plansDir?: string | undefined;
4150
+ maxAgentsPerDay?: number | undefined;
4151
+ dryRun?: boolean | undefined;
4152
+ } | undefined;
4045
4153
  } | undefined;
4046
4154
  boards?: {
4047
4155
  id: string;
@@ -4376,6 +4484,13 @@ declare class AgentXDaemon {
4376
4484
  private loadedPlugins;
4377
4485
  private readonly agentMemory;
4378
4486
  private contacts;
4487
+ /** Persistent-claude process registry. Null when no agent has
4488
+ * persistentProcess: true (legacy spawn-per-task path). */
4489
+ private processRegistry;
4490
+ /** Unified observability bus. Publishers (workflow engine, mesh,
4491
+ * channels, signals) emit here; subscribers (SSE, CLI, board
4492
+ * dashboard) filter by kind / workflow / actor. Created eagerly so
4493
+ * early boot events don't fall through. */
4379
4494
  readonly events: EventBus;
4380
4495
  private log;
4381
4496
  private sseClients;
@@ -4728,6 +4843,27 @@ interface AgentTask {
4728
4843
  eventId: string;
4729
4844
  decidedBy: string;
4730
4845
  };
4846
+ /** ULID for the per-execution trace row in task_traces (improvement
4847
+ * plan #2). Allocated by registry.execute right before emitting the
4848
+ * task:started bus event so per-step capture sites in the streaming
4849
+ * parser can append rows under the same id. Optional — when unset,
4850
+ * step capture is a no-op. */
4851
+ taskId?: string;
4852
+ /** Improvement plan #8 — when true, the dispatcher discards any
4853
+ * cached session for this (agent, channel, chatId) before
4854
+ * executing: the claudeSessionId is cleared (no --resume) and
4855
+ * any persistent-process handle is killed so the next dispatch
4856
+ * spawns fresh. Use from triage→sub-agent delegation paths where
4857
+ * the caller knows this is a NEW visitor on a chatId that may
4858
+ * collide with prior conversations.
4859
+ *
4860
+ * Caught in benchmark Run 3 (2026-05-04): a triage agent
4861
+ * delegated to "lead" for a brand-new visitor; lead's warm
4862
+ * persistent process replied with the previous visitor's
4863
+ * confirmation message. freshSession: true defends against
4864
+ * that pattern without requiring callers to invent unique
4865
+ * chatIds. */
4866
+ freshSession?: boolean;
4731
4867
  context?: {
4732
4868
  channel?: string;
4733
4869
  sender?: string;
@@ -4811,9 +4947,6 @@ declare function executeSdk(agent: AgentDef, task: AgentTask, apiKey: string, hi
4811
4947
  * Execute a task using agentx's own orchestrator (tier: "orchestrator").
4812
4948
  */
4813
4949
  declare function executeOrchestrator(agent: AgentDef, task: AgentTask, apiKey?: string, historyContext?: string): Promise<AgentResponse>;
4814
- /**
4815
- * Route a task to the correct execution tier.
4816
- */
4817
4950
  declare function executeTask(agent: AgentDef, task: AgentTask, providers: Record<string, {
4818
4951
  apiKey?: string;
4819
4952
  }>, onDelta?: StreamCallback, historyContext?: string, resumeSessionId?: string, onEvent?: (event: any) => void): Promise<AgentResponse>;
@@ -6952,6 +7085,37 @@ declare const businessConfigSchema: z.ZodObject<{
6952
7085
  workTickMinutes: z.ZodDefault<z.ZodNumber>;
6953
7086
  /** Max queue depth for an idle agent before skipping the work tick (avoids piling up). */
6954
7087
  idleQueueThreshold: z.ZodDefault<z.ZodNumber>;
7088
+ /** Standup-tick gating + plan-driven priorities. The day-cycle's morning
7089
+ * STANDUP used to fire unconditionally per agent — operators reported it
7090
+ * as "mechanical" because it dispatched a Claude turn even when no human
7091
+ * had set a plan for the day. Now: the cycle reads
7092
+ * .agentx/plans/<date>.md (day → week → month fallback) and either
7093
+ * injects the plan as standup priorities, or posts a "no plan today"
7094
+ * notification to mainChannel and dispatches no agent. */
7095
+ standup: z.ZodDefault<z.ZodObject<{
7096
+ /** Master switch. When false, fireStandup is a no-op (silent). */
7097
+ enabled: z.ZodDefault<z.ZodBoolean>;
7098
+ /** Plans directory, relative to the daemon CWD. */
7099
+ plansDir: z.ZodDefault<z.ZodString>;
7100
+ /** Hard ceiling on how many agents the standup tick can dispatch in a
7101
+ * single morning — guards against an org-chart misconfiguration
7102
+ * fanning out to dozens of Claude calls before anyone notices. */
7103
+ maxAgentsPerDay: z.ZodDefault<z.ZodNumber>;
7104
+ /** When true, even with a plan present the cycle won't dispatch — only
7105
+ * posts the resolved plan to mainChannel for human review. Useful as
7106
+ * a kill-switch while iterating on plan formats. */
7107
+ dryRun: z.ZodDefault<z.ZodBoolean>;
7108
+ }, "strip", z.ZodTypeAny, {
7109
+ enabled: boolean;
7110
+ plansDir: string;
7111
+ maxAgentsPerDay: number;
7112
+ dryRun: boolean;
7113
+ }, {
7114
+ enabled?: boolean | undefined;
7115
+ plansDir?: string | undefined;
7116
+ maxAgentsPerDay?: number | undefined;
7117
+ dryRun?: boolean | undefined;
7118
+ }>>;
6955
7119
  }, "strip", z.ZodTypeAny, {
6956
7120
  enabled: boolean;
6957
7121
  projects: {
@@ -7007,6 +7171,12 @@ declare const businessConfigSchema: z.ZodObject<{
7007
7171
  }[];
7008
7172
  workTickMinutes: number;
7009
7173
  idleQueueThreshold: number;
7174
+ standup: {
7175
+ enabled: boolean;
7176
+ plansDir: string;
7177
+ maxAgentsPerDay: number;
7178
+ dryRun: boolean;
7179
+ };
7010
7180
  }, {
7011
7181
  mainChannel: {
7012
7182
  channel: string;
@@ -7062,6 +7232,12 @@ declare const businessConfigSchema: z.ZodObject<{
7062
7232
  }[] | undefined;
7063
7233
  workTickMinutes?: number | undefined;
7064
7234
  idleQueueThreshold?: number | undefined;
7235
+ standup?: {
7236
+ enabled?: boolean | undefined;
7237
+ plansDir?: string | undefined;
7238
+ maxAgentsPerDay?: number | undefined;
7239
+ dryRun?: boolean | undefined;
7240
+ } | undefined;
7065
7241
  }>;
7066
7242
  type BusinessConfig = z.infer<typeof businessConfigSchema>;
7067
7243
  type BusinessRole = z.infer<typeof roleSchema>;
@@ -7295,6 +7471,9 @@ declare class DayCycle {
7295
7471
  private day;
7296
7472
  private currentDate;
7297
7473
  private runningTask;
7474
+ private standupsFiredToday;
7475
+ private noPlanNoticePostedFor?;
7476
+ private planStore;
7298
7477
  constructor(config: BusinessConfig, org: Organization, schedule: Schedule, registry: AgentRegistry, reporter: Reporter, kpi: KPI, workSource: WorkSource, daemonBase: string, log: (...args: unknown[]) => void);
7299
7478
  start(): void;
7300
7479
  stop(): void;
@@ -7302,6 +7481,15 @@ declare class DayCycle {
7302
7481
  private roleContext;
7303
7482
  private runLifecycle;
7304
7483
  private fireStandup;
7484
+ /** Post one "no plan today" line to mainChannel per calendar date. After
7485
+ * the first STANDUP would have fired, we let the team know the cycle
7486
+ * saw nothing to do — quiet enough not to be annoying, loud enough that
7487
+ * a forgotten plan doesn't go unnoticed for a whole morning. */
7488
+ private postNoPlanNoticeOnce;
7489
+ /** Dry-run preview: post the resolved plan to the main channel so the
7490
+ * operator can eyeball it before turning dryRun off. Once per day per
7491
+ * resolved plan. */
7492
+ private postPlanPreviewOnce;
7305
7493
  private fireWorkTick;
7306
7494
  private fireWrap;
7307
7495
  }
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import{a as U}from"./chunk-4ITQP3XL.js";import{a as yt,b as re,c as ae,d as vt,e as xt,f as Ct,i as bt,j as $t,k as Tt}from"./chunk-BLRLUF2H.js";import"./chunk-EQNM3TOF.js";import"./chunk-N67JZAXU.js";import"./chunk-AFRHKA7B.js";import"./chunk-EW27SCCC.js";import"./chunk-ZE2YFX4K.js";import{A as H,B as E,C as I,a as be,b as $e,c as Te,d as je,e as _e,f as Ue,g as Be,h as We,i as qe,j as Ve,k as Ye,l as F,m as Q,n as Ze,o as et,p as tt,q as j,r as st,s as ot,t as nt,u as P,v as Z,w as it,x as rt,y as at,z as ht}from"./chunk-AGINLNAW.js";import{a as X,b as M,c as _}from"./chunk-SFQUP3BP.js";import{f as Pt}from"./chunk-K6MC66D6.js";import"./chunk-AANSVC5A.js";import{c as kt,e as wt,f as St}from"./chunk-5GDCJ2SF.js";import"./chunk-CDNWCYF7.js";import{a as lt,b as ct,c as dt,d as pt,i as ut}from"./chunk-5XZ73VM4.js";import"./chunk-5F3J55LG.js";import"./chunk-WJXU5F4Z.js";import"./chunk-4MREHZP5.js";import"./chunk-VWTBHLMX.js";import{a as gt,b as mt,e as ft}from"./chunk-7P5QRX5W.js";import"./chunk-JTJIPNXY.js";import"./chunk-64P4QHSZ.js";import"./chunk-BFZUG66X.js";import"./chunk-SR3X25TN.js";import"./chunk-53NRX2NA.js";import"./chunk-A6BKSZQA.js";import{a as Re,b as Ae,c as Me,d as Ee,e as Ie,f as Oe,g as Ge,h as De,i as Le,j as Ne,k as Fe,l as A}from"./chunk-JGXE2YNV.js";import{a as m}from"./chunk-VJUTQAPJ.js";import{a as He,b as Je,c as N,d as Ke}from"./chunk-DJEZ2HVU.js";import{a as ze,b as Xe,e as Qe}from"./chunk-DSYKYZMT.js";import"./chunk-IKBHHTIT.js";import"./chunk-QOYAX2FT.js";import"./chunk-4YCH6IZV.js";import{execa as Rt}from"execa";import{existsSync as le,promises as ee}from"fs";import x from"path";import pe from"node-fetch";async function At(n,e){let t=n.split("/");if(t.length<2)throw new Error(`Invalid skill package ID: ${n}. Expected format: owner/repo`);let s=t[0],i=t[1],o=t[2];try{let a=o?`${s}/${i}/${o}`:`${s}/${i}`;await Rt("npx",["-y","skills","add",a],{cwd:e,stdio:"pipe"}),m.success(`Installed skill package: ${n}`);let r=x.resolve(e,".skills",`${s}_${i}`);if(le(r))return await de(r,n);let l=x.resolve(e,".skills");return le(l)?await de(l,n):[]}catch{return m.info(`Fetching skills directly from GitHub: ${s}/${i}`),await Mt(s,i,o,e)}}async function Mt(n,e,t,s){let i=[];try{let o=`https://api.github.com/repos/${n}/${e}/git/trees/main?recursive=1`,a=await pe(o);if(!a.ok)throw new Error(`GitHub API error: ${a.status}`);let l=(await a.json()).tree.filter(c=>c.type==="blob"&&c.path.endsWith("SKILL.md"));if(t){let c=l.find(g=>g.path.includes(`/${t}/`)||g.path===`${t}/SKILL.md`);if(c){let g=await ce(n,e,c.path,s);g&&i.push(g)}}else for(let c of l){let g=await ce(n,e,c.path,s);g&&i.push(g)}}catch(o){m.error(`Failed to fetch skills from GitHub: ${o.message}`)}return i}async function ce(n,e,t,s){try{let i=`https://raw.githubusercontent.com/${n}/${e}/main/${t}`,o=await pe(i);if(!o.ok)return null;let a=await o.text(),r=N(a);if(r){r.source="remote",r.packageId=`${n}/${e}`;let l=x.dirname(t),c=x.resolve(s,".skills",`${n}_${e}`,l);await ee.mkdir(c,{recursive:!0}),await ee.writeFile(x.resolve(c,"SKILL.md"),a),r.path=x.resolve(c,"SKILL.md")}return r}catch{return null}}async function de(n,e){let t=[],{default:s}=await import("fast-glob"),i=await s.glob("**/SKILL.md",{cwd:n,deep:5});for(let o of i)try{let a=x.resolve(n,o),r=await ee.readFile(a,"utf8"),l=N(r);l&&(l.source="remote",l.path=a,l.packageId=e,t.push(l))}catch{}return t}async function Et(n,e,t,s,i){let o=["---",`name: ${n}`,`description: ${e}`];if(s?.length){o.push("tags:");for(let a of s)o.push(` - ${a}`)}if(i?.length){o.push("globs:");for(let a of i)o.push(` - ${a}`)}return o.push("---"),`${o.join(`
1
+ import{a as U}from"./chunk-4ITQP3XL.js";import{a as yt,b as re,c as ae,d as vt,e as xt,f as Ct,j as bt,k as $t,l as Tt}from"./chunk-EQPUB7CZ.js";import"./chunk-BOUKM2PS.js";import"./chunk-N67JZAXU.js";import"./chunk-AFRHKA7B.js";import"./chunk-EW27SCCC.js";import{A as H,B as E,C as I,a as be,b as $e,c as Te,d as je,e as _e,f as Ue,g as Be,h as We,i as qe,j as Ve,k as Ye,l as F,m as Q,n as Ze,o as et,p as tt,q as j,r as st,s as ot,t as nt,u as P,v as Z,w as it,x as rt,y as at,z as ht}from"./chunk-Q6CAFGXT.js";import{a as X,b as M,c as _}from"./chunk-SFQUP3BP.js";import"./chunk-ZZFXI3CS.js";import{f as Pt}from"./chunk-PD5Q7D6Z.js";import"./chunk-DXTIG5YV.js";import{c as kt,e as wt,f as St}from"./chunk-EK37JHJI.js";import"./chunk-BHSPAP4U.js";import"./chunk-CDNWCYF7.js";import{d as lt,e as ct,f as dt,g as pt,q as ut}from"./chunk-72PAN7UI.js";import"./chunk-5F3J55LG.js";import"./chunk-GOLZ6NEL.js";import"./chunk-WJXU5F4Z.js";import"./chunk-VWTBHLMX.js";import{a as gt,b as mt,e as ft}from"./chunk-7P5QRX5W.js";import"./chunk-JTJIPNXY.js";import"./chunk-64P4QHSZ.js";import"./chunk-BFZUG66X.js";import"./chunk-SR3X25TN.js";import"./chunk-53NRX2NA.js";import"./chunk-A6BKSZQA.js";import{a as Re,b as Ae,c as Me,d as Ee,e as Ie,f as Oe,g as Ge,h as De,i as Le,j as Ne,k as Fe,l as A}from"./chunk-JGXE2YNV.js";import{a as m}from"./chunk-VJUTQAPJ.js";import{a as He,b as Je,c as N,d as Ke}from"./chunk-DJEZ2HVU.js";import{a as ze,b as Xe,e as Qe}from"./chunk-DSYKYZMT.js";import"./chunk-IKBHHTIT.js";import"./chunk-QOYAX2FT.js";import"./chunk-4YCH6IZV.js";import{execa as Rt}from"execa";import{existsSync as le,promises as ee}from"fs";import x from"path";import pe from"node-fetch";async function At(n,e){let t=n.split("/");if(t.length<2)throw new Error(`Invalid skill package ID: ${n}. Expected format: owner/repo`);let s=t[0],i=t[1],o=t[2];try{let a=o?`${s}/${i}/${o}`:`${s}/${i}`;await Rt("npx",["-y","skills","add",a],{cwd:e,stdio:"pipe"}),m.success(`Installed skill package: ${n}`);let r=x.resolve(e,".skills",`${s}_${i}`);if(le(r))return await de(r,n);let l=x.resolve(e,".skills");return le(l)?await de(l,n):[]}catch{return m.info(`Fetching skills directly from GitHub: ${s}/${i}`),await Mt(s,i,o,e)}}async function Mt(n,e,t,s){let i=[];try{let o=`https://api.github.com/repos/${n}/${e}/git/trees/main?recursive=1`,a=await pe(o);if(!a.ok)throw new Error(`GitHub API error: ${a.status}`);let l=(await a.json()).tree.filter(c=>c.type==="blob"&&c.path.endsWith("SKILL.md"));if(t){let c=l.find(g=>g.path.includes(`/${t}/`)||g.path===`${t}/SKILL.md`);if(c){let g=await ce(n,e,c.path,s);g&&i.push(g)}}else for(let c of l){let g=await ce(n,e,c.path,s);g&&i.push(g)}}catch(o){m.error(`Failed to fetch skills from GitHub: ${o.message}`)}return i}async function ce(n,e,t,s){try{let i=`https://raw.githubusercontent.com/${n}/${e}/main/${t}`,o=await pe(i);if(!o.ok)return null;let a=await o.text(),r=N(a);if(r){r.source="remote",r.packageId=`${n}/${e}`;let l=x.dirname(t),c=x.resolve(s,".skills",`${n}_${e}`,l);await ee.mkdir(c,{recursive:!0}),await ee.writeFile(x.resolve(c,"SKILL.md"),a),r.path=x.resolve(c,"SKILL.md")}return r}catch{return null}}async function de(n,e){let t=[],{default:s}=await import("fast-glob"),i=await s.glob("**/SKILL.md",{cwd:n,deep:5});for(let o of i)try{let a=x.resolve(n,o),r=await ee.readFile(a,"utf8"),l=N(r);l&&(l.source="remote",l.path=a,l.packageId=e,t.push(l))}catch{}return t}async function Et(n,e,t,s,i){let o=["---",`name: ${n}`,`description: ${e}`];if(s?.length){o.push("tags:");for(let a of s)o.push(` - ${a}`)}if(i?.length){o.push("globs:");for(let a of i)o.push(` - ${a}`)}return o.push("---"),`${o.join(`
2
2
  `)}
3
3
 
4
4
  ${t}`}async function It(n){let{loadLocalSkills:e}=await import("./loader-5CA3O5GM.js");return e(n)}async function Ot(n,e,t,s,i){let a=[{role:"system",content:`You are a skill author for the Agent Skills ecosystem (skills.sh).