@useorgx/openclaw-plugin 0.3.1 → 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/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/agent-context-store.d.ts.map +1 -1
- package/dist/agent-context-store.js +21 -20
- package/dist/agent-context-store.js.map +1 -1
- package/dist/agent-run-store.d.ts.map +1 -1
- package/dist/agent-run-store.js +21 -20
- package/dist/agent-run-store.js.map +1 -1
- package/dist/auth-store.d.ts.map +1 -1
- package/dist/auth-store.js +39 -44
- package/dist/auth-store.js.map +1 -1
- package/dist/byok-store.d.ts.map +1 -1
- package/dist/byok-store.js +24 -20
- package/dist/byok-store.js.map +1 -1
- 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 +17 -0
- package/dist/http-handler.d.ts.map +1 -1
- package/dist/http-handler.js +281 -11
- package/dist/http-handler.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -3
- package/dist/index.js.map +1 -1
- package/dist/mcp-apps/orgx-live.html +690 -0
- package/dist/outbox.d.ts.map +1 -1
- package/dist/outbox.js +74 -29
- 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.map +1 -1
- package/dist/snapshot-store.js +24 -20
- package/dist/snapshot-store.js.map +1 -1
- package/package.json +2 -2
- package/dashboard/dist/assets/index-BjqNjHpY.css +0 -1
- package/dashboard/dist/assets/index-DCLkU4AM.js +0 -57
- package/dashboard/dist/assets/orgx-logo-QSE5QWy4.png +0 -0
package/dist/outbox.js
CHANGED
|
@@ -3,10 +3,13 @@
|
|
|
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, chmod } 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
|
+
}
|
|
10
13
|
function isSafeOutboxSessionId(value) {
|
|
11
14
|
const normalized = value.trim();
|
|
12
15
|
if (!normalized || normalized === "." || normalized === "..")
|
|
@@ -34,21 +37,70 @@ async function hardenPath(path, mode) {
|
|
|
34
37
|
}
|
|
35
38
|
}
|
|
36
39
|
async function ensureDir() {
|
|
40
|
+
const dir = outboxDir();
|
|
37
41
|
try {
|
|
38
|
-
await mkdir(
|
|
39
|
-
await hardenPath(
|
|
42
|
+
await mkdir(dir, { recursive: true, mode: 0o700 });
|
|
43
|
+
await hardenPath(dir, 0o700);
|
|
40
44
|
}
|
|
41
45
|
catch {
|
|
42
46
|
// Directory may already exist
|
|
43
47
|
}
|
|
44
48
|
}
|
|
45
49
|
function outboxPath(sessionId) {
|
|
46
|
-
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);
|
|
47
91
|
}
|
|
48
92
|
export async function readOutbox(sessionId) {
|
|
93
|
+
const targetPath = outboxPath(sessionId);
|
|
49
94
|
try {
|
|
50
|
-
const raw = await readFile(
|
|
51
|
-
|
|
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
|
+
}
|
|
52
104
|
}
|
|
53
105
|
catch {
|
|
54
106
|
return [];
|
|
@@ -58,19 +110,20 @@ export async function appendToOutbox(sessionId, event) {
|
|
|
58
110
|
await ensureDir();
|
|
59
111
|
const targetPath = outboxPath(sessionId);
|
|
60
112
|
const existing = await readOutbox(sessionId);
|
|
61
|
-
existing.
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
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);
|
|
67
121
|
}
|
|
68
122
|
export async function replaceOutbox(sessionId, events) {
|
|
69
123
|
await ensureDir();
|
|
70
124
|
const targetPath = outboxPath(sessionId);
|
|
71
125
|
if (events.length === 0) {
|
|
72
126
|
try {
|
|
73
|
-
const { unlink } = await import("node:fs/promises");
|
|
74
127
|
await unlink(targetPath);
|
|
75
128
|
return;
|
|
76
129
|
}
|
|
@@ -79,24 +132,19 @@ export async function replaceOutbox(sessionId, events) {
|
|
|
79
132
|
return;
|
|
80
133
|
}
|
|
81
134
|
}
|
|
82
|
-
await
|
|
83
|
-
encoding: "utf8",
|
|
84
|
-
mode: 0o600,
|
|
85
|
-
});
|
|
86
|
-
await hardenPath(targetPath, 0o600);
|
|
135
|
+
await writeFileAtomic(targetPath, JSON.stringify(events, null, 2), 0o600);
|
|
87
136
|
}
|
|
88
137
|
export async function readAllOutboxItems() {
|
|
89
138
|
try {
|
|
90
139
|
await ensureDir();
|
|
91
|
-
const
|
|
92
|
-
const files = await readdir(OUTBOX_DIR);
|
|
140
|
+
const files = await readdir(outboxDir());
|
|
93
141
|
const items = [];
|
|
94
142
|
for (const file of files) {
|
|
95
143
|
if (!file.endsWith(".json"))
|
|
96
144
|
continue;
|
|
145
|
+
const sessionId = file.slice(0, -5);
|
|
97
146
|
try {
|
|
98
|
-
const
|
|
99
|
-
const events = JSON.parse(raw);
|
|
147
|
+
const events = await readOutbox(sessionId);
|
|
100
148
|
for (const evt of events) {
|
|
101
149
|
items.push(evt.activityItem);
|
|
102
150
|
}
|
|
@@ -114,8 +162,7 @@ export async function readAllOutboxItems() {
|
|
|
114
162
|
export async function readOutboxSummary() {
|
|
115
163
|
try {
|
|
116
164
|
await ensureDir();
|
|
117
|
-
const
|
|
118
|
-
const files = await readdir(OUTBOX_DIR);
|
|
165
|
+
const files = await readdir(outboxDir());
|
|
119
166
|
const pendingByQueue = {};
|
|
120
167
|
let pendingTotal = 0;
|
|
121
168
|
let oldestEpoch = Number.POSITIVE_INFINITY;
|
|
@@ -125,8 +172,7 @@ export async function readOutboxSummary() {
|
|
|
125
172
|
continue;
|
|
126
173
|
const queueId = file.slice(0, -5);
|
|
127
174
|
try {
|
|
128
|
-
const
|
|
129
|
-
const events = JSON.parse(raw);
|
|
175
|
+
const events = await readOutbox(queueId);
|
|
130
176
|
const count = Array.isArray(events) ? events.length : 0;
|
|
131
177
|
pendingByQueue[queueId] = count;
|
|
132
178
|
pendingTotal += count;
|
|
@@ -164,7 +210,6 @@ export async function readOutboxSummary() {
|
|
|
164
210
|
}
|
|
165
211
|
export async function clearOutbox(sessionId) {
|
|
166
212
|
try {
|
|
167
|
-
const { unlink } = await import("node:fs/promises");
|
|
168
213
|
await unlink(outboxPath(sessionId));
|
|
169
214
|
}
|
|
170
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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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snapshot-store.d.ts","sourceRoot":"","sources":["../src/snapshot-store.ts"],"names":[],"mappings":"
|
|
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"}
|
package/dist/snapshot-store.js
CHANGED
|
@@ -1,12 +1,17 @@
|
|
|
1
|
-
import { mkdirSync, readFileSync,
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
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
|
+
}
|
|
6
10
|
function ensureSnapshotDir() {
|
|
7
|
-
|
|
11
|
+
const dir = snapshotDir();
|
|
12
|
+
mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
8
13
|
try {
|
|
9
|
-
chmodSync(
|
|
14
|
+
chmodSync(dir, 0o700);
|
|
10
15
|
}
|
|
11
16
|
catch {
|
|
12
17
|
// best effort
|
|
@@ -21,10 +26,16 @@ function parseJson(value) {
|
|
|
21
26
|
}
|
|
22
27
|
}
|
|
23
28
|
export function readPersistedSnapshot() {
|
|
29
|
+
const file = snapshotFile();
|
|
24
30
|
try {
|
|
25
|
-
if (!existsSync(
|
|
31
|
+
if (!existsSync(file))
|
|
26
32
|
return null;
|
|
27
|
-
const
|
|
33
|
+
const raw = readFileSync(file, 'utf8');
|
|
34
|
+
const parsed = parseJson(raw);
|
|
35
|
+
if (!parsed) {
|
|
36
|
+
backupCorruptFileSync(file);
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
28
39
|
if (!parsed || typeof parsed.updatedAt !== 'string')
|
|
29
40
|
return null;
|
|
30
41
|
if (!parsed.snapshot || typeof parsed.snapshot !== 'object')
|
|
@@ -41,21 +52,14 @@ export function writePersistedSnapshot(snapshot) {
|
|
|
41
52
|
snapshot,
|
|
42
53
|
updatedAt: new Date().toISOString(),
|
|
43
54
|
};
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
encoding: 'utf8',
|
|
47
|
-
});
|
|
48
|
-
try {
|
|
49
|
-
chmodSync(SNAPSHOT_FILE, 0o600);
|
|
50
|
-
}
|
|
51
|
-
catch {
|
|
52
|
-
// best effort
|
|
53
|
-
}
|
|
55
|
+
const file = snapshotFile();
|
|
56
|
+
writeJsonFileAtomicSync(file, record, 0o600);
|
|
54
57
|
return record;
|
|
55
58
|
}
|
|
56
59
|
export function clearPersistedSnapshot() {
|
|
60
|
+
const file = snapshotFile();
|
|
57
61
|
try {
|
|
58
|
-
rmSync(
|
|
62
|
+
rmSync(file, { force: true });
|
|
59
63
|
}
|
|
60
64
|
catch {
|
|
61
65
|
// best effort
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snapshot-store.js","sourceRoot":"","sources":["../src/snapshot-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,
|
|
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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@useorgx/openclaw-plugin",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.2",
|
|
4
4
|
"description": "OrgX plugin for OpenClaw — agent orchestration, quality gates, model routing, and live dashboard",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
],
|
|
34
34
|
"scripts": {
|
|
35
35
|
"typecheck": "tsc --noEmit",
|
|
36
|
-
"test:hooks": "npm run build:core && node --test tests/**/*.test.mjs",
|
|
36
|
+
"test:hooks": "npm run build:core && node --test --test-concurrency=1 tests/*.test.mjs tests/**/*.test.mjs",
|
|
37
37
|
"job:dispatch": "npm run build:core && node ./scripts/run-codex-dispatch-job.mjs",
|
|
38
38
|
"verify:clean-install": "node ./scripts/verify-clean-install.mjs",
|
|
39
39
|
"verify:billing": "npm run build:core && node ./scripts/verify-billing-scenarios.mjs",
|