@seat-mesh/daemon 1.0.0 → 1.0.3

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 (121) hide show
  1. package/dist/ack/ack-open.d.ts +5 -0
  2. package/dist/ack/ack-open.d.ts.map +1 -0
  3. package/dist/ack/ack-open.js +86 -0
  4. package/dist/ack/ack-open.js.map +1 -0
  5. package/dist/ack/ack-sweep.d.ts +14 -0
  6. package/dist/ack/ack-sweep.d.ts.map +1 -0
  7. package/dist/ack/ack-sweep.js +186 -0
  8. package/dist/ack/ack-sweep.js.map +1 -0
  9. package/dist/ack/ack-watch.d.ts +13 -0
  10. package/dist/ack/ack-watch.d.ts.map +1 -0
  11. package/dist/ack/ack-watch.js +46 -0
  12. package/dist/ack/ack-watch.js.map +1 -0
  13. package/dist/border/border-paint.d.ts +24 -1
  14. package/dist/border/border-paint.d.ts.map +1 -1
  15. package/dist/border/border-paint.js +207 -82
  16. package/dist/border/border-paint.js.map +1 -1
  17. package/dist/border/border-paint.test.d.ts +2 -0
  18. package/dist/border/border-paint.test.d.ts.map +1 -0
  19. package/dist/border/border-paint.test.js +58 -0
  20. package/dist/border/border-paint.test.js.map +1 -0
  21. package/dist/connectivity/connectivity-recovery.d.ts +11 -2
  22. package/dist/connectivity/connectivity-recovery.d.ts.map +1 -1
  23. package/dist/connectivity/connectivity-recovery.js +65 -34
  24. package/dist/connectivity/connectivity-recovery.js.map +1 -1
  25. package/dist/connectivity/connectivity-recovery.test.js +7 -1
  26. package/dist/connectivity/connectivity-recovery.test.js.map +1 -1
  27. package/dist/connectivity/oc-resume-broadcast.d.ts +20 -0
  28. package/dist/connectivity/oc-resume-broadcast.d.ts.map +1 -0
  29. package/dist/connectivity/oc-resume-broadcast.js +74 -0
  30. package/dist/connectivity/oc-resume-broadcast.js.map +1 -0
  31. package/dist/connectivity/oc-resume-broadcast.test.d.ts +2 -0
  32. package/dist/connectivity/oc-resume-broadcast.test.d.ts.map +1 -0
  33. package/dist/connectivity/oc-resume-broadcast.test.js +9 -0
  34. package/dist/connectivity/oc-resume-broadcast.test.js.map +1 -0
  35. package/dist/index.d.ts +2 -0
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js +1 -0
  38. package/dist/index.js.map +1 -1
  39. package/dist/inject/compose-gate.d.ts +7 -0
  40. package/dist/inject/compose-gate.d.ts.map +1 -1
  41. package/dist/inject/compose-gate.js +46 -2
  42. package/dist/inject/compose-gate.js.map +1 -1
  43. package/dist/inject/compose-gate.test.js +20 -1
  44. package/dist/inject/compose-gate.test.js.map +1 -1
  45. package/dist/inject/inject-delivery.d.ts.map +1 -1
  46. package/dist/inject/inject-delivery.js +7 -3
  47. package/dist/inject/inject-delivery.js.map +1 -1
  48. package/dist/inject/inject-delivery.test.js +2 -0
  49. package/dist/inject/inject-delivery.test.js.map +1 -1
  50. package/dist/inject/pane-hold.d.ts +4 -0
  51. package/dist/inject/pane-hold.d.ts.map +1 -0
  52. package/dist/inject/pane-hold.js +30 -0
  53. package/dist/inject/pane-hold.js.map +1 -0
  54. package/dist/mesh-inbox-server.js +232 -20
  55. package/dist/mesh-inbox-server.js.map +1 -1
  56. package/dist/mesh-inbox-supervisor.js +2 -2
  57. package/dist/mesh-inbox-supervisor.js.map +1 -1
  58. package/dist/notify/notify-act-ui.d.ts +9 -2
  59. package/dist/notify/notify-act-ui.d.ts.map +1 -1
  60. package/dist/notify/notify-act-ui.js +110 -30
  61. package/dist/notify/notify-act-ui.js.map +1 -1
  62. package/dist/notify/notify-act.d.ts +14 -2
  63. package/dist/notify/notify-act.d.ts.map +1 -1
  64. package/dist/notify/notify-act.js +44 -23
  65. package/dist/notify/notify-act.js.map +1 -1
  66. package/dist/notify/notify-act.test.js +11 -0
  67. package/dist/notify/notify-act.test.js.map +1 -1
  68. package/dist/notify/simple-markdown.d.ts +6 -0
  69. package/dist/notify/simple-markdown.d.ts.map +1 -0
  70. package/dist/notify/simple-markdown.js +74 -0
  71. package/dist/notify/simple-markdown.js.map +1 -0
  72. package/dist/notify/simple-markdown.test.d.ts +2 -0
  73. package/dist/notify/simple-markdown.test.d.ts.map +1 -0
  74. package/dist/notify/simple-markdown.test.js +15 -0
  75. package/dist/notify/simple-markdown.test.js.map +1 -0
  76. package/dist/orchestrator/mesh-orchestrator.d.ts +1 -0
  77. package/dist/orchestrator/mesh-orchestrator.d.ts.map +1 -1
  78. package/dist/orchestrator/mesh-orchestrator.js +89 -163
  79. package/dist/orchestrator/mesh-orchestrator.js.map +1 -1
  80. package/dist/peer/peer-backlog.d.ts +1 -1
  81. package/dist/peer/peer-backlog.d.ts.map +1 -1
  82. package/dist/peer/peer-backlog.js +52 -34
  83. package/dist/peer/peer-backlog.js.map +1 -1
  84. package/dist/peer/peer-bulk-drain.d.ts +18 -0
  85. package/dist/peer/peer-bulk-drain.d.ts.map +1 -0
  86. package/dist/peer/peer-bulk-drain.js +254 -0
  87. package/dist/peer/peer-bulk-drain.js.map +1 -0
  88. package/dist/peer/peer-skip.test.js +2 -2
  89. package/dist/peer/peer-skip.test.js.map +1 -1
  90. package/dist/peer/peer-target-resolve.d.ts +1 -0
  91. package/dist/peer/peer-target-resolve.d.ts.map +1 -1
  92. package/dist/peer/peer-target-resolve.js +17 -6
  93. package/dist/peer/peer-target-resolve.js.map +1 -1
  94. package/dist/store/create-queue-store.d.ts +1 -0
  95. package/dist/store/create-queue-store.d.ts.map +1 -1
  96. package/dist/store/create-queue-store.js.map +1 -1
  97. package/dist/store/jsonl-store.d.ts +32 -1
  98. package/dist/store/jsonl-store.d.ts.map +1 -1
  99. package/dist/store/jsonl-store.js +108 -1
  100. package/dist/store/jsonl-store.js.map +1 -1
  101. package/dist/store/sqlite-store.d.ts +22 -1
  102. package/dist/store/sqlite-store.d.ts.map +1 -1
  103. package/dist/store/sqlite-store.js +115 -1
  104. package/dist/store/sqlite-store.js.map +1 -1
  105. package/dist/store/target-jsonl.d.ts +31 -0
  106. package/dist/store/target-jsonl.d.ts.map +1 -0
  107. package/dist/store/target-jsonl.js +76 -0
  108. package/dist/store/target-jsonl.js.map +1 -0
  109. package/dist/store/target-jsonl.test.d.ts +2 -0
  110. package/dist/store/target-jsonl.test.d.ts.map +1 -0
  111. package/dist/store/target-jsonl.test.js +37 -0
  112. package/dist/store/target-jsonl.test.js.map +1 -0
  113. package/dist/target/target-fire.d.ts +22 -0
  114. package/dist/target/target-fire.d.ts.map +1 -0
  115. package/dist/target/target-fire.js +86 -0
  116. package/dist/target/target-fire.js.map +1 -0
  117. package/package.json +6 -5
  118. package/static/ui/decide.html +66 -0
  119. package/static/ui/index.html +68 -0
  120. package/static/ui/targets.css +119 -0
  121. package/static/ui/targets.js +186 -0
