@agents-tower/core 0.1.0 → 0.1.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/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/history.d.ts +17 -0
- package/dist/history.js +148 -0
- package/dist/history.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +3 -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 +6 -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":";;;AA0CA,oDAqBC;AAED,4DAoDC;AAnHY,QAAA,yBAAyB,GAAG,CAAC,CAAC;AAE3C,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;AACtF,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;AAOzD,SAAS,kBAAkB,CAAC,QAAyB,EAAE,SAAiB,EAAE,QAAkB;IAC1F,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC9C,QAAQ,CAAC,IAAI,CAAC,GAAG,SAAS,6DAA6D,CAAC,CAAC;QACzF,OAAO;IACT,CAAC;IACD,IAAI,QAAQ,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QACrC,QAAQ,CAAC,IAAI,CAAC,GAAG,SAAS,uDAAuD,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAClH,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC;QACvD,QAAQ,CAAC,IAAI,CAAC,GAAG,SAAS,0DAA0D,CAAC,CAAC;IACxF,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAU,EAAE,CAAC;QAC3D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YACpC,QAAQ,CAAC,IAAI,CAAC,GAAG,SAAS,cAAc,KAAK,mBAAmB,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3E,QAAQ,CAAC,IAAI,CAAC,GAAG,SAAS,2CAA2C,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACtH,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,KAAK,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACrF,QAAQ,CAAC,IAAI,CAAC,GAAG,SAAS,uDAAuD,CAAC,CAAC;IACrF,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAC1E,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;YAC7C,QAAQ,CAAC,IAAI,CAAC,GAAG,SAAS,WAAW,KAAK,CAAC,EAAE,uCAAuC,CAAC,CAAC;YACtF,MAAM;QACR,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAgB,oBAAoB,CAAC,OAAuB;IAC1D,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC5C,OAAO,CAAC,2BAA2B,CAAC,CAAC;IACvC,CAAC;IACD,IAAI,OAAO,OAAO,CAAC,EAAE,KAAK,QAAQ,IAAI,OAAO,CAAC,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9D,QAAQ,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;IACzD,CAAC;IACD,IAAI,OAAO,OAAO,CAAC,MAAM,KAAK,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtE,QAAQ,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,EAAE,IAAI,SAAS,qCAAqC,CAAC,CAAC;IACjF,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,YAAY,IAAI,OAAO,OAAO,CAAC,YAAY,KAAK,QAAQ,EAAE,CAAC;QACtE,QAAQ,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,EAAE,yDAAyD,CAAC,CAAC;IACxF,CAAC;IACD,IAAI,OAAO,OAAO,CAAC,YAAY,KAAK,UAAU,EAAE,CAAC;QAC/C,QAAQ,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,EAAE,4CAA4C,CAAC,CAAC;IAC3E,CAAC;IACD,IAAI,OAAO,CAAC,YAAY,EAAE,gBAAgB,KAAK,IAAI,IAAI,OAAO,OAAO,CAAC,gBAAgB,KAAK,UAAU,EAAE,CAAC;QACtG,QAAQ,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,EAAE,8EAA8E,CAAC,CAAC;IAC7G,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAEM,KAAK,UAAU,wBAAwB,CAC5C,OAAuB,EACvB,UAAgC,EAAE;IAElC,MAAM,QAAQ,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC/C,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,oCAAoC,CAAC;IAChF,MAAM,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,IAAI,MAAM,CAAC;IAE5D,IAAI,MAAqB,CAAC;IAC1B,IAAI,CAAC;QACH,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;IACjD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,QAAQ,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,EAAE,uCAAuC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC5H,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK,MAAM,MAAM,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,mBAAmB,EAAE,SAAS,CAAU,EAAE,CAAC;QAClF,IAAI,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,UAAU,EAAE,CAAC;YACzC,QAAQ,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,EAAE,YAAY,MAAM,qBAAqB,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,kBAAkB,CAAC,MAAM,CAAC,iBAAiB,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;IAErE,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,IAAI,CAAC;YACjB,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC;YACxB,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC;SACvG,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,QAAQ,CAAC,IAAI,CACX,GAAG,OAAO,CAAC,EAAE,2GAA2G;cACtH,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAC3D,CAAC;IACJ,CAAC;IAED,kBAAkB,CAAC,MAAM,CAAC,iBAAiB,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;IAErE,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;IACzB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,QAAQ,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,EAAE,8CAA8C,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACrI,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -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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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { DashboardSnapshot } from "./types";
|
|
2
|
+
export type HistoryEventKind = "wait.opened" | "wait.resolved" | "session.started" | "session.finished";
|
|
3
|
+
export interface HistoryEvent {
|
|
4
|
+
at: string;
|
|
5
|
+
kind: HistoryEventKind;
|
|
6
|
+
projectLabel: string;
|
|
7
|
+
agentLabel: string;
|
|
8
|
+
provenance: string;
|
|
9
|
+
detail: string | null;
|
|
10
|
+
waitMs?: number;
|
|
11
|
+
}
|
|
12
|
+
export interface HistoryFleetView {
|
|
13
|
+
projects: Pick<DashboardSnapshot, "projectLabel" | "agents">[];
|
|
14
|
+
}
|
|
15
|
+
export declare function diffFleetForHistory(previous: HistoryFleetView | null, next: HistoryFleetView, nowMs?: number): HistoryEvent[];
|
|
16
|
+
export declare function appendHistoryEvents(events: HistoryEvent[]): void;
|
|
17
|
+
export declare function readHistoryEvents(sinceMs: number, nowMs?: number): HistoryEvent[];
|
package/dist/history.js
ADDED
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.diffFleetForHistory = diffFleetForHistory;
|
|
4
|
+
exports.appendHistoryEvents = appendHistoryEvents;
|
|
5
|
+
exports.readHistoryEvents = readHistoryEvents;
|
|
6
|
+
const node_fs_1 = require("node:fs");
|
|
7
|
+
const node_path_1 = require("node:path");
|
|
8
|
+
const app_settings_1 = require("./app-settings");
|
|
9
|
+
const HISTORY_JOURNAL_MAX_BYTES = 2 * 1024 * 1024;
|
|
10
|
+
function historyDirectory() {
|
|
11
|
+
return (0, node_path_1.join)((0, app_settings_1.getAppDataDirectory)(), "history");
|
|
12
|
+
}
|
|
13
|
+
function historyJournalPath() {
|
|
14
|
+
return (0, node_path_1.join)(historyDirectory(), "journal.jsonl");
|
|
15
|
+
}
|
|
16
|
+
function isBusy(agent) {
|
|
17
|
+
return agent.isCurrent === true || agent.isOngoing === true;
|
|
18
|
+
}
|
|
19
|
+
function trackedAgents(fleet) {
|
|
20
|
+
const tracked = new Map();
|
|
21
|
+
for (const project of fleet.projects) {
|
|
22
|
+
for (const agent of project.agents) {
|
|
23
|
+
tracked.set(agent.id, { agent, projectLabel: project.projectLabel });
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return tracked;
|
|
27
|
+
}
|
|
28
|
+
function diffFleetForHistory(previous, next, nowMs = Date.now()) {
|
|
29
|
+
const at = new Date(nowMs).toISOString();
|
|
30
|
+
const events = [];
|
|
31
|
+
const before = previous ? trackedAgents(previous) : new Map();
|
|
32
|
+
const after = trackedAgents(next);
|
|
33
|
+
for (const [id, { agent, projectLabel }] of after) {
|
|
34
|
+
const prior = before.get(id);
|
|
35
|
+
if (agent.needsUser && !prior?.agent.needsUser) {
|
|
36
|
+
events.push({
|
|
37
|
+
at,
|
|
38
|
+
kind: "wait.opened",
|
|
39
|
+
projectLabel,
|
|
40
|
+
agentLabel: agent.label,
|
|
41
|
+
provenance: agent.provenance,
|
|
42
|
+
detail: agent.needsUser.kind
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
if (!agent.needsUser && prior?.agent.needsUser) {
|
|
46
|
+
const openedMs = Date.parse(prior.agent.updatedAt);
|
|
47
|
+
events.push({
|
|
48
|
+
at,
|
|
49
|
+
kind: "wait.resolved",
|
|
50
|
+
projectLabel,
|
|
51
|
+
agentLabel: agent.label,
|
|
52
|
+
provenance: agent.provenance,
|
|
53
|
+
detail: prior.agent.needsUser?.kind ?? null,
|
|
54
|
+
waitMs: Number.isFinite(openedMs) ? Math.max(0, nowMs - openedMs) : undefined
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
if (previous && isBusy(agent) && (!prior || !isBusy(prior.agent))) {
|
|
58
|
+
events.push({
|
|
59
|
+
at,
|
|
60
|
+
kind: "session.started",
|
|
61
|
+
projectLabel,
|
|
62
|
+
agentLabel: agent.label,
|
|
63
|
+
provenance: agent.provenance,
|
|
64
|
+
detail: agent.detail || null
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
if (prior && isBusy(prior.agent) && !isBusy(agent)) {
|
|
68
|
+
events.push({
|
|
69
|
+
at,
|
|
70
|
+
kind: "session.finished",
|
|
71
|
+
projectLabel,
|
|
72
|
+
agentLabel: agent.label,
|
|
73
|
+
provenance: agent.provenance,
|
|
74
|
+
detail: agent.detail || null
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
for (const [id, { agent, projectLabel }] of before) {
|
|
79
|
+
if (after.has(id)) {
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
if (isBusy(agent)) {
|
|
83
|
+
events.push({
|
|
84
|
+
at,
|
|
85
|
+
kind: "session.finished",
|
|
86
|
+
projectLabel,
|
|
87
|
+
agentLabel: agent.label,
|
|
88
|
+
provenance: agent.provenance,
|
|
89
|
+
detail: agent.detail || null
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
if (agent.needsUser) {
|
|
93
|
+
const openedMs = Date.parse(agent.updatedAt);
|
|
94
|
+
events.push({
|
|
95
|
+
at,
|
|
96
|
+
kind: "wait.resolved",
|
|
97
|
+
projectLabel,
|
|
98
|
+
agentLabel: agent.label,
|
|
99
|
+
provenance: agent.provenance,
|
|
100
|
+
detail: agent.needsUser.kind,
|
|
101
|
+
waitMs: Number.isFinite(openedMs) ? Math.max(0, nowMs - openedMs) : undefined
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return events;
|
|
106
|
+
}
|
|
107
|
+
function appendHistoryEvents(events) {
|
|
108
|
+
if (events.length === 0) {
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
(0, node_fs_1.mkdirSync)(historyDirectory(), { recursive: true });
|
|
112
|
+
const path = historyJournalPath();
|
|
113
|
+
try {
|
|
114
|
+
if ((0, node_fs_1.existsSync)(path) && (0, node_fs_1.statSync)(path).size > HISTORY_JOURNAL_MAX_BYTES) {
|
|
115
|
+
(0, node_fs_1.renameSync)(path, (0, node_path_1.join)(historyDirectory(), "journal.previous.jsonl"));
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
// Rotation is best-effort; appending still proceeds.
|
|
120
|
+
}
|
|
121
|
+
(0, node_fs_1.appendFileSync)(path, events.map((event) => JSON.stringify(event)).join("\n") + "\n");
|
|
122
|
+
}
|
|
123
|
+
function readHistoryEvents(sinceMs, nowMs = Date.now()) {
|
|
124
|
+
const events = [];
|
|
125
|
+
for (const file of ["journal.previous.jsonl", "journal.jsonl"]) {
|
|
126
|
+
const path = (0, node_path_1.join)(historyDirectory(), file);
|
|
127
|
+
if (!(0, node_fs_1.existsSync)(path)) {
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
for (const line of (0, node_fs_1.readFileSync)(path, "utf8").split(/\r?\n/)) {
|
|
131
|
+
if (!line) {
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
try {
|
|
135
|
+
const event = JSON.parse(line);
|
|
136
|
+
const atMs = Date.parse(event.at);
|
|
137
|
+
if (Number.isFinite(atMs) && atMs >= sinceMs && atMs <= nowMs) {
|
|
138
|
+
events.push(event);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
// Skip corrupted lines.
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return events.sort((left, right) => left.at.localeCompare(right.at));
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=history.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.js","sourceRoot":"","sources":["../src/history.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -3,12 +3,15 @@ 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";
|
|
10
12
|
export { normalizeRepositoryUrl } from "./cursor-lib/shared";
|
|
11
13
|
export * from "./domain/workspace-activity";
|
|
14
|
+
export * from "./history";
|
|
12
15
|
export * from "./hermes";
|
|
13
16
|
export * from "./hermes-hook-install";
|
|
14
17
|
export * from "./openclaw";
|
package/dist/index.js
CHANGED
|
@@ -20,13 +20,16 @@ __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);
|
|
27
29
|
var shared_1 = require("./cursor-lib/shared");
|
|
28
30
|
Object.defineProperty(exports, "normalizeRepositoryUrl", { enumerable: true, get: function () { return shared_1.normalizeRepositoryUrl; } });
|
|
29
31
|
__exportStar(require("./domain/workspace-activity"), exports);
|
|
32
|
+
__exportStar(require("./history"), exports);
|
|
30
33
|
__exportStar(require("./hermes"), exports);
|
|
31
34
|
__exportStar(require("./hermes-hook-install"), exports);
|
|
32
35
|
__exportStar(require("./openclaw"), 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,4CAA0B;AAC1B,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;
|
package/package.json
CHANGED
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agents-tower/core",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"license": "MIT",
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "git+https://github.com/Kundara/AgentsOfficeTower.git",
|
|
8
|
+
"directory": "packages/core"
|
|
9
|
+
},
|
|
5
10
|
"main": "dist/index.js",
|
|
6
11
|
"types": "dist/index.d.ts",
|
|
7
12
|
"files": [
|