crewly 1.20.289 → 1.20.291

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 (142) hide show
  1. package/config/domain-sops/expert-distillation.sop.md +45 -45
  2. package/dist/backend/backend/src/constants.d.ts +4 -4
  3. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  4. package/dist/backend/backend/src/constants.js +21 -21
  5. package/dist/backend/backend/src/constants.js.map +1 -1
  6. package/dist/backend/backend/src/controllers/bundle/bundle.controller.js +1 -1
  7. package/dist/backend/backend/src/controllers/bundle/bundle.controller.js.map +1 -1
  8. package/dist/backend/backend/src/controllers/chat/agent-reply.controller.d.ts.map +1 -1
  9. package/dist/backend/backend/src/controllers/chat/agent-reply.controller.js +5 -0
  10. package/dist/backend/backend/src/controllers/chat/agent-reply.controller.js.map +1 -1
  11. package/dist/backend/backend/src/index.d.ts.map +1 -1
  12. package/dist/backend/backend/src/index.js +18 -12
  13. package/dist/backend/backend/src/index.js.map +1 -1
  14. package/dist/backend/backend/src/services/agent/active-work-briefing.service.d.ts +11 -0
  15. package/dist/backend/backend/src/services/agent/active-work-briefing.service.d.ts.map +1 -1
  16. package/dist/backend/backend/src/services/agent/active-work-briefing.service.js +32 -11
  17. package/dist/backend/backend/src/services/agent/active-work-briefing.service.js.map +1 -1
  18. package/dist/backend/backend/src/services/agent/follow-through.service.d.ts +132 -0
  19. package/dist/backend/backend/src/services/agent/follow-through.service.d.ts.map +1 -0
  20. package/dist/backend/backend/src/services/agent/follow-through.service.js +199 -0
  21. package/dist/backend/backend/src/services/agent/follow-through.service.js.map +1 -0
  22. package/dist/backend/backend/src/services/agent/follow-through.wiring.d.ts +62 -0
  23. package/dist/backend/backend/src/services/agent/follow-through.wiring.d.ts.map +1 -0
  24. package/dist/backend/backend/src/services/agent/follow-through.wiring.js +158 -0
  25. package/dist/backend/backend/src/services/agent/follow-through.wiring.js.map +1 -0
  26. package/dist/backend/backend/src/services/agent/idle-detection.service.d.ts +24 -6
  27. package/dist/backend/backend/src/services/agent/idle-detection.service.d.ts.map +1 -1
  28. package/dist/backend/backend/src/services/agent/idle-detection.service.js +46 -11
  29. package/dist/backend/backend/src/services/agent/idle-detection.service.js.map +1 -1
  30. package/dist/backend/backend/src/services/agent/idle-work-guard.d.ts +61 -0
  31. package/dist/backend/backend/src/services/agent/idle-work-guard.d.ts.map +1 -0
  32. package/dist/backend/backend/src/services/agent/idle-work-guard.js +81 -0
  33. package/dist/backend/backend/src/services/agent/idle-work-guard.js.map +1 -0
  34. package/dist/backend/backend/src/services/agent/stated-intent.d.ts +55 -0
  35. package/dist/backend/backend/src/services/agent/stated-intent.d.ts.map +1 -0
  36. package/dist/backend/backend/src/services/agent/stated-intent.js +142 -0
  37. package/dist/backend/backend/src/services/agent/stated-intent.js.map +1 -0
  38. package/dist/backend/backend/src/services/bundle/bundle-apply.service.js +45 -45
  39. package/dist/backend/backend/src/services/bundle/bundle-apply.service.js.map +1 -1
  40. package/dist/backend/backend/src/services/bundle/bundle-placeholders.js +7 -7
  41. package/dist/backend/backend/src/services/bundle/bundle-placeholders.js.map +1 -1
  42. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +3 -3
  43. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +19 -19
  44. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
  45. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.d.ts +1 -1
  46. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.js +1 -1
  47. package/dist/backend/backend/src/services/messaging/owner-message-watchdog.wiring.js +2 -2
  48. package/dist/backend/backend/src/services/messaging/owner-message-watchdog.wiring.js.map +1 -1
  49. package/dist/backend/backend/src/services/messaging/owner-thread-sentinel.service.d.ts +10 -0
  50. package/dist/backend/backend/src/services/messaging/owner-thread-sentinel.service.d.ts.map +1 -1
  51. package/dist/backend/backend/src/services/messaging/owner-thread-sentinel.service.js +25 -0
  52. package/dist/backend/backend/src/services/messaging/owner-thread-sentinel.service.js.map +1 -1
  53. package/dist/backend/backend/src/services/monitoring/agent-turn-state.d.ts +16 -0
  54. package/dist/backend/backend/src/services/monitoring/agent-turn-state.d.ts.map +1 -1
  55. package/dist/backend/backend/src/services/monitoring/agent-turn-state.js +31 -0
  56. package/dist/backend/backend/src/services/monitoring/agent-turn-state.js.map +1 -1
  57. package/dist/backend/backend/src/services/onboarding/onboarding-checklist.service.js +1 -1
  58. package/dist/backend/backend/src/services/onboarding/onboarding-checklist.service.js.map +1 -1
  59. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js +1 -1
  60. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  61. package/dist/backend/backend/src/services/slack/slack-thread-context.service.js +1 -1
  62. package/dist/backend/backend/src/services/slack/slack-thread-context.service.js.map +1 -1
  63. package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  64. package/dist/backend/backend/src/services/task-pool/task-pool.service.js +2 -2
  65. package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  66. package/dist/backend/backend/src/services/v3/ticket-channel-hooks.d.ts +3 -3
  67. package/dist/backend/backend/src/services/v3/ticket-channel-hooks.js +7 -7
  68. package/dist/backend/backend/src/services/v3/ticket-channel-hooks.js.map +1 -1
  69. package/dist/backend/backend/src/services/v3/ticket-intake.service.d.ts +2 -2
  70. package/dist/backend/backend/src/services/v3/ticket-intake.service.js +1 -1
  71. package/dist/backend/backend/src/services/v3/ticket-review.service.d.ts.map +1 -1
  72. package/dist/backend/backend/src/services/v3/ticket-review.service.js +10 -5
  73. package/dist/backend/backend/src/services/v3/ticket-review.service.js.map +1 -1
  74. package/dist/backend/backend/src/services/v3/ticket-work-guard.d.ts +81 -0
  75. package/dist/backend/backend/src/services/v3/ticket-work-guard.d.ts.map +1 -0
  76. package/dist/backend/backend/src/services/v3/ticket-work-guard.js +122 -0
  77. package/dist/backend/backend/src/services/v3/ticket-work-guard.js.map +1 -0
  78. package/dist/backend/backend/src/utils/incomplete-turn.utils.js +6 -6
  79. package/dist/backend/backend/src/utils/incomplete-turn.utils.js.map +1 -1
  80. package/dist/backend/build-info.json +2 -2
  81. package/dist/cli/backend/src/constants.d.ts +4 -4
  82. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  83. package/dist/cli/backend/src/constants.js +21 -21
  84. package/dist/cli/backend/src/constants.js.map +1 -1
  85. package/dist/cli/backend/src/services/agent/active-work-briefing.service.d.ts +11 -0
  86. package/dist/cli/backend/src/services/agent/active-work-briefing.service.d.ts.map +1 -1
  87. package/dist/cli/backend/src/services/agent/active-work-briefing.service.js +32 -11
  88. package/dist/cli/backend/src/services/agent/active-work-briefing.service.js.map +1 -1
  89. package/dist/cli/backend/src/services/agent/follow-through.service.d.ts +132 -0
  90. package/dist/cli/backend/src/services/agent/follow-through.service.d.ts.map +1 -0
  91. package/dist/cli/backend/src/services/agent/follow-through.service.js +199 -0
  92. package/dist/cli/backend/src/services/agent/follow-through.service.js.map +1 -0
  93. package/dist/cli/backend/src/services/agent/stated-intent.d.ts +55 -0
  94. package/dist/cli/backend/src/services/agent/stated-intent.d.ts.map +1 -0
  95. package/dist/cli/backend/src/services/agent/stated-intent.js +142 -0
  96. package/dist/cli/backend/src/services/agent/stated-intent.js.map +1 -0
  97. package/dist/cli/backend/src/services/bundle/bundle-apply.service.js +45 -45
  98. package/dist/cli/backend/src/services/bundle/bundle-apply.service.js.map +1 -1
  99. package/dist/cli/backend/src/services/bundle/bundle-placeholders.js +7 -7
  100. package/dist/cli/backend/src/services/bundle/bundle-placeholders.js.map +1 -1
  101. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +3 -3
  102. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +19 -19
  103. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
  104. package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.d.ts +1 -1
  105. package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.js +1 -1
  106. package/dist/cli/backend/src/services/messaging/owner-thread-sentinel.service.d.ts +10 -0
  107. package/dist/cli/backend/src/services/messaging/owner-thread-sentinel.service.d.ts.map +1 -1
  108. package/dist/cli/backend/src/services/messaging/owner-thread-sentinel.service.js +25 -0
  109. package/dist/cli/backend/src/services/messaging/owner-thread-sentinel.service.js.map +1 -1
  110. package/dist/cli/backend/src/services/monitoring/agent-turn-state.d.ts +16 -0
  111. package/dist/cli/backend/src/services/monitoring/agent-turn-state.d.ts.map +1 -1
  112. package/dist/cli/backend/src/services/monitoring/agent-turn-state.js +31 -0
  113. package/dist/cli/backend/src/services/monitoring/agent-turn-state.js.map +1 -1
  114. package/dist/cli/backend/src/services/onboarding/onboarding-checklist.service.js +1 -1
  115. package/dist/cli/backend/src/services/onboarding/onboarding-checklist.service.js.map +1 -1
  116. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js +1 -1
  117. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  118. package/dist/cli/backend/src/services/slack/slack-thread-context.service.js +1 -1
  119. package/dist/cli/backend/src/services/slack/slack-thread-context.service.js.map +1 -1
  120. package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  121. package/dist/cli/backend/src/services/task-pool/task-pool.service.js +2 -2
  122. package/dist/cli/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  123. package/dist/cli/backend/src/services/v3/ticket-channel-hooks.d.ts +3 -3
  124. package/dist/cli/backend/src/services/v3/ticket-channel-hooks.js +7 -7
  125. package/dist/cli/backend/src/services/v3/ticket-channel-hooks.js.map +1 -1
  126. package/dist/cli/backend/src/services/v3/ticket-intake.service.d.ts +2 -2
  127. package/dist/cli/backend/src/services/v3/ticket-intake.service.js +1 -1
  128. package/dist/cli/backend/src/services/v3/ticket-review.service.d.ts.map +1 -1
  129. package/dist/cli/backend/src/services/v3/ticket-review.service.js +10 -5
  130. package/dist/cli/backend/src/services/v3/ticket-review.service.js.map +1 -1
  131. package/dist/cli/backend/src/services/v3/ticket-work-guard.d.ts +81 -0
  132. package/dist/cli/backend/src/services/v3/ticket-work-guard.d.ts.map +1 -0
  133. package/dist/cli/backend/src/services/v3/ticket-work-guard.js +122 -0
  134. package/dist/cli/backend/src/services/v3/ticket-work-guard.js.map +1 -0
  135. package/dist/cli/backend/src/utils/incomplete-turn.utils.js +6 -6
  136. package/dist/cli/backend/src/utils/incomplete-turn.utils.js.map +1 -1
  137. package/dist/cli/cli/src/commands/deploy-bundle.js +4 -4
  138. package/dist/cli/cli/src/commands/deploy-bundle.js.map +1 -1
  139. package/dist/cli/cli/src/commands/onboard.js +1 -1
  140. package/dist/cli/cli/src/commands/onboard.js.map +1 -1
  141. package/package.json +1 -1
  142. package/packages/crewly-agent/src/runtime/reply-tool-calls.ts +0 -3
