@uppercut-labs/agent-native 0.0.0-stage → 1.1.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 (187) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +164 -2
  3. package/agent/agent-prompt-short.md +1 -0
  4. package/agent/agent-prompt.md +26 -0
  5. package/bin/agent-native-site.mjs +269 -0
  6. package/bin/discover-routes.mjs +162 -0
  7. package/bin/verify-publication.mjs +317 -0
  8. package/dist/adapters/zod.d.ts +4 -0
  9. package/dist/adapters/zod.d.ts.map +1 -0
  10. package/dist/adapters/zod.js +20 -0
  11. package/dist/adapters/zod.js.map +1 -0
  12. package/dist/astro.d.ts +13 -0
  13. package/dist/astro.d.ts.map +1 -0
  14. package/dist/astro.js +41 -0
  15. package/dist/astro.js.map +1 -0
  16. package/dist/auth.d.ts +52 -0
  17. package/dist/auth.d.ts.map +1 -0
  18. package/dist/auth.js +128 -0
  19. package/dist/auth.js.map +1 -0
  20. package/dist/browser.d.ts +47 -0
  21. package/dist/browser.d.ts.map +1 -0
  22. package/dist/browser.js +219 -0
  23. package/dist/browser.js.map +1 -0
  24. package/dist/cli.d.ts +80 -0
  25. package/dist/cli.d.ts.map +1 -0
  26. package/dist/cli.js +484 -0
  27. package/dist/cli.js.map +1 -0
  28. package/dist/core/assert-never.d.ts +2 -0
  29. package/dist/core/assert-never.d.ts.map +1 -0
  30. package/dist/core/assert-never.js +5 -0
  31. package/dist/core/assert-never.js.map +1 -0
  32. package/dist/core/binding-internal.d.ts +10 -0
  33. package/dist/core/binding-internal.d.ts.map +1 -0
  34. package/dist/core/binding-internal.js +15 -0
  35. package/dist/core/binding-internal.js.map +1 -0
  36. package/dist/core/composition.d.ts +119 -0
  37. package/dist/core/composition.d.ts.map +1 -0
  38. package/dist/core/composition.js +545 -0
  39. package/dist/core/composition.js.map +1 -0
  40. package/dist/core/contracts.d.ts +55 -0
  41. package/dist/core/contracts.d.ts.map +1 -0
  42. package/dist/core/contracts.js +271 -0
  43. package/dist/core/contracts.js.map +1 -0
  44. package/dist/core/diagnostics.d.ts +14 -0
  45. package/dist/core/diagnostics.d.ts.map +1 -0
  46. package/dist/core/diagnostics.js +29 -0
  47. package/dist/core/diagnostics.js.map +1 -0
  48. package/dist/core/executor.d.ts +52 -0
  49. package/dist/core/executor.d.ts.map +1 -0
  50. package/dist/core/executor.js +98 -0
  51. package/dist/core/executor.js.map +1 -0
  52. package/dist/core/registry.d.ts +37 -0
  53. package/dist/core/registry.d.ts.map +1 -0
  54. package/dist/core/registry.js +75 -0
  55. package/dist/core/registry.js.map +1 -0
  56. package/dist/core/schema.d.ts +9 -0
  57. package/dist/core/schema.d.ts.map +1 -0
  58. package/dist/core/schema.js +36 -0
  59. package/dist/core/schema.js.map +1 -0
  60. package/dist/discovery.d.ts +16 -0
  61. package/dist/discovery.d.ts.map +1 -0
  62. package/dist/discovery.js +23 -0
  63. package/dist/discovery.js.map +1 -0
  64. package/dist/doctor.d.ts +200 -0
  65. package/dist/doctor.d.ts.map +1 -0
  66. package/dist/doctor.js +287 -0
  67. package/dist/doctor.js.map +1 -0
  68. package/dist/harness-codex.d.ts +17 -0
  69. package/dist/harness-codex.d.ts.map +1 -0
  70. package/dist/harness-codex.js +485 -0
  71. package/dist/harness-codex.js.map +1 -0
  72. package/dist/harness-mcp-bridge.d.ts +14 -0
  73. package/dist/harness-mcp-bridge.d.ts.map +1 -0
  74. package/dist/harness-mcp-bridge.js +159 -0
  75. package/dist/harness-mcp-bridge.js.map +1 -0
  76. package/dist/harness.d.ts +72 -0
  77. package/dist/harness.d.ts.map +1 -0
  78. package/dist/harness.js +101 -0
  79. package/dist/harness.js.map +1 -0
  80. package/dist/http.d.ts +20 -0
  81. package/dist/http.d.ts.map +1 -0
  82. package/dist/http.js +537 -0
  83. package/dist/http.js.map +1 -0
  84. package/dist/index.d.ts +16 -0
  85. package/dist/index.d.ts.map +1 -0
  86. package/dist/index.js +8 -0
  87. package/dist/index.js.map +1 -0
  88. package/dist/init.d.ts +73 -0
  89. package/dist/init.d.ts.map +1 -0
  90. package/dist/init.js +1039 -0
  91. package/dist/init.js.map +1 -0
  92. package/dist/mcp-apps.d.ts +9 -0
  93. package/dist/mcp-apps.d.ts.map +1 -0
  94. package/dist/mcp-apps.js +171 -0
  95. package/dist/mcp-apps.js.map +1 -0
  96. package/dist/mcp-core.d.ts +64 -0
  97. package/dist/mcp-core.d.ts.map +1 -0
  98. package/dist/mcp-core.js +358 -0
  99. package/dist/mcp-core.js.map +1 -0
  100. package/dist/mcp.d.ts +3 -0
  101. package/dist/mcp.d.ts.map +1 -0
  102. package/dist/mcp.js +2 -0
  103. package/dist/mcp.js.map +1 -0
  104. package/dist/next-browser.d.ts +14 -0
  105. package/dist/next-browser.d.ts.map +1 -0
  106. package/dist/next-browser.js +14 -0
  107. package/dist/next-browser.js.map +1 -0
  108. package/dist/next.d.ts +24 -0
  109. package/dist/next.d.ts.map +1 -0
  110. package/dist/next.js +28 -0
  111. package/dist/next.js.map +1 -0
  112. package/dist/package-version.d.ts +2 -0
  113. package/dist/package-version.d.ts.map +1 -0
  114. package/dist/package-version.js +3 -0
  115. package/dist/package-version.js.map +1 -0
  116. package/dist/publication.d.ts +115 -0
  117. package/dist/publication.d.ts.map +1 -0
  118. package/dist/publication.js +441 -0
  119. package/dist/publication.js.map +1 -0
  120. package/dist/registry.d.ts +3 -0
  121. package/dist/registry.d.ts.map +1 -0
  122. package/dist/registry.js +2 -0
  123. package/dist/registry.js.map +1 -0
  124. package/docs/adopt-existing-site.md +189 -0
  125. package/docs/browser.md +70 -0
  126. package/docs/capabilities-and-bindings.md +141 -0
  127. package/docs/cli.md +88 -0
  128. package/docs/compatibility.md +32 -0
  129. package/docs/composition-and-versioning.md +113 -0
  130. package/docs/doctor-and-troubleshooting.md +58 -0
  131. package/docs/evidence/GHSA-ch52-4w7c-c8xp-2026-10-03.md +17 -0
  132. package/docs/evidence/GHSA-ch52-4w7c-c8xp-2026-10-10.md +30 -0
  133. package/docs/evidence/GHSA-ch52-4w7c-c8xp-2026-10-12.md +10 -0
  134. package/docs/evidence/UAN-002-house-style-review.md +29 -0
  135. package/docs/evidence/UAN-007-astro.md +43 -0
  136. package/docs/evidence/UAN-008-worker-sidecar.md +56 -0
  137. package/docs/evidence/UAN-009-init.md +43 -0
  138. package/docs/evidence/UAN-010-auth.md +17 -0
  139. package/docs/evidence/UAN-011-discovery.md +18 -0
  140. package/docs/evidence/UAN-012-mcp-apps.md +14 -0
  141. package/docs/evidence/UAN-013-astro-on-demand.md +47 -0
  142. package/docs/evidence/UAN-014-next.md +57 -0
  143. package/docs/evidence/UAN-015-node-hono.md +69 -0
  144. package/docs/evidence/UAN-016-composition.md +52 -0
  145. package/docs/evidence/UAN-017-version-migrations.md +50 -0
  146. package/docs/evidence/UAN-018-surface-overrides.md +30 -0
  147. package/docs/evidence/UAN-019-doctor.md +19 -0
  148. package/docs/evidence/UAN-020-negative-security-fixtures.md +61 -0
  149. package/docs/evidence/UAN-020-operational-failure-safety.md +49 -0
  150. package/docs/evidence/UAN-021-docs-coverage.md +30 -0
  151. package/docs/evidence/UAN-022-cross-platform-license-notices.md +39 -0
  152. package/docs/evidence/UAN-022-overhead-license-audit.md +233 -0
  153. package/docs/evidence/UAN-022-package-portability.md +54 -0
  154. package/docs/evidence/UAN-023-commercial-agent-hosts.md +36 -0
  155. package/docs/evidence/UAN-023-inspector-host-probe.md +37 -0
  156. package/docs/evidence/UAN-023-inspector-web-and-astro-adoption.md +44 -0
  157. package/docs/evidence/UAN-023-native-webmcp-chrome.md +44 -0
  158. package/docs/evidence/UAN-024-release-readiness-2026-10-10.md +33 -0
  159. package/docs/evidence/UAN-024-release-readiness.md +41 -0
  160. package/docs/evidence/codex-harness.md +56 -0
  161. package/docs/evidence/gate-2-domain-expansion.md +35 -0
  162. package/docs/evidence/recovery-and-selection-recipes-2026-10-15.md +63 -0
  163. package/docs/for-agents.md +50 -0
  164. package/docs/frameworks.md +62 -0
  165. package/docs/getting-started.md +109 -0
  166. package/docs/harness-codex.md +117 -0
  167. package/docs/harness-mcp-bridge.md +30 -0
  168. package/docs/http.md +80 -0
  169. package/docs/installation.md +95 -0
  170. package/docs/mcp-apps.md +57 -0
  171. package/docs/mcp.md +178 -0
  172. package/docs/next.md +73 -0
  173. package/docs/permissions-and-discovery.md +58 -0
  174. package/docs/programmatic-harness.md +88 -0
  175. package/docs/readability-frameworks.md +18 -0
  176. package/docs/reference.md +161 -0
  177. package/docs/release-handoff.md +41 -0
  178. package/docs/site-publication.md +85 -0
  179. package/docs/stability.md +53 -0
  180. package/docs/static-sites.md +141 -0
  181. package/docs/support-and-limitations.md +20 -0
  182. package/docs/surfaces.md +27 -0
  183. package/docs/upgrading-to-1.0.md +26 -0
  184. package/package.json +188 -4
  185. package/skill/agent-native/SKILL.md +54 -0
  186. package/skill/agent-native/references/adapter-decision.md +19 -0
  187. package/skill/agent-native/references/verification.md +25 -0
