pi-daddy 0.46.1 → 0.47.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.
Files changed (106) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +41 -11
  3. package/contracts/ledger-record/v1/governance-event.schema.json +65 -3
  4. package/dist/governance/approval-prompt.d.ts +4 -0
  5. package/dist/governance/approval-prompt.d.ts.map +1 -1
  6. package/dist/governance/approval-prompt.js +59 -4
  7. package/dist/governance/approval-prompt.js.map +1 -1
  8. package/dist/governance/auto-mode-policy.d.ts +11 -0
  9. package/dist/governance/auto-mode-policy.d.ts.map +1 -0
  10. package/dist/governance/auto-mode-policy.js +309 -0
  11. package/dist/governance/auto-mode-policy.js.map +1 -0
  12. package/dist/governance/execution-retention.d.ts +3 -0
  13. package/dist/governance/execution-retention.d.ts.map +1 -1
  14. package/dist/governance/execution-retention.js +30 -0
  15. package/dist/governance/execution-retention.js.map +1 -1
  16. package/dist/governance/ledger-events.d.ts +14 -1
  17. package/dist/governance/ledger-events.d.ts.map +1 -1
  18. package/dist/governance/ledger-events.js +13 -0
  19. package/dist/governance/ledger-events.js.map +1 -1
  20. package/dist/governance/ledger-report.d.ts.map +1 -1
  21. package/dist/governance/ledger-report.js +12 -3
  22. package/dist/governance/ledger-report.js.map +1 -1
  23. package/dist/governance/ledger-v3-validation.d.ts.map +1 -1
  24. package/dist/governance/ledger-v3-validation.js +17 -3
  25. package/dist/governance/ledger-v3-validation.js.map +1 -1
  26. package/dist/governance/ledger.d.ts +1 -1
  27. package/dist/governance/ledger.d.ts.map +1 -1
  28. package/dist/governance/ledger.js +1 -1
  29. package/dist/governance/ledger.js.map +1 -1
  30. package/dist/kernel/approval.d.ts +1 -1
  31. package/dist/kernel/approval.d.ts.map +1 -1
  32. package/dist/kernel/approval.js +1 -1
  33. package/dist/kernel/approval.js.map +1 -1
  34. package/dist/kernel/auto-mode.d.ts +35 -0
  35. package/dist/kernel/auto-mode.d.ts.map +1 -0
  36. package/dist/kernel/auto-mode.js +29 -0
  37. package/dist/kernel/auto-mode.js.map +1 -0
  38. package/dist/kernel/delegate-types.d.ts +2 -0
  39. package/dist/kernel/delegate-types.d.ts.map +1 -1
  40. package/dist/kernel/delegate-types.js.map +1 -1
  41. package/dist/kernel/delegate.d.ts.map +1 -1
  42. package/dist/kernel/delegate.js +2 -2
  43. package/dist/kernel/delegate.js.map +1 -1
  44. package/dist/kernel/env-names.d.ts +2 -0
  45. package/dist/kernel/env-names.d.ts.map +1 -1
  46. package/dist/kernel/env-names.js +4 -0
  47. package/dist/kernel/env-names.js.map +1 -1
  48. package/dist/kernel/propagation.d.ts +5 -1
  49. package/dist/kernel/propagation.d.ts.map +1 -1
  50. package/dist/kernel/propagation.js +8 -2
  51. package/dist/kernel/propagation.js.map +1 -1
  52. package/dist/products/dashboard-cli.d.ts +6 -0
  53. package/dist/products/dashboard-cli.d.ts.map +1 -1
  54. package/dist/products/dashboard-cli.js +249 -52
  55. package/dist/products/dashboard-cli.js.map +1 -1
  56. package/dist/products/dashboard-display-controls.d.ts +2 -1
  57. package/dist/products/dashboard-display-controls.d.ts.map +1 -1
  58. package/dist/products/dashboard-display-controls.js +61 -0
  59. package/dist/products/dashboard-display-controls.js.map +1 -1
  60. package/dist/products/dashboard-render.d.ts +2 -0
  61. package/dist/products/dashboard-render.d.ts.map +1 -1
  62. package/dist/products/dashboard-render.js +2 -2
  63. package/dist/products/dashboard-render.js.map +1 -1
  64. package/dist/products/dashboard-screen.d.ts +52 -0
  65. package/dist/products/dashboard-screen.d.ts.map +1 -0
  66. package/dist/products/dashboard-screen.js +262 -0
  67. package/dist/products/dashboard-screen.js.map +1 -0
  68. package/dist/products/dashboard-session-client.d.ts +34 -2
  69. package/dist/products/dashboard-session-client.d.ts.map +1 -1
  70. package/dist/products/dashboard-session-client.js +51 -0
  71. package/dist/products/dashboard-session-client.js.map +1 -1
  72. package/dist/products/ecosystem-versions.d.ts +19 -0
  73. package/dist/products/ecosystem-versions.d.ts.map +1 -0
  74. package/dist/products/ecosystem-versions.js +2 -0
  75. package/dist/products/ecosystem-versions.js.map +1 -0
  76. package/extensions/approvals.ts +3 -2
  77. package/extensions/dashboard-session-server.ts +32 -4
  78. package/extensions/delegate-chain.ts +2 -0
  79. package/extensions/delegation-ledger.ts +10 -6
  80. package/extensions/ecosystem-versions.ts +166 -0
  81. package/extensions/grants-command.ts +33 -3
  82. package/extensions/grants.ts +28 -2
  83. package/extensions/reload-environment.ts +16 -1
  84. package/extensions/run-delegation.ts +49 -3
  85. package/extensions/session-auto-mode.ts +132 -0
  86. package/extensions/session.ts +47 -37
  87. package/package.json +2 -2
  88. package/src/governance/approval-prompt.ts +62 -4
  89. package/src/governance/auto-mode-policy.ts +297 -0
  90. package/src/governance/execution-retention.ts +24 -0
  91. package/src/governance/ledger-events.ts +22 -1
  92. package/src/governance/ledger-report.ts +14 -3
  93. package/src/governance/ledger-v3-validation.ts +17 -3
  94. package/src/governance/ledger.ts +1 -0
  95. package/src/kernel/approval.ts +1 -1
  96. package/src/kernel/auto-mode.ts +56 -0
  97. package/src/kernel/delegate-types.ts +2 -0
  98. package/src/kernel/delegate.ts +2 -1
  99. package/src/kernel/env-names.ts +4 -0
  100. package/src/kernel/propagation.ts +11 -2
  101. package/src/products/dashboard-cli.ts +256 -53
  102. package/src/products/dashboard-display-controls.ts +52 -0
  103. package/src/products/dashboard-render.ts +2 -2
  104. package/src/products/dashboard-screen.ts +339 -0
  105. package/src/products/dashboard-session-client.ts +60 -1
  106. package/src/products/ecosystem-versions.ts +18 -0
