@knpkv/herdr-fleet 0.3.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/model.d.ts CHANGED
@@ -1,8 +1,10 @@
1
1
  import { Schema } from "effect";
2
2
  export declare const JobIdentifier: Schema.String;
3
+ export declare const HostOperationReceipt: Schema.String;
4
+ export type HostOperationReceipt = typeof HostOperationReceipt.Type;
3
5
  export declare const JobHash: Schema.String;
4
6
  export type JobHash = typeof JobHash.Type;
5
- export declare const DelegateMode: Schema.Literals<readonly ["consult", "review", "work"]>;
7
+ export declare const DelegateMode: Schema.Literals<readonly ["consult", "review", "transition_summary", "work"]>;
6
8
  export type DelegateMode = typeof DelegateMode.Type;
7
9
  export declare const AgentStableId: Schema.String;
8
10
  export type AgentStableId = typeof AgentStableId.Type;
@@ -49,7 +51,7 @@ export declare const AgentDelegate: Schema.Struct<{
49
51
  readonly kind: Schema.Literal<"agent.delegate">;
50
52
  readonly repository: Schema.String;
51
53
  readonly prompt: Schema.String;
52
- readonly mode: Schema.Literals<readonly ["consult", "review", "work"]>;
54
+ readonly mode: Schema.Literals<readonly ["consult", "review", "transition_summary", "work"]>;
53
55
  readonly channel: Schema.optionalKey<Schema.Literal<"coordinator_chat">>;
54
56
  }>;
55
57
  export type AgentDelegate = typeof AgentDelegate.Type;
@@ -58,11 +60,193 @@ export declare const AgentMessage: Schema.Struct<{
58
60
  readonly session: Schema.String;
59
61
  readonly message: Schema.String;
60
62
  }>;
