@pellux/goodvibes-contracts 1.8.0 → 1.9.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.
@@ -3,7 +3,7 @@
3
3
  "product": {
4
4
  "id": "goodvibes",
5
5
  "surface": "operator",
6
- "version": "1.8.0"
6
+ "version": "1.9.0"
7
7
  },
8
8
  "auth": {
9
9
  "modes": [
@@ -524,6 +524,182 @@
524
524
  },
525
525
  "invokable": true
526
526
  },
527
+ {
528
+ "id": "acp.agents.list",
529
+ "title": "List Installed Third-Party Coding Agents",
530
+ "description": "READ-ONLY discovery of installed ACP-capable third-party coding agents (Claude Code, Codex CLI, opencode): existence checks over $PATH and known install directories — no process is ever executed, no registration ceremony. Returns only what is present (id, title, resolved binary path, ACP launch args); absence is a quiet empty list, never a nag.",
531
+ "category": "acp",
532
+ "source": "builtin",
533
+ "access": "authenticated",
534
+ "transport": [
535
+ "ws"
536
+ ],
537
+ "scopes": [
538
+ "read:fleet"
539
+ ],
540
+ "outputSchema": {
541
+ "type": "object",
542
+ "properties": {
543
+ "agents": {
544
+ "type": "array",
545
+ "items": {
546
+ "type": "object",
547
+ "properties": {
548
+ "id": {
549
+ "type": "string"
550
+ },
551
+ "title": {
552
+ "type": "string"
553
+ },
554
+ "binaryPath": {
555
+ "type": "string"
556
+ },
557
+ "args": {
558
+ "type": "array",
559
+ "items": {
560
+ "type": "string"
561
+ }
562
+ }
563
+ },
564
+ "required": [
565
+ "id",
566
+ "title",
567
+ "binaryPath",
568
+ "args"
569
+ ],
570
+ "additionalProperties": false
571
+ }
572
+ }
573
+ },
574
+ "required": [
575
+ "agents"
576
+ ],
577
+ "additionalProperties": false
578
+ },
579
+ "invokable": true
580
+ },
581
+ {
582
+ "id": "acp.sessions.create",
583
+ "title": "Spawn a Third-Party Coding Agent Session",
584
+ "description": "Spawn a discovered third-party agent into a working directory as a hosted daemon session in ONE act: the binary is launched in ACP stdio mode, the handshake and session creation run under a bound timeout, and the result is the hosted record — which appears as a steerable/stoppable fleet row (kind acp-agent) whose permission asks classify as waiting-on-human. A binary that fails the handshake returns the SAME record with state \"failed\" and a structured error (which binary, which stage, what happened) — an honest outcome, never a hung row and never a bare string. An optional initial prompt starts the first turn.",
585
+ "category": "acp",
586
+ "source": "builtin",
587
+ "access": "authenticated",
588
+ "transport": [
589
+ "ws"
590
+ ],
591
+ "scopes": [
592
+ "write:fleet"
593
+ ],
594
+ "inputSchema": {
595
+ "type": "object",
596
+ "properties": {
597
+ "agentId": {
598
+ "type": "string"
599
+ },
600
+ "cwd": {
601
+ "type": "string"
602
+ },
603
+ "title": {
604
+ "type": "string"
605
+ },
606
+ "prompt": {
607
+ "type": "string"
608
+ }
609
+ },
610
+ "required": [
611
+ "agentId",
612
+ "cwd"
613
+ ],
614
+ "additionalProperties": false
615
+ },
616
+ "outputSchema": {
617
+ "type": "object",
618
+ "properties": {
619
+ "hosted": {
620
+ "type": "object",
621
+ "properties": {
622
+ "id": {
623
+ "type": "string"
624
+ },
625
+ "agentId": {
626
+ "type": "string"
627
+ },
628
+ "title": {
629
+ "type": "string"
630
+ },
631
+ "binaryPath": {
632
+ "type": "string"
633
+ },
634
+ "cwd": {
635
+ "type": "string"
636
+ },
637
+ "state": {
638
+ "type": "string"
639
+ },
640
+ "startedAt": {
641
+ "type": "number"
642
+ },
643
+ "completedAt": {
644
+ "type": "number"
645
+ },
646
+ "sessionId": {
647
+ "type": "string"
648
+ },
649
+ "progress": {
650
+ "type": "string"
651
+ },
652
+ "pendingPermission": {
653
+ "type": "string"
654
+ },
655
+ "error": {
656
+ "type": "object",
657
+ "properties": {
658
+ "binary": {
659
+ "type": "string"
660
+ },
661
+ "stage": {
662
+ "type": "string"
663
+ },
664
+ "message": {
665
+ "type": "string"
666
+ }
667
+ },
668
+ "required": [
669
+ "binary",
670
+ "stage",
671
+ "message"
672
+ ],
673
+ "additionalProperties": false
674
+ },
675
+ "promptCount": {
676
+ "type": "number"
677
+ }
678
+ },
679
+ "required": [
680
+ "id",
681
+ "agentId",
682
+ "title",
683
+ "binaryPath",
684
+ "cwd",
685
+ "state",
686
+ "startedAt",
687
+ "promptCount"
688
+ ],
689
+ "additionalProperties": false
690
+ },
691
+ "started": {
692
+ "type": "boolean"
693
+ }
694
+ },
695
+ "required": [
696
+ "hosted",
697
+ "started"
698
+ ],
699
+ "additionalProperties": false
700
+ },
701
+ "invokable": true
702
+ },
527
703
  {
528
704
  "id": "approvals.approve",
529
705
  "title": "Approve Approval",
@@ -4134,7 +4310,8 @@
4134
4310
  "running",
4135
4311
  "completed",
4136
4312
  "failed",
4137
- "cancelled"
4313
+ "cancelled",
4314
+ "missed"
4138
4315
  ]
4139
4316
  },
4140
4317
  "agentId": {
@@ -8992,7 +9169,8 @@
8992
9169
  "running",
8993
9170
  "completed",
8994
9171
  "failed",
8995
- "cancelled"
9172
+ "cancelled",
9173
+ "missed"
8996
9174
  ]
8997
9175
  },
8998
9176
  "agentId": {
@@ -9982,7 +10160,8 @@
9982
10160
  "running",
9983
10161
  "completed",
9984
10162
  "failed",
9985
- "cancelled"
10163
+ "cancelled",
10164
+ "missed"
9986
10165
  ]
9987
10166
  },
9988
10167
  "agentId": {
@@ -11013,7 +11192,7 @@
11013
11192
  {
11014
11193
  "id": "automation.runs.list",
11015
11194
  "title": "List Automation Runs",
11016
- "description": "Return automation run history. Without ?limit/?cursor returns { runs: [...] } (backward compatible). With ?limit=N (1–500, default 100) and optional ?cursor=<opaque> returns a PaginatedResponse envelope { items, hasMore, nextCursor? }. Invalid cursors return HTTP 400.",
11195
+ "description": "Return automation run history. Without ?limit/?cursor returns { runs: [...] } (backward compatible). With ?limit=N (1–500, default 100) and optional ?cursor=<opaque> returns a PaginatedResponse envelope { items, hasMore, nextCursor? }. Invalid cursors return HTTP 400. Optional ?since=<epoch-ms> returns only runs active on or after that time (by queuedAt, or endedAt when set) — the host-side source an away-digest reads to report the failed, missed, completed, and delivered runs since the operator was last present.",
11017
11196
  "category": "automation",
11018
11197
  "source": "builtin",
11019
11198
  "access": "authenticated",
@@ -11036,6 +11215,9 @@
11036
11215
  },
11037
11216
  "cursor": {
11038
11217
  "type": "string"
11218
+ },
11219
+ "since": {
11220
+ "type": "number"
11039
11221
  }
11040
11222
  },
11041
11223
  "additionalProperties": false
@@ -11073,7 +11255,8 @@
11073
11255
  "running",
11074
11256
  "completed",
11075
11257
  "failed",
11076
- "cancelled"
11258
+ "cancelled",
11259
+ "missed"
11077
11260
  ]
11078
11261
  },
11079
11262
  "agentId": {
@@ -12064,7 +12247,8 @@
12064
12247
  "running",
12065
12248
  "completed",
12066
12249
  "failed",
12067
- "cancelled"
12250
+ "cancelled",
12251
+ "missed"
12068
12252
  ]
12069
12253
  },
12070
12254
  "agentId": {
@@ -15142,7 +15326,8 @@
15142
15326
  "running",
15143
15327
  "completed",
15144
15328
  "failed",
15145
- "cancelled"
15329
+ "cancelled",
15330
+ "missed"
15146
15331
  ]
15147
15332
  },
15148
15333
  "agentId": {
@@ -29658,6 +29843,8 @@
29658
29843
  "workstream",
29659
29844
  "phase",
29660
29845
  "work-item",
29846
+ "acp-agent",
29847
+ "observed-external",
29661
29848
  "code-index"
29662
29849
  ]
29663
29850
  },
@@ -29835,7 +30022,9 @@
29835
30022
  "type": "string",
29836
30023
  "enum": [
29837
30024
  "approval",
29838
- "input"
30025
+ "input",
30026
+ "pick",
30027
+ "conflict"
29839
30028
  ]
29840
30029
  },
29841
30030
  "detail": {
@@ -29858,6 +30047,133 @@
29858
30047
  }
29859
30048
  },
29860
30049
  "additionalProperties": false
30050
+ },
30051
+ "review": {
30052
+ "type": "object",
30053
+ "properties": {
30054
+ "score": {
30055
+ "type": "number"
30056
+ },
30057
+ "passed": {
30058
+ "type": "boolean"
30059
+ },
30060
+ "cycles": {
30061
+ "type": "number"
30062
+ },
30063
+ "checklist": {
30064
+ "type": "array",
30065
+ "items": {
30066
+ "type": "object",
30067
+ "properties": {
30068
+ "item": {
30069
+ "type": "string"
30070
+ },
30071
+ "verified": {
30072
+ "type": "boolean"
30073
+ },
30074
+ "evidence": {
30075
+ "type": "string"
30076
+ },
30077
+ "howExercised": {
30078
+ "type": "string"
30079
+ }
30080
+ },
30081
+ "required": [
30082
+ "item",
30083
+ "verified",
30084
+ "evidence"
30085
+ ],
30086
+ "additionalProperties": false
30087
+ }
30088
+ }
30089
+ },
30090
+ "required": [
30091
+ "score",
30092
+ "passed",
30093
+ "cycles",
30094
+ "checklist"
30095
+ ],
30096
+ "additionalProperties": false
30097
+ },
30098
+ "observed": {
30099
+ "type": "object",
30100
+ "properties": {
30101
+ "externalKind": {
30102
+ "type": "string",
30103
+ "enum": [
30104
+ "claude-code",
30105
+ "codex",
30106
+ "opencode",
30107
+ "unknown"
30108
+ ]
30109
+ },
30110
+ "pid": {
30111
+ "type": "number"
30112
+ },
30113
+ "cwd": {
30114
+ "type": "string"
30115
+ },
30116
+ "liveness": {
30117
+ "type": "object",
30118
+ "properties": {
30119
+ "state": {
30120
+ "type": "string",
30121
+ "enum": [
30122
+ "active",
30123
+ "quiet"
30124
+ ]
30125
+ },
30126
+ "cpuSeconds": {
30127
+ "type": "number"
30128
+ },
30129
+ "detail": {
30130
+ "type": "string"
30131
+ }
30132
+ },
30133
+ "required": [
30134
+ "state",
30135
+ "cpuSeconds",
30136
+ "detail"
30137
+ ],
30138
+ "additionalProperties": false
30139
+ },
30140
+ "steer": {
30141
+ "type": "object",
30142
+ "properties": {
30143
+ "kind": {
30144
+ "type": "string",
30145
+ "enum": [
30146
+ "tmux",
30147
+ "none"
30148
+ ]
30149
+ },
30150
+ "paneId": {
30151
+ "type": "string"
30152
+ },
30153
+ "tty": {
30154
+ "type": "string"
30155
+ },
30156
+ "reason": {
30157
+ "type": "string"
30158
+ }
30159
+ },
30160
+ "required": [
30161
+ "kind"
30162
+ ],
30163
+ "additionalProperties": false
30164
+ },
30165
+ "steerDrillInOnly": {
30166
+ "type": "boolean"
30167
+ }
30168
+ },
30169
+ "required": [
30170
+ "externalKind",
30171
+ "pid",
30172
+ "liveness",
30173
+ "steer",
30174
+ "steerDrillInOnly"
30175
+ ],
30176
+ "additionalProperties": false
29861
30177
  }
29862
30178
  },
29863
30179
  "required": [
@@ -30289,6 +30605,9 @@
30289
30605
  },
30290
30606
  "winnerItemId": {
30291
30607
  "type": "string"
30608
+ },
30609
+ "confirm": {
30610
+ "type": "boolean"
30292
30611
  }
30293
30612
  },
