@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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard-model.d.ts","sourceRoot":"","sources":["../src/dashboard-model.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE/B,eAAO,MAAM,YAAY;;;;EAIvB,CAAA;AAEF,eAAO,MAAM,iBAAiB;;;;;;;;EAI5B,CAAA;AAEF,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;EAO1B,CAAA;AAEF,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAIjC,CAAA;AAEF,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAIhC,CAAA;AAEF,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAOhC,CAAA;AAEF,eAAO,MAAM,sBAAsB;;;EASjC,CAAA;AAEF,eAAO,MAAM,2BAA2B;;;;;;EAOtC,CAAA;AAEF,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAKhC,CAAA;AAEF,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAG/B,CAAA;AAEF,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiB5B,CAAA;AAEF,MAAM,MAAM,iBAAiB,GAAG,OAAO,iBAAiB,CAAC,IAAI,CAAA;AAC7D,MAAM,MAAM,qBAAqB,GAAG,OAAO,qBAAqB,CAAC,IAAI,CAAA;AACrE,MAAM,MAAM,iBAAiB,GAAG,OAAO,iBAAiB,CAAC,IAAI,CAAA;AAC7D,MAAM,MAAM,oBAAoB,GAAG,OAAO,oBAAoB,CAAC,IAAI,CAAA;AACnE,MAAM,MAAM,eAAe,GAAG,OAAO,eAAe,CAAC,IAAI,CAAA;AACzD,MAAM,MAAM,sBAAsB,GAAG,OAAO,sBAAsB,CAAC,IAAI,CAAA;AACvE,MAAM,MAAM,2BAA2B,GAAG,OAAO,2BAA2B,CAAC,IAAI,CAAA;AACjF,MAAM,MAAM,sBAAsB,GAAG,OAAO,sBAAsB,CAAC,IAAI,CAAA;AACvE,MAAM,MAAM,qBAAqB,GAAG,OAAO,qBAAqB,CAAC,IAAI,CAAA"}
@@ -0,0 +1,83 @@
1
+ import { ChatHistory } from "@knpkv/herdr-coordinator/model";
2
+ import { HostStatus, JobPayload, JobRecord, PendingApprovalCursor } from "@knpkv/herdr-fleet/model";
3
+ import { WorkSnapshots } from "@knpkv/herdr-work/model";
4
+ import { Schema } from "effect";
5
+ export const ApprovalLink = Schema.Struct({
6
+ host: Schema.String,
7
+ online: Schema.Boolean,
8
+ url: Schema.NullOr(Schema.String)
9
+ });
10
+ export const ApprovalDirectory = Schema.Struct({
11
+ currentUrl: Schema.String,
12
+ links: Schema.Array(ApprovalLink),
13
+ error: Schema.NullOr(Schema.String)
14
+ });
15
+ export const PendingApproval = Schema.Struct({
16
+ id: Schema.String,
17
+ createdAt: Schema.Number,
18
+ actor: Schema.String,
19
+ approvalExpiresAt: Schema.NullOr(Schema.Number),
20
+ status: Schema.Literal("pending_approval"),
21
+ payload: JobPayload
22
+ });
23
+ export const PendingApprovalSummary = Schema.Struct({
24
+ host: Schema.String,
25
+ approvals: Schema.Array(PendingApproval),
26
+ nextCursor: Schema.NullOr(PendingApprovalCursor)
27
+ });
28
+ export const RemotePendingApproval = Schema.Struct({
29
+ host: Schema.String,
30
+ approvalUrl: Schema.String,
31
+ approval: PendingApproval
32
+ });
33
+ export const PendingApprovalTarget = Schema.Union([
34
+ Schema.TaggedStruct("local", {
35
+ record: JobRecord
36
+ }),
37
+ Schema.TaggedStruct("remote", {
38
+ remote: RemotePendingApproval
39
+ })
40
+ ]);
41
+ export const PendingApprovalFailure = Schema.Struct({
42
+ host: Schema.String,
43
+ reason: Schema.Literals([
44
+ "offline",
45
+ "unavailable",
46
+ "timeout",
47
+ "request_failed",
48
+ "invalid_response"
49
+ ])
50
+ });
51
+ export const PendingApprovalContinuation = Schema.Struct({
52
+ host: Schema.String.check(Schema.isNonEmpty(), Schema.isMaxLength(253), Schema.isPattern(/^[A-Za-z0-9](?:[A-Za-z0-9.-]*[A-Za-z0-9])?$/)),
53
+ cursor: PendingApprovalCursor
54
+ });
55
+ export const FleetPendingApprovals = Schema.Struct({
56
+ local: Schema.Array(JobRecord),
57
+ remote: Schema.Array(RemotePendingApproval),
58
+ failures: Schema.Array(PendingApprovalFailure),
59
+ nextCursors: Schema.Array(PendingApprovalContinuation)
60
+ });
61
+ export const DashboardHistoryPage = Schema.Struct({
62
+ records: Schema.Array(JobRecord),
63
+ nextCursor: Schema.NullOr(PendingApprovalCursor)
64
+ });
65
+ export const DashboardSnapshot = Schema.Struct({
66
+ host: Schema.String,
67
+ observedAt: Schema.Number,
68
+ approvalsEnabled: Schema.Boolean,
69
+ approvalApp: Schema.Struct({
70
+ canonical: Schema.Boolean,
71
+ canonicalUrl: Schema.String,
72
+ chatEnabled: Schema.Boolean,
73
+ pushEnabled: Schema.Boolean
74
+ }),
75
+ chat: Schema.NullOr(ChatHistory),
76
+ work: Schema.NullOr(WorkSnapshots),
77
+ status: HostStatus,
78
+ records: Schema.Array(JobRecord),
79
+ historyNextCursor: Schema.NullOr(PendingApprovalCursor),
80
+ directory: Schema.NullOr(ApprovalDirectory),
81
+ pendingApprovals: FleetPendingApprovals
82
+ });
83
+ //# sourceMappingURL=dashboard-model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard-model.js","sourceRoot":"","sources":["../src/dashboard-model.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import type { DashboardSnapshot } from "./dashboard-model.js";
2
+ import type { ChatMode } from "@knpkv/herdr-coordinator/model";
3
+ import { type NotificationState } from "./approval-app-view.js";
4
+ export type ApprovalDecision = {
5
+ readonly decision: "approve" | "reject";
6
+ readonly hash: string;
7
+ readonly jobId: string;
8
+ readonly nonce: string;
9
+ };
10
+ export declare const approvalShortcutFor: ({ key, modified, shift }: {
11
+ readonly key: string;
12
+ readonly modified: boolean;
13
+ readonly shift: boolean;
14
+ }) => ApprovalDecision["decision"] | null;
15
+ type DashboardViewProps = {
16
+ readonly approvalOnly?: boolean;
17
+ readonly busyJobId: string | null;
18
+ readonly chatBusy: boolean;
19
+ readonly notificationState: NotificationState;
20
+ readonly historyLoading?: boolean;
21
+ readonly pendingLoading?: boolean;
22
+ readonly onChatSubmit: ((mode: ChatMode, message: string) => Promise<boolean>) | undefined;
23
+ readonly onDecision: ((decision: ApprovalDecision) => void) | undefined;
24
+ readonly onDisableNotifications: (() => void) | undefined;
25
+ readonly onEnableNotifications: (() => void) | undefined;
26
+ readonly onLoadHistory?: (() => void) | undefined;
27
+ readonly onLoadPending?: (() => void) | undefined;
28
+ readonly onRefresh: (() => void) | undefined;
29
+ readonly pull: {
30
+ readonly distance: number;
31
+ readonly ready: boolean;
32
+ readonly refreshing: boolean;
33
+ };
34
+ readonly snapshot: DashboardSnapshot;
35
+ readonly showHeader?: boolean;
36
+ };
37
+ export declare const AgentActivity: ({ snapshot }: {
38
+ readonly snapshot: DashboardSnapshot;
39
+ }) => import("react").JSX.Element;
40
+ export declare const DashboardView: ({ approvalOnly, busyJobId, chatBusy, historyLoading, notificationState, onChatSubmit, onDecision, onDisableNotifications, onEnableNotifications, onLoadHistory, onLoadPending, onRefresh, pendingLoading, pull, showHeader, snapshot }: DashboardViewProps) => import("react").JSX.Element;
41
+ export {};
42
+ //# sourceMappingURL=dashboard-view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard-view.d.ts","sourceRoot":"","sources":["../src/dashboard-view.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAA2C,MAAM,sBAAsB,CAAA;AACtG,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAA;AAC9D,OAAO,EAA2C,KAAK,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAIxG,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,CAAC,QAAQ,EAAE,SAAS,GAAG,QAAQ,CAAA;IACvC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CACvB,CAAA;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,gBAAgB,CAAC,UAAU,CAAC,GAAG,IAKlC,CAAA;AAED,KAAK,kBAAkB,GAAG;IACxB,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAA;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;IAC1B,QAAQ,CAAC,iBAAiB,EAAE,iBAAiB,CAAA;IAC7C,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAA;IACjC,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAA;IACjC,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,SAAS,CAAA;IAC1F,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,EAAE,gBAAgB,KAAK,IAAI,CAAC,GAAG,SAAS,CAAA;IACvE,QAAQ,CAAC,sBAAsB,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAA;IACzD,QAAQ,CAAC,qBAAqB,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAA;IACxD,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAA;IACjD,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAA;IACjD,QAAQ,CAAC,SAAS,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAA;IAC5C,QAAQ,CAAC,IAAI,EAAE;QACb,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;QACzB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;QACvB,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAA;KAC7B,CAAA;IACD,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAA;IACpC,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAA;CAC9B,CAAA;AAiUD,eAAO,MAAM,aAAa,iBAAkB;IAAE,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAA;CAAE,gCAqCnF,CAAA;AAuHD,eAAO,MAAM,aAAa,2OAiBvB,kBAAkB,gCAiNpB,CAAA"}
@@ -0,0 +1,194 @@
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Button, StateLabel, Surface, Text } from "@knpkv/rly/primitives";
3
+ import { FreshnessStamp } from "@knpkv/rly/patterns";
4
+ import { CoordinatorChatPanel, NotificationPanel } from "./approval-app-view.js";
5
+ import { requiresApproval } from "@knpkv/herdr-fleet/model";
6
+ import { ActivityHistory, jobTitle, statusLabel, statusTone } from "./activity-history.js";
7
+ export const approvalShortcutFor = ({ key, modified, shift }) => {
8
+ if (!modified)
9
+ return null;
10
+ if (key === "Enter" && !shift)
11
+ return "approve";
12
+ if (key === "Backspace" && shift)
13
+ return "reject";
14
+ return null;
15
+ };
16
+ const pendingCreatedAt = (item) => item._tag === "local" ? item.record.createdAt : item.remote.approval.createdAt;
17
+ const jobSummary = (record) => {
18
+ switch (record.payload.kind) {
19
+ case "browser.mcp.recover":
20
+ return "Local browser MCP recovery";
21
+ case "nix.check":
22
+ return "Repository checks";
23
+ case "nix.apply":
24
+ return `Revision ${record.payload.ref}`;
25
+ case "agent.delegate":
26
+ return `${record.payload.mode} · ${record.payload.prompt}`;
27
+ case "agent.message":
28
+ return `${record.payload.session} · ${record.payload.message}`;
29
+ }
30
+ };
31
+ const iso = (timestamp) => new Date(timestamp).toISOString();
32
+ const timeLabel = (timestamp) => new Intl.DateTimeFormat("en-GB", {
33
+ hour: "2-digit",
34
+ minute: "2-digit"
35
+ }).format(timestamp);
36
+ const lifecycleTime = (label, timestamp, actor) => (_jsxs("li", { children: [_jsx("span", { children: label }), timestamp == null ? (_jsx("small", { children: "Time unavailable" })) : (_jsx("time", { dateTime: iso(timestamp), children: timeLabel(timestamp) })), actor == null ? null : _jsxs("small", { children: ["by ", actor] })] }));
37
+ const JobTimeline = ({ record }) => (_jsxs("ol", { className: "job-lifecycle", "aria-label": "Job lifecycle", children: [lifecycleTime("Arrived", record.createdAt, record.actor), record.approvedBy === null ? null : lifecycleTime("Approved", record.approvedAt, record.approvedBy), record.status === "rejected" || record.rejectedBy != null
38
+ ? lifecycleTime("Rejected", record.rejectedAt, record.rejectedBy)
39
+ : null, record.status === "expired"
40
+ ? lifecycleTime("Expired", record.expiredAt)
41
+ : record.status === "pending_approval"
42
+ ? lifecycleTime("Expires", record.approvalExpiresAt)
43
+ : null] }));
44
+ const ApprovalActions = ({ busy, onDecision, record }) => {
45
+ if (onDecision === undefined || record.status !== "pending_approval" || record.approvalNonce === null) {
46
+ return null;
47
+ }
48
+ const submit = (decision) => (event) => {
49
+ if (onDecision === undefined)
50
+ return;
51
+ event.preventDefault();
52
+ onDecision({
53
+ decision,
54
+ hash: record.hash,
55
+ jobId: record.id,
56
+ nonce: record.approvalNonce ?? ""
57
+ });
58
+ };
59
+ const jobPath = encodeURIComponent(record.id);
60
+ return (_jsxs("div", { className: "approval-actions", children: [_jsxs("form", { method: "post", action: `/v1/jobs/${jobPath}/reject`, onSubmit: submit("reject"), children: [_jsx("input", { type: "hidden", name: "hash", value: record.hash }), _jsx("input", { type: "hidden", name: "nonce", value: record.approvalNonce }), _jsx(Button, { type: "submit", variant: "quiet", disabled: busy, children: "Reject" })] }), _jsxs("form", { method: "post", action: `/v1/jobs/${jobPath}/approve`, onSubmit: submit("approve"), children: [_jsx("input", { type: "hidden", name: "hash", value: record.hash }), _jsx("input", { type: "hidden", name: "nonce", value: record.approvalNonce }), _jsx(Button, { type: "submit", variant: "primary", loading: busy, children: "Approve" })] })] }));
61
+ };
62
+ const AgendaItem = ({ busy, connectBaseUrl, host, onDecision, record }) => {
63
+ const handleShortcut = (event) => {
64
+ if (event.target !== event.currentTarget || busy || onDecision === undefined)
65
+ return;
66
+ const decision = approvalShortcutFor({
67
+ key: event.key,
68
+ modified: event.ctrlKey || event.metaKey,
69
+ shift: event.shiftKey
70
+ });
71
+ const nonce = record.approvalNonce;
72
+ if (decision === null || record.status !== "pending_approval" || nonce === null)
73
+ return;
74
+ event.preventDefault();
75
+ onDecision({ decision, hash: record.hash, jobId: record.id, nonce });
76
+ };
77
+ const actionable = onDecision !== undefined && record.status === "pending_approval" && record.approvalNonce !== null;
78
+ return (_jsxs(Surface, { as: "article", padding: "default", tone: "secondary", className: "agenda-item", "data-agenda-item": "", "data-approval-host": host, "data-approval-job": record.id, onKeyDown: handleShortcut, tabIndex: 0, children: [_jsxs("div", { className: "agenda-heading", children: [_jsxs("div", { children: [_jsx(Text, { as: "h3", variant: "card-title", children: jobTitle(record) }), _jsx(Text, { as: "p", tone: "secondary", children: jobSummary(record) })] }), _jsx(StateLabel, { label: statusLabel(record.status), tone: statusTone(record.status), size: "compact" })] }), _jsx(JobTimeline, { record: record }), record.connectTarget === undefined || record.worker === undefined ? null : (_jsxs("a", { className: "worker-connect-link", href: new URL(record.connectTarget.url, connectBaseUrl).href, children: ["Open ", record.worker.name, " in Connect"] })), _jsx(ApprovalActions, { busy: busy, onDecision: onDecision, record: record }), actionable ? (_jsxs("div", { className: "keyboard-hints", "aria-label": "Approval keyboard shortcuts", children: [_jsxs("span", { children: [_jsx("kbd", { children: "\u2318/Ctrl" }), " ", _jsx("kbd", { children: "Enter" }), " Approve"] }), _jsxs("span", { children: [_jsx("kbd", { children: "\u2318/Ctrl" }), " ", _jsx("kbd", { children: "Shift" }), " ", _jsx("kbd", { children: "\u232B" }), " Reject"] })] })) : null] }));
79
+ };
80
+ const RemoteAgendaItem = ({ approval, approvalUrl, host }) => (_jsxs(Surface, { as: "article", padding: "default", tone: "secondary", className: "agenda-item agenda-item-remote", "data-agenda-item": "", "data-approval-host": host, "data-approval-job": approval.id, tabIndex: 0, children: [_jsxs("div", { className: "agenda-heading", children: [_jsxs("div", { children: [_jsxs(Text, { variant: "meta", tone: "secondary", children: ["Remote \u00B7 ", host] }), _jsx(Text, { as: "h3", variant: "card-title", children: jobTitle(approval) }), _jsx(Text, { as: "p", tone: "secondary", children: jobSummary(approval) })] }), _jsx(StateLabel, { label: "Waiting", tone: "caution", size: "compact" })] }), _jsxs("ol", { className: "job-lifecycle", "aria-label": "Job lifecycle", children: [lifecycleTime("Arrived", approval.createdAt, approval.actor), lifecycleTime("Expires", approval.approvalExpiresAt)] }), _jsxs("a", { className: "remote-approval-link", href: approvalUrl, "aria-label": `Review approval on ${host}`, children: ["Review on ", host] })] }));
81
+ const pendingFailureLabel = (failure) => {
82
+ switch (failure.reason) {
83
+ case "offline":
84
+ return `${failure.host} offline`;
85
+ case "unavailable":
86
+ return `${failure.host} unavailable`;
87
+ case "timeout":
88
+ return `${failure.host} timed out`;
89
+ case "request_failed":
90
+ return `${failure.host} request failed`;
91
+ case "invalid_response":
92
+ return `${failure.host} returned invalid data`;
93
+ }
94
+ };
95
+ const Summary = ({ snapshot }) => {
96
+ const pending = snapshot.pendingApprovals.local.length + snapshot.pendingApprovals.remote.length;
97
+ const pendingUnknown = snapshot.pendingApprovals.failures.length > 0;
98
+ const active = snapshot.records.filter((record) => record.status === "queued" || record.status === "running").length;
99
+ const agents = snapshot.status.herdr.agents.length;
100
+ return (_jsxs("section", { className: "summary-grid", "aria-label": "Current host state", children: [_jsxs(Surface, { padding: "default", tone: "secondary", children: [_jsx(Text, { variant: "meta", tone: "secondary", children: "Agents online" }), _jsx("strong", { children: agents }), _jsx("small", { children: snapshot.status.herdr.available ? "Herdr connected" : "Herdr unavailable" })] }), _jsxs(Surface, { padding: "default", tone: "secondary", children: [_jsx(Text, { variant: "meta", tone: "secondary", children: "Needs approval" }), _jsx("strong", { children: pendingUnknown ? `${pending}+` : pending }), _jsx("small", { children: pendingUnknown ? "Some machines unchecked" : pending === 0 ? "Nothing waiting" : "Decision required" })] }), _jsxs(Surface, { padding: "default", tone: "secondary", children: [_jsx(Text, { variant: "meta", tone: "secondary", children: "Active work" }), _jsx("strong", { children: active }), _jsx("small", { children: "Queued or running" })] }), _jsxs(Surface, { padding: "default", tone: "secondary", children: [_jsx(Text, { variant: "meta", tone: "secondary", children: "Repository" }), _jsx("strong", { className: "summary-branch", children: snapshot.status.branch }), _jsx("small", { children: snapshot.status.dirty ? "Local changes" : "Clean" })] })] }));
101
+ };
102
+ const ApprovalSummary = ({ snapshot }) => {
103
+ const local = snapshot.pendingApprovals.local.length;
104
+ const remote = snapshot.pendingApprovals.remote.length;
105
+ const recentDecisions = snapshot.records.filter((record) => requiresApproval(record.payload) &&
106
+ (record.approvedBy !== null || record.rejectedBy !== null || record.status === "expired")).length;
107
+ return (_jsxs("section", { className: "summary-grid", "aria-label": "Approval state", children: [_jsxs(Surface, { padding: "default", tone: "secondary", children: [_jsx(Text, { variant: "meta", tone: "secondary", children: "Pending" }), _jsx("strong", { children: local + remote }), _jsx("small", { children: "Exact decisions waiting" })] }), _jsxs(Surface, { padding: "default", tone: "secondary", children: [_jsx(Text, { variant: "meta", tone: "secondary", children: "Local decisions" }), _jsx("strong", { children: local }), _jsx("small", { children: "Owned by this host" })] }), _jsxs(Surface, { padding: "default", tone: "secondary", children: [_jsx(Text, { variant: "meta", tone: "secondary", children: "Remote handoffs" }), _jsx("strong", { children: remote }), _jsx("small", { children: "Open on owning host" })] }), _jsxs(Surface, { padding: "default", tone: "secondary", children: [_jsx(Text, { variant: "meta", tone: "secondary", children: "Recent decisions" }), _jsx("strong", { children: recentDecisions }), _jsx("small", { children: "Approved, rejected, or expired" })] })] }));
108
+ };
109
+ export const AgentActivity = ({ snapshot }) => (_jsxs(Surface, { as: "section", padding: "spacious", className: "agents-panel", children: [_jsxs("div", { className: "section-heading", children: [_jsxs("div", { children: [_jsx(Text, { variant: "meta", tone: "secondary", children: "Right now" }), _jsx(Text, { as: "h2", variant: "section-title", children: "Agent activity" })] }), _jsx(StateLabel, { label: `${snapshot.status.herdr.agents.length} agents`, tone: snapshot.status.herdr.available ? "positive" : "critical", size: "compact" })] }), _jsxs("div", { className: "agent-grid", children: [snapshot.status.herdr.agents.map((agent) => (_jsx(Surface, { tone: "tertiary", padding: "compact", children: _jsxs("div", { className: "agent-line", children: [_jsx("span", { className: "agent-presence", "aria-hidden": "true" }), _jsxs("div", { children: [_jsx(Text, { as: "strong", variant: "label", children: agent.name }), _jsxs(Text, { as: "small", variant: "meta", tone: "secondary", children: [agent.kind, " \u00B7 ", agent.work] })] }), _jsx(StateLabel, { label: agent.status, tone: "progress", size: "compact" })] }) }, agent.paneId))), snapshot.status.herdr.agents.length === 0 ? _jsx(Text, { tone: "secondary", children: "No active agents." }) : null] })] }));
110
+ const ApprovalDecisionHistory = ({ records }) => {
111
+ const decisionFor = (record) => {
112
+ if (record.rejectedBy != null) {
113
+ return {
114
+ actor: record.rejectedBy,
115
+ label: "Rejected",
116
+ timestamp: record.rejectedAt ?? record.updatedAt,
117
+ tone: "critical"
118
+ };
119
+ }
120
+ if (record.status === "expired") {
121
+ return { actor: "hostd", label: "Expired", timestamp: record.expiredAt ?? record.updatedAt, tone: "caution" };
122
+ }
123
+ if (record.approvedBy !== null) {
124
+ return {
125
+ actor: record.approvedBy,
126
+ label: "Approved",
127
+ timestamp: record.approvedAt ?? record.updatedAt,
128
+ tone: "positive"
129
+ };
130
+ }
131
+ return null;
132
+ };
133
+ const decisions = records
134
+ .filter((record) => requiresApproval(record.payload))
135
+ .flatMap((record) => {
136
+ const decision = decisionFor(record);
137
+ return decision === null ? [] : [{ decision, record }];
138
+ })
139
+ .sort((left, right) => right.decision.timestamp - left.decision.timestamp);
140
+ const visibleDecisions = decisions.slice(0, 10);
141
+ return (_jsxs(Surface, { as: "section", padding: "spacious", className: "decision-history-panel", children: [_jsxs("div", { className: "section-heading", children: [_jsxs("div", { children: [_jsx(Text, { variant: "meta", tone: "secondary", children: "Decisions" }), _jsx(Text, { as: "h2", variant: "section-title", children: "Recent approval history" })] }), _jsxs(Text, { variant: "meta", tone: "secondary", children: [visibleDecisions.length, " recent \u00B7 ", decisions.length, " total"] })] }), decisions.length === 0 ? (_jsx(Text, { tone: "secondary", children: "No approval decisions yet." })) : (_jsx("ol", { className: "decision-history-list", children: visibleDecisions.map(({ decision, record }) => (_jsxs("li", { children: [_jsxs("div", { children: [_jsx(Text, { as: "strong", variant: "label", children: jobTitle(record) }), _jsxs(Text, { tone: "secondary", variant: "meta", children: [timeLabel(decision.timestamp), " \u00B7 ", decision.actor] })] }), _jsx(StateLabel, { label: decision.label, size: "compact", tone: decision.tone })] }, record.id))) }))] }));
142
+ };
143
+ const Machines = ({ snapshot }) => {
144
+ if (snapshot.directory === null)
145
+ return null;
146
+ return (_jsxs(Surface, { as: "section", padding: "spacious", className: "machine-panel", children: [_jsx("div", { className: "section-heading", children: _jsxs("div", { children: [_jsx(Text, { variant: "meta", tone: "secondary", children: "Fleet" }), _jsx(Text, { as: "h2", variant: "section-title", children: "Other machines" })] }) }), _jsxs("nav", { className: "machine-grid", "aria-label": "Fleet approval pages", children: [_jsxs("a", { className: "machine machine-current", href: snapshot.directory.currentUrl, children: [_jsx(StateLabel, { label: "This machine", tone: "progress", size: "compact" }), _jsx("strong", { children: snapshot.host })] }), snapshot.directory.links.map((link) => link.url !== null && link.online ? (_jsxs("a", { className: "machine", href: link.url, children: [_jsx(StateLabel, { label: "Online", tone: "positive", size: "compact" }), _jsx("strong", { children: link.host })] }, link.host)) : (_jsxs("span", { className: "machine machine-offline", children: [_jsx(StateLabel, { label: "Offline", tone: "neutral", size: "compact" }), _jsx("strong", { children: link.host })] }, link.host)))] }), snapshot.directory.error === null ? null : (_jsx(Text, { className: "notice", tone: "secondary", children: "Machine links unavailable. Local approvals still work." }))] }));
147
+ };
148
+ export const DashboardView = ({ approvalOnly = false, busyJobId, chatBusy, historyLoading = false, notificationState, onChatSubmit, onDecision, onDisableNotifications, onEnableNotifications, onLoadHistory, onLoadPending, onRefresh, pendingLoading = false, pull, showHeader = true, snapshot }) => {
149
+ const active = snapshot.records.filter((record) => !approvalOnly && (record.status === "queued" || record.status === "running"));
150
+ const pendingAgenda = [
151
+ ...snapshot.pendingApprovals.local.map((record) => ({ _tag: "local", record })),
152
+ ...snapshot.pendingApprovals.remote.map((remote) => ({ _tag: "remote", remote }))
153
+ ].sort((left, right) => pendingCreatedAt(right) - pendingCreatedAt(left));
154
+ const pendingUnknown = snapshot.pendingApprovals.failures.length > 0;
155
+ const agendaCount = pendingAgenda.length + active.length;
156
+ const history = snapshot.records.filter((record) => (!approvalOnly || requiresApproval(record.payload)) &&
157
+ record.status !== "pending_approval" &&
158
+ record.status !== "queued" &&
159
+ record.status !== "running");
160
+ const pullLabel = pull.refreshing ? "Refreshing" : pull.ready ? "Release to refresh" : "Pull to refresh";
161
+ const approvalDecision = snapshot.approvalsEnabled ? onDecision : undefined;
162
+ const moveAgendaFocus = (event) => {
163
+ const items = [...event.currentTarget.querySelectorAll("[data-agenda-item]")];
164
+ const currentIndex = items.findIndex((item) => item === event.target);
165
+ if (currentIndex < 0 || items.length === 0)
166
+ return;
167
+ let nextIndex = null;
168
+ switch (event.key) {
169
+ case "ArrowDown":
170
+ case "j":
171
+ nextIndex = (currentIndex + 1) % items.length;
172
+ break;
173
+ case "ArrowUp":
174
+ case "k":
175
+ nextIndex = (currentIndex - 1 + items.length) % items.length;
176
+ break;
177
+ case "Home":
178
+ nextIndex = 0;
179
+ break;
180
+ case "End":
181
+ nextIndex = items.length - 1;
182
+ break;
183
+ }
184
+ if (nextIndex === null)
185
+ return;
186
+ const next = items.at(nextIndex);
187
+ if (next === undefined)
188
+ return;
189
+ event.preventDefault();
190
+ next.focus();
191
+ };
192
+ return (_jsxs("div", { className: "dashboard-root", "data-pulling": pull.distance > 0, "data-pull-ready": pull.ready, style: { "--pull-distance": `${pull.distance}px` }, children: [_jsxs("div", { className: "pull-refresh", "aria-hidden": "true", children: [_jsx("span", { children: "\u2193" }), _jsx("strong", { children: pullLabel })] }), _jsxs("main", { className: "app", children: [showHeader ? (_jsxs("header", { className: "app-header", children: [_jsxs("div", { className: "fleet-mark", "aria-hidden": "true", children: [_jsx("i", {}), _jsx("i", {}), _jsx("i", {})] }), _jsxs("div", { className: "app-title", children: [_jsx(Text, { variant: "meta", tone: "secondary", children: "Host activity" }), _jsx(Text, { as: "h1", variant: "page-title", children: snapshot.host })] }), _jsxs("div", { className: "header-actions", children: [snapshot.approvalApp.canonical ? (_jsxs("nav", { className: "fleet-app-nav", "aria-label": "Fleet applications", children: [_jsx("a", { href: "/", "aria-current": "page", children: "Approvals" }), _jsx("a", { href: "/connect/", children: "Connect" })] })) : null, _jsx(FreshnessStamp, { state: "current", dateTime: iso(snapshot.observedAt), time: timeLabel(snapshot.observedAt), size: "compact" }), onRefresh === undefined ? null : (_jsx(Button, { variant: "quiet", size: "compact", onClick: onRefresh, children: "Refresh" }))] })] })) : null, approvalOnly ? _jsx(ApprovalSummary, { snapshot: snapshot }) : _jsx(Summary, { snapshot: snapshot }), snapshot.approvalApp.canonical && snapshot.chat !== null ? (_jsxs(_Fragment, { children: [_jsx(NotificationPanel, { canonicalUrl: snapshot.approvalApp.canonicalUrl, onDisable: onDisableNotifications, onEnable: onEnableNotifications, state: notificationState }), approvalOnly ? null : (_jsx(CoordinatorChatPanel, { busy: chatBusy, history: snapshot.chat, onSubmit: onChatSubmit }))] })) : snapshot.approvalApp.canonical ? null : (_jsxs(Surface, { padding: "default", tone: "secondary", className: "hub-link", children: [_jsx(Text, { tone: "secondary", children: "Notifications and coordinator chat live on the canonical hub." }), _jsxs("a", { href: snapshot.approvalApp.canonicalUrl, children: ["Open ", new URL(snapshot.approvalApp.canonicalUrl).host] })] })), approvalOnly ? null : _jsx(AgentActivity, { snapshot: snapshot }), _jsxs(Surface, { as: "section", padding: "spacious", className: "agenda-panel", children: [_jsxs("div", { className: "section-heading", children: [_jsxs("div", { children: [_jsx(Text, { variant: "meta", tone: "secondary", children: "Agenda" }), _jsx(Text, { as: "h2", variant: "section-title", children: "Needs attention" })] }), _jsx(StateLabel, { label: `${agendaCount} ${pendingUnknown ? "known " : ""}open`, tone: agendaCount === 0 && !pendingUnknown ? "positive" : "caution", size: "compact" })] }), _jsxs("div", { className: "agenda-list", onKeyDown: moveAgendaFocus, children: [pendingAgenda.map((item) => item._tag === "local" ? (_jsx(AgendaItem, { busy: busyJobId === item.record.id, connectBaseUrl: snapshot.approvalApp.canonicalUrl, host: snapshot.host, onDecision: approvalDecision, record: item.record }, item.record.id)) : (_jsx(RemoteAgendaItem, { approval: item.remote.approval, approvalUrl: item.remote.approvalUrl, host: item.remote.host }, `${item.remote.host}:${item.remote.approval.id}`))), active.map((record) => (_jsx(AgendaItem, { busy: busyJobId === record.id, connectBaseUrl: snapshot.approvalApp.canonicalUrl, host: snapshot.host, onDecision: approvalDecision, record: record }, record.id))), snapshot.pendingApprovals.failures.length === 0 ? null : (_jsxs(Text, { className: "notice", tone: "secondary", children: ["Could not check ", snapshot.pendingApprovals.failures.map(pendingFailureLabel).join(", "), ". Local approvals still work."] })), snapshot.pendingApprovals.nextCursors.length === 0 ? null : (_jsx("div", { className: "activity-load-more", children: _jsx(Button, { loading: pendingLoading, onClick: onLoadPending, type: "button", variant: "quiet", children: "Load more approvals" }) })), agendaCount === 0 && !pendingUnknown ? (_jsxs("div", { className: "empty", children: [_jsx("span", { children: "\u2713" }), _jsx(Text, { as: "h3", variant: "card-title", children: "Nothing waiting" }), _jsx(Text, { tone: "secondary", children: "All current work is settled." })] })) : null] })] }), approvalOnly ? (_jsxs(_Fragment, { children: [_jsx(ApprovalDecisionHistory, { records: snapshot.records }), snapshot.historyNextCursor === null ? null : (_jsx("div", { className: "activity-load-more", children: _jsx(Button, { loading: historyLoading, onClick: onLoadHistory, type: "button", variant: "quiet", children: "Load earlier decisions" }) }))] })) : (_jsx(ActivityHistory, { hasMore: snapshot.historyNextCursor !== null, loading: historyLoading, ...(onLoadHistory === undefined ? {} : { onLoadMore: onLoadHistory }), records: history })), _jsx(Machines, { snapshot: snapshot })] })] }));
193
+ };
194
+ //# sourceMappingURL=dashboard-view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard-view.js","sourceRoot":"","sources":["../src/dashboard-view.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import { Schema } from "effect";
2
+ declare const ApprovalAppStoreError_base: Schema.Class<ApprovalAppStoreError, Schema.TaggedStruct<"ApprovalAppStoreError", {
3
+ readonly cause: Schema.Defect;
4
+ readonly detail: Schema.String;
5
+ readonly operation: Schema.String;
6
+ }>, import("effect/Cause").YieldableError>;
7
+ export declare class ApprovalAppStoreError extends ApprovalAppStoreError_base {
8
+ }
9
+ declare const DashboardResponseBudgetError_base: Schema.Class<DashboardResponseBudgetError, Schema.TaggedStruct<"DashboardResponseBudgetError", {
10
+ readonly encodedBytes: Schema.Number;
11
+ readonly maximumBytes: Schema.Number;
12
+ }>, import("effect/Cause").YieldableError>;
13
+ export declare class DashboardResponseBudgetError extends DashboardResponseBudgetError_base {
14
+ }
15
+ declare const PushDeliveryError_base: Schema.Class<PushDeliveryError, Schema.TaggedStruct<"PushDeliveryError", {
16
+ readonly cause: Schema.Defect;
17
+ readonly operation: Schema.String;
18
+ readonly statusCode: Schema.NullOr<Schema.Number>;
19
+ }>, import("effect/Cause").YieldableError>;
20
+ export declare class PushDeliveryError extends PushDeliveryError_base {
21
+ }
22
+ declare const PushEndpointNotAllowedError_base: Schema.Class<PushEndpointNotAllowedError, Schema.TaggedStruct<"PushEndpointNotAllowedError", {
23
+ readonly origin: Schema.String;
24
+ }>, import("effect/Cause").YieldableError>;
25
+ export declare class PushEndpointNotAllowedError extends PushEndpointNotAllowedError_base {
26
+ }
27
+ declare const PushSubscriptionCleanupError_base: Schema.Class<PushSubscriptionCleanupError, Schema.TaggedStruct<"PushSubscriptionCleanupError", {
28
+ readonly cause: Schema.Defect;
29
+ }>, import("effect/Cause").YieldableError>;
30
+ export declare class PushSubscriptionCleanupError extends PushSubscriptionCleanupError_base {
31
+ }
32
+ export {};
33
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;;;;;;AAE/B,qBAAa,qBAAsB,SAAQ,0BAG1C;CAAG;;;;;AAEJ,qBAAa,4BAA6B,SAAQ,iCAGjD;CAAG;;;;;;AAEJ,qBAAa,iBAAkB,SAAQ,sBAGtC;CAAG;;;;AAEJ,qBAAa,2BAA4B,SAAQ,gCAGhD;CAAG;;;;AAEJ,qBAAa,4BAA6B,SAAQ,iCAGjD;CAAG"}
package/dist/errors.js ADDED
@@ -0,0 +1,12 @@
1
+ import { Schema } from "effect";
2
+ export class ApprovalAppStoreError extends Schema.TaggedError()("ApprovalAppStoreError", { cause: Schema.Defect(), detail: Schema.String, operation: Schema.String }) {
3
+ }
4
+ export class DashboardResponseBudgetError extends Schema.TaggedError()("DashboardResponseBudgetError", { encodedBytes: Schema.Number, maximumBytes: Schema.Number }) {
5
+ }
6
+ export class PushDeliveryError extends Schema.TaggedError()("PushDeliveryError", { cause: Schema.Defect(), operation: Schema.String, statusCode: Schema.NullOr(Schema.Number) }) {
7
+ }
8
+ export class PushEndpointNotAllowedError extends Schema.TaggedError()("PushEndpointNotAllowedError", { origin: Schema.String }) {
9
+ }
10
+ export class PushSubscriptionCleanupError extends Schema.TaggedError()("PushSubscriptionCleanupError", { cause: Schema.Defect() }) {
11
+ }
12
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE/B,MAAM,OAAO,qBAAsB,SAAQ,MAAM,CAAC,WAAW,EAAyB,CACpF,uBAAuB,EACvB,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,CAC5E;CAAG;AAEJ,MAAM,OAAO,4BAA6B,SAAQ,MAAM,CAAC,WAAW,EAAgC,CAClG,8BAA8B,EAC9B,EAAE,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,CAC7D;CAAG;AAEJ,MAAM,OAAO,iBAAkB,SAAQ,MAAM,CAAC,WAAW,EAAqB,CAC5E,mBAAmB,EACnB,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAC/F;CAAG;AAEJ,MAAM,OAAO,2BAA4B,SAAQ,MAAM,CAAC,WAAW,EAA+B,CAChG,6BAA6B,EAC7B,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAC1B;CAAG;AAEJ,MAAM,OAAO,4BAA6B,SAAQ,MAAM,CAAC,WAAW,EAAgC,CAClG,8BAA8B,EAC9B,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,EAAE,CAC3B;CAAG"}
@@ -0,0 +1,68 @@
1
+ import { type JobRecord } from "@knpkv/herdr-fleet";
2
+ import { Effect } from "effect";
3
+ interface DetailedFailure {
4
+ readonly detail: string;
5
+ }
6
+ export type HostSubmissionOutcome = {
7
+ readonly approvalUrl: string | null;
8
+ readonly approvalUrlError: string | null;
9
+ readonly host: string;
10
+ readonly record: JobRecord;
11
+ } | {
12
+ readonly error: string;
13
+ readonly host: string;
14
+ readonly record: null;
15
+ };
16
+ export declare const submitToHost: <SubmissionError extends DetailedFailure, SubmissionRequirements, ApprovalError extends DetailedFailure, ApprovalRequirements>(host: string, submission: Effect.Effect<{
17
+ readonly id: string;
18
+ readonly createdAt: number;
19
+ readonly updatedAt: number;
20
+ readonly actor: string;
21
+ readonly hash: string;
22
+ readonly approvalNonce: string | null;
23
+ readonly approvalExpiresAt?: number | null;
24
+ readonly approvedBy: string | null;
25
+ readonly approvedAt?: number | null;
26
+ readonly rejectedBy?: string | null;
27
+ readonly rejectedAt?: number | null;
28
+ readonly expiredAt?: number | null;
29
+ readonly status: "expired" | "failed" | "interrupted" | "pending_approval" | "queued" | "rejected" | "running" | "succeeded";
30
+ readonly payload: {
31
+ readonly kind: "nix.check";
32
+ } | {
33
+ readonly kind: "nix.apply";
34
+ readonly ref: string;
35
+ } | {
36
+ readonly kind: "agent.delegate";
37
+ readonly repository: string;
38
+ readonly prompt: string;
39
+ readonly mode: "consult" | "review" | "work";
40
+ readonly channel?: "coordinator_chat";
41
+ } | {
42
+ readonly kind: "agent.message";
43
+ readonly session: string;
44
+ readonly message: string;
45
+ } | {
46
+ readonly kind: "browser.mcp.recover";
47
+ };
48
+ readonly result: string | null;
49
+ readonly error: string | null;
50
+ readonly worker?: {
51
+ readonly host: string;
52
+ readonly agentId: string;
53
+ readonly name: string;
54
+ readonly paneId: string;
55
+ readonly relationship?: {
56
+ readonly parentAgentId: string;
57
+ readonly relation: "delegated" | "pair" | "review";
58
+ };
59
+ };
60
+ readonly connectTarget?: {
61
+ readonly host: string;
62
+ readonly agentId: string;
63
+ readonly url: string;
64
+ };
65
+ readonly workerTerminalObservedAt?: number | null;
66
+ }, SubmissionError, SubmissionRequirements>, approvalPage: Effect.Effect<string, ApprovalError, ApprovalRequirements>) => Effect.Effect<HostSubmissionOutcome, never, ApprovalRequirements | SubmissionRequirements>;
67
+ export {};
68
+ //# sourceMappingURL=fleetctl-submission.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fleetctl-submission.d.ts","sourceRoot":"","sources":["../src/fleetctl-submission.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,oBAAoB,CAAA;AACnD,OAAO,EAAE,MAAM,EAAU,MAAM,QAAQ,CAAA;AAEvC,UAAU,eAAe;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,MAAM,qBAAqB,GAC7B;IACA,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IACnC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAA;IACxC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAA;CAC3B,GACC;IACA,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAA;CACtB,CAAA;AAEH,eAAO,MAAM,YAAY,GACvB,eAAe,SAAS,eAAe,EACvC,sBAAsB,EACtB,aAAa,SAAS,eAAe,EACrC,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oNAoCpB,CAAA"}
@@ -0,0 +1,31 @@
1
+ import {} from "@knpkv/herdr-fleet";
2
+ import { Effect, Result } from "effect";
3
+ export const submitToHost = Effect.fn("Fleetctl.submitToHost")(function* (host, submission, approvalPage) {
4
+ const submitted = yield* Effect.result(submission);
5
+ if (Result.isFailure(submitted)) {
6
+ return { error: submitted.failure.detail, host, record: null };
7
+ }
8
+ if (submitted.success.status !== "pending_approval") {
9
+ return {
10
+ approvalUrl: null,
11
+ approvalUrlError: null,
12
+ host,
13
+ record: submitted.success
14
+ };
15
+ }
16
+ const resolved = yield* Effect.result(approvalPage);
17
+ return Result.isSuccess(resolved)
18
+ ? {
19
+ approvalUrl: resolved.success,
20
+ approvalUrlError: null,
21
+ host,
22
+ record: submitted.success
23
+ }
24
+ : {
25
+ approvalUrl: null,
26
+ approvalUrlError: resolved.failure.detail,
27
+ host,
28
+ record: submitted.success
29
+ };
30
+ });
31
+ //# sourceMappingURL=fleetctl-submission.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fleetctl-submission.js","sourceRoot":"","sources":["../src/fleetctl-submission.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,MAAM,oBAAoB,CAAA;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAmBvC,MAAM,CAAC,MAAM,YAAY,GAAG,MAAM,CAAC,EAAE,CAAC,uBAAuB,CAAC,CAAC,QAAQ,CAAC,EAMtE,IAAY,EACZ,UAA6E,EAC7E,YAAwE;IAMxE,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;IAClD,IAAI,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC;QAChC,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;IAChE,CAAC;IACD,IAAI,SAAS,CAAC,OAAO,CAAC,MAAM,KAAK,kBAAkB,EAAE,CAAC;QACpD,OAAO;YACL,WAAW,EAAE,IAAI;YACjB,gBAAgB,EAAE,IAAI;YACtB,IAAI;YACJ,MAAM,EAAE,SAAS,CAAC,OAAO;SAC1B,CAAA;IACH,CAAC;IACD,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAA;IACnD,OAAO,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC;QAC/B,CAAC,CAAC;YACA,WAAW,EAAE,QAAQ,CAAC,OAAO;YAC7B,gBAAgB,EAAE,IAAI;YACtB,IAAI;YACJ,MAAM,EAAE,SAAS,CAAC,OAAO;SAC1B;QACD,CAAC,CAAC;YACA,WAAW,EAAE,IAAI;YACjB,gBAAgB,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM;YACzC,IAAI;YACJ,MAAM,EAAE,SAAS,CAAC,OAAO;SAC1B,CAAA;AACL,CAAC,CAAC,CAAA"}
@@ -0,0 +1,22 @@
1
+ #!/usr/bin/env node
2
+ import { FleetValidationError } from "@knpkv/herdr-fleet";
3
+ import { Effect } from "effect";
4
+ export declare const payloadFrom: (args: readonly string[]) => Effect.Effect<{
5
+ readonly kind: "nix.check";
6
+ } | {
7
+ readonly kind: "nix.apply";
8
+ readonly ref: string;
9
+ } | {
10
+ readonly kind: "agent.delegate";
11
+ readonly repository: string;
12
+ readonly prompt: string;
13
+ readonly mode: "consult" | "review" | "work";
14
+ readonly channel?: "coordinator_chat";
15
+ } | {
16
+ readonly kind: "agent.message";
17
+ readonly session: string;
18
+ readonly message: string;
19
+ } | {
20
+ readonly kind: "browser.mcp.recover";
21
+ }, FleetValidationError, never>;
22
+ //# sourceMappingURL=fleetctl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fleetctl.d.ts","sourceRoot":"","sources":["../src/fleetctl.ts"],"names":[],"mappings":";AAEA,OAAO,EAGL,oBAAoB,EASrB,MAAM,oBAAoB,CAAA;AAO3B,OAAO,EAAW,MAAM,EAAwB,MAAM,QAAQ,CAAA;AAsJ9D,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;+BA2DtB,CAAA"}