@@ -0,0 +1,158 @@
1
+ /**
2
+ * Wiring for the follow-through guard, the ticket work guard and the idle
3
+ * work guard onto the real backend services. Kept apart from the services so
4
+ * their logic stays transport-free (and testable).
5
+ *
6
+ * @module services/agent/follow-through.wiring
7
+ * @see specs/2026-10-10-agent-follow-through.md
8
+ */
9
+ import { PROJECT_TICKET_CONSTANTS } from '../../constants.js';
10
+ import { createWorkItem } from '../../types/v2/work-item.types.js';
11
+ import { LoggerService } from '../core/logger.service.js';
12
+ import { RequestService } from '../v3/request.service.js';
13
+ import { getTicketReviewService } from '../v3/ticket-review.service.js';
14
+ import { ensureTicketWorkItems } from '../v3/ticket-work-guard.js';
15
+ import { TaskPoolService } from '../task-pool/task-pool.service.js';
16
+ import { DecisionStore, PENDING_DECISION_STATUSES } from '../decisions/decision-store.js';
17
+ import { getOwnerThreadSentinel } from '../messaging/owner-thread-sentinel.service.js';
18
+ import { AgentTurnStateService } from '../monitoring/agent-turn-state.js';
19
+ import { isOwnerStopped } from './owner-stopped.registry.js';
20
+ import { pausedTeamOfSession } from '../team/team-pause.registry.js';
21
+ import { PtyActivityTrackerService } from './pty-activity-tracker.service.js';
22
+ import { AgentFollowThroughService, getFollowThrough, setFollowThrough } from './follow-through.service.js';
23
+ import { holdReasonFor, releaseHeldWork } from './idle-work-guard.js';
24
+ const logger = LoggerService.getInstance().createComponentLogger('FollowThroughWiring');
25
+ /**
26
+ * Whether the agent handed the work off or put it on the pool since `since`:
27
+ * a WorkItem created after that for itself (tracked), or one it delegated to
28
+ * a teammate (`delegatedBy` / `createdBy` / the project-ticket caller stamp).
29
+ *
30
+ * @param items - Pool items
31
+ * @param session - The agent
32
+ * @param since - Epoch ms
33
+ * @returns True when something covers the statement
34
+ */
35
+ export function handedOffSince(items, session, since) {
36
+ return items.some((wi) => {
37
+ if (Date.parse(wi.createdAt) < since)
38
+ return false;
39
+ if (wi.target === session)
40
+ return true;
41
+ const m = (wi.metadata ?? {});
42
+ return m['delegatedBy'] === session || m['createdBy'] === session || m[PROJECT_TICKET_CONSTANTS.DELEGATION_CALLER_METADATA_KEY] === session;
43
+ });
44
+ }
45
+ /**
46
+ * Build the guard on the real services and expose it as the singleton.
47
+ * `CREWLY_FOLLOW_THROUGH=off` switches it off (nothing tracked, no nudges).
48
+ *
49
+ * @param deps - Seams
50
+ * @returns The guard, or null when switched off
51
+ */
52
+ export function createFollowThrough(deps) {
53
+ if ((process.env['CREWLY_FOLLOW_THROUGH'] ?? '').trim().toLowerCase() === 'off')
54
+ return null;
55
+ const turnState = AgentTurnStateService.getInstance();
56
+ const tracker = PtyActivityTrackerService.getInstance();
57
+ const service = new AgentFollowThroughService({
58
+ nudgeAgent: async (session, text) => (await deps.sendToAgent(session, text)).success,
59
+ toolStartsSince: (session, since) => turnState.toolStartsSince(session, since),
60
+ runtimeStartedAt: (session) => turnState.runtimeStartedAt(session),
61
+ outputSpanSince: (session, since) => {
62
+ if (!tracker.hasActivity(session))
63
+ return null;
64
+ return Math.max(0, Date.now() - tracker.getIdleTimeMs(session) - since);
65
+ },
66
+ handedOff: async (session, since) => handedOffSince(await TaskPoolService.getInstance().getAllItems(), session, since),
67
+ waitingOnOwner: async (session) => {
68
+ const open = await DecisionStore.inHome(deps.crewlyHome).list((d) => d.asker === session && !d.system && PENDING_DECISION_STATUSES.has(d.status));
69
+ return open.length > 0;
70
+ },
71
+ isHeldBack: (session) => isOwnerStopped(session) || !!pausedTeamOfSession(session),
72
+ });
73
+ setFollowThrough(service);
74
+ return service;
75
+ }
76
+ const settling = new Set();
77
+ /**
78
+ * End of an agent's turn: nudge a stated intent nothing followed, give an
79
+ * unanswered owner ticket a WorkItem, then (the caller) submit answered
80
+ * tickets. Order matters: the WorkItem exists before the review looks.
81
+ * Never throws.
82
+ *
83
+ * @param session - Agent whose turn ended
84
+ */
85
+ export async function settleFollowThrough(session) {
86
+ if (settling.has(session))
87
+ return;
88
+ settling.add(session);
89
+ try {
90
+ const guard = getFollowThrough();
91
+ await guard?.onTurnEnd(session);
92
+ const pool = TaskPoolService.getInstance();
93
+ const created = await ensureTicketWorkItems(session, {
94
+ listTickets: () => RequestService.getInstance().listAll(),
95
+ listWorkItems: () => pool.getAllItems(),
96
+ addWorkItem: (wi, creator) => pool.addToPool(wi, { creatorSession: creator }),
97
+ setChecklist: async (ticketId, items) => getTicketReviewService()?.setAcceptance(ticketId, items),
98
+ holdsIntent: (agent) => guard?.holdsIntent(agent) ?? false,
99
+ lastRealReplyAt: (agent) => guard?.lastRealReplyAt(agent),
100
+ });
101
+ for (const c of created)
102
+ logger.info('Owner request had no WorkItem — created one for its assignee', { agent: session, ...c });
103
+ }
104
+ catch (err) {
105
+ logger.debug('Follow-through settle failed (non-fatal)', { session, error: err instanceof Error ? err.message : String(err) });
106
+ }
107
+ finally {
108
+ settling.delete(session);
109
+ }
110
+ }
111
+ /** Seams of the idle work guard on the real services. */
112
+ export function idleWorkGuardDeps() {
113
+ return {
114
+ listWorkItems: () => TaskPoolService.getInstance().getAllItems(),
115
+ listTickets: () => RequestService.getInstance().listAll(),
116
+ owesOwner: (session) => getOwnerThreadSentinel()?.owesOwner(session) ?? false,
117
+ holdsIntent: (session) => getFollowThrough()?.holdsIntent(session) ?? false,
118
+ };
119
+ }
120
+ /** The idle check's pending-work check on the real services. */
121
+ export function idlePendingWorkCheck() {
122
+ return (session) => holdReasonFor(session, idleWorkGuardDeps());
123
+ }
124
+ /** Seams of the work release on the real services. */
125
+ export function releaseWorkDeps() {
126
+ const pool = TaskPoolService.getInstance();
127
+ return {
128
+ listWorkItems: () => pool.getAllItems(),
129
+ releaseBack: (id, reason) => pool.releaseBack(id, reason),
130
+ parkIntent: async (session) => {
131
+ const intent = getFollowThrough()?.takeIntent(session);
132
+ if (!intent)
133
+ return null;
134
+ const wi = createWorkItem({
135
+ type: 'delegate',
136
+ owner: 'system',
137
+ target: session,
138
+ title: `Follow through: ${intent.sentence.slice(0, 70)}`,
139
+ description: `You told the owner: "${intent.sentence}". Crewly stopped you (memory) before you started it. ` +
140
+ 'Start it now; reply to the owner when there is a result or a real blocker.',
141
+ metadata: { harnessCreated: 'stated-intent' },
142
+ });
143
+ await pool.addToPool(wi, { creatorSession: session });
144
+ return wi.id;
145
+ },
146
+ };
147
+ }
148
+ /**
149
+ * Release what a stopping agent holds (idle stop under pressure, emergency stop).
150
+ *
151
+ * @param session - Agent being stopped
152
+ * @param why - Reason text
153
+ * @returns Ids released or created
154
+ */
155
+ export function releaseWorkForStop(session, why) {
156
+ return releaseHeldWork(session, why, releaseWorkDeps());
157
+ }
158
+ //# sourceMappingURL=follow-through.wiring.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"follow-through.wiring.js","sourceRoot":"","sources":["../../../../../../backend/src/services/agent/follow-through.wiring.ts"],"names":[],"mappings":"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"}
@@ -16,8 +16,17 @@ import type { WorkItemStatus } from '../../types/v2/work-item.types.js';
16
16
  * the whole timeout on a running item is not held up forever.
