@neuralnomads/codenomad-dev 0.20.1-dev-20261019-7eb401eb → 0.20.1-dev-20261019-e32d9331

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 (70) hide show
  1. package/dist/automation/browser-page.js +97 -0
  2. package/dist/automation/browser-page.js.map +1 -0
  3. package/dist/automation/browser-page.test.js +119 -0
  4. package/dist/automation/browser-page.test.js.map +1 -0
  5. package/dist/automation/page/actions.js +107 -83
  6. package/dist/automation/page/actions.js.map +1 -1
  7. package/dist/automation/page/input.js +130 -0
  8. package/dist/automation/page/input.js.map +1 -0
  9. package/dist/automation/page/input.test.js +71 -0
  10. package/dist/automation/page/input.test.js.map +1 -0
  11. package/dist/automation/page/keys.js +99 -0
  12. package/dist/automation/page/keys.js.map +1 -0
  13. package/dist/automation/page/keys.test.js +32 -0
  14. package/dist/automation/page/keys.test.js.map +1 -0
  15. package/dist/automation/page/parse.js +79 -0
  16. package/dist/automation/page/parse.js.map +1 -0
  17. package/dist/automation/page/protocol.js +143 -0
  18. package/dist/automation/page/protocol.js.map +1 -0
  19. package/dist/developer-cdp.js +7 -10
  20. package/dist/developer-cdp.js.map +1 -1
  21. package/dist/developer-cdp.test.js +49 -15
  22. package/dist/developer-cdp.test.js.map +1 -1
  23. package/dist/opencode/automation/desktop-plugin.js +10 -6
  24. package/dist/opencode/automation/desktop-plugin.js.map +1 -1
  25. package/dist/opencode/automation-plugin.js +33 -41
  26. package/dist/opencode/automation-plugin.js.map +1 -1
  27. package/dist/opencode/automation-plugin.test.js +42 -1
  28. package/dist/opencode/automation-plugin.test.js.map +1 -1
  29. package/dist/plugins/automation/plugin.mjs +230 -40
  30. package/dist/plugins/missions/plugin.mjs +21 -0
  31. package/dist/server/routes/automation-plugin.js +7 -5
  32. package/dist/server/routes/automation-plugin.js.map +1 -1
  33. package/dist/server/routes/automation-plugin.test.js +17 -4
  34. package/dist/server/routes/automation-plugin.test.js.map +1 -1
  35. package/package.json +1 -1
  36. package/public/assets/{App-7u0r589J.js → App-DZMdkLQJ.js} +8 -8
  37. package/public/assets/{App-7u0r589J.js.map → App-DZMdkLQJ.js.map} +1 -1
  38. package/public/assets/{FilesPanel-DmdwCBoM.js → FilesPanel-CgFgL4q7.js} +2 -2
  39. package/public/assets/{FilesPanel-DmdwCBoM.js.map → FilesPanel-CgFgL4q7.js.map} +1 -1
  40. package/public/assets/{StatusTab-CPfdwHzQ.js → StatusTab-CaQz8RwN.js} +2 -2
  41. package/public/assets/{StatusTab-CPfdwHzQ.js.map → StatusTab-CaQz8RwN.js.map} +1 -1
  42. package/public/assets/{client-state-Dbg3RTSW.js → client-state-DikXRKzG.js} +2 -2
  43. package/public/assets/{client-state-Dbg3RTSW.js.map → client-state-DikXRKzG.js.map} +1 -1
  44. package/public/assets/{client-state-_VkciMC3.js → client-state-kpF1cbUu.js} +2 -2
  45. package/public/assets/{client-state-_VkciMC3.js.map → client-state-kpF1cbUu.js.map} +1 -1
  46. package/public/assets/client-state-owner-commands-BMJJQYT-.js +2 -0
  47. package/public/assets/{client-state-owner-commands-C_V-9FL7.js.map → client-state-owner-commands-BMJJQYT-.js.map} +1 -1
  48. package/public/assets/{diff-viewer-EKYtk2Kn.js → diff-viewer-iFIylM56.js} +2 -2
  49. package/public/assets/{diff-viewer-EKYtk2Kn.js.map → diff-viewer-iFIylM56.js.map} +1 -1
  50. package/public/assets/{main-CSjPT-d2.js → main-B0L3f7sD.js} +52 -52
  51. package/public/assets/main-B0L3f7sD.js.map +1 -0
  52. package/public/assets/{markdown-BCaUmWNf.js → markdown-Bh1QlJgA.js} +2 -2
  53. package/public/assets/{markdown-BCaUmWNf.js.map → markdown-Bh1QlJgA.js.map} +1 -1
  54. package/public/assets/{opener-startup-state-settings-card-DcDRs1t6.js → opener-startup-state-settings-card-mzh22bq8.js} +2 -2
  55. package/public/assets/{opener-startup-state-settings-card-DcDRs1t6.js.map → opener-startup-state-settings-card-mzh22bq8.js.map} +1 -1
  56. package/public/assets/{startup-state-settings-card-CQaOfOwm.js → startup-state-settings-card-B1UMzsQK.js} +2 -2
  57. package/public/assets/{startup-state-settings-card-CQaOfOwm.js.map → startup-state-settings-card-B1UMzsQK.js.map} +1 -1
  58. package/public/assets/{startup-state-settings-view-Cd3LgXsC.js → startup-state-settings-view-nZNbhUhQ.js} +2 -2
  59. package/public/assets/{startup-state-settings-view-Cd3LgXsC.js.map → startup-state-settings-view-nZNbhUhQ.js.map} +1 -1
  60. package/public/assets/{terminal-square-CBQGNjjn.js → terminal-square-CdJ4Gt6Y.js} +2 -2
  61. package/public/assets/{terminal-square-CBQGNjjn.js.map → terminal-square-CdJ4Gt6Y.js.map} +1 -1
  62. package/public/assets/{tool-call-Q2b_KH6g.js → tool-call-C9ux0znU.js} +4 -4
  63. package/public/assets/{tool-call-Q2b_KH6g.js.map → tool-call-C9ux0znU.js.map} +1 -1
  64. package/public/assets/{unified-picker-Dubi2nCg.js → unified-picker-DOP29DIt.js} +2 -2
  65. package/public/assets/{unified-picker-Dubi2nCg.js.map → unified-picker-DOP29DIt.js.map} +1 -1
  66. package/public/index.html +1 -1
  67. package/public/sw.js +1 -1
  68. package/public/sw.js.map +1 -1
  69. package/public/assets/client-state-owner-commands-C_V-9FL7.js +0 -2
  70. package/public/assets/main-CSjPT-d2.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"automation-plugin.test.js","sourceRoot":"","sources":["../../../src/server/routes/automation-plugin.test.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from \"node:assert/strict\"\nimport test from \"node:test\"\nimport Fastify from \"fastify\"\nimport { AUTOMATION_BRIDGE_PATH } from \"../../opencode/automation-plugin\"\nimport { registerAutomationPluginRoute } from \"./automation-plugin\"\n\ntest(\"a slow unrelated workspace cannot hide an already verified automation owner\", { timeout: 2_000 }, async t => {\n const app = Fastify()\n let unblock!: () => void\n const unrelated = new Promise<void>(resolve => { unblock = resolve })\n t.after(async () => { unblock(); await app.close() })\n registerAutomationPluginRoute(app, {\n authManager: { isLoopbackRequest: () => true }, bridgeToken: \"fixture\", nativeParent: {}, developerCdp: {},\n workspaceManager: {\n getSharedServiceClient: async () => ({ session: { get: async () => ({ location: { directory: \"/repo\" } }) } }),\n list: () => [{ id: \"slow-unrelated\" }, { id: \"owner\" }],\n ownsLocation: async (id: string) => { if (id === \"owner\") return true; await unrelated; return false },\n },\n } as never)\n const response = await app.inject({ method: \"POST\", url: AUTOMATION_BRIDGE_PATH,\n headers: { \"x-codenomad-automation-token\": \"fixture\" }, payload: { mode: \"browser-claim\", sessionID: \"ses_owner\" } })\n assert.equal(response.statusCode, 200)\n})\n\ntest(\"targets the inspected window independently of the visible conversation\", async () => {\n const app = Fastify({ logger: false })\n const nativeCalls: Array<{ method: string; params: unknown }> = []\n let state = \"ready\"\n let runId = \"run-1\"\n let visibleSession = \"session-1\"\n let inspectedIdentity: unknown\n const inspectOptions: unknown[] = [], actions: Array<Record<string, unknown>> = []\n registerAutomationPluginRoute(app, {\n authManager: { isLoopbackRequest: () => true },\n bridgeToken: \"secret\",\n nativeParent: {\n request: async (method: string, params: unknown) => {\n nativeCalls.push({ method, params })\n if (method === \"developer.restart\") {\n runId = \"run-2\"\n return { state: \"starting\", runId }\n }\n return {\n status: {\n state,\n runId,\n nativeIdentity: \"electron:test\",\n cdpUrl: \"http://127.0.0.1:9222\",\n windowId: \"window-1\",\n },\n logs: [],\n }\n },\n },\n developerCdp: {\n context: async (identity: { sessionId?: string }) => {\n assert.equal(identity.sessionId, undefined)\n return { windowId: \"window-1\", instanceId: \"workspace-1\", sessionId: visibleSession }\n },\n inspect: async (identity: unknown, options: unknown) => {\n inspectedIdentity = identity\n inspectOptions.push(options)\n return {\n target: { id: \"page-1\", title: \"CodeNomad\", url: \"http://app.test/\" },\n context: { windowId: \"window-1\", instanceId: \"workspace-1\", sessionId: visibleSession },\n snapshot: \"- button \\\"Save\\\" [e1]\",\n collapsed: 0,\n diagnostics: [],\n }\n },\n close: () => undefined,\n act: async (identity: { sessionId?: string; instanceId?: string; kind: string; values?: string[] }) => {\n assert.equal(identity.sessionId, undefined)\n assert.equal(identity.instanceId, undefined)\n actions.push(identity)\n return identity.kind === \"select\" ? { selected: identity.values } : {}\n },\n },\n workspaceManager: {\n getSharedServiceClient: async () => ({ session: { get: async () => ({ location: { directory: \"D:\\\\project\" } }) } }),\n list: () => [{ id: \"workspace-1\" }],\n ownsLocation: async () => true,\n },\n } as never)\n\n const request = async (body: Record<string, unknown>) => app.inject({\n method: \"POST\",\n url: AUTOMATION_BRIDGE_PATH,\n headers: { \"x-codenomad-automation-token\": \"secret\" },\n payload: body,\n })\n\n assert.equal((await request({ mode: \"developer-probe\", sessionID: \"session-1\" })).statusCode, 200)\n const inspect = await request({ mode: \"developer-execute\", sessionID: \"session-1\", command: { action: \"inspect\" } })\n assert.equal(inspect.statusCode, 200)\n assert.deepEqual(inspectedIdentity, {\n endpoint: \"http://127.0.0.1:9222\",\n runId: \"run-1\",\n windowId: \"window-1\",\n })\n assert.equal(inspect.json().result.context.sessionId, \"session-1\")\n\n visibleSession = \"session-2\"\n assert.equal((await request({ mode: \"developer-execute\", sessionID: \"session-1\", command: { action: \"click\", ref: \"ax1\" } })).statusCode, 200)\n assert.equal((await request({ mode: \"developer-execute\", sessionID: \"session-1\", command: { action: \"inspect\", ref: \"e1\", query: \"Save\" } })).statusCode, 200)\n assert.deepEqual(inspectOptions, [{ ref: undefined, query: undefined }, { ref: \"e1\", query: \"Save\" }])\n const selected = await request({ mode: \"developer-execute\", sessionID: \"session-1\", command: { action: \"select\", ref: \"e2\", values: [\"Exploration\"] } })\n assert.deepEqual(selected.json(), { result: { ok: true, selected: [\"Exploration\"] } })\n await request({ mode: \"developer-execute\", sessionID: \"session-1\", command: { action: \"type\", ref: \"e3\", text: \"x\", clear: false } })\n assert.deepEqual(actions.map(action => [action.kind, action.ref, action.clear ?? action.values]),\n [[\"click\", \"ax1\", undefined], [\"select\", \"e2\", [\"Exploration\"]], [\"type\", \"e3\", false]])\n\n const restart = await request({ mode: \"developer-execute\", sessionID: \"session-1\", command: { action: \"restart\" } })\n assert.equal(restart.statusCode, 200)\n assert.deepEqual(nativeCalls.slice(-2), [\n { method: \"developer.status\", params: {} },\n { method: \"developer.restart\", params: {} },\n ])\n assert.equal((await request({ mode: \"developer-probe\", sessionID: \"session-2\" })).statusCode, 200)\n assert.equal((await request({ mode: \"developer-execute\", sessionID: \"session-1\", command: { action: \"restart\" } })).statusCode, 404)\n\n state = \"stopped\"\n assert.equal((await request({ mode: \"developer-probe\", sessionID: \"session-2\" })).statusCode, 404)\n state = \"ready\"\n runId = \"run-3\"\n visibleSession = \"session-2\"\n assert.equal((await request({ mode: \"developer-probe\", sessionID: \"session-2\" })).statusCode, 200)\n\n const unauthorized = await app.inject({ method: \"POST\", url: AUTOMATION_BRIDGE_PATH, payload: { mode: \"developer-probe\", sessionID: \"session-1\" } })\n assert.equal(unauthorized.statusCode, 401)\n await app.close()\n})\n\ntest(\"browser works with an unavailable developer target and unrelated inventory failure\", async () => {\n const app = Fastify({ logger: false })\n const nativeCalls: Array<{ method: string; params: unknown }> = []\n registerAutomationPluginRoute(app, {\n authManager: { isLoopbackRequest: () => true },\n bridgeToken: \"secret\",\n nativeParent: {\n request: async (method: string, params: unknown) => {\n nativeCalls.push({ method, params })\n return method === \"developer.status\" ? { status: { state: \"stopped\" } }\n : method === \"browser.probe\" ? { available: true } : { url: \"https://example.com/\" }\n },\n },\n workspaceManager: {\n getSharedServiceClient: async () => ({ session: { get: async () => ({ location: { directory: \"D:\\\\project\" } }) } }),\n list: () => [{ id: \"unrelated-worktree\" }, { id: \"workspace-1\" }],\n ownsLocation: async (id: string) => {\n if (id === \"unrelated-worktree\") throw new Error(\"Native worktree inventory is unavailable\")\n return true\n },\n },\n } as never)\n\n const request = async (body: Record<string, unknown>) => app.inject({\n method: \"POST\",\n url: AUTOMATION_BRIDGE_PATH,\n headers: { \"x-codenomad-automation-token\": \"secret\" },\n payload: body,\n })\n\n assert.equal((await request({ mode: \"browser-claim\", sessionID: \"session-1\" })).statusCode, 200)\n assert.equal(nativeCalls.length, 0)\n assert.equal((await request({ mode: \"browser-probe\", sessionID: \"session-1\" })).statusCode, 200)\n const open = await request({ mode: \"browser-execute\", sessionID: \"session-1\", command: { action: \"open\", url: \"https://example.com\" } })\n assert.equal(open.statusCode, 200)\n assert.deepEqual(nativeCalls, [\n { method: \"browser.probe\", params: { sessionID: \"session-1\" } },\n {\n method: \"browser.execute\",\n params: { sessionID: \"session-1\", command: { action: \"open\", url: \"https://example.com\" } },\n },\n ])\n const developer = await request({ mode: \"developer-execute\", sessionID: \"session-1\", command: { action: \"inspect\" } })\n assert.equal(developer.statusCode, 404)\n assert.match(developer.json().error, /Native automation has no active/)\n await app.close()\n})\n"]}
