@twinsearth/w2m-dsh-plugin 2.0.4 → 2.0.5
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/.claude-plugin/marketplace.json +3 -3
- package/.claude-plugin/plugin.json +1 -1
- package/CHANGELOG.md +8 -0
- package/bin/w2m-joint.mjs +69 -7
- package/codex/mcp-servers.toml +1 -1
- package/docs/acceptance/2.0.5/RELEASE-205.json +21 -0
- package/docs/acceptance/2.0.5/RELEASE-2050.json +22 -0
- package/docs/adr/0001-collaboration-crdt.md +59 -0
- package/lib/client.js +146 -8
- package/package.json +2 -2
- package/plugin.json +1 -1
- package/src/agent/agent.mjs +97 -36
- package/src/agent/artifact-delivery.mjs +89 -0
- package/src/agent/caps.mjs +16 -2
- package/src/agent/sinks/git-sink.mjs +78 -0
- package/src/agent/sinks/ssh-sink.mjs +83 -0
- package/src/agent/sse-cursor.mjs +16 -0
- package/src/agent/sse-watchdog.mjs +71 -0
- package/src/plugin/dataplane-sink-route.mjs +113 -0
- package/src/plugin/fleet-chat-route.mjs +11 -0
- package/src/plugin/joint-dev/dispatch.mjs +5 -1
- package/src/plugin/joint-dev/merge-approval.mjs +115 -0
- package/src/plugin/joint-dev/progress.mjs +107 -0
- package/src/plugin/joint-dev/relay-dispatch.mjs +52 -22
- package/src/plugin/project-stream-route.mjs +58 -0
- package/src/plugin/tools-joint.mjs +6 -1
- package/src/plugin/tools.mjs +25 -5
- package/src/relay/fleet-messages.mjs +48 -24
- package/src/relay/project-room.mjs +47 -2
- package/src/relay/server.mjs +11 -5
- package/src/relay/state.mjs +63 -3
- package/src/util/chat-crypto.mjs +70 -1
- package/docs/COLLAB/COLLABORATION-MODEL.md +0 -240
- package/docs/COLLAB/EXECUTION-AUTH-MODEL.md +0 -361
- package/docs/COLLAB/M1-ACCEPTANCE-RUNBOOK.md +0 -70
- package/docs/COLLAB/M1-MAINTENANCE.md +0 -313
- package/docs/COLLAB/M2-TASK-GRANT.md +0 -231
- package/docs/COLLAB/M3-GIT-NATIVE-TASKS.md +0 -291
- package/docs/COLLAB/M4-PROJECT-ROOM.md +0 -260
- package/docs/COLLAB/M5-MULTI-CLIENT-PRIMITIVES.md +0 -263
- package/docs/COLLAB/M6-CROSS-NETWORK-RELIABILITY.md +0 -231
- package/docs/COLLAB/M7-METRICS-ACCEPTANCE.md +0 -263
- package/docs/COLLAB/TASK-MODEL.md +0 -281
- package/docs/acceptance/1.9.10/RELEASE-1910.json +0 -21
- package/docs/acceptance/1.9.11/RELEASE-1911.json +0 -20
- package/docs/acceptance/1.9.12/RELEASE-1912.json +0 -20
- package/docs/acceptance/1.9.13/RELEASE-1913.json +0 -20
- package/docs/acceptance/1.9.14/RELEASE-1914.json +0 -20
- package/docs/acceptance/1.9.15/RELEASE-1915.json +0 -22
- package/docs/acceptance/1.9.16/RELEASE-1916.json +0 -21
- package/docs/acceptance/1.9.17/RELEASE-1917.json +0 -20
- package/docs/acceptance/1.9.19/RELEASE-1919.json +0 -21
- package/docs/acceptance/1.9.20/RELEASE-1920.json +0 -22
- package/docs/acceptance/1.9.4/RELEASE-194.json +0 -23
- package/docs/acceptance/1.9.5/RELEASE-195.json +0 -23
- package/docs/acceptance/1.9.6/RELEASE-196.json +0 -22
- package/docs/acceptance/1.9.7/RELEASE-197.json +0 -21
- package/docs/acceptance/1.9.8/RELEASE-198.json +0 -21
- package/docs/acceptance/1.9.9/RELEASE-199.json +0 -21
- package/lib/client.js.bak2 +0 -640
- package/src/plugin/dataflow.mjs +0 -72
- package/src/plugin/fleet-target.mjs.bak-arch2 +0 -812
- package/src/plugin/fleet-target.mjs.bak-archive +0 -812
- package/src/plugin/tofuture/report.mjs +0 -44
- package/src/plugin/tools.mjs.bak-c7 +0 -7029
- package/src/relay/tofuture-whitelist.mjs +0 -46
- package/src/util/data-plane.mjs +0 -180
- package/src/util/sealed-object.mjs +0 -141
- package/src/util/tofuture-hmac.mjs +0 -30
package/src/plugin/dataflow.mjs
DELETED
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Data flow across the fleet: map results that are too big to return inline travel as blobs, and the reduce step names
|
|
3
|
-
* exactly which blob it read.
|
|
4
|
-
*
|
|
5
|
-
* ## Why a plan instead of a pipe
|
|
6
|
-
*
|
|
7
|
-
* Machines do not send data to each other directly: the relay is the only channel every machine can reach, and it already
|
|
8
|
-
* stores content-addressed blobs. So the shape is map -> PUT blob -> reduce by sha256. The decisions worth testing are the
|
|
9
|
-
* boundaries: when an output is inline, when it becomes a blob, and what happens when a blob a reduce depends on is not
|
|
10
|
-
* there. A pipeline that silently drops a shard is worse than one that fails.
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
/** Stage stdout at or below this travels inline in the result envelope. */
|
|
14
|
-
export const MAX_INLINE_BYTES = 64 * 1024;
|
|
15
|
-
|
|
16
|
-
/** Past this a stage output is not a result any more: it is a data problem the operator has to see. */
|
|
17
|
-
export const HARD_CAP_BYTES = 16 * 1024 * 1024;
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* Decide how one machine's stage output travels.
|
|
21
|
-
*
|
|
22
|
-
* @param {{machineId?: string, stageIndex?: number, stdoutBytes?: number}} input
|
|
23
|
-
* @returns {{ok: true, mode: 'inline'|'blob', stdoutBytes: number} | {ok: false, code: string, detail: object}}
|
|
24
|
-
*/
|
|
25
|
-
export function planStageOutput(input = {}) {
|
|
26
|
-
const machineId = typeof input.machineId === 'string' && input.machineId !== '' ? input.machineId : null;
|
|
27
|
-
if (machineId === null) return { ok: false, code: 'STAGE_MACHINE_MISSING', detail: {} };
|
|
28
|
-
const stdoutBytes = Number.isFinite(input.stdoutBytes) ? Math.max(0, Math.floor(input.stdoutBytes)) : 0;
|
|
29
|
-
if (stdoutBytes > HARD_CAP_BYTES) {
|
|
30
|
-
return { ok: false, code: 'STAGE_OUTPUT_TOO_LARGE', detail: { machineId, stdoutBytes, hardCapBytes: HARD_CAP_BYTES } };
|
|
31
|
-
}
|
|
32
|
-
return { ok: true, mode: stdoutBytes <= MAX_INLINE_BYTES ? 'inline' : 'blob', stdoutBytes };
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
const SHA256 = /^[0-9a-f]{64}$/;
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* Build the reduce input list from the map results.
|
|
39
|
-
*
|
|
40
|
-
* Every map machine must contribute exactly one entry: inline text is carried as-is, a blob result must name a sha256.
|
|
41
|
-
* A missing or malformed hash is refused by name -- the reduce step must never run on a partial fleet and call the answer
|
|
42
|
-
* complete.
|
|
43
|
-
*
|
|
44
|
-
* @param {{results?: Array<{machine_id?: string, mode?: string, stdout?: string, blob_sha256?: string}>,
|
|
45
|
-
* reducerMachineId?: string}} input
|
|
46
|
-
* @returns {{ok: true, reducerMachineId: string, inputs: Array<{machine_id: string, mode: 'inline'|'blob', stdout?: string, sha256?: string}>} |
|
|
47
|
-
* {ok: false, code: string, detail: object}}
|
|
48
|
-
*/
|
|
49
|
-
export function buildReducePlan(input = {}) {
|
|
50
|
-
const reducer = typeof input.reducerMachineId === 'string' && input.reducerMachineId !== '' ? input.reducerMachineId : null;
|
|
51
|
-
if (reducer === null) return { ok: false, code: 'REDUCER_MISSING', detail: {} };
|
|
52
|
-
const results = Array.isArray(input.results) ? input.results : null;
|
|
53
|
-
if (results === null || results.length === 0) return { ok: false, code: 'NO_MAP_RESULTS', detail: {} };
|
|
54
|
-
|
|
55
|
-
const seen = new Set();
|
|
56
|
-
const inputs = [];
|
|
57
|
-
for (const result of results) {
|
|
58
|
-
const machineId = typeof result?.machine_id === 'string' && result.machine_id !== '' ? result.machine_id : null;
|
|
59
|
-
if (machineId === null) return { ok: false, code: 'MAP_MACHINE_MISSING', detail: {} };
|
|
60
|
-
if (seen.has(machineId)) return { ok: false, code: 'MAP_MACHINE_DUPLICATE', detail: { machineId } };
|
|
61
|
-
seen.add(machineId);
|
|
62
|
-
const mode = result?.mode === 'blob' ? 'blob' : 'inline';
|
|
63
|
-
if (mode === 'blob') {
|
|
64
|
-
const sha = typeof result?.blob_sha256 === 'string' ? result.blob_sha256.toLowerCase() : '';
|
|
65
|
-
if (!SHA256.test(sha)) return { ok: false, code: 'BLOB_MISSING', detail: { machineId, sha256: result?.blob_sha256 ?? null } };
|
|
66
|
-
inputs.push({ machine_id: machineId, mode, sha256: sha });
|
|
67
|
-
} else {
|
|
68
|
-
inputs.push({ machine_id: machineId, mode, stdout: typeof result?.stdout === 'string' ? result.stdout : '' });
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
return { ok: true, reducerMachineId: reducer, inputs };
|
|
72
|
-
}
|