17
17
  */
18
18
  export declare const PENDING_WORK_STATUSES: ReadonlySet<WorkItemStatus>;
19
- /** Whether an agent has WorkItems waiting for it. */
20
- export type PendingWorkCheck = (sessionName: string) => Promise<boolean>;
19
+ /**
20
+ * Why an agent must be kept alive (a reason string), or false/null when
21
+ * nothing holds it: a WorkItem (queued, accepted or running), an assigned
22
+ * ticket, an owner promise, an unfulfilled "doing X now". See idle-work-guard.ts.
23
+ */
24
+ export type PendingWorkCheck = (sessionName: string) => Promise<boolean | string | null>;
25
+ /**
26
+ * Called before an idle agent is stopped for memory: put the work it holds
27
+ * back in the queue so it is redelivered when the agent starts again.
28
+ */
29
+ export type WorkReleaser = (sessionName: string, why: string) => Promise<unknown>;
21
30
  /**
22
31
  * Periodically scans active agents and suspends those that have been
23
32
  * idle longer than the configured `agentIdleTimeoutMinutes`.
@@ -32,6 +41,7 @@ export declare class IdleDetectionService {
32
41
  private timer;
33
42
  private agentRegistrationService;
34
43
  private pendingWorkCheck;
44
+ private workReleaser;
35
45
  private isChecking;
36
46
  private lastTickStartedAt;
37
47
  private lastTickCompletedAt;
@@ -52,6 +62,13 @@ export declare class IdleDetectionService {
52
62
  * @param check - Check, or null to disable
53
63
  */