@@ -0,0 +1,52 @@
1
+ /** Height-bounded, task-first view. Permission state is always supplied by the owner. */
2
+ import type { EcosystemVersionRow } from "./ecosystem-versions.ts";
3
+ import type { DashboardProjection } from "./dashboard-projection.ts";
4
+ import { ActivityTimelineAliases, type ActivityTimeline } from "./activity-timeline.ts";
5
+ import type { DashboardSessionSnapshot } from "./dashboard-session-client.ts";
6
+ export interface DashboardItem {
7
+ key: string;
8
+ label: string;
9
+ status: string;
10
+ elapsed: string;
11
+ details: string[];
12
+ taskKey?: string;
13
+ timelinePath?: string;
14
+ approval?: boolean;
15
+ skills?: boolean;
16
+ agent?: boolean;
17
+ }
18
+ export interface DashboardScreenState {
19
+ view: "main" | "details" | "models" | "help" | "versions" | "version-details";
20
+ versionId?: EcosystemVersionRow["id"];
21
+ versionRows?: EcosystemVersionRow[];
22
+ selectedKey?: string;
23
+ offset: number;
24
+ items: DashboardItem[];
25
+ }
26
+ export declare const dashboardScreenState: () => DashboardScreenState;
27
+ export declare const dashboardText: (value: string) => string;
28
+ export declare function ledgerDashboardItems(projection: DashboardProjection): DashboardItem[];
29
+ export declare function activityDashboardItems(timeline: ActivityTimeline, aliases: ActivityTimelineAliases, now: Date): DashboardItem[];
30
+ export interface DashboardScreenOptions {
31
+ width: number;
32
+ height: number;
33
+ screen: DashboardScreenState;
34
+ items: DashboardItem[];
35
+ session?: DashboardSessionSnapshot;
36
+ history?: boolean;
37
+ filter?: string;
38
+ notice?: string;
39
+ pending?: boolean;
40
+ problem?: string;
41
+ current?: string;
42
+ currentStatus?: string;
43
+ color?: boolean;
44
+ content?: {
45
+ title: string;
46
+ text: string;
47
+ };
48
+ command?: string;
49
+ }
50
+ /** Selection follows stable identity through refresh, never an unrelated task at the old row index. */
51
+ export declare function renderDashboardScreen(options: DashboardScreenOptions): string;
52
+ //# sourceMappingURL=dashboard-screen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard-screen.d.ts","sourceRoot":"","sources":["../../src/products/dashboard-screen.ts"],"names":[],"mappings":"AAAA,yFAAyF;AACzF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,uBAAuB,EAAmB,KAAK,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAEzG,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAE9E,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AACD,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,GAAG,iBAAiB,CAAC;IAC9E,SAAS,CAAC,EAAE,mBAAmB,CAAC,IAAI,CAAC,CAAC;IACtC,WAAW,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,aAAa,EAAE,CAAC;CACxB;AACD,eAAO,MAAM,oBAAoB,QAAO,oBAAgE,CAAC;AACzG,eAAO,MAAM,aAAa,GAAI,OAAO,MAAM,WAIN,CAAC;AA8CtC,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,mBAAmB,GAAG,aAAa,EAAE,CAiBrF;AACD,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,gBAAgB,EAC1B,OAAO,EAAE,uBAAuB,EAChC,GAAG,EAAE,IAAI,GACR,aAAa,EAAE,CAsBjB;AACD,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,oBAAoB,CAAC;IAC7B,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,OAAO,CAAC,EAAE,wBAAwB,CAAC;IACnC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AACD,uGAAuG;AACvG,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,sBAAsB,GAAG,MAAM,CAqM7E"}
@@ -0,0 +1,262 @@
1
+ import { ActivityTimelineAliases, activityTaskKey } from "./activity-timeline.js";
2
+ import { cellWidth, truncate } from "./dashboard-render.js";
3
+ export const dashboardScreenState = () => ({ view: "main", offset: 0, items: [] });
4
+ export const dashboardText = (value) => value
5
+ .replace(/\x1b\][^\x07\x1b]*(?:\x07|\x1b\\)/g, "")
6
+ .replace(/\x1b\[[0-?]*[ -/]*[@-~]/g, "")
7
+ .replace(/[\p{Cc}\p{Cf}]/gu, " ");
8
+ const clean = (value) => dashboardText(value).replace(/\s+/g, " ").trim();
9
+ function wrapped(lines, width) {
10
+ return lines.flatMap((line) => {
11
+ const result = [];
12
+ let row = "";
13
+ for (const character of dashboardText(line)) {
14
+ if (row && cellWidth(row + character) > width) {
15
+ result.push(row);
16
+ row = "";
17
+ }
18
+ row += character;
19
+ }
20
+ result.push(row);
21
+ return result;
22
+ });
23
+ }
24
+ function elapsed(ms) {
25
+ const seconds = Math.max(0, Math.floor(ms / 1000));
26
+ return `${Math.floor(seconds / 60)}:${String(seconds % 60).padStart(2, "0")}`;
27
+ }
28
+ const friendlyStatus = (status) => ({
29
+ active: "Running",
30
+ running: "Running",
31
+ starting: "Starting",
32
+ authorised: "Approved",
33
+ "needs-you": "Needs you",
34
+ completed: "Finished",
35
+ finished: "Finished",
36
+ failed: "Failed",
37
+ refused: "Blocked",
38
+ incomplete: "Incomplete",
39
+ cancelled: "Canceled",
40
+ historical: "Recorded",
41
+ })[status] ?? status;
42
+ const versionStatus = (row) => {
43
+ if (row.state === "reload-required")
44
+ return row.id === "pi" ? "Restart needed" : "Reload needed";
45
+ if (row.state === "not-reported")
46
+ return "Loaded version unknown";
47
+ if (row.state === "multiple")
48
+ return "Multiple sources";
49
+ if (row.state === "current" && row.loadedVersion && row.loadedVersion === row.installedVersion)
50
+ return "Up to date on disk";
51
+ return "Unavailable";
52
+ };
53
+ const attention = (status) => ["failed", "refused", "incomplete"].includes(status);
54
+ const active = (status) => ["active", "running", "starting", "authorised", "needs-you"].includes(status);
55
+ export function ledgerDashboardItems(projection) {
56
+ return projection.nodes.map((node) => ({
57
+ key: node.executionId,
58
+ label: node.agentName || "Governed execution",
59
+ status: node.state,
60
+ elapsed: elapsed(node.durationMs),
61
+ agent: true,
62
+ details: [
63
+ `Execution: ${node.executionId}`,
64
+ `State: ${friendlyStatus(node.state)} (observation, not acceptance)`,
65
+ `Grant: ${node.effectiveGrant.join(", ") || "none"}`,
66
+ ...(node.workspace ? [`Workspace: ${node.workspace.id} (${node.workspace.access})`] : []),
67
+ ...(node.runtime?.herdrPaneId ? [`Pane: ${node.runtime.herdrPaneId}`] : []),
68
+ ...(node.correlation?.phase ? [`Phase: ${node.correlation.phase}`] : []),
69
+ ...(node.executor ? [`Executor: ${node.executor}`] : []),
70
+ ],
71
+ }));
72
+ }
73
+ export function activityDashboardItems(timeline, aliases, now) {
74
+ return timeline.tasks.map((task) => ({
75
+ key: activityTaskKey(task.rootId, task.id),
76
+ taskKey: activityTaskKey(task.rootId, task.id),
77
+ label: `${task.agent || "User turn"} [${aliases.selector(task)}]`,
78
+ status: task.status,
79
+ elapsed: elapsed(Date.parse(task.endedAt ?? now.toISOString()) - Date.parse(task.startedAt)),
80
+ agent: Boolean(task.agent || task.agents.length),
81
+ skills: task.skills.length > 0,
82
+ details: [
83
+ `Task: ${aliases.selector(task)}`,
84
+ `State: ${friendlyStatus(task.status)} (observation, not acceptance)`,
85
+ ...(task.parentTaskId ? [`Parent: ${task.parentTaskId}`] : []),
86
+ ...(task.model ? [`Model: ${task.model}`] : []),
87
+ ...(task.thinking ? [`Thinking: ${task.thinking}`] : []),
88
+ ...task.skills.map((skill) => `Skill ${skill.name}: ${skill.active ? "declared active" : skill.read ? "read" : "available"}${skill.superseded ? ", superseded" : ""}`),
89
+ ...(task.prompt || task.final ? ["p prompt / f final (retained content only)"] : []),
90
+ ],
91
+ }));
92
+ }
93
+ /** Selection follows stable identity through refresh, never an unrelated task at the old row index. */
94
+ export function renderDashboardScreen(options) {
95
+ const width = Math.max(1, Math.floor(options.width)), height = Math.max(1, Math.floor(options.height));
96
+ const { screen, session } = options, pending = session?.pendingApprovals ?? [];
97
+ const approvals = pending.map((approval) => ({
98
+ key: `approval:${approval.id}`,
99
+ label: `${approval.subject} · ${approval.capability.replace(/^tool:/, "")}`,
100
+ status: "needs-you",
101
+ elapsed: "",
102
+ approval: true,
103
+ details: [
104
+ `Approval: ${approval.id}`,
105
+ `Subject: ${approval.subject}`,
106
+ `Capability: ${approval.capability}`,
107
+ "Waiting for Daddy permission in the owner session.",
108
+ "Use the owner's prompt, or a to enable Auto.",
109
+ ],
110
+ }));
111
+ const allItems = [...approvals, ...options.items];
112
+ const items = allItems.filter((item) => options.filter === "agents"
113
+ ? item.agent
114
+ : options.filter === "skills"
115
+ ? item.skills
116
+ : options.filter === "needs-you"
117
+ ? item.status === "needs-you"
118
+ : true);
119
+ const live = items.filter((item) => active(item.status)), needsAttention = items.filter((item) => attention(item.status)), past = items.filter((item) => !active(item.status) && !attention(item.status)).reverse();
120
+ screen.items = [...live, ...needsAttention, ...(options.history ? past : [])];
121
+ if (screen.view === "details" && !screen.items.some((item) => item.key === screen.selectedKey)) {
122
+ const detail = items.find((item) => item.key === screen.selectedKey);
123
+ if (detail)
124
+ screen.items.push(detail);
125
+ }
126
+ if (!screen.items.some((item) => item.key === screen.selectedKey))
127
+ screen.selectedKey = screen.items[0]?.key;
128
+ const selectedIndex = screen.items.findIndex((item) => item.key === screen.selectedKey), selected = screen.items[selectedIndex];
129
+ screen.versionRows = session?.versions?.rows ?? [];
130
+ if (!screen.versionRows.some((row) => row.id === screen.versionId))
131
+ screen.versionId = screen.versionRows[0]?.id;
132
+ const selectedVersion = screen.versionRows.find((row) => row.id === screen.versionId);
133
+ const mode = session ? `Auto ${session.auto.enabled ? "ON" : "OFF"}` : "Auto unavailable";
134
+ const header = `PI DADDY | ${mode}${options.pending ? " …" : session ? " [a]" : ""}`;
135
+ const footer = options.command !== undefined
136
+ ? [`: ${clean(options.command)}`]
137
+ : screen.view === "main" || screen.view === "versions"
138
+ ? ["↑↓ select · Enter details · a Auto", "m models · v versions · Tab filter · ?"]
139
+ : [
140
+ "↑↓ scroll · Esc back · a Auto",
141
+ screen.view === "details" ? "p prompt · f final · : command · ? help" : ": command · ? help",
142
+ ];
143
+ const fixed = [
144
+ header,
145
+ session
146
+ ? `Permissions connected${pending.length ? ` · ${pending.length} needs you` : ""}`
147
+ : "Permission controls disconnected",
148
+ ];
149
+ if (options.notice || options.problem)
150
+ fixed.push(`! ${clean(options.notice || options.problem || "")}`);
151
+ const body = [];
152
+ if (screen.view === "help")
153
+ body.push("DASHBOARD KEYS", "↑/↓ or j/k: select; Enter/d: details", "a: toggle Daddy permission Auto", "m: session models; v: ecosystem versions", "h: show/hide finished history", "Tab: Everything / Agents / Skills / Needs-you", "p/f: selected retained prompt/final", ": opens commands (legacy selectors and m edits)", "Esc: back; q/Ctrl-C: close dashboard", "Auto changes future Daddy permission handling.", "OFF does not cancel already admitted work.", "Auto does not enable JEV or change LoRA consent.", "Finished means observed completion, not acceptance.");
154
+ else if (screen.view === "versions" || screen.view === "version-details") {
155
+ body.push("VERSIONS");
156
+ if (!session?.versions)
157
+ body.push("Owner has not reported versions.");
158
+ else if (screen.view === "versions") {
159
+ body.push("Loaded -> on disk");
160
+ for (const row of screen.versionRows)
161
+ body.push(`${row.id === screen.versionId ? ">" : " "} ${row.label}: ${row.loadedVersion ?? "?"} -> ${row.installedVersion ?? "?"}`, ` ${versionStatus(row)}`);
162
+ if (session.versions.note)
163
+ body.push(session.versions.note);
164
+ }
165
+ else if (selectedVersion) {
166
+ body.push(`${selectedVersion.label}: ${versionStatus(selectedVersion)}`, `Loaded: ${selectedVersion.loadedVersion ?? "not reported"}`, `Installed: ${selectedVersion.installedVersion ?? "unavailable"}`, `Source: ${selectedVersion.source ?? "unavailable"}`, `Path: ${selectedVersion.path ?? "unavailable"}`, "", "MANAGE · run in a terminal", ...selectedVersion.commands);
167
+ if (selectedVersion.note)
168
+ body.push(selectedVersion.note);
169
+ if (session.versions.note)
170
+ body.push(session.versions.note);
171
+ }
172
+ }
173
+ else if (screen.view === "models") {
174
+ body.push("SESSION MODELS");
175
+ if (!session)
176
+ body.push("Connect from /grants dashboard to edit models.");
177
+ for (const row of session?.rows ?? [])
178
+ body.push(`${row.definition}: ${row.model}`, ` ${row.thinking} · ${row.source}`);
179
+ body.push(": m <definition|all> <provider:model> <thinking>");
180
+ }
181
+ else if (screen.view === "details") {
182
+ body.push(selected ? `${selected.label} · ${friendlyStatus(selected.status)}` : "No selected task", ...(selected?.details ?? []));
183
+ if (options.content)
184
+ body.push("", options.content.title, ...options.content.text.split(/\r?\n/));
185
+ }
186
+ else {
187
+ const requestFinished = options.currentStatus && !active(options.currentStatus);
188
+ body.push(options.current
189
+ ? requestFinished
190
+ ? `LATEST REQUEST · ${friendlyStatus(options.currentStatus)}`
191
+ : "CURRENT REQUEST"
192
+ : "CURRENT WORK", clean(options.current ?? live.find((item) => !item.approval)?.label ?? "No active work"), "");
193
+ const rows = [];
194
+ let group;
195
+ for (const item of screen.items) {
196
+ const next = item.approval
197
+ ? "NEEDS YOU"
198
+ : attention(item.status)
199
+ ? "NEEDS ATTENTION"
200
+ : active(item.status)
201
+ ? `WORK IN PROGRESS · ${live.filter((value) => !value.approval).length} active`
202
+ : "HISTORY";
203
+ if (next !== group) {
204
+ rows.push({ text: next });
205
+ group = next;
206
+ }
207
+ const tail = `${friendlyStatus(item.status)} ${item.elapsed}`.trim(), labelWidth = Math.max(1, width - tail.length - 4);
208
+ rows.push({
209
+ key: item.key,
210
+ text: `${item.key === screen.selectedKey ? ">" : " "} ${truncate(clean(item.label), labelWidth)} ${tail}`,
211
+ });
212
+ }
213
+ const hidden = !options.history ? past.length : 0;
214
+ const history = hidden ? `${hidden} finished · h shows history` : options.history ? "h hides history" : "";
215
+ const available = Math.max(0, height - fixed.length - footer.length - body.length - (history ? 1 : 0));
216
+ const rowIndex = rows.findIndex((row) => row.key === selected?.key);
217
+ const start = Math.max(0, rowIndex - available + 1);
218
+ body.push(...rows.slice(start, start + available).map((row) => row.text));
219
+ if (!rows.length)
220
+ body.push(options.filter && options.filter !== "everything" ? "No matching active work." : "No work is running.");
221
+ if (history)
222
+ body.push(history);
223
+ }
224
+ const detailBody = screen.view === "main" || screen.view === "versions" ? body : wrapped(body, width);
225
+ const room = Math.max(0, height - fixed.length - footer.length);
226
+ if (screen.view === "versions" && selectedVersion && room > 0) {
227
+ const row = 2 + screen.versionRows.findIndex((value) => value.id === screen.versionId) * 2;
228
+ if (row < screen.offset)
229
+ screen.offset = row;
230
+ else if (row + 1 >= screen.offset + room)
231
+ screen.offset = Math.max(0, row + 2 - room);
232
+ }
233
+ const offset = screen.view === "main" ? 0 : Math.max(0, Math.min(screen.offset, Math.max(0, detailBody.length - room)));
234
+ screen.offset = offset;
235
+ const lines = [...fixed, ...detailBody.slice(offset, offset + room)];
236
+ while (lines.length < height - footer.length)
237
+ lines.push("");
238
+ const output = height < fixed.length + footer.length
239
+ ? fixed.slice(0, height)
240
+ : [...lines.slice(0, Math.max(0, height - footer.length)), ...footer].slice(0, height);
241
+ return output
242
+ .map((line, index) => {
243
+ const safe = truncate(dashboardText(line), width);
244
+ if (!options.color)
245
+ return safe;
246
+ const section = /^(CURRENT REQUEST|LATEST REQUEST|CURRENT WORK|NEEDS YOU|NEEDS ATTENTION|WORK IN PROGRESS|HISTORY|VERSIONS|SESSION MODELS|DASHBOARD KEYS|MANAGE)/.test(safe);
247
+ const code = index === 0
248
+ ? "1;36"
249
+ : safe.startsWith("!")
250
+ ? "33"
251
+ : safe.startsWith(">")
252
+ ? "36"
253
+ : section
254
+ ? "1"
255
+ : index === 1 || index >= height - footer.length
256
+ ? "90"
257
+ : undefined;
258
+ return code ? `\u001b[${code}m${safe}\u001b[0m` : safe;
259
+ })
260
+ .join("\n");
261
+ }
262
+ //# sourceMappingURL=dashboard-screen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard-screen.js","sourceRoot":"","sources":["../../src/products/dashboard-screen.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import type { EcosystemVersions } from "./ecosystem-versions.ts";
1
2
  export interface DashboardSessionSnapshot {
2
3
  rows: Array<{
3
4
  definition: string;
@@ -6,11 +7,42 @@ export interface DashboardSessionSnapshot {
6
7
  source: string;
7
8
  }>;
8
9
  cost: number | null;
10
+ activity?: {
11
+ rootId: string;
12
+ path: string;
13
+ taskId: string;
14
+ };
15
+ versions?: EcosystemVersions;
16
+ auto: {
17
+ enabled: boolean;
18
+ source: "default" | "environment" | "session";
19
+ };
20
+ pendingApprovals: Array<{
21
+ id: string;
22
+ subject: string;
23
+ capability: string;
24
+ }>;
9
25
  }
10
- export declare function dashboardSessionRequest(socketPath: string, token: string, request: {
26
+ export type DashboardSessionAction = {
11
27
  action: "get";
12
28
  } | {
13
29
  action: "set";
14
30
  edits: string;
15
- }): Promise<DashboardSessionSnapshot>;
31
+ } | {
32
+ action: "set-auto";
33
+ enabled: boolean;
34
+ };
35
+ export declare function dashboardSessionRequest(socketPath: string, token: string, request: DashboardSessionAction): Promise<DashboardSessionSnapshot>;
36
+ /** A slow status poll cannot overwrite a newer acknowledged mutation. Failed requests expose no guessed mode. */
37
+ export declare function createDashboardConnection(request?: (action: DashboardSessionAction) => Promise<DashboardSessionSnapshot>): {
38
+ state: {
39
+ snapshot?: DashboardSessionSnapshot;
40
+ pending: boolean;
41
+ error?: string;
42
+ };
43
+ refresh(): Promise<void>;
44
+ change(action: Exclude<DashboardSessionAction, {
45
+ action: "get";
46
+ }>): Promise<boolean>;
47
+ };
16
48
  //# sourceMappingURL=dashboard-session-client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"dashboard-session-client.d.ts","sourceRoot":"","sources":["../../src/products/dashboard-session-client.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,KAAK,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrF,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAED,wBAAsB,uBAAuB,CAC3C,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE;IAAE,MAAM,EAAE,KAAK,CAAA;CAAE,GAAG;IAAE,MAAM,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC5D,OAAO,CAAC,wBAAwB,CAAC,CAsBnC"}
1
+ {"version":3,"file":"dashboard-session-client.d.ts","sourceRoot":"","sources":["../../src/products/dashboard-session-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAGjE,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,KAAK,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrF,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,QAAQ,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5D,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B,IAAI,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,SAAS,GAAG,aAAa,GAAG,SAAS,CAAA;KAAE,CAAC;IAC1E,gBAAgB,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC9E;AAED,MAAM,MAAM,sBAAsB,GAChC;IAAE,MAAM,EAAE,KAAK,CAAA;CAAE,GAAG;IAAE,MAAM,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC;AAElG,wBAAsB,uBAAuB,CAC3C,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,wBAAwB,CAAC,CA8BnC;AAED,iHAAiH;AACjH,wBAAgB,yBAAyB,CACvC,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,sBAAsB,KAAK,OAAO,CAAC,wBAAwB,CAAC;;mBAErD,wBAAwB;iBAAW,OAAO;gBAAU,MAAM;;;mBAoB7D,OAAO,CAAC,sBAAsB,EAAE;QAAE,MAAM,EAAE,KAAK,CAAA;KAAE,CAAC;EAiB1E"}
@@ -16,6 +16,12 @@ export async function dashboardSessionRequest(socketPath, token, request) {
16
16
  const parsed = JSON.parse(output);
17
17
  if (!parsed.ok)
18
18
  throw new Error(parsed.error ?? "dashboard session request failed");
19
+ if (!parsed.auto ||
20
+ typeof parsed.auto.enabled !== "boolean" ||
21
+ !["default", "environment", "session"].includes(parsed.auto.source) ||
22
+ !Array.isArray(parsed.pendingApprovals) ||
23
+ !Array.isArray(parsed.rows))
24
+ throw new Error("dashboard owner does not provide compatible permission controls");
19
25
  resolve(parsed);
20
26
  }
21
27
  catch (error) {
@@ -25,4 +31,49 @@ export async function dashboardSessionRequest(socketPath, token, request) {
25
31
  socket.once("connect", () => socket.write(`${JSON.stringify({ ...request, token })}\n`));
26
32
  });
27
33
  }
34
+ /** A slow status poll cannot overwrite a newer acknowledged mutation. Failed requests expose no guessed mode. */
35
+ export function createDashboardConnection(request) {
36
+ const state = { pending: false };
37
+ let generation = 0;
38
+ return {
39
+ state,
40
+ async refresh() {
41
+ if (!request || state.pending)
42
+ return;
43
+ const observed = generation;
44
+ try {
45
+ const snapshot = await request({ action: "get" });
46
+ if (generation === observed) {
47
+ state.snapshot = snapshot;
48
+ state.error = undefined;
49
+ }
50
+ }
51
+ catch (error) {
52
+ if (generation === observed) {
53
+ state.snapshot = undefined;
54
+ state.error = `Controls unavailable: ${error instanceof Error ? error.message : String(error)}`;
55
+ }
56
+ }
57
+ },
58
+ async change(action) {
59
+ if (!request || !state.snapshot || state.pending)
60
+ return false;
61
+ generation++;
62
+ state.pending = true;
63
+ try {
64
+ state.snapshot = await request(action);
65
+ state.error = undefined;
66
+ return true;
67
+ }
68
+ catch (error) {
69
+ state.snapshot = undefined;
70
+ state.error = `Control change not confirmed: ${error instanceof Error ? error.message : String(error)}`;
71
+ return false;
72
+ }
73
+ finally {
74
+ state.pending = false;
75
+ }
76
+ },
77
+ };
78
+ }
28
79
  //# sourceMappingURL=dashboard-session-client.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"dashboard-session-client.js","sourceRoot":"","sources":["../../src/products/dashboard-session-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAO5C,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,UAAkB,EAClB,KAAa,EACb,OAA6D;IAE7D,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,MAAM,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;QAC5C,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAC3B,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC,CAAC,CAAC;QACjG,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC7B,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YAC1B,MAAM,IAAI,KAAK,CAAC;YAChB,IAAI,MAAM,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI;gBAAE,MAAM,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC,CAAC;QACnG,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE;YACtB,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAgE,CAAC;gBACjG,IAAI,CAAC,MAAM,CAAC,EAAE;oBAAE,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,kCAAkC,CAAC,CAAC;gBACpF,OAAO,CAAC,MAAM,CAAC,CAAC;YAClB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,KAAK,CAAC,CAAC;YAChB,CAAC;QACH,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3F,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"dashboard-session-client.js","sourceRoot":"","sources":["../../src/products/dashboard-session-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /** Operator version inventory. These observations do not qualify runtime compatibility. */
2
+ export type EcosystemPackageId = "pi" | "pi-daddy" | "principal-pi-skills" | "skill-harness";
3
+ export interface EcosystemVersionRow {
4
+ id: EcosystemPackageId;
5
+ label: string;
6
+ loadedVersion: string | null;
7
+ installedVersion: string | null;
8
+ source: string | null;
9
+ path: string | null;
10
+ state: "current" | "reload-required" | "not-reported" | "unavailable" | "multiple";
11
+ commands: string[];
12
+ note?: string;
13
+ }
14
+ export interface EcosystemVersions {
15
+ rows: EcosystemVersionRow[];
16
+ checkedAt: string;
17
+ note?: string;
18
+ }
19
+ //# sourceMappingURL=ecosystem-versions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ecosystem-versions.d.ts","sourceRoot":"","sources":["../../src/products/ecosystem-versions.ts"],"names":[],"mappings":"AAAA,2FAA2F;AAC3F,MAAM,MAAM,kBAAkB,GAAG,IAAI,GAAG,UAAU,GAAG,qBAAqB,GAAG,eAAe,CAAC;AAC7F,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,kBAAkB,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,KAAK,EAAE,SAAS,GAAG,iBAAiB,GAAG,cAAc,GAAG,aAAa,GAAG,UAAU,CAAC;IACnF,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AACD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,mBAAmB,EAAE,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ecosystem-versions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ecosystem-versions.js","sourceRoot":"","sources":["../../src/products/ecosystem-versions.ts"],"names":[],"mappings":""}
@@ -236,6 +236,7 @@ export async function obtainApprovals(
236
236
  hasUI: ctx.hasUI,
237
237
  mode: ctx.mode,
238
238
  timeoutMs: () => timeoutMsFromEnv(process.env[ENV_APPROVAL_TIMEOUT]),
239
+ autoMode: session.autoMode,
239
240
  });
240
241
 
241
242
  const approved = [...pre.approved];
@@ -286,7 +287,7 @@ export async function obtainApprovals(
286
287
  // concurrent children under one *Allow for this session* used to write eight lines each claiming a
287
288
  // prompt. Same repair as R-46, one level up: stop asserting a human was asked on a path where they
288
289
  // were not.
289
- sources[capability] = outcome.joined ? "session" : "prompt";
290
+ sources[capability] = outcome.source === "auto" ? "auto" : outcome.joined ? "session" : "prompt";
290
291
  scopes[capability] = outcome.scope;
291
292
  recordedScopes[capability] = outcome.scope;
292
293
  if (expectedBinding) bindings[capability] = expectedBinding;
@@ -359,7 +360,7 @@ export async function obtainApprovals(
359
360
  delete expiresAt[capability];
360
361
  }
361
362
  }
362
- session.publishChildEnv(); // a new session approval widens what children may inherit — republish now
363
+ if (outcome.source !== "auto") session.publishChildEnv(); // Auto never publishes reusable authority.
363
364
  }
