@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.
- package/README.md +48 -1
- package/dashboard/dist/assets/MissionControlView-CthHdl6R.js +1 -0
- package/dashboard/dist/assets/SessionInspector-Dq0Z5WMo.js +1 -0
- package/dashboard/dist/assets/index-CoLgC4zE.js +11 -0
- package/dashboard/dist/assets/index-jfEYE0kO.css +1 -0
- package/dashboard/dist/assets/motion-CVDprFZg.js +9 -0
- package/dashboard/dist/assets/orgx-logo-Fm0FhtnV.png +0 -0
- package/dashboard/dist/assets/react-vendor-C2t2w4r2.js +32 -0
- package/dashboard/dist/assets/tanstack-C-KIc3Wc.js +1 -0
- package/dashboard/dist/assets/vendor-C-AHK0Ly.js +9 -0
- package/dashboard/dist/index.html +6 -2
- package/dist/adapters/outbox.d.ts +8 -0
- package/dist/adapters/outbox.d.ts.map +1 -0
- package/dist/adapters/outbox.js +6 -0
- package/dist/adapters/outbox.js.map +1 -0
- package/dist/agent-context-store.d.ts +24 -0
- package/dist/agent-context-store.d.ts.map +1 -0
- package/dist/agent-context-store.js +111 -0
- package/dist/agent-context-store.js.map +1 -0
- package/dist/agent-run-store.d.ts +31 -0
- package/dist/agent-run-store.d.ts.map +1 -0
- package/dist/agent-run-store.js +159 -0
- package/dist/agent-run-store.js.map +1 -0
- package/dist/api.d.ts +4 -139
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +4 -347
- package/dist/api.js.map +1 -1
- package/dist/auth-store.d.ts.map +1 -1
- package/dist/auth-store.js +56 -35
- package/dist/auth-store.js.map +1 -1
- package/dist/byok-store.d.ts +11 -0
- package/dist/byok-store.d.ts.map +1 -0
- package/dist/byok-store.js +98 -0
- package/dist/byok-store.js.map +1 -0
- package/dist/contracts/client.d.ts +154 -0
- package/dist/contracts/client.d.ts.map +1 -0
- package/dist/contracts/client.js +422 -0
- package/dist/contracts/client.js.map +1 -0
- package/dist/contracts/types.d.ts +430 -0
- package/dist/contracts/types.d.ts.map +1 -0
- package/dist/contracts/types.js +8 -0
- package/dist/contracts/types.js.map +1 -0
- package/dist/fs-utils.d.ts +7 -0
- package/dist/fs-utils.d.ts.map +1 -0
- package/dist/fs-utils.js +63 -0
- package/dist/fs-utils.js.map +1 -0
- package/dist/http-handler.d.ts +27 -1
- package/dist/http-handler.d.ts.map +1 -1
- package/dist/http-handler.js +2520 -92
- package/dist/http-handler.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +352 -27
- package/dist/index.js.map +1 -1
- package/dist/local-openclaw.d.ts.map +1 -1
- package/dist/local-openclaw.js +57 -15
- package/dist/local-openclaw.js.map +1 -1
- package/dist/mcp-apps/orgx-live.html +690 -0
- package/dist/openclaw.plugin.json +3 -3
- package/dist/outbox.d.ts +7 -0
- package/dist/outbox.d.ts.map +1 -1
- package/dist/outbox.js +150 -17
- package/dist/outbox.js.map +1 -1
- package/dist/paths.d.ts +23 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +50 -0
- package/dist/paths.js.map +1 -0
- package/dist/reporting/outbox-replay.d.ts +2 -0
- package/dist/reporting/outbox-replay.d.ts.map +1 -0
- package/dist/reporting/outbox-replay.js +17 -0
- package/dist/reporting/outbox-replay.js.map +1 -0
- package/dist/reporting/rollups.d.ts +21 -0
- package/dist/reporting/rollups.d.ts.map +1 -0
- package/dist/reporting/rollups.js +85 -0
- package/dist/reporting/rollups.js.map +1 -0
- package/dist/snapshot-store.d.ts +10 -0
- package/dist/snapshot-store.d.ts.map +1 -0
- package/dist/snapshot-store.js +68 -0
- package/dist/snapshot-store.js.map +1 -0
- package/dist/types.d.ts +5 -410
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +5 -4
- package/dist/types.js.map +1 -1
- package/openclaw.plugin.json +3 -3
- package/package.json +13 -3
- package/dashboard/dist/assets/index-BrAP-X_H.css +0 -1
- package/dashboard/dist/assets/index-cOk6qwh-.js +0 -56
- 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
|
package/dist/outbox.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"outbox.d.ts","sourceRoot":"","sources":["../src/outbox.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
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
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
24
|
-
|
|
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.
|
|
34
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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 {
|
package/dist/outbox.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"outbox.js","sourceRoot":"","sources":["../src/outbox.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"outbox.js","sourceRoot":"","sources":["../src/outbox.ts"],"names":[],"mappings":"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"}
|
package/dist/paths.d.ts
ADDED
|
@@ -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 @@
|
|
|
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"}
|