54
64
  setPendingWorkCheck(check: PendingWorkCheck | null): void;
65
+ /**
66
+ * Inject the releaser used when memory forces a stop of an agent that
67
+ * still holds work: its running items go back to the queue (same target).
68
+ *
69
+ * @param releaser - Releaser, or null to disable
70
+ */
71
+ setWorkReleaser(releaser: WorkReleaser | null): void;
55
72
  /**
56
73
  * Get the singleton instance.
57
74
  *
@@ -125,13 +142,14 @@ export declare class IdleDetectionService {
125
142
  */
126
143
  performCheck(): Promise<void>;
127
144
  /**
128
- * Whether the agent has WorkItems waiting for it
129
- * ({@link PENDING_WORK_STATUSES}). False when no check is wired or it fails.
145
+ * Why the agent must be kept alive, or null.
130
146
  *
131
147
  * @param sessionName - Agent session
132
- * @returns True when the agent must be kept alive for its work
148
+ * @returns A reason, or null when nothing holds it or the check fails
133
149
  */
134
- private hasPendingWork;
150
+ private holdReason;
151
+ /** Put the work a stopping agent holds back in the queue (best-effort). */
152
+ private releaseWork;
135
153
  /**
136
154
  * Whether an enabled cron task targeting `sessionName` is due within
137
155
  * {@link AGENT_SUSPEND_CONSTANTS.CRON_KEEPALIVE_WINDOW_MINUTES} (an overdue
@@ -1 +1 @@
1
- {"version":3,"file":"idle-detection.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/agent/idle-detection.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAaH,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAChF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAKxE;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,EAAE,WAAW,CAAC,cAAc,CAA+D,CAAC;AAE9H,qDAAqD;AACrD,MAAM,MAAM,gBAAgB,GAAG,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAEzE;;;;;;;GAOG;AACH,qBAAa,oBAAoB;IAChC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAqC;IAC5D,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,KAAK,CAA+C;IAC5D,OAAO,CAAC,wBAAwB,CAAyC;IACzE,OAAO,CAAC,gBAAgB,CAAiC;IAIzD,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,iBAAiB,CAAuB;IAChD,OAAO,CAAC,mBAAmB,CAAuB;IAClD,OAAO,CAAC,kBAAkB,CAAuB;IACjD,OAAO,CAAC,uBAAuB,CAAK;IACpC,OAAO,CAAC,gBAAgB,CAAK;IAE7B,OAAO;IAIP;;;;OAIG;IACH,2BAA2B,CAAC,OAAO,EAAE,wBAAwB,GAAG,IAAI;IAIpE;;;;;OAKG;IACH,mBAAmB,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI,GAAG,IAAI;IAIzD;;;;OAIG;IACH,MAAM,CAAC,WAAW,IAAI,oBAAoB;IAO1C;;OAEG;IACH,MAAM,CAAC,aAAa,IAAI,IAAI;IAO5B;;OAEG;IACH,KAAK,IAAI,IAAI;IAeb;;;;;;;;;;OAUG;IACH,OAAO,CAAC,OAAO;IA2Ef;;;;;OAKG;IACH,QAAQ,IAAI;QACX,SAAS,EAAE,OAAO,CAAC;QACnB,UAAU,EAAE,OAAO,CAAC;QACpB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;QACjC,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;QACnC,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;QAClC,uBAAuB,EAAE,MAAM,CAAC;QAChC,gBAAgB,EAAE,MAAM,CAAC;KACzB;IAYD;;OAEG;IACH,IAAI,IAAI,IAAI;IAQZ;;;;OAIG;IACH,SAAS,IAAI,OAAO;IAIpB,4CAA4C;IAC5C,WAAW,EAAE,MAAM;QAClB,WAAW,EAAE,MAAM,CAAC;QACpB,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,gBAAgB,CAAC,EAAE,OAAO,CAAC;KAC3B,CAAkB;IAEnB;;;;;OAKG;IACH,OAAO,CAAC,aAAa;IAIrB;;;;OAIG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAwNnC;;;;;;OAMG;YACW,cAAc;IAS5B;;;;;;;;OAQG;YACW,kBAAkB;IAehC;;;;;;;;OAQG;IACG,mBAAmB,IAAI,OAAO,CAAC,MAAM,CAAC;CAuE5C"}
1
+ {"version":3,"file":"idle-detection.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/agent/idle-detection.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAaH,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAChF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAKxE;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,EAAE,WAAW,CAAC,cAAc,CAA0E,CAAC;AAEzI;;;;GAIG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,GAAG,MAAM,GAAG,IAAI,CAAC,CAAC;AAEzF;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAElF;;;;;;;GAOG;AACH,qBAAa,oBAAoB;IAChC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAqC;IAC5D,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,KAAK,CAA+C;IAC5D,OAAO,CAAC,wBAAwB,CAAyC;IACzE,OAAO,CAAC,gBAAgB,CAAiC;IACzD,OAAO,CAAC,YAAY,CAA6B;IAIjD,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,iBAAiB,CAAuB;IAChD,OAAO,CAAC,mBAAmB,CAAuB;IAClD,OAAO,CAAC,kBAAkB,CAAuB;IACjD,OAAO,CAAC,uBAAuB,CAAK;IACpC,OAAO,CAAC,gBAAgB,CAAK;IAE7B,OAAO;IAIP;;;;OAIG;IACH,2BAA2B,CAAC,OAAO,EAAE,wBAAwB,GAAG,IAAI;IAIpE;;;;;OAKG;IACH,mBAAmB,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI,GAAG,IAAI;IAIzD;;;;;OAKG;IACH,eAAe,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,GAAG,IAAI;IAIpD;;;;OAIG;IACH,MAAM,CAAC,WAAW,IAAI,oBAAoB;IAO1C;;OAEG;IACH,MAAM,CAAC,aAAa,IAAI,IAAI;IAO5B;;OAEG;IACH,KAAK,IAAI,IAAI;IAeb;;;;;;;;;;OAUG;IACH,OAAO,CAAC,OAAO;IA2Ef;;;;;OAKG;IACH,QAAQ,IAAI;QACX,SAAS,EAAE,OAAO,CAAC;QACnB,UAAU,EAAE,OAAO,CAAC;QACpB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;QACjC,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;QACnC,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;QAClC,uBAAuB,EAAE,MAAM,CAAC;QAChC,gBAAgB,EAAE,MAAM,CAAC;KACzB;IAYD;;OAEG;IACH,IAAI,IAAI,IAAI;IAQZ;;;;OAIG;IACH,SAAS,IAAI,OAAO;IAIpB,4CAA4C;IAC5C,WAAW,EAAE,MAAM;QAClB,WAAW,EAAE,MAAM,CAAC;QACpB,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,gBAAgB,CAAC,EAAE,OAAO,CAAC;KAC3B,CAAkB;IAEnB;;;;;OAKG;IACH,OAAO,CAAC,aAAa;IAIrB;;;;OAIG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAoOnC;;;;;OAKG;YACW,UAAU;IAWxB,2EAA2E;YAC7D,WAAW;IAQzB;;;;;;;;OAQG;YACW,kBAAkB;IAehC;;;;;;;;OAQG;IACG,mBAAmB,IAAI,OAAO,CAAC,MAAM,CAAC;CAyE5C"}
@@ -27,7 +27,7 @@ import { isDriveWarm } from '../drive/drive-keep-warm.js';
27
27
  * `running` item is left to the working-status check — an agent idle for
28
28
  * the whole timeout on a running item is not held up forever.
29
29
  */
