@useorgx/openclaw-plugin 0.3.0 → 0.3.2

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 (87) hide show
  1. package/README.md +48 -1
  2. package/dashboard/dist/assets/MissionControlView-CthHdl6R.js +1 -0
  3. package/dashboard/dist/assets/SessionInspector-Dq0Z5WMo.js +1 -0
  4. package/dashboard/dist/assets/index-CoLgC4zE.js +11 -0
  5. package/dashboard/dist/assets/index-jfEYE0kO.css +1 -0
  6. package/dashboard/dist/assets/motion-CVDprFZg.js +9 -0
  7. package/dashboard/dist/assets/orgx-logo-Fm0FhtnV.png +0 -0
  8. package/dashboard/dist/assets/react-vendor-C2t2w4r2.js +32 -0
  9. package/dashboard/dist/assets/tanstack-C-KIc3Wc.js +1 -0
  10. package/dashboard/dist/assets/vendor-C-AHK0Ly.js +9 -0
  11. package/dashboard/dist/index.html +6 -2
  12. package/dist/adapters/outbox.d.ts +8 -0
  13. package/dist/adapters/outbox.d.ts.map +1 -0
  14. package/dist/adapters/outbox.js +6 -0
  15. package/dist/adapters/outbox.js.map +1 -0
  16. package/dist/agent-context-store.d.ts +24 -0
  17. package/dist/agent-context-store.d.ts.map +1 -0
  18. package/dist/agent-context-store.js +111 -0
  19. package/dist/agent-context-store.js.map +1 -0
  20. package/dist/agent-run-store.d.ts +31 -0
  21. package/dist/agent-run-store.d.ts.map +1 -0
  22. package/dist/agent-run-store.js +159 -0
  23. package/dist/agent-run-store.js.map +1 -0
  24. package/dist/api.d.ts +4 -139
  25. package/dist/api.d.ts.map +1 -1
  26. package/dist/api.js +4 -347
  27. package/dist/api.js.map +1 -1
  28. package/dist/auth-store.d.ts.map +1 -1
  29. package/dist/auth-store.js +56 -35
  30. package/dist/auth-store.js.map +1 -1
  31. package/dist/byok-store.d.ts +11 -0
  32. package/dist/byok-store.d.ts.map +1 -0
  33. package/dist/byok-store.js +98 -0
  34. package/dist/byok-store.js.map +1 -0
  35. package/dist/contracts/client.d.ts +154 -0
  36. package/dist/contracts/client.d.ts.map +1 -0
  37. package/dist/contracts/client.js +422 -0
  38. package/dist/contracts/client.js.map +1 -0
  39. package/dist/contracts/types.d.ts +430 -0
  40. package/dist/contracts/types.d.ts.map +1 -0
  41. package/dist/contracts/types.js +8 -0
  42. package/dist/contracts/types.js.map +1 -0
  43. package/dist/fs-utils.d.ts +7 -0
  44. package/dist/fs-utils.d.ts.map +1 -0
  45. package/dist/fs-utils.js +63 -0
  46. package/dist/fs-utils.js.map +1 -0
  47. package/dist/http-handler.d.ts +27 -1
  48. package/dist/http-handler.d.ts.map +1 -1
  49. package/dist/http-handler.js +2520 -92
  50. package/dist/http-handler.js.map +1 -1
  51. package/dist/index.d.ts.map +1 -1
  52. package/dist/index.js +352 -27
  53. package/dist/index.js.map +1 -1
  54. package/dist/local-openclaw.d.ts.map +1 -1
  55. package/dist/local-openclaw.js +57 -15
  56. package/dist/local-openclaw.js.map +1 -1
  57. package/dist/mcp-apps/orgx-live.html +690 -0
  58. package/dist/openclaw.plugin.json +3 -3
  59. package/dist/outbox.d.ts +7 -0
  60. package/dist/outbox.d.ts.map +1 -1
  61. package/dist/outbox.js +150 -17
  62. package/dist/outbox.js.map +1 -1
  63. package/dist/paths.d.ts +23 -0
  64. package/dist/paths.d.ts.map +1 -0
  65. package/dist/paths.js +50 -0
  66. package/dist/paths.js.map +1 -0
  67. package/dist/reporting/outbox-replay.d.ts +2 -0
  68. package/dist/reporting/outbox-replay.d.ts.map +1 -0
  69. package/dist/reporting/outbox-replay.js +17 -0
  70. package/dist/reporting/outbox-replay.js.map +1 -0
  71. package/dist/reporting/rollups.d.ts +21 -0
  72. package/dist/reporting/rollups.d.ts.map +1 -0
  73. package/dist/reporting/rollups.js +85 -0
  74. package/dist/reporting/rollups.js.map +1 -0
  75. package/dist/snapshot-store.d.ts +10 -0
  76. package/dist/snapshot-store.d.ts.map +1 -0
  77. package/dist/snapshot-store.js +68 -0
  78. package/dist/snapshot-store.js.map +1 -0
  79. package/dist/types.d.ts +5 -410
  80. package/dist/types.d.ts.map +1 -1
  81. package/dist/types.js +5 -4
  82. package/dist/types.js.map +1 -1
  83. package/openclaw.plugin.json +3 -3
  84. package/package.json +13 -3
  85. package/dashboard/dist/assets/index-BrAP-X_H.css +0 -1
  86. package/dashboard/dist/assets/index-cOk6qwh-.js +0 -56
  87. package/dashboard/dist/assets/orgx-logo-QSE5QWy4.png +0 -0
