@knpkv/herdr-connect 0.3.1 → 0.4.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.
Files changed (80) hide show
  1. package/README.md +2 -0
  2. package/dist/activity-store.d.ts +2 -2
  3. package/dist/activity-store.d.ts.map +1 -1
  4. package/dist/activity-store.js +20 -26
  5. package/dist/activity-store.js.map +1 -1
  6. package/dist/client.d.ts +986 -2
  7. package/dist/client.d.ts.map +1 -1
  8. package/dist/client.js +353 -54
  9. package/dist/client.js.map +1 -1
  10. package/dist/directory.d.ts +1 -1
  11. package/dist/directory.d.ts.map +1 -1
  12. package/dist/directory.js +1 -1
  13. package/dist/directory.js.map +1 -1
  14. package/dist/id.d.ts.map +1 -1
  15. package/dist/id.js +3 -2
  16. package/dist/id.js.map +1 -1
  17. package/dist/index.d.ts +4 -0
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +4 -0
  20. package/dist/index.js.map +1 -1
  21. package/dist/internal/terminal-release.d.ts.map +1 -1
  22. package/dist/internal/terminal-release.js +3 -1
  23. package/dist/internal/terminal-release.js.map +1 -1
  24. package/dist/model.d.ts.map +1 -1
  25. package/dist/model.js +3 -2
  26. package/dist/model.js.map +1 -1
  27. package/dist/relationship-store.d.ts +2 -2
  28. package/dist/relationship-store.d.ts.map +1 -1
  29. package/dist/relationship-store.js +23 -32
  30. package/dist/relationship-store.js.map +1 -1
  31. package/dist/terminal-dimensions.d.ts +25 -0
  32. package/dist/terminal-dimensions.d.ts.map +1 -0
  33. package/dist/terminal-dimensions.js +19 -0
  34. package/dist/terminal-dimensions.js.map +1 -0
  35. package/dist/terminal-keyboard.d.ts +52 -0
  36. package/dist/terminal-keyboard.d.ts.map +1 -0
  37. package/dist/terminal-keyboard.js +141 -0
  38. package/dist/terminal-keyboard.js.map +1 -0
  39. package/dist/terminal-output.d.ts +30 -0
  40. package/dist/terminal-output.d.ts.map +1 -0
  41. package/dist/terminal-output.js +54 -0
  42. package/dist/terminal-output.js.map +1 -0
  43. package/dist/terminal-rail-navigation.d.ts +4 -0
  44. package/dist/terminal-rail-navigation.d.ts.map +1 -0
  45. package/dist/terminal-rail-navigation.js +13 -0
  46. package/dist/terminal-rail-navigation.js.map +1 -0
  47. package/dist/terminal-viewport.d.ts +32 -2
  48. package/dist/terminal-viewport.d.ts.map +1 -1
  49. package/dist/terminal-viewport.js +131 -12
  50. package/dist/terminal-viewport.js.map +1 -1
  51. package/dist/terminal-worker-guard.d.ts +7 -0
  52. package/dist/terminal-worker-guard.d.ts.map +1 -0
  53. package/dist/terminal-worker-guard.js +11 -0
  54. package/dist/terminal-worker-guard.js.map +1 -0
  55. package/dist/terminal.d.ts +1746 -110
  56. package/dist/terminal.d.ts.map +1 -1
  57. package/dist/terminal.js +1 -1
  58. package/dist/terminal.js.map +1 -1
  59. package/dist/view.d.ts +15 -2
  60. package/dist/view.d.ts.map +1 -1
  61. package/dist/view.js +46 -2
  62. package/dist/view.js.map +1 -1
  63. package/dist/work-goal-link-view.d.ts +8 -0
  64. package/dist/work-goal-link-view.d.ts.map +1 -0
  65. package/dist/work-goal-link-view.js +3 -0
  66. package/dist/work-goal-link-view.js.map +1 -0
  67. package/dist/work-goal-link.d.ts +24 -0
  68. package/dist/work-goal-link.d.ts.map +1 -0
  69. package/dist/work-goal-link.js +34 -0
  70. package/dist/work-goal-link.js.map +1 -0
  71. package/dist/work-poll.d.ts +6 -0
  72. package/dist/work-poll.d.ts.map +1 -0
  73. package/dist/work-poll.js +7 -0
  74. package/dist/work-poll.js.map +1 -0
  75. package/dist/workspace-focus.d.ts +23 -0
  76. package/dist/workspace-focus.d.ts.map +1 -0
  77. package/dist/workspace-focus.js +69 -0
  78. package/dist/workspace-focus.js.map +1 -0
  79. package/package.json +17 -15
  80. package/src/styles.css +139 -12
package/README.md CHANGED
@@ -6,6 +6,8 @@ The directory combines the local inventory with peer `/v1/connect/agents/local`
6
6
 
7
7
  The terminal connector resolves an opaque agent ID against the current local inventory, starts `herdr terminal session control`, streams Schema-decoded frames, and writes bounded input, resize, scroll, and release commands. Its session is scoped, so interruption releases or kills the child instead of leaving an attach process behind.
8
8
 
9
+ The connected terminal also exposes a touch-friendly key rail with fixed Escape, Tab, arrow, Ctrl, and Alt controls. Ctrl and Alt are one-shot modifiers: choose one, press a supported key or compatible terminal input, and the modifier clears after the typed `terminal.input` command is sent. Unsupported combinations are disabled or rejected; the rail never accepts arbitrary command text, and ordinary Ghostty input remains unchanged.
10
+
9
11
  Browser consumers can import `@knpkv/herdr-connect/client` for the mounting entry, `@knpkv/herdr-connect/surface` for the embeddable state and view, and `@knpkv/herdr-connect/styles.css` for package-owned styles. Exact `host` plus stable `agent` query parameters select that room. The relationship store keys metadata by exact host and stable agent ID. Trusted live inventory may replace a stored parent only for the same host, stable agent ID, and pane with a strictly newer observation; durable, stale, equal, or pane-changing observations cannot reparent an agent. The view renders reported roots and parent relations; missing, cross-host, cyclic, or ambiguous ownership stays explicit and is never guessed.
10
12
 
11
13
  Browser contracts are available through `@knpkv/herdr-connect/model`; browser subpaths do not pull SQLite or Node process code into the bundle.
@@ -1,10 +1,10 @@
1
- import { Effect, FileSystem, Path } from "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":"AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAU,MAAM,QAAQ,CAAA;AAEzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AAQpD,qBAAa,kBAAkB;;IAE7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IAErB,OAAO,eA2BN;IAED,MAAM,CAAC,QAAQ,CAAC,IAAI,iHAclB;IAEF,QAAQ,CAAC,OAAO,0JAqCd;IAEF,KAAK,IAAI,IAAI,CAEZ;CACF"}
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"}
@@ -1,18 +1,25 @@
1
- import { Effect, FileSystem, Path, Schema } from "effect";
2
- import { DatabaseSync } from "node:sqlite";
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 = new DatabaseSync(path);
13
- try {
14
- this.#database.exec(`
15
- PRAGMA journal_mode = WAL;
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
- const columns = Schema.decodeUnknownSync(Schema.Array(TableColumn))(this.#database.prepare("PRAGMA table_info(agent_activity)").all());
26
- if (!columns.some(({ name }) => name === "observed_at")) {
27
- this.#database.exec("ALTER TABLE agent_activity ADD COLUMN observed_at INTEGER NOT NULL DEFAULT 0");
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
- catch (error) {
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":"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"}
1
+ {"version":3,"file":"activity-store.js","sourceRoot":"","sources":["../src/activity-store.ts"],"names":[],"mappings":"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"}