30
- export const PENDING_WORK_STATUSES = new Set(['queued', 'proposed', 'accepted']);
30
+ export const PENDING_WORK_STATUSES = new Set(['queued', 'proposed', 'accepted', 'running']);
31
31
  /**
32
32
  * Periodically scans active agents and suspends those that have been
33
33
  * idle longer than the configured `agentIdleTimeoutMinutes`.
@@ -42,6 +42,7 @@ export class IdleDetectionService {
42
42
  timer = null;
43
43
  agentRegistrationService = null;
44
44
  pendingWorkCheck = null;
45
+ workReleaser = null;
45
46
  // Observability: surfaces silent hangs that previously caused the
46
47
  // loop to "stop" for hours with no log evidence (2026-05-14 incident).
47
48
  isChecking = false;
@@ -70,6 +71,15 @@ export class IdleDetectionService {
70
71
  setPendingWorkCheck(check) {
71
72
  this.pendingWorkCheck = check;
72
73
  }
74
+ /**
75
+ * Inject the releaser used when memory forces a stop of an agent that
76
+ * still holds work: its running items go back to the queue (same target).
77
+ *
78
+ * @param releaser - Releaser, or null to disable
79
+ */
80
+ setWorkReleaser(releaser) {
81
+ this.workReleaser = releaser;
82
+ }
73
83
  /**
74
84
  * Get the singleton instance.
75
85
  *
@@ -375,15 +385,27 @@ export class IdleDetectionService {
375
385
  });
376
386
  continue;
377
387
  }
378
- // Never stop an agent with work queued for it (a ticket was
379
- // just assigned and it was started to take it).
380
- if (await this.hasPendingWork(member.sessionName)) {
388
+ // Never stop an agent that owes work (a WorkItem, an assigned
389
+ // ticket, a promise to the owner) — unless the machine is in
390
+ // pressure mode, where memory wins; then the work is put back
391
+ // in the queue first so the next start redelivers it.
392
+ const held = await this.holdReason(member.sessionName);
393
+ if (held && !pressure) {
381
394
  this.logger.info('Agent idle but has queued work, keeping alive', {
382
395
  sessionName: member.sessionName,
383
396
  role: member.role,
397
+ reason: held,
384
398
  });
385
399
  continue;
386
400
  }
401
+ if (held) {
402
+ this.logger.warn('Stopping an idle agent that still owes work (memory pressure) — work is put back in the queue', {
403
+ sessionName: member.sessionName,
404
+ role: member.role,
405
+ reason: held,
406
+ });
407
+ await this.releaseWork(member.sessionName, 'idle stop under memory pressure');
408
+ }
387
409
  // Auto-stop: terminate idle agents to free resources
388
410
  if (this.agentRegistrationService) {
389
411
  this.logger.info('Agent idle timeout reached, stopping', {
@@ -427,20 +449,31 @@ export class IdleDetectionService {
427
449
  }
428
450
  }
429
451
  /**
430
- * Whether the agent has WorkItems waiting for it
431
- * ({@link PENDING_WORK_STATUSES}). False when no check is wired or it fails.
452
+ * Why the agent must be kept alive, or null.
432
453
  *
433
454
  * @param sessionName - Agent session
434
- * @returns True when the agent must be kept alive for its work
455
+ * @returns A reason, or null when nothing holds it or the check fails
435
456
  */