package/dist/outbox.d.ts CHANGED
@@ -12,9 +12,16 @@ export interface OutboxEvent {
12
12
  /** Converted to a LiveActivityItem for dashboard display. */
13
13
  activityItem: LiveActivityItem;
14
14
  }
15
+ export interface OutboxSummary {
16
+ pendingTotal: number;
17
+ pendingByQueue: Record<string, number>;
18
+ oldestEventAt: string | null;
19
+ newestEventAt: string | null;
20
+ }
15
21
  export declare function readOutbox(sessionId: string): Promise<OutboxEvent[]>;
16
22
  export declare function appendToOutbox(sessionId: string, event: OutboxEvent): Promise<void>;
17
23
  export declare function replaceOutbox(sessionId: string, events: OutboxEvent[]): Promise<void>;
18
24
  export declare function readAllOutboxItems(): Promise<LiveActivityItem[]>;
25
+ export declare function readOutboxSummary(): Promise<OutboxSummary>;
19
26
  export declare function clearOutbox(sessionId: string): Promise<void>;
20
27
  //# sourceMappingURL=outbox.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"outbox.d.ts","sourceRoot":"","sources":["../src/outbox.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAInD,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,UAAU,GAAG,UAAU,GAAG,UAAU,GAAG,WAAW,CAAC;IACzD,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,6DAA6D;IAC7D,YAAY,EAAE,gBAAgB,CAAC;CAChC;AAcD,wBAAsB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAO1E;AAED,wBAAsB,cAAc,CAClC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,WAAW,GACjB,OAAO,CAAC,IAAI,CAAC,CAKf;AAED,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,WAAW,EAAE,GACpB,OAAO,CAAC,IAAI,CAAC,CAaf;AAED,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAwBtE;AAED,wBAAsB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAOlE"}