@@ -0,0 +1,159 @@
1
+ import { Buffer } from 'node:buffer';
2
+ import { once } from 'node:events';
3
+ import { createServer } from 'node:http';
4
+ /** Transport only: the supplied handler retains authentication and capability authorization. */
5
+ export async function startHarnessMcpBridge(options) {
6
+ const host = options.host ?? '127.0.0.1';
7
+ const port = options.port ?? 0;
8
+ const maxRequestBytes = options.maxRequestBytes ?? 32_768;
9
+ const deadlineMs = options.deadlineMs ?? 30_000;
10
+ if (host !== '127.0.0.1' ||
11
+ !Number.isInteger(port) ||
12
+ port < 0 ||
13
+ port > 65_535 ||
14
+ !Number.isInteger(maxRequestBytes) ||
15
+ maxRequestBytes < 1 ||
16
+ maxRequestBytes > 1_048_576 ||
17
+ !Number.isInteger(deadlineMs) ||
18
+ deadlineMs < 1 ||
19
+ deadlineMs > 300_000)
20
+ throw new TypeError('Invalid loopback MCP bridge configuration.');
21
+ let origin = '';
22
+ let active = new Set();
23
+ let server = createServer(async (incoming, outgoing) => {
24
+ if (incoming.headers.host !== origin.slice('http://'.length)) {
25
+ outgoing.writeHead(421).end();
26
+ return;
27
+ }
28
+ if (incoming.headers.origin !== undefined && incoming.headers.origin !== origin) {
29
+ outgoing.writeHead(403).end();
30
+ return;
31
+ }
32
+ let url;
33
+ try {
34
+ url = new URL(incoming.url ?? '/', origin);
35
+ }
36
+ catch {
37
+ outgoing.writeHead(400).end();
38
+ return;
39
+ }
40
+ if (url.origin !== origin) {
41
+ outgoing.writeHead(421).end();
42
+ return;
43
+ }
44
+ if (url.pathname !== '/mcp') {
45
+ outgoing.writeHead(404).end();
46
+ return;
47
+ }
48
+ let controller = new AbortController();
49
+ active.add(controller);
50
+ let reader;
51
+ const disconnected = () => controller.abort();
52
+ outgoing.on('close', disconnected);
53
+ incoming.on('aborted', disconnected);
54
+ const timer = setTimeout(() => {
55
+ controller.abort();
56
+ if (outgoing.headersSent)
57
+ outgoing.destroy();
58
+ else
59
+ outgoing.writeHead(504).end();
60
+ }, deadlineMs);
61
+ try {
62
+ let chunks = [];
63
+ let size = 0;
64
+ for await (const chunk of incoming) {
65
+ const bytes = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
66
+ size += bytes.length;
67
+ if (size > maxRequestBytes) {
68
+ outgoing.writeHead(413).end();
69
+ return;
70
+ }
71
+ chunks.push(bytes);
72
+ }
73
+ if (controller.signal.aborted)
74
+ return;
75
+ let headers = new Headers();
76
+ for (let index = 0; index < incoming.rawHeaders.length; index += 2) {
77
+ const name = incoming.rawHeaders[index];
78
+ const value = incoming.rawHeaders[index + 1];
79
+ if (name !== undefined && value !== undefined)
80
+ headers.append(name, value);
81
+ }
82
+ const method = incoming.method ?? 'GET';
83
+ const request = new Request(url, {
84
+ method,
85
+ headers,
86
+ signal: controller.signal,
87
+ ...(method === 'GET' || method === 'HEAD'
88
+ ? {}
89
+ : { body: new Uint8Array(Buffer.concat(chunks)) }),
90
+ });
91
+ const response = await options.handler(request);
92
+ if (controller.signal.aborted) {
93
+ await response.body?.cancel();
94
+ return;
95
+ }
96
+ outgoing.writeHead(response.status, Object.fromEntries(response.headers));
97
+ if (response.body !== null && method !== 'HEAD') {
98
+ reader = response.body.getReader();
99
+ // Cancellation also interrupts an idle SSE read during close or client disconnect.
100
+ controller.signal.addEventListener('abort', () => {
101
+ void reader
102
+ ?.cancel()
103
+ .catch(() => console.error('MCP bridge response cancellation failed.'));
104
+ }, { once: true });
105
+ while (!controller.signal.aborted) {
106
+ const { value, done } = await reader.read();
107
+ if (done)
108
+ break;
109
+ if (!outgoing.write(value))
110
+ await once(outgoing, 'drain', { signal: controller.signal });
111
+ }
112
+ }
113
+ else
114
+ await response.body?.cancel();
115
+ if (!outgoing.destroyed)
116
+ outgoing.end();
117
+ }
118
+ catch {
119
+ if (!controller.signal.aborted) {
120
+ console.error('MCP bridge request failed.');
121
+ if (outgoing.headersSent)
122
+ outgoing.destroy();
123
+ else
124
+ outgoing.writeHead(500).end();
125
+ }
126
+ }
127
+ finally {
128
+ clearTimeout(timer);
129
+ active.delete(controller);
130
+ outgoing.off('close', disconnected);
131
+ incoming.off('aborted', disconnected);
132
+ reader?.releaseLock();
133
+ }
134
+ });
135
+ server.requestTimeout = deadlineMs;
136
+ server.headersTimeout = deadlineMs;
137
+ server.listen(port, host);
138
+ await once(server, 'listening');
139
+ const address = server.address();
140
+ if (address === null || typeof address === 'string') {
141
+ server.close();
142
+ throw new Error('MCP bridge failed to bind.');
143
+ }
144
+ origin = `http://${host}:${address.port}`;
145
+ let closing;
146
+ return Object.freeze({
147
+ url: `${origin}/mcp`,
148
+ close() {
149
+ closing ??= new Promise((resolve, reject) => {
150
+ for (const controller of active)
151
+ controller.abort();
152
+ server.close((error) => (error ? reject(error) : resolve()));
153
+ server.closeAllConnections();
154
+ });
155
+ return closing;
156
+ },
157
+ });
158
+ }
159
+ //# sourceMappingURL=harness-mcp-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harness-mcp-bridge.js","sourceRoot":"","sources":["../src/harness-mcp-bridge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,EAAE,YAAY,EAA0D,MAAM,WAAW,CAAC;AAgBjG,gGAAgG;AAChG,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,OAAgC;IAEhC,MAAM,IAAI,GAAgB,OAAO,CAAC,IAAI,IAAI,WAAW,CAAC;IACtD,MAAM,IAAI,GAAW,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC;IACvC,MAAM,eAAe,GAAW,OAAO,CAAC,eAAe,IAAI,MAAM,CAAC;IAClE,MAAM,UAAU,GAAW,OAAO,CAAC,UAAU,IAAI,MAAM,CAAC;IACxD,IACE,IAAI,KAAK,WAAW;QACpB,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC;QACvB,IAAI,GAAG,CAAC;QACR,IAAI,GAAG,MAAM;QACb,CAAC,MAAM,CAAC,SAAS,CAAC,eAAe,CAAC;QAClC,eAAe,GAAG,CAAC;QACnB,eAAe,GAAG,SAAS;QAC3B,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC;QAC7B,UAAU,GAAG,CAAC;QACd,UAAU,GAAG,OAAO;QAEpB,MAAM,IAAI,SAAS,CAAC,4CAA4C,CAAC,CAAC;IAEpE,IAAI,MAAM,GAAW,EAAE,CAAC;IACxB,IAAI,MAAM,GAAyB,IAAI,GAAG,EAAE,CAAC;IAC7C,IAAI,MAAM,GAAW,YAAY,CAC/B,KAAK,EACH,QAAyB,EACzB,QAAoE,EACrD,EAAE;QACjB,IAAI,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7D,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YAC9B,OAAO;QACT,CAAC;QACD,IAAI,QAAQ,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,IAAI,QAAQ,CAAC,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAChF,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YAC9B,OAAO;QACT,CAAC;QACD,IAAI,GAAQ,CAAC;QACb,IAAI,CAAC;YACH,GAAG,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,IAAI,GAAG,EAAE,MAAM,CAAC,CAAC;QAC7C,CAAC;QAAC,MAAM,CAAC;YACP,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YAC9B,OAAO;QACT,CAAC;QACD,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC1B,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YAC9B,OAAO;QACT,CAAC;QACD,IAAI,GAAG,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;YAC5B,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YAC9B,OAAO;QACT,CAAC;QACD,IAAI,UAAU,GAAoB,IAAI,eAAe,EAAE,CAAC;QACxD,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACvB,IAAI,MAA2D,CAAC;QAChE,MAAM,YAAY,GAAe,GAAS,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QAChE,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QACnC,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QACrC,MAAM,KAAK,GAAmB,UAAU,CAAC,GAAS,EAAE;YAClD,UAAU,CAAC,KAAK,EAAE,CAAC;YACnB,IAAI,QAAQ,CAAC,WAAW;gBAAE,QAAQ,CAAC,OAAO,EAAE,CAAC;;gBACxC,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QACrC,CAAC,EAAE,UAAU,CAAC,CAAC;QACf,IAAI,CAAC;YACH,IAAI,MAAM,GAAa,EAAE,CAAC;YAC1B,IAAI,IAAI,GAAW,CAAC,CAAC;YACrB,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;gBACnC,MAAM,KAAK,GAAW,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC1E,IAAI,IAAI,KAAK,CAAC,MAAM,CAAC;gBACrB,IAAI,IAAI,GAAG,eAAe,EAAE,CAAC;oBAC3B,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;oBAC9B,OAAO;gBACT,CAAC;gBACD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrB,CAAC;YACD,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO;gBAAE,OAAO;YACtC,IAAI,OAAO,GAAY,IAAI,OAAO,EAAE,CAAC;YACrC,KAAK,IAAI,KAAK,GAAW,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;gBAC3E,MAAM,IAAI,GAAuB,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;gBAC5D,MAAM,KAAK,GAAuB,QAAQ,CAAC,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;gBACjE,IAAI,IAAI,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS;oBAAE,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAC7E,CAAC;YACD,MAAM,MAAM,GAAW,QAAQ,CAAC,MAAM,IAAI,KAAK,CAAC;YAChD,MAAM,OAAO,GAAY,IAAI,OAAO,CAAC,GAAG,EAAE;gBACxC,MAAM;gBACN,OAAO;gBACP,MAAM,EAAE,UAAU,CAAC,MAAM;gBACzB,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,MAAM;oBACvC,CAAC,CAAC,EAAE;oBACJ,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;aACrD,CAAC,CAAC;YACH,MAAM,QAAQ,GAAa,MAAM,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAC1D,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBAC9B,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;gBAC9B,OAAO;YACT,CAAC;YACD,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;YAC1E,IAAI,QAAQ,CAAC,IAAI,KAAK,IAAI,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;gBAChD,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;gBACnC,mFAAmF;gBACnF,UAAU,CAAC,MAAM,CAAC,gBAAgB,CAChC,OAAO,EACP,GAAS,EAAE;oBACT,KAAK,MAAM;wBACT,EAAE,MAAM,EAAE;yBACT,KAAK,CAAC,GAAS,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC,CAAC;gBAClF,CAAC,EACD,EAAE,IAAI,EAAE,IAAI,EAAE,CACf,CAAC;gBACF,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;oBAClC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GACnB,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;oBACtB,IAAI,IAAI;wBAAE,MAAM;oBAChB,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC;wBACxB,MAAM,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;gBACjE,CAAC;YACH,CAAC;;gBAAM,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;YACrC,IAAI,CAAC,QAAQ,CAAC,SAAS;gBAAE,QAAQ,CAAC,GAAG,EAAE,CAAC;QAC1C,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBAC/B,OAAO,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;gBAC5C,IAAI,QAAQ,CAAC,WAAW;oBAAE,QAAQ,CAAC,OAAO,EAAE,CAAC;;oBACxC,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YACrC,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAC1B,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;YACpC,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;YACtC,MAAM,EAAE,WAAW,EAAE,CAAC;QACxB,CAAC;IACH,CAAC,CACF,CAAC;IACF,MAAM,CAAC,cAAc,GAAG,UAAU,CAAC;IACnC,MAAM,CAAC,cAAc,GAAG,UAAU,CAAC;IACnC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC1B,MAAM,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAChC,MAAM,OAAO,GAAgC,MAAM,CAAC,OAAO,EAAE,CAAC;IAC9D,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QACpD,MAAM,CAAC,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAChD,CAAC;IACD,MAAM,GAAG,UAAU,IAAI,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;IAC1C,IAAI,OAAkC,CAAC;IACvC,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,GAAG,EAAE,GAAG,MAAM,MAAM;QACpB,KAAK;YACH,OAAO,KAAK,IAAI,OAAO,CAAO,CAAC,OAAmB,EAAE,MAA8B,EAAQ,EAAE;gBAC1F,KAAK,MAAM,UAAU,IAAI,MAAM;oBAAE,UAAU,CAAC,KAAK,EAAE,CAAC;gBACpD,MAAM,CAAC,KAAK,CAAC,CAAC,KAAa,EAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;gBAC3E,MAAM,CAAC,mBAAmB,EAAE,CAAC;YAC/B,CAAC,CAAC,CAAC;YACH,OAAO,OAAO,CAAC;QACjB,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,72 @@
1
+ export type HarnessTarget = 'local' | 'cloud';
2
+ export type HarnessFeature = 'resume' | 'cancel' | 'usage' | 'mcp';
3
+ export type HarnessDescriptor = {
4
+ readonly provider: string;
5
+ readonly targets: readonly HarnessTarget[];
6
+ readonly features: readonly HarnessFeature[];
7
+ };
8
+ export type HarnessSessionRef = {
9
+ readonly provider: string;
10
+ readonly sessionId: string;
11
+ readonly target: HarnessTarget;
12
+ };
13
+ export type OpenHarnessSessionRequest = {
14
+ readonly target: 'local';
15
+ readonly workspace: string;
16
+ } | {
17
+ readonly target: 'cloud';
18
+ };
19
+ export type ResumeHarnessSessionRequest = OpenHarnessSessionRequest & {
20
+ readonly session: HarnessSessionRef;
21
+ };
22
+ export type RunHarnessTurnRequest = {
23
+ readonly session: HarnessSessionRef;
24
+ readonly prompt: string;
25
+ };
26
+ export type CancelHarnessTurnRequest = {
27
+ readonly session: HarnessSessionRef;
28
+ readonly turnId: string;
29
+ };
30
+ export type CloseHarnessSessionRequest = {
31
+ readonly session: HarnessSessionRef;
32
+ };
33
+ export type HarnessFailureReason = 'unsupported-target' | 'unsupported-feature' | 'invalid-request' | 'authentication-required' | 'provider-unavailable' | 'session-not-found' | 'session-closed' | 'turn-not-found' | 'turn-active' | 'timeout' | 'provider-failed';
34
+ export declare class HarnessError extends Error {
35
+ readonly reason: HarnessFailureReason;
36
+ constructor(reason: HarnessFailureReason);
37
+ }
38
+ type HarnessTurnEventRef = {
39
+ readonly session: HarnessSessionRef;
40
+ readonly turnId: string;
41
+ };
42
+ export type HarnessStatusEvent = HarnessTurnEventRef & {
43
+ readonly type: 'progress' | 'tool';
44
+ readonly message: string;
45
+ };
46
+ export type HarnessEvent = {
47
+ readonly type: 'session-started';
48
+ readonly session: HarnessSessionRef;
49
+ } | (HarnessTurnEventRef & {
50
+ readonly type: 'turn-started' | 'completed' | 'cancelled';
51
+ }) | HarnessStatusEvent | (HarnessTurnEventRef & {
52
+ readonly type: 'usage';
53
+ readonly unit: 'tokens' | 'requests';
54
+ readonly quantity: number;
55
+ }) | (HarnessTurnEventRef & {
56
+ readonly type: 'failed';
57
+ readonly reason: HarnessFailureReason;
58
+ });
59
+ export interface ProgrammaticHarnessAdapter {
60
+ describe(): Promise<HarnessDescriptor>;
61
+ openSession(request: OpenHarnessSessionRequest): Promise<HarnessSessionRef>;
62
+ resumeSession(request: ResumeHarnessSessionRequest): Promise<HarnessSessionRef>;
63
+ runTurn(request: RunHarnessTurnRequest): AsyncIterable<HarnessEvent>;
64
+ cancelTurn(request: CancelHarnessTurnRequest): Promise<void>;
65
+ closeSession(request: CloseHarnessSessionRequest): Promise<void>;
66
+ }
67
+ export declare function assertHarnessSupport(descriptor: HarnessDescriptor, target: HarnessTarget, feature?: HarnessFeature): void;
68
+ export declare const HARNESS_STATUS_MESSAGE_LIMIT: 240;
69
+ export declare function createHarnessStatusEvent(event: HarnessStatusEvent): HarnessStatusEvent;
70
+ export declare function createHarnessEvent(event: HarnessEvent): HarnessEvent;
71
+ export {};
72
+ //# sourceMappingURL=harness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harness.d.ts","sourceRoot":"","sources":["../src/harness.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,101 @@
1
+ const FAILURE_MESSAGES = Object.freeze({
2
+ 'unsupported-target': 'The harness does not support this target.',
3
+ 'unsupported-feature': 'The harness does not support this feature.',
4
+ 'invalid-request': 'The harness request is invalid.',
5
+ 'authentication-required': 'The harness requires authentication.',
6
+ 'provider-unavailable': 'The harness provider is unavailable.',
7
+ 'session-not-found': 'The harness session was not found.',
8
+ 'session-closed': 'The harness session is closed.',
9
+ 'turn-not-found': 'The harness turn was not found.',
10
+ 'turn-active': 'The harness session already has an active turn.',
11
+ timeout: 'The harness operation timed out.',
12
+ 'provider-failed': 'The harness provider failed.',
13
+ });
14
+ export class HarnessError extends Error {
15
+ reason;
16
+ constructor(reason) {
17
+ super(FAILURE_MESSAGES[reason]);
18
+ this.name = 'HarnessError';
19
+ this.reason = reason;
20
+ }
21
+ }
22
+ export function assertHarnessSupport(descriptor, target, feature) {
23
+ if (!descriptor.targets.includes(target))
24
+ throw new HarnessError('unsupported-target');
25
+ if (feature !== undefined && !descriptor.features.includes(feature)) {
26
+ throw new HarnessError('unsupported-feature');
27
+ }
28
+ }
29
+ export const HARNESS_STATUS_MESSAGE_LIMIT = 240;
30
+ function checkedSession(session) {
31
+ if (!isBoundedText(session.provider, 64) ||
32
+ !isBoundedText(session.sessionId, 1024) ||
33
+ !['local', 'cloud'].includes(session.target)) {
34
+ throw new HarnessError('invalid-request');
35
+ }
36
+ return Object.freeze({
37
+ provider: session.provider,
38
+ sessionId: session.sessionId,
39
+ target: session.target,
40
+ });
41
+ }
42
+ function isBoundedText(value, limit) {
43
+ return (typeof value === 'string' &&
44
+ value.length > 0 &&
45
+ value.length <= limit &&
46
+ [...value].every((character) => character.charCodeAt(0) > 31 && character.charCodeAt(0) !== 127));
47
+ }
48
+ // The adapter supplies a reviewed safe summary, never provider output or exception text.
49
+ export function createHarnessStatusEvent(event) {
50
+ if (!['progress', 'tool'].includes(event.type) ||
51
+ !isBoundedText(event.message, HARNESS_STATUS_MESSAGE_LIMIT) ||
52
+ !isBoundedText(event.turnId, 128)) {
53
+ throw new HarnessError('invalid-request');
54
+ }
55
+ return Object.freeze({
56
+ type: event.type,
57
+ session: checkedSession(event.session),
58
+ turnId: event.turnId,
59
+ message: event.message,
60
+ });
61
+ }
62
+ // Runtime validator default for untrusted input; also proves compile-time exhaustiveness.
63
+ function invalidHarnessEvent(_event) {
64
+ throw new HarnessError('invalid-request');
65
+ }
66
+ export function createHarnessEvent(event) {
67
+ const session = checkedSession(event.session);
68
+ if (event.type === 'session-started')
69
+ return Object.freeze({ type: event.type, session });
70
+ if (!isBoundedText(event.turnId, 128))
71
+ throw new HarnessError('invalid-request');
72
+ const ref = { session, turnId: event.turnId };
73
+ switch (event.type) {
74
+ case 'progress':
75
+ case 'tool':
76
+ return createHarnessStatusEvent(event);
77
+ case 'turn-started':
78
+ case 'completed':
79
+ case 'cancelled':
80
+ return Object.freeze({ type: event.type, ...ref });
81
+ case 'failed':
82
+ if (!Object.hasOwn(FAILURE_MESSAGES, event.reason))
83
+ throw new HarnessError('invalid-request');
84
+ return Object.freeze({ type: event.type, ...ref, reason: event.reason });
85
+ case 'usage':
86
+ if (!['tokens', 'requests'].includes(event.unit) ||
87
+ !Number.isSafeInteger(event.quantity) ||
88
+ event.quantity < 0) {
89
+ throw new HarnessError('invalid-request');
90
+ }
91
+ return Object.freeze({
92
+ type: event.type,
93
+ ...ref,
94
+ unit: event.unit,
95
+ quantity: event.quantity,
96
+ });
97
+ default:
98
+ return invalidHarnessEvent(event);
99
+ }
100
+ }
101
+ //# sourceMappingURL=harness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harness.js","sourceRoot":"","sources":["../src/harness.ts"],"names":[],"mappings":"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"}
package/dist/http.d.ts ADDED
@@ -0,0 +1,20 @@
1
+ import { type CapabilityDefinition } from './core/contracts.js';
2
+ import type { AuthorizationPort, ExecutionCaller } from './core/executor.js';
3
+ import type { CapabilityRegistry } from './core/registry.js';
4
+ export type HttpExecutionContext = {
5
+ readonly caller: ExecutionCaller;
6
+ readonly authorization: AuthorizationPort;
7
+ };
8
+ export type HttpAdapterOptions = {
9
+ readonly basePath?: string;
10
+ readonly maxRequestBytes?: number;
11
+ readonly deadlineMs?: number;
12
+ readonly resolveExecutionContext?: (request: Request) => HttpExecutionContext | Promise<HttpExecutionContext>;
13
+ };
14
+ export declare function httpInvocationPath(identityOrDefinition: CapabilityDefinition<unknown, unknown>['identity'] | CapabilityDefinition<unknown, unknown>, root?: string): string;
15
+ export declare function httpQueryParameters(definition: CapabilityDefinition<unknown, unknown>, input: unknown): URLSearchParams;
16
+ export declare function createOpenApiDocument(registry: CapabilityRegistry, options?: {
17
+ readonly basePath?: string;
18
+ }): Readonly<Record<string, unknown>>;
19
+ export declare function createHttpHandler(registry: CapabilityRegistry, options?: HttpAdapterOptions): (request: Request) => Promise<Response>;
20
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,oBAAoB,EAAyB,MAAM,qBAAqB,CAAC;AAGvF,OAAO,KAAK,EACV,iBAAiB,EAEjB,eAAe,EAEhB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,KAAK,EAAqB,kBAAkB,EAAmB,MAAM,oBAAoB,CAAC;AAyBjG,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;IACjC,QAAQ,CAAC,aAAa,EAAE,iBAAiB,CAAC;CAC3C,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,uBAAuB,CAAC,EAAE,CACjC,OAAO,EAAE,OAAO,KACb,oBAAoB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;CAC3D,CAAC;AA0DF,wBAAgB,kBAAkB,CAChC,oBAAoB,EAChB,oBAAoB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,UAAU,CAAC,GAClD,oBAAoB,CAAC,OAAO,EAAE,OAAO,CAAC,EAC1C,IAAI,GAAE,MAA0B,GAC/B,MAAM,CAQR;AAyJD,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,oBAAoB,CAAC,OAAO,EAAE,OAAO,CAAC,EAClD,KAAK,EAAE,OAAO,GACb,eAAe,CAwBjB;AAuDD,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,kBAAkB,EAC5B,OAAO,GAAE;IAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,GAC3C,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAqFnC;AA6GD,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,kBAAkB,EAC5B,OAAO,GAAE,kBAAuB,GAC/B,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CA+IzC"}