364
365
 
365
366
  return {
@@ -4,6 +4,7 @@ import { createServer, type Server } from "node:net";
4
4
  import { tmpdir } from "node:os";
5
5
  import { join } from "node:path";
6
6
  import type { GrantsSession } from "./session.ts";
7
+ import { getDashboardControlState, setAutoApproval } from "./session-auto-mode.ts";
7
8
  import { saveSessionModelEdits, sessionModelRows } from "./session-model-prompt.ts";
8
9
 
9
10
  export interface DashboardSessionEndpoint {
@@ -26,12 +27,20 @@ async function start(session: GrantsSession): Promise<DashboardSessionEndpoint>
26
27
  const socketPath = join(tmpdir(), `pi-daddy-${process.pid}-${randomBytes(8).toString("hex")}.sock`);
27
28
  const token = randomBytes(24).toString("hex");
28
29
  const server = createServer((socket) => {
29
- let input = "";
30
+ let input = "",
31
+ handled = false;
30
32
  socket.setEncoding("utf8");
33
+ socket.setTimeout(2_000, () => socket.destroy());
34
+ socket.on("error", () => socket.destroy());
31
35
  socket.on("data", (chunk) => {
36
+ if (handled) return;
32
37
  input += chunk;
33
- if (input.length > 16 * 1024) socket.destroy(new Error("dashboard request too large"));
38
+ if (input.length > 16 * 1024) {
39
+ socket.destroy();
40
+ return;
41
+ }
34
42
  if (!input.includes("\n")) return;
43
+ handled = true;
35
44
  const line = input.slice(0, input.indexOf("\n"));
36
45
  void respond(session, token, line)
37
46
  .then((value) => socket.end(`${JSON.stringify(value)}\n`))
@@ -60,9 +69,13 @@ async function start(session: GrantsSession): Promise<DashboardSessionEndpoint>
60
69
  }
61
70
 
62
71
  async function respond(session: GrantsSession, token: string, line: string): Promise<Record<string, unknown>> {
63
- const request = JSON.parse(line) as { token?: unknown; action?: unknown; edits?: unknown };
72
+ const request = JSON.parse(line) as { token?: unknown; action?: unknown; edits?: unknown; enabled?: unknown };
64
73
  if (request.token !== token) return { ok: false, error: "unauthorised dashboard request" };
65
- if (request.action === "set") {
74
+ if (request.action === "set-auto") {
75
+ if (typeof request.enabled !== "boolean") return { ok: false, error: "Auto mode requires an explicit boolean" };
76
+ await setAutoApproval(session, request.enabled, "dashboard");
77
+ } else if (request.action === "set") {
78
+ await getDashboardControlState(session);
66
79
  if (typeof request.edits !== "string") return { ok: false, error: "dashboard edits must be a string" };
67
80
  const invalid = await saveSessionModelEdits(
68
81
  session,
@@ -74,11 +87,26 @@ async function respond(session: GrantsSession, token: string, line: string): Pro
74
87
  } else if (request.action !== "get") return { ok: false, error: "unknown dashboard action" };
75
88
  return {
76
89
  ok: true,
90
+ ...(await getDashboardControlState(session)),
91
+ ...(session.activity ? { activity: { ...session.activity } } : {}),
77
92
  rows: sessionModelRows(session, [...session.definitions.keys()].sort()),
93
+ versions: versionSnapshot(session),
78
94
  cost: null, // Live complete episode cost is unavailable; retained usage remains in the episode report.
79
95
  };
80
96
  }
81
97
 
98
+ function versionSnapshot(session: GrantsSession) {
99
+ try {
100
+ return session.ecosystemVersions?.();
101
+ } catch {
102
+ return {
103
+ rows: [],
104
+ checkedAt: new Date().toISOString(),
105
+ note: "Version inventory unavailable; permission controls remain connected.",
106
+ };
107
+ }
108
+ }
109
+
82
110
  function close(server: Server, socketPath: string): void {
83
111
  server.close();
84
112
  void rm(socketPath, { force: true });
@@ -217,6 +217,8 @@ export function registerChainTool(pi: ExtensionAPI, session: GrantsSession): voi
217
217
  declined = { request, outcome };
218
218
  break;
219
219
  }
220
+ // Auto is provisional and belongs to an actual step admission, never the upfront union.
221
+ if (outcome.sources[request.capability] === "auto") continue;
220
222
  preApproved.push({
221
223
  capability: request.capability,
222
224
  subject: request.subject,