63
+ /** Approval-bound, exact existing-owner Work reconciliation. */
64
+ export declare const WorkReconcile: Schema.Struct<{
65
+ readonly kind: Schema.Literal<"work.reconcile">;
66
+ readonly repository: Schema.String;
67
+ readonly pullRequest: Schema.Number;
68
+ readonly goalId: Schema.String;
69
+ readonly laneId: Schema.String;
70
+ readonly operationId: Schema.String;
71
+ readonly expectedRevision: Schema.Number;
72
+ readonly expectedHead: Schema.String;
73
+ readonly newHead: Schema.String;
74
+ readonly expectedOwner: Schema.Struct<{
75
+ readonly id: Schema.String;
76
+ readonly name: Schema.String;
77
+ }>;
78
+ readonly expectedGoalEventId: Schema.String;
79
+ readonly bindingDispatchRequestId: Schema.String;
80
+ readonly sessionId: Schema.String;
81
+ readonly expectedWork: Schema.String;
82
+ readonly worker: Schema.Struct<{
83
+ readonly host: Schema.String;
84
+ readonly agentId: Schema.String;
85
+ readonly name: Schema.String;
86
+ readonly paneId: Schema.String;
87
+ readonly relationship: Schema.optionalKey<Schema.Struct<{
88
+ readonly parentAgentId: Schema.String;
89
+ readonly relation: Schema.Literals<readonly ["delegated", "pair", "review"]>;
90
+ }>>;
91
+ }>;
92
+ readonly worktree: Schema.String;
93
+ readonly branch: Schema.String;
94
+ }>;
95
+ export type WorkReconcile = typeof WorkReconcile.Type;
96
+ /** A new, prospective Work admission for an already-running settled owner. */
97
+ export declare const WorkAdmit: Schema.Struct<{
98
+ readonly kind: Schema.Literal<"work.admit">;
99
+ readonly repository: Schema.String;
100
+ readonly pullRequest: Schema.Number;
101
+ readonly reviewUrl: Schema.String;
102
+ readonly goalId: Schema.String;
103
+ readonly laneId: Schema.String;
104
+ readonly operationId: Schema.String;
105
+ readonly expectedAbsenceToken: Schema.String;
106
+ readonly head: Schema.String;
107
+ readonly baseHead: Schema.String;
108
+ readonly owner: Schema.Struct<{
109
+ readonly id: Schema.String;
110
+ readonly name: Schema.String;
111
+ }>;
112
+ readonly sessionId: Schema.String;
113
+ readonly expectedWork: Schema.String;
114
+ readonly worker: Schema.Struct<{
115
+ readonly host: Schema.String;
116
+ readonly agentId: Schema.String;
117
+ readonly name: Schema.String;
118
+ readonly paneId: Schema.String;
119
+ readonly relationship: Schema.optionalKey<Schema.Struct<{
120
+ readonly parentAgentId: Schema.String;
121
+ readonly relation: Schema.Literals<readonly ["delegated", "pair", "review"]>;
122
+ }>>;
123
+ }>;
124
+ readonly worktree: Schema.String;
125
+ readonly branch: Schema.String;
126
+ readonly title: Schema.String;
127
+ readonly summary: Schema.String;
128
+ readonly detail: Schema.String;
129
+ }>;
130
+ export type WorkAdmit = typeof WorkAdmit.Type;
131
+ /** Approval-bound linkage of one existing canonical goal to its settled owner. */
132
+ export declare const WorkRecover: Schema.Struct<{
133
+ readonly kind: Schema.Literal<"work.recover">;
134
+ readonly repository: Schema.String;
135
+ readonly pullRequest: Schema.Number;
136
+ readonly reviewUrl: Schema.String;
137
+ readonly goalId: Schema.String;
138
+ readonly laneId: Schema.String;
139
+ readonly operationId: Schema.String;
140
+ readonly expectedGoalEventId: Schema.String;
141
+ readonly expectedGoalUpdatedAt: Schema.Number;
142
+ readonly expectedHistoryToken: Schema.String;
143
+ readonly head: Schema.String;
144
+ readonly baseHead: Schema.String;
145
+ readonly owner: Schema.Struct<{
146
+ readonly id: Schema.String;
147
+ readonly name: Schema.String;
148
+ }>;
149
+ readonly sessionId: Schema.String;
150
+ readonly expectedWork: Schema.String;
151
+ readonly worker: Schema.Struct<{
152
+ readonly host: Schema.String;
153
+ readonly agentId: Schema.String;
154
+ readonly name: Schema.String;
155
+ readonly paneId: Schema.String;
156
+ readonly relationship: Schema.optionalKey<Schema.Struct<{
157
+ readonly parentAgentId: Schema.String;
158
+ readonly relation: Schema.Literals<readonly ["delegated", "pair", "review"]>;
159
+ }>>;
160
+ }>;
161
+ readonly worktree: Schema.String;
162
+ readonly branch: Schema.String;
163
+ }>;
164
+ export type WorkRecover = typeof WorkRecover.Type;
165
+ /**
166
+ * The agent target a reassigned goal ends with: `set` points it at a new
167
+ * worker, `clear` removes it, and `keep` is accepted only when the goal has no
168
+ * target, so a reassignment never leaves the previous owner's agent in place.
169
+ */
170
+ export declare const WorkReassignAgent: Schema.TaggedUnion<{
171
+ readonly clear: Schema.TaggedStruct<"clear", {}>;
172
+ readonly keep: Schema.TaggedStruct<"keep", {}>;
173
+ readonly set: Schema.TaggedStruct<"set", {
174
+ readonly agent: Schema.Struct<{
175
+ readonly host: Schema.String;
176
+ readonly agentId: Schema.String;
177
+ readonly name: Schema.String;
178
+ readonly paneId: Schema.String;
179
+ readonly relationship: Schema.optionalKey<Schema.Struct<{
180
+ readonly parentAgentId: Schema.String;
181
+ readonly relation: Schema.Literals<readonly ["delegated", "pair", "review"]>;
182
+ }>>;
183
+ }>;
184
+ }>;
185
+ }>;
186
+ export type WorkReassignAgent = typeof WorkReassignAgent.Type;
187
+ /** Activity text the Work store records for an approved reassignment. */
188
+ export declare const workReassignActivitySummary: (payload: {
189
+ readonly from: {
190
+ readonly id: string;
191
+ readonly name: string;
192
+ };
193
+ readonly to: {
194
+ readonly id: string;
195
+ readonly name: string;
196
+ };
197
+ readonly reason: string;
198
+ }, approvalJobId: string, approvalHash: string) => string;
199
+ /**
200
+ * Accepts a reassignment only when its target owner and its longest possible
201
+ * activity summary fit Work's durable limits, so nothing approved can fail to
202
+ * record for size or control characters.
203
+ */
204
+ export declare const workReassignIsRecordable: (payload: Parameters<typeof workReassignActivitySummary>[0]) => boolean;
205
+ /**
206
+ * Approval-bound transfer of one Work goal, and its active lane, from the exact
207
+ * current owner to a new owner.
208
+ */
209
+ export declare const WorkReassign: Schema.Struct<{
210
+ readonly kind: Schema.Literal<"work.reassign">;
211
+ readonly goalId: Schema.String;
212
+ readonly from: Schema.Struct<{
213
+ readonly id: Schema.String;
214
+ readonly name: Schema.String;
215
+ }>;
216
+ readonly to: Schema.Struct<{
217
+ readonly id: Schema.String;
218
+ readonly name: Schema.String;
219
+ }>;
220
+ readonly toAgent: Schema.TaggedUnion<{
221
+ readonly clear: Schema.TaggedStruct<"clear", {}>;
222
+ readonly keep: Schema.TaggedStruct<"keep", {}>;
223
+ readonly set: Schema.TaggedStruct<"set", {
224
+ readonly agent: Schema.Struct<{
225
+ readonly host: Schema.String;
226
+ readonly agentId: Schema.String;
227
+ readonly name: Schema.String;
228
+ readonly paneId: Schema.String;
229
+ readonly relationship: Schema.optionalKey<Schema.Struct<{
230
+ readonly parentAgentId: Schema.String;
231
+ readonly relation: Schema.Literals<readonly ["delegated", "pair", "review"]>;
232
+ }>>;
233
+ }>;
234
+ }>;
235
+ }>;
236
+ readonly reason: Schema.String;
237
+ readonly expectedGoalEventId: Schema.String;
238
+ readonly expectedGoalUpdatedAt: Schema.Number;
239
+ }>;
240
+ export type WorkReassign = typeof WorkReassign.Type;
241
+ /** Fleet job kinds that change Work authority; only a composed Work adapter executes them. */
242
+ export declare const WorkJobKind: Schema.Literals<readonly ["work.reconcile", "work.admit", "work.recover", "work.reassign"]>;
243
+ export type WorkJobKind = typeof WorkJobKind.Type;
244
+ export declare const isWorkJobKind: <I>(input: I) => input is I & ("work.admit" | "work.reassign" | "work.reconcile" | "work.recover");
61
245
  export declare const BrowserMcpRecover: Schema.Struct<{
62
246
  readonly kind: Schema.Literal<"browser.mcp.recover">;
63
247
  }>;
64
248
  export type BrowserMcpRecover = typeof BrowserMcpRecover.Type;
