crewly 1.20.406 → 1.20.408

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 (70) hide show
  1. package/dist/backend/backend/src/constants.d.ts +34 -0
  2. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  3. package/dist/backend/backend/src/constants.js +34 -0
  4. package/dist/backend/backend/src/constants.js.map +1 -1
  5. package/dist/backend/backend/src/controllers/activity/activity.controller.d.ts +29 -0
  6. package/dist/backend/backend/src/controllers/activity/activity.controller.d.ts.map +1 -0
  7. package/dist/backend/backend/src/controllers/activity/activity.controller.js +77 -0
  8. package/dist/backend/backend/src/controllers/activity/activity.controller.js.map +1 -0
  9. package/dist/backend/backend/src/controllers/team/team.controller.d.ts.map +1 -1
  10. package/dist/backend/backend/src/controllers/team/team.controller.js +49 -0
  11. package/dist/backend/backend/src/controllers/team/team.controller.js.map +1 -1
  12. package/dist/backend/backend/src/routes/modules/system.routes.d.ts.map +1 -1
  13. package/dist/backend/backend/src/routes/modules/system.routes.js +3 -0
  14. package/dist/backend/backend/src/routes/modules/system.routes.js.map +1 -1
  15. package/dist/backend/backend/src/services/activity/activity-log.service.d.ts +192 -0
  16. package/dist/backend/backend/src/services/activity/activity-log.service.d.ts.map +1 -0
  17. package/dist/backend/backend/src/services/activity/activity-log.service.js +343 -0
  18. package/dist/backend/backend/src/services/activity/activity-log.service.js.map +1 -0
  19. package/dist/backend/backend/src/services/agent/agent-heartbeat-monitor.service.d.ts.map +1 -1
  20. package/dist/backend/backend/src/services/agent/agent-heartbeat-monitor.service.js +7 -0
  21. package/dist/backend/backend/src/services/agent/agent-heartbeat-monitor.service.js.map +1 -1
  22. package/dist/backend/backend/src/services/decisions/decision.service.d.ts +13 -0
  23. package/dist/backend/backend/src/services/decisions/decision.service.d.ts.map +1 -1
  24. package/dist/backend/backend/src/services/decisions/decision.service.js +39 -0
  25. package/dist/backend/backend/src/services/decisions/decision.service.js.map +1 -1
  26. package/dist/backend/backend/src/services/decisions/decision.wiring.d.ts.map +1 -1
  27. package/dist/backend/backend/src/services/decisions/decision.wiring.js +2 -0
  28. package/dist/backend/backend/src/services/decisions/decision.wiring.js.map +1 -1
  29. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts +8 -0
  30. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  31. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js +24 -5
  32. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  33. package/dist/backend/build-info.json +2 -2
  34. package/dist/cli/backend/src/constants.d.ts +34 -0
  35. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  36. package/dist/cli/backend/src/constants.js +34 -0
  37. package/dist/cli/backend/src/constants.js.map +1 -1
  38. package/dist/cli/backend/src/middleware/agent-origin-correction.d.ts +31 -0
  39. package/dist/cli/backend/src/middleware/agent-origin-correction.d.ts.map +1 -0
  40. package/dist/cli/backend/src/middleware/agent-origin-correction.js +31 -0
  41. package/dist/cli/backend/src/middleware/agent-origin-correction.js.map +1 -0
  42. package/dist/cli/backend/src/middleware/api-token.middleware.d.ts +171 -0
  43. package/dist/cli/backend/src/middleware/api-token.middleware.d.ts.map +1 -0
  44. package/dist/cli/backend/src/middleware/api-token.middleware.js +329 -0
  45. package/dist/cli/backend/src/middleware/api-token.middleware.js.map +1 -0
  46. package/dist/cli/backend/src/middleware/caller-identity.middleware.d.ts +290 -0
  47. package/dist/cli/backend/src/middleware/caller-identity.middleware.d.ts.map +1 -0
  48. package/dist/cli/backend/src/middleware/caller-identity.middleware.js +658 -0
  49. package/dist/cli/backend/src/middleware/caller-identity.middleware.js.map +1 -0
  50. package/dist/cli/backend/src/middleware/require-auth.middleware.d.ts +60 -0
  51. package/dist/cli/backend/src/middleware/require-auth.middleware.d.ts.map +1 -0
  52. package/dist/cli/backend/src/middleware/require-auth.middleware.js +127 -0
  53. package/dist/cli/backend/src/middleware/require-auth.middleware.js.map +1 -0
  54. package/dist/cli/backend/src/services/activity/activity-log.service.d.ts +192 -0
  55. package/dist/cli/backend/src/services/activity/activity-log.service.d.ts.map +1 -0
  56. package/dist/cli/backend/src/services/activity/activity-log.service.js +343 -0
  57. package/dist/cli/backend/src/services/activity/activity-log.service.js.map +1 -0
  58. package/dist/cli/backend/src/services/core/peer-process.service.d.ts +168 -0
  59. package/dist/cli/backend/src/services/core/peer-process.service.d.ts.map +1 -0
  60. package/dist/cli/backend/src/services/core/peer-process.service.js +352 -0
  61. package/dist/cli/backend/src/services/core/peer-process.service.js.map +1 -0
  62. package/dist/cli/backend/src/services/decisions/decision.service.d.ts +13 -0
  63. package/dist/cli/backend/src/services/decisions/decision.service.d.ts.map +1 -1
  64. package/dist/cli/backend/src/services/decisions/decision.service.js +39 -0
  65. package/dist/cli/backend/src/services/decisions/decision.service.js.map +1 -1
  66. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts +8 -0
  67. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  68. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js +24 -5
  69. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  70. package/package.json +1 -1