30294
30613
  "required": [
@@ -30300,6 +30619,9 @@
30300
30619
  "outputSchema": {
30301
30620
  "type": "object",
30302
30621
  "properties": {
30622
+ "applied": {
30623
+ "type": "boolean"
30624
+ },
30303
30625
  "groupId": {
30304
30626
  "type": "string"
30305
30627
  },
@@ -30314,13 +30636,263 @@
30314
30636
  },
30315
30637
  "auto": {
30316
30638
  "type": "boolean"
30639
+ },
30640
+ "requiresConfirm": {
30641
+ "type": "boolean"
30642
+ },
30643
+ "group": {
30644
+ "type": "object",
30645
+ "properties": {
30646
+ "groupId": {
30647
+ "type": "string"
30648
+ },
30649
+ "workstreamId": {
30650
+ "type": "string"
30651
+ },
30652
+ "sourceTitle": {
30653
+ "type": "string"
30654
+ },
30655
+ "ready": {
30656
+ "type": "boolean"
30657
+ },
30658
+ "candidates": {
30659
+ "type": "array",
30660
+ "items": {
30661
+ "type": "object",
30662
+ "properties": {
30663
+ "itemId": {
30664
+ "type": "string"
30665
+ },
30666
+ "attemptIndex": {
30667
+ "type": "number"
30668
+ },
30669
+ "state": {
30670
+ "type": "string",
30671
+ "enum": [
30672
+ "held-merge",
30673
+ "failed"
30674
+ ]
30675
+ },
30676
+ "title": {
30677
+ "type": "string"
30678
+ },
30679
+ "worktreePath": {
30680
+ "anyOf": [
30681
+ {
30682
+ "type": "string"
30683
+ },
30684
+ {
30685
+ "type": "null"
30686
+ }
30687
+ ]
30688
+ },
30689
+ "branch": {
30690
+ "anyOf": [
30691
+ {
30692
+ "type": "string"
30693
+ },
30694
+ {
30695
+ "type": "null"
30696
+ }
30697
+ ]
30698
+ },
30699
+ "usage": {
30700
+ "type": "object",
30701
+ "properties": {
30702
+ "inputTokens": {
30703
+ "type": "number"
30704
+ },
30705
+ "outputTokens": {
30706
+ "type": "number"
30707
+ },
30708
+ "cacheReadTokens": {
30709
+ "type": "number"
30710
+ },
30711
+ "cacheWriteTokens": {
30712
+ "type": "number"
30713
+ },
30714
+ "reasoningTokens": {
30715
+ "type": "number"
30716
+ },
30717
+ "llmCallCount": {
30718
+ "type": "number"
30719
+ },
30720
+ "turnCount": {
30721
+ "type": "number"
30722
+ },
30723
+ "toolCallCount": {
30724
+ "type": "number"
30725
+ },
30726
+ "costUsd": {
30727
+ "anyOf": [
30728
+ {
30729
+ "type": "number"
30730
+ },
30731
+ {
30732
+ "type": "null"
30733
+ }
30734
+ ]
30735
+ },
30736
+ "costState": {
30737
+ "type": "string",
30738
+ "enum": [
30739
+ "priced",
30740
+ "unpriced",
30741
+ "estimated"
30742
+ ]
30743
+ },
30744
+ "costSource": {
30745
+ "type": "string",
30746
+ "enum": [
30747
+ "user",
30748
+ "provider",
30749
+ "catalog",
30750
+ "mixed"
30751
+ ]
30752
+ },
30753
+ "pricingAsOf": {
30754
+ "type": "string"
30755
+ }
30756
+ },
30757
+ "required": [
30758
+ "inputTokens",
30759
+ "outputTokens",
30760
+ "cacheReadTokens",
30761
+ "cacheWriteTokens",
30762
+ "llmCallCount",
30763
+ "turnCount",
30764
+ "toolCallCount",
30765
+ "costUsd",
30766
+ "costState"
30767
+ ],
30768
+ "additionalProperties": false
30769
+ },
30770
+ "failureReason": {
30771
+ "anyOf": [
30772
+ {
30773
+ "type": "string"
30774
+ },
30775
+ {
30776
+ "type": "null"
30777
+ }
30778
+ ]
30779
+ },
30780
+ "diff": {
30781
+ "anyOf": [
30782
+ {
30783
+ "type": "object",
30784
+ "properties": {
30785
+ "files": {
30786
+ "type": "array",
30787
+ "items": {
30788
+ "type": "string"
30789
+ }
30790
+ },
30791
+ "unifiedDiff": {
30792
+ "type": "string"
30793
+ },
30794
+ "stat": {
30795
+ "type": "string"
30796
+ }
30797
+ },
30798
+ "required": [
30799
+ "files",
30800
+ "unifiedDiff",
30801
+ "stat"
30802
+ ],
30803
+ "additionalProperties": false
30804
+ },
30805
+ {
30806
+ "type": "null"
30807
+ }
30808
+ ]
30809
+ }
30810
+ },
30811
+ "required": [
30812
+ "itemId",
30813
+ "attemptIndex",
30814
+ "state",
30815
+ "title",
30816
+ "worktreePath",
30817
+ "branch",
30818
+ "usage",
30819
+ "failureReason",
30820
+ "diff"
30821
+ ],
30822
+ "additionalProperties": false
30823
+ }
30824
+ },
30825
+ "autoAccept": {
30826
+ "type": "boolean"
30827
+ },
30828
+ "judgment": {
30829
+ "anyOf": [
30830
+ {
30831
+ "type": "object",
30832
+ "properties": {
30833
+ "proposedWinnerItemId": {
30834
+ "anyOf": [
30835
+ {
30836
+ "type": "string"
30837
+ },
30838
+ {
30839
+ "type": "null"
30840
+ }
30841
+ ]
30842
+ },
30843
+ "reasons": {
30844
+ "type": "array",
30845
+ "items": {
30846
+ "type": "string"
30847
+ }
30848
+ },
30849
+ "model": {
30850
+ "anyOf": [
30851
+ {
30852
+ "type": "string"
30853
+ },
30854
+ {
30855
+ "type": "null"
30856
+ }
30857
+ ]
30858
+ },
30859
+ "scoredBy": {
30860
+ "type": "string",
30861
+ "enum": [
30862
+ "model"
30863
+ ]
30864
+ }
30865
+ },
30866
+ "required": [
30867
+ "proposedWinnerItemId",
30868
+ "reasons",
30869
+ "model",
30870
+ "scoredBy"
30871
+ ],
30872
+ "additionalProperties": false
30873
+ },
30874
+ {
30875
+ "type": "null"
30876
+ }
30877
+ ]
30878
+ }
30879
+ },
30880
+ "required": [
30881
+ "groupId",
30882
+ "workstreamId",
30883
+ "sourceTitle",
30884
+ "ready",
30885
+ "candidates",
30886
+ "autoAccept",
30887
+ "judgment"
30888
+ ],
30889
+ "additionalProperties": false
30317
30890
  }
30318
30891
  },
30319
30892
  "required": [
30893
+ "applied",
30320
30894
  "groupId",
30321
- "winnerItemId",
30322
- "loserItemIds",
30323
- "auto"
30895
+ "winnerItemId"
30324
30896
  ],
30325
30897
  "additionalProperties": false
30326
30898
  },
@@ -30328,9 +30900,9 @@
30328
30900
  "invokable": true
30329
30901
  },