65
- export declare const CoreJobPayload: Schema.Union<readonly [Schema.Struct<{
249
+ export declare const CoreJobPayload: Schema.Union<readonly [Schema.Union<readonly [Schema.Struct<{
66
250
  readonly kind: Schema.Literal<"nix.check">;
67
251
  }>, Schema.Struct<{
68
252
  readonly kind: Schema.Literal<"nix.apply">;
@@ -71,19 +255,142 @@ export declare const CoreJobPayload: Schema.Union<readonly [Schema.Struct<{
71
255
  readonly kind: Schema.Literal<"agent.delegate">;
72
256
  readonly repository: Schema.String;
73
257
  readonly prompt: Schema.String;
74
- readonly mode: Schema.Literals<readonly ["consult", "review", "work"]>;
258
+ readonly mode: Schema.Literals<readonly ["consult", "review", "transition_summary", "work"]>;
75
259
  readonly channel: Schema.optionalKey<Schema.Literal<"coordinator_chat">>;
76
260
  }>, Schema.Struct<{
77
261
  readonly kind: Schema.Literal<"agent.message">;
78
262
  readonly session: Schema.String;
79
263
  readonly message: Schema.String;
264
+ }>]>, Schema.Struct<{
265
+ readonly kind: Schema.Literal<"work.reconcile">;
266
+ readonly repository: Schema.String;
267
+ readonly pullRequest: Schema.Number;
268
+ readonly goalId: Schema.String;
269
+ readonly laneId: Schema.String;
270
+ readonly operationId: Schema.String;
271
+ readonly expectedRevision: Schema.Number;
272
+ readonly expectedHead: Schema.String;
273
+ readonly newHead: Schema.String;
274
+ readonly expectedOwner: Schema.Struct<{
275
+ readonly id: Schema.String;
276
+ readonly name: Schema.String;
277
+ }>;
278
+ readonly expectedGoalEventId: Schema.String;
279
+ readonly bindingDispatchRequestId: Schema.String;
280
+ readonly sessionId: Schema.String;
281
+ readonly expectedWork: Schema.String;
282
+ readonly worker: Schema.Struct<{
283
+ readonly host: Schema.String;
284
+ readonly agentId: Schema.String;
285
+ readonly name: Schema.String;
286
+ readonly paneId: Schema.String;
287
+ readonly relationship: Schema.optionalKey<Schema.Struct<{
288
+ readonly parentAgentId: Schema.String;
289
+ readonly relation: Schema.Literals<readonly ["delegated", "pair", "review"]>;
290
+ }>>;
291
+ }>;
292
+ readonly worktree: Schema.String;
293
+ readonly branch: Schema.String;
294
+ }>, Schema.Struct<{
295
+ readonly kind: Schema.Literal<"work.admit">;
296
+ readonly repository: Schema.String;
297
+ readonly pullRequest: Schema.Number;
298
+ readonly reviewUrl: Schema.String;
299
+ readonly goalId: Schema.String;
300
+ readonly laneId: Schema.String;
301
+ readonly operationId: Schema.String;
302
+ readonly expectedAbsenceToken: Schema.String;
303
+ readonly head: Schema.String;
304
+ readonly baseHead: Schema.String;
305
+ readonly owner: Schema.Struct<{
306
+ readonly id: Schema.String;
307
+ readonly name: Schema.String;
308
+ }>;
309
+ readonly sessionId: Schema.String;
310
+ readonly expectedWork: Schema.String;
311
+ readonly worker: Schema.Struct<{
312
+ readonly host: Schema.String;
313
+ readonly agentId: Schema.String;
314
+ readonly name: Schema.String;
315
+ readonly paneId: Schema.String;
316
+ readonly relationship: Schema.optionalKey<Schema.Struct<{
317
+ readonly parentAgentId: Schema.String;
318
+ readonly relation: Schema.Literals<readonly ["delegated", "pair", "review"]>;
319
+ }>>;
320
+ }>;
321
+ readonly worktree: Schema.String;
322
+ readonly branch: Schema.String;
323
+ readonly title: Schema.String;
324
+ readonly summary: Schema.String;
325
+ readonly detail: Schema.String;
326
+ }>, Schema.Struct<{
327
+ readonly kind: Schema.Literal<"work.recover">;
328
+ readonly repository: Schema.String;
329
+ readonly pullRequest: Schema.Number;
330
+ readonly reviewUrl: Schema.String;
331
+ readonly goalId: Schema.String;
332
+ readonly laneId: Schema.String;
333
+ readonly operationId: Schema.String;
334
+ readonly expectedGoalEventId: Schema.String;
335
+ readonly expectedGoalUpdatedAt: Schema.Number;
336
+ readonly expectedHistoryToken: Schema.String;
337
+ readonly head: Schema.String;
338
+ readonly baseHead: Schema.String;
339
+ readonly owner: Schema.Struct<{
340
+ readonly id: Schema.String;
341
+ readonly name: Schema.String;
342
+ }>;
343
+ readonly sessionId: Schema.String;
344
+ readonly expectedWork: Schema.String;
345
+ readonly worker: Schema.Struct<{
346
+ readonly host: Schema.String;
347
+ readonly agentId: Schema.String;
348
+ readonly name: Schema.String;
349
+ readonly paneId: Schema.String;
350
+ readonly relationship: Schema.optionalKey<Schema.Struct<{
351
+ readonly parentAgentId: Schema.String;
352
+ readonly relation: Schema.Literals<readonly ["delegated", "pair", "review"]>;
353
+ }>>;
354
+ }>;
355
+ readonly worktree: Schema.String;
356
+ readonly branch: Schema.String;
357
+ }>, Schema.Struct<{
358
+ readonly kind: Schema.Literal<"work.reassign">;
359
+ readonly goalId: Schema.String;
360
+ readonly from: Schema.Struct<{
361
+ readonly id: Schema.String;
362
+ readonly name: Schema.String;
363
+ }>;
364
+ readonly to: Schema.Struct<{
365
+ readonly id: Schema.String;
366
+ readonly name: Schema.String;
367
+ }>;
368
+ readonly toAgent: Schema.TaggedUnion<{
369
+ readonly clear: Schema.TaggedStruct<"clear", {}>;
370
+ readonly keep: Schema.TaggedStruct<"keep", {}>;
371
+ readonly set: Schema.TaggedStruct<"set", {
372
+ readonly agent: Schema.Struct<{
373
+ readonly host: Schema.String;
374
+ readonly agentId: Schema.String;
375
+ readonly name: Schema.String;
376
+ readonly paneId: Schema.String;
377
+ readonly relationship: Schema.optionalKey<Schema.Struct<{
378
+ readonly parentAgentId: Schema.String;
379
+ readonly relation: Schema.Literals<readonly ["delegated", "pair", "review"]>;
380
+ }>>;
381
+ }>;
382
+ }>;
383
+ }>;
384
+ readonly reason: Schema.String;
385
+ readonly expectedGoalEventId: Schema.String;
386
+ readonly expectedGoalUpdatedAt: Schema.Number;
80
387
  }>]>;
81
388
  export type CoreJobPayload = typeof CoreJobPayload.Type;
82
389
  export declare const LocalJobPayload: Schema.Struct<{
83
390
  readonly kind: Schema.Literal<"browser.mcp.recover">;
84
391
  }>;
85
392
  export type LocalJobPayload = typeof LocalJobPayload.Type;
86
- export declare const JobPayload: Schema.Union<readonly [Schema.Union<readonly [Schema.Struct<{
393
+ export declare const JobPayload: Schema.Union<readonly [Schema.Union<readonly [Schema.Union<readonly [Schema.Struct<{
87
394
  readonly kind: Schema.Literal<"nix.check">;
88
395
  }>, Schema.Struct<{
89
396
  readonly kind: Schema.Literal<"nix.apply">;
@@ -92,18 +399,141 @@ export declare const JobPayload: Schema.Union<readonly [Schema.Union<readonly [S
92
399
  readonly kind: Schema.Literal<"agent.delegate">;
93
400
  readonly repository: Schema.String;
94
401
  readonly prompt: Schema.String;
95
- readonly mode: Schema.Literals<readonly ["consult", "review", "work"]>;
402
+ readonly mode: Schema.Literals<readonly ["consult", "review", "transition_summary", "work"]>;
96
403
  readonly channel: Schema.optionalKey<Schema.Literal<"coordinator_chat">>;
97
404
  }>, Schema.Struct<{
98
405
  readonly kind: Schema.Literal<"agent.message">;
99
406
  readonly session: Schema.String;
100
407
  readonly message: Schema.String;
408
+ }>]>, Schema.Struct<{
409
+ readonly kind: Schema.Literal<"work.reconcile">;
410
+ readonly repository: Schema.String;
411
+ readonly pullRequest: Schema.Number;
412
+ readonly goalId: Schema.String;
413
+ readonly laneId: Schema.String;
414
+ readonly operationId: Schema.String;
415
+ readonly expectedRevision: Schema.Number;
416
+ readonly expectedHead: Schema.String;
417
+ readonly newHead: Schema.String;
418
+ readonly expectedOwner: Schema.Struct<{
419
+ readonly id: Schema.String;
420
+ readonly name: Schema.String;
421
+ }>;
422
+ readonly expectedGoalEventId: Schema.String;
423
+ readonly bindingDispatchRequestId: Schema.String;
424
+ readonly sessionId: Schema.String;
425
+ readonly expectedWork: Schema.String;
426
+ readonly worker: Schema.Struct<{
427
+ readonly host: Schema.String;
428
+ readonly agentId: Schema.String;
429
+ readonly name: Schema.String;
430
+ readonly paneId: Schema.String;
431
+ readonly relationship: Schema.optionalKey<Schema.Struct<{
432
+ readonly parentAgentId: Schema.String;
433
+ readonly relation: Schema.Literals<readonly ["delegated", "pair", "review"]>;
434
+ }>>;
435
+ }>;
436
+ readonly worktree: Schema.String;
437
+ readonly branch: Schema.String;
438
+ }>, Schema.Struct<{
439
+ readonly kind: Schema.Literal<"work.admit">;
440
+ readonly repository: Schema.String;
441
+ readonly pullRequest: Schema.Number;
442
+ readonly reviewUrl: Schema.String;
443
+ readonly goalId: Schema.String;
444
+ readonly laneId: Schema.String;
445
+ readonly operationId: Schema.String;
446
+ readonly expectedAbsenceToken: Schema.String;
447
+ readonly head: Schema.String;
448
+ readonly baseHead: Schema.String;
449
+ readonly owner: Schema.Struct<{
450
+ readonly id: Schema.String;
451
+ readonly name: Schema.String;
452
+ }>;
453
+ readonly sessionId: Schema.String;
454
+ readonly expectedWork: Schema.String;
455
+ readonly worker: Schema.Struct<{
456
+ readonly host: Schema.String;
457
+ readonly agentId: Schema.String;
458
+ readonly name: Schema.String;
459
+ readonly paneId: Schema.String;
460
+ readonly relationship: Schema.optionalKey<Schema.Struct<{
461
+ readonly parentAgentId: Schema.String;
462
+ readonly relation: Schema.Literals<readonly ["delegated", "pair", "review"]>;
463
+ }>>;
464
+ }>;
465
+ readonly worktree: Schema.String;
466
+ readonly branch: Schema.String;
467
+ readonly title: Schema.String;
468
+ readonly summary: Schema.String;
469
+ readonly detail: Schema.String;
470
+ }>, Schema.Struct<{
471
+ readonly kind: Schema.Literal<"work.recover">;
472
+ readonly repository: Schema.String;
473
+ readonly pullRequest: Schema.Number;
474
+ readonly reviewUrl: Schema.String;
475
+ readonly goalId: Schema.String;
476
+ readonly laneId: Schema.String;
477
+ readonly operationId: Schema.String;
478
+ readonly expectedGoalEventId: Schema.String;
479
+ readonly expectedGoalUpdatedAt: Schema.Number;
480
+ readonly expectedHistoryToken: Schema.String;
481
+ readonly head: Schema.String;
482
+ readonly baseHead: Schema.String;
483
+ readonly owner: Schema.Struct<{
484
+ readonly id: Schema.String;
485
+ readonly name: Schema.String;
486
+ }>;
487
+ readonly sessionId: Schema.String;
488
+ readonly expectedWork: Schema.String;
489
+ readonly worker: Schema.Struct<{
490
+ readonly host: Schema.String;
491
+ readonly agentId: Schema.String;
492
+ readonly name: Schema.String;
493
+ readonly paneId: Schema.String;
494
+ readonly relationship: Schema.optionalKey<Schema.Struct<{
495
+ readonly parentAgentId: Schema.String;
496
+ readonly relation: Schema.Literals<readonly ["delegated", "pair", "review"]>;
497
+ }>>;
498
+ }>;
499
+ readonly worktree: Schema.String;
500
+ readonly branch: Schema.String;
501
+ }>, Schema.Struct<{
502
+ readonly kind: Schema.Literal<"work.reassign">;
503
+ readonly goalId: Schema.String;
504
+ readonly from: Schema.Struct<{
505
+ readonly id: Schema.String;
506
+ readonly name: Schema.String;
507
+ }>;
508
+ readonly to: Schema.Struct<{
509
+ readonly id: Schema.String;
510
+ readonly name: Schema.String;
511
+ }>;
512
+ readonly toAgent: Schema.TaggedUnion<{
513
+ readonly clear: Schema.TaggedStruct<"clear", {}>;
514
+ readonly keep: Schema.TaggedStruct<"keep", {}>;
515
+ readonly set: Schema.TaggedStruct<"set", {
516
+ readonly agent: Schema.Struct<{
517
+ readonly host: Schema.String;
518
+ readonly agentId: Schema.String;
519
+ readonly name: Schema.String;
520
+ readonly paneId: Schema.String;
521
+ readonly relationship: Schema.optionalKey<Schema.Struct<{
522
+ readonly parentAgentId: Schema.String;
523
+ readonly relation: Schema.Literals<readonly ["delegated", "pair", "review"]>;
524
+ }>>;
525
+ }>;
526
+ }>;
527
+ }>;
528
+ readonly reason: Schema.String;
529
+ readonly expectedGoalEventId: Schema.String;
530
+ readonly expectedGoalUpdatedAt: Schema.Number;
101
531
  }>]>, Schema.Struct<{
102
532
  readonly kind: Schema.Literal<"browser.mcp.recover">;
103
533
  }>]>;
104
534
  export type JobPayload = typeof JobPayload.Type;
105
535
  export declare const JobRequest: Schema.Struct<{
106
- readonly payload: Schema.Union<readonly [Schema.Union<readonly [Schema.Struct<{
536
+ readonly payload: Schema.Union<readonly [Schema.Union<readonly [Schema.Union<readonly [Schema.Struct<{
107
537
  readonly kind: Schema.Literal<"nix.check">;
108
538
  }>, Schema.Struct<{
109
539
  readonly kind: Schema.Literal<"nix.apply">;
@@ -112,12 +542,135 @@ export declare const JobRequest: Schema.Struct<{
112
542
  readonly kind: Schema.Literal<"agent.delegate">;
113
543
  readonly repository: Schema.String;
114
544
  readonly prompt: Schema.String;
115
- readonly mode: Schema.Literals<readonly ["consult", "review", "work"]>;
545
+ readonly mode: Schema.Literals<readonly ["consult", "review", "transition_summary", "work"]>;
116
546
  readonly channel: Schema.optionalKey<Schema.Literal<"coordinator_chat">>;
117
547
  }>, Schema.Struct<{
118
548
  readonly kind: Schema.Literal<"agent.message">;
119
549
  readonly session: Schema.String;
120
550
  readonly message: Schema.String;
551
+ }>]>, Schema.Struct<{
552
+ readonly kind: Schema.Literal<"work.reconcile">;
553
+ readonly repository: Schema.String;
554
+ readonly pullRequest: Schema.Number;
555
+ readonly goalId: Schema.String;
556
+ readonly laneId: Schema.String;
557
+ readonly operationId: Schema.String;
558
+ readonly expectedRevision: Schema.Number;
559
+ readonly expectedHead: Schema.String;
560
+ readonly newHead: Schema.String;
561
+ readonly expectedOwner: Schema.Struct<{
562
+ readonly id: Schema.String;
563
+ readonly name: Schema.String;
564
+ }>;
565
+ readonly expectedGoalEventId: Schema.String;
566
+ readonly bindingDispatchRequestId: Schema.String;
567
+ readonly sessionId: Schema.String;
568
+ readonly expectedWork: Schema.String;
569
+ readonly worker: Schema.Struct<{
570
+ readonly host: Schema.String;
571
+ readonly agentId: Schema.String;
572
+ readonly name: Schema.String;
573
+ readonly paneId: Schema.String;
574
+ readonly relationship: Schema.optionalKey<Schema.Struct<{
575
+ readonly parentAgentId: Schema.String;
576
+ readonly relation: Schema.Literals<readonly ["delegated", "pair", "review"]>;
577
+ }>>;
578
+ }>;
579
+ readonly worktree: Schema.String;
580
+ readonly branch: Schema.String;
581
+ }>, Schema.Struct<{
582
+ readonly kind: Schema.Literal<"work.admit">;
583
+ readonly repository: Schema.String;
584
+ readonly pullRequest: Schema.Number;
585
+ readonly reviewUrl: Schema.String;
586
+ readonly goalId: Schema.String;
587
+ readonly laneId: Schema.String;
588
+ readonly operationId: Schema.String;
589
+ readonly expectedAbsenceToken: Schema.String;
590
+ readonly head: Schema.String;
591
+ readonly baseHead: Schema.String;
592
+ readonly owner: Schema.Struct<{
593
+ readonly id: Schema.String;
594
+ readonly name: Schema.String;
595
+ }>;
596
+ readonly sessionId: Schema.String;
597
+ readonly expectedWork: Schema.String;
598
+ readonly worker: Schema.Struct<{
599
+ readonly host: Schema.String;
600
+ readonly agentId: Schema.String;
601
+ readonly name: Schema.String;
602
+ readonly paneId: Schema.String;
603
+ readonly relationship: Schema.optionalKey<Schema.Struct<{
604
+ readonly parentAgentId: Schema.String;
605
+ readonly relation: Schema.Literals<readonly ["delegated", "pair", "review"]>;
606
+ }>>;
607
+ }>;
608
+ readonly worktree: Schema.String;
609
+ readonly branch: Schema.String;
610
+ readonly title: Schema.String;
611
+ readonly summary: Schema.String;
612
+ readonly detail: Schema.String;
613
+ }>, Schema.Struct<{
614
+ readonly kind: Schema.Literal<"work.recover">;
615
+ readonly repository: Schema.String;
616
+ readonly pullRequest: Schema.Number;
617
+ readonly reviewUrl: Schema.String;
618
+ readonly goalId: Schema.String;
619
+ readonly laneId: Schema.String;
620
+ readonly operationId: Schema.String;
621
+ readonly expectedGoalEventId: Schema.String;
622
+ readonly expectedGoalUpdatedAt: Schema.Number;
623
+ readonly expectedHistoryToken: Schema.String;
624
+ readonly head: Schema.String;
625
+ readonly baseHead: Schema.String;
626
+ readonly owner: Schema.Struct<{
627
+ readonly id: Schema.String;
628
+ readonly name: Schema.String;
629
+ }>;
630
+ readonly sessionId: Schema.String;
631
+ readonly expectedWork: Schema.String;
632
+ readonly worker: Schema.Struct<{
633
+ readonly host: Schema.String;
634
+ readonly agentId: Schema.String;
635
+ readonly name: Schema.String;
636
+ readonly paneId: Schema.String;
637
+ readonly relationship: Schema.optionalKey<Schema.Struct<{
638
+ readonly parentAgentId: Schema.String;
639
+ readonly relation: Schema.Literals<readonly ["delegated", "pair", "review"]>;
640
+ }>>;
641
+ }>;
642
+ readonly worktree: Schema.String;
643
+ readonly branch: Schema.String;
644
+ }>, Schema.Struct<{
645
+ readonly kind: Schema.Literal<"work.reassign">;
646
+ readonly goalId: Schema.String;
647
+ readonly from: Schema.Struct<{
648
+ readonly id: Schema.String;
649
+ readonly name: Schema.String;
650
+ }>;
651
+ readonly to: Schema.Struct<{
652
+ readonly id: Schema.String;
653
+ readonly name: Schema.String;
654
+ }>;
655
+ readonly toAgent: Schema.TaggedUnion<{
656
+ readonly clear: Schema.TaggedStruct<"clear", {}>;
657
+ readonly keep: Schema.TaggedStruct<"keep", {}>;
658
+ readonly set: Schema.TaggedStruct<"set", {
659
+ readonly agent: Schema.Struct<{
660
+ readonly host: Schema.String;
661
+ readonly agentId: Schema.String;
662
+ readonly name: Schema.String;
663
+ readonly paneId: Schema.String;
664
+ readonly relationship: Schema.optionalKey<Schema.Struct<{
665
+ readonly parentAgentId: Schema.String;
666
+ readonly relation: Schema.Literals<readonly ["delegated", "pair", "review"]>;
667
+ }>>;
668
+ }>;
669
+ }>;
670
+ }>;
671
+ readonly reason: Schema.String;
672
+ readonly expectedGoalEventId: Schema.String;
673
+ readonly expectedGoalUpdatedAt: Schema.Number;
121
674
  }>]>, Schema.Struct<{
122
675
  readonly kind: Schema.Literal<"browser.mcp.recover">;
123
676
  }>]>;
@@ -168,7 +721,7 @@ export declare const JobRecord: Schema.Struct<{
168
721
  readonly rejectedAt: Schema.optionalKey<Schema.NullOr<Schema.Number>>;
169
722
  readonly expiredAt: Schema.optionalKey<Schema.NullOr<Schema.Number>>;
170
723
  readonly status: Schema.Literals<readonly ["pending_approval", "queued", "running", "succeeded", "failed", "interrupted", "rejected", "expired"]>;
171
- readonly payload: Schema.Union<readonly [Schema.Union<readonly [Schema.Struct<{
724
+ readonly payload: Schema.Union<readonly [Schema.Union<readonly [Schema.Union<readonly [Schema.Struct<{
172
725
  readonly kind: Schema.Literal<"nix.check">;
173
726
  }>, Schema.Struct<{
174
727
  readonly kind: Schema.Literal<"nix.apply">;
@@ -177,16 +730,141 @@ export declare const JobRecord: Schema.Struct<{
177
730
  readonly kind: Schema.Literal<"agent.delegate">;
178
731
  readonly repository: Schema.String;
179
732
  readonly prompt: Schema.String;
180
- readonly mode: Schema.Literals<readonly ["consult", "review", "work"]>;
733
+ readonly mode: Schema.Literals<readonly ["consult", "review", "transition_summary", "work"]>;
181
734
  readonly channel: Schema.optionalKey<Schema.Literal<"coordinator_chat">>;
182
735
  }>, Schema.Struct<{
183
736
  readonly kind: Schema.Literal<"agent.message">;
184
737
  readonly session: Schema.String;
185
738
  readonly message: Schema.String;
739
+ }>]>, Schema.Struct<{
740
+ readonly kind: Schema.Literal<"work.reconcile">;
741
+ readonly repository: Schema.String;
742
+ readonly pullRequest: Schema.Number;
743
+ readonly goalId: Schema.String;
744
+ readonly laneId: Schema.String;
745
+ readonly operationId: Schema.String;
746
+ readonly expectedRevision: Schema.Number;
747
+ readonly expectedHead: Schema.String;
748
+ readonly newHead: Schema.String;
749
+ readonly expectedOwner: Schema.Struct<{
750
+ readonly id: Schema.String;
751
+ readonly name: Schema.String;
752
+ }>;
753
+ readonly expectedGoalEventId: Schema.String;
754
+ readonly bindingDispatchRequestId: Schema.String;
755
+ readonly sessionId: Schema.String;
756
+ readonly expectedWork: Schema.String;
757
+ readonly worker: Schema.Struct<{
758
+ readonly host: Schema.String;
759
+ readonly agentId: Schema.String;
760
+ readonly name: Schema.String;
761
+ readonly paneId: Schema.String;
762
+ readonly relationship: Schema.optionalKey<Schema.Struct<{
763
+ readonly parentAgentId: Schema.String;
764
+ readonly relation: Schema.Literals<readonly ["delegated", "pair", "review"]>;
765
+ }>>;
766
+ }>;
767
+ readonly worktree: Schema.String;
768
+ readonly branch: Schema.String;
769
+ }>, Schema.Struct<{
770
+ readonly kind: Schema.Literal<"work.admit">;
771
+ readonly repository: Schema.String;
772
+ readonly pullRequest: Schema.Number;
773
+ readonly reviewUrl: Schema.String;
774
+ readonly goalId: Schema.String;
775
+ readonly laneId: Schema.String;
776
+ readonly operationId: Schema.String;
777
+ readonly expectedAbsenceToken: Schema.String;
778
+ readonly head: Schema.String;
779
+ readonly baseHead: Schema.String;
780
+ readonly owner: Schema.Struct<{
781
+ readonly id: Schema.String;
782
+ readonly name: Schema.String;
783
+ }>;
784
+ readonly sessionId: Schema.String;
785
+ readonly expectedWork: Schema.String;
786
+ readonly worker: Schema.Struct<{
787
+ readonly host: Schema.String;
788
+ readonly agentId: Schema.String;
789
+ readonly name: Schema.String;
790
+ readonly paneId: Schema.String;
791
+ readonly relationship: Schema.optionalKey<Schema.Struct<{
792
+ readonly parentAgentId: Schema.String;
793
+ readonly relation: Schema.Literals<readonly ["delegated", "pair", "review"]>;
794
+ }>>;
795
+ }>;
796
+ readonly worktree: Schema.String;
797
+ readonly branch: Schema.String;
798
+ readonly title: Schema.String;
799
+ readonly summary: Schema.String;
800
+ readonly detail: Schema.String;
801
+ }>, Schema.Struct<{
802
+ readonly kind: Schema.Literal<"work.recover">;
803
+ readonly repository: Schema.String;
804
+ readonly pullRequest: Schema.Number;
805
+ readonly reviewUrl: Schema.String;
806
+ readonly goalId: Schema.String;
807
+ readonly laneId: Schema.String;
808
+ readonly operationId: Schema.String;
809
+ readonly expectedGoalEventId: Schema.String;
810
+ readonly expectedGoalUpdatedAt: Schema.Number;
811
+ readonly expectedHistoryToken: Schema.String;
812
+ readonly head: Schema.String;
813
+ readonly baseHead: Schema.String;
814
+ readonly owner: Schema.Struct<{
815
+ readonly id: Schema.String;
816
+ readonly name: Schema.String;
817
+ }>;
818
+ readonly sessionId: Schema.String;
819
+ readonly expectedWork: Schema.String;
820
+ readonly worker: Schema.Struct<{
821
+ readonly host: Schema.String;
822
+ readonly agentId: Schema.String;
823
+ readonly name: Schema.String;
824
+ readonly paneId: Schema.String;
825
+ readonly relationship: Schema.optionalKey<Schema.Struct<{
826
+ readonly parentAgentId: Schema.String;
827
+ readonly relation: Schema.Literals<readonly ["delegated", "pair", "review"]>;
828
+ }>>;
829
+ }>;
830
+ readonly worktree: Schema.String;
831
+ readonly branch: Schema.String;
832
+ }>, Schema.Struct<{
833
+ readonly kind: Schema.Literal<"work.reassign">;
834
+ readonly goalId: Schema.String;
835
+ readonly from: Schema.Struct<{
836
+ readonly id: Schema.String;
837
+ readonly name: Schema.String;
838
+ }>;
839
+ readonly to: Schema.Struct<{
840
+ readonly id: Schema.String;
841
+ readonly name: Schema.String;
842
+ }>;
843
+ readonly toAgent: Schema.TaggedUnion<{
844
+ readonly clear: Schema.TaggedStruct<"clear", {}>;
845
+ readonly keep: Schema.TaggedStruct<"keep", {}>;
846
+ readonly set: Schema.TaggedStruct<"set", {
847
+ readonly agent: Schema.Struct<{
848
+ readonly host: Schema.String;
849
+ readonly agentId: Schema.String;
850
+ readonly name: Schema.String;
851
+ readonly paneId: Schema.String;
852
+ readonly relationship: Schema.optionalKey<Schema.Struct<{
853
+ readonly parentAgentId: Schema.String;
854
+ readonly relation: Schema.Literals<readonly ["delegated", "pair", "review"]>;
855
+ }>>;
856
+ }>;
857
+ }>;
858
+ }>;
859
+ readonly reason: Schema.String;
860
+ readonly expectedGoalEventId: Schema.String;
861
+ readonly expectedGoalUpdatedAt: Schema.Number;
186
862
  }>]>, Schema.Struct<{
187
863
  readonly kind: Schema.Literal<"browser.mcp.recover">;
188
864
  }>]>;
189
865
  readonly result: Schema.NullOr<Schema.String>;
866
+ readonly acceptedReceipt: Schema.optionalKey<Schema.NullOr<Schema.String>>;
867
+ readonly durableOperation: Schema.optionalKey<Schema.Literal<true>>;
190
868
  readonly error: Schema.NullOr<Schema.String>;
191
869
  readonly worker: Schema.optionalKey<Schema.Struct<{
192
870
  readonly host: Schema.String;
@@ -226,7 +904,7 @@ export declare const JobHistoryPage: Schema.Struct<{
226
904
  readonly rejectedAt: Schema.optionalKey<Schema.NullOr<Schema.Number>>;
227
905
  readonly expiredAt: Schema.optionalKey<Schema.NullOr<Schema.Number>>;
228
906
  readonly status: Schema.Literals<readonly ["pending_approval", "queued", "running", "succeeded", "failed", "interrupted", "rejected", "expired"]>;
229
- readonly payload: Schema.Union<readonly [Schema.Union<readonly [Schema.Struct<{
907
+ readonly payload: Schema.Union<readonly [Schema.Union<readonly [Schema.Union<readonly [Schema.Struct<{
230
908
  readonly kind: Schema.Literal<"nix.check">;
231
909
  }>, Schema.Struct<{
232
910
  readonly kind: Schema.Literal<"nix.apply">;
@@ -235,16 +913,141 @@ export declare const JobHistoryPage: Schema.Struct<{
235
913
  readonly kind: Schema.Literal<"agent.delegate">;
236
914
  readonly repository: Schema.String;
237
915
  readonly prompt: Schema.String;
238
- readonly mode: Schema.Literals<readonly ["consult", "review", "work"]>;
916
+ readonly mode: Schema.Literals<readonly ["consult", "review", "transition_summary", "work"]>;
239
917
  readonly channel: Schema.optionalKey<Schema.Literal<"coordinator_chat">>;
240
918
  }>, Schema.Struct<{
241
919
  readonly kind: Schema.Literal<"agent.message">;
242
920
  readonly session: Schema.String;
243
921
  readonly message: Schema.String;
922
+ }>]>, Schema.Struct<{
923
+ readonly kind: Schema.Literal<"work.reconcile">;
924
+ readonly repository: Schema.String;
925
+ readonly pullRequest: Schema.Number;
926
+ readonly goalId: Schema.String;
927
+ readonly laneId: Schema.String;
928
+ readonly operationId: Schema.String;
929
+ readonly expectedRevision: Schema.Number;
930
+ readonly expectedHead: Schema.String;
931
+ readonly newHead: Schema.String;
932
+ readonly expectedOwner: Schema.Struct<{
933
+ readonly id: Schema.String;
934
+ readonly name: Schema.String;
935
+ }>;
936
+ readonly expectedGoalEventId: Schema.String;
937
+ readonly bindingDispatchRequestId: Schema.String;
938
+ readonly sessionId: Schema.String;
939
+ readonly expectedWork: Schema.String;
940
+ readonly worker: Schema.Struct<{
941
+ readonly host: Schema.String;
942
+ readonly agentId: Schema.String;
943
+ readonly name: Schema.String;
944
+ readonly paneId: Schema.String;
945
+ readonly relationship: Schema.optionalKey<Schema.Struct<{
946
+ readonly parentAgentId: Schema.String;
947
+ readonly relation: Schema.Literals<readonly ["delegated", "pair", "review"]>;
948
+ }>>;
949
+ }>;
950
+ readonly worktree: Schema.String;
951
+ readonly branch: Schema.String;
952
+ }>, Schema.Struct<{
953
+ readonly kind: Schema.Literal<"work.admit">;
954
+ readonly repository: Schema.String;
955
+ readonly pullRequest: Schema.Number;
956
+ readonly reviewUrl: Schema.String;
957
+ readonly goalId: Schema.String;
958
+ readonly laneId: Schema.String;
959
+ readonly operationId: Schema.String;
960
+ readonly expectedAbsenceToken: Schema.String;
961
+ readonly head: Schema.String;
962
+ readonly baseHead: Schema.String;
963
+ readonly owner: Schema.Struct<{
964
+ readonly id: Schema.String;
965
+ readonly name: Schema.String;
966
+ }>;
967
+ readonly sessionId: Schema.String;
968
+ readonly expectedWork: Schema.String;
969
+ readonly worker: Schema.Struct<{
970
+ readonly host: Schema.String;
971
+ readonly agentId: Schema.String;
972
+ readonly name: Schema.String;
973
+ readonly paneId: Schema.String;
974
+ readonly relationship: Schema.optionalKey<Schema.Struct<{
975
+ readonly parentAgentId: Schema.String;
976
+ readonly relation: Schema.Literals<readonly ["delegated", "pair", "review"]>;
977
+ }>>;
978
+ }>;
979
+ readonly worktree: Schema.String;
980
+ readonly branch: Schema.String;
981
+ readonly title: Schema.String;
982
+ readonly summary: Schema.String;
983
+ readonly detail: Schema.String;
984
+ }>, Schema.Struct<{
985
+ readonly kind: Schema.Literal<"work.recover">;
986
+ readonly repository: Schema.String;
987
+ readonly pullRequest: Schema.Number;
988
+ readonly reviewUrl: Schema.String;
989
+ readonly goalId: Schema.String;
990
+ readonly laneId: Schema.String;
991
+ readonly operationId: Schema.String;
992
+ readonly expectedGoalEventId: Schema.String;
993
+ readonly expectedGoalUpdatedAt: Schema.Number;
994
+ readonly expectedHistoryToken: Schema.String;
995
+ readonly head: Schema.String;
996
+ readonly baseHead: Schema.String;
997
+ readonly owner: Schema.Struct<{
998
+ readonly id: Schema.String;
999
+ readonly name: Schema.String;
1000
+ }>;
1001
+ readonly sessionId: Schema.String;
1002
+ readonly expectedWork: Schema.String;
1003
+ readonly worker: Schema.Struct<{
1004
+ readonly host: Schema.String;
1005
+ readonly agentId: Schema.String;
1006
+ readonly name: Schema.String;
1007
+ readonly paneId: Schema.String;
1008
+ readonly relationship: Schema.optionalKey<Schema.Struct<{
1009
+ readonly parentAgentId: Schema.String;
1010
+ readonly relation: Schema.Literals<readonly ["delegated", "pair", "review"]>;
1011
+ }>>;
1012
+ }>;
1013
+ readonly worktree: Schema.String;
1014
+ readonly branch: Schema.String;
1015
+ }>, Schema.Struct<{
1016
+ readonly kind: Schema.Literal<"work.reassign">;
1017
+ readonly goalId: Schema.String;
1018
+ readonly from: Schema.Struct<{
1019
+ readonly id: Schema.String;
1020
+ readonly name: Schema.String;
1021
+ }>;
1022
+ readonly to: Schema.Struct<{
1023
+ readonly id: Schema.String;
1024
+ readonly name: Schema.String;
1025
+ }>;
1026
+ readonly toAgent: Schema.TaggedUnion<{
1027
+ readonly clear: Schema.TaggedStruct<"clear", {}>;
1028
+ readonly keep: Schema.TaggedStruct<"keep", {}>;
1029
+ readonly set: Schema.TaggedStruct<"set", {
1030
+ readonly agent: Schema.Struct<{
1031
+ readonly host: Schema.String;
1032
+ readonly agentId: Schema.String;
1033
+ readonly name: Schema.String;
1034
+ readonly paneId: Schema.String;
1035
+ readonly relationship: Schema.optionalKey<Schema.Struct<{
1036
+ readonly parentAgentId: Schema.String;
1037
+ readonly relation: Schema.Literals<readonly ["delegated", "pair", "review"]>;
1038
+ }>>;
1039
+ }>;
1040
+ }>;
1041
+ }>;
1042
+ readonly reason: Schema.String;
1043
+ readonly expectedGoalEventId: Schema.String;
1044
+ readonly expectedGoalUpdatedAt: Schema.Number;
244
1045
  }>]>, Schema.Struct<{
245
1046
  readonly kind: Schema.Literal<"browser.mcp.recover">;
246
1047
  }>]>;
247
1048
  readonly result: Schema.NullOr<Schema.String>;
1049
+ readonly acceptedReceipt: Schema.optionalKey<Schema.NullOr<Schema.String>>;
1050
+ readonly durableOperation: Schema.optionalKey<Schema.Literal<true>>;
248
1051
  readonly error: Schema.NullOr<Schema.String>;
249
1052
  readonly worker: Schema.optionalKey<Schema.Struct<{
250
1053
  readonly host: Schema.String;
@@ -382,4 +1185,19 @@ export declare const HostStatus: Schema.Struct<{
382
1185
  }>;
383
1186
  export type HostStatus = typeof HostStatus.Type;
384
1187
  export declare const requiresApproval: (payload: JobPayload) => boolean;
1188
+ /**
1189
+ * Which listener delivered a submission. Only the HTTP listener sets it, after
1190
+ * transport authorization; it is never decoded from a request body.
1191
+ */
1192
+ export type SubmissionProvenance = "verified_local_listener" | "authenticated_remote";
1193
+ /**
1194
+ * Job kinds a verified local listener may queue without approval. Work kinds
1195
+ * change Work authority, so they always require approval; the `satisfies`
1196
+ * constraint fails to compile if one is ever added here.
1197
+ */
1198
+ export declare const LocalListenerApprovalExemptKind: Schema.Literals<("agent.delegate" | "agent.message" | "nix.apply" | "nix.check")[]>;
1199
+ export type LocalListenerApprovalExemptKind = typeof LocalListenerApprovalExemptKind.Type;
1200
+ export declare const isLocalListenerApprovalExempt: <I>(input: I) => input is I & ("agent.delegate" | "agent.message" | "nix.apply" | "nix.check");
1201
+ /** Whether a submission from `provenance` must wait for an approval. */
1202
+ export declare const submissionRequiresApproval: (payload: JobPayload, provenance: SubmissionProvenance) => boolean;
385
1203
  //# sourceMappingURL=model.d.ts.map