@telora/daemon 0.15.26 → 0.15.27

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.
@@ -28,11 +28,52 @@ export interface CreateEscalationParams {
28
28
  description: string;
29
29
  whatWasTried?: string;
30
30
  helpNeeded?: string;
31
+ /**
32
+ * Optional discriminator for the kind of escalation (e.g. 'stuck_focus_branch').
33
+ * Persisted on `agent_escalations.escalation_kind` when present.
34
+ */
35
+ escalationKind?: string;
36
+ /**
37
+ * Optional structured metadata (e.g. { branch_name, focus_id }).
38
+ * Persisted on `agent_escalations.metadata` when present.
39
+ */
40
+ metadata?: Record<string, unknown>;
31
41
  }
32
42
  /**
33
43
  * Create an escalation request.
34
44
  */
35
45
  export declare function createEscalation(params: CreateEscalationParams): Promise<void>;
46
+ /**
47
+ * Minimal shape of an escalation row returned by listPendingEscalations.
48
+ * Only includes the fields needed by the merge-back loop.
49
+ */
50
+ export interface PendingEscalation {
51
+ id: string;
52
+ reasonType: string;
53
+ description: string;
54
+ whatWasTried: string | null;
55
+ helpNeeded: string | null;
56
+ escalationKind?: string | null;
57
+ metadata?: Record<string, unknown> | null;
58
+ }
59
+ /**
60
+ * List open (not-yet-resolved) escalations for the organization.
61
+ *
62
+ * Returns rows with status in `('pending', 'in_review')` -- both are
63
+ * "open" from a dedup perspective. An operator may move a stuck-branch
64
+ * escalation to `in_review` while triaging; the merge-back loop must
65
+ * still treat it as suppressing duplicates so it does not file a second
66
+ * `pending` row for the same branch.
67
+ *
68
+ * Used by the merge-back loop to detect when a branch already has an
69
+ * unresolved merge-conflict escalation, and to find existing stuck-branch
70
+ * escalations for dedup / auto-resolution.
71
+ */
72
+ export declare function listPendingEscalations(): Promise<PendingEscalation[]>;
73
+ /**
74
+ * Mark an escalation as resolved with optional notes.
75
+ */
76
+ export declare function markEscalationResolved(escalationId: string, resolutionNotes?: string): Promise<void>;
36
77
  /**
37
78
  * Create an issue on a delivery (for create_issue trigger action).
38
79
  */
@@ -1 +1 @@
1
- {"version":3,"file":"issues.d.ts","sourceRoot":"","sources":["../../src/queries/issues.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAIL,mBAAmB,EACpB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,KAAK,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEpD;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAO/E;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAOjF;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAYtF;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAUpF;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,GAAG,IAAI,EAC1B,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GAAG,IAAI,GACtB,OAAO,CAAC,MAAM,CAAC,CAejB"}
1
+ {"version":3,"file":"issues.d.ts","sourceRoot":"","sources":["../../src/queries/issues.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAIL,mBAAmB,EACpB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,KAAK,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEpD;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAO/E;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAOjF;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAYtF;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAYpF;AAED;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CAC3C;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAqB3E;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,YAAY,EAAE,MAAM,EACpB,eAAe,CAAC,EAAE,MAAM,GACvB,OAAO,CAAC,IAAI,CAAC,CAQf;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,GAAG,IAAI,EAC1B,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GAAG,IAAI,GACtB,OAAO,CAAC,MAAM,CAAC,CAejB"}
@@ -46,6 +46,45 @@ export async function createEscalation(params) {
46
46
  description: params.description,
47
47
  whatWasTried: params.whatWasTried,
48
48
  helpNeeded: params.helpNeeded,
49
+ ...(params.escalationKind ? { escalationKind: params.escalationKind } : {}),
50
+ ...(params.metadata ? { metadata: params.metadata } : {}),
51
+ },
52
+ });
53
+ }
54
+ /**
55
+ * List open (not-yet-resolved) escalations for the organization.
56
+ *
57
+ * Returns rows with status in `('pending', 'in_review')` -- both are
58
+ * "open" from a dedup perspective. An operator may move a stuck-branch
59
+ * escalation to `in_review` while triaging; the merge-back loop must
60
+ * still treat it as suppressing duplicates so it does not file a second
61
+ * `pending` row for the same branch.
62
+ *
63
+ * Used by the merge-back loop to detect when a branch already has an
64
+ * unresolved merge-conflict escalation, and to find existing stuck-branch
65
+ * escalations for dedup / auto-resolution.
66
+ */
67
+ export async function listPendingEscalations() {
68
+ const result = await callApi('escalation_list', { fields: { statuses: ['pending', 'in_review'] } });
69
+ return result.escalations.map((e) => ({
70
+ id: e.id,
71
+ reasonType: e.reasonType,
72
+ description: e.description,
73
+ whatWasTried: e.whatWasTried ?? null,
74
+ helpNeeded: e.helpNeeded ?? null,
75
+ escalationKind: e.escalationKind ?? null,
76
+ metadata: e.metadata ?? null,
77
+ }));
78
+ }
79
+ /**
80
+ * Mark an escalation as resolved with optional notes.
81
+ */
82
+ export async function markEscalationResolved(escalationId, resolutionNotes) {
83
+ await callApi('escalation_update', {
84
+ escalationId,
85
+ fields: {
86
+ status: 'resolved',
87
+ ...(resolutionNotes ? { resolutionNotes } : {}),
49
88
  },
50
89
  });
51
90
  }
