@agent-wire/terminal 1.6.0

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 +353 -0
  2. package/dist/api.d.ts +660 -0
  3. package/dist/api.js +1157 -0
  4. package/dist/api.js.map +1 -0
  5. package/dist/background-worker.d.ts +6 -0
  6. package/dist/background-worker.js +101 -0
  7. package/dist/background-worker.js.map +1 -0
  8. package/dist/cli.d.ts +2 -0
  9. package/dist/cli.js +940 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/config.d.ts +17 -0
  12. package/dist/config.js +36 -0
  13. package/dist/config.js.map +1 -0
  14. package/dist/help-pointer.d.ts +11 -0
  15. package/dist/help-pointer.js +10 -0
  16. package/dist/help-pointer.js.map +1 -0
  17. package/dist/identity.d.ts +40 -0
  18. package/dist/identity.js +193 -0
  19. package/dist/identity.js.map +1 -0
  20. package/dist/index.d.ts +5 -0
  21. package/dist/index.js +11 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/local-pull.d.ts +45 -0
  24. package/dist/local-pull.js +173 -0
  25. package/dist/local-pull.js.map +1 -0
  26. package/dist/lockfile.d.ts +16 -0
  27. package/dist/lockfile.js +78 -0
  28. package/dist/lockfile.js.map +1 -0
  29. package/dist/mcp-server.d.ts +43 -0
  30. package/dist/mcp-server.js +3159 -0
  31. package/dist/mcp-server.js.map +1 -0
  32. package/dist/response-shaper.d.ts +60 -0
  33. package/dist/response-shaper.js +893 -0
  34. package/dist/response-shaper.js.map +1 -0
  35. package/dist/slots.d.ts +65 -0
  36. package/dist/slots.js +128 -0
  37. package/dist/slots.js.map +1 -0
  38. package/dist/sync/diff.d.ts +17 -0
  39. package/dist/sync/diff.js +152 -0
  40. package/dist/sync/diff.js.map +1 -0
  41. package/dist/sync/hash.d.ts +11 -0
  42. package/dist/sync/hash.js +18 -0
  43. package/dist/sync/hash.js.map +1 -0
  44. package/dist/sync/index.d.ts +24 -0
  45. package/dist/sync/index.js +22 -0
  46. package/dist/sync/index.js.map +1 -0
  47. package/dist/sync/manifest.d.ts +29 -0
  48. package/dist/sync/manifest.js +59 -0
  49. package/dist/sync/manifest.js.map +1 -0
  50. package/dist/sync/match.d.ts +29 -0
  51. package/dist/sync/match.js +153 -0
  52. package/dist/sync/match.js.map +1 -0
  53. package/dist/sync/paginate.d.ts +16 -0
  54. package/dist/sync/paginate.js +34 -0
  55. package/dist/sync/paginate.js.map +1 -0
  56. package/dist/sync/preview.d.ts +16 -0
  57. package/dist/sync/preview.js +179 -0
  58. package/dist/sync/preview.js.map +1 -0
  59. package/dist/sync/pull.d.ts +23 -0
  60. package/dist/sync/pull.js +126 -0
  61. package/dist/sync/pull.js.map +1 -0
  62. package/dist/sync/push.d.ts +27 -0
  63. package/dist/sync/push.js +116 -0
  64. package/dist/sync/push.js.map +1 -0
  65. package/dist/sync/resolve.d.ts +19 -0
  66. package/dist/sync/resolve.js +42 -0
  67. package/dist/sync/resolve.js.map +1 -0
  68. package/dist/sync/types.d.ts +70 -0
  69. package/dist/sync/types.js +6 -0
  70. package/dist/sync/types.js.map +1 -0
  71. package/dist/sync/walk.d.ts +12 -0
  72. package/dist/sync/walk.js +155 -0
  73. package/dist/sync/walk.js.map +1 -0
  74. package/dist/wait-cli.d.ts +46 -0
  75. package/dist/wait-cli.js +280 -0
  76. package/dist/wait-cli.js.map +1 -0
  77. package/dist/worker.d.ts +14 -0
  78. package/dist/worker.js +252 -0
  79. package/dist/worker.js.map +1 -0
  80. package/package.json +58 -0