436
- async hasPendingWork(sessionName) {
457
+ async holdReason(sessionName) {
437
458
  if (!this.pendingWorkCheck)
438
- return false;
459
+ return null;
439
460
  try {
440
- return await this.pendingWorkCheck(sessionName);
461
+ const r = await this.pendingWorkCheck(sessionName);
462
+ if (typeof r === 'string')
463
+ return r;
464
+ return r ? 'work' : null;
441
465
  }
442
466
  catch {
443
- return false;
467
+ return null;
468
+ }
469
+ }
470
+ /** Put the work a stopping agent holds back in the queue (best-effort). */
471
+ async releaseWork(sessionName, why) {
472
+ try {
473
+ await this.workReleaser?.(sessionName, why);
474
+ }
475
+ catch {
476
+ /* freeing memory must not depend on it */
444
477
  }
445
478
  }
446
479
  /**
@@ -516,6 +549,8 @@ export class IdleDetectionService {
516
549
  role: member.role,
517
550
  });
518
551
  try {
552
+ // The work it holds survives the stop: back in the queue, redelivered on the next start.
553
+ await this.releaseWork(member.sessionName, 'emergency stop under memory pressure');
519
554
  if (backend && member.sessionName && backend.sessionExists(member.sessionName)) {
520
555
  await backend.killSession(member.sessionName);
521
556
  }
@@ -1 +1 @@
1
- {"version":3,"file":"idle-detection.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/agent/idle-detection.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"idle-detection.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/agent/idle-detection.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * What keeps an idle agent from being stopped, and what happens to its work
3
+ * when memory forces a stop anyway.
4
+ *
5
+ * The idle check used to spare an agent only for (a) a WorkItem waiting for
6
+ * it (queued / proposed / accepted — not `running`) or (b) an owner message
7
+ * or promise from the last 30 minutes. A request that never became a
8
+ * WorkItem, a `running` item, or an assigned ticket protected nothing, so
9
+ * Pia (2026-10-10) was stopped 30 minutes after the owner's message with the
10
+ * owner's three videos still owed.
11
+ *
12
+ * @module services/agent/idle-work-guard
13
+ * @see specs/2026-10-10-agent-follow-through.md
14
+ */
15
+ import type { WorkItem, WorkItemStatus } from '../../types/v2/work-item.types.js';
16
+ import type { Request } from '../../types/v2/request.types.js';
17
+ /** WorkItem statuses that mean "this agent owes this work". */
18
+ export declare const HELD_WORK_STATUSES: ReadonlySet<WorkItemStatus>;
19
+ /** Why an agent must not be idle-stopped. */
20
+ export type HoldReason = 'work_item' | 'ticket' | 'promise' | 'stated_intent';
21
+ /** What the guard reads. */
22
+ export interface IdleWorkGuardDeps {
23
+ listWorkItems: () => Promise<WorkItem[]>;
24
+ listTickets: () => Promise<Request[]>;
25
+ /** An open promise or unanswered owner message in an owner thread */
26
+ owesOwner: (session: string) => boolean;
27
+ /** An unfulfilled "I'm doing X now" */
28
+ holdsIntent: (session: string) => boolean;
29
+ now?: () => number;
30
+ }
31
+ /** Tickets older than this no longer hold an agent (a forgotten ticket must not pin memory forever). */
32
+ export declare const TICKET_HOLD_MAX_AGE_MS: number;
33
+ /**
34
+ * Why `session` must be kept alive, or null when nothing holds it.
35
+ *
36
+ * @param session - Agent session
37
+ * @param deps - Seams
38
+ * @returns The first reason found
39
+ */
40
+ export declare function holdReasonFor(session: string, deps: IdleWorkGuardDeps): Promise<HoldReason | null>;
41
+ /** What {@link releaseHeldWork} needs. */
42
+ export interface ReleaseWorkDeps {
43
+ listWorkItems: () => Promise<WorkItem[]>;
44
+ /** running → queued, owner kept (TaskPoolService.releaseBack) */
45
+ releaseBack: (workItemId: string, reason: string) => Promise<void>;
46
+ /** Turn an unfulfilled "doing X now" into queued work for the agent; returns its id */
47
+ parkIntent?: (session: string) => Promise<string | null>;
48
+ }
49
+ /**
50
+ * The agent is being stopped for memory: put its `running` WorkItems back in
51
+ * the queue (same target) so the reconciler redelivers them when the agent
52
+ * is next started, and park an unfulfilled stated intent as a WorkItem.
53
+ * Never throws.
54
+ *
55
+ * @param session - Agent being stopped
56
+ * @param why - Reason text for the release
57
+ * @param deps - Seams
58
+ * @returns Ids released or created
59
+ */
60
+ export declare function releaseHeldWork(session: string, why: string, deps: ReleaseWorkDeps): Promise<string[]>;
61
+ //# sourceMappingURL=idle-work-guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idle-work-guard.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/agent/idle-work-guard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAClF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iCAAiC,CAAC;AAE/D,+DAA+D;AAC/D,eAAO,MAAM,kBAAkB,EAAE,WAAW,CAAC,cAAc,CAA0E,CAAC;AAKtI,6CAA6C;AAC7C,MAAM,MAAM,UAAU,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,GAAG,eAAe,CAAC;AAE9E,4BAA4B;AAC5B,MAAM,WAAW,iBAAiB;IACjC,aAAa,EAAE,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IACzC,WAAW,EAAE,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACtC,qEAAqE;IACrE,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;IACxC,uCAAuC;IACvC,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;IAC1C,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACnB;AAED,wGAAwG;AACxG,eAAO,MAAM,sBAAsB,QAAmB,CAAC;AAEvD;;;;;;GAMG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAoBxG;AAED,0CAA0C;AAC1C,MAAM,WAAW,eAAe;IAC/B,aAAa,EAAE,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IACzC,iEAAiE;IACjE,WAAW,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACnE,uFAAuF;IACvF,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CACzD;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAkB5G"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * What keeps an idle agent from being stopped, and what happens to its work
3
+ * when memory forces a stop anyway.
4
+ *
5
+ * The idle check used to spare an agent only for (a) a WorkItem waiting for
6
+ * it (queued / proposed / accepted — not `running`) or (b) an owner message
7
+ * or promise from the last 30 minutes. A request that never became a
8
+ * WorkItem, a `running` item, or an assigned ticket protected nothing, so
9
+ * Pia (2026-10-10) was stopped 30 minutes after the owner's message with the
10
+ * owner's three videos still owed.
11
+ *
12
+ * @module services/agent/idle-work-guard
13
+ * @see specs/2026-10-10-agent-follow-through.md
14
+ */
15
+ /** WorkItem statuses that mean "this agent owes this work". */
16
+ export const HELD_WORK_STATUSES = new Set(['queued', 'proposed', 'accepted', 'running']);
17
+ /** Ticket statuses that mean the assignee still owes the owner. */
18
+ const OWED_TICKET_STATUSES = new Set(['open', 'ready', 'running']);
19
+ /** Tickets older than this no longer hold an agent (a forgotten ticket must not pin memory forever). */
20
+ export const TICKET_HOLD_MAX_AGE_MS = 48 * 60 * 60_000;
21
+ /**
22
+ * Why `session` must be kept alive, or null when nothing holds it.
23
+ *
24
+ * @param session - Agent session
25
+ * @param deps - Seams
26
+ * @returns The first reason found
27
+ */
28
+ export async function holdReasonFor(session, deps) {
29
+ if (deps.owesOwner(session))
30
+ return 'promise';
31
+ if (deps.holdsIntent(session))
32
+ return 'stated_intent';
33
+ const items = await deps.listWorkItems();
34
+ if (items.some((wi) => wi.target === session && HELD_WORK_STATUSES.has(wi.status)))
35
+ return 'work_item';
36
+ const now = deps.now ? deps.now() : Date.now();
37
+ const tickets = await deps.listTickets();
38
+ if (tickets.some((t) => typeof t.ticketNumber === 'number' &&
39
+ t.assignee === session &&
40
+ OWED_TICKET_STATUSES.has(t.status) &&
41
+ t.kind !== 'question' &&
42
+ now - Date.parse(t.createdAt) <= TICKET_HOLD_MAX_AGE_MS)) {
43
+ return 'ticket';
44
+ }
45
+ return null;
46
+ }
47
+ /**
48
+ * The agent is being stopped for memory: put its `running` WorkItems back in
49
+ * the queue (same target) so the reconciler redelivers them when the agent
50
+ * is next started, and park an unfulfilled stated intent as a WorkItem.
51
+ * Never throws.
52
+ *
53
+ * @param session - Agent being stopped
54
+ * @param why - Reason text for the release
55
+ * @param deps - Seams
56
+ * @returns Ids released or created
57
+ */
58
+ export async function releaseHeldWork(session, why, deps) {
59
+ const out = [];
60
+ try {
61
+ for (const wi of await deps.listWorkItems()) {
62
+ if (wi.target !== session || wi.status !== 'running')
63
+ continue;
64
+ try {
65
+ await deps.releaseBack(wi.id, why);
66
+ out.push(wi.id);
67
+ }
68
+ catch {
69
+ /* already moved on */
70
+ }
71
+ }
72
+ const parked = await deps.parkIntent?.(session);
73
+ if (parked)
74
+ out.push(parked);
75
+ }
76
+ catch {
77
+ /* best-effort: a failed release must not block freeing memory */
78
+ }
79
+ return out;
80
+ }
81
+ //# sourceMappingURL=idle-work-guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idle-work-guard.js","sourceRoot":"","sources":["../../../../../../backend/src/services/agent/idle-work-guard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAKH,+DAA+D;AAC/D,MAAM,CAAC,MAAM,kBAAkB,GAAgC,IAAI,GAAG,CAAiB,CAAC,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC;AAEtI,mEAAmE;AACnE,MAAM,oBAAoB,GAAwB,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;AAgBxF,wGAAwG;AACxG,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC;AAEvD;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAe,EAAE,IAAuB;IAC3E,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;QAAE,OAAO,SAAS,CAAC;IAC9C,IAAI,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;QAAE,OAAO,eAAe,CAAC;IACtD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;IACzC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,KAAK,OAAO,IAAI,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;QAAE,OAAO,WAAW,CAAC;IACvG,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;IAC/C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;IACzC,IACC,OAAO,CAAC,IAAI,CACX,CAAC,CAAC,EAAE,EAAE,CACL,OAAO,CAAC,CAAC,YAAY,KAAK,QAAQ;QAClC,CAAC,CAAC,QAAQ,KAAK,OAAO;QACtB,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;QAClC,CAAC,CAAC,IAAI,KAAK,UAAU;QACrB,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,sBAAsB,CACxD,EACA,CAAC;QACF,OAAO,QAAQ,CAAC;IACjB,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC;AAWD;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAAe,EAAE,GAAW,EAAE,IAAqB;IACxF,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,IAAI,CAAC;QACJ,KAAK,MAAM,EAAE,IAAI,MAAM,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC;YAC7C,IAAI,EAAE,CAAC,MAAM,KAAK,OAAO,IAAI,EAAE,CAAC,MAAM,KAAK,SAAS;gBAAE,SAAS;YAC/D,IAAI,CAAC;gBACJ,MAAM,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;gBACnC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YACjB,CAAC;YAAC,MAAM,CAAC;gBACR,sBAAsB;YACvB,CAAC;QACF,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,CAAC;QAChD,IAAI,MAAM;YAAE,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACR,iEAAiE;IAClE,CAAC;IACD,OAAO,GAAG,CAAC;AACZ,CAAC"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Stated intent and deliverable extraction (text heuristics, no LLM).
3
+ *
4
+ * `detectStatedIntent` recognises an agent telling the owner it is starting
5
+ * work NOW ("I'm breaking down the shot list now", "next step is X", 「我现在…」,
6
+ * 「做好发你」). It is narrower than the owner-thread sentinel's promise
7
+ * detector on purpose: a promise is any "I'll report back"; a stated intent is
8
+ * "I am doing this right now", which a turn that ends right after it has
9
+ * broken. See specs/2026-10-10-agent-follow-through.md.
10
+ *
11
+ * `extractDeliverables` reads an owner's request for the separate things it
12
+ * asks for (numbered items, 「三个视频」, "one … another …") so partial
13
+ * delivery can be shown ("1 of 3 delivered").
14
+ *
15
+ * @module services/agent/stated-intent
16
+ */
17
+ /** What an agent said it is starting. */
18
+ export interface StatedIntent {
19
+ /** The sentence that says it (clipped) */
20
+ sentence: string;
21
+ }
22
+ /**
23
+ * Whether an agent post says it is starting work now.
24
+ *
25
+ * Returns null for finished-work reports, for text that waits on someone
26
+ * else, and for a post that ends in a question (the agent is asking, not
27
+ * starting).
28
+ *
29
+ * @param text - The agent's post to the owner
30
+ * @returns The stated intent, or null
31
+ *
32
+ * @example
33
+ * ```typescript
34
+ * detectStatedIntent("I'm breaking down the reference shot list now, then building the crab version.");
35
+ * // { sentence: "I'm breaking down the reference shot list now, …" }
36
+ * detectStatedIntent('Done — the video is attached.'); // null
37
+ * ```
38
+ */
39
+ export declare function detectStatedIntent(text: string): StatedIntent | null;
40
+ /** Most checklist items kept for one request. */
41
+ export declare const MAX_DELIVERABLES = 8;
42
+ /**
43
+ * The separate things an owner's request asks for.
44
+ *
45
+ * Order of trust: explicit numbered/bulleted lists, inline "(1) … (2) …" /
46
+ * 「第一…第二…」 / "first … second …", "one … another …" / 「一个…另一个…」, then a
47
+ * bare count ("three videos" → three items). Returns [] when the request asks
48
+ * for one thing (or the shape is unclear): a checklist is only worth showing
49
+ * when partial delivery is possible.
50
+ *
51
+ * @param text - The owner's words
52
+ * @returns 2..{@link MAX_DELIVERABLES} items, or []
53
+ */
54
+ export declare function extractDeliverables(text: string): string[];
55
+ //# sourceMappingURL=stated-intent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stated-intent.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/agent/stated-intent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,yCAAyC;AACzC,MAAM,WAAW,YAAY;IAC3B,0CAA0C;IAC1C,QAAQ,EAAE,MAAM,CAAC;CAClB;AAoBD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAcpE;AAMD,iDAAiD;AACjD,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAiBlC;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CA0C1D"}