@@ -1 +1 @@
1
- {"version":3,"file":"issues.js","sourceRoot":"","sources":["../../src/queries/issues.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EACL,4BAA4B,EAC5B,kCAAkC,EAClC,yBAAyB,GAE1B,MAAM,cAAc,CAAC;AAKtB;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,UAAkB;IACxD,MAAM,MAAM,GAAG,MAAM,gBAAgB,CACnC,YAAY,EACZ,4BAA4B,EAC5B,EAAE,UAAU,EAAE,CACf,CAAC;IACF,OAAO,MAAM,CAAC,MAAM,CAAC;AACvB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,UAAkB;IAC9D,MAAM,MAAM,GAAG,MAAM,gBAAgB,CACnC,mCAAmC,EACnC,kCAAkC,EAClC,EAAE,UAAU,EAAE,CACf,CAAC;IACF,OAAO,MAAM,CAAC,KAAK,CAAC;AACtB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAAe,EAAE,MAAc;IACrE,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,cAAc,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;IACjE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,6EAA6E;QAC7E,IAAI,MAAM,KAAK,MAAM,IAAK,GAAa,CAAC,OAAO,EAAE,QAAQ,CAAC,2BAA2B,CAAC,EAAE,CAAC;YACvF,MAAM,OAAO,CAAC,cAAc,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE,CAAC,CAAC;YAC9E,MAAM,OAAO,CAAC,cAAc,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;YACvE,OAAO;QACT,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAeD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,MAA8B;IACnE,MAAM,OAAO,CAAC,mBAAmB,EAAE;QACjC,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,MAAM,EAAE;YACN,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,UAAU,EAAE,MAAM,CAAC,UAAU;SAC9B;KACF,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,UAAkB,EAClB,KAAa,EACb,WAA0B,EAC1B,SAAiB,EACjB,QAAuB;IAEvB,MAAM,MAAM,GAAG,MAAM,gBAAgB,CACnC,cAAc,EACd,yBAAyB,EACzB;QACE,UAAU;QACV,MAAM,EAAE;YACN,KAAK;YACL,WAAW;YACX,SAAS;YACT,QAAQ,EAAE,QAAQ,IAAI,SAAS;SAChC;KACF,CACF,CAAC;IACF,OAAO,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;AACzB,CAAC"}
1
+ {"version":3,"file":"issues.js","sourceRoot":"","sources":["../../src/queries/issues.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,17 @@ import type { AgentSession } from '../types.js';
7
7
  * Used by crash recovery to reconcile worktrees against DB state.
8
8
  */
9
9
  export declare function getActiveSessions(productId?: string): Promise<AgentSession[]>;
10
+ /**
11
+ * Return the first active/starting session for a given focus, or null.
12
+ *
13
+ * Used by worktree-state.ts to gate "is the worktree being written?" — if an
14
+ * agent_sessions row for this focus is still in an active/starting status,
15
+ * the worktree is considered live.
16
+ */
17
+ export declare function getActiveSessionForFocus(focusId: string): Promise<{
18
+ id: string;
19
+ status: string;
20
+ } | null>;
10
21
  /**
11
22
  * Aggregate counters for completed sessions scoped to this product.
12
23
  * Used to bootstrap heartbeat counters on startup.
@@ -1 +1 @@
1
- {"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../../src/queries/sessions.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAwChD;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAOnF;AAED;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,6BAA6B,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAWjG;AAED;;GAEG;AACH,wBAAsB,2BAA2B,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAM1G;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,WAAW,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;CACnC;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,YAAY,CAAC,CAoBtF;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC,GACD,OAAO,CAAC,YAAY,CAAC,CA6BvB"}
1
+ {"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../../src/queries/sessions.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAwChD;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAOnF;AAaD;;;;;;GAMG;AACH,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,MAAM,GACd,OAAO,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAShD;AAED;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,6BAA6B,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAWjG;AAED;;GAEG;AACH,wBAAsB,2BAA2B,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAM1G;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,WAAW,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;CACnC;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,YAAY,CAAC,CAoBtF;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC,GACD,OAAO,CAAC,YAAY,CAAC,CA6BvB"}
@@ -36,6 +36,34 @@ export async function getActiveSessions(productId) {
36
36
  const result = await callApiValidated('daemon_get_active_sessions', ActiveSessionsResponseSchema, productId ? { productId } : undefined);
37
37
  return (result.sessions || []).map(transformSessionFromApi);
38
38
  }
39
+ /**
40
+ * Active session statuses for worktree-state observation.
41
+ *
42
+ * Note: the daemon API filters getActiveSessions() to 'starting'/'running'
43
+ * server-side, so any row that reaches us here is already "live". This
44
+ * constant is the explicit predicate the worktree-state primitive uses to
45
+ * decide whether a session row represents a writer; we accept the string
46
+ * 'active' as an alias for 'running' for callers that pass in raw rows.
47
+ */
48
+ const ACTIVE_SESSION_STATUSES = ['active', 'starting', 'running'];
49
+ /**
50
+ * Return the first active/starting session for a given focus, or null.
51
+ *
52
+ * Used by worktree-state.ts to gate "is the worktree being written?" — if an
53
+ * agent_sessions row for this focus is still in an active/starting status,
54
+ * the worktree is considered live.
55
+ */
56
+ export async function getActiveSessionForFocus(focusId) {
57
+ const sessions = await getActiveSessions();
58
+ for (const s of sessions) {
59
+ if (s.focus_id !== focusId)
60
+ continue;
61
+ if (ACTIVE_SESSION_STATUSES.includes(s.status)) {
62
+ return { id: s.id, status: s.status };
63
+ }
64
+ }
65
+ return null;
66
+ }
39
67
  export async function getCompletedSessionAggregates(productId) {
40
68
  const result = await callApiValidated('daemon_get_session_aggregates', SessionAggregatesResponseSchema, { productId });
41
69
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../src/queries/sessions.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAChF,OAAO,EAEL,4BAA4B,EAC5B,+BAA+B,EAC/B,gCAAgC,EAChC,2BAA2B,EAC3B,2BAA2B,GAC5B,MAAM,cAAc,CAAC;AAKtB,MAAM,uBAAuB,GAAG,eAAe,CAAgC;IAC7E,EAAE,EAAE,IAAI;IACR,eAAe,EAAE,gBAAgB;IACjC,QAAQ,EAAE,SAAS;IACnB,WAAW,EAAE,YAAY;IACzB,QAAQ,EAAE,SAAS;IACnB,aAAa,EAAE,aAAa;IAC5B,WAAW,EAAE,YAAY;IACzB,MAAM,EAAE,OAAO;IACf,MAAM,EAAE,QAAQ;IAChB,WAAW,EAAE,YAAY;IACzB,aAAa,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE;IACtD,SAAS,EAAE,UAAU;IACrB,UAAU,EAAE,WAAW;IACvB,QAAQ,EAAE,SAAS;IACnB,WAAW,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,EAAE;IAC/C,aAAa,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC,EAAE;IACnD,GAAG,EAAE,KAAK;IACV,WAAW,EAAE,YAAY;IACzB,WAAW,EAAE,YAAY;IACzB,UAAU,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,EAAc,EAAE;IAC1D,cAAc,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,EAAc,EAAE;IAClE,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,EAAc,EAAE;IACrD,iBAAiB,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,IAAI,EAAE;CAC9D,CAAC,CAAC;AAEH;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,SAAkB;IACxD,MAAM,MAAM,GAAG,MAAM,gBAAgB,CACnC,4BAA4B,EAC5B,4BAA4B,EAC5B,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,SAAS,CACtC,CAAC;IACF,OAAO,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;AAC9D,CAAC;AAYD,MAAM,CAAC,KAAK,UAAU,6BAA6B,CAAC,SAAiB;IACnE,MAAM,MAAM,GAAG,MAAM,gBAAgB,CACnC,+BAA+B,EAC/B,+BAA+B,EAC/B,EAAE,SAAS,EAAE,CACd,CAAC;IACF,OAAO;QACL,cAAc,EAAE,MAAM,CAAC,cAAc,IAAI,CAAC;QAC1C,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,CAAC;QACpC,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,CAAC;KACjC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAAC,eAAuB;IACvE,MAAM,MAAM,GAAG,MAAM,gBAAgB,CACnC,iCAAiC,EACjC,gCAAgC,CACjC,CAAC;IACF,OAAO,MAAM,CAAC,MAAM,CAAC;AACvB,CAAC;AAgBD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,MAA2B;IAC7D,MAAM,SAAS,GAA4B;QACzC,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,IAAI;QACrC,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,IAAI;QAC/B,UAAU,EAAE,MAAM,CAAC,UAAU;KAC9B,CAAC;IACF,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QACvB,SAAS,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;IAC7C,CAAC;IACD,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;QAC3B,SAAS,CAAC,MAAM,GAAG,EAAE,eAAe,EAAE,MAAM,CAAC,eAAe,EAAE,CAAC;IACjE,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,gBAAgB,CACnC,uBAAuB,EACvB,2BAA2B,EAC3B,SAAS,CACV,CAAC;IACF,OAAO,uBAAuB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AACjD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,SAAiB,EACjB,OAoBE;IAEF,MAAM,MAAM,GAAG,cAAc,CAAC,OAAkC,EAAE;QAChE,MAAM,EAAE,QAAQ;QAChB,WAAW,EAAE,YAAY;QACzB,aAAa,EAAE,cAAc;QAC7B,UAAU,EAAE,WAAW;QACvB,QAAQ,EAAE,SAAS;QACnB,GAAG,EAAE,KAAK;QACV,WAAW,EAAE,YAAY;QACzB,WAAW,EAAE,YAAY;QACzB,WAAW,EAAE,YAAY;QACzB,aAAa,EAAE,cAAc;QAC7B,MAAM,EAAE,OAAO;QACf,UAAU,EAAE,WAAW;QACvB,cAAc,EAAE,eAAe;QAC/B,OAAO,EAAE,SAAS;QAClB,gBAAgB,EAAE,iBAAiB;QACnC,cAAc,EAAE,eAAe;QAC/B,iBAAiB,EAAE,iBAAiB;QACpC,WAAW,EAAE,YAAY;QACzB,aAAa,EAAE,cAAc;KAC9B,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,MAAM,gBAAgB,CACnC,uBAAuB,EACvB,2BAA2B,EAC3B,EAAE,SAAS,EAAE,MAAM,EAAE,CACtB,CAAC;IACF,OAAO,uBAAuB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AACjD,CAAC"}
1
+ {"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../src/queries/sessions.ts"],"names":[],"mappings":"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"}
@@ -7,7 +7,7 @@
7
7
  * without metadata populated.
8
8
  */
9
9
  import type { WorkflowStage, Workflow } from './types.js';
10
- /** Stage where agent team has work to do (e.g., queued, coding). */
10
+ /** Stage where agent team has work to do (e.g., queued, coding, iterating). */
11
11
  export declare function isAgentActionable(stage: WorkflowStage): boolean;
12
12
  /** Truly terminal — no more work ever (e.g., done, cancelled). */
13
13
  export declare function isTerminal(stage: WorkflowStage): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"stage-classifier.d.ts","sourceRoot":"","sources":["../src/stage-classifier.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAI1D,oEAAoE;AACpE,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAG/D;AAED,kEAAkE;AAClE,wBAAgB,UAAU,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAGxD;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAS1D;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAUxD;AAED,sEAAsE;AACtE,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAEnE;AAUD,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,OAAO,CAMpF;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,OAAO,CAM7E;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,OAAO,CAM/E;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,OAAO,CAM7E;AAED,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,OAAO,CAMxF"}
1
+ {"version":3,"file":"stage-classifier.d.ts","sourceRoot":"","sources":["../src/stage-classifier.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAI1D,+EAA+E;AAC/E,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAG/D;AAED,kEAAkE;AAClE,wBAAgB,UAAU,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAGxD;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAS1D;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAUxD;AAED,sEAAsE;AACtE,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAEnE;AAUD,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,OAAO,CAMpF;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,OAAO,CAM7E;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,OAAO,CAM/E;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,OAAO,CAM7E;AAED,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,OAAO,CAMxF"}
@@ -7,11 +7,11 @@
7
7
  * without metadata populated.
8
8
  */
9
9
  // ── Stage-level classifiers ──────────────────────────────────────
10
- /** Stage where agent team has work to do (e.g., queued, coding). */
10
+ /** Stage where agent team has work to do (e.g., queued, coding, iterating). */
11
11
  export function isAgentActionable(stage) {
12
12
  if (stage.is_agent_actionable !== undefined)
13
13
  return stage.is_agent_actionable;
14
- return stage.name === 'queued' || stage.name === 'coding';
14
+ return stage.name === 'queued' || stage.name === 'coding' || stage.name === 'iterating';
15
15
  }
16
16
  /** Truly terminal — no more work ever (e.g., done, cancelled). */
17
17
  export function isTerminal(stage) {
@@ -70,7 +70,7 @@ export function isStatusAgentActionable(status, workflow) {
70
70
  if (stage)
71
71
  return isAgentActionable(stage);
72
72
  }
73
- return status === 'queued' || status === 'coding';
73
+ return status === 'queued' || status === 'coding' || status === 'iterating';
74
74
  }
75
75
  export function isStatusTerminal(status, workflow) {
76
76
  if (workflow) {
@@ -1 +1 @@
1
- {"version":3,"file":"stage-classifier.js","sourceRoot":"","sources":["../src/stage-classifier.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"stage-classifier.js","sourceRoot":"","sources":["../src/stage-classifier.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Worktree write-state observation.
3
+ *
4
+ * Pure-observation helper that consolidates the four signals indicating
5
+ * whether a focus's worktree is currently being written to:
6
+ *
7
+ * 1. an in-memory focus team is active (phase not in shutting_down/terminated)
8
+ * 2. an agent_sessions DB row for the focus is in an active/starting status
9
+ * 3. a recent commit has landed on HEAD within a configurable threshold
10
+ * 4. the worktree is dirty (uncommitted changes)
11
+ *
12
+ * Used by the continuous merge-back loop to gate "is it safe to attempt
13
+ * merge right now?". Pure observation — no side effects, no mutations.
14
+ */
15
+ export interface WorktreeWriteReason {
16
+ code: string;
17
+ message: string;
18
+ }
19
+ export interface WorktreeWriteSignal {
20
+ active: boolean;
21
+ reason: WorktreeWriteReason | null;
22
+ }
23
+ export interface WorktreeStateDeps {
24
+ hasActiveTeam: (focusId: string) => boolean;
25
+ getActiveTeamPhase: (focusId: string) => string | null;
26
+ getFocusWorktree: (focusId: string) => {
27
+ worktreePath: string;
28
+ branchName: string;
29
+ } | undefined;
30
+ getActiveSessionForFocus: (focusId: string) => Promise<{
31
+ id: string;
32
+ status: string;
33
+ } | null>;
34
+ worktreeHasUncommittedChanges: (worktreePath: string) => boolean;
35
+ getLastCommitTimestampMs: (worktreePath: string) => number | null;
36
+ now: () => number;
37
+ }
38
+ /**
39
+ * Observe whether a focus's worktree is currently being written.
40
+ *
41
+ * Returns a signal containing `active: true` plus the first matching reason,
42
+ * or `active: false` with `reason: null` when no writer is detected. The
43
+ * `no_worktree` case is reported as `active: false` with a non-null reason
44
+ * so callers can distinguish "no writer because nothing exists yet" from
45
+ * "no writer because everything is quiescent".
46
+ *
47
+ * Order of checks (returns on first hit):
48
+ * 1. in-memory active team (non-terminal phase) -> active_team
49
+ * 2. no persistent worktree -> { active: false, no_worktree }
50
+ * 3. DB session row in active/starting status -> active_session
51
+ * 4. recent commit within threshold -> recent_commit
52
+ * 5. dirty worktree -> dirty_worktree
53
+ * 6. otherwise -> { active: false, null }
54
+ */
55
+ export declare function isWorktreeBeingWritten(focusId: string, opts?: {
56
+ recentCommitThresholdMs?: number;
57
+ }, deps?: Partial<WorktreeStateDeps>): Promise<WorktreeWriteSignal>;
58
+ //# sourceMappingURL=worktree-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktree-state.d.ts","sourceRoot":"","sources":["../src/worktree-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAQH,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,mBAAmB,GAAG,IAAI,CAAC;CACpC;AAED,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;IAC5C,kBAAkB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IACvD,gBAAgB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;IAChG,wBAAwB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;IAC9F,6BAA6B,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC;IACjE,wBAAwB,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IAClE,GAAG,EAAE,MAAM,MAAM,CAAC;CACnB;AAoCD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,MAAM,EACf,IAAI,GAAE;IAAE,uBAAuB,CAAC,EAAE,MAAM,CAAA;CAAO,EAC/C,IAAI,GAAE,OAAO,CAAC,iBAAiB,CAAM,GACpC,OAAO,CAAC,mBAAmB,CAAC,CAmE9B"}
@@ -0,0 +1,135 @@
1
+ /**
2
+ * Worktree write-state observation.
3
+ *
4
+ * Pure-observation helper that consolidates the four signals indicating
5
+ * whether a focus's worktree is currently being written to:
6
+ *
7
+ * 1. an in-memory focus team is active (phase not in shutting_down/terminated)
8
+ * 2. an agent_sessions DB row for the focus is in an active/starting status
9
+ * 3. a recent commit has landed on HEAD within a configurable threshold
10
+ * 4. the worktree is dirty (uncommitted changes)
11
+ *
12
+ * Used by the continuous merge-back loop to gate "is it safe to attempt
13
+ * merge right now?". Pure observation — no side effects, no mutations.
14
+ */
15
+ import { hasActiveTeam, getActiveTeams } from './focus-team-state.js';
16
+ import { getFocusWorktree } from './focus-worktree-state.js';
17
+ import { worktreeHasUncommittedChanges } from './worktree-safety.js';
18
+ import { runGitSync } from './git-types.js';
19
+ import { getActiveSessionForFocus } from './queries/sessions.js';
20
+ const DEFAULT_RECENT_COMMIT_THRESHOLD_MS = 30_000;
21
+ /**
22
+ * Read the unix-epoch milliseconds timestamp of the worktree's HEAD commit.
23
+ * Returns null on any failure (git error, non-numeric output, missing repo).
24
+ */
25
+ function defaultGetLastCommitTimestampMs(worktreePath) {
26
+ try {
27
+ const result = runGitSync(['log', '-1', '--format=%ct', 'HEAD'], worktreePath);
28
+ if (!result.success)
29
+ return null;
30
+ const trimmed = result.output.trim();
31
+ if (trimmed.length === 0)
32
+ return null;
33
+ const seconds = Number.parseInt(trimmed, 10);
34
+ if (!Number.isFinite(seconds) || Number.isNaN(seconds))
35
+ return null;
36
+ return seconds * 1000;
37
+ }
38
+ catch {
39
+ return null;
40
+ }
41
+ }
42
+ const defaultDeps = {
43
+ hasActiveTeam,
44
+ getActiveTeamPhase: (focusId) => getActiveTeams().get(focusId)?.phase ?? null,
45
+ getFocusWorktree: (focusId) => {
46
+ const info = getFocusWorktree(focusId);
47
+ if (!info)
48
+ return undefined;
49
+ return { worktreePath: info.worktreePath, branchName: info.branchName };
50
+ },
51
+ getActiveSessionForFocus,
52
+ worktreeHasUncommittedChanges,
53
+ getLastCommitTimestampMs: defaultGetLastCommitTimestampMs,
54
+ now: () => Date.now(),
55
+ };
56
+ /**
57
+ * Observe whether a focus's worktree is currently being written.
58
+ *
59
+ * Returns a signal containing `active: true` plus the first matching reason,
60
+ * or `active: false` with `reason: null` when no writer is detected. The
61
+ * `no_worktree` case is reported as `active: false` with a non-null reason
62
+ * so callers can distinguish "no writer because nothing exists yet" from
63
+ * "no writer because everything is quiescent".
64
+ *
65
+ * Order of checks (returns on first hit):
66
+ * 1. in-memory active team (non-terminal phase) -> active_team
67
+ * 2. no persistent worktree -> { active: false, no_worktree }
68
+ * 3. DB session row in active/starting status -> active_session
69
+ * 4. recent commit within threshold -> recent_commit
70
+ * 5. dirty worktree -> dirty_worktree
71
+ * 6. otherwise -> { active: false, null }
72
+ */
73
+ export async function isWorktreeBeingWritten(focusId, opts = {}, deps = {}) {
74
+ const d = { ...defaultDeps, ...deps };
75
+ const thresholdMs = opts.recentCommitThresholdMs ?? DEFAULT_RECENT_COMMIT_THRESHOLD_MS;
76
+ // 1. In-memory active team
77
+ if (d.hasActiveTeam(focusId)) {
78
+ const phase = d.getActiveTeamPhase(focusId);
79
+ if (phase !== null && phase !== 'shutting_down' && phase !== 'terminated') {
80
+ return {
81
+ active: true,
82
+ reason: {
83
+ code: 'active_team',
84
+ message: `in-memory team phase=${phase}`,
85
+ },
86
+ };
87
+ }
88
+ }
89
+ // 2. No persistent worktree
90
+ const worktree = d.getFocusWorktree(focusId);
91
+ if (!worktree) {
92
+ return {
93
+ active: false,
94
+ reason: { code: 'no_worktree', message: 'focus has no worktree' },
95
+ };
96
+ }
97
+ // 3. Active DB session for this focus
98
+ const session = await d.getActiveSessionForFocus(focusId);
99
+ if (session && (session.status === 'active' || session.status === 'starting')) {
100
+ return {
101
+ active: true,
102
+ reason: {
103
+ code: 'active_session',
104
+ message: `agent_sessions row ${session.id} is status=${session.status}`,
105
+ },
106
+ };
107
+ }
108
+ // 4. Recent commit
109
+ const lastCommitMs = d.getLastCommitTimestampMs(worktree.worktreePath);
110
+ if (lastCommitMs !== null) {
111
+ const ageMs = d.now() - lastCommitMs;
112
+ if (ageMs >= 0 && ageMs <= thresholdMs) {
113
+ return {
114
+ active: true,
115
+ reason: {
116
+ code: 'recent_commit',
117
+ message: `last commit ${ageMs}ms ago`,
118
+ },
119
+ };
120
+ }
121
+ }
122
+ // 5. Dirty worktree
123
+ if (d.worktreeHasUncommittedChanges(worktree.worktreePath)) {
124
+ return {
125
+ active: true,
126
+ reason: {
127
+ code: 'dirty_worktree',
128
+ message: 'git status --porcelain non-empty',
129
+ },
130
+ };
131
+ }
132
+ // 6. Quiescent
133
+ return { active: false, reason: null };
134
+ }
135
+ //# sourceMappingURL=worktree-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktree-state.js","sourceRoot":"","sources":["../src/worktree-state.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@telora/daemon",
3
- "version": "0.15.26",
3
+ "version": "0.15.27",
4
4
  "description": "Agent orchestration daemon for Telora - spawns and manages Claude Code instances",
5
5
  "type": "module",
6
6
  "bin": {