@@ -0,0 +1,173 @@
1
+ import { mkdir, readFile, writeFile } from 'fs/promises';
2
+ import { existsSync } from 'fs';
3
+ import { homedir } from 'os';
4
+ import { dirname, isAbsolute, resolve } from 'path';
5
+ export function defaultLocalPullManifestPath() {
6
+ return resolve(homedir(), '.wire-node', 'sync-manifest.json');
7
+ }
8
+ function expandHomePath(path) {
9
+ if (path === '~')
10
+ return homedir();
11
+ if (path.startsWith('~/') || path.startsWith('~\\'))
12
+ return resolve(homedir(), path.slice(2));
13
+ return path;
14
+ }
15
+ function normalizeTarget(path) {
16
+ return resolve(expandHomePath(path));
17
+ }
18
+ function nonEmptyString(value) {
19
+ return typeof value === 'string' && value.trim() ? value.trim() : null;
20
+ }
21
+ export async function loadLocalPullManifest(manifestPath) {
22
+ const path = normalizeTarget(manifestPath || defaultLocalPullManifestPath());
23
+ const raw = await readFile(path, 'utf-8');
24
+ const parsed = JSON.parse(raw);
25
+ if (!Array.isArray(parsed.subscriptions)) {
26
+ throw new Error('Invalid local-sync manifest: subscriptions must be an array');
27
+ }
28
+ for (const [index, sub] of parsed.subscriptions.entries()) {
29
+ if (!nonEmptyString(sub.handle_path)) {
30
+ throw new Error(`Invalid local-sync manifest: subscriptions[${index}].handle_path is required`);
31
+ }
32
+ if (!Array.isArray(sub.local_targets) || sub.local_targets.length === 0) {
33
+ throw new Error(`Invalid local-sync manifest: subscriptions[${index}].local_targets must be a non-empty array`);
34
+ }
35
+ }
36
+ return { path, manifest: { ...parsed, state: parsed.state || {} } };
37
+ }
38
+ export async function writeDefaultLocalPullManifest(manifestPath) {
39
+ const path = normalizeTarget(manifestPath || defaultLocalPullManifestPath());
40
+ if (existsSync(path))
41
+ return path;
42
+ const manifest = {
43
+ subscriptions: [
44
+ {
45
+ handle_path: 'playful/128/240',
46
+ follow_supersessions: true,
47
+ local_targets: ['~/.wire-node/cache/operating-dictionary.md'],
48
+ },
49
+ {
50
+ handle_path: 'playful/128/242',
51
+ follow_supersessions: true,
52
+ local_targets: ['~/.wire-node/cache/onboarding-kit.md'],
53
+ },
54
+ {
55
+ handle_path: 'playful/128/245',
56
+ follow_supersessions: true,
57
+ local_targets: ['~/.wire-node/cache/standard-ops-kit.md'],
58
+ },
59
+ {
60
+ handle_path: 'playful/117/45',
61
+ follow_supersessions: true,
62
+ local_targets: ['~/.wire-node/cache/fleet-ops-kit.md'],
63
+ },
64
+ ],
65
+ state: {},
66
+ };
67
+ await mkdir(dirname(path), { recursive: true });
68
+ await writeFile(path, JSON.stringify(manifest, null, 2), 'utf-8');
69
+ return path;
70
+ }
71
+ async function readExisting(path) {
72
+ try {
73
+ return await readFile(path, 'utf-8');
74
+ }
75
+ catch {
76
+ return null;
77
+ }
78
+ }
79
+ function contributionBody(result) {
80
+ return nonEmptyString(result.body)
81
+ ?? nonEmptyString(result.content)
82
+ ?? nonEmptyString(result.text)
83
+ ?? '';
84
+ }
85
+ export async function pullLocalSubscriptions(api, options) {
86
+ if (options?.init) {
87
+ await writeDefaultLocalPullManifest(options.manifestPath);
88
+ }
89
+ const { path, manifest } = await loadLocalPullManifest(options?.manifestPath);
90
+ const state = manifest.state || {};
91
+ const results = [];
92
+ for (const sub of manifest.subscriptions) {
93
+ const result = {
94
+ handle_path: sub.handle_path,
95
+ resolved_handle_path: null,
96
+ title: 'Untitled',
97
+ targets: [],
98
+ changed: false,
99
+ };
100
+ try {
101
+ const contribution = await api.accessContribution(sub.handle_path);
102
+ const resolvedHandlePath = nonEmptyString(contribution.handle_path) ?? sub.handle_path;
103
+ const title = nonEmptyString(contribution.title) ?? 'Untitled';
104
+ const body = contributionBody(contribution);
105
+ result.resolved_handle_path = resolvedHandlePath;
106
+ result.title = title;
107
+ if (!body) {
108
+ result.error = 'Contribution response did not include body/content/text';
109
+ results.push(result);
110
+ continue;
111
+ }
112
+ for (const target of sub.local_targets) {
113
+ const targetPath = normalizeTarget(target);
114
+ if (!isAbsolute(targetPath)) {
115
+ result.targets.push({ path: target, status: 'skipped', error: 'Target path did not resolve to an absolute path' });
116
+ continue;
117
+ }
118
+ const existing = await readExisting(targetPath);
119
+ if (existing === body) {
120
+ result.targets.push({ path: targetPath, status: 'unchanged' });
121
+ continue;
122
+ }
123
+ result.changed = true;
124
+ if (options?.dryRun) {
125
+ result.targets.push({ path: targetPath, status: 'skipped' });
126
+ continue;
127
+ }
128
+ await mkdir(dirname(targetPath), { recursive: true });
129
+ await writeFile(targetPath, body, 'utf-8');
130
+ result.targets.push({ path: targetPath, status: 'written' });
131
+ }
132
+ state[sub.handle_path] = {
133
+ last_handle_path: resolvedHandlePath,
134
+ last_title: title,
135
+ last_synced_at: new Date().toISOString(),
136
+ };
137
+ }
138
+ catch (err) {
139
+ result.error = err instanceof Error ? err.message : String(err);
140
+ }
141
+ results.push(result);
142
+ }
143
+ if (!options?.dryRun) {
144
+ await writeFile(path, JSON.stringify({ ...manifest, state }, null, 2), 'utf-8');
145
+ }
146
+ return {
147
+ manifest_path: path,
148
+ pulled: results.filter((r) => !r.error && r.changed).length,
149
+ unchanged: results.filter((r) => !r.error && !r.changed).length,
150
+ failed: results.filter((r) => r.error || r.targets.some((t) => t.error)).length,
151
+ results,
152
+ };
153
+ }
154
+ export function formatLocalPullReport(report) {
155
+ const lines = [`Wire local pull: ${report.manifest_path}`];
156
+ for (const result of report.results) {
157
+ if (result.error) {
158
+ lines.push(` x ${result.handle_path}: ${result.error}`);
159
+ continue;
160
+ }
161
+ const advanced = result.resolved_handle_path && result.resolved_handle_path !== result.handle_path
162
+ ? ` -> ${result.resolved_handle_path}`
163
+ : '';
164
+ lines.push(` ${result.changed ? '->' : '✓'} ${result.handle_path}${advanced} (${result.title})`);
165
+ for (const target of result.targets) {
166
+ const suffix = target.error ? `: ${target.error}` : '';
167
+ lines.push(` ${target.status} ${target.path}${suffix}`);
168
+ }
169
+ }
170
+ lines.push(`Pulled ${report.pulled}; unchanged ${report.unchanged}; failed ${report.failed}.`);
171
+ return lines.join('\n');
172
+ }
173
+ //# sourceMappingURL=local-pull.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-pull.js","sourceRoot":"","sources":["../src/local-pull.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Attempt to acquire the daemon lock. Writes this process's PID.
3
+ * Returns true if acquired, false if another live process holds it.
4
+ * Cleans up stale lockfiles (dead PIDs) automatically.
5
+ */
6
+ export declare function acquireLock(): boolean;
7
+ /**
8
+ * Release the daemon lock. Call on SIGINT/SIGTERM.
9
+ */
10
+ export declare function releaseLock(): void;
11
+ /**
12
+ * Check if a background worker daemon is already running.
13
+ * Returns the PID if running, null otherwise.
14
+ * Cleans up stale lockfiles automatically.
15
+ */
16
+ export declare function isWorkerRunning(): number | null;
@@ -0,0 +1,78 @@
1
+ import { readFileSync, writeFileSync, unlinkSync, existsSync } from 'fs';
2
+ import { join } from 'path';
3
+ import { CONFIG_DIR } from './config.js';
4
+ const LOCK_PATH = join(CONFIG_DIR, 'daemon.lock');
5
+ /**
6
+ * Attempt to acquire the daemon lock. Writes this process's PID.
7
+ * Returns true if acquired, false if another live process holds it.
8
+ * Cleans up stale lockfiles (dead PIDs) automatically.
9
+ */
10
+ export function acquireLock() {
11
+ if (existsSync(LOCK_PATH)) {
12
+ const existingPid = readLockPid();
13
+ if (existingPid !== null && isProcessAlive(existingPid)) {
14
+ return false; // Lock held by a live process
15
+ }
16
+ // Stale lockfile — clean up
17
+ try {
18
+ unlinkSync(LOCK_PATH);
19
+ }
20
+ catch { /* ignore */ }
21
+ }
22
+ writeFileSync(LOCK_PATH, String(process.pid), 'utf-8');
23
+ return true;
24
+ }
25
+ /**
26
+ * Release the daemon lock. Call on SIGINT/SIGTERM.
27
+ */
28
+ export function releaseLock() {
29
+ try {
30
+ // Only remove if we own it
31
+ const pid = readLockPid();
32
+ if (pid === process.pid) {
33
+ unlinkSync(LOCK_PATH);
34
+ }
35
+ }
36
+ catch { /* ignore — file may already be gone */ }
37
+ }
38
+ /**
39
+ * Check if a background worker daemon is already running.
40
+ * Returns the PID if running, null otherwise.
41
+ * Cleans up stale lockfiles automatically.
42
+ */
43
+ export function isWorkerRunning() {
44
+ if (!existsSync(LOCK_PATH))
45
+ return null;
46
+ const pid = readLockPid();
47
+ if (pid === null)
48
+ return null;
49
+ if (isProcessAlive(pid)) {
50
+ return pid;
51
+ }
52
+ // Stale lockfile — clean up
53
+ try {
54
+ unlinkSync(LOCK_PATH);
55
+ }
56
+ catch { /* ignore */ }
57
+ return null;
58
+ }
59
+ function readLockPid() {
60
+ try {
61
+ const content = readFileSync(LOCK_PATH, 'utf-8').trim();
62
+ const pid = parseInt(content, 10);
63
+ return isNaN(pid) ? null : pid;
64
+ }
65
+ catch {
66
+ return null;
67
+ }
68
+ }
69
+ function isProcessAlive(pid) {
70
+ try {
71
+ process.kill(pid, 0); // Signal 0 = check if process exists
72
+ return true;
73
+ }
74
+ catch {
75
+ return false;
76
+ }
77
+ }
78
+ //# sourceMappingURL=lockfile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lockfile.js","sourceRoot":"","sources":["../src/lockfile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AACzE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAElD;;;;GAIG;AACH,MAAM,UAAU,WAAW;IACzB,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1B,MAAM,WAAW,GAAG,WAAW,EAAE,CAAC;QAClC,IAAI,WAAW,KAAK,IAAI,IAAI,cAAc,CAAC,WAAW,CAAC,EAAE,CAAC;YACxD,OAAO,KAAK,CAAC,CAAC,8BAA8B;QAC9C,CAAC;QACD,4BAA4B;QAC5B,IAAI,CAAC;YAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IACvD,CAAC;IAED,aAAa,CAAC,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IACvD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,IAAI,CAAC;QACH,2BAA2B;QAC3B,MAAM,GAAG,GAAG,WAAW,EAAE,CAAC;QAC1B,IAAI,GAAG,KAAK,OAAO,CAAC,GAAG,EAAE,CAAC;YACxB,UAAU,CAAC,SAAS,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC,CAAC,uCAAuC,CAAC,CAAC;AACrD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe;IAC7B,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,IAAI,CAAC;IAExC,MAAM,GAAG,GAAG,WAAW,EAAE,CAAC;IAC1B,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAE9B,IAAI,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO,GAAG,CAAC;IACb,CAAC;IAED,4BAA4B;IAC5B,IAAI,CAAC;QAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IACrD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,WAAW;IAClB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QACxD,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAClC,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,GAAW;IACjC,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,qCAAqC;QAC3D,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -0,0 +1,43 @@
1
+ interface SubstrateSurfaceConfig {
2
+ surface: string;
3
+ toolName: string;
4
+ canonicalPath: string;
5
+ aliasPath: string;
6
+ method: string;
7
+ configHandle?: string;
8
+ title?: string;
9
+ }
10
+ interface SurfaceConfigWireItem {
11
+ type?: string;
12
+ title?: string;
13
+ handle_path?: string;
14
+ structured_data?: Record<string, unknown>;
15
+ }
16
+ declare function normalizeSurfaceName(name: string): string;
17
+ declare function surfaceToolName(surface: string): string;
18
+ declare function parseSurfaceConfig(item: SurfaceConfigWireItem): SubstrateSurfaceConfig | null;
19
+ declare function dedupeSurfaces(surfaces: SubstrateSurfaceConfig[]): SubstrateSurfaceConfig[];
20
+ declare function normalizeApiRootPath(path: string): string;
21
+ declare function fingerprintSubstrateSurfaces(surfaces: SubstrateSurfaceConfig[]): string;
22
+ declare function parseToolRefreshPollIntervalMs(items: SurfaceConfigWireItem[]): {
23
+ pollIntervalMs: number;
24
+ source: string;
25
+ handle?: string;
26
+ };
27
+ export declare const __mcpSurfaceTestInternals: {
28
+ normalizeSurfaceName: typeof normalizeSurfaceName;
29
+ surfaceToolName: typeof surfaceToolName;
30
+ parseSurfaceConfig: typeof parseSurfaceConfig;
31
+ dedupeSurfaces: typeof dedupeSurfaces;
32
+ normalizeApiRootPath: typeof normalizeApiRootPath;
33
+ SURFACE_REFRESH_TTL_MS: number;
34
+ fingerprintSubstrateSurfaces: typeof fingerprintSubstrateSurfaces;
35
+ parseToolRefreshPollIntervalMs: typeof parseToolRefreshPollIntervalMs;
36
+ };
37
+ export interface McpServerOptions {
38
+ noWorker?: boolean;
39
+ transport?: 'stdio' | 'http';
40
+ port?: number;
41
+ }
42
+ export declare function startMcpServer(options?: McpServerOptions): Promise<void>;
43
+ export {};