@@ -0,0 +1,290 @@
1
+ /**
2
+ * Caller identity (#999, specs/2026-10-03-owner-auth.md).
3
+ *
4
+ * Decides who made an `/api` request from the credentials it carries — never
5
+ * from a header it left out:
6
+ *
7
+ * | kind | credential |
8
+ * |---------------|---------------------------------------------------------------|
9
+ * | `agent` | a valid agent badge, or (migration window) `X-Agent-Session` |
10
+ * | `relay-owner` | the in-memory relay credential (phone / portal over the relay) |
11
+ * | `cloud` | the in-memory cloud credential (Cloud-forwarded Slack) |
12
+ * | `scheduler` | the scheduler credential a scheduled command's child carries |
13
+ * | `owner` | the owner session cookie (+ CSRF on writes) or the API token |
14
+ * | `anonymous` | nothing of the above — never the owner |
15
+ *
16
+ * `scheduler` is neither an owner nor an agent: it may only queue a plain
17
+ * message to an agent (`POST /terminal/:session/write`, see
18
+ * {@link ownerOrVerifiedAgentOrScheduler}); every other gated route answers it 401.
19
+ *
20
+ * Any sign of an agent wins over an owner credential. The owner API token
21
+ * presented from THIS machine is checked against the process tree: a client
22
+ * process that belongs to an agent is that agent, not the owner.
23
+ *
24
+ * The answer is kept per request in a WeakMap (a client cannot set it) and
25
+ * read through {@link getCallerIdentity}, {@link isOwnerCaller} and
26
+ * {@link rejectNonOwner}.
27
+ *
28
+ * @module middleware/caller-identity
29
+ */
30
+ import type { Request, RequestHandler, Response } from 'express';
31
+ import { PeerProcessService } from '../services/core/peer-process.service.js';
32
+ /** Who a caller is. */
33
+ export type CallerKind = 'owner' | 'agent' | 'relay-owner' | 'cloud' | 'scheduler' | 'anonymous';
34
+ /** How the caller was identified. */
35
+ export type CallerVia = 'owner-session' | 'api-token' | 'agent-badge' | 'legacy-header' | 'process-tree' | 'relay' | 'cloud' | 'scheduler' | 'none';
36
+ /** The identity of one request's caller. */
37
+ export interface CallerIdentity {
38
+ kind: CallerKind;
39
+ via: CallerVia;
40
+ /** The agent session (agents only; may be unknown for a process-tree match) */
41
+ session?: string;
42
+ /** The label a scheduler caller's messages carry, `scheduler:<name>` (scheduler only) */
43
+ sender?: string;
44
+ /** The owner session id (owner via session only) */
45
+ ownerSessionId?: string;
46
+ /** Why an owner-looking credential was not accepted, or other detail for logs */
47
+ note?: string;
48
+ }
49
+ /** The request parts classification reads. */
50
+ export type IdentifiableRequest = Pick<Request, 'headers'> & {
51
+ method?: string;
52
+ socket?: {
53
+ remoteAddress?: string;
54
+ remotePort?: number;
55
+ localPort?: number;
56
+ } | null;
57
+ };
58
+ /**
59
+ * The owner session a request's cookies carry, if any verifies. Every
60
+ * `crewly_owner_*` cookie is tried: the port suffix only keeps instances on
61
+ * one host from overwriting each other, and a cookie from another instance
62
+ * was signed with another secret and simply does not verify.
63
+ *
64
+ * @param req - Request
65
+ * @returns The session, or null
66
+ */
67
+ export declare function readOwnerSession(req: IdentifiableRequest): {
68
+ id: string;
69
+ } | null;
70
+ /**
71
+ * Classify without a process lookup. A local API-token caller is anonymous
72
+ * here (it needs {@link callerIdentityMiddleware}'s process check to be the
73
+ * owner); everything else is decided exactly as the middleware would.
74
+ *
75
+ * @param req - Request
76
+ * @returns The identity
77
+ */
78
+ export declare function classifyCallerSync(req: IdentifiableRequest): CallerIdentity;
79
+ /**
80
+ * Classify with the process check for a local API-token caller.
81
+ *
82
+ * @param req - Request
83
+ * @param peers - Process classifier
84
+ * @returns The identity
85
+ */
86
+ export declare function classifyCaller(req: IdentifiableRequest, peers: PeerProcessService): Promise<CallerIdentity>;
87
+ /** Note on a legacy-header call the process tree confirmed. */
88
+ export declare const LEGACY_CONFIRMED_NOTE = "session header confirmed by the process tree";
89
+ /**
90
+ * Store a request's identity (the middleware; tests).
91
+ *
92
+ * @param req - Request
93
+ * @param identity - Identity
94
+ */
95
+ export declare function setCallerIdentity(req: object, identity: CallerIdentity): void;
96
+ /**
97
+ * The identity of a request's caller: what the middleware decided, or a
98
+ * synchronous classification for a request it did not see (unit tests that
99
+ * mount a router alone).
100
+ *
101
+ * @param req - Request
102
+ * @returns The identity
103
+ */
104
+ export declare function getCallerIdentity(req: IdentifiableRequest): CallerIdentity;
105
+ /**
106
+ * Whether the caller holds an owner credential: the dashboard session, the
107
+ * owner API token, or the phone / portal relay.
108
+ *
109
+ * @param req - Request
110
+ * @returns True for the owner
111
+ */
112
+ export declare function isOwnerCaller(req: IdentifiableRequest): boolean;
113
+ /**
114
+ * The agent session of the caller, when it is an agent.
115
+ *
116
+ * @param req - Request
117
+ * @returns Session or undefined
118
+ */
119
+ export declare function callerAgentSession(req: IdentifiableRequest): string | undefined;
120
+ /** The 401 body for a caller with no owner credential. */
121
+ export declare const OWNER_AUTH_REQUIRED_BODY: Readonly<{
122
+ success: false;
123
+ error: "owner_auth_required";
124
+ code: "owner_auth_required";
125
+ message: "This action needs the owner: use the dashboard on this machine, the phone app, or the API token (`crewly token`).";
126
+ }>;
127
+ /**
128
+ * Whether a request comes from a browser that holds no valid owner session:
129
+ * a dashboard tab opened before the upgrade (its bundle never asks for a
130
+ * session), or one whose session ended with a backend restart.
131
+ *
132
+ * @param req - Request
133
+ * @returns True for a browser request without a session
134
+ */
135
+ export declare function isBrowserWithoutSession(req: IdentifiableRequest): boolean;
136
+ /**
137
+ * The 401 body for a caller with no owner credential. A browser without a
138
+ * session gets the plain instruction in `error` — what an old dashboard tab
139
+ * shows the owner — and every body carries `code: owner_auth_required`,
140
+ * which the new dashboard reacts to by refreshing its session and retrying.
141
+ *
142
+ * @param req - Request (optional)
143
+ * @returns Response body
144
+ */
145
+ export declare function ownerAuthRequiredBody(req?: IdentifiableRequest): Record<string, unknown>;
146
+ /**
147
+ * Thrown by handlers that map errors to responses themselves (decisions,
148
+ * project tickets): carries the owner-auth 401 body.
149
+ */
150
+ export declare class OwnerAuthRequiredError extends Error {
151
+ readonly body: Record<string, unknown>;
152
+ readonly status = 401;
153
+ /**
154
+ * @param body - The 401 body ({@link ownerAuthRequiredBody})
155
+ */
156
+ constructor(body: Record<string, unknown>);
157
+ }
158
+ /**
159
+ * Answer 401 owner_auth_required. No `WWW-Authenticate: Crewly-Token`: the
160
+ * dashboard refreshes its session instead of prompting for the API token.
161
+ *
162
+ * @param res - Response
163
+ * @param req - Request, so a browser without a session is told to reload
164
+ */
165
+ export declare function sendOwnerAuthRequired(res: Response, req?: IdentifiableRequest): void;
166
+ /**
167
+ * Refuse a caller that is not the owner. Agents get `agentBody` (403, the
168
+ * route's own wording); everyone else without an owner credential gets 401.
169
+ *
170
+ * @param req - Request
171
+ * @param res - Response
172
+ * @param agentBody - 403 body for an agent
173
+ * @returns True when refused (response written)
174
+ *
175
+ * @example
176
+ * ```ts
177
+ * if (rejectNonOwner(req, res, { success: false, error: 'Only the owner can dismiss a ticket' })) return;
178
+ * ```
179
+ */
180
+ export declare function rejectNonOwner(req: Request, res: Response, agentBody?: Record<string, unknown>): boolean;
181
+ /**
182
+ * Whether the caller is the orchestrator itself, proven by its badge or the
183
+ * process tree (the bare `X-Agent-Session` header is not proof). No other
184
+ * agent qualifies.
185
+ *
186
+ * @param req - Request
187
+ * @returns True for the verified orchestrator
188
+ */
189
+ export declare function isOrchestratorCaller(req: IdentifiableRequest): boolean;
190
+ /**
191
+ * {@link rejectNonOwner}, except that the verified orchestrator passes too.
192
+ *
193
+ * For actions the owner can ask the orchestrator to do on their behalf
194
+ * (owner-away rule: the owner is on the phone and talks to the orc, so a
195
+ * gate that only the dashboard can open leaves the request hanging). Every
196
+ * other agent still gets the route's 403.
197
+ *
198
+ * @param req - Request
199
+ * @param res - Response
200
+ * @param agentBody - 403 body for any other agent
201
+ * @returns True when a response was sent
202
+ */
203
+ export declare function rejectNonOwnerOrOrchestrator(req: Request, res: Response, agentBody?: Record<string, unknown>): boolean;
204
+ /**
205
+ * Express middleware form of {@link rejectNonOwner}.
206
+ *
207
+ * @param req - Request
208
+ * @param res - Response
209
+ * @param next - Next
210
+ */
211
+ export declare const requireOwner: RequestHandler;
212
+ /**
213
+ * Owner-only decisions with an audit fingerprint (OKR approve/reject, signal
214
+ * digest items). Agents get 403 `owner_approval_required`; a caller with no
215
+ * owner credential gets 401. Before #999 this required the raw API token
216
+ * even from loopback, so the local dashboard could not use it; the owner
217
+ * session now counts too.
218
+ *
219
+ * On success `res.locals.ownerTokenFingerprint` names the credential for the
220
+ * audit trail: 8 hex of sha256(API token), `session-<8 hex>` for a dashboard
221
+ * session, or `relay`.
222
+ *
223
+ * @param req - Request
224
+ * @param res - Response
225
+ * @param next - Next
226
+ */
227
+ export declare const requireOwnerToken: RequestHandler;
228
+ /**
229
+ * {@link requireOwner} with the route's own 403 wording for agents.
230
+ *
231
+ * @param agentBody - 403 body for an agent
232
+ * @returns Express middleware
233
+ */
234
+ export declare function ownerOnly(agentBody: Record<string, unknown>): RequestHandler;
235
+ /**
236
+ * Whether an identity is an agent proven by a credential: its badge, or the
237
+ * process tree (an agent PTY's process presented the owner token). The
238
+ * legacy `X-Agent-Session` header alone is not proof — any local process can
239
+ * set it.
240
+ *
241
+ * @param identity - Caller identity
242
+ * @returns True for a badge or process-tree agent with a known session
243
+ */
244
+ export declare function isVerifiedAgent(identity: CallerIdentity): boolean;
245
+ /**
246
+ * Refuse a caller that is neither the owner nor a verified agent
247
+ * ({@link isVerifiedAgent}). An agent with only the legacy header gets 403
248
+ * `agent_badge_required`; everyone else without a credential gets 401.
249
+ *
250
+ * @param req - Request
251
+ * @param res - Response
252
+ * @param action - What the caller tried, for the 403 message (e.g. "Writing into an agent's terminal")
253
+ * @returns True when refused (response written)
254
+ */
255
+ export declare function rejectUnverifiedCaller(req: Request, res: Response, action: string): boolean;
256
+ /**
257
+ * Express middleware form of {@link rejectUnverifiedCaller}: the owner, or an
258
+ * agent identified by its badge (or the process tree).
259
+ *
260
+ * @param action - What the route does, for the 403 message
261
+ * @returns Express middleware
262
+ *
263
+ * @example
264
+ * ```ts
265
+ * router.post('/terminal/:s/write', ownerOrVerifiedAgent("Writing into an agent's terminal"), handler);
266
+ * ```
267
+ */
268
+ export declare function ownerOrVerifiedAgent(action: string): RequestHandler;
269
+ /**
270
+ * {@link ownerOrVerifiedAgent} for the one route a scheduled command may use:
271
+ * delivering a plain message to an agent. A `scheduler` caller passes only with
272
+ * `mode: "message"` and no `workItemId` (a hand-over can clear the agent's
273
+ * conversation); anything else is 403 `scheduler_message_only`. Owner and
274
+ * verified agents are treated exactly as {@link ownerOrVerifiedAgent} does.
275
+ *
276
+ * @param action - What the route does, for the 403 message
277
+ * @returns Express middleware
278
+ */
279
+ export declare function ownerOrVerifiedAgentOrScheduler(action: string): RequestHandler;
280
+ /**
281
+ * Build the `/api` middleware.
282
+ *
283
+ * @param peers - Process classifier. The server passes one that knows the
284
+ * live agent PTYs (`liveSessionPids` from the agent-origin middleware), so
285
+ * the terminal check and session names work; without it only the
286
+ * ancestry and environment checks run.
287
+ * @returns Express middleware
288
+ */
289
+ export declare function createCallerIdentityMiddleware(peers?: PeerProcessService): RequestHandler;
290
+ //# sourceMappingURL=caller-identity.middleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"caller-identity.middleware.d.ts","sourceRoot":"","sources":["../../../../../backend/src/middleware/caller-identity.middleware.ts"],"names":[],"mappings":"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"}