30330
30902
  {
30331
- "id": "fleet.list",
30332
- "title": "List Fleet Processes",
30333
- "description": "Paginated, filtered (kinds/states) query over the live process registry. Cursor pagination returns disjoint pages that union to the full matching set at query time.",
30903
+ "id": "fleet.conflicts.list",
30904
+ "title": "List Merge-Conflict Rows",
30905
+ "description": "Return every work item whose integration merge CONFLICTED and is waiting on a human: the kept worktree path, item branch, the STRUCTURED conflicting-file list, and the resolution session id once one was spawned. Optionally filtered to one workstream. Read-only.",
30334
30906
  "category": "fleet",
30335
30907
  "source": "builtin",
30336
30908
  "access": "authenticated",
@@ -30343,22 +30915,7 @@
30343
30915
  "inputSchema": {
30344
30916
  "type": "object",
30345
30917
  "properties": {
30346
- "kinds": {
30347
- "type": "array",
30348
- "items": {
30349
- "type": "string"
30350
- }
30351
- },
30352
- "states": {
30353
- "type": "array",
30354
- "items": {
30355
- "type": "string"
30356
- }
30357
- },
30358
- "limit": {
30359
- "type": "number"
30360
- },
30361
- "cursor": {
30918
+ "workstreamId": {
30362
30919
  "type": "string"
30363
30920
  }
30364
30921
  },
@@ -30367,59 +30924,365 @@
30367
30924
  "outputSchema": {
30368
30925
  "type": "object",
30369
30926
  "properties": {
30370
- "items": {
30927
+ "conflicts": {
30371
30928
  "type": "array",
30372
30929
  "items": {
30373
30930
  "type": "object",
30374
30931
  "properties": {
30375
- "id": {
30932
+ "workstreamId": {
30376
30933
  "type": "string"
30377
30934
  },
30378
- "kind": {
30379
- "type": "string",
30380
- "enum": [
30381
- "agent",
30382
- "wrfc-chain",
30383
- "wrfc-subtask",
30384
- "workflow",
30385
- "trigger",
30386
- "schedule",
30387
- "watcher",
30388
- "background-process",
30389
- "workstream",
30390
- "phase",
30391
- "work-item",
30392
- "code-index"
30393
- ]
30935
+ "itemId": {
30936
+ "type": "string"
30394
30937
  },
30395
- "parentId": {
30938
+ "title": {
30396
30939
  "type": "string"
30397
30940
  },
30398
- "label": {
30941
+ "worktreePath": {
30399
30942
  "type": "string"
30400
30943
  },
30401
- "task": {
30944
+ "branch": {
30402
30945
  "type": "string"
30403
30946
  },
30404
- "state": {
30405
- "type": "string",
30406
- "enum": [
30407
- "thinking",
30408
- "executing-tool",
30409
- "awaiting-approval",
30410
- "streaming",
30411
- "stalled",
30412
- "retrying",
30413
- "done",
30414
- "failed",
30415
- "killed",
30416
- "interrupted",
30417
- "idle",
30418
- "queued",
30419
- "paused"
30420
- ]
30947
+ "files": {
30948
+ "type": "array",
30949
+ "items": {
30950
+ "type": "string"
30951
+ }
30421
30952
  },
30422
- "startedAt": {
30953
+ "resolutionSessionId": {
30954
+ "type": "string"
30955
+ }
30956
+ },
30957
+ "required": [
30958
+ "workstreamId",
30959
+ "itemId",
30960
+ "title",
30961
+ "worktreePath",
30962
+ "files"
30963
+ ],
30964
+ "additionalProperties": false
30965
+ }
30966
+ }
30967
+ },
30968
+ "required": [
30969
+ "conflicts"
30970
+ ],
30971
+ "additionalProperties": false
30972
+ },
30973
+ "invokable": true
30974
+ },
30975
+ {
30976
+ "id": "fleet.conflicts.resolve",
30977
+ "title": "Spawn a Conflict-Resolution Session",
30978
+ "description": "The conflict row's one action: spawn a resolution session INSIDE the kept worktree, seeded with the structured conflict list and tree path (the same seeded-session machinery as the CI fix flow), and stamp the REAL session id back onto the item. When the resolution lands and the re-merge succeeds, the kept tree is reclaimed automatically. An item with no unresolved conflict is an honest 409.",
30979
+ "category": "fleet",
30980
+ "source": "builtin",
30981
+ "access": "authenticated",
30982
+ "transport": [
30983
+ "ws"
30984
+ ],
30985
+ "scopes": [
30986
+ "write:fleet"
30987
+ ],
30988
+ "inputSchema": {
30989
+ "type": "object",
30990
+ "properties": {
30991
+ "itemId": {
30992
+ "type": "string"
30993
+ }
30994
+ },
30995
+ "required": [
30996
+ "itemId"
30997
+ ],
30998
+ "additionalProperties": false
30999
+ },
31000
+ "outputSchema": {
31001
+ "type": "object",
31002
+ "properties": {
31003
+ "itemId": {
31004
+ "type": "string"
31005
+ },
31006
+ "sessionId": {
31007
+ "type": "string"
31008
+ },
31009
+ "worktreePath": {
31010
+ "type": "string"
31011
+ },
31012
+ "files": {
31013
+ "type": "array",
31014
+ "items": {
31015
+ "type": "string"
31016
+ }
31017
+ }
31018
+ },
31019
+ "required": [
31020
+ "itemId",
31021
+ "sessionId",
31022
+ "worktreePath",
31023
+ "files"
31024
+ ],
31025
+ "additionalProperties": false
31026
+ },
31027
+ "invokable": true
31028
+ },
31029
+ {
31030
+ "id": "fleet.graph.get",
31031
+ "title": "Get Workstream Task Graph",
31032
+ "description": "The dependency-graph view of one workstream: nodes (id, title, state, cluster, files, merge state, blocked reason, orphaned flag, deepest-remaining-path depth, stalled tell, agent), edges (from depends on to), and the elastic-pool state (ready/running counts, at-cap, cap key + size, any spawn refusal). Surfaces render the task graph under the chain from this — the fleet/observability idiom. 404 when the workstream is unknown to this daemon.",
31033
+ "category": "fleet",
31034
+ "source": "builtin",
31035
+ "access": "authenticated",
31036
+ "transport": [
31037
+ "http",
31038
+ "ws"
31039
+ ],
31040
+ "scopes": [
31041
+ "read:fleet"
31042
+ ],
31043
+ "http": {
31044
+ "method": "GET",
31045
+ "path": "/api/fleet/workstreams/{workstreamId}/graph"
31046
+ },
31047
+ "inputSchema": {
31048
+ "type": "object",
31049
+ "properties": {
31050
+ "workstreamId": {
31051
+ "type": "string"
31052
+ }
31053
+ },
31054
+ "required": [
31055
+ "workstreamId"
31056
+ ],
31057
+ "additionalProperties": false
31058
+ },
31059
+ "outputSchema": {
31060
+ "type": "object",
31061
+ "properties": {
31062
+ "workstreamId": {
31063
+ "type": "string"
31064
+ },
31065
+ "title": {
31066
+ "type": "string"
31067
+ },
31068
+ "nodes": {
31069
+ "type": "array",
31070
+ "items": {
31071
+ "type": "object",
31072
+ "properties": {
31073
+ "id": {
31074
+ "type": "string"
31075
+ },
31076
+ "title": {
31077
+ "type": "string"
31078
+ },
31079
+ "state": {
31080
+ "type": "string"
31081
+ },
31082
+ "cluster": {
31083
+ "type": "string"
31084
+ },
31085
+ "files": {
31086
+ "type": "array",
31087
+ "items": {
31088
+ "type": "string"
31089
+ }
31090
+ },
31091
+ "mergeState": {
31092
+ "type": "string"
31093
+ },
31094
+ "blockedReason": {
31095
+ "type": "string"
31096
+ },
31097
+ "orphaned": {
31098
+ "type": "boolean"
31099
+ },
31100
+ "remainingDepth": {
31101
+ "type": "number"
31102
+ },
31103
+ "stalled": {
31104
+ "type": "boolean"
31105
+ },
31106
+ "agentId": {
31107
+ "type": "string"
31108
+ }
31109
+ },
31110
+ "required": [
31111
+ "id",
31112
+ "title",
31113
+ "state",
31114
+ "files",
31115
+ "orphaned",
31116
+ "remainingDepth",
31117
+ "stalled"
31118
+ ],
31119
+ "additionalProperties": false
31120
+ }
31121
+ },
31122
+ "edges": {
31123
+ "type": "array",
31124
+ "items": {
31125
+ "type": "object",
31126
+ "properties": {
31127
+ "from": {
31128
+ "type": "string"
31129
+ },
31130
+ "to": {
31131
+ "type": "string"
31132
+ }
31133
+ },
31134
+ "required": [
31135
+ "from",
31136
+ "to"
31137
+ ],
31138
+ "additionalProperties": false
31139
+ }
31140
+ },
31141
+ "pool": {
31142
+ "anyOf": [
31143
+ {
31144
+ "type": "object",
31145
+ "properties": {
31146
+ "ready": {
31147
+ "type": "number"
31148
+ },
31149
+ "running": {
31150
+ "type": "number"
31151
+ },
31152
+ "atCap": {
31153
+ "type": "boolean"
31154
+ },
31155
+ "capKey": {
31156
+ "type": "string"
31157
+ },
31158
+ "maxSize": {
31159
+ "type": "number"
31160
+ },
31161
+ "refusal": {
31162
+ "type": "string"
31163
+ }
31164
+ },
31165
+ "required": [
31166
+ "ready",
31167
+ "running",
31168
+ "atCap",
31169
+ "capKey",
31170
+ "maxSize"
31171
+ ],
31172
+ "additionalProperties": false
31173
+ },
31174
+ {
31175
+ "type": "null"
31176
+ }
31177
+ ]
31178
+ }
31179
+ },
31180
+ "required": [
31181
+ "workstreamId",
31182
+ "title",
31183
+ "nodes",
31184
+ "edges",
31185
+ "pool"
31186
+ ],
31187
+ "additionalProperties": false
31188
+ },
31189
+ "invokable": true
31190
+ },
31191
+ {
31192
+ "id": "fleet.list",
31193
+ "title": "List Fleet Processes",
31194
+ "description": "Paginated, filtered (kinds/states) query over the live process registry. Cursor pagination returns disjoint pages that union to the full matching set at query time.",
31195
+ "category": "fleet",
31196
+ "source": "builtin",
31197
+ "access": "authenticated",
31198
+ "transport": [
31199
+ "ws"
31200
+ ],
31201
+ "scopes": [
31202
+ "read:fleet"
31203
+ ],
31204
+ "inputSchema": {
31205
+ "type": "object",
31206
+ "properties": {
31207
+ "kinds": {
31208
+ "type": "array",
31209
+ "items": {
31210
+ "type": "string"
31211
+ }
31212
+ },
31213
+ "states": {
31214
+ "type": "array",
31215
+ "items": {
31216
+ "type": "string"
31217
+ }
31218
+ },
31219
+ "limit": {
31220
+ "type": "number"
31221
+ },
31222
+ "cursor": {
31223
+ "type": "string"
31224
+ }
31225
+ },
31226
+ "additionalProperties": false
31227
+ },
31228
+ "outputSchema": {
31229
+ "type": "object",
31230
+ "properties": {
31231
+ "items": {
31232
+ "type": "array",
31233
+ "items": {
31234
+ "type": "object",
31235
+ "properties": {
31236
+ "id": {
31237
+ "type": "string"
31238
+ },
31239
+ "kind": {
31240
+ "type": "string",
31241
+ "enum": [
31242
+ "agent",
31243
+ "wrfc-chain",
31244
+ "wrfc-subtask",
31245
+ "workflow",
31246
+ "trigger",
31247
+ "schedule",
31248
+ "watcher",
31249
+ "background-process",
31250
+ "workstream",
31251
+ "phase",
31252
+ "work-item",
31253
+ "acp-agent",
31254
+ "observed-external",
31255
+ "code-index"
31256
+ ]
31257
+ },
31258
+ "parentId": {
31259
+ "type": "string"
31260
+ },
31261
+ "label": {
31262
+ "type": "string"
31263
+ },
31264
+ "task": {
31265
+ "type": "string"
31266
+ },
31267
+ "state": {
31268
+ "type": "string",
31269
+ "enum": [
31270
+ "thinking",
31271
+ "executing-tool",
31272
+ "awaiting-approval",
31273
+ "streaming",
31274
+ "stalled",
31275
+ "retrying",
31276
+ "done",
31277
+ "failed",
31278
+ "killed",
31279
+ "interrupted",
31280
+ "idle",
31281
+ "queued",
31282
+ "paused"
31283
+ ]
31284
+ },
31285
+ "startedAt": {
30423
31286
  "type": "number"
30424
31287
  },
30425
31288
  "completedAt": {
@@ -30566,7 +31429,9 @@
30566
31429
  "type": "string",
30567
31430
  "enum": [
30568
31431
  "approval",
30569
- "input"
31432
+ "input",
31433
+ "pick",
31434
+ "conflict"
30570
31435
  ]
30571
31436
  },
30572
31437
  "detail": {
@@ -30589,6 +31454,133 @@
30589
31454
  }
30590
31455
  },
30591
31456
  "additionalProperties": false
31457
+ },
31458
+ "review": {
31459
+ "type": "object",
31460
+ "properties": {
31461
+ "score": {
31462
+ "type": "number"
31463
+ },
31464
+ "passed": {
31465
+ "type": "boolean"
31466
+ },
31467
+ "cycles": {
31468
+ "type": "number"
31469
+ },
31470
+ "checklist": {
31471
+ "type": "array",
31472
+ "items": {
31473
+ "type": "object",
31474
+ "properties": {
31475
+ "item": {
31476
+ "type": "string"
31477
+ },
31478
+ "verified": {
31479
+ "type": "boolean"
31480
+ },
31481
+ "evidence": {
31482
+ "type": "string"
31483
+ },
31484
+ "howExercised": {
31485
+ "type": "string"
31486
+ }
31487
+ },
31488
+ "required": [
31489
+ "item",
31490
+ "verified",
31491
+ "evidence"
31492
+ ],
31493
+ "additionalProperties": false
31494
+ }
31495
+ }
31496
+ },
31497
+ "required": [
31498
+ "score",
31499
+ "passed",
31500
+ "cycles",
31501
+ "checklist"
31502
+ ],
31503
+ "additionalProperties": false
31504
+ },
31505
+ "observed": {
31506
+ "type": "object",
31507
+ "properties": {
31508
+ "externalKind": {
31509
+ "type": "string",
31510
+ "enum": [
31511
+ "claude-code",
31512
+ "codex",
31513
+ "opencode",
31514
+ "unknown"
31515
+ ]
31516
+ },
31517
+ "pid": {
31518
+ "type": "number"
31519
+ },
31520
+ "cwd": {
31521
+ "type": "string"
31522
+ },
31523
+ "liveness": {
31524
+ "type": "object",
31525
+ "properties": {
31526
+ "state": {
31527
+ "type": "string",
31528
+ "enum": [
31529
+ "active",
31530
+ "quiet"
31531
+ ]
31532
+ },
31533
+ "cpuSeconds": {
31534
+ "type": "number"
31535
+ },
31536
+ "detail": {
31537
+ "type": "string"
31538
+ }
31539
+ },
31540
+ "required": [
31541
+ "state",
31542
+ "cpuSeconds",
31543
+ "detail"
31544
+ ],
31545
+ "additionalProperties": false
31546
+ },
31547
+ "steer": {
31548
+ "type": "object",
31549
+ "properties": {
31550
+ "kind": {
31551
+ "type": "string",
31552
+ "enum": [
31553
+ "tmux",
31554
+ "none"
31555
+ ]
31556
+ },
31557
+ "paneId": {
31558
+ "type": "string"
31559
+ },
31560
+ "tty": {
31561
+ "type": "string"
31562
+ },
31563
+ "reason": {
31564
+ "type": "string"
31565
+ }
31566
+ },
31567
+ "required": [
31568
+ "kind"
31569
+ ],
31570
+ "additionalProperties": false
31571
+ },
31572
+ "steerDrillInOnly": {
31573
+ "type": "boolean"
31574
+ }
31575
+ },
31576
+ "required": [
31577
+ "externalKind",
31578
+ "pid",
31579
+ "liveness",
31580
+ "steer",
31581
+ "steerDrillInOnly"
31582
+ ],
31583
+ "additionalProperties": false
30592
31584
  }
30593
31585
  },
30594
31586
  "required": [
@@ -30622,6 +31614,55 @@
30622
31614
  },
30623
31615
  "invokable": true
30624
31616
  },
31617
+ {
31618
+ "id": "fleet.observed.steer",
31619
+ "title": "Steer an Observed Foreign Agent",
31620
+ "description": "Drill-in steer of an externally-launched coding-agent session goodvibes only OBSERVES (a Claude Code / Codex process it did not spawn or host). The steer rides the foreign session's own control channel — for a tmux-hosted session, the exact three-send recipe (message text, then two Enters) targeted at its pane. queued:false with an honest reason when the row exposes no channel (no controlling terminal / no tmux pane) or a send fails. STOP is never offered on an observed row — observing and steering is not owning the lifecycle. Weighted as a drill-in capability (see the node's observed.steerDrillInOnly), never a bulk affordance.",
31621
+ "category": "fleet",
31622
+ "source": "builtin",
31623
+ "access": "authenticated",
31624
+ "transport": [
31625
+ "ws"
31626
+ ],
31627
+ "scopes": [
31628
+ "write:fleet"
31629
+ ],
31630
+ "inputSchema": {
31631
+ "type": "object",
31632
+ "properties": {
31633
+ "id": {
31634
+ "type": "string"
31635
+ },
31636
+ "text": {
31637
+ "type": "string"
31638
+ }
31639
+ },
31640
+ "required": [
31641
+ "id",
31642
+ "text"
31643
+ ],
31644
+ "additionalProperties": false
31645
+ },
31646
+ "outputSchema": {
31647
+ "type": "object",
31648
+ "properties": {
31649
+ "queued": {
31650
+ "type": "boolean"
31651
+ },
31652
+ "messageId": {
31653
+ "type": "string"
31654
+ },
31655
+ "reason": {
31656
+ "type": "string"
31657
+ }
31658
+ },
31659
+ "required": [
31660
+ "queued"
31661
+ ],
31662
+ "additionalProperties": false
31663
+ },
31664
+ "invokable": true
31665
+ },
30625
31666
  {
30626
31667
  "id": "fleet.snapshot",
30627
31668
  "title": "Fleet Snapshot",
@@ -30668,6 +31709,8 @@
30668
31709
  "workstream",
30669
31710
  "phase",
30670
31711
  "work-item",
31712
+ "acp-agent",
31713
+ "observed-external",
30671
31714
  "code-index"
30672
31715
  ]
30673
31716
  },
@@ -30845,7 +31888,9 @@
30845
31888
  "type": "string",
30846
31889
  "enum": [
30847
31890
  "approval",
30848
- "input"
31891
+ "input",
31892
+ "pick",
31893
+ "conflict"
30849
31894
  ]
30850
31895
  },
30851
31896
  "detail": {
@@ -30868,6 +31913,133 @@
30868
31913
  }
30869
31914
  },
30870
31915
  "additionalProperties": false
31916
+ },
31917
+ "review": {
31918
+ "type": "object",
31919
+ "properties": {
31920
+ "score": {
31921
+ "type": "number"
31922
+ },
31923
+ "passed": {
31924
+ "type": "boolean"
31925
+ },
31926
+ "cycles": {
31927
+ "type": "number"
31928
+ },
31929
+ "checklist": {
31930
+ "type": "array",
31931
+ "items": {
31932
+ "type": "object",
31933
+ "properties": {
31934
+ "item": {
31935
+ "type": "string"
31936
+ },
31937
+ "verified": {
31938
+ "type": "boolean"
31939
+ },
31940
+ "evidence": {
31941
+ "type": "string"
31942
+ },
31943
+ "howExercised": {
31944
+ "type": "string"
31945
+ }
31946
+ },
31947
+ "required": [
31948
+ "item",
31949
+ "verified",
31950
+ "evidence"
31951
+ ],
31952
+ "additionalProperties": false
31953
+ }
31954
+ }
31955
+ },
31956
+ "required": [
31957
+ "score",
31958
+ "passed",
31959
+ "cycles",
31960
+ "checklist"
31961
+ ],
31962
+ "additionalProperties": false
31963
+ },
31964
+ "observed": {
31965
+ "type": "object",
31966
+ "properties": {
31967
+ "externalKind": {
31968
+ "type": "string",
31969
+ "enum": [
31970
+ "claude-code",
31971
+ "codex",
31972
+ "opencode",
31973
+ "unknown"
31974
+ ]
31975
+ },
31976
+ "pid": {
31977
+ "type": "number"
31978
+ },
31979
+ "cwd": {
31980
+ "type": "string"
31981
+ },
31982
+ "liveness": {
31983
+ "type": "object",
31984
+ "properties": {
31985
+ "state": {
31986
+ "type": "string",
31987
+ "enum": [
31988
+ "active",
31989
+ "quiet"
31990
+ ]
31991
+ },
31992
+ "cpuSeconds": {
31993
+ "type": "number"
31994
+ },
31995
+ "detail": {
31996
+ "type": "string"
31997
+ }
31998
+ },
31999
+ "required": [
32000
+ "state",
32001
+ "cpuSeconds",
32002
+ "detail"
32003
+ ],
32004
+ "additionalProperties": false
32005
+ },
32006
+ "steer": {
32007
+ "type": "object",
32008
+ "properties": {
32009
+ "kind": {
32010
+ "type": "string",
32011
+ "enum": [
32012
+ "tmux",
32013
+ "none"
32014
+ ]
32015
+ },
32016
+ "paneId": {
32017
+ "type": "string"
32018
+ },
32019
+ "tty": {
32020
+ "type": "string"
32021
+ },
32022
+ "reason": {
32023
+ "type": "string"
32024
+ }
32025
+ },
32026
+ "required": [
32027
+ "kind"
32028
+ ],
32029
+ "additionalProperties": false
32030
+ },
32031
+ "steerDrillInOnly": {
32032
+ "type": "boolean"
32033
+ }
32034
+ },
32035
+ "required": [
32036
+ "externalKind",
32037
+ "pid",
32038
+ "liveness",
32039
+ "steer",
32040
+ "steerDrillInOnly"
32041
+ ],
32042
+ "additionalProperties": false
30871
32043
  }
30872
32044
  },
30873
32045
  "required": [
@@ -31249,6 +32421,342 @@
31249
32421
  },
31250
32422
  "invokable": true
31251
32423
  },
32424
+ {
32425
+ "id": "power.keepAwake.set",
32426
+ "title": "Set the Owner Keep-Awake Toggle",
32427
+ "description": "Turn the owner keep-awake toggle on or off: a daemon-held sleep inhibitor INDEPENDENT of work state, surviving surface closes, persisted as power.keepAwake. Covers idle + sleep + lid-switch classes where grantable; the returned state names any refused class honestly. No timers, no AC-only sub-options — the always-visible chip is the safety mechanism. Emits runtime.ops OPS_POWER_STATE_CHANGED so every attached surface updates its chip.",
32428
+ "category": "health",
32429
+ "source": "builtin",
32430
+ "access": "authenticated",
32431
+ "transport": [
32432
+ "http",
32433
+ "ws"
32434
+ ],
32435
+ "scopes": [
32436
+ "write:config"
32437
+ ],
32438
+ "http": {
32439
+ "method": "POST",
32440
+ "path": "/api/power/keep-awake"
32441
+ },
32442
+ "events": [
32443
+ "runtime.ops"
32444
+ ],
32445
+ "inputSchema": {
32446
+ "type": "object",
32447
+ "properties": {
32448
+ "enabled": {
32449
+ "type": "boolean"
32450
+ }
32451
+ },
32452
+ "required": [
32453
+ "enabled"
32454
+ ],
32455
+ "additionalProperties": false
32456
+ },
32457
+ "outputSchema": {
32458
+ "type": "object",
32459
+ "properties": {
32460
+ "platform": {
32461
+ "type": "string"
32462
+ },
32463
+ "work": {
32464
+ "type": "object",
32465
+ "properties": {
32466
+ "held": {
32467
+ "type": "boolean"
32468
+ },
32469
+ "grantedClasses": {
32470
+ "type": "array",
32471
+ "items": {
32472
+ "type": "string",
32473
+ "enum": [
32474
+ "handle-lid-switch",
32475
+ "idle",
32476
+ "sleep"
32477
+ ]
32478
+ }
32479
+ },
32480
+ "deniedClasses": {
32481
+ "type": "array",
32482
+ "items": {
32483
+ "type": "string",
32484
+ "enum": [
32485
+ "handle-lid-switch",
32486
+ "idle",
32487
+ "sleep"
32488
+ ]
32489
+ }
32490
+ },
32491
+ "reasons": {
32492
+ "type": "array",
32493
+ "items": {
32494
+ "type": "string"
32495
+ }
32496
+ },
32497
+ "heldSince": {
32498
+ "anyOf": [
32499
+ {
32500
+ "type": "number"
32501
+ },
32502
+ {
32503
+ "type": "null"
32504
+ }
32505
+ ]
32506
+ },
32507
+ "capMinutes": {
32508
+ "type": "number"
32509
+ },
32510
+ "capExpiresAt": {
32511
+ "anyOf": [
32512
+ {
32513
+ "type": "number"
32514
+ },
32515
+ {
32516
+ "type": "null"
32517
+ }
32518
+ ]
32519
+ },
32520
+ "capExpired": {
32521
+ "type": "boolean"
32522
+ }
32523
+ },
32524
+ "required": [
32525
+ "held",
32526
+ "grantedClasses",
32527
+ "deniedClasses",
32528
+ "reasons",
32529
+ "heldSince",
32530
+ "capMinutes",
32531
+ "capExpiresAt",
32532
+ "capExpired"
32533
+ ],
32534
+ "additionalProperties": false
32535
+ },
32536
+ "keepAwake": {
32537
+ "type": "object",
32538
+ "properties": {
32539
+ "enabled": {
32540
+ "type": "boolean"
32541
+ },
32542
+ "held": {
32543
+ "type": "boolean"
32544
+ },
32545
+ "grantedClasses": {
32546
+ "type": "array",
32547
+ "items": {
32548
+ "type": "string",
32549
+ "enum": [
32550
+ "handle-lid-switch",
32551
+ "idle",
32552
+ "sleep"
32553
+ ]
32554
+ }
32555
+ },
32556
+ "deniedClasses": {
32557
+ "type": "array",
32558
+ "items": {
32559
+ "type": "string",
32560
+ "enum": [
32561
+ "handle-lid-switch",
32562
+ "idle",
32563
+ "sleep"
32564
+ ]
32565
+ }
32566
+ },
32567
+ "note": {
32568
+ "anyOf": [
32569
+ {
32570
+ "type": "string"
32571
+ },
32572
+ {
32573
+ "type": "null"
32574
+ }
32575
+ ]
32576
+ }
32577
+ },
32578
+ "required": [
32579
+ "enabled",
32580
+ "held",
32581
+ "grantedClasses",
32582
+ "deniedClasses",
32583
+ "note"
32584
+ ],
32585
+ "additionalProperties": false
32586
+ }
32587
+ },
32588
+ "required": [
32589
+ "platform",
32590
+ "work",
32591
+ "keepAwake"
32592
+ ],
32593
+ "additionalProperties": false
32594
+ },
32595
+ "invokable": true
32596
+ },
32597
+ {
32598
+ "id": "power.status.get",
32599
+ "title": "Get Sleep-Ownership State",
32600
+ "description": "The host sleep-ownership state: whether the automatic work inhibitor is held (and the live \"held because X\" reasons, cap, and expiry), and the owner keep-awake toggle with the classes the OS actually granted vs refused — a refused lid-switch block is stated honestly (\"idle sleep blocked; lid-close suspend is controlled by your OS here\"), never papered over. Surfaces render the always-visible \"sleep disabled\" chip from this state and the runtime.ops OPS_POWER_STATE_CHANGED event.",
32601
+ "category": "health",
32602
+ "source": "builtin",
32603
+ "access": "authenticated",
32604
+ "transport": [
32605
+ "http",
32606
+ "ws"
32607
+ ],
32608
+ "scopes": [
32609
+ "read:health"
32610
+ ],
32611
+ "http": {
32612
+ "method": "GET",
32613
+ "path": "/api/power/status"
32614
+ },
32615
+ "inputSchema": {
32616
+ "type": "object",
32617
+ "properties": {},
32618
+ "additionalProperties": false
32619
+ },
32620
+ "outputSchema": {
32621
+ "type": "object",
32622
+ "properties": {
32623
+ "platform": {
32624
+ "type": "string"
32625
+ },
32626
+ "work": {
32627
+ "type": "object",
32628
+ "properties": {
32629
+ "held": {
32630
+ "type": "boolean"
32631
+ },
32632
+ "grantedClasses": {
32633
+ "type": "array",
32634
+ "items": {
32635
+ "type": "string",
32636
+ "enum": [
32637
+ "handle-lid-switch",
32638
+ "idle",
32639
+ "sleep"
32640
+ ]
32641
+ }
32642
+ },
32643
+ "deniedClasses": {
32644
+ "type": "array",
32645
+ "items": {
32646
+ "type": "string",
32647
+ "enum": [
32648
+ "handle-lid-switch",
32649
+ "idle",
32650
+ "sleep"
32651
+ ]
32652
+ }
32653
+ },
32654
+ "reasons": {
32655
+ "type": "array",
32656
+ "items": {
32657
+ "type": "string"
32658
+ }
32659
+ },
32660
+ "heldSince": {
32661
+ "anyOf": [
32662
+ {
32663
+ "type": "number"
32664
+ },
32665
+ {
32666
+ "type": "null"
32667
+ }
32668
+ ]
32669
+ },
32670
+ "capMinutes": {
32671
+ "type": "number"
32672
+ },
32673
+ "capExpiresAt": {
32674
+ "anyOf": [
32675
+ {
32676
+ "type": "number"
32677
+ },
32678
+ {
32679
+ "type": "null"
32680
+ }
32681
+ ]
32682
+ },
32683
+ "capExpired": {
32684
+ "type": "boolean"
32685
+ }
32686
+ },
32687
+ "required": [
32688
+ "held",
32689
+ "grantedClasses",
32690
+ "deniedClasses",
32691
+ "reasons",
32692
+ "heldSince",
32693
+ "capMinutes",
32694
+ "capExpiresAt",
32695
+ "capExpired"
32696
+ ],
32697
+ "additionalProperties": false
32698
+ },
32699
+ "keepAwake": {
32700
+ "type": "object",
32701
+ "properties": {
32702
+ "enabled": {
32703
+ "type": "boolean"
32704
+ },
32705
+ "held": {
32706
+ "type": "boolean"
32707
+ },
32708
+ "grantedClasses": {
32709
+ "type": "array",
32710
+ "items": {
32711
+ "type": "string",
32712
+ "enum": [
32713
+ "handle-lid-switch",
32714
+ "idle",
32715
+ "sleep"
32716
+ ]
32717
+ }
32718
+ },
32719
+ "deniedClasses": {
32720
+ "type": "array",
32721
+ "items": {
32722
+ "type": "string",
32723
+ "enum": [
32724
+ "handle-lid-switch",
32725
+ "idle",
32726
+ "sleep"
32727
+ ]
32728
+ }
32729
+ },
32730
+ "note": {
32731
+ "anyOf": [
32732
+ {
32733
+ "type": "string"
32734
+ },
32735
+ {
32736
+ "type": "null"
32737
+ }
32738
+ ]
32739
+ }
32740
+ },
32741
+ "required": [
32742
+ "enabled",
32743
+ "held",
32744
+ "grantedClasses",
32745
+ "deniedClasses",
32746
+ "note"
32747
+ ],
32748
+ "additionalProperties": false
32749
+ }
32750
+ },
32751
+ "required": [
32752
+ "platform",
32753
+ "work",
32754
+ "keepAwake"
32755
+ ],
32756
+ "additionalProperties": false
32757
+ },
32758
+ "invokable": true
32759
+ },
31252
32760
  {
31253
32761
  "id": "intelligence.snapshot",
31254
32762
  "title": "Intelligence Snapshot",
@@ -61137,6 +62645,178 @@
61137
62645
  },
61138
62646
  "invokable": true
61139
62647
  },
62648
+ {
62649
+ "id": "memory.consolidation.receipts",
62650
+ "title": "Memory Consolidation Receipts",
62651
+ "description": "Return the retained memory-consolidation run receipts (what each idle/scheduled pass scanned, merged, archived, decayed) and the pending judgment PROPOSALS they carry (contradictions, cross-scope duplicates) — the records a proposal references are already marked into the review queue, and a human resolves them through the confirmation-gated review route. A runtime without the consolidation scheduler answers an honest 501.",
62652
+ "category": "memory",
62653
+ "source": "builtin",
62654
+ "access": "authenticated",
62655
+ "transport": [
62656
+ "http",
62657
+ "ws"
62658
+ ],
62659
+ "scopes": [
62660
+ "read:memory"
62661
+ ],
62662
+ "http": {
62663
+ "method": "GET",
62664
+ "path": "/api/memory/consolidation/receipts"
62665
+ },
62666
+ "inputSchema": {
62667
+ "type": "object",
62668
+ "properties": {},
62669
+ "additionalProperties": false
62670
+ },
62671
+ "outputSchema": {
62672
+ "type": "object",
62673
+ "properties": {
62674
+ "receipts": {
62675
+ "type": "array",
62676
+ "items": {
62677
+ "type": "object",
62678
+ "properties": {
62679
+ "runId": {
62680
+ "type": "string"
62681
+ },
62682
+ "ranAt": {
62683
+ "type": "string"
62684
+ },
62685
+ "trigger": {
62686
+ "type": "string"
62687
+ },
62688
+ "idle": {
62689
+ "type": "boolean"
62690
+ },
62691
+ "scanned": {
62692
+ "type": "number"
62693
+ },
62694
+ "merged": {
62695
+ "type": "array",
62696
+ "items": {
62697
+ "type": "object",
62698
+ "properties": {},
62699
+ "additionalProperties": true
62700
+ }
62701
+ },
62702
+ "archived": {
62703
+ "type": "array",
62704
+ "items": {
62705
+ "type": "object",
62706
+ "properties": {},
62707
+ "additionalProperties": true
62708
+ }
62709
+ },
62710
+ "decayed": {
62711
+ "type": "array",
62712
+ "items": {
62713
+ "type": "object",
62714
+ "properties": {},
62715
+ "additionalProperties": true
62716
+ }
62717
+ },
62718
+ "proposed": {
62719
+ "type": "array",
62720
+ "items": {
62721
+ "type": "object",
62722
+ "properties": {
62723
+ "kind": {
62724
+ "type": "string",
62725
+ "enum": [
62726
+ "contradiction",
62727
+ "cross-scope-duplicate",
62728
+ "stale-delete"
62729
+ ]
62730
+ },
62731
+ "ids": {
62732
+ "type": "array",
62733
+ "items": {
62734
+ "type": "string"
62735
+ }
62736
+ },
62737
+ "route": {
62738
+ "type": "string"
62739
+ },
62740
+ "reason": {
62741
+ "type": "string"
62742
+ }
62743
+ },
62744
+ "required": [
62745
+ "kind",
62746
+ "ids",
62747
+ "route",
62748
+ "reason"
62749
+ ],
62750
+ "additionalProperties": false
62751
+ }
62752
+ },
62753
+ "usageSignalAvailable": {
62754
+ "type": "boolean"
62755
+ },
62756
+ "note": {
62757
+ "type": "string"
62758
+ }
62759
+ },
62760
+ "required": [
62761
+ "runId",
62762
+ "ranAt",
62763
+ "trigger",
62764
+ "idle",
62765
+ "scanned",
62766
+ "merged",
62767
+ "archived",
62768
+ "decayed",
62769
+ "proposed",
62770
+ "usageSignalAvailable",
62771
+ "note"
62772
+ ],
62773
+ "additionalProperties": false
62774
+ }
62775
+ },
62776
+ "pendingProposals": {
62777
+ "type": "array",
62778
+ "items": {
62779
+ "type": "object",
62780
+ "properties": {
62781
+ "kind": {
62782
+ "type": "string",
62783
+ "enum": [
62784
+ "contradiction",
62785
+ "cross-scope-duplicate",
62786
+ "stale-delete"
62787
+ ]
62788
+ },
62789
+ "ids": {
62790
+ "type": "array",
62791
+ "items": {
62792
+ "type": "string"
62793
+ }
62794
+ },
62795
+ "route": {
62796
+ "type": "string"
62797
+ },
62798
+ "reason": {
62799
+ "type": "string"
62800
+ }
62801
+ },
62802
+ "required": [
62803
+ "kind",
62804
+ "ids",
62805
+ "route",
62806
+ "reason"
62807
+ ],
62808
+ "additionalProperties": false
62809
+ }
62810
+ }
62811
+ },
62812
+ "required": [
62813
+ "receipts",
62814
+ "pendingProposals"
62815
+ ],
62816
+ "additionalProperties": false
62817
+ },
62818
+ "invokable": true
62819
+ },
61140
62820
  {
61141
62821
  "id": "memory.doctor",
61142
62822
  "title": "Memory Doctor",
@@ -63945,256 +65625,893 @@
63945
65625
  "reviewedAt": {
63946
65626
  "type": "number"
63947
65627
  },
63948
- "reviewedBy": {
65628
+ "reviewedBy": {
65629
+ "type": "string"
65630
+ },
65631
+ "staleReason": {
65632
+ "type": "string"
65633
+ },
65634
+ "createdAt": {
65635
+ "type": "number"
65636
+ },
65637
+ "updatedAt": {
65638
+ "type": "number"
65639
+ }
65640
+ },
65641
+ "required": [
65642
+ "id",
65643
+ "scope",
65644
+ "cls",
65645
+ "summary",
65646
+ "tags",
65647
+ "provenance",
65648
+ "reviewState",
65649
+ "confidence",
65650
+ "createdAt",
65651
+ "updatedAt"
65652
+ ],
65653
+ "additionalProperties": true
65654
+ }
65655
+ },
65656
+ "required": [
65657
+ "record"
65658
+ ],
65659
+ "additionalProperties": false
65660
+ },
65661
+ "invokable": true
65662
+ },
65663
+ {
65664
+ "id": "memory.review-queue",
65665
+ "title": "Memory Review Queue",
65666
+ "description": "Return memory records prioritised for review. Accepts optional limit (?limit=N) and scope filter (?scope=session|project|team). A scope query parameter that is present but not one of the three valid values returns 400.",
65667
+ "category": "memory",
65668
+ "source": "builtin",
65669
+ "access": "authenticated",
65670
+ "transport": [
65671
+ "http",
65672
+ "ws"
65673
+ ],
65674
+ "scopes": [
65675
+ "read:memory"
65676
+ ],
65677
+ "http": {
65678
+ "method": "GET",
65679
+ "path": "/api/memory/review-queue"
65680
+ },
65681
+ "inputSchema": {
65682
+ "type": "object",
65683
+ "properties": {
65684
+ "limit": {
65685
+ "type": "number"
65686
+ },
65687
+ "scope": {
65688
+ "type": "string",
65689
+ "enum": [
65690
+ "session",
65691
+ "project",
65692
+ "team"
65693
+ ]
65694
+ }
65695
+ },
65696
+ "additionalProperties": false
65697
+ },
65698
+ "outputSchema": {
65699
+ "type": "object",
65700
+ "properties": {
65701
+ "records": {
65702
+ "type": "array",
65703
+ "items": {
65704
+ "type": "object",
65705
+ "properties": {},
65706
+ "additionalProperties": true
65707
+ }
65708
+ }
65709
+ },
65710
+ "required": [
65711
+ "records"
65712
+ ],
65713
+ "additionalProperties": false
65714
+ },
65715
+ "invokable": true
65716
+ },
65717
+ {
65718
+ "id": "memory.vector.rebuild",
65719
+ "title": "Rebuild Memory Vector Index",
65720
+ "description": "Rebuild the sqlite-vec vector index.",
65721
+ "category": "memory",
65722
+ "source": "builtin",
65723
+ "access": "admin",
65724
+ "transport": [
65725
+ "http",
65726
+ "ws"
65727
+ ],
65728
+ "scopes": [
65729
+ "write:memory"
65730
+ ],
65731
+ "http": {
65732
+ "method": "POST",
65733
+ "path": "/api/memory/vector/rebuild"
65734
+ },
65735
+ "inputSchema": {
65736
+ "type": "object",
65737
+ "properties": {},
65738
+ "additionalProperties": false
65739
+ },
65740
+ "outputSchema": {
65741
+ "type": "object",
65742
+ "properties": {
65743
+ "vector": {
65744
+ "type": "object",
65745
+ "properties": {
65746
+ "backend": {
65747
+ "type": "string",
65748
+ "enum": [
65749
+ "sqlite-vec"
65750
+ ]
65751
+ },
65752
+ "enabled": {
65753
+ "type": "boolean"
65754
+ },
65755
+ "available": {
65756
+ "type": "boolean"
65757
+ },
65758
+ "path": {
65759
+ "type": "string"
65760
+ },
65761
+ "dimensions": {
65762
+ "type": "number"
65763
+ },
65764
+ "indexedRecords": {
65765
+ "type": "number"
65766
+ },
65767
+ "embeddingProviderId": {
65768
+ "type": "string"
65769
+ },
65770
+ "embeddingProviderLabel": {
65771
+ "type": "string"
65772
+ },
65773
+ "error": {
65774
+ "type": "string"
65775
+ },
65776
+ "platformLimitReason": {
65777
+ "type": "string"
65778
+ }
65779
+ },
65780
+ "required": [
65781
+ "backend",
65782
+ "enabled",
65783
+ "available",
65784
+ "path",
65785
+ "dimensions",
65786
+ "indexedRecords",
65787
+ "embeddingProviderId",
65788
+ "embeddingProviderLabel"
65789
+ ],
65790
+ "additionalProperties": true
65791
+ }
65792
+ },
65793
+ "required": [
65794
+ "vector"
65795
+ ],
65796
+ "additionalProperties": false
65797
+ },
65798
+ "invokable": true
65799
+ },
65800
+ {
65801
+ "id": "memory.vector.stats",
65802
+ "title": "Memory Vector Stats",
65803
+ "description": "Return the current sqlite-vec vector-store posture.",
65804
+ "category": "memory",
65805
+ "source": "builtin",
65806
+ "access": "authenticated",
65807
+ "transport": [
65808
+ "http",
65809
+ "ws"
65810
+ ],
65811
+ "scopes": [
65812
+ "read:memory"
65813
+ ],
65814
+ "http": {
65815
+ "method": "GET",
65816
+ "path": "/api/memory/vector"
65817
+ },
65818
+ "inputSchema": {
65819
+ "type": "object",
65820
+ "properties": {},
65821
+ "additionalProperties": false
65822
+ },
65823
+ "outputSchema": {
65824
+ "type": "object",
65825
+ "properties": {
65826
+ "vector": {
65827
+ "type": "object",
65828
+ "properties": {
65829
+ "backend": {
65830
+ "type": "string",
65831
+ "enum": [
65832
+ "sqlite-vec"
65833
+ ]
65834
+ },
65835
+ "enabled": {
65836
+ "type": "boolean"
65837
+ },
65838
+ "available": {
65839
+ "type": "boolean"
65840
+ },
65841
+ "path": {
65842
+ "type": "string"
65843
+ },
65844
+ "dimensions": {
65845
+ "type": "number"
65846
+ },
65847
+ "indexedRecords": {
65848
+ "type": "number"
65849
+ },
65850
+ "embeddingProviderId": {
65851
+ "type": "string"
65852
+ },
65853
+ "embeddingProviderLabel": {
65854
+ "type": "string"
65855
+ },
65856
+ "error": {
65857
+ "type": "string"
65858
+ },
65859
+ "platformLimitReason": {
65860
+ "type": "string"
65861
+ }
65862
+ },
65863
+ "required": [
65864
+ "backend",
65865
+ "enabled",
65866
+ "available",
65867
+ "path",
65868
+ "dimensions",
65869
+ "indexedRecords",
65870
+ "embeddingProviderId",
65871
+ "embeddingProviderLabel"
65872
+ ],
65873
+ "additionalProperties": true
65874
+ }
65875
+ },
65876
+ "required": [
65877
+ "vector"
65878
+ ],
65879
+ "additionalProperties": false
65880
+ },
65881
+ "invokable": true
65882
+ },
65883
+ {
65884
+ "id": "pairing.handoff.complete",
65885
+ "title": "Complete Pairing Hand-off",
65886
+ "description": "Apply the surface's per-offer decisions in ONE pass: an accepted notifications offer registers the browser push subscription (endpoint + keys, optional deviceId), an accepted passkey offer registers the WebAuthn credential, an accepted relay offer is acknowledged. Each offer returns an honest per-offer result (completed / declined / unavailable / failed); an omitted or false offer is reported as declined, never silently half-applied.",
65887
+ "category": "pairing",
65888
+ "source": "builtin",
65889
+ "access": "authenticated",
65890
+ "transport": [
65891
+ "ws"
65892
+ ],
65893
+ "scopes": [
65894
+ "write:control-plane"
65895
+ ],
65896
+ "inputSchema": {
65897
+ "type": "object",
65898
+ "properties": {
65899
+ "accept": {
65900
+ "type": "object",
65901
+ "properties": {
65902
+ "notifications": {
65903
+ "type": "object",
65904
+ "properties": {
65905
+ "endpoint": {
65906
+ "type": "string"
65907
+ },
65908
+ "keys": {
65909
+ "type": "object",
65910
+ "properties": {
65911
+ "p256dh": {
65912
+ "type": "string"
65913
+ },
65914
+ "auth": {
65915
+ "type": "string"
65916
+ }
65917
+ },
65918
+ "required": [
65919
+ "p256dh",
65920
+ "auth"
65921
+ ],
65922
+ "additionalProperties": false
65923
+ },
65924
+ "deviceId": {
65925
+ "type": "string"
65926
+ }
65927
+ },
65928
+ "required": [
65929
+ "endpoint",
65930
+ "keys"
65931
+ ],
65932
+ "additionalProperties": false
65933
+ },
65934
+ "relay": {
65935
+ "type": "boolean"
65936
+ },
65937
+ "passkey": {
65938
+ "type": "object",
65939
+ "properties": {
65940
+ "rpId": {
65941
+ "type": "string"
65942
+ },
65943
+ "origin": {
65944
+ "type": "string"
65945
+ },
65946
+ "credentialId": {
65947
+ "type": "string"
65948
+ },
65949
+ "publicKeyCose": {
65950
+ "type": "string"
65951
+ }
65952
+ },
65953
+ "required": [
65954
+ "rpId",
65955
+ "origin",
65956
+ "credentialId",
65957
+ "publicKeyCose"
65958
+ ],
65959
+ "additionalProperties": false
65960
+ }
65961
+ },
65962
+ "additionalProperties": false
65963
+ }
65964
+ },
65965
+ "additionalProperties": false
65966
+ },
65967
+ "outputSchema": {
65968
+ "type": "object",
65969
+ "properties": {
65970
+ "results": {
65971
+ "type": "array",
65972
+ "items": {
65973
+ "type": "object",
65974
+ "properties": {
65975
+ "kind": {
65976
+ "type": "string"
65977
+ },
65978
+ "status": {
65979
+ "type": "string"
65980
+ },
65981
+ "detail": {
65982
+ "type": "string"
65983
+ }
65984
+ },
65985
+ "required": [
65986
+ "kind",
65987
+ "status"
65988
+ ],
65989
+ "additionalProperties": false
65990
+ }
65991
+ }
65992
+ },
65993
+ "required": [
65994
+ "results"
65995
+ ],
65996
+ "additionalProperties": false
65997
+ },
65998
+ "invokable": true
65999
+ },
66000
+ {
66001
+ "id": "pairing.handoff.create",
66002
+ "title": "Create Pairing Hand-off",
66003
+ "description": "Mint a per-device token AND assemble the set-up OFFER SET this daemon can satisfy (notifications — carrying the VAPID public key; relay; passkey step-up), so a freshly-paired surface can complete them in one pass. Returns the offer set, the `#pair=<token>` deep-link fragment (the exact URL-fragment shape the web app consumes — token in `pair=`, offers in `offers=`), a full deep link when a web origin is configured, and that origin's honest TLS/capability POSTURE: the one plain-http-on-LAN notice line (stated here, never a nag) plus per-capability availability labels so surfaces render \"needs https — available via tailscale\" instead of dead buttons. The token secret is returned exactly once. Each offer is independently declinable at completion.",
66004
+ "category": "pairing",
66005
+ "source": "builtin",
66006
+ "access": "authenticated",
66007
+ "transport": [
66008
+ "ws"
66009
+ ],
66010
+ "scopes": [
66011
+ "write:control-plane"
66012
+ ],
66013
+ "inputSchema": {
66014
+ "type": "object",
66015
+ "properties": {
66016
+ "name": {
66017
+ "type": "string"
66018
+ },
66019
+ "offers": {
66020
+ "type": "array",
66021
+ "items": {
66022
+ "type": "string"
66023
+ }
66024
+ }
66025
+ },
66026
+ "required": [
66027
+ "name"
66028
+ ],
66029
+ "additionalProperties": false
66030
+ },
66031
+ "outputSchema": {
66032
+ "type": "object",
66033
+ "properties": {
66034
+ "token": {
66035
+ "type": "object",
66036
+ "properties": {
66037
+ "id": {
66038
+ "type": "string"
66039
+ },
66040
+ "name": {
66041
+ "type": "string"
66042
+ },
66043
+ "token": {
66044
+ "type": "string"
66045
+ },
66046
+ "createdAt": {
66047
+ "type": "number"
66048
+ }
66049
+ },
66050
+ "required": [
66051
+ "id",
66052
+ "name",
66053
+ "token",
66054
+ "createdAt"
66055
+ ],
66056
+ "additionalProperties": false
66057
+ },
66058
+ "offers": {
66059
+ "type": "array",
66060
+ "items": {
66061
+ "type": "object",
66062
+ "properties": {
66063
+ "kind": {
66064
+ "type": "string"
66065
+ },
66066
+ "available": {
66067
+ "type": "boolean"
66068
+ },
66069
+ "vapidPublicKey": {
66070
+ "type": "string"
66071
+ }
66072
+ },
66073
+ "required": [
66074
+ "kind",
66075
+ "available"
66076
+ ],
66077
+ "additionalProperties": false
66078
+ }
66079
+ },
66080
+ "fragment": {
66081
+ "type": "string"
66082
+ },
66083
+ "deepLink": {
66084
+ "type": "string"
66085
+ },
66086
+ "posture": {
66087
+ "type": "object",
66088
+ "properties": {
66089
+ "origin": {
66090
+ "type": "string"
66091
+ },
66092
+ "scheme": {
66093
+ "type": "string"
66094
+ },
66095
+ "privateNetwork": {
66096
+ "type": "boolean"
66097
+ },
66098
+ "secureContext": {
66099
+ "type": "boolean"
66100
+ },
66101
+ "notice": {
66102
+ "type": "string"
66103
+ },
66104
+ "capabilities": {
66105
+ "type": "array",
66106
+ "items": {
66107
+ "type": "object",
66108
+ "properties": {
66109
+ "capability": {
66110
+ "type": "string"
66111
+ },
66112
+ "available": {
66113
+ "type": "boolean"
66114
+ },
66115
+ "reason": {
66116
+ "type": "string"
66117
+ }
66118
+ },
66119
+ "required": [
66120
+ "capability",
66121
+ "available"
66122
+ ],
66123
+ "additionalProperties": false
66124
+ }
66125
+ }
66126
+ },
66127
+ "required": [
66128
+ "origin",
66129
+ "scheme",
66130
+ "privateNetwork",
66131
+ "secureContext",
66132
+ "capabilities"
66133
+ ],
66134
+ "additionalProperties": false
66135
+ }
66136
+ },
66137
+ "required": [
66138
+ "token",
66139
+ "offers",
66140
+ "fragment"
66141
+ ],
66142
+ "additionalProperties": false
66143
+ },
66144
+ "invokable": true
66145
+ },
66146
+ {
66147
+ "id": "pairing.posture.get",
66148
+ "title": "Get Origin TLS/Capability Posture",
66149
+ "description": "The honest TLS/capability posture of a web origin — pass your surface's current origin (or omit it to read the configured web origin). Plain http on a private-network origin (LAN IP, .local, localhost) is a supported posture reported with its ONE notice line; browser-gated capabilities (service worker/PWA install, push, microphone) are each labeled available or \"needs https — available via tailscale\" so surfaces render labels instead of dead buttons. Localhost keeps all three. The daemon never mints certificates.",
66150
+ "category": "pairing",
66151
+ "source": "builtin",
66152
+ "access": "authenticated",
66153
+ "transport": [
66154
+ "ws"
66155
+ ],
66156
+ "scopes": [
66157
+ "read:control-plane"
66158
+ ],
66159
+ "inputSchema": {
66160
+ "type": "object",
66161
+ "properties": {
66162
+ "origin": {
66163
+ "type": "string"
66164
+ }
66165
+ },
66166
+ "additionalProperties": false
66167
+ },
66168
+ "outputSchema": {
66169
+ "type": "object",
66170
+ "properties": {
66171
+ "posture": {
66172
+ "type": "object",
66173
+ "properties": {
66174
+ "origin": {
66175
+ "type": "string"
66176
+ },
66177
+ "scheme": {
66178
+ "type": "string"
66179
+ },
66180
+ "privateNetwork": {
66181
+ "type": "boolean"
66182
+ },
66183
+ "secureContext": {
66184
+ "type": "boolean"
66185
+ },
66186
+ "notice": {
66187
+ "type": "string"
66188
+ },
66189
+ "capabilities": {
66190
+ "type": "array",
66191
+ "items": {
66192
+ "type": "object",
66193
+ "properties": {
66194
+ "capability": {
66195
+ "type": "string"
66196
+ },
66197
+ "available": {
66198
+ "type": "boolean"
66199
+ },
66200
+ "reason": {
66201
+ "type": "string"
66202
+ }
66203
+ },
66204
+ "required": [
66205
+ "capability",
66206
+ "available"
66207
+ ],
66208
+ "additionalProperties": false
66209
+ }
66210
+ }
66211
+ },
66212
+ "required": [
66213
+ "origin",
66214
+ "scheme",
66215
+ "privateNetwork",
66216
+ "secureContext",
66217
+ "capabilities"
66218
+ ],
66219
+ "additionalProperties": false
66220
+ }
66221
+ },
66222
+ "required": [
66223
+ "posture"
66224
+ ],
66225
+ "additionalProperties": false
66226
+ },
66227
+ "invokable": true
66228
+ },
66229
+ {
66230
+ "id": "pairing.tokens.create",
66231
+ "title": "Mint Paired Device Token",
66232
+ "description": "Mint a new named per-device operator token and return its plaintext secret EXACTLY ONCE (for a QR / pairing hand-off). Only a hash is persisted; the secret is never listed or returned again. The name is user-visible and editable.",
66233
+ "category": "pairing",
66234
+ "source": "builtin",
66235
+ "access": "authenticated",
66236
+ "transport": [
66237
+ "ws"
66238
+ ],
66239
+ "scopes": [
66240
+ "write:control-plane"
66241
+ ],
66242
+ "inputSchema": {
66243
+ "type": "object",
66244
+ "properties": {
66245
+ "name": {
66246
+ "type": "string"
66247
+ }
66248
+ },
66249
+ "required": [
66250
+ "name"
66251
+ ],
66252
+ "additionalProperties": false
66253
+ },
66254
+ "outputSchema": {
66255
+ "type": "object",
66256
+ "properties": {
66257
+ "token": {
66258
+ "type": "object",
66259
+ "properties": {
66260
+ "id": {
66261
+ "type": "string"
66262
+ },
66263
+ "name": {
63949
66264
  "type": "string"
63950
66265
  },
63951
- "staleReason": {
66266
+ "token": {
63952
66267
  "type": "string"
63953
66268
  },
63954
66269
  "createdAt": {
63955
66270
  "type": "number"
63956
- },
63957
- "updatedAt": {
63958
- "type": "number"
63959
66271
  }
63960
66272
  },
63961
66273
  "required": [
63962
66274
  "id",
63963
- "scope",
63964
- "cls",
63965
- "summary",
63966
- "tags",
63967
- "provenance",
63968
- "reviewState",
63969
- "confidence",
63970
- "createdAt",
63971
- "updatedAt"
66275
+ "name",
66276
+ "token",
66277
+ "createdAt"
63972
66278
  ],
63973
- "additionalProperties": true
66279
+ "additionalProperties": false
63974
66280
  }
63975
66281
  },
63976
66282
  "required": [
63977
- "record"
66283
+ "token"
63978
66284
  ],
63979
66285
  "additionalProperties": false
63980
66286
  },
63981
66287
  "invokable": true
63982
66288
  },
63983
66289
  {
63984
- "id": "memory.review-queue",
63985
- "title": "Memory Review Queue",
63986
- "description": "Return memory records prioritised for review. Accepts optional limit (?limit=N) and scope filter (?scope=session|project|team). A scope query parameter that is present but not one of the three valid values returns 400.",
63987
- "category": "memory",
66290
+ "id": "pairing.tokens.delete",
66291
+ "title": "Revoke Paired Device Token",
66292
+ "description": "Revoke (permanently delete) one paired device token. Revocation is immediate: the token fails the very next request with a 401, and every OTHER paired device keeps working. An unknown id is a 404 PAIRING_TOKEN_NOT_FOUND, never a 200-noop.",
66293
+ "category": "pairing",
63988
66294
  "source": "builtin",
63989
66295
  "access": "authenticated",
63990
66296
  "transport": [
63991
- "http",
63992
66297
  "ws"
63993
66298
  ],
63994
66299
  "scopes": [
63995
- "read:memory"
66300
+ "write:control-plane"
63996
66301
  ],
63997
- "http": {
63998
- "method": "GET",
63999
- "path": "/api/memory/review-queue"
64000
- },
64001
66302
  "inputSchema": {
64002
66303
  "type": "object",
64003
66304
  "properties": {
64004
- "limit": {
64005
- "type": "number"
66305
+ "id": {
66306
+ "type": "string"
66307
+ }
66308
+ },
66309
+ "required": [
66310
+ "id"
66311
+ ],
66312
+ "additionalProperties": false
66313
+ },
66314
+ "outputSchema": {
66315
+ "type": "object",
66316
+ "properties": {
66317
+ "id": {
66318
+ "type": "string"
64006
66319
  },
64007
- "scope": {
64008
- "type": "string",
64009
- "enum": [
64010
- "session",
64011
- "project",
64012
- "team"
64013
- ]
66320
+ "revoked": {
66321
+ "type": "boolean"
64014
66322
  }
64015
66323
  },
66324
+ "required": [
66325
+ "id",
66326
+ "revoked"
66327
+ ],
64016
66328
  "additionalProperties": false
64017
66329
  },
66330
+ "invokable": true
66331
+ },
66332
+ {
66333
+ "id": "pairing.tokens.list",
66334
+ "title": "List Paired Device Tokens",
66335
+ "description": "List the per-pairing operator tokens (paired devices/browsers) as redacted views: id, user-visible name, created timestamp, and last-seen timestamp. The token secret is never stored in listable form and is never returned.",
66336
+ "category": "pairing",
66337
+ "source": "builtin",
66338
+ "access": "authenticated",
66339
+ "transport": [
66340
+ "ws"
66341
+ ],
66342
+ "scopes": [
66343
+ "read:control-plane"
66344
+ ],
64018
66345
  "outputSchema": {
64019
66346
  "type": "object",
64020
66347
  "properties": {
64021
- "records": {
66348
+ "tokens": {
64022
66349
  "type": "array",
64023
66350
  "items": {
64024
66351
  "type": "object",
64025
- "properties": {},
64026
- "additionalProperties": true
66352
+ "properties": {
66353
+ "id": {
66354
+ "type": "string"
66355
+ },
66356
+ "name": {
66357
+ "type": "string"
66358
+ },
66359
+ "createdAt": {
66360
+ "type": "number"
66361
+ },
66362
+ "lastSeenAt": {
66363
+ "type": "number"
66364
+ }
66365
+ },
66366
+ "required": [
66367
+ "id",
66368
+ "name",
66369
+ "createdAt"
66370
+ ],
66371
+ "additionalProperties": false
64027
66372
  }
66373
+ },
66374
+ "legacySharedRevoked": {
66375
+ "type": "boolean"
64028
66376
  }
64029
66377
  },
64030
66378
  "required": [
64031
- "records"
66379
+ "tokens",
66380
+ "legacySharedRevoked"
64032
66381
  ],
64033
66382
  "additionalProperties": false
64034
66383
  },
64035
66384
  "invokable": true
64036
66385
  },
64037
66386
  {
64038
- "id": "memory.vector.rebuild",
64039
- "title": "Rebuild Memory Vector Index",
64040
- "description": "Rebuild the sqlite-vec vector index.",
64041
- "category": "memory",
66387
+ "id": "pairing.tokens.migrate",
66388
+ "title": "Migrate Off The Shared Token",
66389
+ "description": "A client currently authenticated with the legacy single shared token mints its OWN named per-device token and receives the plaintext secret once — the honest migration path. This does NOT revoke the shared token; that is a separate explicit step (pairing.tokens.revokeShared).",
66390
+ "category": "pairing",
64042
66391
  "source": "builtin",
64043
- "access": "admin",
66392
+ "access": "authenticated",
64044
66393
  "transport": [
64045
- "http",
64046
66394
  "ws"
64047
66395
  ],
64048
66396
  "scopes": [
64049
- "write:memory"
66397
+ "write:control-plane"
64050
66398
  ],
64051
- "http": {
64052
- "method": "POST",
64053
- "path": "/api/memory/vector/rebuild"
64054
- },
64055
66399
  "inputSchema": {
64056
66400
  "type": "object",
64057
- "properties": {},
66401
+ "properties": {
66402
+ "name": {
66403
+ "type": "string"
66404
+ }
66405
+ },
66406
+ "required": [
66407
+ "name"
66408
+ ],
64058
66409
  "additionalProperties": false
64059
66410
  },
64060
66411
  "outputSchema": {
64061
66412
  "type": "object",
64062
66413
  "properties": {
64063
- "vector": {
66414
+ "token": {
64064
66415
  "type": "object",
64065
66416
  "properties": {
64066
- "backend": {
64067
- "type": "string",
64068
- "enum": [
64069
- "sqlite-vec"
64070
- ]
64071
- },
64072
- "enabled": {
64073
- "type": "boolean"
64074
- },
64075
- "available": {
64076
- "type": "boolean"
64077
- },
64078
- "path": {
64079
- "type": "string"
64080
- },
64081
- "dimensions": {
64082
- "type": "number"
64083
- },
64084
- "indexedRecords": {
64085
- "type": "number"
64086
- },
64087
- "embeddingProviderId": {
66417
+ "id": {
64088
66418
  "type": "string"
64089
66419
  },
64090
- "embeddingProviderLabel": {
66420
+ "name": {
64091
66421
  "type": "string"
64092
66422
  },
64093
- "error": {
66423
+ "token": {
64094
66424
  "type": "string"
64095
66425
  },
64096
- "platformLimitReason": {
64097
- "type": "string"
66426
+ "createdAt": {
66427
+ "type": "number"
64098
66428
  }
64099
66429
  },
64100
66430
  "required": [
64101
- "backend",
64102
- "enabled",
64103
- "available",
64104
- "path",
64105
- "dimensions",
64106
- "indexedRecords",
64107
- "embeddingProviderId",
64108
- "embeddingProviderLabel"
66431
+ "id",
66432
+ "name",
66433
+ "token",
66434
+ "createdAt"
64109
66435
  ],
64110
- "additionalProperties": true
66436
+ "additionalProperties": false
64111
66437
  }
64112
66438
  },
64113
66439
  "required": [
64114
- "vector"
66440
+ "token"
64115
66441
  ],
64116
66442
  "additionalProperties": false
64117
66443
  },
64118
66444
  "invokable": true
64119
66445
  },
64120
66446
  {
64121
- "id": "memory.vector.stats",
64122
- "title": "Memory Vector Stats",
64123
- "description": "Return the current sqlite-vec vector-store posture.",
64124
- "category": "memory",
66447
+ "id": "pairing.tokens.rename",
66448
+ "title": "Rename Paired Device Token",
66449
+ "description": "Change the user-visible name of a paired device token. An unknown id is a 404 PAIRING_TOKEN_NOT_FOUND.",
66450
+ "category": "pairing",
64125
66451
  "source": "builtin",
64126
66452
  "access": "authenticated",
64127
66453
  "transport": [
64128
- "http",
64129
66454
  "ws"
64130
66455
  ],
64131
66456
  "scopes": [
64132
- "read:memory"
66457
+ "write:control-plane"
64133
66458
  ],
64134
- "http": {
64135
- "method": "GET",
64136
- "path": "/api/memory/vector"
64137
- },
64138
66459
  "inputSchema": {
64139
66460
  "type": "object",
64140
- "properties": {},
66461
+ "properties": {
66462
+ "id": {
66463
+ "type": "string"
66464
+ },
66465
+ "name": {
66466
+ "type": "string"
66467
+ }
66468
+ },
66469
+ "required": [
66470
+ "id",
66471
+ "name"
66472
+ ],
64141
66473
  "additionalProperties": false
64142
66474
  },
64143
66475
  "outputSchema": {
64144
66476
  "type": "object",
64145
66477
  "properties": {
64146
- "vector": {
64147
- "type": "object",
64148
- "properties": {
64149
- "backend": {
64150
- "type": "string",
64151
- "enum": [
64152
- "sqlite-vec"
64153
- ]
64154
- },
64155
- "enabled": {
64156
- "type": "boolean"
64157
- },
64158
- "available": {
64159
- "type": "boolean"
64160
- },
64161
- "path": {
64162
- "type": "string"
64163
- },
64164
- "dimensions": {
64165
- "type": "number"
64166
- },
64167
- "indexedRecords": {
64168
- "type": "number"
64169
- },
64170
- "embeddingProviderId": {
64171
- "type": "string"
64172
- },
64173
- "embeddingProviderLabel": {
64174
- "type": "string"
64175
- },
64176
- "error": {
64177
- "type": "string"
64178
- },
64179
- "platformLimitReason": {
64180
- "type": "string"
64181
- }
64182
- },
64183
- "required": [
64184
- "backend",
64185
- "enabled",
64186
- "available",
64187
- "path",
64188
- "dimensions",
64189
- "indexedRecords",
64190
- "embeddingProviderId",
64191
- "embeddingProviderLabel"
64192
- ],
64193
- "additionalProperties": true
66478
+ "id": {
66479
+ "type": "string"
66480
+ },
66481
+ "renamed": {
66482
+ "type": "boolean"
64194
66483
  }
64195
66484
  },
64196
66485
  "required": [
64197
- "vector"
66486
+ "id",
66487
+ "renamed"
66488
+ ],
66489
+ "additionalProperties": false
66490
+ },
66491
+ "invokable": true
66492
+ },
66493
+ {
66494
+ "id": "pairing.tokens.revokeShared",
66495
+ "title": "Revoke The Legacy Shared Token",
66496
+ "description": "Turn off the legacy single shared operator token. After this, only per-device pairing tokens (and user sessions) authenticate; the shared token stops working immediately. Idempotent.",
66497
+ "category": "pairing",
66498
+ "source": "builtin",
66499
+ "access": "authenticated",
66500
+ "transport": [
66501
+ "ws"
66502
+ ],
66503
+ "scopes": [
66504
+ "write:control-plane"
66505
+ ],
66506
+ "outputSchema": {
66507
+ "type": "object",
66508
+ "properties": {
66509
+ "legacySharedRevoked": {
66510
+ "type": "boolean"
66511
+ }
66512
+ },
66513
+ "required": [
66514
+ "legacySharedRevoked"
64198
66515
  ],
64199
66516
  "additionalProperties": false
64200
66517
  },
@@ -66119,7 +68436,7 @@
66119
68436
  {
66120
68437
  "id": "push.subscriptions.create",
66121
68438
  "title": "Register Web Push Subscription",
66122
- "description": "Store a browser Push subscription (endpoint capability URL + p256dh/auth keys) for the authenticated operator so the daemon can deliver notifications to that device. Re-registering the same endpoint updates its keys in place rather than duplicating it. The stored endpoint and keys are never returned over the wire; the response is the redacted subscription view.",
68439
+ "description": "Store a browser Push subscription (endpoint capability URL + p256dh/auth keys) for the authenticated operator so the daemon can deliver notifications to that device. When a stable deviceId is supplied the record reconciles on that device identity — a browser whose push endpoint rotated re-registers the same deviceId with a new endpoint and heals the one record in place rather than piling up a stale duplicate; without a deviceId it reconciles on the raw endpoint (legacy). The stored endpoint and keys are never returned over the wire; the response is the redacted subscription view.",
66123
68440
  "category": "push",
66124
68441
  "source": "builtin",
66125
68442
  "access": "authenticated",
@@ -66150,6 +68467,9 @@
66150
68467
  "auth"
66151
68468
  ],
66152
68469
  "additionalProperties": false
68470
+ },
68471
+ "deviceId": {
68472
+ "type": "string"
66153
68473
  }
66154
68474
  },
66155
68475
  "required": [
@@ -66170,6 +68490,9 @@
66170
68490
  "principalId": {
66171
68491
  "type": "string"
66172
68492
  },
68493
+ "deviceId": {
68494
+ "type": "string"
68495
+ },
66173
68496
  "endpointOrigin": {
66174
68497
  "type": "string"
66175
68498
  },
@@ -66184,6 +68507,9 @@
66184
68507
  },
66185
68508
  "lastOutcome": {
66186
68509
  "type": "string"
68510
+ },
68511
+ "consecutiveFailures": {
68512
+ "type": "number"
66187
68513
  }
66188
68514
  },
66189
68515
  "required": [
@@ -66273,6 +68599,9 @@
66273
68599
  "principalId": {
66274
68600
  "type": "string"
66275
68601
  },
68602
+ "deviceId": {
68603
+ "type": "string"
68604
+ },
66276
68605
  "endpointOrigin": {
66277
68606
  "type": "string"
66278
68607
  },
@@ -66287,6 +68616,9 @@
66287
68616
  },
66288
68617
  "lastOutcome": {
66289
68618
  "type": "string"
68619
+ },
68620
+ "consecutiveFailures": {
68621
+ "type": "number"
66290
68622
  }
66291
68623
  },
66292
68624
  "required": [
@@ -66307,6 +68639,107 @@
66307
68639
  },
66308
68640
  "invokable": true
66309
68641
  },
68642
+ {
68643
+ "id": "push.subscriptions.reconcile",
68644
+ "title": "Reconcile Web Push Subscription",
68645
+ "description": "Reconcile-on-open: the client presents its device identity (deviceId) and its CURRENT endpoint + p256dh/auth keys, and the daemon heals the record for that device in place — updating a stale endpoint the daemon had been holding — then reports what drifted (created / endpoint-updated / keys-updated / unchanged) so the client learns whether the daemon was out of date. A live reconcile also clears the bounded-retry failure counter. The stored endpoint and keys are never returned; the response is the redacted subscription view plus the drift discriminant.",
68646
+ "category": "push",
68647
+ "source": "builtin",
68648
+ "access": "authenticated",
68649
+ "transport": [
68650
+ "ws"
68651
+ ],
68652
+ "scopes": [
68653
+ "write:push"
68654
+ ],
68655
+ "inputSchema": {
68656
+ "type": "object",
68657
+ "properties": {
68658
+ "deviceId": {
68659
+ "type": "string"
68660
+ },
68661
+ "endpoint": {
68662
+ "type": "string"
68663
+ },
68664
+ "keys": {
68665
+ "type": "object",
68666
+ "properties": {
68667
+ "p256dh": {
68668
+ "type": "string"
68669
+ },
68670
+ "auth": {
68671
+ "type": "string"
68672
+ }
68673
+ },
68674
+ "required": [
68675
+ "p256dh",
68676
+ "auth"
68677
+ ],
68678
+ "additionalProperties": false
68679
+ }
68680
+ },
68681
+ "required": [
68682
+ "deviceId",
68683
+ "endpoint",
68684
+ "keys"
68685
+ ],
68686
+ "additionalProperties": false
68687
+ },
68688
+ "outputSchema": {
68689
+ "type": "object",
68690
+ "properties": {
68691
+ "subscription": {
68692
+ "type": "object",
68693
+ "properties": {
68694
+ "id": {
68695
+ "type": "string"
68696
+ },
68697
+ "principalId": {
68698
+ "type": "string"
68699
+ },
68700
+ "deviceId": {
68701
+ "type": "string"
68702
+ },
68703
+ "endpointOrigin": {
68704
+ "type": "string"
68705
+ },
68706
+ "endpointHash": {
68707
+ "type": "string"
68708
+ },
68709
+ "createdAt": {
68710
+ "type": "number"
68711
+ },
68712
+ "lastDeliveryAt": {
68713
+ "type": "number"
68714
+ },
68715
+ "lastOutcome": {
68716
+ "type": "string"
68717
+ },
68718
+ "consecutiveFailures": {
68719
+ "type": "number"
68720
+ }
68721
+ },
68722
+ "required": [
68723
+ "id",
68724
+ "principalId",
68725
+ "endpointOrigin",
68726
+ "endpointHash",
68727
+ "createdAt"
68728
+ ],
68729
+ "additionalProperties": false
68730
+ },
68731
+ "drift": {
68732
+ "type": "string"
68733
+ }
68734
+ },
68735
+ "required": [
68736
+ "subscription",
68737
+ "drift"
68738
+ ],
68739
+ "additionalProperties": false
68740
+ },
68741
+ "invokable": true
68742
+ },
66310
68743
  {
66311
68744
  "id": "push.subscriptions.verify",
66312
68745
  "title": "Send Test Web Push",
@@ -70448,6 +72881,129 @@
70448
72881
  },
70449
72882
  "invokable": true
70450
72883
  },
72884
+ {
72885
+ "id": "tailscale.get",
72886
+ "title": "Detect Tailscale Environment",
72887
+ "description": "READ-ONLY detection of a usable tailscale environment: binary present, logged-in status, MagicDNS name, and the https URL `tailscale serve` would yield. Never invokes a state-changing tailscale command. Where tailscale is absent the result says so once — surfaces offer the auto-wire affordance only when this reports a usable environment; nothing nags. Includes the most recent serve receipt, if any.",
72888
+ "category": "remote-access",
72889
+ "source": "builtin",
72890
+ "access": "authenticated",
72891
+ "transport": [
72892
+ "ws"
72893
+ ],
72894
+ "scopes": [
72895
+ "read:control-plane"
72896
+ ],
72897
+ "outputSchema": {
72898
+ "type": "object",
72899
+ "properties": {
72900
+ "available": {
72901
+ "type": "boolean"
72902
+ },
72903
+ "loggedIn": {
72904
+ "type": "boolean"
72905
+ },
72906
+ "magicDnsName": {
72907
+ "type": "string"
72908
+ },
72909
+ "httpsUrl": {
72910
+ "type": "string"
72911
+ },
72912
+ "detail": {
72913
+ "type": "string"
72914
+ },
72915
+ "lastServe": {
72916
+ "type": "object",
72917
+ "properties": {
72918
+ "at": {
72919
+ "type": "number"
72920
+ },
72921
+ "command": {
72922
+ "type": "string"
72923
+ },
72924
+ "ok": {
72925
+ "type": "boolean"
72926
+ },
72927
+ "url": {
72928
+ "type": "string"
72929
+ },
72930
+ "detail": {
72931
+ "type": "string"
72932
+ }
72933
+ },
72934
+ "required": [
72935
+ "at",
72936
+ "command",
72937
+ "ok",
72938
+ "detail"
72939
+ ],
72940
+ "additionalProperties": false
72941
+ }
72942
+ },
72943
+ "required": [
72944
+ "available",
72945
+ "loggedIn",
72946
+ "detail"
72947
+ ],
72948
+ "additionalProperties": false
72949
+ },
72950
+ "invokable": true
72951
+ },
72952
+ {
72953
+ "id": "tailscale.serve.run",
72954
+ "title": "Set Up Tailscale Serve For The Daemon",
72955
+ "description": "The one-action https affordance: run `tailscale serve --bg <web port>` so tailscale fronts the daemon's web surface at its https MagicDNS URL. This is the ONLY state-changing tailscale command the daemon ever runs, and only from this explicit user-initiated verb. The attempt is recorded with an honest receipt either way; on success web.publicBaseUrl is updated to the https URL from the same resolution. The daemon never mints certificates — TLS is terminated by tailscale.",
72956
+ "category": "remote-access",
72957
+ "source": "builtin",
72958
+ "access": "authenticated",
72959
+ "transport": [
72960
+ "ws"
72961
+ ],
72962
+ "scopes": [
72963
+ "write:control-plane"
72964
+ ],
72965
+ "outputSchema": {
72966
+ "type": "object",
72967
+ "properties": {
72968
+ "receipt": {
72969
+ "type": "object",
72970
+ "properties": {
72971
+ "at": {
72972
+ "type": "number"
72973
+ },
72974
+ "command": {
72975
+ "type": "string"
72976
+ },
72977
+ "ok": {
72978
+ "type": "boolean"
72979
+ },
72980
+ "url": {
72981
+ "type": "string"
72982
+ },
72983
+ "detail": {
72984
+ "type": "string"
72985
+ }
72986
+ },
72987
+ "required": [
72988
+ "at",
72989
+ "command",
72990
+ "ok",
72991
+ "detail"
72992
+ ],
72993
+ "additionalProperties": false
72994
+ },
72995
+ "publicBaseUrlUpdated": {
72996
+ "type": "boolean"
72997
+ }
72998
+ },
72999
+ "required": [
73000
+ "receipt",
73001
+ "publicBaseUrlUpdated"
73002
+ ],
73003
+ "additionalProperties": false
73004
+ },
73005
+ "invokable": true
73006
+ },
70451
73007
  {
70452
73008
  "id": "review.snapshot",
70453
73009
  "title": "Review Snapshot",
@@ -77851,6 +80407,196 @@
77851
80407
  },
77852
80408
  "invokable": true
77853
80409
  },
80410
+ {
80411
+ "id": "sessions.queuedMessages.delete",
80412
+ "title": "Delete a Queued Mid-Turn Message",
80413
+ "description": "Remove a message still waiting in the mid-turn queue so it is never delivered. A message already delivered to the model cannot be removed — deleting it is a 404 MESSAGE_NOT_QUEUED. Only the daemon's live local runtime session is controllable; any other session id is a 404 SESSION_NOT_LOCAL.",
80414
+ "category": "sessions",
80415
+ "source": "builtin",
80416
+ "access": "authenticated",
80417
+ "transport": [
80418
+ "http",
80419
+ "ws"
80420
+ ],
80421
+ "scopes": [
80422
+ "write:sessions"
80423
+ ],
80424
+ "http": {
80425
+ "method": "DELETE",
80426
+ "path": "/api/sessions/{sessionId}/queued-messages/{messageId}"
80427
+ },
80428
+ "events": [
80429
+ "runtime.session"
80430
+ ],
80431
+ "inputSchema": {
80432
+ "type": "object",
80433
+ "properties": {
80434
+ "sessionId": {
80435
+ "type": "string"
80436
+ },
80437
+ "messageId": {
80438
+ "type": "string"
80439
+ }
80440
+ },
80441
+ "required": [
80442
+ "sessionId",
80443
+ "messageId"
80444
+ ],
80445
+ "additionalProperties": false
80446
+ },
80447
+ "outputSchema": {
80448
+ "type": "object",
80449
+ "properties": {
80450
+ "sessionId": {
80451
+ "type": "string"
80452
+ },
80453
+ "id": {
80454
+ "type": "string"
80455
+ },
80456
+ "deleted": {
80457
+ "type": "boolean"
80458
+ }
80459
+ },
80460
+ "required": [
80461
+ "sessionId",
80462
+ "id",
80463
+ "deleted"
80464
+ ],
80465
+ "additionalProperties": false
80466
+ },
80467
+ "invokable": true
80468
+ },
80469
+ {
80470
+ "id": "sessions.queuedMessages.edit",
80471
+ "title": "Edit a Queued Mid-Turn Message",
80472
+ "description": "Replace the text of a message still waiting in the mid-turn queue. A message already delivered to the model is immutable — editing it is a 404 MESSAGE_NOT_QUEUED. Editing replaces any multimodal content with the new plain text. Only the daemon's live local runtime session is controllable; any other session id is a 404 SESSION_NOT_LOCAL.",
80473
+ "category": "sessions",
80474
+ "source": "builtin",
80475
+ "access": "authenticated",
80476
+ "transport": [
80477
+ "http",
80478
+ "ws"
80479
+ ],
80480
+ "scopes": [
80481
+ "write:sessions"
80482
+ ],
80483
+ "http": {
80484
+ "method": "POST",
80485
+ "path": "/api/sessions/{sessionId}/queued-messages/{messageId}"
80486
+ },
80487
+ "events": [
80488
+ "runtime.session"
80489
+ ],
80490
+ "inputSchema": {
80491
+ "type": "object",
80492
+ "properties": {
80493
+ "sessionId": {
80494
+ "type": "string"
80495
+ },
80496
+ "messageId": {
80497
+ "type": "string"
80498
+ },
80499
+ "text": {
80500
+ "type": "string"
80501
+ }
80502
+ },
80503
+ "required": [
80504
+ "sessionId",
80505
+ "messageId",
80506
+ "text"
80507
+ ],
80508
+ "additionalProperties": false
80509
+ },
80510
+ "outputSchema": {
80511
+ "type": "object",
80512
+ "properties": {
80513
+ "sessionId": {
80514
+ "type": "string"
80515
+ },
80516
+ "id": {
80517
+ "type": "string"
80518
+ },
80519
+ "text": {
80520
+ "type": "string"
80521
+ }
80522
+ },
80523
+ "required": [
80524
+ "sessionId",
80525
+ "id",
80526
+ "text"
80527
+ ],
80528
+ "additionalProperties": false
80529
+ },
80530
+ "invokable": true
80531
+ },
80532
+ {
80533
+ "id": "sessions.queuedMessages.list",
80534
+ "title": "List Queued Mid-Turn Messages",
80535
+ "description": "List the messages queued behind the current turn (submitted while the model was thinking), in delivery order. Queued messages remain editable and deletable until they are delivered; a delivered message no longer appears here. Only the daemon's live local runtime session is resolvable; any other session id is a 404 SESSION_NOT_LOCAL.",
80536
+ "category": "sessions",
80537
+ "source": "builtin",
80538
+ "access": "authenticated",
80539
+ "transport": [
80540
+ "http",
80541
+ "ws"
80542
+ ],
80543
+ "scopes": [
80544
+ "read:sessions"
80545
+ ],
80546
+ "http": {
80547
+ "method": "GET",
80548
+ "path": "/api/sessions/{sessionId}/queued-messages"
80549
+ },
80550
+ "inputSchema": {
80551
+ "type": "object",
80552
+ "properties": {
80553
+ "sessionId": {
80554
+ "type": "string"
80555
+ }
80556
+ },
80557
+ "required": [
80558
+ "sessionId"
80559
+ ],
80560
+ "additionalProperties": false
80561
+ },
80562
+ "outputSchema": {
80563
+ "type": "object",
80564
+ "properties": {
80565
+ "sessionId": {
80566
+ "type": "string"
80567
+ },
80568
+ "messages": {
80569
+ "type": "array",
80570
+ "items": {
80571
+ "type": "object",
80572
+ "properties": {
80573
+ "id": {
80574
+ "type": "string"
80575
+ },
80576
+ "queuedAt": {
80577
+ "type": "number"
80578
+ },
80579
+ "text": {
80580
+ "type": "string"
80581
+ }
80582
+ },
80583
+ "required": [
80584
+ "id",
80585
+ "queuedAt",
80586
+ "text"
80587
+ ],
80588
+ "additionalProperties": false
80589
+ }
80590
+ }
80591
+ },
80592
+ "required": [
80593
+ "sessionId",
80594
+ "messages"
80595
+ ],
80596
+ "additionalProperties": false
80597
+ },
80598
+ "invokable": true
80599
+ },
77854
80600
  {
77855
80601
  "id": "sessions.register",
77856
80602
  "title": "Register Shared Session",
@@ -77886,7 +80632,8 @@
77886
80632
  "webui",
77887
80633
  "companion-task",
77888
80634
  "companion-chat",
77889
- "automation"
80635
+ "automation",
80636
+ "acp"
77890
80637
  ]
77891
80638
  },
77892
80639
  "project": {
@@ -79140,6 +81887,65 @@
79140
81887
  },
79141
81888
  "invokable": true
79142
81889
  },
81890
+ {
81891
+ "id": "sessions.toolCalls.cancel",
81892
+ "title": "Cancel One In-Flight Tool Call",
81893
+ "description": "Cancel a single running tool call by its callId, leaving the turn and any other running calls untouched. The cancelled call settles as a structured \"cancelled by user\" tool result the model adapts to in the same turn — distinct from a whole-turn interrupt. Only the daemon's live local runtime session is controllable; any other session id is a 404 SESSION_NOT_LOCAL, and an unknown or already-settled callId is a 404 TOOL_CALL_NOT_RUNNING.",
81894
+ "category": "sessions",
81895
+ "source": "builtin",
81896
+ "access": "authenticated",
81897
+ "transport": [
81898
+ "http",
81899
+ "ws"
81900
+ ],
81901
+ "scopes": [
81902
+ "write:sessions"
81903
+ ],
81904
+ "http": {
81905
+ "method": "POST",
81906
+ "path": "/api/sessions/{sessionId}/tool-calls/{callId}/cancel"
81907
+ },
81908
+ "events": [
81909
+ "runtime.tools"
81910
+ ],
81911
+ "inputSchema": {
81912
+ "type": "object",
81913
+ "properties": {
81914
+ "sessionId": {
81915
+ "type": "string"
81916
+ },
81917
+ "callId": {
81918
+ "type": "string"
81919
+ }
81920
+ },
81921
+ "required": [
81922
+ "sessionId",
81923
+ "callId"
81924
+ ],
81925
+ "additionalProperties": false
81926
+ },
81927
+ "outputSchema": {
81928
+ "type": "object",
81929
+ "properties": {
81930
+ "sessionId": {
81931
+ "type": "string"
81932
+ },
81933
+ "callId": {
81934
+ "type": "string"
81935
+ },
81936
+ "cancelled": {
81937
+ "type": "boolean"
81938
+ }
81939
+ },
81940
+ "required": [
81941
+ "sessionId",
81942
+ "callId",
81943
+ "cancelled"
81944
+ ],
81945
+ "additionalProperties": false
81946
+ },
81947
+ "invokable": true
81948
+ },
79143
81949
  {
79144
81950
  "id": "security.settings",
79145
81951
  "title": "Security Settings Report",
@@ -86805,6 +89611,64 @@
86805
89611
  },
86806
89612
  "invokable": true
86807
89613
  },
89614
+ {
89615
+ "id": "worktrees.discard",
89616
+ "title": "Discard a Worktree",
89617
+ "description": "Remove a worktree per the eviction-preserving rules: any uncommitted state is first committed onto the worktree's branch (a preservation failure REFUSES the removal rather than losing work), the directory is removed, and the branch is KEPT. Returns an honest receipt (ok, branch kept, preservation commit, detail) either way.",
89618
+ "category": "worktrees",
89619
+ "source": "builtin",
89620
+ "access": "authenticated",
89621
+ "transport": [
89622
+ "ws"
89623
+ ],
89624
+ "scopes": [
89625
+ "write:worktrees"
89626
+ ],
89627
+ "inputSchema": {
89628
+ "type": "object",
89629
+ "properties": {
89630
+ "path": {
89631
+ "type": "string"
89632
+ }
89633
+ },
89634
+ "required": [
89635
+ "path"
89636
+ ],
89637
+ "additionalProperties": false
89638
+ },
89639
+ "outputSchema": {
89640
+ "type": "object",
89641
+ "properties": {
89642
+ "path": {
89643
+ "type": "string"
89644
+ },
89645
+ "ok": {
89646
+ "type": "boolean"
89647
+ },
89648
+ "branch": {
89649
+ "type": "string"
89650
+ },
89651
+ "preservedCommit": {
89652
+ "type": "string"
89653
+ },
89654
+ "discardedAt": {
89655
+ "type": "number"
89656
+ },
89657
+ "detail": {
89658
+ "type": "string"
89659
+ }
89660
+ },
89661
+ "required": [
89662
+ "path",
89663
+ "ok",
89664
+ "discardedAt",
89665
+ "detail"
89666
+ ],
89667
+ "additionalProperties": false
89668
+ },
89669
+ "dangerous": true,
89670
+ "invokable": true
89671
+ },
86808
89672
  {
86809
89673
  "id": "worktrees.setup.run",
86810
89674
  "title": "Re-run Worktree Setup",
@@ -88680,10 +91544,10 @@
88680
91544
  }
88681
91545
  ],
88682
91546
  "schemaCoverage": {
88683
- "methods": 386,
88684
- "typedInputs": 386,
91547
+ "methods": 412,
91548
+ "typedInputs": 412,
88685
91549
  "genericInputs": 0,
88686
- "typedOutputs": 386,
91550
+ "typedOutputs": 412,
88687
91551
  "genericOutputs": 0
88688
91552
  },
88689
91553
  "eventCoverage": {
@@ -88692,10 +91556,10 @@
88692
91556
  "withWireEvents": 32
88693
91557
  },
88694
91558
  "validationCoverage": {
88695
- "methods": 386,
88696
- "validated": 384,
91559
+ "methods": 412,
91560
+ "validated": 405,
88697
91561
  "skippedGeneric": 0,
88698
- "skippedUntyped": 2
91562
+ "skippedUntyped": 7
88699
91563
  }
88700
91564
  },
88701
91565
  "peer": {