1
+ {"version":3,"file":"outbox.d.ts","sourceRoot":"","sources":["../src/outbox.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAaH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAkCnD,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,UAAU,GAAG,UAAU,GAAG,UAAU,GAAG,WAAW,CAAC;IACzD,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,6DAA6D;IAC7D,YAAY,EAAE,gBAAgB,CAAC;CAChC;AAED,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AA6DD,wBAAsB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAc1E;AAED,wBAAsB,cAAc,CAClC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,WAAW,GACjB,OAAO,CAAC,IAAI,CAAC,CAWf;AAED,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,WAAW,EAAE,GACpB,OAAO,CAAC,IAAI,CAAC,CAaf;AAED,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAuBtE;AAED,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,aAAa,CAAC,CA8ChE;AAED,wBAAsB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAMlE"}
package/dist/outbox.js CHANGED
@@ -3,25 +3,104 @@
3
3
  * Buffers structured OrgX events when cloud API is unreachable.
4
4
  * Events are flushed on next successful sync.
5
5
  */
6
- import { homedir } from "node:os";
7
6
  import { join } from "node:path";
8
- import { readFile, writeFile, mkdir } from "node:fs/promises";
9
- const OUTBOX_DIR = join(homedir(), ".openclaw", "orgx-outbox");
7
+ import { readFile, writeFile, mkdir, chmod, rename, unlink, readdir, } from "node:fs/promises";
8
+ import { randomUUID } from "node:crypto";
9
+ import { getOrgxOutboxDir } from "./paths.js";
10
+ function outboxDir() {
11
+ return getOrgxOutboxDir();
12
+ }
13
+ function isSafeOutboxSessionId(value) {
14
+ const normalized = value.trim();
15
+ if (!normalized || normalized === "." || normalized === "..")
16
+ return false;
17
+ if (normalized.includes("/") || normalized.includes("\\") || normalized.includes("\0")) {
18
+ return false;
19
+ }
20
+ if (normalized.includes(".."))
21
+ return false;
22
+ return true;
23
+ }
24
+ function normalizeSessionId(sessionId) {
25
+ const normalized = sessionId.trim();
26
+ if (!isSafeOutboxSessionId(normalized)) {
27
+ throw new Error("Invalid outbox session identifier");
28
+ }
29
+ return normalized;
30
+ }
31
+ async function hardenPath(path, mode) {
32
+ try {
33
+ await chmod(path, mode);
34
+ }
35
+ catch {
36
+ // best effort
37
+ }
38
+ }
10
39
  async function ensureDir() {
40
+ const dir = outboxDir();
11
41
  try {
12
- await mkdir(OUTBOX_DIR, { recursive: true });
42
+ await mkdir(dir, { recursive: true, mode: 0o700 });
43
+ await hardenPath(dir, 0o700);
13
44
  }
14
45
  catch {
15
46
  // Directory may already exist
16
47
  }
17
48
  }
18
49
  function outboxPath(sessionId) {
19
- return join(OUTBOX_DIR, `${sessionId}.json`);
50
+ return join(outboxDir(), `${normalizeSessionId(sessionId)}.json`);
51
+ }
52
+ async function backupCorruptOutboxFile(targetPath) {
53
+ // Preserve the corrupted file for debugging, but move it out of the hot path.
54
+ const suffix = `${Date.now()}-${randomUUID().slice(0, 8)}`;
55
+ const backupPath = `${targetPath}.corrupt.${suffix}`;
56
+ try {
57
+ await rename(targetPath, backupPath);
58
+ await hardenPath(backupPath, 0o600);
59
+ }
60
+ catch {
61
+ // best effort
62
+ }
63
+ }
64
+ async function writeFileAtomic(targetPath, content, mode) {
65
+ // Atomic write to avoid partial JSON files if we crash mid-write.
66
+ const tmpPath = `${targetPath}.tmp.${process.pid}.${randomUUID().slice(0, 8)}`;
67
+ await writeFile(tmpPath, content, { encoding: "utf8", mode });
68
+ await hardenPath(tmpPath, mode);
69
+ try {
70
+ await rename(tmpPath, targetPath);
71
+ }
72
+ catch (err) {
73
+ // On Windows, rename can fail if the destination exists. Best-effort fallback:
74
+ // remove the destination and retry. This is not strictly atomic, but avoids
75
+ // leaving the outbox unreadable.
76
+ const code = err && typeof err === "object" ? err.code : null;
77
+ if (code === "EEXIST" || code === "EPERM" || code === "EACCES") {
78
+ try {
79
+ await unlink(targetPath);
80
+ }
81
+ catch {
82
+ // ignore
83
+ }
84
+ await rename(tmpPath, targetPath);
85
+ }
86
+ else {
87
+ throw err;
88
+ }
89
+ }
90
+ await hardenPath(targetPath, mode);
20
91
  }
21
92
  export async function readOutbox(sessionId) {
93
+ const targetPath = outboxPath(sessionId);
22
94
  try {
23
- const raw = await readFile(outboxPath(sessionId), "utf8");
24
- return JSON.parse(raw);
95
+ const raw = await readFile(targetPath, "utf8");
96
+ try {
97
+ const parsed = JSON.parse(raw);
98
+ return Array.isArray(parsed) ? parsed : [];
99
+ }
100
+ catch {
101
+ await backupCorruptOutboxFile(targetPath);
102
+ return [];
103
+ }
25
104
  }
26
105
  catch {
27
106
  return [];
@@ -29,16 +108,23 @@ export async function readOutbox(sessionId) {
29
108
  }
30
109
  export async function appendToOutbox(sessionId, event) {
31
110
  await ensureDir();
111
+ const targetPath = outboxPath(sessionId);
32
112
  const existing = await readOutbox(sessionId);
33
- existing.push(event);
34
- await writeFile(outboxPath(sessionId), JSON.stringify(existing, null, 2), "utf8");
113
+ const idx = existing.findIndex((item) => item.id === event.id);
114
+ if (idx >= 0) {
115
+ existing[idx] = event;
116
+ }
117
+ else {
118
+ existing.push(event);
119
+ }
120
+ await writeFileAtomic(targetPath, JSON.stringify(existing, null, 2), 0o600);
35
121
  }
36
122
  export async function replaceOutbox(sessionId, events) {
37
123
  await ensureDir();
124
+ const targetPath = outboxPath(sessionId);
38
125
  if (events.length === 0) {
39
126
  try {
40
- const { unlink } = await import("node:fs/promises");
41
- await unlink(outboxPath(sessionId));
127
+ await unlink(targetPath);
42
128
  return;
43
129
  }
44
130
  catch {
@@ -46,20 +132,19 @@ export async function replaceOutbox(sessionId, events) {
46
132
  return;
47
133
  }
48
134
  }
49
- await writeFile(outboxPath(sessionId), JSON.stringify(events, null, 2), "utf8");
135
+ await writeFileAtomic(targetPath, JSON.stringify(events, null, 2), 0o600);
50
136
  }
51
137
  export async function readAllOutboxItems() {
52
138
  try {
53
139
  await ensureDir();
54
- const { readdir } = await import("node:fs/promises");
55
- const files = await readdir(OUTBOX_DIR);
140
+ const files = await readdir(outboxDir());
56
141
  const items = [];
57
142
  for (const file of files) {
58
143
  if (!file.endsWith(".json"))
59
144
  continue;
145
+ const sessionId = file.slice(0, -5);
60
146
  try {
61
- const raw = await readFile(join(OUTBOX_DIR, file), "utf8");
62
- const events = JSON.parse(raw);
147
+ const events = await readOutbox(sessionId);
63
148
  for (const evt of events) {
64
149
  items.push(evt.activityItem);
65
150
  }
@@ -74,9 +159,57 @@ export async function readAllOutboxItems() {
74
159
  return [];
75
160
  }
76
161
  }
162
+ export async function readOutboxSummary() {
163
+ try {
164
+ await ensureDir();
165
+ const files = await readdir(outboxDir());
166
+ const pendingByQueue = {};
167
+ let pendingTotal = 0;
168
+ let oldestEpoch = Number.POSITIVE_INFINITY;
169
+ let newestEpoch = Number.NEGATIVE_INFINITY;
170
+ for (const file of files) {
171
+ if (!file.endsWith(".json"))
172
+ continue;
173
+ const queueId = file.slice(0, -5);
174
+ try {
175
+ const events = await readOutbox(queueId);
176
+ const count = Array.isArray(events) ? events.length : 0;
177
+ pendingByQueue[queueId] = count;
178
+ pendingTotal += count;
179
+ for (const event of events) {
180
+ const epoch = Date.parse(event.timestamp);
181
+ if (!Number.isFinite(epoch))
182
+ continue;
183
+ oldestEpoch = Math.min(oldestEpoch, epoch);
184
+ newestEpoch = Math.max(newestEpoch, epoch);
185
+ }
186
+ }
187
+ catch {
188
+ pendingByQueue[queueId] = pendingByQueue[queueId] ?? 0;
189
+ }
190
+ }
191
+ return {
192
+ pendingTotal,
193
+ pendingByQueue,
194
+ oldestEventAt: Number.isFinite(oldestEpoch)
195
+ ? new Date(oldestEpoch).toISOString()
196
+ : null,
197
+ newestEventAt: Number.isFinite(newestEpoch)
198
+ ? new Date(newestEpoch).toISOString()
199
+ : null,
200
+ };
201
+ }
202
+ catch {
203
+ return {
204
+ pendingTotal: 0,
205
+ pendingByQueue: {},
206
+ oldestEventAt: null,
207
+ newestEventAt: null,
208
+ };
209
+ }
210
+ }
77
211
  export async function clearOutbox(sessionId) {
78
212
  try {
79
- const { unlink } = await import("node:fs/promises");
80
213
  await unlink(outboxPath(sessionId));
81
214
  }
82
215
  catch {
@@ -1 +1 @@
1
- {"version":3,"file":"outbox.js","sourceRoot":"","sources":["../src/outbox.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"outbox.js","sourceRoot":"","sources":["../src/outbox.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Root directory for persistent OrgX plugin files.
3
+ *
4
+ * Default: `~/.config/useorgx/openclaw-plugin`
5
+ * Override: `ORGX_OPENCLAW_PLUGIN_CONFIG_DIR`
6
+ */
7
+ export declare function getOrgxPluginConfigDir(): string;
8
+ export declare function getOrgxPluginConfigPath(filename: string): string;
9
+ /**
10
+ * Root directory for OpenClaw local files.
11
+ *
12
+ * Default: `~/.openclaw`
13
+ * Override: `OPENCLAW_HOME`
14
+ */
15
+ export declare function getOpenClawDir(): string;
16
+ /**
17
+ * Root directory for the OrgX outbox queue.
18
+ *
19
+ * Default: `~/.openclaw/orgx-outbox`
20
+ * Override: `ORGX_OUTBOX_DIR`
21
+ */
22
+ export declare function getOrgxOutboxDir(): string;
23
+ //# sourceMappingURL=paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAUA;;;;;GAKG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAI/C;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAIvC;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAIzC"}
package/dist/paths.js ADDED
@@ -0,0 +1,50 @@
1
+ import { homedir } from "node:os";
2
+ import { join, resolve } from "node:path";
3
+ function normalizeDirOverride(value) {
4
+ const trimmed = (value ?? "").trim();
5
+ if (!trimmed)
6
+ return null;
7
+ if (trimmed.includes("\0"))
8
+ return null;
9
+ return trimmed;
10
+ }
11
+ /**
12
+ * Root directory for persistent OrgX plugin files.
13
+ *
14
+ * Default: `~/.config/useorgx/openclaw-plugin`
15
+ * Override: `ORGX_OPENCLAW_PLUGIN_CONFIG_DIR`
16
+ */
17
+ export function getOrgxPluginConfigDir() {
18
+ const override = normalizeDirOverride(process.env.ORGX_OPENCLAW_PLUGIN_CONFIG_DIR);
19
+ if (override)
20
+ return resolve(override);
21
+ return join(homedir(), ".config", "useorgx", "openclaw-plugin");
22
+ }
23
+ export function getOrgxPluginConfigPath(filename) {
24
+ return join(getOrgxPluginConfigDir(), filename);
25
+ }
26
+ /**
27
+ * Root directory for OpenClaw local files.
28
+ *
29
+ * Default: `~/.openclaw`
30
+ * Override: `OPENCLAW_HOME`
31
+ */
32
+ export function getOpenClawDir() {
33
+ const override = normalizeDirOverride(process.env.OPENCLAW_HOME);
34
+ if (override)
35
+ return resolve(override);
36
+ return join(homedir(), ".openclaw");
37
+ }
38
+ /**
39
+ * Root directory for the OrgX outbox queue.
40
+ *
41
+ * Default: `~/.openclaw/orgx-outbox`
42
+ * Override: `ORGX_OUTBOX_DIR`
43
+ */
44
+ export function getOrgxOutboxDir() {
45
+ const override = normalizeDirOverride(process.env.ORGX_OUTBOX_DIR);
46
+ if (override)
47
+ return resolve(override);
48
+ return join(getOpenClawDir(), "orgx-outbox");
49
+ }
50
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE1C,SAAS,oBAAoB,CAAC,KAAyB;IACrD,MAAM,OAAO,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACrC,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1B,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACxC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB;IACpC,MAAM,QAAQ,GAAG,oBAAoB,CAAC,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;IACnF,IAAI,QAAQ;QAAE,OAAO,OAAO,CAAC,QAAQ,CAAC,CAAC;IACvC,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,iBAAiB,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,QAAgB;IACtD,OAAO,IAAI,CAAC,sBAAsB,EAAE,EAAE,QAAQ,CAAC,CAAC;AAClD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc;IAC5B,MAAM,QAAQ,GAAG,oBAAoB,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IACjE,IAAI,QAAQ;QAAE,OAAO,OAAO,CAAC,QAAQ,CAAC,CAAC;IACvC,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;AACtC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB;IAC9B,MAAM,QAAQ,GAAG,oBAAoB,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IACnE,IAAI,QAAQ;QAAE,OAAO,OAAO,CAAC,QAAQ,CAAC,CAAC;IACvC,OAAO,IAAI,CAAC,cAAc,EAAE,EAAE,aAAa,CAAC,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function extractProgressOutboxMessage(payload: Record<string, unknown>): string | null;
2
+ //# sourceMappingURL=outbox-replay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outbox-replay.d.ts","sourceRoot":"","sources":["../../src/reporting/outbox-replay.ts"],"names":[],"mappings":"AAAA,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,MAAM,GAAG,IAAI,CAef"}
@@ -0,0 +1,17 @@
1
+ export function extractProgressOutboxMessage(payload) {
2
+ const messageRaw = payload.message;
3
+ if (typeof messageRaw === "string") {
4
+ const trimmed = messageRaw.trim();
5
+ if (trimmed.length > 0)
6
+ return trimmed;
7
+ }
8
+ // Backward compatibility: some older outbox payloads used `summary`.
9
+ const summaryRaw = payload.summary;
10
+ if (typeof summaryRaw === "string") {
11
+ const trimmed = summaryRaw.trim();
12
+ if (trimmed.length > 0)
13
+ return trimmed;
14
+ }
15
+ return null;
16
+ }
17
+ //# sourceMappingURL=outbox-replay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outbox-replay.js","sourceRoot":"","sources":["../../src/reporting/outbox-replay.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,4BAA4B,CAC1C,OAAgC;IAEhC,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC;IACnC,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC;QAClC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,OAAO,CAAC;IACzC,CAAC;IAED,qEAAqE;IACrE,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC;IACnC,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC;QAClC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,OAAO,CAAC;IACzC,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,21 @@
1
+ export type TaskStateBucket = "done" | "blocked" | "active" | "todo";
2
+ export declare function classifyTaskState(status: unknown): TaskStateBucket;
3
+ export type TaskStatusCounts = {
4
+ total: number;
5
+ done: number;
6
+ blocked: number;
7
+ active: number;
8
+ todo: number;
9
+ };
10
+ export declare function summarizeTaskStatuses(taskStatuses?: unknown[]): TaskStatusCounts;
11
+ export type MilestoneRollupStatus = "planned" | "in_progress" | "at_risk" | "completed";
12
+ export type WorkstreamRollupStatus = "not_started" | "active" | "blocked" | "done";
13
+ export declare function computeMilestoneRollup(taskStatuses?: unknown[]): TaskStatusCounts & {
14
+ status: MilestoneRollupStatus;
15
+ progressPct: number;
16
+ };
17
+ export declare function computeWorkstreamRollup(taskStatuses?: unknown[]): TaskStatusCounts & {
18
+ status: WorkstreamRollupStatus;
19
+ progressPct: number;
20
+ };
21
+ //# sourceMappingURL=rollups.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rollups.d.ts","sourceRoot":"","sources":["../../src/reporting/rollups.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;AAErE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,OAAO,GAAG,eAAe,CAwBlE;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,YAAY,GAAE,OAAO,EAAO,GAAG,gBAAgB,CAepF;AAOD,MAAM,MAAM,qBAAqB,GAAG,SAAS,GAAG,aAAa,GAAG,SAAS,GAAG,WAAW,CAAC;AACxF,MAAM,MAAM,sBAAsB,GAAG,aAAa,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;AAEnF,wBAAgB,sBAAsB,CAAC,YAAY,GAAE,OAAO,EAAO,GAAG,gBAAgB,GAAG;IACvF,MAAM,EAAE,qBAAqB,CAAC;IAC9B,WAAW,EAAE,MAAM,CAAC;CACrB,CAoBA;AAED,wBAAgB,uBAAuB,CAAC,YAAY,GAAE,OAAO,EAAO,GAAG,gBAAgB,GAAG;IACxF,MAAM,EAAE,sBAAsB,CAAC;IAC/B,WAAW,EAAE,MAAM,CAAC;CACrB,CAoBA"}
@@ -0,0 +1,85 @@
1
+ export function classifyTaskState(status) {
2
+ const normalized = String(status ?? "").trim().toLowerCase();
3
+ if (normalized === "done" ||
4
+ normalized === "completed" ||
5
+ normalized === "cancelled" ||
6
+ normalized === "archived" ||
7
+ normalized === "deleted") {
8
+ return "done";
9
+ }
10
+ if (normalized === "blocked" || normalized === "at_risk") {
11
+ return "blocked";
12
+ }
13
+ if (normalized === "in_progress" ||
14
+ normalized === "active" ||
15
+ normalized === "running" ||
16
+ normalized === "queued" ||
17
+ normalized === "retry_pending") {
18
+ return "active";
19
+ }
20
+ return "todo";
21
+ }
22
+ export function summarizeTaskStatuses(taskStatuses = []) {
23
+ const counts = {
24
+ total: taskStatuses.length,
25
+ done: 0,
26
+ blocked: 0,
27
+ active: 0,
28
+ todo: 0,
29
+ };
30
+ for (const status of taskStatuses) {
31
+ const bucket = classifyTaskState(status);
32
+ counts[bucket] += 1;
33
+ }
34
+ return counts;
35
+ }
36
+ function toPercent(numerator, denominator) {
37
+ if (!Number.isFinite(numerator) || !Number.isFinite(denominator) || denominator <= 0)
38
+ return 0;
39
+ return Math.max(0, Math.min(100, Math.round((numerator / denominator) * 100)));
40
+ }
41
+ export function computeMilestoneRollup(taskStatuses = []) {
42
+ const counts = summarizeTaskStatuses(taskStatuses);
43
+ const progressPct = toPercent(counts.done, counts.total);
44
+ let status = "planned";
45
+ if (counts.total <= 0) {
46
+ status = "planned";
47
+ }
48
+ else if (counts.done >= counts.total) {
49
+ status = "completed";
50
+ }
51
+ else if (counts.blocked > 0 && counts.active === 0) {
52
+ status = "at_risk";
53
+ }
54
+ else if (counts.active > 0 || counts.done > 0) {
55
+ status = "in_progress";
56
+ }
57
+ return {
58
+ ...counts,
59
+ status,
60
+ progressPct,
61
+ };
62
+ }
63
+ export function computeWorkstreamRollup(taskStatuses = []) {
64
+ const counts = summarizeTaskStatuses(taskStatuses);
65
+ const progressPct = toPercent(counts.done, counts.total);
66
+ let status = "not_started";
67
+ if (counts.total <= 0) {
68
+ status = "not_started";
69
+ }
70
+ else if (counts.done >= counts.total) {
71
+ status = "done";
72
+ }
73
+ else if (counts.blocked > 0 && counts.active === 0) {
74
+ status = "blocked";
75
+ }
76
+ else if (counts.active > 0 || counts.done > 0) {
77
+ status = "active";
78
+ }
79
+ return {
80
+ ...counts,
81
+ status,
82
+ progressPct,
83
+ };
84
+ }
85
+ //# sourceMappingURL=rollups.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rollups.js","sourceRoot":"","sources":["../../src/reporting/rollups.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { OrgSnapshot } from './types.js';
2
+ interface PersistedSnapshot {
3
+ snapshot: OrgSnapshot;
4
+ updatedAt: string;
5
+ }
6
+ export declare function readPersistedSnapshot(): PersistedSnapshot | null;
7
+ export declare function writePersistedSnapshot(snapshot: OrgSnapshot): PersistedSnapshot;
8
+ export declare function clearPersistedSnapshot(): void;
9
+ export {};
10
+ //# sourceMappingURL=snapshot-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot-store.d.ts","sourceRoot":"","sources":["../src/snapshot-store.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAa9C,UAAU,iBAAiB;IACzB,QAAQ,EAAE,WAAW,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB;AAoBD,wBAAgB,qBAAqB,IAAI,iBAAiB,GAAG,IAAI,CAgBhE;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,WAAW,GAAG,iBAAiB,CAW/E;AAED,wBAAgB,sBAAsB,IAAI,IAAI,CAO7C"}
@@ -0,0 +1,68 @@
1
+ import { mkdirSync, readFileSync, chmodSync, existsSync, rmSync } from 'node:fs';
2
+ import { getOrgxPluginConfigDir, getOrgxPluginConfigPath } from './paths.js';
3
+ import { backupCorruptFileSync, writeJsonFileAtomicSync } from './fs-utils.js';
4
+ function snapshotDir() {
5
+ return getOrgxPluginConfigDir();
6
+ }
7
+ function snapshotFile() {
8
+ return getOrgxPluginConfigPath('snapshot.json');
9
+ }
10
+ function ensureSnapshotDir() {
11
+ const dir = snapshotDir();
12
+ mkdirSync(dir, { recursive: true, mode: 0o700 });
13
+ try {
14
+ chmodSync(dir, 0o700);
15
+ }
16
+ catch {
17
+ // best effort
18
+ }
19
+ }
20
+ function parseJson(value) {
21
+ try {
22
+ return JSON.parse(value);
23
+ }
24
+ catch {
25
+ return null;
26
+ }
27
+ }
28
+ export function readPersistedSnapshot() {
29
+ const file = snapshotFile();
30
+ try {
31
+ if (!existsSync(file))
32
+ return null;
33
+ const raw = readFileSync(file, 'utf8');
34
+ const parsed = parseJson(raw);
35
+ if (!parsed) {
36
+ backupCorruptFileSync(file);
37
+ return null;
38
+ }
39
+ if (!parsed || typeof parsed.updatedAt !== 'string')
40
+ return null;
41
+ if (!parsed.snapshot || typeof parsed.snapshot !== 'object')
42
+ return null;
43
+ return parsed;
44
+ }
45
+ catch {
46
+ return null;
47
+ }
48
+ }
49
+ export function writePersistedSnapshot(snapshot) {
50
+ ensureSnapshotDir();
51
+ const record = {
52
+ snapshot,
53
+ updatedAt: new Date().toISOString(),
54
+ };
55
+ const file = snapshotFile();
56
+ writeJsonFileAtomicSync(file, record, 0o600);
57
+ return record;
58
+ }
59
+ export function clearPersistedSnapshot() {
60
+ const file = snapshotFile();
61
+ try {
62
+ rmSync(file, { force: true });
63
+ }
64
+ catch {
65
+ // best effort
66
+ }
67
+ }
68
+ //# sourceMappingURL=snapshot-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot-store.js","sourceRoot":"","sources":["../src/snapshot-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAIjF,OAAO,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAC7E,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAE/E,SAAS,WAAW;IAClB,OAAO,sBAAsB,EAAE,CAAC;AAClC,CAAC;AAED,SAAS,YAAY;IACnB,OAAO,uBAAuB,CAAC,eAAe,CAAC,CAAC;AAClD,CAAC;AAOD,SAAS,iBAAiB;IACxB,MAAM,GAAG,GAAG,WAAW,EAAE,CAAC;IAC1B,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACjD,IAAI,CAAC;QACH,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,cAAc;IAChB,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAI,KAAa;IACjC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAM,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,MAAM,IAAI,GAAG,YAAY,EAAE,CAAC;IAC5B,IAAI,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QACnC,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACvC,MAAM,MAAM,GAAG,SAAS,CAAoB,GAAG,CAAC,CAAC;QACjD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,qBAAqB,CAAC,IAAI,CAAC,CAAC;YAC5B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QACjE,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QACzE,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,QAAqB;IAC1D,iBAAiB,EAAE,CAAC;IACpB,MAAM,MAAM,GAAsB;QAChC,QAAQ;QACR,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC;IAEF,MAAM,IAAI,GAAG,YAAY,EAAE,CAAC;IAC5B,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IAE7C,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,sBAAsB;IACpC,MAAM,IAAI,GAAG,YAAY,EAAE,CAAC;IAC5B,IAAI,CAAC;QACH,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,cAAc;IAChB,CAAC;AACH,CAAC"}