@agents-tower/core 0.1.0 → 0.1.1
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/dist/adapters/contract-harness.d.ts +8 -0
- package/dist/adapters/contract-harness.js +103 -0
- package/dist/adapters/contract-harness.js.map +1 -0
- package/dist/adapters/cursor-cloud.js +1 -1
- package/dist/adapters/cursor-cloud.js.map +1 -1
- package/dist/adapters/helpers.d.ts +2 -0
- package/dist/adapters/helpers.js +16 -0
- package/dist/adapters/helpers.js.map +1 -1
- package/dist/adapters/index.d.ts +1 -0
- package/dist/adapters/index.js +1 -0
- package/dist/adapters/index.js.map +1 -1
- package/dist/adapters/types.d.ts +2 -2
- package/dist/audit.d.ts +17 -0
- package/dist/audit.js +43 -0
- package/dist/audit.js.map +1 -0
- package/dist/coordination.d.ts +28 -0
- package/dist/coordination.js +158 -0
- package/dist/coordination.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/services/snapshot-assembler.js +14 -1
- package/dist/services/snapshot-assembler.js.map +1 -1
- package/dist/types.d.ts +29 -0
- package/package.json +1 -1
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ProjectAdapter } from "./types";
|
|
2
|
+
export declare const PROVIDER_CONTRACT_VERSION = 1;
|
|
3
|
+
export interface ContractCheckOptions {
|
|
4
|
+
projectRoot?: string;
|
|
5
|
+
refreshTimeoutMs?: number;
|
|
6
|
+
}
|
|
7
|
+
export declare function validateAdapterShape(adapter: ProjectAdapter): string[];
|
|
8
|
+
export declare function runAdapterContractChecks(adapter: ProjectAdapter, options?: ContractCheckOptions): Promise<string[]>;
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PROVIDER_CONTRACT_VERSION = void 0;
|
|
4
|
+
exports.validateAdapterShape = validateAdapterShape;
|
|
5
|
+
exports.runAdapterContractChecks = runAdapterContractChecks;
|
|
6
|
+
exports.PROVIDER_CONTRACT_VERSION = 1;
|
|
7
|
+
const VALID_HEALTH_STATUSES = new Set(["ready", "unconfigured", "degraded", "error"]);
|
|
8
|
+
const VALID_CONFIDENCES = new Set(["typed", "inferred"]);
|
|
9
|
+
function checkSnapshotShape(snapshot, adapterId, failures) {
|
|
10
|
+
if (!snapshot || typeof snapshot !== "object") {
|
|
11
|
+
failures.push(`${adapterId}: getCachedSnapshot() must return an AdapterSnapshot object`);
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
if (snapshot.adapterId !== adapterId) {
|
|
15
|
+
failures.push(`${adapterId}: snapshot.adapterId must equal the adapter id (got ${String(snapshot.adapterId)})`);
|
|
16
|
+
}
|
|
17
|
+
if (!Number.isFinite(Date.parse(snapshot.generatedAt))) {
|
|
18
|
+
failures.push(`${adapterId}: snapshot.generatedAt must be a parseable ISO timestamp`);
|
|
19
|
+
}
|
|
20
|
+
for (const field of ["agents", "events", "notes"]) {
|
|
21
|
+
if (!Array.isArray(snapshot[field])) {
|
|
22
|
+
failures.push(`${adapterId}: snapshot.${field} must be an array`);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
if (!snapshot.health || !VALID_HEALTH_STATUSES.has(snapshot.health.status)) {
|
|
26
|
+
failures.push(`${adapterId}: snapshot.health.status must be one of ${Array.from(VALID_HEALTH_STATUSES).join("/")}`);
|
|
27
|
+
}
|
|
28
|
+
if (snapshot.health && snapshot.health.status !== "ready" && !snapshot.health.detail) {
|
|
29
|
+
failures.push(`${adapterId}: non-ready health must carry a human-readable detail`);
|
|
30
|
+
}
|
|
31
|
+
for (const agent of Array.isArray(snapshot.agents) ? snapshot.agents : []) {
|
|
32
|
+
if (!VALID_CONFIDENCES.has(agent.confidence)) {
|
|
33
|
+
failures.push(`${adapterId}: agent ${agent.id} confidence must be typed or inferred`);
|
|
34
|
+
break;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function validateAdapterShape(adapter) {
|
|
39
|
+
const failures = [];
|
|
40
|
+
if (!adapter || typeof adapter !== "object") {
|
|
41
|
+
return ["adapter must be an object"];
|
|
42
|
+
}
|
|
43
|
+
if (typeof adapter.id !== "string" || adapter.id.length === 0) {
|
|
44
|
+
failures.push("adapter.id must be a non-empty string");
|
|
45
|
+
}
|
|
46
|
+
if (typeof adapter.source !== "string" || adapter.source.length === 0) {
|
|
47
|
+
failures.push(`${adapter.id ?? "adapter"}: source must be a non-empty string`);
|
|
48
|
+
}
|
|
49
|
+
if (!adapter.capabilities || typeof adapter.capabilities !== "object") {
|
|
50
|
+
failures.push(`${adapter.id}: capabilities must be an object (empty object is fine)`);
|
|
51
|
+
}
|
|
52
|
+
if (typeof adapter.createSource !== "function") {
|
|
53
|
+
failures.push(`${adapter.id}: createSource(context) must be a function`);
|
|
54
|
+
}
|
|
55
|
+
if (adapter.capabilities?.discoverProjects === true && typeof adapter.discoverProjects !== "function") {
|
|
56
|
+
failures.push(`${adapter.id}: capabilities.discoverProjects requires a discoverProjects() implementation`);
|
|
57
|
+
}
|
|
58
|
+
return failures;
|
|
59
|
+
}
|
|
60
|
+
async function runAdapterContractChecks(adapter, options = {}) {
|
|
61
|
+
const failures = validateAdapterShape(adapter);
|
|
62
|
+
if (failures.length > 0) {
|
|
63
|
+
return failures;
|
|
64
|
+
}
|
|
65
|
+
const projectRoot = options.projectRoot ?? "/tmp/agents-tower-contract-fixture";
|
|
66
|
+
const refreshTimeoutMs = options.refreshTimeoutMs ?? 10_000;
|
|
67
|
+
let source;
|
|
68
|
+
try {
|
|
69
|
+
source = adapter.createSource({ projectRoot });
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
failures.push(`${adapter.id}: createSource threw synchronously: ${error instanceof Error ? error.message : String(error)}`);
|
|
73
|
+
return failures;
|
|
74
|
+
}
|
|
75
|
+
for (const method of ["warm", "refresh", "getCachedSnapshot", "dispose"]) {
|
|
76
|
+
if (typeof source[method] !== "function") {
|
|
77
|
+
failures.push(`${adapter.id}: source.${method} must be a function`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
if (failures.length > 0) {
|
|
81
|
+
return failures;
|
|
82
|
+
}
|
|
83
|
+
checkSnapshotShape(source.getCachedSnapshot(), adapter.id, failures);
|
|
84
|
+
try {
|
|
85
|
+
await Promise.race([
|
|
86
|
+
source.refresh("manual"),
|
|
87
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error("refresh timed out")), refreshTimeoutMs))
|
|
88
|
+
]);
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
failures.push(`${adapter.id}: refresh("manual") must resolve without throwing (providers report failures via degraded/error health): `
|
|
92
|
+
+ (error instanceof Error ? error.message : String(error)));
|
|
93
|
+
}
|
|
94
|
+
checkSnapshotShape(source.getCachedSnapshot(), adapter.id, failures);
|
|
95
|
+
try {
|
|
96
|
+
await source.dispose();
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
failures.push(`${adapter.id}: dispose() must resolve without throwing: ${error instanceof Error ? error.message : String(error)}`);
|
|
100
|
+
}
|
|
101
|
+
return failures;
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=contract-harness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract-harness.js","sourceRoot":"","sources":["../../src/adapters/contract-harness.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,7 +21,7 @@ exports.cursorCloudAdapter = {
|
|
|
21
21
|
source: "cursor",
|
|
22
22
|
notes: [availabilityNote],
|
|
23
23
|
generatedAt,
|
|
24
|
-
health: (0, helpers_1.
|
|
24
|
+
health: (0, helpers_1.unconfiguredHealth)(availabilityNote, generatedAt)
|
|
25
25
|
});
|
|
26
26
|
}
|
|
27
27
|
const snapshotData = await (0, cursor_1.loadCursorCloudProjectSnapshotData)(context.projectRoot, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cursor-cloud.js","sourceRoot":"","sources":["../../src/adapters/cursor-cloud.ts"],"names":[],"mappings":";;;AAAA,sCAAgG;AAEhG,
|
|
1
|
+
{"version":3,"file":"cursor-cloud.js","sourceRoot":"","sources":["../../src/adapters/cursor-cloud.ts"],"names":[],"mappings":";;;AAAA,sCAAgG;AAEhG,uCAAqF;AACrF,mDAAsD;AAEzC,QAAA,kBAAkB,GAAmB;IAChD,EAAE,EAAE,cAAc;IAClB,MAAM,EAAE,QAAQ;IAChB,YAAY,EAAE,EAAE;IAChB,YAAY,CAAC,OAAO;QAClB,MAAM,2BAA2B,GAAG,IAAI,GAAG,EAAuB,CAAC;QACnE,IAAI,sBAAsB,GAAG,KAAK,CAAC;QACnC,OAAO,IAAI,mCAAmB,CAAC,KAAK,IAAI,EAAE;YACxC,MAAM,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAC7C,IAAI,CAAC;gBACH,MAAM,gBAAgB,GAAG,MAAM,IAAA,wCAA+B,EAAC,OAAO,CAAC,WAAW,CAAC,CAAC;gBACpF,IAAI,gBAAgB,EAAE,CAAC;oBACrB,OAAO,IAAA,8BAAoB,EAAC;wBAC1B,SAAS,EAAE,cAAc;wBACzB,MAAM,EAAE,QAAQ;wBAChB,KAAK,EAAE,CAAC,gBAAgB,CAAC;wBACzB,WAAW;wBACX,MAAM,EAAE,IAAA,4BAAkB,EAAC,gBAAgB,EAAE,WAAW,CAAC;qBAC1D,CAAC,CAAC;gBACL,CAAC;gBAED,MAAM,YAAY,GAAG,MAAM,IAAA,2CAAkC,EAAC,OAAO,CAAC,WAAW,EAAE;oBACjF,2BAA2B;oBAC3B,sBAAsB;iBACvB,CAAC,CAAC;gBACH,sBAAsB,GAAG,IAAI,CAAC;gBAC9B,OAAO,IAAA,8BAAoB,EAAC;oBAC1B,SAAS,EAAE,cAAc;oBACzB,MAAM,EAAE,QAAQ;oBAChB,MAAM,EAAE,YAAY,CAAC,MAAM;oBAC3B,MAAM,EAAE,YAAY,CAAC,MAAM;oBAC3B,WAAW;iBACZ,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,sBAAsB,GAAG,IAAI,CAAC;gBAC9B,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACvE,OAAO,IAAA,8BAAoB,EAAC;oBAC1B,SAAS,EAAE,cAAc;oBACzB,MAAM,EAAE,QAAQ;oBAChB,WAAW;oBACX,KAAK,EAAE,CAAC,yCAAyC,OAAO,EAAE,CAAC;oBAC3D,MAAM,EAAE,IAAA,wBAAc,EAAC,OAAO,EAAE,WAAW,CAAC;iBAC7C,CAAC,CAAC;YACL,CAAC;QACH,CAAC,EAAE,IAAA,8BAAoB,EAAC,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;IAC5E,CAAC;CACF,CAAC"}
|
|
@@ -2,6 +2,8 @@ import type { AdapterHealth, AdapterSnapshot } from "./types";
|
|
|
2
2
|
import type { CloudTask, DashboardAgent, DashboardEvent } from "../types";
|
|
3
3
|
export declare function readyHealth(detail?: string | null, generatedAt?: string): AdapterHealth;
|
|
4
4
|
export declare function degradedHealth(detail: string, generatedAt?: string): AdapterHealth;
|
|
5
|
+
export declare function errorHealth(detail: string, generatedAt?: string): AdapterHealth;
|
|
6
|
+
export declare function unconfiguredHealth(detail: string, generatedAt?: string): AdapterHealth;
|
|
5
7
|
export declare function emptyAdapterSnapshot(input: {
|
|
6
8
|
adapterId: string;
|
|
7
9
|
source: DashboardAgent["source"];
|
package/dist/adapters/helpers.js
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.readyHealth = readyHealth;
|
|
4
4
|
exports.degradedHealth = degradedHealth;
|
|
5
|
+
exports.errorHealth = errorHealth;
|
|
6
|
+
exports.unconfiguredHealth = unconfiguredHealth;
|
|
5
7
|
exports.emptyAdapterSnapshot = emptyAdapterSnapshot;
|
|
6
8
|
function readyHealth(detail = null, generatedAt = new Date().toISOString()) {
|
|
7
9
|
return {
|
|
@@ -17,6 +19,20 @@ function degradedHealth(detail, generatedAt = new Date().toISOString()) {
|
|
|
17
19
|
lastUpdatedAt: generatedAt
|
|
18
20
|
};
|
|
19
21
|
}
|
|
22
|
+
function errorHealth(detail, generatedAt = new Date().toISOString()) {
|
|
23
|
+
return {
|
|
24
|
+
status: "error",
|
|
25
|
+
detail,
|
|
26
|
+
lastUpdatedAt: generatedAt
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
function unconfiguredHealth(detail, generatedAt = new Date().toISOString()) {
|
|
30
|
+
return {
|
|
31
|
+
status: "unconfigured",
|
|
32
|
+
detail,
|
|
33
|
+
lastUpdatedAt: generatedAt
|
|
34
|
+
};
|
|
35
|
+
}
|
|
20
36
|
function emptyAdapterSnapshot(input) {
|
|
21
37
|
const generatedAt = input.generatedAt ?? new Date().toISOString();
|
|
22
38
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/adapters/helpers.ts"],"names":[],"mappings":";;AAGA,kCAMC;AAED,wCAMC;AAED,oDAsBC;
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/adapters/helpers.ts"],"names":[],"mappings":";;AAGA,kCAMC;AAED,wCAMC;AAED,kCAMC;AAED,gDAMC;AAED,oDAsBC;AAtDD,SAAgB,WAAW,CAAC,SAAwB,IAAI,EAAE,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;IAC9F,OAAO;QACL,MAAM,EAAE,OAAO;QACf,MAAM;QACN,aAAa,EAAE,WAAW;KAC3B,CAAC;AACJ,CAAC;AAED,SAAgB,cAAc,CAAC,MAAc,EAAE,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;IACnF,OAAO;QACL,MAAM,EAAE,UAAU;QAClB,MAAM;QACN,aAAa,EAAE,WAAW;KAC3B,CAAC;AACJ,CAAC;AAED,SAAgB,WAAW,CAAC,MAAc,EAAE,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;IAChF,OAAO;QACL,MAAM,EAAE,OAAO;QACf,MAAM;QACN,aAAa,EAAE,WAAW;KAC3B,CAAC;AACJ,CAAC;AAED,SAAgB,kBAAkB,CAAC,MAAc,EAAE,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;IACvF,OAAO;QACL,MAAM,EAAE,cAAc;QACtB,MAAM;QACN,aAAa,EAAE,WAAW;KAC3B,CAAC;AACJ,CAAC;AAED,SAAgB,oBAAoB,CAAC,KAUpC;IACC,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAClE,OAAO;QACL,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,WAAW;QACX,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,EAAE;QAC1B,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,EAAE;QAC1B,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,EAAE;QACxB,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,EAAE;QAClC,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,WAAW,CAAC,KAAK,CAAC,MAAM,IAAI,IAAI,EAAE,WAAW,CAAC;KACvE,CAAC;AACJ,CAAC"}
|
package/dist/adapters/index.d.ts
CHANGED
|
@@ -1,2 +1,3 @@
|
|
|
1
1
|
export * from "./types";
|
|
2
|
+
export * from "./contract-harness";
|
|
2
3
|
export declare const PROJECT_ADAPTERS: readonly [import("./types").ProjectAdapter, import("./types").ProjectAdapter, import("./types").ProjectAdapter, import("./types").ProjectAdapter, import("./types").ProjectAdapter, import("./types").ProjectAdapter, import("./types").ProjectAdapter, import("./types").ProjectAdapter];
|
package/dist/adapters/index.js
CHANGED
|
@@ -24,6 +24,7 @@ const hermes_1 = require("./hermes");
|
|
|
24
24
|
const openclaw_1 = require("./openclaw");
|
|
25
25
|
const presence_1 = require("./presence");
|
|
26
26
|
__exportStar(require("./types"), exports);
|
|
27
|
+
__exportStar(require("./contract-harness"), exports);
|
|
27
28
|
exports.PROJECT_ADAPTERS = [
|
|
28
29
|
codex_local_1.codexLocalAdapter,
|
|
29
30
|
claude_1.claudeAdapter,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,qCAAyC;AACzC,+CAAkD;AAClD,+CAAkD;AAClD,iDAAoD;AACpD,iDAAoD;AACpD,qCAAyC;AACzC,yCAA6C;AAC7C,yCAA6C;AAE7C,0CAAwB;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,qCAAyC;AACzC,+CAAkD;AAClD,+CAAkD;AAClD,iDAAoD;AACpD,iDAAoD;AACpD,qCAAyC;AACzC,yCAA6C;AAC7C,yCAA6C;AAE7C,0CAAwB;AACxB,qDAAmC;AAEtB,QAAA,gBAAgB,GAAG;IAC9B,+BAAiB;IACjB,sBAAa;IACb,iCAAkB;IAClB,iCAAkB;IAClB,sBAAa;IACb,0BAAe;IACf,0BAAe;IACf,+BAAiB;CACT,CAAC"}
|
package/dist/adapters/types.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { CloudTask, DashboardAgent, DashboardEvent } from "../types";
|
|
1
|
+
import type { CloudTask, DashboardAgent, DashboardEvent, ProviderHealthStatus } from "../types";
|
|
2
2
|
import type { DiscoveredProject } from "../project-paths";
|
|
3
|
-
export type AdapterHealthStatus =
|
|
3
|
+
export type AdapterHealthStatus = ProviderHealthStatus;
|
|
4
4
|
export type AdapterRefreshReason = "warm" | "startup" | "interval" | "manual" | "event";
|
|
5
5
|
export interface AdapterCapabilities {
|
|
6
6
|
discoverProjects?: boolean;
|
package/dist/audit.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface AuditRecord {
|
|
2
|
+
at: string;
|
|
3
|
+
actor: "browser" | "cli";
|
|
4
|
+
action: string;
|
|
5
|
+
target: {
|
|
6
|
+
projectRoot: string;
|
|
7
|
+
requestId?: string;
|
|
8
|
+
threadId?: string;
|
|
9
|
+
};
|
|
10
|
+
detail: string | null;
|
|
11
|
+
outcome: "ok" | "error";
|
|
12
|
+
error?: string;
|
|
13
|
+
}
|
|
14
|
+
export declare function appendAuditRecord(record: Omit<AuditRecord, "at"> & {
|
|
15
|
+
at?: string;
|
|
16
|
+
}): AuditRecord;
|
|
17
|
+
export declare function readAuditJournal(limit?: number): AuditRecord[];
|
package/dist/audit.js
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.appendAuditRecord = appendAuditRecord;
|
|
4
|
+
exports.readAuditJournal = readAuditJournal;
|
|
5
|
+
const node_fs_1 = require("node:fs");
|
|
6
|
+
const node_path_1 = require("node:path");
|
|
7
|
+
const app_settings_1 = require("./app-settings");
|
|
8
|
+
function auditJournalPath() {
|
|
9
|
+
return (0, node_path_1.join)((0, app_settings_1.getAppDataDirectory)(), "audit", "journal.jsonl");
|
|
10
|
+
}
|
|
11
|
+
function appendAuditRecord(record) {
|
|
12
|
+
const complete = {
|
|
13
|
+
at: record.at ?? new Date().toISOString(),
|
|
14
|
+
actor: record.actor,
|
|
15
|
+
action: record.action,
|
|
16
|
+
target: record.target,
|
|
17
|
+
detail: record.detail ?? null,
|
|
18
|
+
outcome: record.outcome,
|
|
19
|
+
...(record.error ? { error: record.error } : {})
|
|
20
|
+
};
|
|
21
|
+
const path = auditJournalPath();
|
|
22
|
+
(0, node_fs_1.mkdirSync)((0, node_path_1.join)((0, app_settings_1.getAppDataDirectory)(), "audit"), { recursive: true });
|
|
23
|
+
(0, node_fs_1.appendFileSync)(path, `${JSON.stringify(complete)}\n`);
|
|
24
|
+
return complete;
|
|
25
|
+
}
|
|
26
|
+
function readAuditJournal(limit = 50) {
|
|
27
|
+
const path = auditJournalPath();
|
|
28
|
+
if (!(0, node_fs_1.existsSync)(path)) {
|
|
29
|
+
return [];
|
|
30
|
+
}
|
|
31
|
+
const lines = (0, node_fs_1.readFileSync)(path, "utf8").split(/\r?\n/).filter(Boolean);
|
|
32
|
+
const records = [];
|
|
33
|
+
for (const line of lines.slice(-Math.max(1, limit))) {
|
|
34
|
+
try {
|
|
35
|
+
records.push(JSON.parse(line));
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
// Skip corrupted lines rather than failing the whole read.
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return records;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../src/audit.ts"],"names":[],"mappings":";;AAuBA,8CAcC;AAED,4CAeC;AAtDD,qCAA8E;AAC9E,yCAAiC;AAEjC,iDAAqD;AAgBrD,SAAS,gBAAgB;IACvB,OAAO,IAAA,gBAAI,EAAC,IAAA,kCAAmB,GAAE,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC;AAC/D,CAAC;AAED,SAAgB,iBAAiB,CAAC,MAAiD;IACjF,MAAM,QAAQ,GAAgB;QAC5B,EAAE,EAAE,MAAM,CAAC,EAAE,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACzC,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,IAAI;QAC7B,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACjD,CAAC;IACF,MAAM,IAAI,GAAG,gBAAgB,EAAE,CAAC;IAChC,IAAA,mBAAS,EAAC,IAAA,gBAAI,EAAC,IAAA,kCAAmB,GAAE,EAAE,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACrE,IAAA,wBAAc,EAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACtD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAgB,gBAAgB,CAAC,KAAK,GAAG,EAAE;IACzC,MAAM,IAAI,GAAG,gBAAgB,EAAE,CAAC;IAChC,IAAI,CAAC,IAAA,oBAAU,EAAC,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,KAAK,GAAG,IAAA,sBAAY,EAAC,IAAI,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACxE,MAAM,OAAO,GAAkB,EAAE,CAAC;IAClC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;QACpD,IAAI,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAgB,CAAC,CAAC;QAChD,CAAC;QAAC,MAAM,CAAC;YACP,2DAA2D;QAC7D,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { CoordinationClaim, CoordinationClaimView } from "./types";
|
|
2
|
+
export declare const DEFAULT_CLAIM_TTL_MS: number;
|
|
3
|
+
export declare function startCoordinationClaim(input: {
|
|
4
|
+
projectRoot: string;
|
|
5
|
+
objective: string;
|
|
6
|
+
scope?: string[];
|
|
7
|
+
branch?: string | null;
|
|
8
|
+
agentLabel?: string | null;
|
|
9
|
+
blockedOn?: string | null;
|
|
10
|
+
ttlMs?: number;
|
|
11
|
+
nowMs?: number;
|
|
12
|
+
}): CoordinationClaim;
|
|
13
|
+
export declare function heartbeatCoordinationClaim(projectRoot: string, id: string, options?: {
|
|
14
|
+
ttlMs?: number;
|
|
15
|
+
blockedOn?: string | null;
|
|
16
|
+
nowMs?: number;
|
|
17
|
+
}): CoordinationClaim | null;
|
|
18
|
+
export declare function releaseCoordinationClaim(projectRoot: string, id: string, options?: {
|
|
19
|
+
handoff?: boolean;
|
|
20
|
+
nowMs?: number;
|
|
21
|
+
}): CoordinationClaim | null;
|
|
22
|
+
export declare function listCoordinationClaims(projectRoot: string, nowMs?: number): CoordinationClaimView[];
|
|
23
|
+
export interface ClaimOverlapAdvice {
|
|
24
|
+
verdict: "proceed" | "caution";
|
|
25
|
+
reasons: string[];
|
|
26
|
+
overlapping: CoordinationClaimView[];
|
|
27
|
+
}
|
|
28
|
+
export declare function adviseOnClaimOverlap(projectRoot: string, requestedScope: string[], nowMs?: number): ClaimOverlapAdvice;
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DEFAULT_CLAIM_TTL_MS = void 0;
|
|
4
|
+
exports.startCoordinationClaim = startCoordinationClaim;
|
|
5
|
+
exports.heartbeatCoordinationClaim = heartbeatCoordinationClaim;
|
|
6
|
+
exports.releaseCoordinationClaim = releaseCoordinationClaim;
|
|
7
|
+
exports.listCoordinationClaims = listCoordinationClaims;
|
|
8
|
+
exports.adviseOnClaimOverlap = adviseOnClaimOverlap;
|
|
9
|
+
const node_crypto_1 = require("node:crypto");
|
|
10
|
+
const node_fs_1 = require("node:fs");
|
|
11
|
+
const node_path_1 = require("node:path");
|
|
12
|
+
const app_settings_1 = require("./app-settings");
|
|
13
|
+
const project_paths_1 = require("./project-paths");
|
|
14
|
+
exports.DEFAULT_CLAIM_TTL_MS = 20 * 60 * 1000;
|
|
15
|
+
const RESOLVED_CLAIM_RETENTION_MS = 10 * 60 * 1000;
|
|
16
|
+
const STALE_CLAIM_RETENTION_MS = 24 * 60 * 60 * 1000;
|
|
17
|
+
function claimsDirectory(projectRoot) {
|
|
18
|
+
const hash = (0, node_crypto_1.createHash)("sha256").update((0, project_paths_1.projectPathIdentityKey)(projectRoot) ?? projectRoot).digest("hex").slice(0, 16);
|
|
19
|
+
return (0, node_path_1.join)((0, app_settings_1.getAppDataDirectory)(), "coordination", hash);
|
|
20
|
+
}
|
|
21
|
+
function claimFilePath(projectRoot, id) {
|
|
22
|
+
return (0, node_path_1.join)(claimsDirectory(projectRoot), `${id}.json`);
|
|
23
|
+
}
|
|
24
|
+
function readClaimFile(path) {
|
|
25
|
+
try {
|
|
26
|
+
const parsed = JSON.parse((0, node_fs_1.readFileSync)(path, "utf8"));
|
|
27
|
+
return typeof parsed?.id === "string" && typeof parsed?.objective === "string" ? parsed : null;
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
function writeClaimFile(claim) {
|
|
34
|
+
const directory = claimsDirectory(claim.projectRoot);
|
|
35
|
+
(0, node_fs_1.mkdirSync)(directory, { recursive: true });
|
|
36
|
+
(0, node_fs_1.writeFileSync)(claimFilePath(claim.projectRoot, claim.id), `${JSON.stringify(claim, null, 2)}\n`);
|
|
37
|
+
}
|
|
38
|
+
function claimLifecycle(claim, nowMs) {
|
|
39
|
+
if (claim.status === "released" || claim.status === "handoff") {
|
|
40
|
+
return claim.status;
|
|
41
|
+
}
|
|
42
|
+
const expiresMs = Date.parse(claim.expiresAt);
|
|
43
|
+
return Number.isFinite(expiresMs) && nowMs > expiresMs ? "stale" : "active";
|
|
44
|
+
}
|
|
45
|
+
function shouldPruneClaim(claim, lifecycle, nowMs) {
|
|
46
|
+
if (lifecycle === "released" || lifecycle === "handoff") {
|
|
47
|
+
const heartbeatMs = Date.parse(claim.heartbeatAt);
|
|
48
|
+
return !Number.isFinite(heartbeatMs) || nowMs - heartbeatMs > RESOLVED_CLAIM_RETENTION_MS;
|
|
49
|
+
}
|
|
50
|
+
if (lifecycle === "stale") {
|
|
51
|
+
const expiresMs = Date.parse(claim.expiresAt);
|
|
52
|
+
return !Number.isFinite(expiresMs) || nowMs - expiresMs > STALE_CLAIM_RETENTION_MS;
|
|
53
|
+
}
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
function startCoordinationClaim(input) {
|
|
57
|
+
const nowMs = input.nowMs ?? Date.now();
|
|
58
|
+
const ttlMs = Number.isFinite(input.ttlMs) && input.ttlMs > 0 ? input.ttlMs : exports.DEFAULT_CLAIM_TTL_MS;
|
|
59
|
+
const now = new Date(nowMs).toISOString();
|
|
60
|
+
const claim = {
|
|
61
|
+
id: (0, node_crypto_1.randomUUID)(),
|
|
62
|
+
projectRoot: input.projectRoot,
|
|
63
|
+
objective: input.objective,
|
|
64
|
+
scope: input.scope?.filter(Boolean) ?? [],
|
|
65
|
+
branch: input.branch ?? null,
|
|
66
|
+
agentLabel: input.agentLabel ?? null,
|
|
67
|
+
status: "active",
|
|
68
|
+
blockedOn: input.blockedOn ?? null,
|
|
69
|
+
createdAt: now,
|
|
70
|
+
heartbeatAt: now,
|
|
71
|
+
expiresAt: new Date(nowMs + ttlMs).toISOString()
|
|
72
|
+
};
|
|
73
|
+
writeClaimFile(claim);
|
|
74
|
+
return claim;
|
|
75
|
+
}
|
|
76
|
+
function heartbeatCoordinationClaim(projectRoot, id, options = {}) {
|
|
77
|
+
const existing = readClaimFile(claimFilePath(projectRoot, id));
|
|
78
|
+
if (!existing || existing.status !== "active") {
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
const nowMs = options.nowMs ?? Date.now();
|
|
82
|
+
const ttlMs = Number.isFinite(options.ttlMs) && options.ttlMs > 0 ? options.ttlMs : exports.DEFAULT_CLAIM_TTL_MS;
|
|
83
|
+
const updated = {
|
|
84
|
+
...existing,
|
|
85
|
+
blockedOn: options.blockedOn !== undefined ? options.blockedOn : existing.blockedOn,
|
|
86
|
+
heartbeatAt: new Date(nowMs).toISOString(),
|
|
87
|
+
expiresAt: new Date(nowMs + ttlMs).toISOString()
|
|
88
|
+
};
|
|
89
|
+
writeClaimFile(updated);
|
|
90
|
+
return updated;
|
|
91
|
+
}
|
|
92
|
+
function releaseCoordinationClaim(projectRoot, id, options = {}) {
|
|
93
|
+
const existing = readClaimFile(claimFilePath(projectRoot, id));
|
|
94
|
+
if (!existing) {
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
const nowMs = options.nowMs ?? Date.now();
|
|
98
|
+
const updated = {
|
|
99
|
+
...existing,
|
|
100
|
+
status: options.handoff === true ? "handoff" : "released",
|
|
101
|
+
heartbeatAt: new Date(nowMs).toISOString()
|
|
102
|
+
};
|
|
103
|
+
writeClaimFile(updated);
|
|
104
|
+
return updated;
|
|
105
|
+
}
|
|
106
|
+
function listCoordinationClaims(projectRoot, nowMs = Date.now()) {
|
|
107
|
+
const directory = claimsDirectory(projectRoot);
|
|
108
|
+
if (!(0, node_fs_1.existsSync)(directory)) {
|
|
109
|
+
return [];
|
|
110
|
+
}
|
|
111
|
+
const views = [];
|
|
112
|
+
for (const entry of (0, node_fs_1.readdirSync)(directory)) {
|
|
113
|
+
if (!entry.endsWith(".json")) {
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
const path = (0, node_path_1.join)(directory, entry);
|
|
117
|
+
const claim = readClaimFile(path);
|
|
118
|
+
if (!claim) {
|
|
119
|
+
(0, node_fs_1.rmSync)(path, { force: true });
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
const lifecycle = claimLifecycle(claim, nowMs);
|
|
123
|
+
if (shouldPruneClaim(claim, lifecycle, nowMs)) {
|
|
124
|
+
(0, node_fs_1.rmSync)(path, { force: true });
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
views.push({ ...claim, lifecycle });
|
|
128
|
+
}
|
|
129
|
+
return views.sort((left, right) => right.heartbeatAt.localeCompare(left.heartbeatAt));
|
|
130
|
+
}
|
|
131
|
+
function normalizedScopePath(value) {
|
|
132
|
+
return value.replace(/\\/g, "/").replace(/\/+$/g, "").toLowerCase();
|
|
133
|
+
}
|
|
134
|
+
function scopesOverlap(left, right) {
|
|
135
|
+
const a = normalizedScopePath(left);
|
|
136
|
+
const b = normalizedScopePath(right);
|
|
137
|
+
return a === b || a.startsWith(`${b}/`) || b.startsWith(`${a}/`);
|
|
138
|
+
}
|
|
139
|
+
function adviseOnClaimOverlap(projectRoot, requestedScope, nowMs = Date.now()) {
|
|
140
|
+
const claims = listCoordinationClaims(projectRoot, nowMs)
|
|
141
|
+
.filter((claim) => claim.lifecycle === "active" || claim.lifecycle === "stale");
|
|
142
|
+
const overlapping = claims.filter((claim) => claim.scope.length > 0
|
|
143
|
+
&& requestedScope.some((requested) => claim.scope.some((declared) => scopesOverlap(requested, declared))));
|
|
144
|
+
if (overlapping.length === 0) {
|
|
145
|
+
return {
|
|
146
|
+
verdict: "proceed",
|
|
147
|
+
reasons: claims.length === 0
|
|
148
|
+
? ["No declared claims for this project."]
|
|
149
|
+
: ["Declared scopes appear disjoint from the requested paths."],
|
|
150
|
+
overlapping: []
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
const reasons = overlapping.map((claim) => claim.lifecycle === "stale"
|
|
154
|
+
? `Stale claim "${claim.objective}" overlaps and was not explicitly released — confirm before proceeding.`
|
|
155
|
+
: `Active claim "${claim.objective}"${claim.agentLabel ? ` by ${claim.agentLabel}` : ""} overlaps the requested scope.`);
|
|
156
|
+
return { verdict: "caution", reasons, overlapping };
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=coordination.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coordination.js","sourceRoot":"","sources":["../src/coordination.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -3,7 +3,9 @@ export * from "./aseprite";
|
|
|
3
3
|
export * from "./appearance";
|
|
4
4
|
export * from "./app-server";
|
|
5
5
|
export * from "./app-settings";
|
|
6
|
+
export * from "./audit";
|
|
6
7
|
export * from "./cloud";
|
|
8
|
+
export * from "./coordination";
|
|
7
9
|
export * from "./claude-agent-sdk";
|
|
8
10
|
export * from "./claude-home-cache";
|
|
9
11
|
export * from "./codex-command";
|
package/dist/index.js
CHANGED
|
@@ -20,7 +20,9 @@ __exportStar(require("./aseprite"), exports);
|
|
|
20
20
|
__exportStar(require("./appearance"), exports);
|
|
21
21
|
__exportStar(require("./app-server"), exports);
|
|
22
22
|
__exportStar(require("./app-settings"), exports);
|
|
23
|
+
__exportStar(require("./audit"), exports);
|
|
23
24
|
__exportStar(require("./cloud"), exports);
|
|
25
|
+
__exportStar(require("./coordination"), exports);
|
|
24
26
|
__exportStar(require("./claude-agent-sdk"), exports);
|
|
25
27
|
__exportStar(require("./claude-home-cache"), exports);
|
|
26
28
|
__exportStar(require("./codex-command"), exports);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,6CAA2B;AAC3B,6CAA2B;AAC3B,+CAA6B;AAC7B,+CAA6B;AAC7B,iDAA+B;AAC/B,0CAAwB;AACxB,qDAAmC;AACnC,sDAAoC;AACpC,kDAAgC;AAChC,8CAA6D;AAApD,gHAAA,sBAAsB,OAAA;AAC/B,8DAA4C;AAC5C,2CAAyB;AACzB,wDAAsC;AACtC,6CAA2B;AAC3B,6CAA2B;AAC3B,qDAAmC;AACnC,kDAAgC;AAChC,oDAAkC;AAClC,gDAA8B;AAC9B,+DAA6C;AAC7C,kEAAgD;AAChD,0EAAwD;AACxD,+DAA6C;AAC7C,gEAA8C;AAC9C,0DAAwC;AACxC,6CAA2B;AAC3B,0CAAwB;AACxB,6CAA2B"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,6CAA2B;AAC3B,6CAA2B;AAC3B,+CAA6B;AAC7B,+CAA6B;AAC7B,iDAA+B;AAC/B,0CAAwB;AACxB,0CAAwB;AACxB,iDAA+B;AAC/B,qDAAmC;AACnC,sDAAoC;AACpC,kDAAgC;AAChC,8CAA6D;AAApD,gHAAA,sBAAsB,OAAA;AAC/B,8DAA4C;AAC5C,2CAAyB;AACzB,wDAAsC;AACtC,6CAA2B;AAC3B,6CAA2B;AAC3B,qDAAmC;AACnC,kDAAgC;AAChC,oDAAkC;AAClC,gDAA8B;AAC9B,+DAA6C;AAC7C,kEAAgD;AAChD,0EAAwD;AACxD,+DAA6C;AAC7C,gEAA8C;AAC9C,0DAAwC;AACxC,6CAA2B;AAC3B,0CAAwB;AACxB,6CAA2B"}
|
|
@@ -7,6 +7,7 @@ const app_settings_1 = require("../app-settings");
|
|
|
7
7
|
const room_config_1 = require("../room-config");
|
|
8
8
|
const project_identity_1 = require("../project-identity");
|
|
9
9
|
const workload_policy_1 = require("../domain/workload-policy");
|
|
10
|
+
const coordination_1 = require("../coordination");
|
|
10
11
|
const workspace_activity_1 = require("../domain/workspace-activity");
|
|
11
12
|
const activity_summary_1 = require("../snapshot-lib/activity-summary");
|
|
12
13
|
const project_paths_1 = require("../project-paths");
|
|
@@ -32,6 +33,16 @@ function aggregateNotes(snapshots) {
|
|
|
32
33
|
function aggregateCloudTasks(snapshots) {
|
|
33
34
|
return snapshots.flatMap((snapshot) => snapshot.cloudTasks ?? []);
|
|
34
35
|
}
|
|
36
|
+
function aggregateProviderHealth(snapshots) {
|
|
37
|
+
return snapshots.map((snapshot) => ({
|
|
38
|
+
adapterId: snapshot.adapterId,
|
|
39
|
+
provider: snapshot.source,
|
|
40
|
+
status: snapshot.health.status,
|
|
41
|
+
detail: snapshot.health.detail,
|
|
42
|
+
lastUpdatedAt: snapshot.health.lastUpdatedAt,
|
|
43
|
+
snapshotGeneratedAt: snapshot.generatedAt
|
|
44
|
+
}));
|
|
45
|
+
}
|
|
35
46
|
function parseGitStatusPath(line) {
|
|
36
47
|
const rawPath = line.slice(3).trim();
|
|
37
48
|
if (!rawPath) {
|
|
@@ -157,7 +168,9 @@ async function assembleProjectSnapshot(input) {
|
|
|
157
168
|
cloudTasks,
|
|
158
169
|
events,
|
|
159
170
|
activity,
|
|
160
|
-
notes: aggregateNotes(input.adapterSnapshots)
|
|
171
|
+
notes: aggregateNotes(input.adapterSnapshots),
|
|
172
|
+
providerHealth: aggregateProviderHealth(input.adapterSnapshots),
|
|
173
|
+
claims: (0, coordination_1.listCoordinationClaims)(projectRoot, now)
|
|
161
174
|
}, now);
|
|
162
175
|
const diagnostics = freshUnseatedHotChangeAgentDiagnostics(snapshot, now);
|
|
163
176
|
return diagnostics.length > 0
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snapshot-assembler.js","sourceRoot":"","sources":["../../src/services/snapshot-assembler.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"snapshot-assembler.js","sourceRoot":"","sources":["../../src/services/snapshot-assembler.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -348,6 +348,33 @@ export interface WorkspaceActivitySnapshot {
|
|
|
348
348
|
hotTools: HotToolSummary[];
|
|
349
349
|
runningCommands: RunningCommandSummary[];
|
|
350
350
|
}
|
|
351
|
+
export type CoordinationClaimStatus = "active" | "released" | "handoff";
|
|
352
|
+
export type CoordinationClaimLifecycle = "active" | "stale" | "released" | "handoff";
|
|
353
|
+
export interface CoordinationClaim {
|
|
354
|
+
id: string;
|
|
355
|
+
projectRoot: string;
|
|
356
|
+
objective: string;
|
|
357
|
+
scope: string[];
|
|
358
|
+
branch: string | null;
|
|
359
|
+
agentLabel: string | null;
|
|
360
|
+
status: CoordinationClaimStatus;
|
|
361
|
+
blockedOn: string | null;
|
|
362
|
+
createdAt: string;
|
|
363
|
+
heartbeatAt: string;
|
|
364
|
+
expiresAt: string;
|
|
365
|
+
}
|
|
366
|
+
export interface CoordinationClaimView extends CoordinationClaim {
|
|
367
|
+
lifecycle: CoordinationClaimLifecycle;
|
|
368
|
+
}
|
|
369
|
+
export type ProviderHealthStatus = "ready" | "unconfigured" | "degraded" | "error";
|
|
370
|
+
export interface ProviderHealth {
|
|
371
|
+
adapterId: string;
|
|
372
|
+
provider: DashboardAgent["source"];
|
|
373
|
+
status: ProviderHealthStatus;
|
|
374
|
+
detail: string | null;
|
|
375
|
+
lastUpdatedAt: string | null;
|
|
376
|
+
snapshotGeneratedAt: string;
|
|
377
|
+
}
|
|
351
378
|
export interface DashboardSnapshot {
|
|
352
379
|
projectRoot: string;
|
|
353
380
|
projectLabel: string;
|
|
@@ -359,6 +386,8 @@ export interface DashboardSnapshot {
|
|
|
359
386
|
events: DashboardEvent[];
|
|
360
387
|
activity: WorkspaceActivitySnapshot;
|
|
361
388
|
notes: string[];
|
|
389
|
+
providerHealth: ProviderHealth[];
|
|
390
|
+
claims: CoordinationClaimView[];
|
|
362
391
|
}
|
|
363
392
|
export interface SnapshotOptions {
|
|
364
393
|
projectRoot: string;
|