@knpkv/herdr-approvals 0.2.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.
Files changed (133) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +22 -0
  3. package/dist/activity-history.d.ts +36 -0
  4. package/dist/activity-history.d.ts.map +1 -0
  5. package/dist/activity-history.js +233 -0
  6. package/dist/activity-history.js.map +1 -0
  7. package/dist/approval-app-view.d.ts +26 -0
  8. package/dist/approval-app-view.d.ts.map +1 -0
  9. package/dist/approval-app-view.js +79 -0
  10. package/dist/approval-app-view.js.map +1 -0
  11. package/dist/approval-client.d.ts +2 -0
  12. package/dist/approval-client.d.ts.map +1 -0
  13. package/dist/approval-client.js +520 -0
  14. package/dist/approval-client.js.map +1 -0
  15. package/dist/approval-sw.js +28 -0
  16. package/dist/approval-sw.js.map +7 -0
  17. package/dist/approval-url.d.ts +37 -0
  18. package/dist/approval-url.d.ts.map +1 -0
  19. package/dist/approval-url.js +37 -0
  20. package/dist/approval-url.js.map +1 -0
  21. package/dist/approval.js +188 -0
  22. package/dist/approval.js.map +7 -0
  23. package/dist/auth.d.ts +10 -0
  24. package/dist/auth.d.ts.map +1 -0
  25. package/dist/auth.js +14 -0
  26. package/dist/auth.js.map +1 -0
  27. package/dist/bin.d.ts +3 -0
  28. package/dist/bin.d.ts.map +1 -0
  29. package/dist/bin.js +47 -0
  30. package/dist/bin.js.map +1 -0
  31. package/dist/connect-entry.d.ts +2 -0
  32. package/dist/connect-entry.d.ts.map +1 -0
  33. package/dist/connect-entry.js +2 -0
  34. package/dist/connect-entry.js.map +1 -0
  35. package/dist/connect.js +188 -0
  36. package/dist/connect.js.map +7 -0
  37. package/dist/dashboard-model.d.ts +719 -0
  38. package/dist/dashboard-model.d.ts.map +1 -0
  39. package/dist/dashboard-model.js +83 -0
  40. package/dist/dashboard-model.js.map +1 -0
  41. package/dist/dashboard-view.d.ts +42 -0
  42. package/dist/dashboard-view.d.ts.map +1 -0
  43. package/dist/dashboard-view.js +194 -0
  44. package/dist/dashboard-view.js.map +1 -0
  45. package/dist/errors.d.ts +33 -0
  46. package/dist/errors.d.ts.map +1 -0
  47. package/dist/errors.js +12 -0
  48. package/dist/errors.js.map +1 -0
  49. package/dist/fleetctl-submission.d.ts +68 -0
  50. package/dist/fleetctl-submission.d.ts.map +1 -0
  51. package/dist/fleetctl-submission.js +31 -0
  52. package/dist/fleetctl-submission.js.map +1 -0
  53. package/dist/fleetctl.d.ts +22 -0
  54. package/dist/fleetctl.d.ts.map +1 -0
  55. package/dist/fleetctl.js +264 -0
  56. package/dist/fleetctl.js.map +1 -0
  57. package/dist/geist-latin-wght-normal.woff2 +0 -0
  58. package/dist/geist-mono-latin-wght-normal.woff2 +0 -0
  59. package/dist/http.d.ts +1512 -0
  60. package/dist/http.d.ts.map +1 -0
  61. package/dist/http.js +1653 -0
  62. package/dist/http.js.map +1 -0
  63. package/dist/index.css +2 -0
  64. package/dist/index.css.map +7 -0
  65. package/dist/index.d.ts +12 -0
  66. package/dist/index.d.ts.map +1 -0
  67. package/dist/index.js +12 -0
  68. package/dist/index.js.map +1 -0
  69. package/dist/internal/config-path.d.ts +3 -0
  70. package/dist/internal/config-path.d.ts.map +1 -0
  71. package/dist/internal/config-path.js +3 -0
  72. package/dist/internal/config-path.js.map +1 -0
  73. package/dist/internal/dashboard-pending-state.d.ts +49 -0
  74. package/dist/internal/dashboard-pending-state.d.ts.map +1 -0
  75. package/dist/internal/dashboard-pending-state.js +98 -0
  76. package/dist/internal/dashboard-pending-state.js.map +1 -0
  77. package/dist/internal/fleet-follow.d.ts +54 -0
  78. package/dist/internal/fleet-follow.d.ts.map +1 -0
  79. package/dist/internal/fleet-follow.js +10 -0
  80. package/dist/internal/fleet-follow.js.map +1 -0
  81. package/dist/internal/fleet-request.d.ts +4 -0
  82. package/dist/internal/fleet-request.d.ts.map +1 -0
  83. package/dist/internal/fleet-request.js +11 -0
  84. package/dist/internal/fleet-request.js.map +1 -0
  85. package/dist/internal/html.d.ts +3 -0
  86. package/dist/internal/html.d.ts.map +1 -0
  87. package/dist/internal/html.js +8 -0
  88. package/dist/internal/html.js.map +1 -0
  89. package/dist/internal/websocket.d.ts +4 -0
  90. package/dist/internal/websocket.d.ts.map +1 -0
  91. package/dist/internal/websocket.js +12 -0
  92. package/dist/internal/websocket.js.map +1 -0
  93. package/dist/model.d.ts +40 -0
  94. package/dist/model.d.ts.map +1 -0
  95. package/dist/model.js +53 -0
  96. package/dist/model.js.map +1 -0
  97. package/dist/operations.d.ts +72 -0
  98. package/dist/operations.d.ts.map +1 -0
  99. package/dist/operations.js +284 -0
  100. package/dist/operations.js.map +1 -0
  101. package/dist/push-policy.d.ts +3 -0
  102. package/dist/push-policy.d.ts.map +1 -0
  103. package/dist/push-policy.js +3 -0
  104. package/dist/push-policy.js.map +1 -0
  105. package/dist/push-sender.d.ts +18 -0
  106. package/dist/push-sender.d.ts.map +1 -0
  107. package/dist/push-sender.js +33 -0
  108. package/dist/push-sender.js.map +1 -0
  109. package/dist/push-subscription.d.ts +17 -0
  110. package/dist/push-subscription.d.ts.map +1 -0
  111. package/dist/push-subscription.js +62 -0
  112. package/dist/push-subscription.js.map +1 -0
  113. package/dist/push-worker.d.ts +20 -0
  114. package/dist/push-worker.d.ts.map +1 -0
  115. package/dist/push-worker.js +32 -0
  116. package/dist/push-worker.js.map +1 -0
  117. package/dist/pwa.d.ts +39 -0
  118. package/dist/pwa.d.ts.map +1 -0
  119. package/dist/pwa.js +51 -0
  120. package/dist/pwa.js.map +1 -0
  121. package/dist/shell-view.d.ts +20 -0
  122. package/dist/shell-view.d.ts.map +1 -0
  123. package/dist/shell-view.js +86 -0
  124. package/dist/shell-view.js.map +1 -0
  125. package/dist/store.d.ts +46 -0
  126. package/dist/store.d.ts.map +1 -0
  127. package/dist/store.js +291 -0
  128. package/dist/store.js.map +1 -0
  129. package/dist/work-checkpoint.d.ts +107 -0
  130. package/dist/work-checkpoint.d.ts.map +1 -0
  131. package/dist/work-checkpoint.js +37 -0
  132. package/dist/work-checkpoint.js.map +1 -0
  133. package/package.json +90 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 knpkv
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,22 @@
1
+ # `@knpkv/herdr-approvals`
2
+
3
+ Host runtime, fleet CLI, approval PWA, push worker, and shared Rly shell for the Herdr packages.
4
+
5
+ It publishes two binaries:
6
+
7
+ - `hostd`: local fleet authority plus optional Tailscale listeners, approvals, Connect, chat, and push
8
+ - `fleetctl`: status, history, job submission/following, Work checkpoint recording/snapshots, and fleet-wide apply submission with per-host outcomes
9
+
10
+ `hostd` reads `FLEET_CONFIG_PATH`, defaulting to `~/.config/fleet/config.json`. The file is decoded by `@knpkv/herdr-fleet`; invalid or missing fields fail startup. With `crossHost: false`, only the loopback listener and immediately queued safe jobs are available, with no Tailscale dependency. Cross-host listeners authenticate the actual socket peer with Tailscale WhoIs. Forwarded identity headers are never trusted.
11
+
12
+ On the approval hub, `approvalTls` names absolute certificate and private-key paths owned by the hostd user. The hub terminates TLS directly on its configured Tailscale IP and `approvalPort`; certificate provisioning and renewal remain host policy. Non-hub tailnet members keep their plain tailnet listeners. Local-only machines do not read TLS material or invoke Tailscale.
13
+
14
+ Fleet-wide submission preserves partial results. One unreachable host does not erase successful submissions to other hosts, but the command exits with a typed failure after printing all outcomes. The runtime performs no Tailscale mutation; Nix remains responsible for certificates, ACLs, node enrollment, secrets, and service lifecycle.
15
+
16
+ Approval mutations require the exact active listener origin, including HTML form submissions. Originless fleet submission remains a separate authenticated CLI path. Existing browser push subscriptions are reconciled with the server on page load, so server-side expiry or revocation cannot leave a false enabled state.
17
+
18
+ `pushAllowedOrigins` is the exact HTTPS-origin allowlist for browser push services. Subscription endpoints are checked before persistence and again before delivery; credentials, IP literals, localhost, and origins outside that list are rejected. Add self-hosted push services explicitly by their public origin.
19
+
20
+ The approval hub renders one masthead and three tabs. Approvals contains only local decisions and remote approval handoffs. Connect embeds the package terminal and authoritative relationship tree, with coordinator chat below it. Work renders the durable `@knpkv/herdr-work` projection. The built PWA assets keep offline installation, push subscription management, notification click routing, and the same authenticated browser routes.
21
+
22
+ `fleetctl work record HOST CHECKPOINT_JSON` decodes one `WorkGoalCheckpoint` locally, then posts it to the target host's loopback listener at `POST /v1/work/checkpoints`. `fleetctl work snapshot [HOST]` reads the four typed projections from the local `GET /v1/work` listener. The canonical hub also serves that read-only snapshot to the authenticated Work UI. Checkpoint writes reject browser-origin requests and accept no job, command, file, or partial-goal shape. Replaying the exact checkpoint is idempotent; changed content with the same event ID or goal timestamp returns `WorkCheckpointConflictError`.
@@ -0,0 +1,36 @@
1
+ import { type JobRecord, type JobStatus } from "@knpkv/herdr-fleet/model";
2
+ import { type ReactElement } from "react";
3
+ export type ActivityFilter = "all" | "exceptions" | "work" | "approvals" | "deployments" | "human" | "agent";
4
+ export type ActivityItem = {
5
+ readonly actor: string;
6
+ readonly categories: ReadonlyArray<Exclude<ActivityFilter, "all">>;
7
+ readonly connectHref: string | null;
8
+ readonly connectLabel: string | null;
9
+ readonly dateKey: string;
10
+ readonly dateLabel: string;
11
+ readonly details: ReadonlyArray<string>;
12
+ readonly id: string;
13
+ readonly searchText: string;
14
+ readonly status: JobStatus;
15
+ readonly summary: string;
16
+ readonly time: string;
17
+ readonly timestamp: number;
18
+ readonly title: string;
19
+ };
20
+ export declare const statusLabel: (status: JobStatus) => string;
21
+ export declare const statusTone: (status: JobStatus) => "neutral" | "positive" | "critical" | "caution" | "progress";
22
+ export declare const jobTitle: (record: Pick<JobRecord, "payload">) => string;
23
+ export declare const activityItemsFor: (records: ReadonlyArray<JobRecord>) => ReadonlyArray<ActivityItem>;
24
+ export declare const filterActivityItems: (items: ReadonlyArray<ActivityItem>, filter: ActivityFilter, query: string) => ReadonlyArray<ActivityItem>;
25
+ export declare const activityNavigationIndex: ({ current, key, total }: {
26
+ readonly current: number;
27
+ readonly key: string;
28
+ readonly total: number;
29
+ }) => number | null;
30
+ export declare const ActivityHistory: ({ hasMore, loading, onLoadMore, records }: {
31
+ readonly hasMore?: boolean;
32
+ readonly loading?: boolean;
33
+ readonly onLoadMore?: () => void;
34
+ readonly records: ReadonlyArray<JobRecord>;
35
+ }) => ReactElement;
36
+ //# sourceMappingURL=activity-history.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activity-history.d.ts","sourceRoot":"","sources":["../src/activity-history.tsx"],"names":[],"mappings":"AACA,OAAO,EAAoB,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,0BAA0B,CAAA;AAE3F,OAAO,EAAyC,KAAK,YAAY,EAAE,MAAM,OAAO,CAAA;AAEhF,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,YAAY,GAAG,MAAM,GAAG,WAAW,GAAG,aAAa,GAAG,OAAO,GAAG,OAAO,CAAA;AAE5G,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC,OAAO,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC,CAAA;IAClE,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IACnC,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;IACpC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;IACvC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAA;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CACvB,CAAA;AAmBD,eAAO,MAAM,WAAW,WAAY,SAAS,KAAG,MAmB/C,CAAA;AAED,eAAO,MAAM,UAAU,WAAY,SAAS,KAAG,SAAS,GAAG,UAAU,GAAG,UAAU,GAAG,SAAS,GAAG,UAgBhG,CAAA;AAED,eAAO,MAAM,QAAQ,WAAY,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,KAAG,MAa7D,CAAA;AAuED,eAAO,MAAM,gBAAgB,YAAa,aAAa,CAAC,SAAS,CAAC,KAAG,aAAa,CAAC,YAAY,CA2BnC,CAAA;AAE5D,eAAO,MAAM,mBAAmB,UACvB,aAAa,CAAC,YAAY,CAAC,UAC1B,cAAc,SACf,MAAM,KACZ,aAAa,CAAC,YAAY,CAO5B,CAAA;AAED,eAAO,MAAM,uBAAuB,4BAIjC;IACD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CACvB,KAAG,MAAM,GAAG,IAOZ,CAAA;AAyDD,eAAO,MAAM,eAAe,8CAKzB;IACD,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAA;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAA;IAC1B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,IAAI,CAAA;IAChC,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,SAAS,CAAC,CAAA;CAC3C,KAAG,YAmIH,CAAA"}
@@ -0,0 +1,233 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Button, StateLabel, Surface, Text } from "@knpkv/rly/primitives";
3
+ import { requiresApproval } from "@knpkv/herdr-fleet/model";
4
+ import { Predicate } from "effect";
5
+ import { useMemo, useState } from "react";
6
+ const filterOptions = [
7
+ { label: "All", value: "all" },
8
+ { label: "Exceptions", value: "exceptions" },
9
+ { label: "Work", value: "work" },
10
+ { label: "Approvals", value: "approvals" },
11
+ { label: "Deployments", value: "deployments" },
12
+ { label: "Human", value: "human" },
13
+ { label: "Agent", value: "agent" }
14
+ ];
15
+ const pageSize = 24;
16
+ export const statusLabel = (status) => {
17
+ switch (status) {
18
+ case "pending_approval":
19
+ return "Waiting";
20
+ case "queued":
21
+ return "Queued";
22
+ case "running":
23
+ return "Running";
24
+ case "succeeded":
25
+ return "Completed";
26
+ case "failed":
27
+ return "Failed";
28
+ case "interrupted":
29
+ return "Interrupted";
30
+ case "rejected":
31
+ return "Rejected";
32
+ case "expired":
33
+ return "Expired";
34
+ }
35
+ };
36
+ export const statusTone = (status) => {
37
+ switch (status) {
38
+ case "succeeded":
39
+ return "positive";
40
+ case "failed":
41
+ case "rejected":
42
+ return "critical";
43
+ case "interrupted":
44
+ return "neutral";
45
+ case "pending_approval":
46
+ case "expired":
47
+ return "caution";
48
+ case "queued":
49
+ case "running":
50
+ return "progress";
51
+ }
52
+ };
53
+ export const jobTitle = (record) => {
54
+ switch (record.payload.kind) {
55
+ case "browser.mcp.recover":
56
+ return "Recover browser MCP";
57
+ case "nix.check":
58
+ return "Check Nix configuration";
59
+ case "nix.apply":
60
+ return "Apply Nix configuration";
61
+ case "agent.delegate":
62
+ return record.payload.mode === "consult" ? "Ask the coordinator" : "Delegate agent work";
63
+ case "agent.message":
64
+ return "Message an agent";
65
+ }
66
+ };
67
+ const safeSummary = (record) => {
68
+ switch (record.payload.kind) {
69
+ case "browser.mcp.recover":
70
+ return "Checked the configured Chrome DevTools MCP runtime.";
71
+ case "nix.check":
72
+ return "Validated the repository configuration.";
73
+ case "nix.apply":
74
+ return "Processed a requested configuration deployment.";
75
+ case "agent.delegate":
76
+ return record.worker === undefined
77
+ ? record.payload.mode === "consult"
78
+ ? "Asked the persistent coordinator for an answer."
79
+ : "Assigned typed work through the persistent coordinator."
80
+ : `Started ${record.worker.name} through the persistent coordinator.`;
81
+ case "agent.message":
82
+ return `Sent a typed message to ${record.payload.session}.`;
83
+ }
84
+ };
85
+ const isException = (status) => status === "failed" || status === "interrupted" || status === "rejected" || status === "expired";
86
+ const categoriesFor = (record) => {
87
+ const categories = [];
88
+ if (isException(record.status))
89
+ categories.push("exceptions");
90
+ if (record.payload.kind.startsWith("agent."))
91
+ categories.push("work", "agent");
92
+ if (requiresApproval(record.payload))
93
+ categories.push("approvals");
94
+ if (record.payload.kind === "nix.apply" ||
95
+ record.payload.kind === "nix.check" ||
96
+ record.payload.kind === "browser.mcp.recover") {
97
+ categories.push("deployments");
98
+ }
99
+ if (record.approvedBy !== null || record.rejectedBy !== null)
100
+ categories.push("human");
101
+ return categories;
102
+ };
103
+ const iso = (timestamp) => new Date(timestamp).toISOString();
104
+ const dateKey = (timestamp) => new Intl.DateTimeFormat("en-CA", {
105
+ day: "2-digit",
106
+ month: "2-digit",
107
+ year: "numeric"
108
+ }).format(timestamp);
109
+ const dateLabel = (timestamp) => new Intl.DateTimeFormat("en-GB", {
110
+ dateStyle: "full"
111
+ }).format(timestamp);
112
+ const timeLabel = (timestamp) => new Intl.DateTimeFormat("en-GB", {
113
+ hour: "2-digit",
114
+ minute: "2-digit"
115
+ }).format(timestamp);
116
+ const evidenceFor = (record) => {
117
+ const evidence = [`Status: ${statusLabel(record.status)}`, `Submitted by ${record.actor}`];
118
+ if (record.approvedBy !== null)
119
+ evidence.push(`Approved by ${record.approvedBy}`);
120
+ if (record.rejectedBy !== null)
121
+ evidence.push(`Rejected by ${record.rejectedBy}`);
122
+ if (record.worker !== undefined)
123
+ evidence.push(`Worker: ${record.worker.name} on ${record.worker.host}`);
124
+ if (record.status === "expired")
125
+ evidence.push("The approval window expired before execution.");
126
+ if (record.status === "interrupted")
127
+ evidence.push("The job stopped before a terminal result was recorded.");
128
+ if (record.status === "failed")
129
+ evidence.push("The operation returned a typed failure. Open the agent for details.");
130
+ return evidence;
131
+ };
132
+ export const activityItemsFor = (records) => records
133
+ .map((record) => {
134
+ const categories = categoriesFor(record);
135
+ const title = jobTitle(record);
136
+ const summary = safeSummary(record);
137
+ const workerName = record.worker?.name ?? "";
138
+ const searchable = [title, summary, statusLabel(record.status), record.actor, workerName, ...categories]
139
+ .join(" ")
140
+ .toLocaleLowerCase();
141
+ return {
142
+ actor: record.actor,
143
+ categories,
144
+ connectHref: record.connectTarget?.url ?? null,
145
+ connectLabel: record.worker === undefined ? null : `Open ${record.worker.name} in Connect`,
146
+ dateKey: dateKey(record.updatedAt),
147
+ dateLabel: dateLabel(record.updatedAt),
148
+ details: evidenceFor(record),
149
+ id: record.id,
150
+ searchText: searchable,
151
+ status: record.status,
152
+ summary,
153
+ time: timeLabel(record.updatedAt),
154
+ timestamp: record.updatedAt,
155
+ title
156
+ };
157
+ })
158
+ .sort((left, right) => right.timestamp - left.timestamp);
159
+ export const filterActivityItems = (items, filter, query) => {
160
+ const normalizedQuery = query.trim().toLocaleLowerCase();
161
+ return items.filter((item) => (filter === "all" || item.categories.includes(filter)) &&
162
+ (normalizedQuery === "" || item.searchText.includes(normalizedQuery)));
163
+ };
164
+ export const activityNavigationIndex = ({ current, key, total }) => {
165
+ if (total === 0)
166
+ return null;
167
+ if (key === "Home")
168
+ return 0;
169
+ if (key === "End")
170
+ return total - 1;
171
+ if (key === "j" || key === "ArrowDown")
172
+ return current < 0 ? 0 : Math.min(current + 1, total - 1);
173
+ if (key === "k" || key === "ArrowUp")
174
+ return current < 0 ? total - 1 : Math.max(current - 1, 0);
175
+ return null;
176
+ };
177
+ const ActivityRow = ({ expanded, item, onToggle }) => {
178
+ const detailId = `activity-detail-${item.id}`;
179
+ return (_jsxs("li", { className: "activity-item", children: [_jsxs("button", { "aria-controls": detailId, "aria-expanded": expanded, className: "activity-row", "data-activity-row": "", onClick: onToggle, type: "button", children: [_jsx("time", { dateTime: iso(item.timestamp), children: item.time }), _jsx("span", { className: "activity-status", children: _jsx(StateLabel, { label: statusLabel(item.status), size: "compact", tone: statusTone(item.status) }) }), _jsxs("span", { className: "activity-row-copy", children: [_jsx(Text, { as: "strong", variant: "label", children: item.title }), _jsx(Text, { as: "small", tone: "secondary", variant: "meta", children: item.summary })] }), _jsx(Text, { as: "small", className: "activity-actor", tone: "secondary", variant: "meta", children: item.actor }), _jsx("span", { "aria-hidden": "true", className: "activity-disclosure", children: expanded ? "−" : "+" })] }), expanded ? (_jsxs("div", { className: "activity-detail", id: detailId, role: "region", "aria-label": `${item.title} details`, children: [_jsx("ul", { children: item.details.map((detail) => (_jsx("li", { children: detail }, detail))) }), item.connectHref === null || item.connectLabel === null ? null : (_jsxs("a", { href: item.connectHref, children: [item.connectLabel, " \u2192"] }))] })) : null] }));
180
+ };
181
+ export const ActivityHistory = ({ hasMore = false, loading = false, onLoadMore, records }) => {
182
+ const items = useMemo(() => activityItemsFor(records), [records]);
183
+ const [filter, setFilter] = useState("all");
184
+ const [query, setQuery] = useState("");
185
+ const [visibleCount, setVisibleCount] = useState(pageSize);
186
+ const [expandedId, setExpandedId] = useState(null);
187
+ const filtered = useMemo(() => filterActivityItems(items, filter, query), [filter, items, query]);
188
+ const visible = filtered.slice(0, visibleCount);
189
+ const groups = new Map();
190
+ for (const item of visible) {
191
+ const group = groups.get(item.dateKey);
192
+ if (group === undefined)
193
+ groups.set(item.dateKey, [item]);
194
+ else
195
+ group.push(item);
196
+ }
197
+ const handleKeyboard = (event) => {
198
+ if (Predicate.hasProperty(event.target, "nodeName") &&
199
+ Predicate.isString(event.target.nodeName) &&
200
+ (event.target.nodeName === "INPUT" || event.target.nodeName === "TEXTAREA"))
201
+ return;
202
+ const rows = [...event.currentTarget.querySelectorAll("[data-activity-row]")];
203
+ const current = rows.findIndex((row) => row === document.activeElement);
204
+ const next = activityNavigationIndex({ current, key: event.key, total: rows.length });
205
+ if (next === null)
206
+ return;
207
+ event.preventDefault();
208
+ rows[next]?.focus();
209
+ };
210
+ return (_jsxs(Surface, { as: "section", padding: "spacious", className: "history-panel", onKeyDown: handleKeyboard, children: [_jsxs("div", { className: "section-heading", children: [_jsxs("div", { children: [_jsx(Text, { variant: "meta", tone: "secondary", children: "Durable activity" }), _jsx(Text, { as: "h2", variant: "section-title", children: "Activity history" })] }), _jsxs(Text, { variant: "meta", tone: "secondary", children: [visible.length, " visible \u00B7 ", filtered.length, " matching \u00B7 ", items.length, " jobs"] })] }), _jsxs("div", { className: "activity-toolbar", children: [_jsxs("label", { className: "activity-search", children: [_jsx("span", { children: "Search" }), _jsx("input", { "aria-label": "Search activity", onChange: (event) => setQuery(event.currentTarget.value), onKeyDown: (event) => {
211
+ if (event.key === "Escape") {
212
+ setQuery("");
213
+ event.currentTarget.blur();
214
+ }
215
+ else if (event.key === "ArrowDown") {
216
+ event.preventDefault();
217
+ event.currentTarget.closest("section")?.querySelector("[data-activity-row]")?.focus();
218
+ }
219
+ }, placeholder: "Agent, status, or operation", type: "search", value: query })] }), _jsx("div", { className: "activity-filters", "aria-label": "Filter activity", children: filterOptions.map((option) => (_jsx("button", { "aria-pressed": filter === option.value, onClick: () => {
220
+ setFilter(option.value);
221
+ setVisibleCount(pageSize);
222
+ }, type: "button", children: option.label }, option.value))) })] }), visible.length === 0 ? (_jsxs("div", { className: "activity-empty", children: [_jsx(Text, { as: "strong", variant: "label", children: "No matching activity" }), _jsx(Text, { tone: "secondary", children: "Change the filter or clear the search." })] })) : ([...groups.values()].map((group) => (_jsxs("section", { className: "day-group", children: [_jsx(Text, { as: "h3", variant: "label", tone: "secondary", children: group[0]?.dateLabel ?? "Date unavailable" }), _jsx("ol", { className: "activity-list", children: group.map((item) => (_jsx(ActivityRow, { expanded: expandedId === item.id, item: item, onToggle: () => setExpandedId((current) => (current === item.id ? null : item.id)) }, item.id))) })] }, group[0]?.dateKey ?? "unknown")))), visible.length < filtered.length || hasMore ? (_jsx("div", { className: "activity-load-more", children: _jsx(Button, { disabled: loading, loading: loading, onClick: () => {
223
+ if (visible.length < filtered.length) {
224
+ setVisibleCount((count) => count + pageSize);
225
+ }
226
+ else {
227
+ onLoadMore?.();
228
+ }
229
+ }, type: "button", variant: "quiet", children: visible.length < filtered.length
230
+ ? `Load earlier · ${String(filtered.length - visible.length)} remaining`
231
+ : "Load earlier activity" }) })) : null, _jsxs(Text, { as: "p", className: "activity-keyboard-help", tone: "secondary", variant: "meta", children: [_jsx("kbd", { children: "j" }), "/", _jsx("kbd", { children: "k" }), " move \u00B7 ", _jsx("kbd", { children: "Enter" }), " details \u00B7 ", _jsx("kbd", { children: "Esc" }), " clear search"] })] }));
232
+ };
233
+ //# sourceMappingURL=activity-history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activity-history.js","sourceRoot":"","sources":["../src/activity-history.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { type AgentWorkerIdentity } from "@knpkv/herdr-fleet/model";
2
+ import type { ChatHistory, ChatMode } from "@knpkv/herdr-coordinator/model";
3
+ export type NotificationState = "loading" | "unsupported" | "disabled" | "denied" | "enabled" | "error";
4
+ export interface ChatDraftResult {
5
+ readonly error: string | null;
6
+ readonly message: string;
7
+ }
8
+ export declare const chatModeForShortcut: ({ key, modified, shift }: {
9
+ readonly key: string;
10
+ readonly modified: boolean;
11
+ readonly shift: boolean;
12
+ }) => ChatMode | null;
13
+ export declare const connectWorkerHref: (worker: AgentWorkerIdentity) => string;
14
+ export declare const submitChatDraft: (mode: ChatMode, message: string, submit: (mode: ChatMode, message: string) => Promise<boolean>) => Promise<ChatDraftResult>;
15
+ export declare const CoordinatorChatPanel: ({ busy, history, onSubmit }: {
16
+ readonly busy: boolean;
17
+ readonly history: ChatHistory;
18
+ readonly onSubmit: ((mode: ChatMode, message: string) => Promise<boolean>) | undefined;
19
+ }) => import("react").JSX.Element;
20
+ export declare const NotificationPanel: ({ canonicalUrl, onDisable, onEnable, state }: {
21
+ readonly canonicalUrl: string;
22
+ readonly onDisable: (() => void) | undefined;
23
+ readonly onEnable: (() => void) | undefined;
24
+ readonly state: NotificationState;
25
+ }) => import("react").JSX.Element;
26
+ //# sourceMappingURL=approval-app-view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approval-app-view.d.ts","sourceRoot":"","sources":["../src/approval-app-view.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAsB,KAAK,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AACvF,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAa,MAAM,gCAAgC,CAAA;AAEtF,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,aAAa,GAAG,UAAU,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAA;AAEvG,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CACzB;AAED,eAAO,MAAM,mBAAmB,6BAI7B;IACD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;IAC1B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;CACxB,KAAG,QAAQ,GAAG,IAGd,CAAA;AAED,eAAO,MAAM,iBAAiB,WAAY,mBAAmB,KAAG,MAAwC,CAAA;AAExG,eAAO,MAAM,eAAe,SACpB,QAAQ,WACL,MAAM,UACP,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,KAC5D,OAAO,CAAC,eAAe,CACyF,CAAA;AAgCnH,eAAO,MAAM,oBAAoB,gCAI9B;IACD,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;IACtB,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAA;IAC7B,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,SAAS,CAAA;CACvF,gCAmHA,CAAA;AAED,eAAO,MAAM,iBAAiB,iDAK3B;IACD,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,SAAS,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAA;IAC5C,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAA;IAC3C,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAA;CAClC,gCAmDA,CAAA"}
@@ -0,0 +1,79 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Button, StateLabel, Surface, Text } from "@knpkv/rly/primitives";
3
+ import { useState } from "react";
4
+ import { agentConnectTarget } from "@knpkv/herdr-fleet/model";
5
+ export const chatModeForShortcut = ({ key, modified, shift }) => {
6
+ if (key !== "Enter" || !modified)
7
+ return null;
8
+ return shift ? "work" : "ask";
9
+ };
10
+ export const connectWorkerHref = (worker) => agentConnectTarget(worker).url;
11
+ export const submitChatDraft = async (mode, message, submit) => (await submit(mode, message)) ? { error: null, message: "" } : { error: "Message not sent. Try again.", message };
12
+ const chatTone = (state) => {
13
+ switch (state) {
14
+ case "pending":
15
+ return "neutral";
16
+ case "running":
17
+ return "progress";
18
+ case "failed":
19
+ return "critical";
20
+ case "interrupted":
21
+ return "neutral";
22
+ case "completed":
23
+ return "positive";
24
+ }
25
+ };
26
+ const chatLabel = (state) => {
27
+ switch (state) {
28
+ case "pending":
29
+ return "Pending";
30
+ case "running":
31
+ return "Running";
32
+ case "failed":
33
+ return "Failed";
34
+ case "interrupted":
35
+ return "Interrupted";
36
+ case "completed":
37
+ return "Completed";
38
+ }
39
+ };
40
+ export const CoordinatorChatPanel = ({ busy, history, onSubmit }) => {
41
+ const [message, setMessage] = useState("");
42
+ const [error, setError] = useState(null);
43
+ const sendMessage = async (mode) => {
44
+ if (busy || onSubmit === undefined || message.length === 0)
45
+ return;
46
+ setError(null);
47
+ const result = await submitChatDraft(mode, message, onSubmit);
48
+ setMessage(result.message);
49
+ setError(result.error);
50
+ };
51
+ const submit = (mode) => async (event) => {
52
+ event.preventDefault();
53
+ await sendMessage(mode);
54
+ };
55
+ return (_jsxs(Surface, { as: "section", padding: "spacious", className: "chat-panel", children: [_jsxs("div", { className: "section-heading", children: [_jsxs("div", { children: [_jsx(Text, { variant: "meta", tone: "secondary", children: "KNPKV-SER8" }), _jsx(Text, { as: "h2", variant: "section-title", children: "Coordinator chat" })] }), _jsx(StateLabel, { label: "Persistent", tone: "positive", size: "compact" })] }), _jsxs("div", { className: "chat-history", "aria-live": "polite", children: [history.entries.map((entry) => (_jsxs("article", { className: "chat-turn", children: [_jsxs("div", { className: "chat-turn-heading", children: [_jsxs(Text, { variant: "meta", tone: "secondary", children: ["You \u00B7 ", entry.mode === "ask" ? "Ask" : "Do work"] }), _jsx(StateLabel, { label: chatLabel(entry.state), tone: chatTone(entry.state), size: "compact" })] }), _jsx(Text, { as: "p", children: entry.message }), entry.worker === undefined || entry.connectTarget === undefined ? null : (_jsxs(Text, { as: "p", variant: "meta", tone: "secondary", children: ["Worker", " ", _jsxs("a", { href: entry.connectTarget.url, children: [entry.worker.name, " on ", entry.worker.host] })] })), entry.reply === null ? null : (_jsxs("div", { className: "coordinator-reply", children: [_jsx(Text, { variant: "meta", tone: "secondary", children: "Coordinator" }), _jsx(Text, { as: "p", children: entry.reply })] }))] }, entry.id))), history.entries.length === 0 ? _jsx(Text, { tone: "secondary", children: "No coordinator conversation yet." }) : null] }), _jsxs("form", { className: "chat-compose", onSubmit: submit("ask"), children: [_jsx("label", { htmlFor: "coordinator-message", children: "Message" }), _jsx("textarea", { id: "coordinator-message", maxLength: 2_000, name: "coordinator-message", required: true, rows: 4, value: message, onChange: (event) => setMessage(event.currentTarget.value), onKeyDown: (event) => {
56
+ if (event.key === "Escape") {
57
+ event.currentTarget.blur();
58
+ return;
59
+ }
60
+ const mode = chatModeForShortcut({
61
+ key: event.key,
62
+ modified: event.ctrlKey || event.metaKey,
63
+ shift: event.shiftKey
64
+ });
65
+ if (mode === null)
66
+ return;
67
+ event.preventDefault();
68
+ void sendMessage(mode);
69
+ }, placeholder: "Ask about the fleet or request work" }), _jsxs("div", { className: "chat-actions", children: [_jsx(Button, { type: "submit", variant: "quiet", disabled: busy, children: "Ask" }), _jsx(Button, { type: "button", variant: "primary", loading: busy, onClick: () => {
70
+ void sendMessage("work");
71
+ }, children: "Do work" })] }), _jsxs("div", { className: "keyboard-hints", "aria-label": "Chat keyboard shortcuts", children: [_jsxs("span", { children: [_jsx("kbd", { children: "\u2318/Ctrl" }), " ", _jsx("kbd", { children: "Enter" }), " Ask"] }), _jsxs("span", { children: [_jsx("kbd", { children: "\u2318/Ctrl" }), " ", _jsx("kbd", { children: "Shift" }), " ", _jsx("kbd", { children: "Enter" }), " Do work"] }), _jsxs("span", { children: [_jsx("kbd", { children: "Esc" }), " Leave composer"] })] }), error === null ? null : _jsx("p", { role: "alert", children: error })] })] }));
72
+ };
73
+ export const NotificationPanel = ({ canonicalUrl, onDisable, onEnable, state }) => {
74
+ if (state === "enabled" || state === "loading") {
75
+ return (_jsxs("div", { className: "notification-status", "aria-label": "Approval notifications", children: [_jsx(StateLabel, { label: state === "enabled" ? "Notifications on" : "Checking notifications", tone: state === "enabled" ? "positive" : "neutral", size: "compact" }), state === "enabled" ? (_jsx(Button, { size: "compact", variant: "quiet", onClick: onDisable, children: "Turn off" })) : null] }));
76
+ }
77
+ return (_jsxs("div", { className: "notification-status notification-status-action", "aria-label": "Approval notifications", children: [_jsx(StateLabel, { label: state === "denied" ? "Notifications blocked" : "Notifications off", tone: "neutral", size: "compact" }), state === "unsupported" ? (_jsx(Text, { as: "small", className: "notice", tone: "secondary", variant: "meta", children: "Install this page to the iPhone Home Screen to enable alerts." })) : state === "denied" ? (_jsx(Text, { as: "small", className: "notice", tone: "secondary", variant: "meta", children: "Re-enable in iPhone Settings." })) : state === "error" ? (_jsx(Text, { as: "small", className: "notice", tone: "secondary", variant: "meta", children: "Setup failed. Refresh and retry." })) : null, _jsx(Button, { size: "compact", variant: "quiet", disabled: state === "unsupported", onClick: onEnable, children: "Enable" }), _jsxs("details", { className: "notification-help", children: [_jsx("summary", { children: "Setup help" }), _jsxs("ol", { className: "install-guidance", children: [_jsx("li", { children: "Use iOS 16.4 or newer and connect Tailscale." }), _jsxs("li", { children: ["Open ", canonicalUrl, " in Safari."] }), _jsx("li", { children: "Share \u2192 Add to Home Screen, then open the installed app." }), _jsx("li", { children: "Tap Enable." })] })] })] }));
78
+ };
79
+ //# sourceMappingURL=approval-app-view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approval-app-view.js","sourceRoot":"","sources":["../src/approval-app-view.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=approval-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approval-client.d.ts","sourceRoot":"","sources":["../src/approval-client.tsx"],"names":[],"mappings":""}