@knpkv/herdr-connect 0.4.0 → 0.4.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/activity-store.d.ts +2 -2
- package/dist/activity-store.d.ts.map +1 -1
- package/dist/activity-store.js +20 -26
- package/dist/activity-store.js.map +1 -1
- package/dist/internal/terminal-lines.d.ts +16 -0
- package/dist/internal/terminal-lines.d.ts.map +1 -0
- package/dist/internal/terminal-lines.js +70 -0
- package/dist/internal/terminal-lines.js.map +1 -0
- package/dist/relationship-store.d.ts +2 -2
- package/dist/relationship-store.d.ts.map +1 -1
- package/dist/relationship-store.js +23 -32
- package/dist/relationship-store.js.map +1 -1
- package/dist/terminal.d.ts +2 -3
- package/dist/terminal.d.ts.map +1 -1
- package/dist/terminal.js +8 -67
- package/dist/terminal.js.map +1 -1
- package/package.json +5 -4
package/dist/activity-store.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { Effect
|
|
1
|
+
import { Effect } from "effect";
|
|
2
2
|
import { TerminalTransportError } from "./errors.js";
|
|
3
3
|
export declare class AgentActivityStore {
|
|
4
4
|
#private;
|
|
5
5
|
readonly path: string;
|
|
6
6
|
private constructor();
|
|
7
|
-
static readonly open: (path: string) => Effect.Effect<AgentActivityStore, TerminalTransportError, FileSystem.FileSystem | Path.Path>;
|
|
7
|
+
static readonly open: (path: string) => Effect.Effect<AgentActivityStore, TerminalTransportError, import("effect/FileSystem").FileSystem | import("effect/Path").Path>;
|
|
8
8
|
readonly observe: (this: AgentActivityStore, host: string, agentId: string, revision: number, observedAt: number) => Effect.Effect<number, TerminalTransportError, never>;
|
|
9
9
|
close(): void;
|
|
10
10
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"activity-store.d.ts","sourceRoot":"","sources":["../src/activity-store.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"activity-store.d.ts","sourceRoot":"","sources":["../src/activity-store.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAU,MAAM,QAAQ,CAAA;AAEvC,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AAepD,qBAAa,kBAAkB;;IAE7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IAErB,OAAO,eAGN;IAED,MAAM,CAAC,QAAQ,CAAC,IAAI,mJAwBlB;IAEF,QAAQ,CAAC,OAAO,0JAqCd;IAEF,KAAK,IAAI,IAAI,CAEZ;CACF"}
|
package/dist/activity-store.js
CHANGED
|
@@ -1,18 +1,25 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { openPrivateSqlite } from "@knpkv/herdr-fleet/sqlite";
|
|
2
|
+
import { Effect, Schema } from "effect";
|
|
3
3
|
import { TerminalTransportError } from "./errors.js";
|
|
4
4
|
const ActivityRow = Schema.Struct({ last_activity_at: Schema.Number });
|
|
5
5
|
const TableColumn = Schema.Struct({ name: Schema.String });
|
|
6
|
+
const fromPrivateDatabaseError = (error) => new TerminalTransportError({
|
|
7
|
+
cause: error.cause,
|
|
8
|
+
detail: String(error.cause),
|
|
9
|
+
operation: `activity.${error.operation}`
|
|
10
|
+
});
|
|
6
11
|
const storeError = (operation) => (cause) => new TerminalTransportError({ cause, detail: String(cause), operation });
|
|
7
12
|
export class AgentActivityStore {
|
|
8
13
|
#database;
|
|
9
14
|
path;
|
|
10
|
-
constructor(path) {
|
|
15
|
+
constructor(path, opened) {
|
|
11
16
|
this.path = path;
|
|
12
|
-
this.#database =
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
17
|
+
this.#database = opened.database;
|
|
18
|
+
}
|
|
19
|
+
static open = Effect.fn("AgentActivityStore.open")(function* (path) {
|
|
20
|
+
const opened = yield* openPrivateSqlite(path, {
|
|
21
|
+
initialize: (database) => {
|
|
22
|
+
database.exec(`
|
|
16
23
|
CREATE TABLE IF NOT EXISTS agent_activity (
|
|
17
24
|
host TEXT COLLATE NOCASE NOT NULL,
|
|
18
25
|
agent_id TEXT NOT NULL,
|
|
@@ -22,26 +29,13 @@ export class AgentActivityStore {
|
|
|
22
29
|
PRIMARY KEY (host, agent_id)
|
|
23
30
|
);
|
|
24
31
|
`);
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
32
|
+
const columns = Schema.decodeUnknownSync(Schema.Array(TableColumn))(database.prepare("PRAGMA table_info(agent_activity)").all());
|
|
33
|
+
if (!columns.some(({ name }) => name === "observed_at")) {
|
|
34
|
+
database.exec("ALTER TABLE agent_activity ADD COLUMN observed_at INTEGER NOT NULL DEFAULT 0");
|
|
35
|
+
}
|
|
28
36
|
}
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
this.#database.close();
|
|
32
|
-
throw error;
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
static open = Effect.fn("AgentActivityStore.open")(function* (path) {
|
|
36
|
-
const fileSystem = yield* FileSystem.FileSystem;
|
|
37
|
-
const paths = yield* Path.Path;
|
|
38
|
-
const directory = paths.dirname(path);
|
|
39
|
-
yield* fileSystem.makeDirectory(directory, { recursive: true, mode: 0o700 }).pipe(Effect.mapError(storeError("activity.openDirectory")));
|
|
40
|
-
yield* fileSystem.chmod(directory, 0o700).pipe(Effect.mapError(storeError("activity.secureDirectory")));
|
|
41
|
-
return yield* Effect.try({
|
|
42
|
-
try: () => new AgentActivityStore(path),
|
|
43
|
-
catch: storeError("activity.openDatabase")
|
|
44
|
-
});
|
|
37
|
+
}).pipe(Effect.mapError(fromPrivateDatabaseError));
|
|
38
|
+
return new AgentActivityStore(path, opened);
|
|
45
39
|
});
|
|
46
40
|
observe = Effect.fn("AgentActivityStore.observe")(function* (host, agentId, revision, observedAt) {
|
|
47
41
|
const normalizedHost = host.toLowerCase();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"activity-store.js","sourceRoot":"","sources":["../src/activity-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"activity-store.js","sourceRoot":"","sources":["../src/activity-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Splits the Herdr attach client's stdout into lines, each capped at
|
|
3
|
+
* {@link terminalEventMaxLineBytes}.
|
|
4
|
+
*
|
|
5
|
+
* This caps each line, not the stream's running total, so it is not a
|
|
6
|
+
* `@knpkv/bounded-io` budget: a long session may emit any number of lines.
|
|
7
|
+
* The buffer grows geometrically and is reused, keeping copies linear.
|
|
8
|
+
*
|
|
9
|
+
* @internal
|
|
10
|
+
*/
|
|
11
|
+
import { Stream } from "effect";
|
|
12
|
+
import { TerminalProtocolError } from "../errors.js";
|
|
13
|
+
export declare const terminalEventMaxLineBytes: number;
|
|
14
|
+
/** @internal Exposes copied-byte accounting only for the deterministic complexity regression. */
|
|
15
|
+
export declare const boundedTerminalLines: <E, R>(stream: Stream.Stream<Uint8Array, E, R>, onBufferCopy?: (bytes: number) => void) => Stream.Stream<string, E | TerminalProtocolError, R>;
|
|
16
|
+
//# sourceMappingURL=terminal-lines.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal-lines.d.ts","sourceRoot":"","sources":["../../src/internal/terminal-lines.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAU,MAAM,EAAE,MAAM,QAAQ,CAAA;AACvC,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AAEpD,eAAO,MAAM,yBAAyB,QAA6B,CAAA;AAmCnE,iGAAiG;AACjG,eAAO,MAAM,oBAAoB,GAAI,CAAC,EAAE,CAAC,UAC/B,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC,iBACxB,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,wDA2CrC,CAAA"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Splits the Herdr attach client's stdout into lines, each capped at
|
|
3
|
+
* {@link terminalEventMaxLineBytes}.
|
|
4
|
+
*
|
|
5
|
+
* This caps each line, not the stream's running total, so it is not a
|
|
6
|
+
* `@knpkv/bounded-io` budget: a long session may emit any number of lines.
|
|
7
|
+
* The buffer grows geometrically and is reused, keeping copies linear.
|
|
8
|
+
*
|
|
9
|
+
* @internal
|
|
10
|
+
*/
|
|
11
|
+
import { Effect, Stream } from "effect";
|
|
12
|
+
import { TerminalProtocolError } from "../errors.js";
|
|
13
|
+
export const terminalEventMaxLineBytes = 4 * 1024 * 1024 + 4 * 1024;
|
|
14
|
+
const terminalLineInitialBytes = 64 * 1_024;
|
|
15
|
+
const emptyTerminalLine = () => ({
|
|
16
|
+
buffer: new Uint8Array(terminalLineInitialBytes),
|
|
17
|
+
length: 0
|
|
18
|
+
});
|
|
19
|
+
const decodeTerminalLine = (bytes) => {
|
|
20
|
+
const content = bytes.at(-1) === 13 ? bytes.subarray(0, -1) : bytes;
|
|
21
|
+
return new TextDecoder().decode(content);
|
|
22
|
+
};
|
|
23
|
+
const growTerminalLineBuffer = (buffer, requiredBytes, onBufferCopy) => {
|
|
24
|
+
if (requiredBytes <= buffer.byteLength)
|
|
25
|
+
return buffer;
|
|
26
|
+
let capacity = buffer.byteLength;
|
|
27
|
+
while (capacity < requiredBytes) {
|
|
28
|
+
capacity = Math.min(capacity * 2, terminalEventMaxLineBytes);
|
|
29
|
+
}
|
|
30
|
+
const grown = new Uint8Array(capacity);
|
|
31
|
+
onBufferCopy?.(buffer.byteLength);
|
|
32
|
+
grown.set(buffer);
|
|
33
|
+
return grown;
|
|
34
|
+
};
|
|
35
|
+
/** @internal Exposes copied-byte accounting only for the deterministic complexity regression. */
|
|
36
|
+
export const boundedTerminalLines = (stream, onBufferCopy) => stream.pipe(Stream.mapAccumEffect(emptyTerminalLine, (state, chunk) => {
|
|
37
|
+
let buffer = state.buffer;
|
|
38
|
+
let length = state.length;
|
|
39
|
+
const lines = [];
|
|
40
|
+
let offset = 0;
|
|
41
|
+
while (offset < chunk.byteLength) {
|
|
42
|
+
const newline = chunk.indexOf(10, offset);
|
|
43
|
+
const end = newline === -1 ? chunk.byteLength : newline;
|
|
44
|
+
const nextLength = length + end - offset;
|
|
45
|
+
if (nextLength > terminalEventMaxLineBytes) {
|
|
46
|
+
return Effect.fail(new TerminalProtocolError({
|
|
47
|
+
cause: nextLength,
|
|
48
|
+
detail: `Herdr terminal event exceeded ${terminalEventMaxLineBytes} bytes`
|
|
49
|
+
}));
|
|
50
|
+
}
|
|
51
|
+
buffer = growTerminalLineBuffer(buffer, nextLength, onBufferCopy);
|
|
52
|
+
buffer.set(chunk.subarray(offset, end), length);
|
|
53
|
+
length = nextLength;
|
|
54
|
+
if (newline === -1)
|
|
55
|
+
break;
|
|
56
|
+
lines.push(decodeTerminalLine(buffer.subarray(0, length)));
|
|
57
|
+
length = 0;
|
|
58
|
+
offset = newline + 1;
|
|
59
|
+
}
|
|
60
|
+
const result = [
|
|
61
|
+
{ buffer, length },
|
|
62
|
+
lines
|
|
63
|
+
];
|
|
64
|
+
return Effect.succeed(result);
|
|
65
|
+
}, {
|
|
66
|
+
onHalt: (state) => state.length === 0
|
|
67
|
+
? []
|
|
68
|
+
: [decodeTerminalLine(state.buffer.subarray(0, state.length))]
|
|
69
|
+
}));
|
|
70
|
+
//# sourceMappingURL=terminal-lines.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal-lines.js","sourceRoot":"","sources":["../../src/internal/terminal-lines.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Effect,
|
|
1
|
+
import { Effect, Schema } from "effect";
|
|
2
2
|
import { ConnectRelationshipError, ConnectRelationshipStoreError } from "./errors.js";
|
|
3
3
|
export declare const PersistedConnectAgentMetadata: Schema.Struct<{
|
|
4
4
|
readonly agentId: Schema.String;
|
|
@@ -20,7 +20,7 @@ export declare class AgentRelationshipStore {
|
|
|
20
20
|
#private;
|
|
21
21
|
readonly path: string;
|
|
22
22
|
private constructor();
|
|
23
|
-
static readonly open: (path: string) => Effect.Effect<AgentRelationshipStore, ConnectRelationshipStoreError, FileSystem.FileSystem | Path.Path>;
|
|
23
|
+
static readonly open: (path: string) => Effect.Effect<AgentRelationshipStore, ConnectRelationshipStoreError, import("effect/FileSystem").FileSystem | import("effect/Path").Path>;
|
|
24
24
|
readonly persist: (this: AgentRelationshipStore, metadata: {
|
|
25
25
|
readonly agentId: string;
|
|
26
26
|
readonly host: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relationship-store.d.ts","sourceRoot":"","sources":["../src/relationship-store.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"relationship-store.d.ts","sourceRoot":"","sources":["../src/relationship-store.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAa,MAAM,QAAQ,CAAA;AAElD,OAAO,EAAE,wBAAwB,EAAE,6BAA6B,EAAE,MAAM,aAAa,CAAA;AAIrF,eAAO,MAAM,6BAA6B;;;;;;;;;EAYxC,CAAA;AACF,MAAM,MAAM,6BAA6B,GAAG,OAAO,6BAA6B,CAAC,IAAI,CAAA;AAErF,MAAM,MAAM,6BAA6B,GAAG,gBAAgB,GAAG,wBAAwB,CAAA;AAEvF,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,QAAQ,EAAE,6BAA6B,CAAA;IAChD,QAAQ,CAAC,MAAM,EAAE,6BAA6B,CAAA;CAC/C;AAgED,qBAAa,sBAAsB;;IAGjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IAErB,OAAO,eAIN;IAED,MAAM,CAAC,QAAQ,CAAC,IAAI,8JA+EnB;IAED,QAAQ,CAAC,OAAO;;;;;;;;;;;;;;;;;;wEAkBd;IAEF,QAAQ,CAAC,UAAU;;;;;;;;;0EAuGjB;IAEF,QAAQ,CAAC,IAAI;;;;;;;;;+CAIX;IAEF,OAAO,CAAC,YAAY;IAQpB,KAAK,IAAI,IAAI,CAEZ;CACF"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { openPrivateSqlite } from "@knpkv/herdr-fleet/sqlite";
|
|
2
|
+
import { Effect, Schema, Semaphore } from "effect";
|
|
3
3
|
import { ConnectRelationshipError, ConnectRelationshipStoreError } from "./errors.js";
|
|
4
4
|
import { connectRelationshipViolation } from "./forest.js";
|
|
5
5
|
import { ConnectAgent, ConnectAgentRelationship } from "./model.js";
|
|
@@ -19,6 +19,7 @@ const RelationshipRow = Schema.Struct({
|
|
|
19
19
|
relation: Schema.NullOr(Schema.String),
|
|
20
20
|
source: Schema.Literals(["durable_worker", "trusted_live_inventory"])
|
|
21
21
|
});
|
|
22
|
+
const fromPrivateDatabaseError = (error) => new ConnectRelationshipStoreError({ cause: error.cause, operation: error.operation });
|
|
22
23
|
const storeError = (operation) => (cause) => new ConnectRelationshipStoreError({ cause, operation });
|
|
23
24
|
const isRelationshipPersistenceFailure = Schema.is(Schema.Union([ConnectRelationshipError, ConnectRelationshipStoreError]));
|
|
24
25
|
const decodeRowSync = (row) => {
|
|
@@ -55,12 +56,15 @@ export class AgentRelationshipStore {
|
|
|
55
56
|
#database;
|
|
56
57
|
#transactions;
|
|
57
58
|
path;
|
|
58
|
-
constructor(path, transactions) {
|
|
59
|
+
constructor(path, transactions, opened) {
|
|
59
60
|
this.path = path;
|
|
60
61
|
this.#transactions = transactions;
|
|
61
|
-
this.#database =
|
|
62
|
-
|
|
63
|
-
|
|
62
|
+
this.#database = opened.database;
|
|
63
|
+
}
|
|
64
|
+
static open = Effect.fn("AgentRelationshipStore.open")(function* (path) {
|
|
65
|
+
const opened = yield* openPrivateSqlite(path, {
|
|
66
|
+
initialize: (database) => {
|
|
67
|
+
database.exec(`
|
|
64
68
|
CREATE TABLE IF NOT EXISTS connect_store_metadata (
|
|
65
69
|
key TEXT PRIMARY KEY,
|
|
66
70
|
value TEXT NOT NULL
|
|
@@ -76,11 +80,11 @@ export class AgentRelationshipStore {
|
|
|
76
80
|
CHECK ((parent_agent_id IS NULL) = (relation IS NULL))
|
|
77
81
|
);
|
|
78
82
|
`);
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
83
|
+
const version = database.prepare("SELECT value FROM connect_store_metadata WHERE key = 'relationship_schema'").get();
|
|
84
|
+
const decodedVersion = Schema.decodeUnknownResult(Schema.Struct({ value: Schema.String }))(version);
|
|
85
|
+
if (decodedVersion._tag === "Failure" ||
|
|
86
|
+
(decodedVersion.success.value !== "3" && decodedVersion.success.value !== "4")) {
|
|
87
|
+
database.exec(`
|
|
84
88
|
BEGIN IMMEDIATE;
|
|
85
89
|
CREATE TABLE connect_agent_relationships_v2 (
|
|
86
90
|
host TEXT NOT NULL COLLATE NOCASE,
|
|
@@ -103,11 +107,11 @@ export class AgentRelationshipStore {
|
|
|
103
107
|
ON CONFLICT(key) DO UPDATE SET value = excluded.value;
|
|
104
108
|
COMMIT;
|
|
105
109
|
`);
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
110
|
+
}
|
|
111
|
+
const migratedVersion = database.prepare("SELECT value FROM connect_store_metadata WHERE key = 'relationship_schema'").get();
|
|
112
|
+
const decodedMigratedVersion = Schema.decodeUnknownResult(Schema.Struct({ value: Schema.String }))(migratedVersion);
|
|
113
|
+
if (decodedMigratedVersion._tag === "Failure" || decodedMigratedVersion.success.value !== "4") {
|
|
114
|
+
database.exec(`
|
|
111
115
|
BEGIN IMMEDIATE;
|
|
112
116
|
ALTER TABLE connect_agent_relationships
|
|
113
117
|
ADD COLUMN source TEXT NOT NULL DEFAULT 'durable_worker'
|
|
@@ -119,24 +123,11 @@ export class AgentRelationshipStore {
|
|
|
119
123
|
ON CONFLICT(key) DO UPDATE SET value = excluded.value;
|
|
120
124
|
COMMIT;
|
|
121
125
|
`);
|
|
126
|
+
}
|
|
122
127
|
}
|
|
123
|
-
}
|
|
124
|
-
catch (error) {
|
|
125
|
-
this.#database.close();
|
|
126
|
-
throw error;
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
static open = Effect.fn("AgentRelationshipStore.open")(function* (path) {
|
|
130
|
-
const fileSystem = yield* FileSystem.FileSystem;
|
|
131
|
-
const paths = yield* Path.Path;
|
|
132
|
-
const directory = paths.dirname(path);
|
|
133
|
-
yield* fileSystem.makeDirectory(directory, { recursive: true, mode: 0o700 }).pipe(Effect.mapError(storeError("open.directory")));
|
|
134
|
-
yield* fileSystem.chmod(directory, 0o700).pipe(Effect.mapError(storeError("open.secureDirectory")));
|
|
128
|
+
}).pipe(Effect.mapError(fromPrivateDatabaseError));
|
|
135
129
|
const transactions = yield* Semaphore.make(1);
|
|
136
|
-
return
|
|
137
|
-
try: () => new AgentRelationshipStore(path, transactions),
|
|
138
|
-
catch: storeError("open")
|
|
139
|
-
});
|
|
130
|
+
return new AgentRelationshipStore(path, transactions, opened);
|
|
140
131
|
});
|
|
141
132
|
persist = Effect.fn("AgentRelationshipStore.persist")(function* (metadata, source) {
|
|
142
133
|
const stored = yield* this.persistAll([{ metadata, source }]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relationship-store.js","sourceRoot":"","sources":["../src/relationship-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"relationship-store.js","sourceRoot":"","sources":["../src/relationship-store.ts"],"names":[],"mappings":"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"}
|
package/dist/terminal.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import type { Scope } from "effect";
|
|
|
2
2
|
import { Crypto, Effect, Stream } from "effect";
|
|
3
3
|
import { ChildProcessSpawner } from "effect/process";
|
|
4
4
|
import { TerminalAgentNotFoundError, TerminalProtocolError, TerminalTransportError } from "./errors.js";
|
|
5
|
+
import { boundedTerminalLines, terminalEventMaxLineBytes } from "./internal/terminal-lines.js";
|
|
5
6
|
import { HerdrTerminalEvent, type TerminalClientCommand, type TerminalSelection } from "./model.js";
|
|
6
7
|
export type TerminalError = TerminalAgentNotFoundError | TerminalProtocolError | TerminalTransportError;
|
|
7
8
|
export interface TerminalSession {
|
|
@@ -12,9 +13,7 @@ export interface TerminalConnector {
|
|
|
12
13
|
readonly open: (selection: TerminalSelection) => Effect.Effect<TerminalSession, TerminalError, Scope.Scope>;
|
|
13
14
|
}
|
|
14
15
|
export declare const terminalStderrMaxBytes: number;
|
|
15
|
-
export
|
|
16
|
-
/** @internal Exposes copied-byte accounting only for the deterministic complexity regression. */
|
|
17
|
-
export declare const boundedTerminalLines: <E, R>(stream: Stream.Stream<Uint8Array, E, R>, onBufferCopy?: (bytes: number) => void) => Stream.Stream<string, E | TerminalProtocolError, R>;
|
|
16
|
+
export { boundedTerminalLines, terminalEventMaxLineBytes };
|
|
18
17
|
export declare const makeHerdrTerminalConnector: (config: {
|
|
19
18
|
readonly host: string;
|
|
20
19
|
readonly repository: string;
|
package/dist/terminal.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terminal.d.ts","sourceRoot":"","sources":["../src/terminal.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"terminal.d.ts","sourceRoot":"","sources":["../src/terminal.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AACnC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAqB,MAAM,EAAE,MAAM,QAAQ,CAAA;AAClE,OAAO,EAAgB,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AAClE,OAAO,EAAE,0BAA0B,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AAEvG,OAAO,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAA;AAE9F,OAAO,EAAE,kBAAkB,EAAE,KAAK,qBAAqB,EAAE,KAAK,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAEnG,MAAM,MAAM,aAAa,GACrB,0BAA0B,GAC1B,qBAAqB,GACrB,sBAAsB,CAAA;AAE1B,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,kBAAkB,EAAE,aAAa,CAAC,CAAA;IACjE,QAAQ,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,qBAAqB,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,sBAAsB,CAAC,CAAA;CAC/F;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,CACb,SAAS,EAAE,iBAAiB,KACzB,MAAM,CAAC,MAAM,CAAC,eAAe,EAAE,aAAa,EAAE,KAAK,CAAC,KAAK,CAAC,CAAA;CAChE;AAED,eAAO,MAAM,sBAAsB,QAAc,CAAA;AAEjD,OAAO,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,CAAA;AAK1D,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kEA8KrC,CAAA"}
|
package/dist/terminal.js
CHANGED
|
@@ -1,67 +1,13 @@
|
|
|
1
|
+
import { limitBytes } from "@knpkv/bounded-io";
|
|
1
2
|
import { Crypto, Effect, Predicate, Schema, Stream } from "effect";
|
|
2
3
|
import { ChildProcess, ChildProcessSpawner } from "effect/process";
|
|
3
4
|
import { TerminalAgentNotFoundError, TerminalProtocolError, TerminalTransportError } from "./errors.js";
|
|
4
5
|
import { connectAgentId } from "./id.js";
|
|
6
|
+
import { boundedTerminalLines, terminalEventMaxLineBytes } from "./internal/terminal-lines.js";
|
|
5
7
|
import { releaseTerminalControl, terminalKillOptions, terminalReleaseKillOptions } from "./internal/terminal-release.js";
|
|
6
8
|
import { HerdrTerminalEvent } from "./model.js";
|
|
7
9
|
export const terminalStderrMaxBytes = 1024 * 1024;
|
|
8
|
-
export
|
|
9
|
-
const terminalLineInitialBytes = 64 * 1_024;
|
|
10
|
-
const emptyTerminalLine = () => ({
|
|
11
|
-
buffer: new Uint8Array(terminalLineInitialBytes),
|
|
12
|
-
length: 0
|
|
13
|
-
});
|
|
14
|
-
const decodeTerminalLine = (bytes) => {
|
|
15
|
-
const content = bytes.at(-1) === 13 ? bytes.subarray(0, -1) : bytes;
|
|
16
|
-
return new TextDecoder().decode(content);
|
|
17
|
-
};
|
|
18
|
-
const growTerminalLineBuffer = (buffer, requiredBytes, onBufferCopy) => {
|
|
19
|
-
if (requiredBytes <= buffer.byteLength)
|
|
20
|
-
return buffer;
|
|
21
|
-
let capacity = buffer.byteLength;
|
|
22
|
-
while (capacity < requiredBytes) {
|
|
23
|
-
capacity = Math.min(capacity * 2, terminalEventMaxLineBytes);
|
|
24
|
-
}
|
|
25
|
-
const grown = new Uint8Array(capacity);
|
|
26
|
-
onBufferCopy?.(buffer.byteLength);
|
|
27
|
-
grown.set(buffer);
|
|
28
|
-
return grown;
|
|
29
|
-
};
|
|
30
|
-
/** @internal Exposes copied-byte accounting only for the deterministic complexity regression. */
|
|
31
|
-
export const boundedTerminalLines = (stream, onBufferCopy) => stream.pipe(Stream.mapAccumEffect(emptyTerminalLine, (state, chunk) => {
|
|
32
|
-
let buffer = state.buffer;
|
|
33
|
-
let length = state.length;
|
|
34
|
-
const lines = [];
|
|
35
|
-
let offset = 0;
|
|
36
|
-
while (offset < chunk.byteLength) {
|
|
37
|
-
const newline = chunk.indexOf(10, offset);
|
|
38
|
-
const end = newline === -1 ? chunk.byteLength : newline;
|
|
39
|
-
const nextLength = length + end - offset;
|
|
40
|
-
if (nextLength > terminalEventMaxLineBytes) {
|
|
41
|
-
return Effect.fail(new TerminalProtocolError({
|
|
42
|
-
cause: nextLength,
|
|
43
|
-
detail: `Herdr terminal event exceeded ${terminalEventMaxLineBytes} bytes`
|
|
44
|
-
}));
|
|
45
|
-
}
|
|
46
|
-
buffer = growTerminalLineBuffer(buffer, nextLength, onBufferCopy);
|
|
47
|
-
buffer.set(chunk.subarray(offset, end), length);
|
|
48
|
-
length = nextLength;
|
|
49
|
-
if (newline === -1)
|
|
50
|
-
break;
|
|
51
|
-
lines.push(decodeTerminalLine(buffer.subarray(0, length)));
|
|
52
|
-
length = 0;
|
|
53
|
-
offset = newline + 1;
|
|
54
|
-
}
|
|
55
|
-
const result = [
|
|
56
|
-
{ buffer, length },
|
|
57
|
-
lines
|
|
58
|
-
];
|
|
59
|
-
return Effect.succeed(result);
|
|
60
|
-
}, {
|
|
61
|
-
onHalt: (state) => state.length === 0
|
|
62
|
-
? []
|
|
63
|
-
: [decodeTerminalLine(state.buffer.subarray(0, state.length))]
|
|
64
|
-
}));
|
|
10
|
+
export { boundedTerminalLines, terminalEventMaxLineBytes };
|
|
65
11
|
const transportError = (operation) => (cause) => new TerminalTransportError({ cause, detail: String(cause), operation });
|
|
66
12
|
export const makeHerdrTerminalConnector = Effect.fn("HerdrTerminal.make")(function* (config, service) {
|
|
67
13
|
const spawner = yield* ChildProcessSpawner.ChildProcessSpawner;
|
|
@@ -136,16 +82,11 @@ export const makeHerdrTerminalConnector = Effect.fn("HerdrTerminal.make")(functi
|
|
|
136
82
|
detail: String(cause),
|
|
137
83
|
operation: "herdr.terminal.read"
|
|
138
84
|
})));
|
|
139
|
-
const stderrDrain = handle.stderr.pipe(Stream.mapError(transportError("herdr.terminal.stderr")), Stream.
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
detail: `Herdr terminal stderr exceeded ${terminalStderrMaxBytes} bytes`,
|
|
145
|
-
operation: "herdr.terminal.stderr"
|
|
146
|
-
}))
|
|
147
|
-
: Effect.succeed(next);
|
|
148
|
-
}));
|
|
85
|
+
const stderrDrain = limitBytes(handle.stderr.pipe(Stream.mapError(transportError("herdr.terminal.stderr"))), terminalStderrMaxBytes).pipe(Stream.catchTag("ByteLimitExceeded", ({ observedBytes }) => Stream.fail(new TerminalTransportError({
|
|
86
|
+
cause: observedBytes,
|
|
87
|
+
detail: `Herdr terminal stderr exceeded ${terminalStderrMaxBytes} bytes`,
|
|
88
|
+
operation: "herdr.terminal.stderr"
|
|
89
|
+
}))), Stream.runDrain);
|
|
149
90
|
const events = Stream.merge(terminalEvents, Stream.fromEffect(stderrDrain).pipe(Stream.drain)).pipe(Stream.concat(Stream.fromEffect(handle.exitCode.pipe(Effect.flatMap((code) => Number(code) === 0
|
|
150
91
|
? Effect.void
|
|
151
92
|
: Effect.fail(new TerminalTransportError({
|
package/dist/terminal.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terminal.js","sourceRoot":"","sources":["../src/terminal.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"terminal.js","sourceRoot":"","sources":["../src/terminal.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@knpkv/herdr-connect",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.2",
|
|
4
4
|
"description": "Fleet Herdr agent directory and authenticated terminal control",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "knpkv",
|
|
@@ -52,9 +52,10 @@
|
|
|
52
52
|
"@effect/platform-browser": "4.0.0",
|
|
53
53
|
"effect": "4.0.0",
|
|
54
54
|
"ghostty-web": "0.4.0",
|
|
55
|
-
"@knpkv/
|
|
56
|
-
"@knpkv/herdr-
|
|
57
|
-
"@knpkv/
|
|
55
|
+
"@knpkv/bounded-io": "^0.2.0",
|
|
56
|
+
"@knpkv/herdr-fleet": "^0.5.1",
|
|
57
|
+
"@knpkv/herdr-work": "^0.5.1",
|
|
58
|
+
"@knpkv/rly": "^0.6.1"
|
|
58
59
|
},
|
|
59
60
|
"devDependencies": {
|
|
60
61
|
"@effect/platform-node": "4.0.0",
|