@@ -0,0 +1,186 @@
1
+ const listEl = document.getElementById("list");
2
+ const emptyEl = document.getElementById("empty");
3
+ const metaEl = document.getElementById("meta");
4
+ const formErr = document.getElementById("form-err");
5
+ const kindEl = document.getElementById("kind");
6
+ const underWrap = document.getElementById("under-wrap");
7
+
8
+ kindEl.addEventListener("change", () => {
9
+ underWrap.classList.toggle("hidden", kindEl.value !== "slice");
10
+ });
11
+
12
+ function api(path, opts) {
13
+ return fetch(path, {
14
+ ...opts,
15
+ headers: {
16
+ "content-type": "application/json",
17
+ ...(opts?.headers || {}),
18
+ },
19
+ }).then(async (r) => {
20
+ const text = await r.text();
21
+ let json = null;
22
+ try {
23
+ json = text ? JSON.parse(text) : null;
24
+ } catch {
25
+ throw new Error(text.slice(0, 160) || r.statusText);
26
+ }
27
+ if (!r.ok) throw new Error(json?.error || r.statusText);
28
+ return json;
29
+ });
30
+ }
31
+
32
+ async function parseDeadline(raw) {
33
+ const t = (raw || "eod").trim();
34
+ if (!t || /^eod$/i.test(t)) {
35
+ const end = new Date();
36
+ end.setHours(23, 59, 59, 999);
37
+ return end.toISOString();
38
+ }
39
+ if (/^\d+[smhdw]$/i.test(t)) {
40
+ const n = Number(t.slice(0, -1));
41
+ const u = t.slice(-1).toLowerCase();
42
+ const mult = { s: 1e3, m: 6e4, h: 36e5, d: 864e5, w: 6048e5 }[u];
43
+ return new Date(Date.now() + n * mult).toISOString();
44
+ }
45
+ const ms = Date.parse(t);
46
+ if (Number.isNaN(ms)) throw new Error("bad deadline (eod | 6h | ISO)");
47
+ return new Date(ms).toISOString();
48
+ }
49
+
50
+ function fmtWhen(iso) {
51
+ try {
52
+ return new Date(iso).toLocaleString(undefined, {
53
+ month: "short",
54
+ day: "numeric",
55
+ hour: "2-digit",
56
+ minute: "2-digit",
57
+ });
58
+ } catch {
59
+ return iso;
60
+ }
61
+ }
62
+
63
+ function sortTargets(rows) {
64
+ const scopes = rows.filter((r) => r.kind !== "slice" && !r.parentId);
65
+ const slices = rows.filter((r) => r.kind === "slice" || r.parentId);
66
+ const out = [];
67
+ for (const s of scopes.sort((a, b) => a.deadlineAt.localeCompare(b.deadlineAt))) {
68
+ out.push(s);
69
+ out.push(
70
+ ...slices
71
+ .filter((c) => c.parentId && (s.id === c.parentId || s.id.startsWith(c.parentId) || c.parentId.startsWith(s.id)))
72
+ .sort((a, b) => a.deadlineAt.localeCompare(b.deadlineAt)),
73
+ );
74
+ }
75
+ for (const c of slices) {
76
+ if (!out.includes(c)) out.push(c);
77
+ }
78
+ return out;
79
+ }
80
+
81
+ function render(rows) {
82
+ listEl.innerHTML = "";
83
+ const ordered = sortTargets(rows);
84
+ emptyEl.hidden = ordered.length > 0;
85
+ for (const t of ordered) {
86
+ const card = document.createElement("article");
87
+ const kind = t.kind || (t.parentId ? "slice" : "scope");
88
+ card.className = `card ${kind} ${t.status}`;
89
+ const parent = t.parentId ? ` · under ${t.parentId.slice(0, 8)}` : "";
90
+ card.innerHTML = `
91
+ <div>
92
+ <div class="goal">${escapeHtml(t.goal)}</div>
93
+ <div class="tags">${escapeHtml(t.id.slice(0, 12))} · ${kind}${parent} · ${t.status} · due ${fmtWhen(t.deadlineAt)}</div>
94
+ </div>
95
+ <div class="actions"></div>
96
+ `;
97
+ const actions = card.querySelector(".actions");
98
+ if (t.status === "active") {
99
+ actions.append(
100
+ btn("Triage", () => act(t.id, "triage")),
101
+ btn("Remind", () => act(t.id, "remind")),
102
+ btn("Done", () => act(t.id, "done"), "ok"),
103
+ btn("Cancel", () => act(t.id, "cancel"), "danger"),
104
+ );
105
+ if (kind === "scope") {
106
+ actions.append(
107
+ btn("+ slice", () => {
108
+ kindEl.value = "slice";
109
+ underWrap.classList.remove("hidden");
110
+ document.getElementById("under").value = t.id;
111
+ document.getElementById("goal").focus();
112
+ }, "ghost"),
113
+ );
114
+ }
115
+ }
116
+ listEl.appendChild(card);
117
+ }
118
+ }
119
+
120
+ function btn(label, onClick, tone) {
121
+ const b = document.createElement("button");
122
+ b.type = "button";
123
+ b.className = `tiny${tone === "ghost" ? " ghost" : ""}`;
124
+ if (tone === "ok") b.style.background = "var(--ok)";
125
+ if (tone === "danger") b.style.background = "var(--danger)";
126
+ b.textContent = label;
127
+ b.addEventListener("click", onClick);
128
+ return b;
129
+ }
130
+
131
+ function escapeHtml(s) {
132
+ return String(s)
133
+ .replace(/&/g, "&amp;")
134
+ .replace(/</g, "&lt;")
135
+ .replace(/>/g, "&gt;")
136
+ .replace(/"/g, "&quot;");
137
+ }
138
+
139
+ async function act(id, action) {
140
+ try {
141
+ await api(`/targets/${encodeURIComponent(id)}/${action}`, {
142
+ method: "POST",
143
+ body: "{}",
144
+ });
145
+ await refresh();
146
+ } catch (e) {
147
+ alert(e.message || String(e));
148
+ }
149
+ }
150
+
151
+ async function refresh() {
152
+ const all = document.getElementById("show-all").checked;
153
+ const data = await api(`/targets${all ? "?all=1" : ""}`);
154
+ render(data.targets || []);
155
+ metaEl.textContent = `${(data.targets || []).length} shown · ${location.host}`;
156
+ }
157
+
158
+ document.getElementById("add-form").addEventListener("submit", async (ev) => {
159
+ ev.preventDefault();
160
+ formErr.hidden = true;
161
+ try {
162
+ const goal = document.getElementById("goal").value.trim();
163
+ const deadlineAt = await parseDeadline(document.getElementById("deadline").value);
164
+ const kind = kindEl.value;
165
+ const parentId = kind === "slice" ? document.getElementById("under").value.trim() : undefined;
166
+ if (kind === "slice" && !parentId) throw new Error("slice needs under scope id");
167
+ await api("/targets", {
168
+ method: "POST",
169
+ body: JSON.stringify({ goal, deadlineAt, kind, parentId }),
170
+ });
171
+ document.getElementById("goal").value = "";
172
+ await refresh();
173
+ } catch (e) {
174
+ formErr.hidden = false;
175
+ formErr.textContent = e.message || String(e);
176
+ }
177
+ });
178
+
179
+ document.getElementById("refresh").addEventListener("click", () => refresh().catch(console.error));
180
+ document.getElementById("show-all").addEventListener("change", () => refresh().catch(console.error));
181
+
182
+ refresh().catch((e) => {
183
+ metaEl.textContent = "API error";
184
+ formErr.hidden = false;
185
+ formErr.textContent = e.message || String(e);
186
+ });