@chipschat/harness 0.0.0-stage → 1.0.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/LICENSE +201 -0
- package/README.md +66 -2
- package/dist/asks.d.ts +75 -0
- package/dist/asks.d.ts.map +1 -0
- package/dist/asks.js +103 -0
- package/dist/asks.js.map +1 -0
- package/dist/connect.d.ts +406 -0
- package/dist/connect.d.ts.map +1 -0
- package/dist/connect.js +883 -0
- package/dist/connect.js.map +1 -0
- package/dist/events.d.ts +89 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +36 -0
- package/dist/events.js.map +1 -0
- package/dist/files.d.ts +34 -0
- package/dist/files.d.ts.map +1 -0
- package/dist/files.js +78 -0
- package/dist/files.js.map +1 -0
- package/dist/heard.d.ts +22 -0
- package/dist/heard.d.ts.map +1 -0
- package/dist/heard.js +32 -0
- package/dist/heard.js.map +1 -0
- package/dist/index.d.ts +56 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +29 -0
- package/dist/index.js.map +1 -0
- package/dist/join.d.ts +101 -0
- package/dist/join.d.ts.map +1 -0
- package/dist/join.js +289 -0
- package/dist/join.js.map +1 -0
- package/dist/keep.d.ts +33 -0
- package/dist/keep.d.ts.map +1 -0
- package/dist/keep.js +160 -0
- package/dist/keep.js.map +1 -0
- package/dist/lane.d.ts +73 -0
- package/dist/lane.d.ts.map +1 -0
- package/dist/lane.js +105 -0
- package/dist/lane.js.map +1 -0
- package/dist/outbox.d.ts +50 -0
- package/dist/outbox.d.ts.map +1 -0
- package/dist/outbox.js +52 -0
- package/dist/outbox.js.map +1 -0
- package/dist/project.d.ts +224 -0
- package/dist/project.d.ts.map +1 -0
- package/dist/project.js +619 -0
- package/dist/project.js.map +1 -0
- package/dist/prompt.d.ts +61 -0
- package/dist/prompt.d.ts.map +1 -0
- package/dist/prompt.js +87 -0
- package/dist/prompt.js.map +1 -0
- package/dist/rules.d.ts +18 -0
- package/dist/rules.d.ts.map +1 -0
- package/dist/rules.js +25 -0
- package/dist/rules.js.map +1 -0
- package/dist/run.d.ts +246 -0
- package/dist/run.d.ts.map +1 -0
- package/dist/run.js +295 -0
- package/dist/run.js.map +1 -0
- package/dist/sending.d.ts +78 -0
- package/dist/sending.d.ts.map +1 -0
- package/dist/sending.js +149 -0
- package/dist/sending.js.map +1 -0
- package/dist/service.d.ts +124 -0
- package/dist/service.d.ts.map +1 -0
- package/dist/service.js +349 -0
- package/dist/service.js.map +1 -0
- package/dist/settings.d.ts +137 -0
- package/dist/settings.d.ts.map +1 -0
- package/dist/settings.js +228 -0
- package/dist/settings.js.map +1 -0
- package/dist/steps.d.ts +27 -0
- package/dist/steps.d.ts.map +1 -0
- package/dist/steps.js +26 -0
- package/dist/steps.js.map +1 -0
- package/dist/store.d.ts +35 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +52 -0
- package/dist/store.js.map +1 -0
- package/package.json +38 -3
package/dist/lane.js
ADDED
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A lane, from the lead's side: what `run.task()` hands back. The task is acknowledged with
|
|
3
|
+
* where the lane lives and which run it is; from then on the lead hears the lane's news as
|
|
4
|
+
* `lane.updated` — waiting, completed with the specialist's summary and what it cost, failed,
|
|
5
|
+
* cancelled — and `result` resolves with the last of those. A task Chips flattened into a step
|
|
6
|
+
* has no lane, and `result` says so at once.
|
|
7
|
+
*
|
|
8
|
+
* A lane between two spaces of one harness — a Space handed down to, a subagent — is routed to
|
|
9
|
+
* the harness itself, and the lead works it: `work()` is the run to post into (M3.5, ADR 0032).
|
|
10
|
+
*/
|
|
11
|
+
import { Emitter } from "./events.js";
|
|
12
|
+
const OVER = new Set(["completed", "failed", "cancelled"]);
|
|
13
|
+
export class Lane {
|
|
14
|
+
id;
|
|
15
|
+
wire;
|
|
16
|
+
events = new Emitter();
|
|
17
|
+
settle;
|
|
18
|
+
stop;
|
|
19
|
+
laneState = "opening";
|
|
20
|
+
laneRunId;
|
|
21
|
+
laneSpaceId;
|
|
22
|
+
lastSummary;
|
|
23
|
+
lastCost;
|
|
24
|
+
/** Resolves when the lane ends, or at once when the task was flattened. Never rejects. */
|
|
25
|
+
result;
|
|
26
|
+
constructor(id, wire) {
|
|
27
|
+
this.id = id;
|
|
28
|
+
this.wire = wire;
|
|
29
|
+
this.result = new Promise((resolve) => {
|
|
30
|
+
this.settle = resolve;
|
|
31
|
+
});
|
|
32
|
+
// Listening before the task is sent: the specialist may answer before the ack arrives.
|
|
33
|
+
this.stop = wire.hear(id, (event) => this.onUpdated(event));
|
|
34
|
+
}
|
|
35
|
+
/** The specialist's run, which the lane is. Known once the task is acknowledged. */
|
|
36
|
+
get runId() {
|
|
37
|
+
return this.laneRunId;
|
|
38
|
+
}
|
|
39
|
+
/** Where the lane lives. Known once the task is acknowledged. */
|
|
40
|
+
get spaceId() {
|
|
41
|
+
return this.laneSpaceId;
|
|
42
|
+
}
|
|
43
|
+
/** Where the lane got to: `opening` until acknowledged, then the specialist's state. */
|
|
44
|
+
get state() {
|
|
45
|
+
return this.laneState;
|
|
46
|
+
}
|
|
47
|
+
get summary() {
|
|
48
|
+
return this.lastSummary;
|
|
49
|
+
}
|
|
50
|
+
get costUsd() {
|
|
51
|
+
return this.lastCost;
|
|
52
|
+
}
|
|
53
|
+
/** True once the lane will not change again. */
|
|
54
|
+
get over() {
|
|
55
|
+
return this.laneState === "flattened" || OVER.has(this.laneState);
|
|
56
|
+
}
|
|
57
|
+
on(name, handler) {
|
|
58
|
+
return this.events.on(name, handler);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* The lane's run, for a lead that works the lane itself — a lane between two of its own
|
|
62
|
+
* spaces. Everything sent on it lands in the lane's home, as the lane's own steps and messages.
|
|
63
|
+
*/
|
|
64
|
+
work() {
|
|
65
|
+
if (this.laneRunId === undefined || this.laneSpaceId === undefined) {
|
|
66
|
+
throw new Error(this.laneState === "flattened"
|
|
67
|
+
? "this task was flattened into a step; there is no lane to work"
|
|
68
|
+
: "the lane has not been acknowledged yet");
|
|
69
|
+
}
|
|
70
|
+
return this.wire.accept(this.laneRunId, this.laneSpaceId, this.id);
|
|
71
|
+
}
|
|
72
|
+
/** The task's acknowledgement: where the lane is, or that there is none. */
|
|
73
|
+
opened(lane) {
|
|
74
|
+
if (lane === undefined) {
|
|
75
|
+
this.laneState = "flattened";
|
|
76
|
+
this.finish({ state: "flattened" });
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
this.laneRunId = lane.runId;
|
|
80
|
+
this.laneSpaceId = lane.spaceId;
|
|
81
|
+
if (this.laneState === "opening")
|
|
82
|
+
this.laneState = "running";
|
|
83
|
+
}
|
|
84
|
+
onUpdated(event) {
|
|
85
|
+
this.laneState = event.state;
|
|
86
|
+
this.lastSummary = event.summary ?? this.lastSummary;
|
|
87
|
+
this.lastCost = event.cost_usd ?? this.lastCost;
|
|
88
|
+
this.events.emit("updated", event);
|
|
89
|
+
if (event.state === "completed" || event.state === "failed" || event.state === "cancelled") {
|
|
90
|
+
this.finish({
|
|
91
|
+
state: event.state,
|
|
92
|
+
summary: this.lastSummary,
|
|
93
|
+
costUsd: this.lastCost,
|
|
94
|
+
event,
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
finish(outcome) {
|
|
99
|
+
this.stop?.();
|
|
100
|
+
this.stop = undefined;
|
|
101
|
+
this.settle?.(outcome);
|
|
102
|
+
this.settle = undefined;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=lane.js.map
|
package/dist/lane.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lane.js","sourceRoot":"","sources":["../src/lane.ts"],"names":[],"mappings":"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"}
|
package/dist/outbox.d.ts
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What has been sent and not yet answered. A socket comes and goes; a harness's events must
|
|
3
|
+
* not. Every event carries an idempotency key and the server answers each with an `ack` or an
|
|
4
|
+
* `error` naming it; until then the event waits here, and every socket that opens — the first
|
|
5
|
+
* time, or again after a drop — sends the unanswered ones first. A resend the server had
|
|
6
|
+
* already applied comes back `duplicate: true`, which is what the key is for.
|
|
7
|
+
*/
|
|
8
|
+
export interface Ack {
|
|
9
|
+
readonly idempotencyKey: string;
|
|
10
|
+
readonly seq: number;
|
|
11
|
+
readonly duplicate: boolean;
|
|
12
|
+
/** For a `task` that opened a lane: where it lives and which run it is (M3.5). */
|
|
13
|
+
readonly lane?: {
|
|
14
|
+
readonly laneId: string;
|
|
15
|
+
readonly runId: string;
|
|
16
|
+
readonly spaceId: string;
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* A message Chips took into the room but held from the agents it named (ADR 0097): they have
|
|
20
|
+
* sent each other their allowance since a person last acted, or a person paused them. Tell the
|
|
21
|
+
* model, so it says what is done and what is blocked rather than waiting on them.
|
|
22
|
+
*/
|
|
23
|
+
readonly held?: true;
|
|
24
|
+
/**
|
|
25
|
+
* With `held`: the messages between agents since the reset, and the workspace's hold (ADR
|
|
26
|
+
* 0187), absent where it holds them only on a pause.
|
|
27
|
+
*/
|
|
28
|
+
readonly exchange?: {
|
|
29
|
+
readonly count: number;
|
|
30
|
+
readonly allowance?: number;
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
export declare class RefusedError extends Error {
|
|
34
|
+
readonly code: string;
|
|
35
|
+
readonly idempotencyKey?: string | undefined;
|
|
36
|
+
readonly name = "RefusedError";
|
|
37
|
+
constructor(code: string, message: string, idempotencyKey?: string | undefined);
|
|
38
|
+
}
|
|
39
|
+
export interface Outbox {
|
|
40
|
+
/** Hold an event until the server answers for its key. */
|
|
41
|
+
readonly add: (key: string, event: Readonly<Record<string, unknown>>) => Promise<Ack>;
|
|
42
|
+
readonly unanswered: () => readonly Readonly<Record<string, unknown>>[];
|
|
43
|
+
readonly acked: (ack: Ack) => void;
|
|
44
|
+
readonly refused: (error: RefusedError) => void;
|
|
45
|
+
/** Reject everything still waiting: the connection is gone for good. */
|
|
46
|
+
readonly abandon: (reason: string) => void;
|
|
47
|
+
readonly size: () => number;
|
|
48
|
+
}
|
|
49
|
+
export declare function createOutbox(): Outbox;
|
|
50
|
+
//# sourceMappingURL=outbox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outbox.d.ts","sourceRoot":"","sources":["../src/outbox.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,GAAG;IAClB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,kFAAkF;IAClF,QAAQ,CAAC,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9F;;;;OAIG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC;IACrB;;;OAGG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE;QAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7E;AAED,qBAAa,YAAa,SAAQ,KAAK;IAGnC,QAAQ,CAAC,IAAI,EAAE,MAAM;IAErB,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM;IAJlC,SAAkB,IAAI,kBAAkB;gBAE7B,IAAI,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,EACN,cAAc,CAAC,EAAE,MAAM,YAAA;CAInC;AAQD,MAAM,WAAW,MAAM;IACrB,0DAA0D;IAC1D,QAAQ,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IACtF,QAAQ,CAAC,UAAU,EAAE,MAAM,SAAS,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC;IACxE,QAAQ,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,CAAC;IACnC,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IAChD,wEAAwE;IACxE,QAAQ,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,QAAQ,CAAC,IAAI,EAAE,MAAM,MAAM,CAAC;CAC7B;AAED,wBAAgB,YAAY,IAAI,MAAM,CA8BrC"}
|
package/dist/outbox.js
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What has been sent and not yet answered. A socket comes and goes; a harness's events must
|
|
3
|
+
* not. Every event carries an idempotency key and the server answers each with an `ack` or an
|
|
4
|
+
* `error` naming it; until then the event waits here, and every socket that opens — the first
|
|
5
|
+
* time, or again after a drop — sends the unanswered ones first. A resend the server had
|
|
6
|
+
* already applied comes back `duplicate: true`, which is what the key is for.
|
|
7
|
+
*/
|
|
8
|
+
export class RefusedError extends Error {
|
|
9
|
+
code;
|
|
10
|
+
idempotencyKey;
|
|
11
|
+
name = "RefusedError";
|
|
12
|
+
constructor(code, message, idempotencyKey) {
|
|
13
|
+
super(message);
|
|
14
|
+
this.code = code;
|
|
15
|
+
this.idempotencyKey = idempotencyKey;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export function createOutbox() {
|
|
19
|
+
const waiting = new Map();
|
|
20
|
+
return {
|
|
21
|
+
add(key, event) {
|
|
22
|
+
return new Promise((resolve, reject) => {
|
|
23
|
+
waiting.set(key, { event, resolve, reject });
|
|
24
|
+
});
|
|
25
|
+
},
|
|
26
|
+
unanswered: () => [...waiting.values()].map((entry) => entry.event),
|
|
27
|
+
acked(ack) {
|
|
28
|
+
const entry = waiting.get(ack.idempotencyKey);
|
|
29
|
+
if (entry === undefined)
|
|
30
|
+
return;
|
|
31
|
+
waiting.delete(ack.idempotencyKey);
|
|
32
|
+
entry.resolve(ack);
|
|
33
|
+
},
|
|
34
|
+
refused(error) {
|
|
35
|
+
if (error.idempotencyKey === undefined)
|
|
36
|
+
return;
|
|
37
|
+
const entry = waiting.get(error.idempotencyKey);
|
|
38
|
+
if (entry === undefined)
|
|
39
|
+
return;
|
|
40
|
+
waiting.delete(error.idempotencyKey);
|
|
41
|
+
entry.reject(error);
|
|
42
|
+
},
|
|
43
|
+
abandon(reason) {
|
|
44
|
+
for (const [key, entry] of waiting) {
|
|
45
|
+
waiting.delete(key);
|
|
46
|
+
entry.reject(new RefusedError("closed", reason, key));
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
size: () => waiting.size,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=outbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outbox.js","sourceRoot":"","sources":["../src/outbox.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAqBH,MAAM,OAAO,YAAa,SAAQ,KAAK;IAG1B;IAEA;IAJO,IAAI,GAAG,cAAc,CAAC;IACxC,YACW,IAAY,EACrB,OAAe,EACN,cAAuB;QAEhC,KAAK,CAAC,OAAO,CAAC,CAAC;QAJN,SAAI,GAAJ,IAAI,CAAQ;QAEZ,mBAAc,GAAd,cAAc,CAAS;IAGlC,CAAC;CACF;AAmBD,MAAM,UAAU,YAAY;IAC1B,MAAM,OAAO,GAAG,IAAI,GAAG,EAAmB,CAAC;IAC3C,OAAO;QACL,GAAG,CAAC,GAAG,EAAE,KAAK;YACZ,OAAO,IAAI,OAAO,CAAM,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBAC1C,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;YAC/C,CAAC,CAAC,CAAC;QACL,CAAC;QACD,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC;QACnE,KAAK,CAAC,GAAG;YACP,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YAC9C,IAAI,KAAK,KAAK,SAAS;gBAAE,OAAO;YAChC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YACnC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACrB,CAAC;QACD,OAAO,CAAC,KAAK;YACX,IAAI,KAAK,CAAC,cAAc,KAAK,SAAS;gBAAE,OAAO;YAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;YAChD,IAAI,KAAK,KAAK,SAAS;gBAAE,OAAO;YAChC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;YACrC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;QACD,OAAO,CAAC,MAAM;YACZ,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC;gBACnC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACpB,KAAK,CAAC,MAAM,CAAC,IAAI,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;YACxD,CAAC;QACH,CAAC;QACD,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI;KACzB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A room's project, for one agent (ADR 0221): the agent works in a copy of its own, `<its
|
|
3
|
+
* folder>/room`, and the bridge does the git, never the agent.
|
|
4
|
+
*
|
|
5
|
+
* - **Before a turn, `pull`.** The copy is made on first use, its leave-out list written into its
|
|
6
|
+
* own `info/exclude`, and brought up to date with the room's `main`. What a turn left unsent goes
|
|
7
|
+
* in first, so nothing of it is lost. What others changed since the agent's last turn, and who, is
|
|
8
|
+
* what the turn is told, with a clash still to settle or a key to take out (`renderProjectNote`).
|
|
9
|
+
* - **After a turn, `push`.** Everything the agent changed is committed under its name, with the
|
|
10
|
+
* first line of its words for the subject, and sent. When somebody sent first, the agent's commits
|
|
11
|
+
* are replayed on top of theirs and sent again. When the two changes overlap, the replay stops and
|
|
12
|
+
* the two are merged instead, so that both sides are marked in the agent's copy, labelled `yours`
|
|
13
|
+
* and with whose they clashed with; nothing is sent until the agent has settled them.
|
|
14
|
+
* - **What is never committed.** The leave-out list, and a file whose words look like a key: then
|
|
15
|
+
* nothing of the change is committed, and the next turn is told which file and why. The server
|
|
16
|
+
* refuses the same (ADR 0220), as the backstop.
|
|
17
|
+
*
|
|
18
|
+
* The token never reaches git's command line or a file: it goes through `GIT_CONFIG_*` in git's
|
|
19
|
+
* environment, beside the agent in `chips-actor`, so an agent's own `git push` carries neither.
|
|
20
|
+
* That keeps the token out of the copy, not out of the agent's reach: the agent can write the
|
|
21
|
+
* copy's `.git/config`, which git reads on every run. So the bridge fetches and sends by the
|
|
22
|
+
* project's URL, never what `origin` names, turns `core.fsmonitor` off, and leaves an agent's copy
|
|
23
|
+
* alone while its config holds anything git and the bridge didn't put there, such as a rewritten
|
|
24
|
+
* URL, a proxy or a program for git to run (SEC-52). git reads none of the machine's config and
|
|
25
|
+
* runs none of its hooks, so a person's own git setup (a signing key, a hook, `pull.rebase`) changes
|
|
26
|
+
* nothing here.
|
|
27
|
+
*
|
|
28
|
+
* **A person's folder** is the same copy with `person` set (ADR 0224), as the Mac app's Your folder
|
|
29
|
+
* keeps it: the folder itself is the copy, the token a project token and the commits theirs. It is
|
|
30
|
+
* never committed to behind their back: `look` brings it up to `main` only while nothing in it is
|
|
31
|
+
* theirs, and `push` sends what they changed when they say Send.
|
|
32
|
+
*/
|
|
33
|
+
import { type ProjectFacts } from "@chipschat/protocol";
|
|
34
|
+
export interface ProjectOptions {
|
|
35
|
+
/** Where chipsd is: `http://127.0.0.1:4431`. */
|
|
36
|
+
readonly url: string;
|
|
37
|
+
/** The harness's token. */
|
|
38
|
+
readonly token: string;
|
|
39
|
+
readonly spaceId: string;
|
|
40
|
+
/** The agent the turns are for: what `chips-actor` names, and the commits' author. */
|
|
41
|
+
readonly agentId: string;
|
|
42
|
+
/** The agent's name, as its commits are signed. */
|
|
43
|
+
readonly name: string;
|
|
44
|
+
/** The agent's own folder; its copy of the project is `room` in it. */
|
|
45
|
+
readonly folder: string;
|
|
46
|
+
/** The git to run. `git` on the `PATH` unless said. */
|
|
47
|
+
readonly git?: string | undefined;
|
|
48
|
+
/** The `PATH` git is run with. This process's unless said. */
|
|
49
|
+
readonly path?: string | undefined;
|
|
50
|
+
/** Told what went wrong, for the bridge's log. */
|
|
51
|
+
readonly log?: ((line: string) => void) | undefined;
|
|
52
|
+
/**
|
|
53
|
+
* A person's own folder rather than an agent's copy (ADR 0224): `token` is a project token, sent
|
|
54
|
+
* with no `chips-actor`; `agentId` is the person's id, their commits `<id>@people.chips.invalid`;
|
|
55
|
+
* and the copy is `folder` itself.
|
|
56
|
+
*/
|
|
57
|
+
readonly person?: boolean | undefined;
|
|
58
|
+
}
|
|
59
|
+
/** A file a person changed in their folder and hasn't sent, with the lines it adds and takes out. */
|
|
60
|
+
export interface FolderChange {
|
|
61
|
+
readonly path: string;
|
|
62
|
+
readonly added: number;
|
|
63
|
+
readonly removed: number;
|
|
64
|
+
}
|
|
65
|
+
/** A person's folder as it stands (ADR 0224), for Your folder's card. */
|
|
66
|
+
export interface FolderLook {
|
|
67
|
+
/** What they changed and haven't sent: none while it is the room's `main`. */
|
|
68
|
+
readonly changed: readonly FolderChange[];
|
|
69
|
+
/** Files with both sides of a clash marked in them, and whose change they clashed with. */
|
|
70
|
+
readonly clashes: readonly string[];
|
|
71
|
+
readonly clashedWith: readonly string[];
|
|
72
|
+
/** The first marked lines of the first of them, with a line before and after. */
|
|
73
|
+
readonly marked?: string | undefined;
|
|
74
|
+
/** What others changed that isn't in the folder yet, because the person has changes of their own. */
|
|
75
|
+
readonly since: readonly string[];
|
|
76
|
+
readonly by: readonly string[];
|
|
77
|
+
/** What came in from the room this time, and whose it was. */
|
|
78
|
+
readonly came: readonly string[];
|
|
79
|
+
readonly cameBy: readonly string[];
|
|
80
|
+
/** Why the room's project couldn't be reached, in git's or the server's words. */
|
|
81
|
+
readonly trouble?: string | undefined;
|
|
82
|
+
}
|
|
83
|
+
/** What `push` did with the turn's work. */
|
|
84
|
+
export type Pushed = {
|
|
85
|
+
readonly state: "sent";
|
|
86
|
+
/** Where the room's `main` is now: this push's commit. */
|
|
87
|
+
readonly commit: string;
|
|
88
|
+
readonly files: readonly string[];
|
|
89
|
+
/** Whose changes it was replayed on top of, by name; none when it went straight on. */
|
|
90
|
+
readonly over: readonly string[];
|
|
91
|
+
}
|
|
92
|
+
/** Nothing changed in the copy. */
|
|
93
|
+
| {
|
|
94
|
+
readonly state: "nothing";
|
|
95
|
+
}
|
|
96
|
+
/** It clashed with somebody's change, and both sides are marked in the copy for the next turn. */
|
|
97
|
+
| {
|
|
98
|
+
readonly state: "clash";
|
|
99
|
+
readonly files: readonly string[];
|
|
100
|
+
readonly with: readonly string[];
|
|
101
|
+
}
|
|
102
|
+
/** A file in it looks like it holds a key, so nothing was committed. */
|
|
103
|
+
| {
|
|
104
|
+
readonly state: "keys";
|
|
105
|
+
readonly keys: readonly {
|
|
106
|
+
path: string;
|
|
107
|
+
what: string;
|
|
108
|
+
}[];
|
|
109
|
+
}
|
|
110
|
+
/** The room's project turned it back, in the server's words. */
|
|
111
|
+
| {
|
|
112
|
+
readonly state: "refused";
|
|
113
|
+
readonly why: string;
|
|
114
|
+
}
|
|
115
|
+
/** It couldn't be sent: the server unreachable, or others sending first again and again. */
|
|
116
|
+
| {
|
|
117
|
+
readonly state: "failed";
|
|
118
|
+
readonly why: string;
|
|
119
|
+
};
|
|
120
|
+
/** A commit's subject: the first line of the agent's words, as it said it. */
|
|
121
|
+
export declare function subjectOf(words: string): string;
|
|
122
|
+
/** What `push` did, in a few words for the bridge's log. */
|
|
123
|
+
export declare function pushedInWords(pushed: Pushed): string;
|
|
124
|
+
/**
|
|
125
|
+
* What a reply says after its words when its change didn't reach the room's project (AP-6, ADR
|
|
126
|
+
* 0222's addendum): a line in brackets, as a file that didn't attach has (`sendAnswer`), so that
|
|
127
|
+
* "it's in the project" is never the last word on a change that isn't. Nothing when it was sent,
|
|
128
|
+
* or when nothing changed.
|
|
129
|
+
*/
|
|
130
|
+
export declare function heldNote(pushed: Pushed, name: string): string | undefined;
|
|
131
|
+
/** Whether this machine has a git new enough for a room's project, or why not. */
|
|
132
|
+
export declare function checkGit(git?: string, path?: string): Promise<{
|
|
133
|
+
ok: true;
|
|
134
|
+
version: string;
|
|
135
|
+
} | {
|
|
136
|
+
ok: false;
|
|
137
|
+
why: string;
|
|
138
|
+
}>;
|
|
139
|
+
export declare class Project {
|
|
140
|
+
private readonly options;
|
|
141
|
+
/** The agent's copy of the project. */
|
|
142
|
+
readonly copy: string;
|
|
143
|
+
private readonly remote;
|
|
144
|
+
constructor(options: ProjectOptions);
|
|
145
|
+
/** Before a turn: the copy made or brought up to date, and what the turn is to be told of it. */
|
|
146
|
+
pull(): Promise<ProjectFacts>;
|
|
147
|
+
/** After a turn: what the agent changed, committed under its name and sent to the room. */
|
|
148
|
+
push(input: {
|
|
149
|
+
readonly words: string;
|
|
150
|
+
}): Promise<Pushed>;
|
|
151
|
+
/**
|
|
152
|
+
* A person's folder made, or brought up to the room's `main` while nothing in it is theirs: no
|
|
153
|
+
* file changed or added, nothing waiting to be sent, no clash (ADR 0224). Once something is
|
|
154
|
+
* theirs, nothing in the folder changes; what others changed since is told instead.
|
|
155
|
+
*/
|
|
156
|
+
look(): Promise<FolderLook>;
|
|
157
|
+
/** The folder moved on to the room's `main` while nothing in it is theirs: what came in, whose. */
|
|
158
|
+
private bringUntouched;
|
|
159
|
+
/**
|
|
160
|
+
* A clash the person settled by taking the room's side whole: nothing of theirs is left to send,
|
|
161
|
+
* so the folder goes back to the room's `main` and is kept up to date again. Every tracked file
|
|
162
|
+
* is already the room's, and a file git doesn't track is never touched.
|
|
163
|
+
*/
|
|
164
|
+
private settledAsTheirs;
|
|
165
|
+
/** Whether nothing in the folder is the person's own: no change, no unsent commit, no clash. */
|
|
166
|
+
private untouched;
|
|
167
|
+
/** What the person changed, a clash, and what others changed that the folder hasn't. */
|
|
168
|
+
private standing;
|
|
169
|
+
/**
|
|
170
|
+
* What the person's changes are measured from: where the folder and the room's `main` parted.
|
|
171
|
+
* In a clash the room's side is already in the folder, so it is `main` itself: what differs from
|
|
172
|
+
* it is what Send would change.
|
|
173
|
+
*/
|
|
174
|
+
private baseOf;
|
|
175
|
+
/** How many lines a file the person added has: the lines it adds. None for a picture. */
|
|
176
|
+
private lineCount;
|
|
177
|
+
/** The first clash in a file, from the line before its first mark to the line after its last. */
|
|
178
|
+
private markedLines;
|
|
179
|
+
/**
|
|
180
|
+
* One try at sending: sent, nothing to send, or turned back; or, when somebody sent first, the
|
|
181
|
+
* agent's commits replayed on top of theirs, for the next try, unless they clashed.
|
|
182
|
+
*/
|
|
183
|
+
private send;
|
|
184
|
+
/** The room's branches, from the project's own URL rather than whatever `origin` names (SEC-52). */
|
|
185
|
+
private fetch;
|
|
186
|
+
/**
|
|
187
|
+
* Why an agent's copy is left alone: its config holds a setting git and the bridge didn't write,
|
|
188
|
+
* or can't be read (SEC-52). Nothing for a person's folder, whose config is theirs.
|
|
189
|
+
*/
|
|
190
|
+
private foreignConfig;
|
|
191
|
+
/**
|
|
192
|
+
* The copy, made on first use, pointed at the room's project, its leave-out list written: whether
|
|
193
|
+
* it was made now.
|
|
194
|
+
*/
|
|
195
|
+
private ready;
|
|
196
|
+
/** The copy at the room's `main`, with the agent's own unsent commits replayed on top. */
|
|
197
|
+
private bringUp;
|
|
198
|
+
/**
|
|
199
|
+
* The agent's commits replayed on top of `onto`. Where they overlap, the replay is undone and the
|
|
200
|
+
* two merged instead, which leaves both sides marked in the files, labelled for whose they are.
|
|
201
|
+
* Two copies that both began in an empty project share no commit, and the merge is still made.
|
|
202
|
+
*/
|
|
203
|
+
private replay;
|
|
204
|
+
/** git's labels for a clash's two sides, `HEAD` and a commit, as a person reads them. */
|
|
205
|
+
private label;
|
|
206
|
+
/** Files git still holds as clashing that still carry marks. */
|
|
207
|
+
private marked;
|
|
208
|
+
/** Whose change a clash in progress is with, by name. */
|
|
209
|
+
private mergingWith;
|
|
210
|
+
/**
|
|
211
|
+
* Everything in the copy committed as the agent, a clash it settled included; nothing when
|
|
212
|
+
* nothing changed. A file that looks like it holds a key stops the commit: the keys, by file.
|
|
213
|
+
*/
|
|
214
|
+
private commit;
|
|
215
|
+
/** Which of these files hold what looks like a key, and whose. */
|
|
216
|
+
private keysIn;
|
|
217
|
+
private facts;
|
|
218
|
+
/** Who made the commits in a range, by name, the agent itself left out. */
|
|
219
|
+
private authors;
|
|
220
|
+
private head;
|
|
221
|
+
private emptyTree;
|
|
222
|
+
private git;
|
|
223
|
+
}
|
|
224
|
+
//# sourceMappingURL=project.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"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"}
|