ftown 0.27.0 → 0.28.1
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/attention-store.js +34 -2
- package/dist/attention-store.js.map +1 -1
- package/dist/command-rpc.d.ts +11 -0
- package/dist/command-rpc.js +79 -15
- package/dist/command-rpc.js.map +1 -1
- package/dist/coordination/board.js +82 -3
- package/dist/coordination/board.js.map +1 -1
- package/dist/coordination/contract-c.d.ts +117 -0
- package/dist/coordination/contract-c.js +47 -0
- package/dist/coordination/contract-c.js.map +1 -0
- package/dist/coordination/contract.d.ts +8 -1
- package/dist/coordination/contract.js +1 -1
- package/dist/coordination/contract.js.map +1 -1
- package/dist/coordination/format.js +37 -11
- package/dist/coordination/format.js.map +1 -1
- package/dist/coordination/plan.d.ts +74 -0
- package/dist/coordination/plan.js +534 -0
- package/dist/coordination/plan.js.map +1 -0
- package/dist/coordination/routes-plan.d.ts +13 -0
- package/dist/coordination/routes-plan.js +182 -0
- package/dist/coordination/routes-plan.js.map +1 -0
- package/dist/coordination/wiring.d.ts +6 -0
- package/dist/coordination/wiring.js +50 -2
- package/dist/coordination/wiring.js.map +1 -1
- package/dist/coordination-cli.d.ts +6 -1
- package/dist/coordination-cli.js +17 -7
- package/dist/coordination-cli.js.map +1 -1
- package/dist/create-ftown-session.d.ts +18 -0
- package/dist/create-ftown-session.js +44 -0
- package/dist/create-ftown-session.js.map +1 -1
- package/dist/ftown-cli.js +5 -2
- package/dist/ftown-cli.js.map +1 -1
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -1
- package/dist/local-api-server.js +14 -4
- package/dist/local-api-server.js.map +1 -1
- package/dist/local-pair-cli.js +2 -3
- package/dist/local-pair-cli.js.map +1 -1
- package/dist/plan-cli.d.ts +52 -0
- package/dist/plan-cli.js +374 -0
- package/dist/plan-cli.js.map +1 -0
- package/dist/security/bridge/permissions.js +21 -1
- package/dist/security/bridge/permissions.js.map +1 -1
- package/dist/security-cli.d.ts +13 -2
- package/dist/security-cli.js +35 -6
- package/dist/security-cli.js.map +1 -1
- package/dist/sessions-commands.js +10 -0
- package/dist/sessions-commands.js.map +1 -1
- package/dist/types.d.ts +4 -1
- package/dist/wire-types.d.ts +2 -0
- package/dist/wire-types.js.map +1 -1
- package/muse-plugin/.muse-plugin/plugin.json +41 -1
- package/muse-plugin/hooks/ftown-post-tool-use-failure.sh +27 -0
- package/muse-plugin/hooks/ftown-post-tool-use.sh +26 -0
- package/muse-plugin/hooks/ftown-pre-tool-use.sh +26 -0
- package/muse-plugin/hooks/ftown-user-prompt-submit.sh +26 -0
- package/muse-plugin/lib/ftown-hook.sh +42 -5
- package/opencode-plugin/ftown.js +121 -11
- package/package.json +2 -2
- package/skills/ftown/SKILL.md +42 -0
- package/skills/ftown/references/orchestrator.md +29 -25
- package/skills/ftown/references/sessions.md +64 -4
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { CARD_STATES, CARD_STALE_MS, DIGEST_MAX, } from './contract.js';
|
|
2
|
+
import { orderPlan } from './plan.js';
|
|
2
3
|
import { formatLocalHHMM } from './format.js';
|
|
4
|
+
/** Archived children included by board({ all: true }), newest first. */
|
|
5
|
+
const ARCHIVED_CHILD_CAP = 50;
|
|
3
6
|
function emptyRollup() {
|
|
4
7
|
const rollup = {
|
|
5
8
|
working: 0,
|
|
@@ -37,6 +40,61 @@ async function readAllEventsSince(deps, rootId, since) {
|
|
|
37
40
|
}
|
|
38
41
|
return { events: all, cursor };
|
|
39
42
|
}
|
|
43
|
+
function archivedTime(session) {
|
|
44
|
+
const removedAt = session.removedAt;
|
|
45
|
+
return typeof removedAt === 'string' ? removedAt : '';
|
|
46
|
+
}
|
|
47
|
+
/** Newest archived time first. Valid timestamps beat missing ones; id breaks ties. */
|
|
48
|
+
function compareArchivedNewestFirst(a, b) {
|
|
49
|
+
const aTime = archivedTime(a);
|
|
50
|
+
const bTime = archivedTime(b);
|
|
51
|
+
const ta = Date.parse(aTime);
|
|
52
|
+
const tb = Date.parse(bTime);
|
|
53
|
+
const aOk = aTime !== '' && !Number.isNaN(ta);
|
|
54
|
+
const bOk = bTime !== '' && !Number.isNaN(tb);
|
|
55
|
+
if (aOk && bOk && ta !== tb)
|
|
56
|
+
return tb - ta;
|
|
57
|
+
if (aOk !== bOk)
|
|
58
|
+
return aOk ? -1 : 1;
|
|
59
|
+
return a.id.localeCompare(b.id);
|
|
60
|
+
}
|
|
61
|
+
function selectArchivedChildren(archived, rootId, liveIds) {
|
|
62
|
+
const newestById = new Map();
|
|
63
|
+
for (const session of archived) {
|
|
64
|
+
if (session.id === rootId || session.parentSessionId !== rootId)
|
|
65
|
+
continue;
|
|
66
|
+
if (liveIds.has(session.id))
|
|
67
|
+
continue;
|
|
68
|
+
const prev = newestById.get(session.id);
|
|
69
|
+
if (!prev || compareArchivedNewestFirst(session, prev) <= 0) {
|
|
70
|
+
newestById.set(session.id, session);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return Array.from(newestById.values())
|
|
74
|
+
.sort(compareArchivedNewestFirst)
|
|
75
|
+
.slice(0, ARCHIVED_CHILD_CAP);
|
|
76
|
+
}
|
|
77
|
+
function buildArchivedCard(session) {
|
|
78
|
+
const previews = session.preview ? session.preview.files.map((f) => f.fileName) : [];
|
|
79
|
+
const derived = {
|
|
80
|
+
status: session.status,
|
|
81
|
+
activity: 'unknown',
|
|
82
|
+
openAttention: 0,
|
|
83
|
+
unreadMail: 0,
|
|
84
|
+
previews,
|
|
85
|
+
...(session.shellType !== undefined ? { shellType: session.shellType } : {}),
|
|
86
|
+
...(session.model !== undefined ? { model: session.model } : {}),
|
|
87
|
+
};
|
|
88
|
+
return {
|
|
89
|
+
archived: true,
|
|
90
|
+
sessionId: session.id,
|
|
91
|
+
name: session.name,
|
|
92
|
+
...(session.parentSessionId !== undefined ? { parentSessionId: session.parentSessionId } : {}),
|
|
93
|
+
declared: session.card ?? null,
|
|
94
|
+
derived,
|
|
95
|
+
stale: false,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
40
98
|
export class BoardService {
|
|
41
99
|
deps;
|
|
42
100
|
constructor(deps) {
|
|
@@ -118,17 +176,22 @@ export class BoardService {
|
|
|
118
176
|
throw new Error('Session not found');
|
|
119
177
|
}
|
|
120
178
|
const rootId = session.parentSessionId ?? session.id;
|
|
121
|
-
const
|
|
179
|
+
const listArchived = this.deps.listArchived;
|
|
180
|
+
const [allSessions, cursor, eventsPage, archivedSessions, rootSession] = await Promise.all([
|
|
122
181
|
this.deps.listSessions(),
|
|
123
182
|
this.deps.events.head(rootId),
|
|
124
183
|
query.since !== undefined
|
|
125
184
|
? readAllEventsSince(this.deps, rootId, query.since)
|
|
126
185
|
: Promise.resolve(null),
|
|
186
|
+
query.all && listArchived ? listArchived() : Promise.resolve([]),
|
|
187
|
+
session.id === rootId ? Promise.resolve(session) : this.deps.loadSession(rootId),
|
|
127
188
|
]);
|
|
128
189
|
const sinceSessionIds = eventsPage
|
|
129
190
|
? new Set(eventsPage.events.map((e) => e.sessionId))
|
|
130
191
|
: null;
|
|
131
|
-
|
|
192
|
+
const liveChildren = allSessions.filter((s) => s.parentSessionId === rootId && s.id !== rootId);
|
|
193
|
+
const liveIds = new Set(liveChildren.map((s) => s.id));
|
|
194
|
+
let children = liveChildren;
|
|
132
195
|
if (!query.all) {
|
|
133
196
|
children = children.filter((s) => s.status === 'running' ||
|
|
134
197
|
s.status === 'pending' ||
|
|
@@ -145,20 +208,36 @@ export class BoardService {
|
|
|
145
208
|
}
|
|
146
209
|
return a.createdAt.localeCompare(b.createdAt);
|
|
147
210
|
});
|
|
148
|
-
let
|
|
211
|
+
let archivedChildren = [];
|
|
212
|
+
if (query.all) {
|
|
213
|
+
archivedChildren = selectArchivedChildren(archivedSessions, rootId, liveIds);
|
|
214
|
+
if (sinceSessionIds !== null) {
|
|
215
|
+
archivedChildren = archivedChildren.filter((s) => sinceSessionIds.has(s.id));
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
let cards = [
|
|
219
|
+
...(await Promise.all(children.map((c) => this.buildCardForSession(c)))),
|
|
220
|
+
...archivedChildren.map((c) => buildArchivedCard(c)),
|
|
221
|
+
];
|
|
149
222
|
if (query.ready) {
|
|
150
223
|
cards = cards.filter((c) => c.derived.pr?.state === 'passed' && c.declared?.state !== 'done');
|
|
151
224
|
}
|
|
225
|
+
// Rollup counts live work. Archived children stay on the board under --all
|
|
226
|
+
// (suffixed "(retired)") and do not add to a state bucket.
|
|
152
227
|
const rollup = emptyRollup();
|
|
153
228
|
for (const c of cards) {
|
|
229
|
+
if (c.archived)
|
|
230
|
+
continue;
|
|
154
231
|
const key = c.declared?.state ?? 'unset';
|
|
155
232
|
rollup[key] += 1;
|
|
156
233
|
}
|
|
234
|
+
const plan = rootSession?.plan ? orderPlan(rootSession.plan.items) : undefined;
|
|
157
235
|
return {
|
|
158
236
|
rootId,
|
|
159
237
|
cursor,
|
|
160
238
|
cards,
|
|
161
239
|
rollup,
|
|
240
|
+
...(plan !== undefined ? { plan } : {}),
|
|
162
241
|
};
|
|
163
242
|
}
|
|
164
243
|
async digest(sessionId, sinceSeq) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"board.js","sourceRoot":"","sources":["../../src/coordination/board.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"board.js","sourceRoot":"","sources":["../../src/coordination/board.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FROZEN CONTRACT — coordination phase C: plan list (todo with precedence), retired
|
|
3
|
+
* history on the board, removed/plan tree events, dashboard board snapshot RPC, board v3
|
|
4
|
+
* Overview. Types/constants/interfaces only. Implementers must not modify this file.
|
|
5
|
+
*/
|
|
6
|
+
import type { Board, SessionCard, TreeEvent } from './contract.js';
|
|
7
|
+
import type { AttentionItem } from '../attention-events.js';
|
|
8
|
+
export declare const PLAN_LIMITS: {
|
|
9
|
+
readonly items: 200;
|
|
10
|
+
readonly title: 140;
|
|
11
|
+
readonly note: 500;
|
|
12
|
+
readonly after: 20;
|
|
13
|
+
};
|
|
14
|
+
export declare const PLAN_STATES: readonly ["todo", "started", "done", "dropped"];
|
|
15
|
+
export type PlanState = typeof PLAN_STATES[number];
|
|
16
|
+
export type PlanPriority = 1 | 2 | 3;
|
|
17
|
+
export interface PlanItem {
|
|
18
|
+
id: string;
|
|
19
|
+
title: string;
|
|
20
|
+
note?: string;
|
|
21
|
+
after: string[];
|
|
22
|
+
priority: PlanPriority;
|
|
23
|
+
state: PlanState;
|
|
24
|
+
sessionId?: string;
|
|
25
|
+
createdAt: string;
|
|
26
|
+
updatedAt: string;
|
|
27
|
+
}
|
|
28
|
+
/** Stored on the PARENT session: Session.plan (session.json) → flows to dashboard via toWireSession. */
|
|
29
|
+
export interface SessionPlan {
|
|
30
|
+
items: PlanItem[];
|
|
31
|
+
seq: number;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Derived ordering (pure helper `orderPlan(items)` in bridge/src/coordination/plan.ts, also re-implemented
|
|
35
|
+
* identically in the UI — see PLAN_ORDER_RULE):
|
|
36
|
+
* ready = state 'todo' && every `after` item is 'done' or 'dropped'
|
|
37
|
+
* waiting = state 'todo' && not ready
|
|
38
|
+
* Order: ready (priority asc, createdAt asc), then waiting (same), then started (updatedAt asc),
|
|
39
|
+
* then done (updatedAt desc), then dropped (updatedAt desc).
|
|
40
|
+
*/
|
|
41
|
+
export declare const PLAN_ORDER_RULE: "ready>waiting>started>done>dropped; within ready/waiting: priority asc, createdAt asc";
|
|
42
|
+
export interface PlanView {
|
|
43
|
+
items: PlanItem[];
|
|
44
|
+
ready: string[];
|
|
45
|
+
}
|
|
46
|
+
/** Routes (via dispatchSecure; :id = parent session). Caller: local-cli principal; any session may edit the plan of :id (owner-only enforcement is out of scope). */
|
|
47
|
+
export declare const PLAN_ROUTES: {
|
|
48
|
+
/** GET → PlanView; POST body { title, note?, after?, priority? } → { item } */
|
|
49
|
+
readonly plan: "/api/sessions/:id/plan";
|
|
50
|
+
/** PATCH body { title?, note?: string|null, after?, priority?, state?, sessionId?: string|null } → { item }; DELETE → { ok: true } (removes id from others' `after`) */
|
|
51
|
+
readonly item: "/api/sessions/:id/plan/:itemId";
|
|
52
|
+
};
|
|
53
|
+
export declare class PlanValidationError extends Error {
|
|
54
|
+
constructor(message: string);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Automatic transitions (bridge wiring):
|
|
58
|
+
* - `ftown sessions create --parent --plan-item <id>`: after the child exists, item.state = 'started', item.sessionId = child.id.
|
|
59
|
+
* Unknown/non-todo item → create fails 400 BEFORE the session is created.
|
|
60
|
+
* - When a child's declared card becomes 'done' and an item of its parent has sessionId === child.id and state 'started' → 'done'.
|
|
61
|
+
* 'failed' card → item back to 'todo' with sessionId cleared? NO: leave 'started' (manager decides).
|
|
62
|
+
* - Every plan change emits ONE tree event kind 'plan' on the parent's log with summary
|
|
63
|
+
* `<id> <state>: <title>` ; when items become ready because of it, append ` → ready: <id>, <id>`.
|
|
64
|
+
*
|
|
65
|
+
* CLI (bridge/src/plan-cli.ts, group `ftown plan`, default session = FTOWN_SESSION_ID = the manager):
|
|
66
|
+
* ftown plan [--json] [--session-id <id>] list in order: `<mark> <id> [P<prio>] <title> (after p1,p2 | → <child name>)`
|
|
67
|
+
* marks: `→` ready, `·` waiting, `▸` started, `✓` done, `✗` dropped
|
|
68
|
+
* ftown plan add <title...> [--note <t>] [--after <id,id>] [--priority 1|2|3]
|
|
69
|
+
* ftown plan start <id> --session <child-id>
|
|
70
|
+
* ftown plan done <id> | drop <id> | todo <id>
|
|
71
|
+
* ftown plan edit <id> [--title <t>] [--note <t>|--no-note] [--after <ids>|--no-after] [--priority n]
|
|
72
|
+
* ftown plan rm <id>
|
|
73
|
+
* ftown sessions create --parent --plan-item <id> ... (in sessions-commands.ts)
|
|
74
|
+
* Exit codes: 0 ok, 1 error, 2 usage.
|
|
75
|
+
*/
|
|
76
|
+
/** Added to TREE_EVENT_KINDS in contract.ts (phase C edit): 'plan' and 'removed'. */
|
|
77
|
+
export declare const PHASE_C_EVENT_KINDS: readonly ["plan", "removed"];
|
|
78
|
+
/** 'removed': emitted when a child session is removed/archived while not already exited; summary `removed`. */
|
|
79
|
+
/** SessionCard gains (in contract.ts, phase C edit): `archived?: boolean`. Board gains `plan?: PlanView`. */
|
|
80
|
+
export interface BoardPhaseCFields {
|
|
81
|
+
archived?: boolean;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* BoardService (phase C):
|
|
85
|
+
* - BoardDeps gains `listArchived(): Promise<Session[]>` (archive store records).
|
|
86
|
+
* - board({ all: true }) includes archived children (archived: true, derived.status as recorded, activity 'unknown'),
|
|
87
|
+
* ordered after live children by archived time desc, capped at 50 most recent.
|
|
88
|
+
* - Board.plan = the parent's PlanView when the root has a plan (always included).
|
|
89
|
+
* - Plain `ftown board`: after child rows, a `planned` section: up to 5 ready items `→ <id> <title>` then `+N more`.
|
|
90
|
+
*
|
|
91
|
+
* `ftown board --wait --until any-done|any-blocked|any-ready` (phase C fix): the condition must hold for a child
|
|
92
|
+
* whose tree events arrived AFTER the starting cursor (any-done: a changed child is now done, etc.).
|
|
93
|
+
* `all-done` stays global. `any-change` unchanged.
|
|
94
|
+
*/
|
|
95
|
+
/** command-rpc command `get_session_board`, payload { bridgeId, sessionId } → BoardSnapshot. Read-only. */
|
|
96
|
+
export interface BoardSnapshot {
|
|
97
|
+
board: Board;
|
|
98
|
+
events: TreeEvent[];
|
|
99
|
+
attention: Array<{
|
|
100
|
+
sessionId: string;
|
|
101
|
+
event: AttentionItem;
|
|
102
|
+
}>;
|
|
103
|
+
}
|
|
104
|
+
export declare const BOARD_SNAPSHOT_EVENTS = 50;
|
|
105
|
+
/**
|
|
106
|
+
* UI (board v3 Overview, see .ftown-previews/board-v3-notes.md in the phase B worktree — copied to
|
|
107
|
+
* docs/design/board-v3.md in this phase):
|
|
108
|
+
* - hook `useSessionBoard(bridgeId, sessionId, enabled)` calls get_session_board on mount, on any session update
|
|
109
|
+
* for that tree, and every 15 s while the Overview is visible; never while hidden.
|
|
110
|
+
* - SessionOverview renders: manager line; "needs attention · n" (failed | blocked | escalated question; owner
|
|
111
|
+
* `you` or manager name); "active · n"; folds: planned (PlanView order), done (incl. archived/retired),
|
|
112
|
+
* events, brief. Row expand shows details (state/progress/age/stale, blocked, question, next, activity +
|
|
113
|
+
* idle duration, pr, worktree, mail, preview, agent, that session's last 3 events).
|
|
114
|
+
* - Idle duration: the UI records the timestamp when a session's activity becomes 'idle' (from hook events)
|
|
115
|
+
* and shows `idle <n>m`.
|
|
116
|
+
*/
|
|
117
|
+
export type OverviewChild = SessionCard;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
// ───────────────────────── Plan (todo list with precedence) ─────────────────────────
|
|
2
|
+
export const PLAN_LIMITS = { items: 200, title: 140, note: 500, after: 20 };
|
|
3
|
+
export const PLAN_STATES = ['todo', 'started', 'done', 'dropped'];
|
|
4
|
+
/**
|
|
5
|
+
* Derived ordering (pure helper `orderPlan(items)` in bridge/src/coordination/plan.ts, also re-implemented
|
|
6
|
+
* identically in the UI — see PLAN_ORDER_RULE):
|
|
7
|
+
* ready = state 'todo' && every `after` item is 'done' or 'dropped'
|
|
8
|
+
* waiting = state 'todo' && not ready
|
|
9
|
+
* Order: ready (priority asc, createdAt asc), then waiting (same), then started (updatedAt asc),
|
|
10
|
+
* then done (updatedAt desc), then dropped (updatedAt desc).
|
|
11
|
+
*/
|
|
12
|
+
export const PLAN_ORDER_RULE = 'ready>waiting>started>done>dropped; within ready/waiting: priority asc, createdAt asc';
|
|
13
|
+
/** Routes (via dispatchSecure; :id = parent session). Caller: local-cli principal; any session may edit the plan of :id (owner-only enforcement is out of scope). */
|
|
14
|
+
export const PLAN_ROUTES = {
|
|
15
|
+
/** GET → PlanView; POST body { title, note?, after?, priority? } → { item } */
|
|
16
|
+
plan: '/api/sessions/:id/plan',
|
|
17
|
+
/** PATCH body { title?, note?: string|null, after?, priority?, state?, sessionId?: string|null } → { item }; DELETE → { ok: true } (removes id from others' `after`) */
|
|
18
|
+
item: '/api/sessions/:id/plan/:itemId',
|
|
19
|
+
};
|
|
20
|
+
export class PlanValidationError extends Error {
|
|
21
|
+
constructor(message) { super(message); this.name = 'PlanValidationError'; }
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Automatic transitions (bridge wiring):
|
|
25
|
+
* - `ftown sessions create --parent --plan-item <id>`: after the child exists, item.state = 'started', item.sessionId = child.id.
|
|
26
|
+
* Unknown/non-todo item → create fails 400 BEFORE the session is created.
|
|
27
|
+
* - When a child's declared card becomes 'done' and an item of its parent has sessionId === child.id and state 'started' → 'done'.
|
|
28
|
+
* 'failed' card → item back to 'todo' with sessionId cleared? NO: leave 'started' (manager decides).
|
|
29
|
+
* - Every plan change emits ONE tree event kind 'plan' on the parent's log with summary
|
|
30
|
+
* `<id> <state>: <title>` ; when items become ready because of it, append ` → ready: <id>, <id>`.
|
|
31
|
+
*
|
|
32
|
+
* CLI (bridge/src/plan-cli.ts, group `ftown plan`, default session = FTOWN_SESSION_ID = the manager):
|
|
33
|
+
* ftown plan [--json] [--session-id <id>] list in order: `<mark> <id> [P<prio>] <title> (after p1,p2 | → <child name>)`
|
|
34
|
+
* marks: `→` ready, `·` waiting, `▸` started, `✓` done, `✗` dropped
|
|
35
|
+
* ftown plan add <title...> [--note <t>] [--after <id,id>] [--priority 1|2|3]
|
|
36
|
+
* ftown plan start <id> --session <child-id>
|
|
37
|
+
* ftown plan done <id> | drop <id> | todo <id>
|
|
38
|
+
* ftown plan edit <id> [--title <t>] [--note <t>|--no-note] [--after <ids>|--no-after] [--priority n]
|
|
39
|
+
* ftown plan rm <id>
|
|
40
|
+
* ftown sessions create --parent --plan-item <id> ... (in sessions-commands.ts)
|
|
41
|
+
* Exit codes: 0 ok, 1 error, 2 usage.
|
|
42
|
+
*/
|
|
43
|
+
// ───────────────────────── Tree events: new kinds ─────────────────────────
|
|
44
|
+
/** Added to TREE_EVENT_KINDS in contract.ts (phase C edit): 'plan' and 'removed'. */
|
|
45
|
+
export const PHASE_C_EVENT_KINDS = ['plan', 'removed'];
|
|
46
|
+
export const BOARD_SNAPSHOT_EVENTS = 50;
|
|
47
|
+
//# sourceMappingURL=contract-c.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract-c.js","sourceRoot":"","sources":["../../src/coordination/contract-c.ts"],"names":[],"mappings":"AAQA,uFAAuF;AAEvF,MAAM,CAAC,MAAM,WAAW,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAW,CAAC;AACrF,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,CAAU,CAAC;AAmB3E;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,uFAAgG,CAAC;AAIhI,qKAAqK;AACrK,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,+EAA+E;IAC/E,IAAI,EAAE,wBAAwB;IAC9B,wKAAwK;IACxK,IAAI,EAAE,gCAAgC;CAC9B,CAAC;AAEX,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAC5C,YAAY,OAAe,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC,CAAC,CAAC;CACpF;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,6EAA6E;AAE7E,qFAAqF;AACrF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,MAAM,EAAE,SAAS,CAAU,CAAC;AA6BhE,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,CAAC"}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import type { Activity } from '../attention-events.js';
|
|
7
7
|
import type { PullRequestState } from '../pull-request-status-protocol.js';
|
|
8
|
+
import type { PlanView } from './contract-c.js';
|
|
8
9
|
import type { MailMessage, Session, SessionStatus } from '../types.js';
|
|
9
10
|
export declare const CARD_STATES: readonly ["working", "blocked", "waiting_review", "done", "failed"];
|
|
10
11
|
export type CardState = typeof CARD_STATES[number];
|
|
@@ -70,6 +71,8 @@ export interface CardDerived {
|
|
|
70
71
|
model?: string;
|
|
71
72
|
}
|
|
72
73
|
export interface SessionCard {
|
|
74
|
+
/** phase C: true for retired (archived) children included by board(all) */
|
|
75
|
+
archived?: boolean;
|
|
73
76
|
sessionId: string;
|
|
74
77
|
name: string;
|
|
75
78
|
parentSessionId?: string;
|
|
@@ -99,7 +102,7 @@ export declare const TREE_EVENTS_RETAIN = 5000;
|
|
|
99
102
|
export declare const TREE_EVENTS_COMPACT_AT = 6000;
|
|
100
103
|
export declare const TREE_EVENTS_MAX_WAIT_MS = 300000;
|
|
101
104
|
export declare const TREE_EVENT_SUMMARY_MAX = 300;
|
|
102
|
-
export declare const TREE_EVENT_KINDS: readonly ["status", "attention", "pr", "preview", "exit", "idle", "result", "mail"];
|
|
105
|
+
export declare const TREE_EVENT_KINDS: readonly ["status", "attention", "pr", "preview", "exit", "idle", "result", "mail", "plan", "removed"];
|
|
103
106
|
export type TreeEventKind = typeof TREE_EVENT_KINDS[number];
|
|
104
107
|
export interface TreeEvent {
|
|
105
108
|
seq: number;
|
|
@@ -135,6 +138,8 @@ export interface TreeEventLogApi {
|
|
|
135
138
|
}
|
|
136
139
|
export type BoardRollupKey = CardState | 'unset';
|
|
137
140
|
export interface Board {
|
|
141
|
+
/** phase C: the root's plan, ordered */
|
|
142
|
+
plan?: PlanView;
|
|
138
143
|
rootId: string;
|
|
139
144
|
/** tree event head at render time; pass back as `since` */
|
|
140
145
|
cursor: number;
|
|
@@ -153,6 +158,8 @@ export interface BoardQuery {
|
|
|
153
158
|
all?: boolean;
|
|
154
159
|
}
|
|
155
160
|
export interface BoardDeps {
|
|
161
|
+
/** phase C: archived session records */
|
|
162
|
+
listArchived?(): Promise<Session[]>;
|
|
156
163
|
loadSession(id: string): Promise<Session | null>;
|
|
157
164
|
listSessions(): Promise<Session[]>;
|
|
158
165
|
attention(id: string): Promise<{
|
|
@@ -19,7 +19,7 @@ export const TREE_EVENTS_RETAIN = 5_000; // keep newest N on compaction
|
|
|
19
19
|
export const TREE_EVENTS_COMPACT_AT = 6_000;
|
|
20
20
|
export const TREE_EVENTS_MAX_WAIT_MS = 300_000;
|
|
21
21
|
export const TREE_EVENT_SUMMARY_MAX = 300;
|
|
22
|
-
export const TREE_EVENT_KINDS = ['status', 'attention', 'pr', 'preview', 'exit', 'idle', 'result', 'mail'];
|
|
22
|
+
export const TREE_EVENT_KINDS = ['status', 'attention', 'pr', 'preview', 'exit', 'idle', 'result', 'mail', 'plan', 'removed'];
|
|
23
23
|
/**
|
|
24
24
|
* Digest line format (exact):
|
|
25
25
|
* `[ftown] since HH:MM: <part> | <part> | ...`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contract.js","sourceRoot":"","sources":["../../src/coordination/contract.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"contract.js","sourceRoot":"","sources":["../../src/coordination/contract.ts"],"names":[],"mappings":"AAUA,2FAA2F;AAE3F,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,EAAE,QAAQ,CAAU,CAAC;AAG/F,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,CAAU,CAAC;AAGpF,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,QAAQ,EAAE,GAAG;IACb,IAAI,EAAE,GAAG;IACT,WAAW,EAAE,GAAG;IAChB,yDAAyD;IACzD,aAAa,EAAE,MAAM;CACb,CAAC;AA4BX,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAC5C,YAAY,OAAe,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC,CAAC,CAAC;CACpF;AAgCD,MAAM,CAAC,MAAM,aAAa,GAAG,EAAE,GAAG,MAAM,CAAC;AAoBzC,qEAAqE;AAErE,uFAAuF;AACvF,MAAM,CAAC,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,CAAC,wBAAwB;AAC7E,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,CAAC,CAAG,8BAA8B;AACzE,MAAM,CAAC,MAAM,sBAAsB,GAAG,KAAK,CAAC;AAC5C,MAAM,CAAC,MAAM,uBAAuB,GAAG,OAAO,CAAC;AAC/C,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAAG,CAAC;AAE1C,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,CAAU,CAAC;AA4EvI;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,GAAG,CAAC;AAE9B;;GAEG;AAEH,6EAA6E;AAE7E,iEAAiE;AACjE,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,CAAU,CAAC;AAEzF,0FAA0F;AAC1F,MAAM,CAAC,MAAM,qBAAqB,GAA4B,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AAC/E,gGAAgG;AAChG,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAsBnC,+GAA+G;AAE/G,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,8GAA8G;IAC9G,IAAI,EAAE,wBAAwB;IAC9B,2CAA2C;IAC3C,KAAK,EAAE,yBAAyB;IAChC,kFAAkF;IAClF,MAAM,EAAE,0BAA0B;CAC1B,CAAC;AAEX,iGAAiG;AACjG;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW,CAAU,CAAC"}
|
|
@@ -47,24 +47,50 @@ export function formatBoardRow(card, nowMs) {
|
|
|
47
47
|
if (card.stale) {
|
|
48
48
|
suffix += ' (stale)';
|
|
49
49
|
}
|
|
50
|
+
if (card.archived) {
|
|
51
|
+
suffix += ' (retired)';
|
|
52
|
+
}
|
|
50
53
|
return `${card.name} ${state} ${activity}${idlePart} ${headline}${suffix}`;
|
|
51
54
|
}
|
|
55
|
+
const PLANNED_READY_LIMIT = 5;
|
|
56
|
+
function formatPlannedLines(board) {
|
|
57
|
+
const ready = board.plan?.ready ?? [];
|
|
58
|
+
if (ready.length === 0)
|
|
59
|
+
return [];
|
|
60
|
+
const titleById = new Map((board.plan?.items ?? []).map((item) => [item.id, item.title]));
|
|
61
|
+
const shown = ready.slice(0, PLANNED_READY_LIMIT);
|
|
62
|
+
const lines = ['planned'];
|
|
63
|
+
for (const id of shown) {
|
|
64
|
+
const title = titleById.get(id) ?? '';
|
|
65
|
+
lines.push(title === '' ? `→ ${id}` : `→ ${id} ${title}`);
|
|
66
|
+
}
|
|
67
|
+
const more = ready.length - shown.length;
|
|
68
|
+
if (more > 0)
|
|
69
|
+
lines.push(`+${more} more`);
|
|
70
|
+
return lines;
|
|
71
|
+
}
|
|
52
72
|
export function formatBoard(board, nowMs) {
|
|
73
|
+
const lines = [];
|
|
53
74
|
if (board.cards.length === 0) {
|
|
54
|
-
|
|
75
|
+
lines.push('no child sessions');
|
|
55
76
|
}
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
77
|
+
else {
|
|
78
|
+
for (const card of board.cards) {
|
|
79
|
+
lines.push(formatBoardRow(card, nowMs));
|
|
80
|
+
}
|
|
81
|
+
const rollupParts = [];
|
|
82
|
+
for (const key of ROLLUP_ORDER) {
|
|
83
|
+
const count = board.rollup[key] ?? 0;
|
|
84
|
+
if (count > 0) {
|
|
85
|
+
rollupParts.push(`${count} ${key}`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
if (rollupParts.length > 0) {
|
|
89
|
+
lines.push(rollupParts.join(', '));
|
|
62
90
|
}
|
|
63
91
|
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
}
|
|
67
|
-
return rows.join('\n');
|
|
92
|
+
lines.push(...formatPlannedLines(board));
|
|
93
|
+
return lines.join('\n');
|
|
68
94
|
}
|
|
69
95
|
export function formatEvent(e) {
|
|
70
96
|
const hhmm = formatLocalHHMM(e.ts);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/coordination/format.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/coordination/format.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plan list: precedence ordering, pure edits, and the session-backed store.
|
|
3
|
+
* Ordering follows PLAN_ORDER_RULE. Ids are `p<seq>` allocated from SessionPlan.seq
|
|
4
|
+
* and then incremented, so a removed id is never reused. A plan that does not exist
|
|
5
|
+
* yet starts at seq 1 (first item `p1`).
|
|
6
|
+
*/
|
|
7
|
+
import type { Session } from '../types.js';
|
|
8
|
+
import { type PlanItem, type PlanPriority, type PlanState, type PlanView, type SessionPlan } from './contract-c.js';
|
|
9
|
+
export interface PlanAddInput {
|
|
10
|
+
title: string;
|
|
11
|
+
note?: string;
|
|
12
|
+
after?: string[];
|
|
13
|
+
priority?: PlanPriority;
|
|
14
|
+
}
|
|
15
|
+
export interface PlanPatchInput {
|
|
16
|
+
title?: string;
|
|
17
|
+
note?: string | null;
|
|
18
|
+
after?: string[];
|
|
19
|
+
priority?: PlanPriority;
|
|
20
|
+
state?: PlanState;
|
|
21
|
+
sessionId?: string | null;
|
|
22
|
+
}
|
|
23
|
+
export interface PlanStoreDeps {
|
|
24
|
+
loadSession(id: string): Promise<Session | null>;
|
|
25
|
+
saveSession(session: Session): Promise<void>;
|
|
26
|
+
publishSession(session: Session): void | Promise<void>;
|
|
27
|
+
emit(parent: Session, summary: string): Promise<void>;
|
|
28
|
+
now(): number;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Ready, then waiting, then started, then done, then dropped.
|
|
32
|
+
* Ready and waiting: priority ascending, then createdAt ascending.
|
|
33
|
+
* Started: updatedAt ascending. Done and dropped: updatedAt descending.
|
|
34
|
+
* Id number breaks remaining ties.
|
|
35
|
+
*/
|
|
36
|
+
export declare function orderPlan(items: readonly PlanItem[]): PlanView;
|
|
37
|
+
/** Ids of todo items whose every `after` dependency is done or dropped, in plan order. */
|
|
38
|
+
export declare function readyIds(items: readonly PlanItem[]): string[];
|
|
39
|
+
/** Ids that are ready in `after` and were not ready in `before`, in the new ready order. */
|
|
40
|
+
export declare function newlyReady(before: readonly PlanItem[], after: readonly PlanItem[]): string[];
|
|
41
|
+
export declare function applyAdd(plan: SessionPlan | null | undefined, input: unknown, now: string): SessionPlan;
|
|
42
|
+
/** Validates a patch and returns the updated plan. `applyPatch` delegates here. */
|
|
43
|
+
export declare function validatePatch(plan: SessionPlan | null | undefined, input: unknown, now: string): SessionPlan;
|
|
44
|
+
export declare function applyPatch(plan: SessionPlan | null | undefined, input: unknown, now: string): SessionPlan;
|
|
45
|
+
export declare function applyRemove(plan: SessionPlan | null | undefined, input: unknown, now: string): SessionPlan;
|
|
46
|
+
/**
|
|
47
|
+
* Reloads the parent before every save. Each successful change publishes the saved
|
|
48
|
+
* session, then emits one `plan` summary — `<id> <state>: <title>`, plus
|
|
49
|
+
* ` → ready: <id>, <id>` when items became ready. An emit failure is warned and
|
|
50
|
+
* does not undo the publish.
|
|
51
|
+
*/
|
|
52
|
+
export declare class PlanStore {
|
|
53
|
+
private readonly deps;
|
|
54
|
+
constructor(deps: PlanStoreDeps);
|
|
55
|
+
get(parentId: string): Promise<SessionPlan | null>;
|
|
56
|
+
add(parentId: string, input: PlanAddInput): Promise<PlanItem>;
|
|
57
|
+
patch(parentId: string, itemId: string, input: PlanPatchInput): Promise<PlanItem>;
|
|
58
|
+
remove(parentId: string, itemId: string): Promise<void>;
|
|
59
|
+
/** Binds a todo item to a child: state `started`, sessionId = childId. */
|
|
60
|
+
startForChild(parentId: string, itemId: string, childId: string): Promise<void>;
|
|
61
|
+
/**
|
|
62
|
+
* Marks every item with this child and state `started` as `done`.
|
|
63
|
+
* No match, or a missing parent, is a no-op: a failed card stays `started` for the manager.
|
|
64
|
+
*/
|
|
65
|
+
completeForChild(parentId: string, childId: string): Promise<void>;
|
|
66
|
+
/**
|
|
67
|
+
* Returns every item with this child and state `started` to `todo` and clears sessionId.
|
|
68
|
+
* No match, or a missing parent, is a no-op. One event: `<id> todo: <title> (session removed)`.
|
|
69
|
+
*/
|
|
70
|
+
releaseForChild(parentId: string, childId: string): Promise<void>;
|
|
71
|
+
private stamp;
|
|
72
|
+
private change;
|
|
73
|
+
private persist;
|
|
74
|
+
}
|