crewly 1.20.306 → 1.20.308

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 (126) hide show
  1. package/config/hooks/agent-status/report.sh +39 -1
  2. package/dist/backend/backend/src/constants.d.ts +120 -0
  3. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  4. package/dist/backend/backend/src/constants.js +120 -0
  5. package/dist/backend/backend/src/constants.js.map +1 -1
  6. package/dist/backend/backend/src/controllers/agent-hooks/agent-hooks.controller.d.ts +2 -1
  7. package/dist/backend/backend/src/controllers/agent-hooks/agent-hooks.controller.d.ts.map +1 -1
  8. package/dist/backend/backend/src/controllers/agent-hooks/agent-hooks.controller.js +18 -1
  9. package/dist/backend/backend/src/controllers/agent-hooks/agent-hooks.controller.js.map +1 -1
  10. package/dist/backend/backend/src/controllers/board/board.controller.d.ts +23 -0
  11. package/dist/backend/backend/src/controllers/board/board.controller.d.ts.map +1 -0
  12. package/dist/backend/backend/src/controllers/board/board.controller.js +48 -0
  13. package/dist/backend/backend/src/controllers/board/board.controller.js.map +1 -0
  14. package/dist/backend/backend/src/controllers/board/board.routes.d.ts +15 -0
  15. package/dist/backend/backend/src/controllers/board/board.routes.d.ts.map +1 -0
  16. package/dist/backend/backend/src/controllers/board/board.routes.js +21 -0
  17. package/dist/backend/backend/src/controllers/board/board.routes.js.map +1 -0
  18. package/dist/backend/backend/src/controllers/browser/browser.controller.d.ts.map +1 -1
  19. package/dist/backend/backend/src/controllers/browser/browser.controller.js +2 -0
  20. package/dist/backend/backend/src/controllers/browser/browser.controller.js.map +1 -1
  21. package/dist/backend/backend/src/controllers/chat/chat.controller.d.ts.map +1 -1
  22. package/dist/backend/backend/src/controllers/chat/chat.controller.js +5 -0
  23. package/dist/backend/backend/src/controllers/chat/chat.controller.js.map +1 -1
  24. package/dist/backend/backend/src/controllers/slack/slack.controller.d.ts.map +1 -1
  25. package/dist/backend/backend/src/controllers/slack/slack.controller.js +3 -0
  26. package/dist/backend/backend/src/controllers/slack/slack.controller.js.map +1 -1
  27. package/dist/backend/backend/src/index.d.ts +18 -0
  28. package/dist/backend/backend/src/index.d.ts.map +1 -1
  29. package/dist/backend/backend/src/index.js +172 -2
  30. package/dist/backend/backend/src/index.js.map +1 -1
  31. package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
  32. package/dist/backend/backend/src/routes/api.routes.js +3 -0
  33. package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
  34. package/dist/backend/backend/src/services/board/board-activity.normalizer.d.ts +102 -0
  35. package/dist/backend/backend/src/services/board/board-activity.normalizer.d.ts.map +1 -0
  36. package/dist/backend/backend/src/services/board/board-activity.normalizer.js +244 -0
  37. package/dist/backend/backend/src/services/board/board-activity.normalizer.js.map +1 -0
  38. package/dist/backend/backend/src/services/board/board-activity.tracker.d.ts +159 -0
  39. package/dist/backend/backend/src/services/board/board-activity.tracker.d.ts.map +1 -0
  40. package/dist/backend/backend/src/services/board/board-activity.tracker.js +346 -0
  41. package/dist/backend/backend/src/services/board/board-activity.tracker.js.map +1 -0
  42. package/dist/backend/backend/src/services/board/board-outcome-phrases.d.ts +43 -0
  43. package/dist/backend/backend/src/services/board/board-outcome-phrases.d.ts.map +1 -0
  44. package/dist/backend/backend/src/services/board/board-outcome-phrases.js +76 -0
  45. package/dist/backend/backend/src/services/board/board-outcome-phrases.js.map +1 -0
  46. package/dist/backend/backend/src/services/board/board-push.service.d.ts +132 -0
  47. package/dist/backend/backend/src/services/board/board-push.service.d.ts.map +1 -0
  48. package/dist/backend/backend/src/services/board/board-push.service.js +374 -0
  49. package/dist/backend/backend/src/services/board/board-push.service.js.map +1 -0
  50. package/dist/backend/backend/src/services/board/board-redact.d.ts +90 -0
  51. package/dist/backend/backend/src/services/board/board-redact.d.ts.map +1 -0
  52. package/dist/backend/backend/src/services/board/board-redact.js +359 -0
  53. package/dist/backend/backend/src/services/board/board-redact.js.map +1 -0
  54. package/dist/backend/backend/src/services/board/board-snapshot.builder.d.ts +183 -0
  55. package/dist/backend/backend/src/services/board/board-snapshot.builder.d.ts.map +1 -0
  56. package/dist/backend/backend/src/services/board/board-snapshot.builder.js +344 -0
  57. package/dist/backend/backend/src/services/board/board-snapshot.builder.js.map +1 -0
  58. package/dist/backend/backend/src/services/board/board-usage.d.ts +20 -0
  59. package/dist/backend/backend/src/services/board/board-usage.d.ts.map +1 -0
  60. package/dist/backend/backend/src/services/board/board-usage.js +82 -0
  61. package/dist/backend/backend/src/services/board/board-usage.js.map +1 -0
  62. package/dist/backend/backend/src/services/board/board.service.d.ts +60 -0
  63. package/dist/backend/backend/src/services/board/board.service.d.ts.map +1 -0
  64. package/dist/backend/backend/src/services/board/board.service.js +82 -0
  65. package/dist/backend/backend/src/services/board/board.service.js.map +1 -0
  66. package/dist/backend/backend/src/services/board/board.sources.d.ts +25 -0
  67. package/dist/backend/backend/src/services/board/board.sources.d.ts.map +1 -0
  68. package/dist/backend/backend/src/services/board/board.sources.js +300 -0
  69. package/dist/backend/backend/src/services/board/board.sources.js.map +1 -0
  70. package/dist/backend/backend/src/services/board/board.types.d.ts +122 -0
  71. package/dist/backend/backend/src/services/board/board.types.d.ts.map +1 -0
  72. package/dist/backend/backend/src/services/board/board.types.js +8 -0
  73. package/dist/backend/backend/src/services/board/board.types.js.map +1 -0
  74. package/dist/backend/backend/src/services/board/canvas/canvas-inbound.service.d.ts +122 -0
  75. package/dist/backend/backend/src/services/board/canvas/canvas-inbound.service.d.ts.map +1 -0
  76. package/dist/backend/backend/src/services/board/canvas/canvas-inbound.service.js +339 -0
  77. package/dist/backend/backend/src/services/board/canvas/canvas-inbound.service.js.map +1 -0
  78. package/dist/backend/backend/src/services/board/canvas/canvas-redact.d.ts +44 -0
  79. package/dist/backend/backend/src/services/board/canvas/canvas-redact.d.ts.map +1 -0
  80. package/dist/backend/backend/src/services/board/canvas/canvas-redact.js +161 -0
  81. package/dist/backend/backend/src/services/board/canvas/canvas-redact.js.map +1 -0
  82. package/dist/backend/backend/src/services/board/canvas/canvas-step.normalizer.d.ts +57 -0
  83. package/dist/backend/backend/src/services/board/canvas/canvas-step.normalizer.d.ts.map +1 -0
  84. package/dist/backend/backend/src/services/board/canvas/canvas-step.normalizer.js +164 -0
  85. package/dist/backend/backend/src/services/board/canvas/canvas-step.normalizer.js.map +1 -0
  86. package/dist/backend/backend/src/services/board/canvas/canvas-step.stream.d.ts +140 -0
  87. package/dist/backend/backend/src/services/board/canvas/canvas-step.stream.d.ts.map +1 -0
  88. package/dist/backend/backend/src/services/board/canvas/canvas-step.stream.js +300 -0
  89. package/dist/backend/backend/src/services/board/canvas/canvas-step.stream.js.map +1 -0
  90. package/dist/backend/backend/src/services/board/canvas/canvas-terminal.service.d.ts +99 -0
  91. package/dist/backend/backend/src/services/board/canvas/canvas-terminal.service.d.ts.map +1 -0
  92. package/dist/backend/backend/src/services/board/canvas/canvas-terminal.service.js +223 -0
  93. package/dist/backend/backend/src/services/board/canvas/canvas-terminal.service.js.map +1 -0
  94. package/dist/backend/backend/src/services/board/canvas/canvas-transcript.tail.d.ts +126 -0
  95. package/dist/backend/backend/src/services/board/canvas/canvas-transcript.tail.d.ts.map +1 -0
  96. package/dist/backend/backend/src/services/board/canvas/canvas-transcript.tail.js +385 -0
  97. package/dist/backend/backend/src/services/board/canvas/canvas-transcript.tail.js.map +1 -0
  98. package/dist/backend/backend/src/services/board/canvas/canvas-wiring.d.ts +103 -0
  99. package/dist/backend/backend/src/services/board/canvas/canvas-wiring.d.ts.map +1 -0
  100. package/dist/backend/backend/src/services/board/canvas/canvas-wiring.js +124 -0
  101. package/dist/backend/backend/src/services/board/canvas/canvas-wiring.js.map +1 -0
  102. package/dist/backend/backend/src/services/board/canvas/canvas.types.d.ts +88 -0
  103. package/dist/backend/backend/src/services/board/canvas/canvas.types.d.ts.map +1 -0
  104. package/dist/backend/backend/src/services/board/canvas/canvas.types.js +8 -0
  105. package/dist/backend/backend/src/services/board/canvas/canvas.types.js.map +1 -0
  106. package/dist/backend/backend/src/services/cloud/cloud-sync.types.d.ts +1 -1
  107. package/dist/backend/backend/src/services/cloud/cloud-sync.types.d.ts.map +1 -1
  108. package/dist/backend/backend/src/services/cloud/cloud-sync.types.js +1 -0
  109. package/dist/backend/backend/src/services/cloud/cloud-sync.types.js.map +1 -1
  110. package/dist/backend/backend/src/services/google/google-reauth-notifier.service.d.ts +13 -0
  111. package/dist/backend/backend/src/services/google/google-reauth-notifier.service.d.ts.map +1 -1
  112. package/dist/backend/backend/src/services/google/google-reauth-notifier.service.js +15 -0
  113. package/dist/backend/backend/src/services/google/google-reauth-notifier.service.js.map +1 -1
  114. package/dist/backend/backend/src/services/slack/slack-initializer.d.ts.map +1 -1
  115. package/dist/backend/backend/src/services/slack/slack-initializer.js +2 -1
  116. package/dist/backend/backend/src/services/slack/slack-initializer.js.map +1 -1
  117. package/dist/backend/build-info.json +2 -2
  118. package/dist/cli/backend/src/constants.d.ts +120 -0
  119. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  120. package/dist/cli/backend/src/constants.js +120 -0
  121. package/dist/cli/backend/src/constants.js.map +1 -1
  122. package/dist/cli/backend/src/services/cloud/cloud-sync.types.d.ts +1 -1
  123. package/dist/cli/backend/src/services/cloud/cloud-sync.types.d.ts.map +1 -1
  124. package/dist/cli/backend/src/services/cloud/cloud-sync.types.js +1 -0
  125. package/dist/cli/backend/src/services/cloud/cloud-sync.types.js.map +1 -1
  126. package/package.json +1 -1