1
+ {"version":3,"file":"automation-plugin.test.js","sourceRoot":"","sources":["../../../src/server/routes/automation-plugin.test.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from \"node:assert/strict\"\nimport test from \"node:test\"\nimport Fastify from \"fastify\"\nimport { AUTOMATION_BRIDGE_PATH } from \"../../opencode/automation-plugin\"\nimport { registerAutomationPluginRoute } from \"./automation-plugin\"\n\ntest(\"a slow unrelated workspace cannot hide an already verified automation owner\", { timeout: 2_000 }, async t => {\n const app = Fastify()\n let unblock!: () => void\n const unrelated = new Promise<void>(resolve => { unblock = resolve })\n t.after(async () => { unblock(); await app.close() })\n registerAutomationPluginRoute(app, {\n authManager: { isLoopbackRequest: () => true }, bridgeToken: \"fixture\", nativeParent: {}, developerCdp: {},\n workspaceManager: {\n getSharedServiceClient: async () => ({ session: { get: async () => ({ location: { directory: \"/repo\" } }) } }),\n list: () => [{ id: \"slow-unrelated\" }, { id: \"owner\" }],\n ownsLocation: async (id: string) => { if (id === \"owner\") return true; await unrelated; return false },\n },\n } as never)\n const response = await app.inject({ method: \"POST\", url: AUTOMATION_BRIDGE_PATH,\n headers: { \"x-codenomad-automation-token\": \"fixture\" }, payload: { mode: \"browser-claim\", sessionID: \"ses_owner\" } })\n assert.equal(response.statusCode, 200)\n})\n\ntest(\"targets the inspected window independently of the visible conversation\", async () => {\n const app = Fastify({ logger: false })\n const nativeCalls: Array<{ method: string; params: unknown }> = []\n let state = \"ready\"\n let runId = \"run-1\"\n let visibleSession = \"session-1\"\n let inspectedIdentity: unknown\n const inspectOptions: unknown[] = [], actions: Array<Record<string, unknown>> = []\n registerAutomationPluginRoute(app, {\n authManager: { isLoopbackRequest: () => true },\n bridgeToken: \"secret\",\n nativeParent: {\n request: async (method: string, params: unknown) => {\n nativeCalls.push({ method, params })\n if (method === \"developer.restart\") {\n runId = \"run-2\"\n return { state: \"starting\", runId }\n }\n return {\n status: {\n state,\n runId,\n nativeIdentity: \"electron:test\",\n cdpUrl: \"http://127.0.0.1:9222\",\n windowId: \"window-1\",\n },\n logs: [],\n }\n },\n },\n developerCdp: {\n context: async (identity: { sessionId?: string }) => {\n assert.equal(identity.sessionId, undefined)\n return { windowId: \"window-1\", instanceId: \"workspace-1\", sessionId: visibleSession }\n },\n inspect: async (identity: unknown, options: unknown) => {\n inspectedIdentity = identity\n inspectOptions.push(options)\n return {\n target: { id: \"page-1\", title: \"CodeNomad\", url: \"http://app.test/\" },\n context: { windowId: \"window-1\", instanceId: \"workspace-1\", sessionId: visibleSession },\n snapshot: \"- button \\\"Save\\\" [e1]\",\n collapsed: 0,\n diagnostics: [],\n }\n },\n close: () => undefined,\n act: async (identity: { sessionId?: string; instanceId?: string }, action: { action: string; values?: string[] }) => {\n assert.equal(identity.sessionId, undefined)\n assert.equal(identity.instanceId, undefined)\n actions.push(action)\n return action.action === \"select\" ? { selected: action.values } : {}\n },\n },\n workspaceManager: {\n getSharedServiceClient: async () => ({ session: { get: async () => ({ location: { directory: \"D:\\\\project\" } }) } }),\n list: () => [{ id: \"workspace-1\" }],\n ownsLocation: async () => true,\n },\n } as never)\n\n const request = async (body: Record<string, unknown>) => app.inject({\n method: \"POST\",\n url: AUTOMATION_BRIDGE_PATH,\n headers: { \"x-codenomad-automation-token\": \"secret\" },\n payload: body,\n })\n\n assert.equal((await request({ mode: \"developer-probe\", sessionID: \"session-1\" })).statusCode, 200)\n const inspect = await request({ mode: \"developer-execute\", sessionID: \"session-1\", command: { action: \"inspect\" } })\n assert.equal(inspect.statusCode, 200)\n assert.deepEqual(inspectedIdentity, {\n endpoint: \"http://127.0.0.1:9222\",\n runId: \"run-1\",\n windowId: \"window-1\",\n })\n assert.equal(inspect.json().result.context.sessionId, \"session-1\")\n\n visibleSession = \"session-2\"\n assert.equal((await request({ mode: \"developer-execute\", sessionID: \"session-1\", command: { action: \"click\", ref: \"ax1\" } })).statusCode, 200)\n assert.equal((await request({ mode: \"developer-execute\", sessionID: \"session-1\", command: { action: \"inspect\", ref: \"e1\", query: \"Save\" } })).statusCode, 200)\n assert.deepEqual(inspectOptions, [{ ref: undefined, query: undefined }, { ref: \"e1\", query: \"Save\" }])\n const selected = await request({ mode: \"developer-execute\", sessionID: \"session-1\", command: { action: \"select\", ref: \"e2\", values: [\"Exploration\"] } })\n assert.deepEqual(selected.json(), { result: { ok: true, selected: [\"Exploration\"] } })\n await request({ mode: \"developer-execute\", sessionID: \"session-1\", command: { action: \"type\", ref: \"e3\", text: \"x\", clear: false } })\n assert.deepEqual(actions.map(action => [action.action, action.ref, action.clear ?? action.values]),\n [[\"click\", \"ax1\", undefined], [\"select\", \"e2\", [\"Exploration\"]], [\"type\", \"e3\", false]])\n assert.equal((await request({ mode: \"developer-execute\", sessionID: \"session-1\", command: { action: \"press\", key: \"Hyper+Q\" } })).statusCode, 400,\n \"the backend validates the flat command again\")\n\n const restart = await request({ mode: \"developer-execute\", sessionID: \"session-1\", command: { action: \"restart\" } })\n assert.equal(restart.statusCode, 200)\n assert.deepEqual(nativeCalls.slice(-2), [\n { method: \"developer.status\", params: {} },\n { method: \"developer.restart\", params: {} },\n ])\n assert.equal((await request({ mode: \"developer-probe\", sessionID: \"session-2\" })).statusCode, 200)\n assert.equal((await request({ mode: \"developer-execute\", sessionID: \"session-1\", command: { action: \"restart\" } })).statusCode, 404)\n\n state = \"stopped\"\n assert.equal((await request({ mode: \"developer-probe\", sessionID: \"session-2\" })).statusCode, 404)\n state = \"ready\"\n runId = \"run-3\"\n visibleSession = \"session-2\"\n assert.equal((await request({ mode: \"developer-probe\", sessionID: \"session-2\" })).statusCode, 200)\n\n const unauthorized = await app.inject({ method: \"POST\", url: AUTOMATION_BRIDGE_PATH, payload: { mode: \"developer-probe\", sessionID: \"session-1\" } })\n assert.equal(unauthorized.statusCode, 401)\n await app.close()\n})\n\ntest(\"browser works with an unavailable developer target and unrelated inventory failure\", async () => {\n const app = Fastify({ logger: false })\n const nativeCalls: Array<{ method: string; params: unknown }> = []\n registerAutomationPluginRoute(app, {\n authManager: { isLoopbackRequest: () => true },\n bridgeToken: \"secret\",\n nativeParent: {\n request: async (method: string, params: any) => {\n nativeCalls.push({ method, params })\n if (method === \"browser.page.begin\") return { generation: \"preview-document\", url: \"https://example.com/\" }\n if (method === \"browser.page.send\" && params.method === \"Accessibility.getFullAXTree\") {\n return { nodes: [{ nodeId: \"one\", backendDOMNodeId: 42, role: { value: \"button\" }, name: { value: \"Preview action\" } }] }\n }\n return method === \"developer.status\" ? { status: { state: \"stopped\" } }\n : method === \"browser.probe\" ? { available: true } : { url: \"https://example.com/\" }\n },\n },\n workspaceManager: {\n getSharedServiceClient: async () => ({ session: { get: async () => ({ location: { directory: \"D:\\\\project\" } }) } }),\n list: () => [{ id: \"unrelated-worktree\" }, { id: \"workspace-1\" }],\n ownsLocation: async (id: string) => {\n if (id === \"unrelated-worktree\") throw new Error(\"Native worktree inventory is unavailable\")\n return true\n },\n },\n } as never)\n\n const request = async (body: Record<string, unknown>) => app.inject({\n method: \"POST\",\n url: AUTOMATION_BRIDGE_PATH,\n headers: { \"x-codenomad-automation-token\": \"secret\" },\n payload: body,\n })\n\n assert.equal((await request({ mode: \"browser-claim\", sessionID: \"session-1\" })).statusCode, 200)\n assert.equal(nativeCalls.length, 0)\n assert.equal((await request({ mode: \"browser-probe\", sessionID: \"session-1\" })).statusCode, 200)\n const open = await request({ mode: \"browser-execute\", sessionID: \"session-1\", command: { action: \"open\", url: \"https://example.com\" } })\n assert.equal(open.statusCode, 200)\n assert.deepEqual(nativeCalls, [\n { method: \"browser.probe\", params: { sessionID: \"session-1\" } },\n {\n method: \"browser.execute\",\n params: { sessionID: \"session-1\", command: { action: \"open\", url: \"https://example.com\" } },\n },\n ])\n const snapshot = await request({ mode: \"browser-execute\", sessionID: \"session-1\", command: { action: \"snapshot\", query: \"Preview\" } })\n assert.equal(snapshot.statusCode, 200)\n assert.match(snapshot.json().result.snapshot, /- button \"Preview action\" \\[b1e1\\]/)\n assert.equal(nativeCalls.at(-1)?.method, \"browser.page.end\", \"browser snapshots now use the shared engine's private channel\")\n const count = nativeCalls.length\n assert.equal((await request({ mode: \"browser-execute\", sessionID: \"session-1\", command: { action: \"protocol\", method: \"Runtime.evaluate\" } })).statusCode, 400)\n assert.equal(nativeCalls.length, count, \"a model can never choose protocol methods or scripts\")\n const developer = await request({ mode: \"developer-execute\", sessionID: \"session-1\", command: { action: \"inspect\" } })\n assert.equal(developer.statusCode, 404)\n assert.match(developer.json().error, /Native automation has no active/)\n await app.close()\n})\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@neuralnomads/codenomad-dev",
3
- "version": "0.20.1-dev-20261019-7eb401eb",
3
+ "version": "0.20.1-dev-20261019-e32d9331",
4
4
  "description": "CodeNomad Server",
5
5
  "license": "MIT",
6
6
  "author": {