@@ -0,0 +1,25 @@
1
+ /**
2
+ * The Owner Board's data sources on a running Crewly (crewly#1247): maps the
3
+ * machine's services onto {@link BoardSources}. Everything here is a read; a
4
+ * source that fails is treated as empty by the builder. The expensive reads
5
+ * (tickets, project tickets, ledger) are cached for a short time, so the
6
+ * 60-second snapshot costs little.
7
+ *
8
+ * @module services/board/board.sources
9
+ */
10
+ import { StorageService } from '../core/storage.service.js';
11
+ import { type BoardSources } from './board-snapshot.builder.js';
12
+ /** Dependencies the composition root supplies. */
13
+ export interface ProductionBoardSourcesDeps {
14
+ storage: StorageService;
15
+ /** Version of this Crewly (default: the version-check service) */
16
+ version?: () => Promise<string>;
17
+ }
18
+ /**
19
+ * Sources over the live services.
20
+ *
21
+ * @param deps - Storage handle
22
+ * @returns Sources
23
+ */
24
+ export declare function createProductionBoardSources(deps: ProductionBoardSourcesDeps): BoardSources;
25
+ //# sourceMappingURL=board.sources.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"board.sources.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/board/board.sources.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAeH,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAU5D,OAAO,EAAuC,KAAK,YAAY,EAA4D,MAAM,6BAA6B,CAAC;AAwC/J,kDAAkD;AAClD,MAAM,WAAW,0BAA0B;IAC1C,OAAO,EAAE,cAAc,CAAC;IACxB,kEAAkE;IAClE,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;CAChC;AAED;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,0BAA0B,GAAG,YAAY,CA0N3F"}
@@ -0,0 +1,300 @@
1
+ /**
2
+ * The Owner Board's data sources on a running Crewly (crewly#1247): maps the
3
+ * machine's services onto {@link BoardSources}. Everything here is a read; a
4
+ * source that fails is treated as empty by the builder. The expensive reads
5
+ * (tickets, project tickets, ledger) are cached for a short time, so the
6
+ * 60-second snapshot costs little.
7
+ *
8
+ * @module services/board/board.sources
9
+ */
10
+ import { BOARD_CONSTANTS, CLOUD_TALK_CONSTANTS, ORCHESTRATOR_SESSION_NAME } from '../../constants.js';
11
+ import { computeCapabilities } from './canvas/canvas-wiring.js';
12
+ import { resolveMemberSessionName } from '../../utils/member-session-name.utils.js';
13
+ import { DeviceIdentityService } from '../cloud/device-identity.service.js';
14
+ import { DecisionService } from '../decisions/decision.service.js';
15
+ import { listDocCommentBatches } from '../google/docs-comment-gate.js';
16
+ import { listHeldSends } from '../google/gmail-send-gate.js';
17
+ import { GoogleReauthNotifier } from '../google/google-reauth-notifier.service.js';
18
+ import { getHookSignal } from '../monitoring/agent-hook-state.js';
19
+ import { AgentTurnStateService } from '../monitoring/agent-turn-state.js';
20
+ import { SubAgentMessageQueue } from '../messaging/sub-agent-message-queue.service.js';
21
+ import { ProjectTicketService } from '../project-tickets/project-ticket.service.js';
22
+ import { InFlightTurnTracker } from '../restart/in-flight-turn-tracker.service.js';
23
+ import { TaskPoolService } from '../task-pool/task-pool.service.js';
24
+ import { getUsageLedger } from '../usage-ledger/index.js';
25
+ import { getSessionBackendSync } from '../session/session-backend.factory.js';
26
+ import { getBrowserSessions } from '../browser/browser-session.service.js';
27
+ import { VersionCheckService } from '../system/version-check.service.js';
28
+ import { getTicketIntakeService, resolveTicketIdForSession } from '../v3/ticket-intake.service.js';
29
+ import { RequestService } from '../v3/request.service.js';
30
+ import { computeBoardUsage } from './board-usage.js';
31
+ import { startOfLocalDay } from './board-snapshot.builder.js';
32
+ const C = BOARD_CONSTANTS;
33
+ const DAY_MS = 24 * 60 * 60 * 1000;
34
+ /** A value cached for a while. */
35
+ function cached(ttlMs, load) {
36
+ let value = null;
37
+ let inflight = null;
38
+ return async () => {
39
+ if (value && Date.now() - value.at < ttlMs)
40
+ return value.v;
41
+ if (!inflight) {
42
+ inflight = load()
43
+ .then((v) => {
44
+ value = { at: Date.now(), v };
45
+ return v;
46
+ })
47
+ .finally(() => {
48
+ inflight = null;
49
+ });
50
+ }
51
+ return inflight;
52
+ };
53
+ }
54
+ /** Decision kind -> what the owner is asked to do. */
55
+ function decisionKind(d) {
56
+ if (d.kind === 'reply_question')
57
+ return 'question';
58
+ if (d.kind === 'owner_receipt_format' || d.kind === 'retro_harness_gaps' || !d.kind)
59
+ return 'decision';
60
+ return 'approval';
61
+ }
62
+ function decisionTitle(d) {
63
+ if (d.kind === 'browser_action' && d.browser)
64
+ return `${d.browser.agentName} wants to ${d.browser.target}${d.browser.where ? ` on ${d.browser.where}` : ''}`;
65
+ // A reply question's `title` is only its header ("TKT-226 · Atlas asks"): the question is the content
66
+ if (d.kind === 'reply_question' || !d.title)
67
+ return d.question;
68
+ return d.question && d.question !== d.title ? `${d.title}: ${d.question}` : d.title;
69
+ }
70
+ /**
71
+ * Sources over the live services.
72
+ *
73
+ * @param deps - Storage handle
74
+ * @returns Sources
75
+ */
76
+ export function createProductionBoardSources(deps) {
77
+ const teams = async () => {
78
+ const stored = await deps.storage.getTeams();
79
+ const out = [
80
+ {
81
+ teamId: 'orchestrator',
82
+ name: 'Orchestrator',
83
+ members: [
84
+ {
85
+ session: ORCHESTRATOR_SESSION_NAME,
86
+ name: CLOUD_TALK_CONSTANTS.ORCHESTRATOR_DISPLAY_NAME,
87
+ role: 'orchestrator',
88
+ runtime: process.env.DEFAULT_RUNTIME || 'claude-code',
89
+ agentStatus: 'active',
90
+ workingStatus: 'idle',
91
+ },
92
+ ],
93
+ },
94
+ ];
95
+ for (const team of stored) {
96
+ if (team.archived)
97
+ continue;
98
+ const members = (team.members ?? [])
99
+ .filter((m) => m?.id && String(m.role) !== 'orchestrator')
100
+ .map((m) => ({
101
+ session: resolveMemberSessionName(team.name, m),
102
+ name: m.name,
103
+ role: String(m.role),
104
+ runtime: m.runtimeType,
105
+ ...(m.modelId ? { model: m.modelId } : {}),
106
+ agentStatus: m.agentStatus,
107
+ workingStatus: m.workingStatus,
108
+ }));
109
+ out.push({ teamId: team.id, name: team.name, ...(team.paused ? { paused: true } : {}), members });
110
+ }
111
+ return out;
112
+ };
113
+ const workItems = cached(15_000, async () => {
114
+ const cutoff = Date.now() - 2 * DAY_MS;
115
+ return (await TaskPoolService.getInstance().getAllItems())
116
+ .filter((w) => {
117
+ const terminal = w.status === 'done' || w.status === 'verified' || w.status === 'cancelled' || w.status === 'rejected';
118
+ const changed = Date.parse(w.completedAt ?? w.statusChangedAt ?? w.createdAt);
119
+ return !terminal || changed >= cutoff;
120
+ })
121
+ .map((w) => ({
122
+ id: w.id,
123
+ title: w.title,
124
+ type: w.type,
125
+ status: w.status,
126
+ ...(w.target ? { target: w.target } : {}),
127
+ ...(w.requestId ? { requestId: w.requestId } : {}),
128
+ ...(w.projectTaskId ? { projectTaskId: w.projectTaskId } : {}),
129
+ createdAt: w.createdAt,
130
+ ...(w.startedAt ? { startedAt: w.startedAt } : {}),
131
+ ...(w.completedAt ? { completedAt: w.completedAt } : {}),
132
+ ...(w.statusChangedAt ? { statusChangedAt: w.statusChangedAt } : {}),
133
+ ...(w.scheduledAt ? { scheduledAt: w.scheduledAt } : {}),
134
+ ...(w.blockedReason ? { blockedReason: w.blockedReason } : {}),
135
+ ...(w.blockSource ? { blockSource: w.blockSource } : {}),
136
+ ...(w.error ? { error: w.error } : {}),
137
+ }));
138
+ });
139
+ const harnessTickets = cached(30_000, async () => {
140
+ const intake = getTicketIntakeService();
141
+ if (!intake)
142
+ return [];
143
+ const dayStart = startOfLocalDay(Date.now());
144
+ const candidates = (await RequestService.getInstance().listAll()).filter((r) => {
145
+ if (typeof r.ticketNumber !== 'number' || r.status === 'cancelled')
146
+ return false;
147
+ if (r.status === 'done')
148
+ return Date.parse(r.completedAt ?? r.updatedAt) >= dayStart;
149
+ return true;
150
+ });
151
+ const rows = await Promise.all(candidates.map((r) => intake.toListItem(r)));
152
+ return rows.map((row) => ({
153
+ id: row.id,
154
+ ...(row.tkt ? { label: row.tkt } : {}),
155
+ title: row.title,
156
+ kind: row.kind,
157
+ column: row.column,
158
+ ...(row.assignee ? { assignee: row.assignee } : {}),
159
+ ...(row.submittedAt ? { submittedAt: row.submittedAt } : {}),
160
+ ...(row.completedAt ? { completedAt: row.completedAt } : {}),
161
+ updatedAt: row.updatedAt,
162
+ }));
163
+ });
164
+ const projectTickets = cached(C.PROJECT_TICKET_CACHE_MS, async () => {
165
+ const dayStart = startOfLocalDay(Date.now());
166
+ const out = [];
167
+ const svc = ProjectTicketService.getInstance();
168
+ for (const project of await deps.storage.getProjects()) {
169
+ let tickets;
170
+ try {
171
+ tickets = (await svc.list(project.path)).tickets;
172
+ }
173
+ catch {
174
+ continue;
175
+ }
176
+ for (const t of tickets) {
177
+ const closedToday = t.status === 'done' && Date.parse(t.updatedAt) >= dayStart;
178
+ const needsOwner = t.status === 'review' && t.ownerReview;
179
+ if (!closedToday && !needsOwner)
180
+ continue;
181
+ out.push({
182
+ id: `${project.id}:${t.id}`,
183
+ label: t.id,
184
+ title: t.title,
185
+ column: closedToday ? 'done' : 'to_review',
186
+ ...(t.assignee ? { assignee: t.assignee } : {}),
187
+ ...(t.team ? { teamId: t.team } : {}),
188
+ completedAt: t.status === 'done' ? t.updatedAt : undefined,
189
+ updatedAt: t.updatedAt,
190
+ });
191
+ }
192
+ }
193
+ return out;
194
+ });
195
+ const ledger = cached(20_000, async () => {
196
+ const l = getUsageLedger();
197
+ await l.recorder.flush();
198
+ await l.rollup.refresh(l.store);
199
+ return computeBoardUsage(l.rollup.units.values(), Date.now());
200
+ });
201
+ return {
202
+ identity: async () => {
203
+ const id = await DeviceIdentityService.getInstance().getOrCreateIdentity();
204
+ return { instanceId: id.deviceId, machineName: id.deviceName };
205
+ },
206
+ version: deps.version ?? (async () => VersionCheckService.getInstance().getLocalVersion()),
207
+ teams,
208
+ turnState: (session, now) => {
209
+ const turns = AgentTurnStateService.getInstance();
210
+ // Hook state is in memory; the transcript is the fallback when the hooks said nothing
211
+ let v = turns.hookVerdict(session, now);
212
+ if (v.state === 'unknown')
213
+ v = turns.getVerdict(session, now);
214
+ return v.state === 'turn' || v.state === 'background' ? 'working' : v.state === 'idle' ? 'idle' : 'unknown';
215
+ },
216
+ waitingOnHuman: (session) => getHookSignal(session)?.state === 'waiting',
217
+ queuedFor: (session) => SubAgentMessageQueue.getInstance().peek(session).length,
218
+ stalledBackground: (session, now) => {
219
+ const s = AgentTurnStateService.getInstance().stalledBackground(session, now);
220
+ return s ? { since: s.lastProgressAt, ...(s.description ? { description: s.description } : {}) } : null;
221
+ },
222
+ capabilities: (session, info) => computeCapabilities(session, info, {
223
+ browserSession: (id) => getBrowserSessions().getSession(id),
224
+ terminalExists: (id) => getSessionBackendSync()?.sessionExists(id) === true,
225
+ }),
226
+ workItems,
227
+ tickets: async () => [...(await harnessTickets()), ...(await projectTickets().catch(() => []))],
228
+ decisions: async () => {
229
+ const list = (await DecisionService.getInstance()?.list('open')) ?? [];
230
+ return list.map((d) => ({
231
+ id: d.id,
232
+ kind: decisionKind(d),
233
+ title: decisionTitle(d),
234
+ ...(d.asker ? { asker: d.asker } : {}),
235
+ ...(d.teamId ? { teamId: d.teamId } : {}),
236
+ createdAt: d.createdAt,
237
+ }));
238
+ },
239
+ holds: async () => {
240
+ const out = [];
241
+ for (const b of listDocCommentBatches()) {
242
+ out.push({
243
+ id: `doc-comments:${b.code}`,
244
+ kind: 'approval',
245
+ title: `${b.items.length} Google Docs comment${b.items.length === 1 ? '' : 's'} ready to send (${b.code})`,
246
+ since: new Date(b.createdAt).toISOString(),
247
+ action: { label: 'Approve' },
248
+ });
249
+ }
250
+ for (const h of listHeldSends()) {
251
+ out.push({
252
+ id: `gmail-draft:${h.id}`,
253
+ kind: 'approval',
254
+ title: `Email draft ready to send: ${h.subject}`,
255
+ since: new Date(h.heldAt).toISOString(),
256
+ action: { label: 'Review' },
257
+ });
258
+ }
259
+ for (const r of GoogleReauthNotifier.getInstance()?.listPending() ?? []) {
260
+ out.push({
261
+ id: `reconnect:${r.product}:${r.account ?? 'default'}`,
262
+ kind: 'reconnect',
263
+ title: `Reconnect Google ${r.product}`,
264
+ since: new Date(r.since).toISOString(),
265
+ action: { label: 'Reconnect' },
266
+ });
267
+ }
268
+ return out;
269
+ },
270
+ usage: async () => ledger(),
271
+ activeWork: async () => {
272
+ const out = new Map();
273
+ const pool = TaskPoolService.getInstance();
274
+ const [claims, items] = await Promise.all([pool.getActiveClaims(), workItems()]);
275
+ const byId = new Map(items.map((w) => [w.id, w]));
276
+ for (const c of claims) {
277
+ const w = byId.get(c.workItemId);
278
+ if (w)
279
+ out.set(c.agentId, { id: w.id, title: w.title, since: w.startedAt ?? c.claimedAt });
280
+ }
281
+ // An agent on a ticket without a claimed WorkItem: the ticket of its turn
282
+ const intake = getTicketIntakeService();
283
+ if (intake) {
284
+ const tracker = InFlightTurnTracker.getInstance();
285
+ for (const turn of tracker.snapshot()) {
286
+ if (out.has(turn.sessionName))
287
+ continue;
288
+ const ticketId = resolveTicketIdForSession(tracker, turn.sessionName);
289
+ if (!ticketId)
290
+ continue;
291
+ const title = (await harnessTickets()).find((t) => t.label === ticketId || t.id === ticketId)?.title;
292
+ if (title)
293
+ out.set(turn.sessionName, { id: ticketId, title, since: new Date(turn.since).toISOString() });
294
+ }
295
+ }
296
+ return out;
297
+ },
298
+ };
299
+ }
300
+ //# sourceMappingURL=board.sources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"board.sources.js","sourceRoot":"","sources":["../../../../../../backend/src/services/board/board.sources.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,122 @@
1
+ /**
2
+ * Owner Board wire types (crewly#1247). Mirrors the shared contract
3
+ * `CONTRACT.md`; change both together. Pure types.
4
+ *
5
+ * @module services/board/board.types
6
+ */
7
+ import type { AgentCapabilities, StepEvent } from './canvas/canvas.types.js';
8
+ /** What an agent is doing right now. */
9
+ export type BoardActivityType = 'coding' | 'browsing' | 'command' | 'writing' | 'messaging' | 'waiting_owner' | 'thinking' | 'other';
10
+ /** Agent row state. */
11
+ export type BoardAgentState = 'working' | 'waiting' | 'idle' | 'stopped' | 'error' | 'queued';
12
+ /** One agent's current activity. `detail` is a path / host+path / command name / channel, never contents. */
13
+ export interface BoardActivity {
14
+ type: BoardActivityType;
15
+ detail: string;
16
+ /** ISO */
17
+ since: string;
18
+ }
19
+ /** One agent row. */
20
+ export interface BoardAgent {
21
+ session: string;
22
+ name: string;
23
+ role: string;
24
+ runtime: string;
25
+ model?: string;
26
+ state: BoardAgentState;
27
+ activity?: BoardActivity;
28
+ task?: {
29
+ id?: string;
30
+ title: string;
31
+ since: string;
32
+ };
33
+ lastAction?: {
34
+ text: string;
35
+ at: string;
36
+ };
37
+ todayUsd?: number;
38
+ todayTokens?: number;
39
+ /** What the owner can do with this agent from the canvas (crewly#1247 v2) */
40
+ capabilities?: AgentCapabilities;
41
+ }
42
+ /** One team card. */
43
+ export interface BoardTeam {
44
+ teamId: string;
45
+ name: string;
46
+ paused?: boolean;
47
+ agents: BoardAgent[];
48
+ }
49
+ /** One timeline event (plain words, already redacted). */
50
+ export interface BoardTimelineEvent {
51
+ session: string;
52
+ at: string;
53
+ type: BoardActivityType;
54
+ text: string;
55
+ }
56
+ export interface BoardDoneItem {
57
+ ticketId?: string;
58
+ title: string;
59
+ result: string;
60
+ team: string;
61
+ agent?: string;
62
+ at: string;
63
+ }
64
+ export type BoardWaitingKind = 'decision' | 'review' | 'approval' | 'reconnect' | 'question';
65
+ export interface BoardWaitingItem {
66
+ id: string;
67
+ kind: BoardWaitingKind;
68
+ title: string;
69
+ team?: string;
70
+ agent?: string;
71
+ since: string;
72
+ action?: {
73
+ label: string;
74
+ url?: string;
75
+ };
76
+ }
77
+ export interface BoardStuckItem {
78
+ id: string;
79
+ title: string;
80
+ team?: string;
81
+ agent?: string;
82
+ since: string;
83
+ on: 'owner' | 'agent' | 'external' | 'system';
84
+ reason: string;
85
+ }
86
+ export interface BoardSpend {
87
+ todayUsd: number;
88
+ weekUsd: number;
89
+ todayTokens: number;
90
+ weekTokens: number;
91
+ ownerMinutesToday?: number;
92
+ ownerMinutesWeek?: number;
93
+ }
94
+ /** The full snapshot (`POST /api/cloud/board/snapshot`, `GET /api/board`). */
95
+ export interface BoardSnapshot {
96
+ v: 1;
97
+ instanceId: string;
98
+ machineName: string;
99
+ crewlyVersion: string;
100
+ generatedAt: string;
101
+ outcomes: {
102
+ doneToday: BoardDoneItem[];
103
+ doneTodaySummary: string[];
104
+ waitingOnOwner: BoardWaitingItem[];
105
+ stuck: BoardStuckItem[];
106
+ spend: BoardSpend;
107
+ };
108
+ teams: BoardTeam[];
109
+ }
110
+ /** Changed agent rows (`POST /api/cloud/board/delta`). */
111
+ export interface BoardDelta {
112
+ v: 1;
113
+ instanceId: string;
114
+ generatedAt: string;
115
+ agents: Array<BoardAgent & {
116
+ teamId: string;
117
+ }>;
118
+ timeline?: BoardTimelineEvent[];
119
+ /** Canvas step stream: new steps and steps whose status changed (same `id`, upsert) */
120
+ steps?: StepEvent[];
121
+ }
122
+ //# sourceMappingURL=board.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"board.types.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/board/board.types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Owner Board wire types (crewly#1247). Mirrors the shared contract
3
+ * `CONTRACT.md`; change both together. Pure types.
4
+ *
5
+ * @module services/board/board.types
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=board.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"board.types.js","sourceRoot":"","sources":["../../../../../../backend/src/services/board/board.types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,122 @@
1
+ /**
2
+ * CanvasInboundService - the machine side of the owner actions on the Crewly
3
+ * Canvas (crewly#1247 v2).
4
+ *
5
+ * The owner uses the canvas in the Crewly Cloud portal: message an agent, stop
6
+ * an agent, open / renew / close an agent's terminal. Cloud stores the action
7
+ * and pushes a `canvas_action` relay message with only ids in it
8
+ * (`{actionId, instanceId, session, kind}`) - the same secure pattern as Cloud
9
+ * Talk and "waiting on you". This service:
10
+ *
11
+ * 1. checks the push is for this machine and names an agent that exists here;
12
+ * 2. fetches the action from Cloud with this machine's own token
13
+ * (`GET /api/cloud/canvas/actions/:actionId?instanceId=`). Cloud answers
14
+ * only for an action stored by the OWNER of the token's account for this
15
+ * machine, so a push anybody else dropped in the relay queue (or one from a
16
+ * member / guest of the account) is never run; the fetched ids and kind
17
+ * must match the push;
18
+ * 3. runs it: a message is recorded in the agent's DM as an owner message and
19
+ * handed to the agent exactly like a Talk / Crewly Chat message (replies
20
+ * route as usual); a stop is the dashboard's stop; terminal actions drive
21
+ * {@link CanvasTerminalService};
22
+ * 4. reports the result (`POST .../actions/:actionId/result`).
23
+ *
24
+ * Idempotent: an action carried out is not run again when Cloud re-pushes it
25
+ * (it only re-reports); a message is also keyed by `clientMessageId` in the DM.
26
+ *
27
+ * Older OSS versions ignore `canvas_action` (every relay listener filters on
28
+ * its own `type`), and Cloud only sends it to machines advertising the
29
+ * `canvas_actions` capability, which this service turns on when it starts.
30
+ *
31
+ * @module services/board/canvas/canvas-inbound.service
32
+ */
33
+ import { type ComponentLogger } from '../../core/logger.service.js';
34
+ import type { ChatChannelDTO, ChatMessageDTO } from '../../chat-v2/types.js';
35
+ import type { IncomingMessage } from '../../cloud/cloud-sync.types.js';
36
+ import type { CloudTalkCloud, CloudTalkFetch, CloudTalkInboundChat, CloudTalkSource } from '../../cloud/cloud-talk-inbound.service.js';
37
+ import type { CanvasTerminalService } from './canvas-terminal.service.js';
38
+ import type { CanvasActionFetchResponse, CanvasActionRelayData } from './canvas.types.js';
39
+ /**
40
+ * Validate the relay push. Never throws.
41
+ *
42
+ * @param raw - `msg.payload`
43
+ * @returns The ids, or null when malformed
44
+ */
45
+ export declare function parseCanvasRelayData(raw: unknown): CanvasActionRelayData | null;
46
+ /**
47
+ * Validate Cloud's answer to the action fetch (`{success, data: {...}}`). Never throws.
48
+ *
49
+ * @param raw - Parsed JSON body
50
+ * @returns The action, or null when unusable
51
+ */
52
+ export declare function parseCanvasFetchResponse(raw: unknown): CanvasActionFetchResponse | null;
53
+ /** Constructor dependencies. */
54
+ export interface CanvasInboundDeps {
55
+ source: CloudTalkSource;
56
+ cloud: CloudTalkCloud;
57
+ chat: CloudTalkInboundChat;
58
+ identity: () => Promise<{
59
+ instanceId: string;
60
+ deviceName?: string;
61
+ }>;
62
+ /** Hand the recorded message to the agent (ticket intake + dispatcher), as Cloud Talk does. */
63
+ deliver: (channel: ChatChannelDTO, message: ChatMessageDTO) => Promise<void>;
64
+ /** Whether the agent exists on this machine */
65
+ agentExists: (session: string) => Promise<boolean>;
66
+ /** Stop the agent (the dashboard's stop). */
67
+ stopAgent: (session: string) => Promise<{
68
+ ok: boolean;
69
+ error?: string;
70
+ }>;
71
+ terminal: Pick<CanvasTerminalService, 'open' | 'renew' | 'close'>;
72
+ /** An owner action arrived: someone is watching */
73
+ onAction?: () => void;
74
+ ownerUserId?: string;
75
+ fetchImpl?: CloudTalkFetch;
76
+ sleep?: (ms: number) => Promise<void>;
77
+ now?: () => number;
78
+ logger?: ComponentLogger;
79
+ }
80
+ /** What {@link CanvasInboundService.handle} did (tests, logs). */
81
+ export type CanvasActionOutcome = 'done' | 'refused' | 'duplicate' | 'ignored' | 'not_for_this_machine' | 'unverified' | 'fetch_failed';
82
+ /**
83
+ * Capabilities to advertise to Cloud (heartbeat and uploads).
84
+ *
85
+ * @returns `['canvas_actions']` while the handler runs, else `[]`
86
+ */
87
+ export declare function canvasCapabilities(): string[];
88
+ /** Runs the owner's canvas actions pushed from Crewly Cloud - see module docs. */
89
+ export declare class CanvasInboundService {
90
+ private readonly deps;
91
+ private readonly logger;
92
+ private readonly fetchImpl;
93
+ private readonly sleep;
94
+ private readonly now;
95
+ private readonly ownerUserId;
96
+ private readonly inFlight;
97
+ private readonly done;
98
+ private readonly listener;
99
+ private started;
100
+ constructor(deps: CanvasInboundDeps);
101
+ /** Subscribe to relay messages and advertise the capability. Idempotent. */
102
+ start(): void;
103
+ /** Unsubscribe; the capability is no longer advertised. */
104
+ stop(): void;
105
+ /**
106
+ * Handle one relay message. Anything but a well-formed `canvas_action` is
107
+ * ignored. Never throws.
108
+ *
109
+ * @param msg - Relay message from CloudSyncService
110
+ * @returns What was done
111
+ */
112
+ handle(msg: IncomingMessage): Promise<CanvasActionOutcome>;
113
+ private process;
114
+ private run;
115
+ private pruneDone;
116
+ private url;
117
+ /** Fetch the action from Cloud with this machine's token; one refresh on 401, a few retries on network / 5xx. */
118
+ private fetchAction;
119
+ /** Report the result to Cloud (best effort; a re-push re-reports). */
120
+ private report;
121
+ }
122
+ //# sourceMappingURL=canvas-inbound.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvas-inbound.service.d.ts","sourceRoot":"","sources":["../../../../../../../backend/src/services/board/canvas/canvas-inbound.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAGH,OAAO,EAAiB,KAAK,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAEnF,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,2CAA2C,CAAC;AACvI,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,KAAK,EACX,yBAAyB,EAEzB,qBAAqB,EAErB,MAAM,mBAAmB,CAAC;AAW3B;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,GAAG,qBAAqB,GAAG,IAAI,CAQ/E;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,OAAO,GAAG,yBAAyB,GAAG,IAAI,CAgBvF;AAED,gCAAgC;AAChC,MAAM,WAAW,iBAAiB;IACjC,MAAM,EAAE,eAAe,CAAC;IACxB,KAAK,EAAE,cAAc,CAAC;IACtB,IAAI,EAAE,oBAAoB,CAAC;IAC3B,QAAQ,EAAE,MAAM,OAAO,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrE,+FAA+F;IAC/F,OAAO,EAAE,CAAC,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7E,+CAA+C;IAC/C,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACnD,6CAA6C;IAC7C,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzE,QAAQ,EAAE,IAAI,CAAC,qBAAqB,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC,CAAC;IAClE,mDAAmD;IACnD,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,eAAe,CAAC;CACzB;AAED,kEAAkE;AAClE,MAAM,MAAM,mBAAmB,GAC5B,MAAM,GACN,SAAS,GACT,WAAW,GACX,SAAS,GACT,sBAAsB,GACtB,YAAY,GACZ,cAAc,CAAC;AAMlB;;;;GAIG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,EAAE,CAE7C;AAED,kFAAkF;AAClF,qBAAa,oBAAoB;IAapB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAZjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAiB;IAC3C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgC;IACtD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAC9C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAwE;IAC7F,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAEvB;IACF,OAAO,CAAC,OAAO,CAAS;gBAEK,IAAI,EAAE,iBAAiB;IAQpD,4EAA4E;IAC5E,KAAK,IAAI,IAAI;IAQb,2DAA2D;IAC3D,IAAI,IAAI,IAAI;IAOZ;;;;;;OAMG;IACG,MAAM,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,mBAAmB,CAAC;YAmBlD,OAAO;YA4CP,GAAG;IAgDjB,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,GAAG;IAKX,iHAAiH;YACnG,WAAW;IAqCzB,sEAAsE;YACxD,MAAM;CAepB"}