From ada622c6fb3f9b828313f3b8d1556a6f99f63548 Mon Sep 17 00:00:00 2001 From: ScriptedAlchemy Date: Sat, 26 Sep 2026 05:37:40 +0000 Subject: [PATCH] chore(deps): move agent-bundle to pkg.pr.new b4e38409f4 --- artifact/agent-bundle.compile-evidence.json | 2 +- artifact/agent-bundle.manifest.json | 2 +- artifact/scripts/plugin-library-server.mjs | 1035 +++++++++---------- artifact/scripts/plugin-library.mjs | 696 ++++++------- package-lock.json | 10 +- package.json | 2 +- 6 files changed, 816 insertions(+), 931 deletions(-) diff --git a/artifact/agent-bundle.compile-evidence.json b/artifact/agent-bundle.compile-evidence.json index d26e383..c20d458 100644 --- a/artifact/agent-bundle.compile-evidence.json +++ b/artifact/agent-bundle.compile-evidence.json @@ -1 +1 @@ -{"assets":[{"externals":[{"externalType":"node-commonjs","issuers":["lib/bots.js"],"kind":"builtin","request":"child_process","userRequest":"child_process"},{"externalType":"node-commonjs","issuers":["lib/local-plugins.js"],"kind":"builtin","request":"fs","userRequest":"fs"},{"externalType":"module","issuers":["server.js"],"kind":"builtin","request":"node:fs","userRequest":"node:fs"},{"externalType":"module","issuers":["server.js"],"kind":"builtin","request":"node:http","userRequest":"node:http"},{"externalType":"module","issuers":["server.js"],"kind":"builtin","request":"node:path","userRequest":"node:path"},{"externalType":"module","issuers":["server.js"],"kind":"builtin","request":"node:url","userRequest":"node:url"},{"externalType":"node-commonjs","issuers":["lib/local-plugins.js"],"kind":"builtin","request":"os","userRequest":"os"},{"externalType":"node-commonjs","issuers":["lib/local-plugins.js"],"kind":"builtin","request":"path","userRequest":"path"}],"packages":[],"path":"scripts/plugin-library-server.mjs","sha256":"6b2c7548077aad7a68b0dd2716c833eb3597b91cc25f0dd6c24e1cd464326411"},{"externals":[{"externalType":"module","issuers":["bin/plugin-library.mjs"],"kind":"builtin","request":"node:child_process","userRequest":"node:child_process"},{"externalType":"module","issuers":["bin/plugin-library.mjs"],"kind":"builtin","request":"node:fs","userRequest":"node:fs"},{"externalType":"module","issuers":["bin/plugin-library.mjs"],"kind":"builtin","request":"node:path","userRequest":"node:path"},{"externalType":"module","issuers":["bin/plugin-library.mjs"],"kind":"builtin","request":"node:url","userRequest":"node:url"}],"packages":[],"path":"scripts/plugin-library.mjs","sha256":"c295407765af2e4afb8d97bbf6b794191558139b24bcbb4ca950a204f00fd464"}],"coverage":{"rewritable":false,"unobserved":["import()","require()","require.resolve(…)","createRequire(…)(…)","import.meta.resolve(…)"]},"policy":{"name":"closed-world-externals","revision":1},"producer":{"name":"agent-bundle","rspack":"2.2.5","version":"0.3.0"}} +{"assets":[{"externals":[{"externalType":"node-commonjs","issuers":["lib/bots.js"],"kind":"builtin","request":"child_process","userRequest":"child_process"},{"externalType":"node-commonjs","issuers":["lib/local-plugins.js"],"kind":"builtin","request":"fs","userRequest":"fs"},{"externalType":"module","issuers":["server.js"],"kind":"builtin","request":"node:fs","userRequest":"node:fs"},{"externalType":"module","issuers":["server.js"],"kind":"builtin","request":"node:http","userRequest":"node:http"},{"externalType":"module","issuers":["server.js"],"kind":"builtin","request":"node:path","userRequest":"node:path"},{"externalType":"module","issuers":["server.js"],"kind":"builtin","request":"node:url","userRequest":"node:url"},{"externalType":"node-commonjs","issuers":["lib/local-plugins.js"],"kind":"builtin","request":"os","userRequest":"os"},{"externalType":"node-commonjs","issuers":["lib/local-plugins.js"],"kind":"builtin","request":"path","userRequest":"path"}],"packages":[],"path":"scripts/plugin-library-server.mjs","sha256":"6a7f62055b6225186abb1fc241024d76bb72d42cad31ffe02f8915c176f445f8"},{"externals":[{"externalType":"module","issuers":["bin/plugin-library.mjs"],"kind":"builtin","request":"node:child_process","userRequest":"node:child_process"},{"externalType":"module","issuers":["bin/plugin-library.mjs"],"kind":"builtin","request":"node:fs","userRequest":"node:fs"},{"externalType":"module","issuers":["bin/plugin-library.mjs"],"kind":"builtin","request":"node:path","userRequest":"node:path"},{"externalType":"module","issuers":["bin/plugin-library.mjs"],"kind":"builtin","request":"node:url","userRequest":"node:url"}],"packages":[],"path":"scripts/plugin-library.mjs","sha256":"453195c993d88a42fb41b6708d58eec58a2f69dce08b884beb44c6cce2fe3a8c"}],"coverage":{"rewritable":false,"unobserved":["import()","require()","require.resolve(…)","createRequire(…)(…)","import.meta.resolve(…)"]},"policy":{"name":"closed-world-externals","revision":1},"producer":{"name":"agent-bundle","rspack":"2.2.5","version":"0.3.0"}} diff --git a/artifact/agent-bundle.manifest.json b/artifact/agent-bundle.manifest.json index f291c1e..642b14c 100644 --- a/artifact/agent-bundle.manifest.json +++ b/artifact/agent-bundle.manifest.json @@ -1 +1 @@ -{"application":{"description":"Browse installed and marketplace plugins, read every skill in full, and hand one to a Grok Bot.","id":"plugin:plugin-library","name":"plugin-library","version":"0.4.0"},"compiler":{"adapters":[{"adapterRevision":"1.13.0","host":"cursor","observedVersion":"2026-08-28","schemas":[{"name":"hooks","revision":"2026-08-28","sha256":"06154b7afa0861df462130b988912b897e7ccf962b8dd20c09193100bcde5d81"},{"name":"marketplace","revision":"2026-08-28","sha256":"1aae96a24c2796419933bc8bfe3a1255394e7199c35740b36325e0ce6dbc253d"},{"name":"mcp","revision":"2026-08-28","sha256":"f3fa4615afefe004c4fbcc09e635d890df0f1ec0cb39540feab72cbd3a31d844"},{"name":"plugin","revision":"2026-08-28","sha256":"a393b758901803fcf5cfe0d77bda8a83e987d32c3377dfce2d9edf445af884ed"}]},{"adapterRevision":"1.10.0","host":"portable","observedVersion":"1.0.0","schemas":[{"name":"mcp","revision":"1.0.0","sha256":"6539175bfcdf43085855183e86da40ea94b166547a72b47ae9a0a390516d3acb"},{"name":"plugin","revision":"1.0.0","sha256":"0a4aad95ce337878ad38802ebf0daa3fde76abe3f65400c86bcbb1ec0b3ab883"}]}],"agentSkills":{"schemaSha256":"6d06b61e423317421de2295ea1fd0c7b4491bfa36c5b7705c28616dfe76d4047","sourceRevision":"69ef37e9424c0a7ea9dd2293b559e43ec8176379","specification":"https://raw.githubusercontent.com/agentskills/agentskills/69ef37e9424c0a7ea9dd2293b559e43ec8176379/docs/specification.mdx"},"producer":{"name":"agent-bundle","version":"0.3.0"},"project":{"configDigest":"997aa2bc59ed04425989000405a9e581c4c0050af6d5c2a203768cd461e0d5e0","configPath":"agent-bundle.config.ts","modelDigest":"e3d235d852b9b055ef9f9cc670dc27496443aa516b682a84c7a2bc3176be5644","packageName":"plugin-library","packageVersion":"0.4.0","revision":"800be0672f264fa24c2e8d52e9b7cfd5fa2aff4214f8e97b9421fcdc4692439a","sourceInputs":[{"executable":false,"path":".github/workflows/ci.yml","sha256":"3c51f0bdc639d14d698407abbd7e8a23f6f7330e521b6a78f67e018d72b1a045"},{"executable":false,"path":".github/workflows/publish-agent-bundle.yml","sha256":"cb7c591b7b73dc5762bf4e1cc1e1ac375799de4f931a18afe561341ffb66cbb6"},{"executable":false,"path":".gitignore","sha256":"fc7f785227a74db0c56704f6f615d1c2ec716afe1d9df25b74449367f28955c2"},{"executable":false,"path":"agent-bundle.config.ts","sha256":"997aa2bc59ed04425989000405a9e581c4c0050af6d5c2a203768cd461e0d5e0"},{"executable":false,"path":"assets/logo.svg","sha256":"0205c0641ea70c40f391990660f1597c40fa0b551ba35017d855593756aa3509"},{"executable":true,"path":"bin/plugin-library.mjs","sha256":"0c174e75dadbed3c17f19651f7b764fcd080b83d2ada35523fd51fadd82aef2f"},{"executable":false,"path":"data/pstack.json","sha256":"006aa0f86059fe7a5cff7180cc5704b9afdfb0c372f799047d80db57a0f3ca15"},{"executable":false,"path":"data/unified-catalog.json","sha256":"0827bf86b9bbea2d4a956e5ca347fa00bee55f4a9e594648ba82f2a9dce9388d"},{"executable":false,"path":"lib/bots.js","sha256":"fb697ad2b8b86f50716c310e74765bbcbdf54a65b48a65e9372c8a597e772be3"},{"executable":false,"path":"lib/local-plugins.js","sha256":"32d134641d78a888fa7e0e2e3f11ebad8d1e300eb2807ac5a93c559644612adb"},{"executable":false,"path":"lib/package.json","sha256":"8005a3491db7d92f36ac66369861589f9c47123d3a7c71e643fc2c06168cd45a"},{"executable":false,"path":"LICENSE","sha256":"ff28847df30260ae031d33a736f0e72210a539b1417570bac88a59016157544c"},{"executable":false,"path":"logs/.gitkeep","sha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"},{"executable":false,"path":"package-lock.json","sha256":"0ab0084fd630326d6086bda48feda10b47e610e77907498fb37fdb38846e2f41"},{"executable":false,"path":"package.json","sha256":"035135c3795c802eeb9dd87401074e446571edf56b7ebe89dc2e12214cdf076c"},{"executable":false,"path":"public/app.js","sha256":"56bfd74a4e742d9fff1db1524037f6d51e74a4ce62798d9bd3ba410d0c5df824"},{"executable":false,"path":"public/index.html","sha256":"4d8629c982cedea3917b2f3484c2acf7dc62d1f6db998e478689903a0ec470d9"},{"executable":false,"path":"public/markdown.js","sha256":"2253f5e57229badf2d62cda1a40d893a7526de74519ee1ba789761d83bc08afb"},{"executable":false,"path":"public/picker.js","sha256":"7afa3bc1ebdbcdce7c59b8f2a7a15eee936af81eb57476077295c787608a175a"},{"executable":false,"path":"public/styles.css","sha256":"de7576607e641abab0233887a1a47c0dce839b5e9d6b7668d918e156bf81e2e9"},{"executable":false,"path":"README.md","sha256":"6b5162bcd4594a518c4b9fb6184ed12dcfee4a9c44b334f99993d7131b5a0b45"},{"executable":false,"path":"renovate.json","sha256":"e80b4e42a3043bc12fa0640db4bac392d2bf770acf841360d7c8ceeeac2ec1a9"},{"executable":false,"path":"screens/01-library.png","sha256":"f465bcecd299c9413975baa307dd87dc6b8cacbd0498134118df5bac2ef391a5"},{"executable":false,"path":"screens/02-pstack.png","sha256":"8fc2ed63fae8e7dac833ecea75d64ddcad9c3b6a49382e66132c13876b322c41"},{"executable":false,"path":"screens/03-read-skill.png","sha256":"afee8387371e444a6b0c997b45b576c4c6c7e527fca753338583c6e3ce68ddd2"},{"executable":false,"path":"screens/04-reference-tab.png","sha256":"b55ac9ce9e2cd1918e1b8f48a9ed2292b8f50872a2ffb2ce5c70b665c299eaae"},{"executable":false,"path":"screens/05-pick-a-bot.png","sha256":"03a7823afcd85dc6489bd2cb3b572b499cf8999e16e7a2436e1069ca2913607b"},{"executable":false,"path":"screens/06-confirm.png","sha256":"3333936a6af257344f1d3375a7b3dc14b53c1a10012c1340154c810b00c745a3"},{"executable":false,"path":"screens/07-cursor-team-kit.png","sha256":"fa8a42a120d33bfb32a8c7299180eba1dd61d4550228c05aea9038aa59bd3671"},{"executable":false,"path":"screens/08-marketplace.png","sha256":"5267be7f941e853588eee4d27b2083e20c00491a97406020dc7f7334f7619df0"},{"executable":false,"path":"scripts/packed-smoke.mjs","sha256":"ceb8bbf9933c9e35494b8d91f263d95c31324cc48cc5540f7aa4933cdc254697"},{"executable":true,"path":"server.js","sha256":"fc44c043db21f29c743fd074417dc8c357bb0f7491a469b05ae6a37da2dc2ba0"},{"executable":false,"path":"src/commands/plugin-library.md","sha256":"177c6216fa3e7bebd59e0d4900666a4b1ed204a04c8da037a52bd80bfdaf8070"},{"executable":false,"path":"src/install-bin.ts","sha256":"766ae5ecdc1331397de9cf32922048d6d9386e270c7e283284a2f95c6953b499"},{"executable":false,"path":"src/skills/plugin-library/SKILL.md","sha256":"4389f72f63fcadd4db16db952f02034b04a4dca2758dde5db3cb5df31bc2a0d9"},{"executable":false,"path":"test/browser.test.js","sha256":"6c12d42fdb74239c5cc82efc58c3f8602b936c189e7c5d1990bf5b8413cf3ab0"},{"executable":false,"path":"test/data.test.js","sha256":"5b55d8aaa67db2853c7dc7b3bb93cabfe905b83683d3c2e1d156cedcbe802f49"},{"executable":false,"path":"test/helpers.js","sha256":"c32ef9b8c5e7a8817a9a43366212febca54bbf158a14860a27958dcbf78dbdb7"},{"executable":false,"path":"test/install.test.js","sha256":"d3080b2bb3ec577d7cd6adce6f1a5912736a017ce3ded08374b8897485971d4c"},{"executable":false,"path":"test/local-plugins.test.js","sha256":"a04b94b16ebbfb7d2090d0aa3243e758460b3f78a33d3b1ed54b0cd85cb0232f"},{"executable":false,"path":"test/package.json","sha256":"8005a3491db7d92f36ac66369861589f9c47123d3a7c71e643fc2c06168cd45a"},{"executable":false,"path":"test/server.test.js","sha256":"ed64df042f57b09facbd5da93702b0c0b3b691cd478ccade6ea77fce9bdd4e10"},{"executable":false,"path":"tsconfig.json","sha256":"a6599174892162cd37b9b9a046c581b813d933eb3ad267daeeca79d0d48fa9cd"}]},"provenance":[{"path":".cursor-plugin/marketplace.json","sourceInputs":["agent-bundle.config.ts"]},{"path":".cursor-plugin/plugin.json","sourceInputs":["agent-bundle.config.ts","assets/logo.svg","package.json","src/commands/plugin-library.md","src/skills/plugin-library/SKILL.md"]},{"path":"agent-bundle.compile-evidence.json","sourceInputs":["agent-bundle.config.ts"]},{"path":"assets/assets/logo.svg","sourceInputs":["agent-bundle.config.ts","assets/logo.svg"]},{"path":"assets/data/pstack.json","sourceInputs":["data/pstack.json"]},{"path":"assets/data/unified-catalog.json","sourceInputs":["data/unified-catalog.json"]},{"path":"assets/public/app.js","sourceInputs":["public/app.js"]},{"path":"assets/public/index.html","sourceInputs":["public/index.html"]},{"path":"assets/public/markdown.js","sourceInputs":["public/markdown.js"]},{"path":"assets/public/picker.js","sourceInputs":["public/picker.js"]},{"path":"assets/public/styles.css","sourceInputs":["public/styles.css"]},{"path":"commands/plugin-library.md","sourceInputs":["src/commands/plugin-library.md"]},{"path":"INSTALL.md","sourceInputs":["agent-bundle.config.ts"]},{"path":"install.mjs","sourceInputs":["agent-bundle.config.ts"]},{"path":"plugin.json","sourceInputs":["agent-bundle.config.ts","package.json"]},{"path":"scripts/plugin-library-server.mjs","sourceInputs":["agent-bundle.config.ts","lib/bots.js","lib/local-plugins.js","server.js"]},{"path":"scripts/plugin-library.mjs","sourceInputs":["agent-bundle.config.ts","bin/plugin-library.mjs"]},{"path":"skills/plugin-library/SKILL.md","sourceInputs":["src/skills/plugin-library/SKILL.md"]}],"recordVersion":1,"validation":{"artifact":{"status":"passed"},"projections":[{"host":"cursor","status":"passed"},{"host":"portable","status":"passed"}],"source":{"status":"passed"}}},"distribution":{"channels":["local","npm"],"install":{"instructions":"INSTALL.md","script":"install.mjs"},"payloads":[]},"executables":{"bins":[],"hooks":[],"mcpServers":[],"scripts":[{"hosts":["cursor","portable"],"id":"script:plugin-library","mode":"bundle","name":"plugin-library","path":"scripts/plugin-library.mjs"},{"hosts":["cursor","portable"],"id":"script:plugin-library-server","mode":"bundle","name":"plugin-library-server","path":"scripts/plugin-library-server.mjs"}]},"files":[{"bytes":236,"kind":"generated","path":".cursor-plugin/marketplace.json","sha256":"3a7e9c80d1bfdd1a25f0642e5d845ae21e52e4082c5169adff044a9ecce43eaf"},{"bytes":418,"kind":"generated","path":".cursor-plugin/plugin.json","sha256":"5eee1c6d8e738e5246c4f673f838ebef5b45d9c620234fc7332341744d880cbf"},{"bytes":2071,"kind":"generated","path":"agent-bundle.compile-evidence.json","sha256":"b2a6f4f03de61e5e7ce68474c5b3621bcb71148a0c3fdc124113b1093781a96e"},{"bytes":519,"kind":"copy","path":"assets/assets/logo.svg","sha256":"0205c0641ea70c40f391990660f1597c40fa0b551ba35017d855593756aa3509"},{"bytes":23189,"kind":"copy","path":"assets/data/pstack.json","sha256":"006aa0f86059fe7a5cff7180cc5704b9afdfb0c372f799047d80db57a0f3ca15"},{"bytes":181719,"kind":"copy","path":"assets/data/unified-catalog.json","sha256":"0827bf86b9bbea2d4a956e5ca347fa00bee55f4a9e594648ba82f2a9dce9388d"},{"bytes":19680,"kind":"copy","path":"assets/public/app.js","sha256":"56bfd74a4e742d9fff1db1524037f6d51e74a4ce62798d9bd3ba410d0c5df824"},{"bytes":2112,"kind":"copy","path":"assets/public/index.html","sha256":"4d8629c982cedea3917b2f3484c2acf7dc62d1f6db998e478689903a0ec470d9"},{"bytes":7273,"kind":"copy","path":"assets/public/markdown.js","sha256":"2253f5e57229badf2d62cda1a40d893a7526de74519ee1ba789761d83bc08afb"},{"bytes":8090,"kind":"copy","path":"assets/public/picker.js","sha256":"7afa3bc1ebdbcdce7c59b8f2a7a15eee936af81eb57476077295c787608a175a"},{"bytes":18065,"kind":"copy","path":"assets/public/styles.css","sha256":"de7576607e641abab0233887a1a47c0dce839b5e9d6b7668d918e156bf81e2e9"},{"bytes":953,"kind":"generated","path":"commands/plugin-library.md","sha256":"177c6216fa3e7bebd59e0d4900666a4b1ed204a04c8da037a52bd80bfdaf8070"},{"bytes":16262,"kind":"generated","path":"INSTALL.md","sha256":"374d5e08904fe4375f48ab50bcc0f0b4817fb4275722d9d8b9590774dcc93b5b"},{"bytes":78569,"kind":"generated","path":"install.mjs","sha256":"9e9812bb24b4cbb08a24cdc5c27d1d45e64e4b2afef22e95eb464c5bc8ca1550"},{"bytes":378,"kind":"generated","path":"plugin.json","sha256":"c3d9e182728a589ac3679fc176f0fe0d90c0a9f4fba0857e388fab7d82aba680"},{"bytes":31525,"kind":"bundle","mode":493,"path":"scripts/plugin-library-server.mjs","sha256":"6b2c7548077aad7a68b0dd2716c833eb3597b91cc25f0dd6c24e1cd464326411"},{"bytes":12515,"kind":"bundle","path":"scripts/plugin-library.mjs","sha256":"c295407765af2e4afb8d97bbf6b794191558139b24bcbb4ca950a204f00fd464"},{"bytes":1289,"kind":"copy","path":"skills/plugin-library/SKILL.md","sha256":"4389f72f63fcadd4db16db952f02034b04a4dca2758dde5db3cb5df31bc2a0d9"}],"manifestVersion":6,"projections":[{"builtInHost":"cursor","documents":{"marketplace":".cursor-plugin/marketplace.json","plugin":".cursor-plugin/plugin.json"},"host":"cursor","marketplace":{"name":"plugin-library-marketplace"}},{"builtInHost":"portable","documents":{"plugin":"plugin.json"},"host":"portable"}],"routes":{"digest":"d3f44eea2211698634fb9e2fc28997db775625774579eb44460cca873ce5c683","events":[],"layouts":[],"providers":[],"scripts":[],"servers":[]},"runtime":{"node":"22.19.0"}} +{"application":{"description":"Browse installed and marketplace plugins, read every skill in full, and hand one to a Grok Bot.","id":"plugin:plugin-library","name":"plugin-library","version":"0.4.0"},"compiler":{"adapters":[{"adapterRevision":"1.13.0","host":"cursor","observedVersion":"2026-08-28","schemas":[{"name":"hooks","revision":"2026-08-28","sha256":"06154b7afa0861df462130b988912b897e7ccf962b8dd20c09193100bcde5d81"},{"name":"marketplace","revision":"2026-08-28","sha256":"1aae96a24c2796419933bc8bfe3a1255394e7199c35740b36325e0ce6dbc253d"},{"name":"mcp","revision":"2026-08-28","sha256":"f3fa4615afefe004c4fbcc09e635d890df0f1ec0cb39540feab72cbd3a31d844"},{"name":"plugin","revision":"2026-08-28","sha256":"a393b758901803fcf5cfe0d77bda8a83e987d32c3377dfce2d9edf445af884ed"}]},{"adapterRevision":"1.10.0","host":"portable","observedVersion":"1.0.0","schemas":[{"name":"mcp","revision":"1.0.0","sha256":"6539175bfcdf43085855183e86da40ea94b166547a72b47ae9a0a390516d3acb"},{"name":"plugin","revision":"1.0.0","sha256":"0a4aad95ce337878ad38802ebf0daa3fde76abe3f65400c86bcbb1ec0b3ab883"}]}],"agentSkills":{"schemaSha256":"6d06b61e423317421de2295ea1fd0c7b4491bfa36c5b7705c28616dfe76d4047","sourceRevision":"69ef37e9424c0a7ea9dd2293b559e43ec8176379","specification":"https://raw.githubusercontent.com/agentskills/agentskills/69ef37e9424c0a7ea9dd2293b559e43ec8176379/docs/specification.mdx"},"producer":{"name":"agent-bundle","version":"0.3.0"},"project":{"configDigest":"997aa2bc59ed04425989000405a9e581c4c0050af6d5c2a203768cd461e0d5e0","configPath":"agent-bundle.config.ts","modelDigest":"b75646832d20093ae654b6cb46c734b224d14de9080a2197eceeea65566b9ba0","packageName":"plugin-library","packageVersion":"0.4.0","revision":"607e303a08f64122d70db386e90c4e216b776471cb224168eb542cd652adf557","sourceInputs":[{"executable":false,"path":".github/workflows/ci.yml","sha256":"3c51f0bdc639d14d698407abbd7e8a23f6f7330e521b6a78f67e018d72b1a045"},{"executable":false,"path":".github/workflows/publish-agent-bundle.yml","sha256":"cb7c591b7b73dc5762bf4e1cc1e1ac375799de4f931a18afe561341ffb66cbb6"},{"executable":false,"path":".gitignore","sha256":"fc7f785227a74db0c56704f6f615d1c2ec716afe1d9df25b74449367f28955c2"},{"executable":false,"path":"agent-bundle.config.ts","sha256":"997aa2bc59ed04425989000405a9e581c4c0050af6d5c2a203768cd461e0d5e0"},{"executable":false,"path":"assets/logo.svg","sha256":"0205c0641ea70c40f391990660f1597c40fa0b551ba35017d855593756aa3509"},{"executable":true,"path":"bin/plugin-library.mjs","sha256":"0c174e75dadbed3c17f19651f7b764fcd080b83d2ada35523fd51fadd82aef2f"},{"executable":false,"path":"data/pstack.json","sha256":"006aa0f86059fe7a5cff7180cc5704b9afdfb0c372f799047d80db57a0f3ca15"},{"executable":false,"path":"data/unified-catalog.json","sha256":"0827bf86b9bbea2d4a956e5ca347fa00bee55f4a9e594648ba82f2a9dce9388d"},{"executable":false,"path":"lib/bots.js","sha256":"fb697ad2b8b86f50716c310e74765bbcbdf54a65b48a65e9372c8a597e772be3"},{"executable":false,"path":"lib/local-plugins.js","sha256":"32d134641d78a888fa7e0e2e3f11ebad8d1e300eb2807ac5a93c559644612adb"},{"executable":false,"path":"lib/package.json","sha256":"8005a3491db7d92f36ac66369861589f9c47123d3a7c71e643fc2c06168cd45a"},{"executable":false,"path":"LICENSE","sha256":"ff28847df30260ae031d33a736f0e72210a539b1417570bac88a59016157544c"},{"executable":false,"path":"logs/.gitkeep","sha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"},{"executable":false,"path":"package-lock.json","sha256":"54cd605bca601a4e910c32a702fb60e99ad6b4b59c66cf17c8ddbda3cabc9692"},{"executable":false,"path":"package.json","sha256":"20eb006b7e2daa96f38105cbfe9a1644c1da1c3259b6f162fd8ccb32a807ea25"},{"executable":false,"path":"public/app.js","sha256":"56bfd74a4e742d9fff1db1524037f6d51e74a4ce62798d9bd3ba410d0c5df824"},{"executable":false,"path":"public/index.html","sha256":"4d8629c982cedea3917b2f3484c2acf7dc62d1f6db998e478689903a0ec470d9"},{"executable":false,"path":"public/markdown.js","sha256":"2253f5e57229badf2d62cda1a40d893a7526de74519ee1ba789761d83bc08afb"},{"executable":false,"path":"public/picker.js","sha256":"7afa3bc1ebdbcdce7c59b8f2a7a15eee936af81eb57476077295c787608a175a"},{"executable":false,"path":"public/styles.css","sha256":"de7576607e641abab0233887a1a47c0dce839b5e9d6b7668d918e156bf81e2e9"},{"executable":false,"path":"README.md","sha256":"6b5162bcd4594a518c4b9fb6184ed12dcfee4a9c44b334f99993d7131b5a0b45"},{"executable":false,"path":"renovate.json","sha256":"e80b4e42a3043bc12fa0640db4bac392d2bf770acf841360d7c8ceeeac2ec1a9"},{"executable":false,"path":"screens/01-library.png","sha256":"f465bcecd299c9413975baa307dd87dc6b8cacbd0498134118df5bac2ef391a5"},{"executable":false,"path":"screens/02-pstack.png","sha256":"8fc2ed63fae8e7dac833ecea75d64ddcad9c3b6a49382e66132c13876b322c41"},{"executable":false,"path":"screens/03-read-skill.png","sha256":"afee8387371e444a6b0c997b45b576c4c6c7e527fca753338583c6e3ce68ddd2"},{"executable":false,"path":"screens/04-reference-tab.png","sha256":"b55ac9ce9e2cd1918e1b8f48a9ed2292b8f50872a2ffb2ce5c70b665c299eaae"},{"executable":false,"path":"screens/05-pick-a-bot.png","sha256":"03a7823afcd85dc6489bd2cb3b572b499cf8999e16e7a2436e1069ca2913607b"},{"executable":false,"path":"screens/06-confirm.png","sha256":"3333936a6af257344f1d3375a7b3dc14b53c1a10012c1340154c810b00c745a3"},{"executable":false,"path":"screens/07-cursor-team-kit.png","sha256":"fa8a42a120d33bfb32a8c7299180eba1dd61d4550228c05aea9038aa59bd3671"},{"executable":false,"path":"screens/08-marketplace.png","sha256":"5267be7f941e853588eee4d27b2083e20c00491a97406020dc7f7334f7619df0"},{"executable":false,"path":"scripts/packed-smoke.mjs","sha256":"ceb8bbf9933c9e35494b8d91f263d95c31324cc48cc5540f7aa4933cdc254697"},{"executable":true,"path":"server.js","sha256":"fc44c043db21f29c743fd074417dc8c357bb0f7491a469b05ae6a37da2dc2ba0"},{"executable":false,"path":"src/commands/plugin-library.md","sha256":"177c6216fa3e7bebd59e0d4900666a4b1ed204a04c8da037a52bd80bfdaf8070"},{"executable":false,"path":"src/install-bin.ts","sha256":"766ae5ecdc1331397de9cf32922048d6d9386e270c7e283284a2f95c6953b499"},{"executable":false,"path":"src/skills/plugin-library/SKILL.md","sha256":"4389f72f63fcadd4db16db952f02034b04a4dca2758dde5db3cb5df31bc2a0d9"},{"executable":false,"path":"test/browser.test.js","sha256":"6c12d42fdb74239c5cc82efc58c3f8602b936c189e7c5d1990bf5b8413cf3ab0"},{"executable":false,"path":"test/data.test.js","sha256":"5b55d8aaa67db2853c7dc7b3bb93cabfe905b83683d3c2e1d156cedcbe802f49"},{"executable":false,"path":"test/helpers.js","sha256":"c32ef9b8c5e7a8817a9a43366212febca54bbf158a14860a27958dcbf78dbdb7"},{"executable":false,"path":"test/install.test.js","sha256":"d3080b2bb3ec577d7cd6adce6f1a5912736a017ce3ded08374b8897485971d4c"},{"executable":false,"path":"test/local-plugins.test.js","sha256":"a04b94b16ebbfb7d2090d0aa3243e758460b3f78a33d3b1ed54b0cd85cb0232f"},{"executable":false,"path":"test/package.json","sha256":"8005a3491db7d92f36ac66369861589f9c47123d3a7c71e643fc2c06168cd45a"},{"executable":false,"path":"test/server.test.js","sha256":"ed64df042f57b09facbd5da93702b0c0b3b691cd478ccade6ea77fce9bdd4e10"},{"executable":false,"path":"tsconfig.json","sha256":"a6599174892162cd37b9b9a046c581b813d933eb3ad267daeeca79d0d48fa9cd"}]},"provenance":[{"path":".cursor-plugin/marketplace.json","sourceInputs":["agent-bundle.config.ts"]},{"path":".cursor-plugin/plugin.json","sourceInputs":["agent-bundle.config.ts","assets/logo.svg","package.json","src/commands/plugin-library.md","src/skills/plugin-library/SKILL.md"]},{"path":"agent-bundle.compile-evidence.json","sourceInputs":["agent-bundle.config.ts"]},{"path":"assets/assets/logo.svg","sourceInputs":["agent-bundle.config.ts","assets/logo.svg"]},{"path":"assets/data/pstack.json","sourceInputs":["data/pstack.json"]},{"path":"assets/data/unified-catalog.json","sourceInputs":["data/unified-catalog.json"]},{"path":"assets/public/app.js","sourceInputs":["public/app.js"]},{"path":"assets/public/index.html","sourceInputs":["public/index.html"]},{"path":"assets/public/markdown.js","sourceInputs":["public/markdown.js"]},{"path":"assets/public/picker.js","sourceInputs":["public/picker.js"]},{"path":"assets/public/styles.css","sourceInputs":["public/styles.css"]},{"path":"commands/plugin-library.md","sourceInputs":["src/commands/plugin-library.md"]},{"path":"INSTALL.md","sourceInputs":["agent-bundle.config.ts"]},{"path":"install.mjs","sourceInputs":["agent-bundle.config.ts"]},{"path":"plugin.json","sourceInputs":["agent-bundle.config.ts","package.json"]},{"path":"scripts/plugin-library-server.mjs","sourceInputs":["agent-bundle.config.ts","lib/bots.js","lib/local-plugins.js","server.js"]},{"path":"scripts/plugin-library.mjs","sourceInputs":["agent-bundle.config.ts","bin/plugin-library.mjs"]},{"path":"skills/plugin-library/SKILL.md","sourceInputs":["src/skills/plugin-library/SKILL.md"]}],"recordVersion":1,"validation":{"artifact":{"status":"passed"},"projections":[{"host":"cursor","status":"passed"},{"host":"portable","status":"passed"}],"source":{"status":"passed"}}},"distribution":{"channels":["local","npm"],"install":{"instructions":"INSTALL.md","script":"install.mjs"},"payloads":[]},"executables":{"bins":[],"hooks":[],"mcpServers":[],"scripts":[{"hosts":["cursor","portable"],"id":"script:plugin-library","mode":"bundle","name":"plugin-library","path":"scripts/plugin-library.mjs"},{"hosts":["cursor","portable"],"id":"script:plugin-library-server","mode":"bundle","name":"plugin-library-server","path":"scripts/plugin-library-server.mjs"}]},"files":[{"bytes":236,"kind":"generated","path":".cursor-plugin/marketplace.json","sha256":"3a7e9c80d1bfdd1a25f0642e5d845ae21e52e4082c5169adff044a9ecce43eaf"},{"bytes":418,"kind":"generated","path":".cursor-plugin/plugin.json","sha256":"5eee1c6d8e738e5246c4f673f838ebef5b45d9c620234fc7332341744d880cbf"},{"bytes":2071,"kind":"generated","path":"agent-bundle.compile-evidence.json","sha256":"5bceda07634950cb6cf813c1b9e7df79aef67ead2964664306b4d9f6da7bb018"},{"bytes":519,"kind":"copy","path":"assets/assets/logo.svg","sha256":"0205c0641ea70c40f391990660f1597c40fa0b551ba35017d855593756aa3509"},{"bytes":23189,"kind":"copy","path":"assets/data/pstack.json","sha256":"006aa0f86059fe7a5cff7180cc5704b9afdfb0c372f799047d80db57a0f3ca15"},{"bytes":181719,"kind":"copy","path":"assets/data/unified-catalog.json","sha256":"0827bf86b9bbea2d4a956e5ca347fa00bee55f4a9e594648ba82f2a9dce9388d"},{"bytes":19680,"kind":"copy","path":"assets/public/app.js","sha256":"56bfd74a4e742d9fff1db1524037f6d51e74a4ce62798d9bd3ba410d0c5df824"},{"bytes":2112,"kind":"copy","path":"assets/public/index.html","sha256":"4d8629c982cedea3917b2f3484c2acf7dc62d1f6db998e478689903a0ec470d9"},{"bytes":7273,"kind":"copy","path":"assets/public/markdown.js","sha256":"2253f5e57229badf2d62cda1a40d893a7526de74519ee1ba789761d83bc08afb"},{"bytes":8090,"kind":"copy","path":"assets/public/picker.js","sha256":"7afa3bc1ebdbcdce7c59b8f2a7a15eee936af81eb57476077295c787608a175a"},{"bytes":18065,"kind":"copy","path":"assets/public/styles.css","sha256":"de7576607e641abab0233887a1a47c0dce839b5e9d6b7668d918e156bf81e2e9"},{"bytes":953,"kind":"generated","path":"commands/plugin-library.md","sha256":"177c6216fa3e7bebd59e0d4900666a4b1ed204a04c8da037a52bd80bfdaf8070"},{"bytes":16262,"kind":"generated","path":"INSTALL.md","sha256":"374d5e08904fe4375f48ab50bcc0f0b4817fb4275722d9d8b9590774dcc93b5b"},{"bytes":78569,"kind":"generated","path":"install.mjs","sha256":"9e9812bb24b4cbb08a24cdc5c27d1d45e64e4b2afef22e95eb464c5bc8ca1550"},{"bytes":378,"kind":"generated","path":"plugin.json","sha256":"c3d9e182728a589ac3679fc176f0fe0d90c0a9f4fba0857e388fab7d82aba680"},{"bytes":31879,"kind":"bundle","mode":493,"path":"scripts/plugin-library-server.mjs","sha256":"6a7f62055b6225186abb1fc241024d76bb72d42cad31ffe02f8915c176f445f8"},{"bytes":16043,"kind":"bundle","path":"scripts/plugin-library.mjs","sha256":"453195c993d88a42fb41b6708d58eec58a2f69dce08b884beb44c6cce2fe3a8c"},{"bytes":1289,"kind":"copy","path":"skills/plugin-library/SKILL.md","sha256":"4389f72f63fcadd4db16db952f02034b04a4dca2758dde5db3cb5df31bc2a0d9"}],"manifestVersion":6,"projections":[{"builtInHost":"cursor","documents":{"marketplace":".cursor-plugin/marketplace.json","plugin":".cursor-plugin/plugin.json"},"host":"cursor","marketplace":{"name":"plugin-library-marketplace"}},{"builtInHost":"portable","documents":{"plugin":"plugin.json"},"host":"portable"}],"routes":{"digest":"d3f44eea2211698634fb9e2fc28997db775625774579eb44460cca873ce5c683","events":[],"layouts":[],"providers":[],"scripts":[],"servers":[]},"runtime":{"node":"22.19.0"}} diff --git a/artifact/scripts/plugin-library-server.mjs b/artifact/scripts/plugin-library-server.mjs index a758969..d90bc13 100755 --- a/artifact/scripts/plugin-library-server.mjs +++ b/artifact/scripts/plugin-library-server.mjs @@ -5,565 +5,500 @@ import * as __rspack_external_node_path_806ed179 from "node:path"; import * as __rspack_external_node_url_3991086a from "node:url"; import { createRequire as __rspack_createRequire } from "node:module"; const __rspack_createRequire_require = __rspack_createRequire(import.meta.url); -var __webpack_modules__ = ({ -"node:fs"(module) { - -module.exports = __rspack_external_node_fs_1b05aee1; - - -}, -"node:http"(module) { - -module.exports = __rspack_external_node_http_e245b239; - - -}, -"node:path"(module) { - -module.exports = __rspack_external_node_path_806ed179; - - -}, -"node:url"(module) { - -module.exports = __rspack_external_node_url_3991086a; - - -}, -"child_process"(module) { -module.exports = __rspack_createRequire_require("child_process"); - -}, -"fs"(module) { -module.exports = __rspack_createRequire_require("fs"); - -}, -"os"(module) { -module.exports = __rspack_createRequire_require("os"); - -}, -"path"(module) { -module.exports = __rspack_createRequire_require("path"); - -}, -"./lib/bots.js"(module, __unused_rspack_exports, __webpack_require__) { - -const { execFile } = __webpack_require__("child_process"); -const GBOT_BIN = process.env.GBOT_BIN || "gbot"; -const TTL_MS = 20000; -let cache = { - at: 0, - value: null -}; -let inflight = null; -function runGbot(args) { - return new Promise((resolve, reject)=>{ - execFile(GBOT_BIN, [ - ...args, - "--json" - ], { - timeout: 15000, - maxBuffer: 8 * 1024 * 1024 - }, (err, stdout, stderr)=>{ - if (err) { - const e = new Error(err.code === "ENOENT" ? `\`${GBOT_BIN}\` not found on PATH` : String(stderr || stdout || err.message).trim()); - e.code = err.code; - return reject(e); - } +var __webpack_modules__ = { + "node:fs" (module) { + module.exports = __rspack_external_node_fs_1b05aee1; + }, + "node:http" (module) { + module.exports = __rspack_external_node_http_e245b239; + }, + "node:path" (module) { + module.exports = __rspack_external_node_path_806ed179; + }, + "node:url" (module) { + module.exports = __rspack_external_node_url_3991086a; + }, + "child_process" (module) { + module.exports = __rspack_createRequire_require("child_process"); + }, + "fs" (module) { + module.exports = __rspack_createRequire_require("fs"); + }, + "os" (module) { + module.exports = __rspack_createRequire_require("os"); + }, + "path" (module) { + module.exports = __rspack_createRequire_require("path"); + }, + "./lib/bots.js" (module, __unused_rspack_exports, __webpack_require__) { + const { execFile } = __webpack_require__("child_process"); + const GBOT_BIN = process.env.GBOT_BIN || "gbot"; + const TTL_MS = 20000; + let cache = { + at: 0, + value: null + }; + let inflight = null; + function runGbot(args) { + return new Promise((resolve, reject)=>{ + execFile(GBOT_BIN, [ + ...args, + "--json" + ], { + timeout: 15000, + maxBuffer: 8 * 1024 * 1024 + }, (err, stdout, stderr)=>{ + if (err) { + const e = new Error(err.code === "ENOENT" ? `\`${GBOT_BIN}\` not found on PATH` : String(stderr || stdout || err.message).trim()); + e.code = err.code; + return reject(e); + } + try { + resolve(JSON.parse(stdout)); + } catch (parseErr) { + reject(new Error(`gbot ${args.join(" ")}: bad JSON (${parseErr.message})`)); + } + }); + }); + } + async function sendToBot(target, message) { + const result = await runGbot([ + "send", + target, + message + ]); + if (!result || typeof result !== "object") throw new Error("gbot send: expected an object"); + return result; + } + function shapeList(list, what) { + if (!Array.isArray(list)) throw new Error(`gbot ${what} list: expected an array`); + return list.map((b)=>{ + if (!b || typeof b.id !== "string" || typeof b.name !== "string") { + throw new Error(`gbot ${what} list: entry without string id/name`); + } + return shapeBot(b); + }); + } + function shapeBot(b) { + return { + id: b.id, + name: b.name, + kind: b.kind || "bot", + description: b.description || "", + avatarColor: b.avatarColor || null, + avatarShape: b.avatarShape || null, + members: Array.isArray(b.members) ? b.members : undefined + }; + } + async function listBots({ force = false } = {}) { + if (!force && cache.value && Date.now() - cache.at < TTL_MS) return cache.value; + if (inflight) return inflight; + inflight = (async ()=>{ + const [bots, groups] = await Promise.all([ + runGbot([ + "bots", + "list" + ]), + runGbot([ + "groups", + "list" + ]) + ]); + const value = { + ok: true, + fetchedAt: new Date().toISOString(), + bots: shapeList(bots, "bots"), + groups: shapeList(groups, "groups") + }; + cache = { + at: Date.now(), + value + }; + return value; + })(); try { - resolve(JSON.parse(stdout)); - } catch (parseErr) { - reject(new Error(`gbot ${args.join(" ")}: bad JSON (${parseErr.message})`)); + return await inflight; + } finally{ + inflight = null; } - }); - }); -} -/** Send one confirmed instruction directly through gbot. */ async function sendToBot(target, message) { - const result = await runGbot([ - "send", - target, - message - ]); - if (!result || typeof result !== "object") throw new Error("gbot send: expected an object"); - return result; -} -/** Boundary check on gbot output: a shape change surfaces as a 502, not an empty roster. */ function shapeList(list, what) { - if (!Array.isArray(list)) throw new Error(`gbot ${what} list: expected an array`); - return list.map((b)=>{ - if (!b || typeof b.id !== "string" || typeof b.name !== "string") { - throw new Error(`gbot ${what} list: entry without string id/name`); } - return shapeBot(b); - }); -} -function shapeBot(b) { - return { - id: b.id, - name: b.name, - kind: b.kind || "bot", - description: b.description || "", - avatarColor: b.avatarColor || null, - avatarShape: b.avatarShape || null, - members: Array.isArray(b.members) ? b.members : undefined - }; -} -/** Bots and groups from `gbot`, cached briefly and de-duplicated across callers. */ async function listBots({ force = false } = {}) { - if (!force && cache.value && Date.now() - cache.at < TTL_MS) return cache.value; - if (inflight) return inflight; - inflight = (async ()=>{ - const [bots, groups] = await Promise.all([ - runGbot([ - "bots", - "list" - ]), - runGbot([ - "groups", - "list" - ]) - ]); - const value = { - ok: true, - fetchedAt: new Date().toISOString(), - bots: shapeList(bots, "bots"), - groups: shapeList(groups, "groups") + module.exports = { + listBots, + sendToBot }; - cache = { - at: Date.now(), - value + }, + "./lib/local-plugins.js" (module, __unused_rspack_exports, __webpack_require__) { + const fs = __webpack_require__("fs"); + const os = __webpack_require__("os"); + const path = __webpack_require__("path"); + const CACHE_ROOT = process.env.CURSOR_PLUGIN_CACHE || path.join(os.homedir(), ".cursor", "plugins", "cache"); + const LOCAL_ROOT = process.env.CURSOR_PLUGIN_LOCAL || path.join(os.homedir(), ".cursor", "plugins", "local"); + const LOCAL_MARKETPLACE = "local"; + const INDEX_TTL_MS = 15000; + let cached = { + at: 0, + plugins: [] }; - return value; - })(); - try { - return await inflight; - } finally{ - inflight = null; - } -} -module.exports = { - listBots, - sendToBot -}; - - -}, -"./lib/local-plugins.js"(module, __unused_rspack_exports, __webpack_require__) { - -const fs = __webpack_require__("fs"); -const os = __webpack_require__("os"); -const path = __webpack_require__("path"); -// Marketplace installs land in cache////; -// hand-installed plugins sit directly in local//. Env overrides exist -// for tests and for hosts that keep the plugin directory elsewhere. -const CACHE_ROOT = process.env.CURSOR_PLUGIN_CACHE || path.join(os.homedir(), ".cursor", "plugins", "cache"); -const LOCAL_ROOT = process.env.CURSOR_PLUGIN_LOCAL || path.join(os.homedir(), ".cursor", "plugins", "local"); -const LOCAL_MARKETPLACE = "local"; -const INDEX_TTL_MS = 15000; -let cached = { - at: 0, - plugins: [] -}; -function listDirs(dir) { - try { - return fs.readdirSync(dir, { - withFileTypes: true - }).filter((d)=>d.isDirectory()).map((d)=>d.name); - } catch { - return []; - } -} -function readText(file) { - try { - return fs.readFileSync(file, "utf8"); - } catch { - return null; - } -} -function readJsonFile(file) { - const raw = readText(file); - if (raw == null) return null; - try { - return JSON.parse(raw); - } catch { - return null; - } -} -function mtimeOf(file) { - try { - return fs.statSync(file).mtimeMs; - } catch { - return 0; - } -} -function unquote(v) { - if (v.startsWith('"') && v.endsWith('"') && v.length >= 2) { - return v.slice(1, -1).replace(/\\(["\\])/g, "$1"); - } - if (v.startsWith("'") && v.endsWith("'") && v.length >= 2) { - return v.slice(1, -1).replace(/''/g, "'"); - } - if (v === "true") return true; - if (v === "false") return false; - return v; -} -/** - * YAML front matter as skills actually write it: `key: scalar`, quoted - * scalars, and `>`/`|` block scalars (folded / literal, with `-`/`+` chomping). - * Nested maps and sequences are not needed by any cached plugin and are skipped. - */ function parseFrontMatter(md) { - const m = /^---\r?\n([\s\S]*?)\r?\n---\r?\n?/.exec(md); - if (!m) return { - meta: {}, - body: md - }; - const lines = m[1].split(/\r?\n/); - const meta = {}; - for(let i = 0; i < lines.length; i++){ - const kv = /^([A-Za-z0-9_-]+):\s*(.*)$/.exec(lines[i]); - if (!kv) continue; - const value = kv[2].trim(); - const nextIndented = i + 1 < lines.length && /^\s+\S/.test(lines[i + 1]); - const block = /^([>|])[+-]?$/.exec(value); - if (!block) { - if (value === "" && nextIndented) { - // Nested map or sequence: not needed by the UI, skip its body. - while(i + 1 < lines.length && (/^\s+/.test(lines[i + 1]) || lines[i + 1].trim() === ""))i++; - continue; + function listDirs(dir) { + try { + return fs.readdirSync(dir, { + withFileTypes: true + }).filter((d)=>d.isDirectory()).map((d)=>d.name); + } catch { + return []; } - if (value !== "") meta[kv[1]] = unquote(value); - continue; } - const buf = []; - while(i + 1 < lines.length && (/^\s+\S/.test(lines[i + 1]) || lines[i + 1].trim() === "")){ - buf.push(lines[++i].replace(/^\s+/, "")); + function readText(file) { + try { + return fs.readFileSync(file, "utf8"); + } catch { + return null; + } } - while(buf.length && buf[buf.length - 1] === "")buf.pop(); - meta[kv[1]] = block[1] === ">" ? buf.join(" ").replace(/\s+/g, " ").trim() : buf.join("\n"); - } - return { - meta, - body: md.slice(m[0].length) - }; -} -function firstHeading(body) { - const h = /^#\s+(.+)$/m.exec(body); - return h ? h[1].trim() : null; -} -function firstParagraph(body) { - const buf = []; - for (const line of body.split(/\r?\n/)){ - const t = line.trim(); - if (!t || /^#/.test(t) || /^---/.test(t)) { - if (buf.length) break; - continue; - } - buf.push(t); - } - return buf.join(" "); -} -function walkFiles(dir, prefix = "") { - const out = []; - let entries = []; - try { - entries = fs.readdirSync(dir, { - withFileTypes: true - }); - } catch { - return out; - } - for (const e of entries){ - if (e.name.startsWith(".") || e.name === "node_modules") continue; - const rel = prefix ? `${prefix}/${e.name}` : e.name; - if (e.isDirectory()) out.push(...walkFiles(path.join(dir, e.name), rel)); - else out.push(rel); - } - return out; -} -/** Shared shape for skills, agents and rules: a markdown doc with a summary. */ function readDoc(root, file, id) { - const raw = readText(path.join(root, file)); - if (raw == null) return null; - const { meta, body } = parseFrontMatter(raw); - return { - id, - name: typeof meta.name === "string" && meta.name ? meta.name : firstHeading(body) || id, - description: typeof meta.description === "string" ? meta.description : firstParagraph(body), - file, - bytes: Buffer.byteLength(raw, "utf8"), - alwaysApply: meta.alwaysApply === true - }; -} -function readSkills(root) { - const skillsDir = path.join(root, "skills"); - return listDirs(skillsDir).map((id)=>{ - const doc = readDoc(root, `skills/${id}/SKILL.md`, id); - if (!doc) return null; - const files = walkFiles(path.join(skillsDir, id)).filter((f)=>f !== "SKILL.md").sort(); - return { - ...doc, - files - }; - }).filter(Boolean).sort((a, b)=>a.id.localeCompare(b.id)); -} -function readDocsIn(root, sub, ext) { - const dir = path.join(root, sub); - return walkFiles(dir).filter((f)=>ext.test(f)).map((f)=>readDoc(root, `${sub}/${f}`, f.replace(ext, ""))).filter(Boolean); -} -function httpUrl(v) { - return typeof v === "string" && /^https?:\/\//i.test(v) ? v : null; -} -function normalizeName(s) { - return String(s || "").toLowerCase().replace(/[^a-z0-9]+/g, ""); -} -function readManifest(root) { - return readJsonFile(path.join(root, ".cursor-plugin", "plugin.json")) || readJsonFile(path.join(root, "plugin.json")) || {}; -} -/** One plugin directory, before any file inside it has been read. */ function candidate({ marketplace, slug, version, root, installedMarker }) { - const manifest = readManifest(root); - return { - key: `${marketplace}/${slug}`, - marketplace, - slug, - version, - root, - manifest, - installedMarker, - mtime: mtimeOf(root), - packageName: manifest.name || slug, - semver: typeof manifest.version === "string" ? manifest.version : null - }; -} -function scanCache(cacheRoot) { - const out = []; - for (const marketplace of listDirs(cacheRoot)){ - for (const slug of listDirs(path.join(cacheRoot, marketplace))){ - const pluginDir = path.join(cacheRoot, marketplace, slug); - for (const version of listDirs(pluginDir).filter((v)=>!v.startsWith("."))){ - const root = path.join(pluginDir, version); - // Cursor marks the version it actually installed with a sibling `.installed`. - out.push(candidate({ - marketplace, - slug, - version, - root, - installedMarker: fs.existsSync(`${root}.installed`) + function readJsonFile(file) { + const raw = readText(file); + if (raw == null) return null; + try { + return JSON.parse(raw); + } catch { + return null; + } + } + function mtimeOf(file) { + try { + return fs.statSync(file).mtimeMs; + } catch { + return 0; + } + } + function unquote(v) { + if (v.startsWith('"') && v.endsWith('"') && v.length >= 2) { + return v.slice(1, -1).replace(/\\(["\\])/g, "$1"); + } + if (v.startsWith("'") && v.endsWith("'") && v.length >= 2) { + return v.slice(1, -1).replace(/''/g, "'"); + } + if (v === "true") return true; + if (v === "false") return false; + return v; + } + function parseFrontMatter(md) { + const m = /^---\r?\n([\s\S]*?)\r?\n---\r?\n?/.exec(md); + if (!m) return { + meta: {}, + body: md + }; + const lines = m[1].split(/\r?\n/); + const meta = {}; + for(let i = 0; i < lines.length; i++){ + const kv = /^([A-Za-z0-9_-]+):\s*(.*)$/.exec(lines[i]); + if (!kv) continue; + const value = kv[2].trim(); + const nextIndented = i + 1 < lines.length && /^\s+\S/.test(lines[i + 1]); + const block = /^([>|])[+-]?$/.exec(value); + if (!block) { + if (value === "" && nextIndented) { + while(i + 1 < lines.length && (/^\s+/.test(lines[i + 1]) || lines[i + 1].trim() === ""))i++; + continue; + } + if (value !== "") meta[kv[1]] = unquote(value); + continue; + } + const buf = []; + while(i + 1 < lines.length && (/^\s+\S/.test(lines[i + 1]) || lines[i + 1].trim() === "")){ + buf.push(lines[++i].replace(/^\s+/, "")); + } + while(buf.length && buf[buf.length - 1] === "")buf.pop(); + meta[kv[1]] = block[1] === ">" ? buf.join(" ").replace(/\s+/g, " ").trim() : buf.join("\n"); + } + return { + meta, + body: md.slice(m[0].length) + }; + } + function firstHeading(body) { + const h = /^#\s+(.+)$/m.exec(body); + return h ? h[1].trim() : null; + } + function firstParagraph(body) { + const buf = []; + for (const line of body.split(/\r?\n/)){ + const t = line.trim(); + if (!t || /^#/.test(t) || /^---/.test(t)) { + if (buf.length) break; + continue; + } + buf.push(t); + } + return buf.join(" "); + } + function walkFiles(dir, prefix = "") { + const out = []; + let entries = []; + try { + entries = fs.readdirSync(dir, { + withFileTypes: true + }); + } catch { + return out; + } + for (const e of entries){ + if (e.name.startsWith(".") || e.name === "node_modules") continue; + const rel = prefix ? `${prefix}/${e.name}` : e.name; + if (e.isDirectory()) out.push(...walkFiles(path.join(dir, e.name), rel)); + else out.push(rel); + } + return out; + } + function readDoc(root, file, id) { + const raw = readText(path.join(root, file)); + if (raw == null) return null; + const { meta, body } = parseFrontMatter(raw); + return { + id, + name: typeof meta.name === "string" && meta.name ? meta.name : firstHeading(body) || id, + description: typeof meta.description === "string" ? meta.description : firstParagraph(body), + file, + bytes: Buffer.byteLength(raw, "utf8"), + alwaysApply: meta.alwaysApply === true + }; + } + function readSkills(root) { + const skillsDir = path.join(root, "skills"); + return listDirs(skillsDir).map((id)=>{ + const doc = readDoc(root, `skills/${id}/SKILL.md`, id); + if (!doc) return null; + const files = walkFiles(path.join(skillsDir, id)).filter((f)=>f !== "SKILL.md").sort(); + return { + ...doc, + files + }; + }).filter(Boolean).sort((a, b)=>a.id.localeCompare(b.id)); + } + function readDocsIn(root, sub, ext) { + const dir = path.join(root, sub); + return walkFiles(dir).filter((f)=>ext.test(f)).map((f)=>readDoc(root, `${sub}/${f}`, f.replace(ext, ""))).filter(Boolean); + } + function httpUrl(v) { + return typeof v === "string" && /^https?:\/\//i.test(v) ? v : null; + } + function normalizeName(s) { + return String(s || "").toLowerCase().replace(/[^a-z0-9]+/g, ""); + } + function readManifest(root) { + return readJsonFile(path.join(root, ".cursor-plugin", "plugin.json")) || readJsonFile(path.join(root, "plugin.json")) || {}; + } + function candidate({ marketplace, slug, version, root, installedMarker }) { + const manifest = readManifest(root); + return { + key: `${marketplace}/${slug}`, + marketplace, + slug, + version, + root, + manifest, + installedMarker, + mtime: mtimeOf(root), + packageName: manifest.name || slug, + semver: typeof manifest.version === "string" ? manifest.version : null + }; + } + function scanCache(cacheRoot) { + const out = []; + for (const marketplace of listDirs(cacheRoot)){ + for (const slug of listDirs(path.join(cacheRoot, marketplace))){ + const pluginDir = path.join(cacheRoot, marketplace, slug); + for (const version of listDirs(pluginDir).filter((v)=>!v.startsWith("."))){ + const root = path.join(pluginDir, version); + out.push(candidate({ + marketplace, + slug, + version, + root, + installedMarker: fs.existsSync(`${root}.installed`) + })); + } + } + } + return out; + } + function scanLocal(localRoot) { + return listDirs(localRoot).filter((name)=>!name.startsWith(".")).map((name)=>candidate({ + marketplace: LOCAL_MARKETPLACE, + slug: name, + version: "local", + root: path.join(localRoot, name), + installedMarker: true })); + } + function readContents(c) { + const { manifest, root } = c; + return { + key: c.key, + aliases: c.aliases, + marketplace: c.marketplace, + slug: c.slug, + version: c.version, + root, + name: manifest.displayName || manifest.name || c.slug, + description: manifest.description || "", + author: manifest.author && manifest.author.name ? manifest.author.name : null, + homepage: httpUrl(manifest.homepage) || httpUrl(manifest.repository && manifest.repository.url) || httpUrl(manifest.repository), + semver: c.semver, + logo: manifest.logo && fs.existsSync(path.join(root, manifest.logo)) ? manifest.logo : null, + hasReadme: fs.existsSync(path.join(root, "README.md")), + hasMcp: fs.existsSync(path.join(root, "mcp.json")), + skills: readSkills(root), + agents: readDocsIn(root, "agents", /\.md$/), + rules: readDocsIn(root, "rules", /\.mdc?$/), + matchKeys: c.matchKeys + }; + } + function compareSemver(a, b) { + const pa = String(a || "").split(".").map((n)=>parseInt(n, 10) || 0); + const pb = String(b || "").split(".").map((n)=>parseInt(n, 10) || 0); + for(let i = 0; i < Math.max(pa.length, pb.length); i++){ + if ((pa[i] || 0) !== (pb[i] || 0)) return (pa[i] || 0) - (pb[i] || 0); } + return 0; } + function dedupe(candidates) { + const groups = new Map(); + for (const c of candidates){ + const identity = `${c.marketplace}/${c.packageName}`; + if (!groups.has(identity)) groups.set(identity, []); + groups.get(identity).push(c); + } + const out = []; + for (const group of groups.values()){ + group.sort((a, b)=>Number(b.installedMarker) - Number(a.installedMarker) || compareSemver(b.semver, a.semver) || b.mtime - a.mtime); + const keep = group[0]; + const humanSlug = group.find((c)=>!/^\d+$/.test(c.slug)) || keep; + const aliases = new Set(group.map((c)=>c.key)); + aliases.delete(humanSlug.key); + const names = group.flatMap((c)=>[ + normalizeName(c.manifest.displayName), + normalizeName(c.manifest.name), + normalizeName(c.slug) + ]); + out.push({ + ...keep, + key: humanSlug.key, + slug: humanSlug.slug, + aliases: [ + ...aliases + ], + matchKeys: [ + ...new Set(names.filter(Boolean)) + ] + }); + } + return out; + } + function indexLocalPlugins() { + if (Date.now() - cached.at < INDEX_TTL_MS) return cached.plugins; + const candidates = [ + ...scanCache(CACHE_ROOT), + ...scanLocal(LOCAL_ROOT) + ]; + cached = { + at: Date.now(), + plugins: dedupe(candidates).map(readContents) + }; + return cached.plugins; + } + function answersTo(p, key) { + return p.key === key || p.aliases.includes(key); + } + function findLocalPlugin(pluginId, name, cacheKey) { + const all = indexLocalPlugins(); + if (cacheKey) { + const hit = all.find((p)=>answersTo(p, cacheKey)); + if (hit) return hit; + } + const id = String(pluginId || ""); + const byId = all.find((p)=>p.slug === id || p.aliases.some((a)=>a.endsWith(`/${id}`))); + if (byId) return byId; + const norm = normalizeName(name); + if (!norm) return null; + const exact = all.filter((p)=>p.matchKeys.includes(norm)); + if (exact.length === 1) return exact[0]; + if (exact.length > 1) return null; + const loose = all.filter((p)=>p.matchKeys.some((k)=>k.length >= 6 && (norm.includes(k) || k.includes(norm)))); + return loose.length === 1 ? loose[0] : null; + } + function getLocalPlugin(key) { + return indexLocalPlugins().find((p)=>answersTo(p, key)) || null; + } + function toPublic(p) { + return { + key: p.key, + name: p.name, + description: p.description, + author: p.author, + homepage: p.homepage, + semver: p.semver, + logo: p.logo, + hasReadme: p.hasReadme, + hasMcp: p.hasMcp, + skills: p.skills, + agents: p.agents, + rules: p.rules + }; + } + function resolveInside(root, rel) { + let realRoot; + let full; + try { + realRoot = fs.realpathSync(root); + full = fs.realpathSync(path.resolve(root, rel)); + } catch { + return null; + } + if (full !== realRoot && !full.startsWith(realRoot + path.sep)) return null; + try { + return fs.statSync(full).isFile() ? full : null; + } catch { + return null; + } + } + module.exports = { + indexLocalPlugins, + dedupe, + compareSemver, + findLocalPlugin, + getLocalPlugin, + toPublic, + resolveInside, + parseFrontMatter + }; } - return out; -} -function scanLocal(localRoot) { - return listDirs(localRoot).filter((name)=>!name.startsWith(".")).map((name)=>candidate({ - marketplace: LOCAL_MARKETPLACE, - slug: name, - version: "local", - root: path.join(localRoot, name), - installedMarker: true - })); -} -function readContents(c) { - const { manifest, root } = c; - return { - key: c.key, - aliases: c.aliases, - marketplace: c.marketplace, - slug: c.slug, - version: c.version, - root, - name: manifest.displayName || manifest.name || c.slug, - description: manifest.description || "", - author: manifest.author && manifest.author.name ? manifest.author.name : null, - homepage: httpUrl(manifest.homepage) || httpUrl(manifest.repository && manifest.repository.url) || httpUrl(manifest.repository), - semver: c.semver, - logo: manifest.logo && fs.existsSync(path.join(root, manifest.logo)) ? manifest.logo : null, - hasReadme: fs.existsSync(path.join(root, "README.md")), - hasMcp: fs.existsSync(path.join(root, "mcp.json")), - skills: readSkills(root), - agents: readDocsIn(root, "agents", /\.md$/), - rules: readDocsIn(root, "rules", /\.mdc?$/), - matchKeys: c.matchKeys - }; -} -function compareSemver(a, b) { - const pa = String(a || "").split(".").map((n)=>parseInt(n, 10) || 0); - const pb = String(b || "").split(".").map((n)=>parseInt(n, 10) || 0); - for(let i = 0; i < Math.max(pa.length, pb.length); i++){ - if ((pa[i] || 0) !== (pb[i] || 0)) return (pa[i] || 0) - (pb[i] || 0); - } - return 0; -} -/** - * The cache often holds one plugin several times: under its numeric id and - * under its slug, sometimes at different versions. Serve the copy Cursor marked - * as installed; otherwise the newest. The winner answers to every directory - * name the plugin was found under. - */ function dedupe(candidates) { - const groups = new Map(); - for (const c of candidates){ - const identity = `${c.marketplace}/${c.packageName}`; - if (!groups.has(identity)) groups.set(identity, []); - groups.get(identity).push(c); - } - const out = []; - for (const group of groups.values()){ - group.sort((a, b)=>Number(b.installedMarker) - Number(a.installedMarker) || compareSemver(b.semver, a.semver) || b.mtime - a.mtime); - const keep = group[0]; - const humanSlug = group.find((c)=>!/^\d+$/.test(c.slug)) || keep; - const aliases = new Set(group.map((c)=>c.key)); - aliases.delete(humanSlug.key); - const names = group.flatMap((c)=>[ - normalizeName(c.manifest.displayName), - normalizeName(c.manifest.name), - normalizeName(c.slug) - ]); - out.push({ - ...keep, - key: humanSlug.key, - slug: humanSlug.slug, - aliases: [ - ...aliases - ], - matchKeys: [ - ...new Set(names.filter(Boolean)) - ] - }); - } - return out; -} -function indexLocalPlugins() { - if (Date.now() - cached.at < INDEX_TTL_MS) return cached.plugins; - const candidates = [ - ...scanCache(CACHE_ROOT), - ...scanLocal(LOCAL_ROOT) - ]; - cached = { - at: Date.now(), - plugins: dedupe(candidates).map(readContents) - }; - return cached.plugins; -} -function answersTo(p, key) { - return p.key === key || p.aliases.includes(key); -} -/** - * Match an installed catalog row to a cached plugin. Order of trust: an - * explicit cache key from the catalog, a directory named after the plugin id, - * an exact normalized-name hit, then a name-containment hit only when it is - * unambiguous. A wrong `null` is honest; a wrong hit would be acted on. - */ function findLocalPlugin(pluginId, name, cacheKey) { - const all = indexLocalPlugins(); - if (cacheKey) { - const hit = all.find((p)=>answersTo(p, cacheKey)); - if (hit) return hit; - } - const id = String(pluginId || ""); - const byId = all.find((p)=>p.slug === id || p.aliases.some((a)=>a.endsWith(`/${id}`))); - if (byId) return byId; - const norm = normalizeName(name); - if (!norm) return null; - const exact = all.filter((p)=>p.matchKeys.includes(norm)); - if (exact.length === 1) return exact[0]; - if (exact.length > 1) return null; - const loose = all.filter((p)=>p.matchKeys.some((k)=>k.length >= 6 && (norm.includes(k) || k.includes(norm)))); - return loose.length === 1 ? loose[0] : null; -} -function getLocalPlugin(key) { - return indexLocalPlugins().find((p)=>answersTo(p, key)) || null; -} -/** The wire shape for a cached plugin. Internal fields (root, aliases, …) stay here. */ function toPublic(p) { - return { - key: p.key, - name: p.name, - description: p.description, - author: p.author, - homepage: p.homepage, - semver: p.semver, - logo: p.logo, - hasReadme: p.hasReadme, - hasMcp: p.hasMcp, - skills: p.skills, - agents: p.agents, - rules: p.rules - }; -} -/** - * Resolve `rel` inside `root`, following symlinks, or return null if the real - * path escapes the root or is not a regular file. - */ function resolveInside(root, rel) { - let realRoot; - let full; - try { - realRoot = fs.realpathSync(root); - full = fs.realpathSync(path.resolve(root, rel)); - } catch { - return null; - } - if (full !== realRoot && !full.startsWith(realRoot + path.sep)) return null; - try { - return fs.statSync(full).isFile() ? full : null; - } catch { - return null; - } -} -module.exports = { - indexLocalPlugins, - dedupe, - compareSemver, - findLocalPlugin, - getLocalPlugin, - toPublic, - resolveInside, - parseFrontMatter }; - - -}, - -}); -// The module cache var __webpack_module_cache__ = {}; - -// The require function function __webpack_require__(moduleId) { - -// Check if module is in cache -var cachedModule = __webpack_module_cache__[moduleId]; -if (cachedModule !== undefined) { -return cachedModule.exports; -} -// Create a new module (and put it into the cache) -var module = (__webpack_module_cache__[moduleId] = { -exports: {} -}); -// Execute the module function -__webpack_modules__[moduleId](module, module.exports, __webpack_require__); - -// Return the exports of the module -return module.exports; - + var cachedModule = __webpack_module_cache__[moduleId]; + if (cachedModule !== undefined) { + return cachedModule.exports; + } + var module = __webpack_module_cache__[moduleId] = { + exports: {} + }; + __webpack_modules__[moduleId](module, module.exports, __webpack_require__); + return module.exports; } - var __webpack_exports__ = {}; -/* import */ var node_fs__rspack_import_0 = __webpack_require__("node:fs"); -/* import */ var node_http__rspack_import_1 = __webpack_require__("node:http"); -/* import */ var node_path__rspack_import_2 = __webpack_require__("node:path"); -/* import */ var node_url__rspack_import_3 = __webpack_require__("node:url"); -/* import */ var _lib_local_plugins_js__rspack_import_4 = __webpack_require__("./lib/local-plugins.js"); -/* import */ var _lib_bots_js__rspack_import_5 = __webpack_require__("./lib/bots.js"); -// - - - - - - +var node_fs__rspack_import_0 = __webpack_require__("node:fs"); +var node_http__rspack_import_1 = __webpack_require__("node:http"); +var node_path__rspack_import_2 = __webpack_require__("node:path"); +var node_url__rspack_import_3 = __webpack_require__("node:url"); +var _lib_local_plugins_js__rspack_import_4 = __webpack_require__("./lib/local-plugins.js"); +var _lib_bots_js__rspack_import_5 = __webpack_require__("./lib/bots.js"); const { findLocalPlugin, getLocalPlugin, indexLocalPlugins, toPublic, resolveInside, parseFrontMatter } = _lib_local_plugins_js__rspack_import_4; const { listBots, sendToBot } = _lib_bots_js__rspack_import_5; -const ENTRY_DIR = node_path__rspack_import_2["default"].dirname((0,node_url__rspack_import_3.fileURLToPath)(import.meta.url)); +const ENTRY_DIR = node_path__rspack_import_2["default"].dirname((0, node_url__rspack_import_3.fileURLToPath)(import.meta.url)); const ROOT = node_path__rspack_import_2["default"].basename(ENTRY_DIR) === "scripts" ? node_path__rspack_import_2["default"].resolve(ENTRY_DIR, "..") : ENTRY_DIR; const PUBLIC_DIR = node_fs__rspack_import_0["default"].existsSync(node_path__rspack_import_2["default"].join(ROOT, "public")) ? node_path__rspack_import_2["default"].join(ROOT, "public") : node_path__rspack_import_2["default"].join(ROOT, "assets", "public"); const PORT = Number(process.env.PORT || 8787); -// Loopback by default: this server shells out to gbot and serves cache files -// without auth. Set HOST=0.0.0.0 explicitly only on a network you trust. const HOST = process.env.HOST || "127.0.0.1"; const MIME = { ".html": "text/html; charset=utf-8", @@ -731,18 +666,8 @@ async function handleSend(req, res) { function oneLine(s) { return String(s || "").split(/\n/)[0].trim(); } -/** - * Plugins present on this machine but absent from the catalog get their cache - * key as id (`local:gbot`, `cursor-public:foo`). Catalog ids are numeric, so - * the colon marks a synthetic id unambiguously and keeps the hash route intact. - */ const syntheticId = (p)=>`${p.marketplace}:${p.slug}`; -/** - * The browse model, joined once here. "Installed" means present in this - * machine's plugin cache or local plugin directory; the catalog supplies - * marketplace copy, category and ids, and the Catalog's pstack dump supplies - * skill grouping. Catalog rows that name their cache directory are matched - * first so a looser name match can't claim a plugin another row owns. - */ function buildLibrary() { +const syntheticId = (p)=>`${p.marketplace}:${p.slug}`; +function buildLibrary() { const catalog = (readJson("data/unified-catalog.json").plugins || []).filter((p)=>p.stableId != null); const cacheHint = (p)=>p.cache && p.cache.slug ? `${p.cache.marketplace}/${p.cache.slug}` : undefined; const ordered = [ @@ -768,8 +693,6 @@ function oneLine(s) { local: local ? toPublic(local) : null }); } - // A directory named after a catalog id whose row already claimed its slug - // twin is the same plugin cached twice, not a second install. const catalogIds = new Set(catalog.map((p)=>String(p.stableId))); for (const p of indexLocalPlugins()){ if (claimed.has(p.key) || catalogIds.has(p.slug)) continue; @@ -793,9 +716,7 @@ function oneLine(s) { skillIds: (g.skills || []).map((s)=>s.id) })); } - } catch { - // no deep dump: skills render ungrouped - } + } catch {} return { ok: true, installed, @@ -806,7 +727,7 @@ function oneLine(s) { function handleLibrary(_req, res) { return send(res, 200, buildLibrary()); } -/** `/api/local///(doc|file)/` */ function handleLocal(_req, res, pathname) { +function handleLocal(_req, res, pathname) { const m = /^\/api\/local\/([^/]+)\/([^/]+)\/(doc|file)\/(.+)$/.exec(pathname); if (!m) return send(res, 404, { ok: false, @@ -849,7 +770,7 @@ async function handleBots(_req, res, _pathname, url) { }); } } -/** Route table: method + exact path or prefix. First match wins. */ const ROUTES = [ +const ROUTES = [ [ "GET", "/api/library", @@ -877,7 +798,6 @@ async function dispatch(req, res) { let pathname; try { url = new node_url__rspack_import_3.URL(req.url || "/", `http://${req.headers.host || "localhost"}`); - // Reject malformed percent-escapes once, here, so handlers can trust pathname. pathname = decodeURIComponent(url.pathname); } catch { return send(res, 400, { @@ -918,4 +838,3 @@ server.listen(PORT, HOST, ()=>{ console.log(` bots: GET /api/bots`); console.log(` send: POST /api/send`); }); - diff --git a/artifact/scripts/plugin-library.mjs b/artifact/scripts/plugin-library.mjs index 8a162c3..6486434 100644 --- a/artifact/scripts/plugin-library.mjs +++ b/artifact/scripts/plugin-library.mjs @@ -2,381 +2,347 @@ import * as __rspack_external_node_child_process_cd435d64 from "node:child_proce import * as __rspack_external_node_fs_1b05aee1 from "node:fs"; import * as __rspack_external_node_path_806ed179 from "node:path"; import * as __rspack_external_node_url_3991086a from "node:url"; -var __webpack_modules__ = ({ -"node:child_process"(module) { - -module.exports = __rspack_external_node_child_process_cd435d64; - - -}, -"node:fs"(module) { - -module.exports = __rspack_external_node_fs_1b05aee1; - - -}, -"node:path"(module) { - -module.exports = __rspack_external_node_path_806ed179; - - -}, -"node:url"(module) { - -module.exports = __rspack_external_node_url_3991086a; - - -}, -"./bin/plugin-library.mjs"(__webpack_module__, __unused_rspack___webpack_exports__, __webpack_require__) { -__webpack_require__.a(__webpack_module__, async function (__rspack_load_async_deps, __rspack_async_done) { try { -/* import */ var node_child_process__rspack_import_0 = __webpack_require__("node:child_process"); -/* import */ var node_fs__rspack_import_1 = __webpack_require__("node:fs"); -/* import */ var node_path__rspack_import_2 = __webpack_require__("node:path"); -/* import */ var node_url__rspack_import_3 = __webpack_require__("node:url"); -/** - * plugin-library [--json] [--browser] [--port N] - * - * `start` is idempotent: if the server already answers on the port it is left - * alone, otherwise one is spawned detached and this process waits for health. - * `open` starts, resolves `query` (plugin name, id, or skill id) to a deep link, - * prints it, and with --browser hands it to the OS browser. - */ - - - -const ROOT = node_path__rspack_import_2["default"].resolve(node_path__rspack_import_2["default"].dirname((0,node_url__rspack_import_3.fileURLToPath)(import.meta.url)), ".."); -const PID_FILE = node_path__rspack_import_2["default"].join(ROOT, "logs", "server.pid"); -const LOG_FILE = node_path__rspack_import_2["default"].join(ROOT, "logs", "server.out"); -const SERVER_ENTRY = node_fs__rspack_import_1["default"].existsSync(node_path__rspack_import_2["default"].join(ROOT, "scripts", "plugin-library-server.mjs")) ? node_path__rspack_import_2["default"].join(ROOT, "scripts", "plugin-library-server.mjs") : node_path__rspack_import_2["default"].join(ROOT, "server.js"); -const args = process.argv.slice(2); -const flag = (name)=>{ - const i = args.indexOf(name); - if (i === -1) return false; - args.splice(i, 1); - return true; -}; -const option = (name, fallback)=>{ - const i = args.indexOf(name); - if (i === -1) return fallback; - const v = args[i + 1]; - args.splice(i, 2); - return v; -}; -const json = flag("--json"); -const browser = flag("--browser"); -const port = Number(option("--port", process.env.PORT || 8787)); -const command = args.shift() || "open"; -const query = args.join(" ").trim(); -const base = `http://127.0.0.1:${port}`; -const out = (obj)=>{ - if (json) console.log(JSON.stringify(obj)); - else console.log(obj.url || obj.message || JSON.stringify(obj)); +var __webpack_modules__ = { + "node:child_process" (module) { + module.exports = __rspack_external_node_child_process_cd435d64; + }, + "node:fs" (module) { + module.exports = __rspack_external_node_fs_1b05aee1; + }, + "node:path" (module) { + module.exports = __rspack_external_node_path_806ed179; + }, + "node:url" (module) { + module.exports = __rspack_external_node_url_3991086a; + }, + "./bin/plugin-library.mjs" (__webpack_module__, __unused_rspack___webpack_exports__, __webpack_require__) { + __webpack_require__.a(__webpack_module__, async function(__rspack_load_async_deps, __rspack_async_done) { + try { + var node_child_process__rspack_import_0 = __webpack_require__("node:child_process"); + var node_fs__rspack_import_1 = __webpack_require__("node:fs"); + var node_path__rspack_import_2 = __webpack_require__("node:path"); + var node_url__rspack_import_3 = __webpack_require__("node:url"); + const ROOT = node_path__rspack_import_2["default"].resolve(node_path__rspack_import_2["default"].dirname((0, node_url__rspack_import_3.fileURLToPath)(import.meta.url)), ".."); + const PID_FILE = node_path__rspack_import_2["default"].join(ROOT, "logs", "server.pid"); + const LOG_FILE = node_path__rspack_import_2["default"].join(ROOT, "logs", "server.out"); + const SERVER_ENTRY = node_fs__rspack_import_1["default"].existsSync(node_path__rspack_import_2["default"].join(ROOT, "scripts", "plugin-library-server.mjs")) ? node_path__rspack_import_2["default"].join(ROOT, "scripts", "plugin-library-server.mjs") : node_path__rspack_import_2["default"].join(ROOT, "server.js"); + const args = process.argv.slice(2); + const flag = (name)=>{ + const i = args.indexOf(name); + if (i === -1) return false; + args.splice(i, 1); + return true; + }; + const option = (name, fallback)=>{ + const i = args.indexOf(name); + if (i === -1) return fallback; + const v = args[i + 1]; + args.splice(i, 2); + return v; + }; + const json = flag("--json"); + const browser = flag("--browser"); + const port = Number(option("--port", process.env.PORT || 8787)); + const command = args.shift() || "open"; + const query = args.join(" ").trim(); + const base = `http://127.0.0.1:${port}`; + const out = (obj)=>{ + if (json) console.log(JSON.stringify(obj)); + else console.log(obj.url || obj.message || JSON.stringify(obj)); + }; + async function healthy() { + try { + const r = await fetch(`${base}/api/library`, { + signal: AbortSignal.timeout(1500) + }); + return r.ok; + } catch { + return false; + } + } + async function start() { + if (await healthy()) return { + started: false, + pid: readPid() + }; + node_fs__rspack_import_1["default"].mkdirSync(node_path__rspack_import_2["default"].dirname(LOG_FILE), { + recursive: true + }); + const log = node_fs__rspack_import_1["default"].openSync(LOG_FILE, "a"); + const child = (0, node_child_process__rspack_import_0.spawn)(process.execPath, [ + SERVER_ENTRY + ], { + cwd: ROOT, + env: { + ...process.env, + PORT: String(port) + }, + detached: true, + stdio: [ + "ignore", + log, + log + ] + }); + child.unref(); + node_fs__rspack_import_1["default"].writeFileSync(PID_FILE, String(child.pid)); + for(let i = 0; i < 40; i++){ + if (await healthy()) return { + started: true, + pid: child.pid + }; + await new Promise((r)=>setTimeout(r, 150)); + } + throw new Error(`server did not become healthy on ${base}; see ${LOG_FILE}`); + } + function readPid() { + try { + return Number(node_fs__rspack_import_1["default"].readFileSync(PID_FILE, "utf8")); + } catch { + return null; + } + } + function stop() { + const pid = readPid(); + if (!pid) return { + stopped: false, + message: "no pidfile; nothing to stop" + }; + try { + process.kill(pid, "SIGTERM"); + node_fs__rspack_import_1["default"].rmSync(PID_FILE, { + force: true + }); + return { + stopped: true, + pid + }; + } catch (e) { + node_fs__rspack_import_1["default"].rmSync(PID_FILE, { + force: true + }); + return { + stopped: false, + pid, + message: e.code === "ESRCH" ? "process already gone" : e.message + }; + } + } + async function resolveHash(q) { + if (!q) return ""; + const lib = await (await fetch(`${base}/api/library`)).json(); + const all = [ + ...lib.installed, + ...lib.marketplace + ]; + const norm = (s)=>String(s || "").toLowerCase(); + const nq = norm(q); + const byId = all.find((p)=>p.plugin_id === q); + if (byId) return `#/p/${byId.plugin_id}`; + for (const p of lib.installed){ + const skill = (p.local?.skills || []).find((s)=>norm(s.id) === nq || norm(s.name) === nq); + if (skill) return `#/p/${p.plugin_id}/s/${encodeURIComponent(skill.id)}`; + } + const byName = all.find((p)=>norm(p.name) === nq) || all.find((p)=>norm(p.name).includes(nq)); + if (byName) return `#/p/${byName.plugin_id}`; + for (const p of lib.installed){ + const skill = (p.local?.skills || []).find((s)=>norm(s.id).includes(nq)); + if (skill) return `#/p/${p.plugin_id}/s/${encodeURIComponent(skill.id)}`; + } + return ""; + } + function openInBrowser(url) { + const opener = process.platform === "darwin" ? "open" : process.platform === "win32" ? "start" : "xdg-open"; + return new Promise((resolve)=>(0, node_child_process__rspack_import_0.execFile)(opener, [ + url + ], ()=>resolve())); + } + try { + switch(command){ + case "start": + { + const r = await start(); + out({ + ok: true, + url: `${base}/`, + ...r, + message: r.started ? `started on ${base}` : `already running on ${base}` + }); + break; + } + case "stop": + out({ + ok: true, + ...stop() + }); + break; + case "status": + { + const up = await healthy(); + out({ + ok: true, + running: up, + url: `${base}/`, + pid: readPid(), + message: up ? `running on ${base}` : "not running" + }); + break; + } + case "open": + { + const r = await start(); + const hash = await resolveHash(query); + const url = `${base}/${hash}`; + if (browser) await openInBrowser(url); + out({ + ok: true, + url, + resolved: Boolean(hash) || !query, + query: query || null, + started: r.started + }); + break; + } + default: + console.error(`unknown command: ${command}\nusage: plugin-library [--json] [--browser] [--port N]`); + process.exit(2); + } + } catch (e) { + if (json) console.log(JSON.stringify({ + ok: false, + error: e.message + })); + else console.error(e.message); + process.exit(1); + } + __rspack_async_done(); + } catch (e) { + __rspack_async_done(e); + } + }, 1); + } }; -async function healthy() { - try { - const r = await fetch(`${base}/api/library`, { - signal: AbortSignal.timeout(1500) - }); - return r.ok; - } catch { - return false; +var __webpack_module_cache__ = {}; +function __webpack_require__(moduleId) { + var cachedModule = __webpack_module_cache__[moduleId]; + if (cachedModule !== undefined) { + return cachedModule.exports; } -} -async function start() { - if (await healthy()) return { - started: false, - pid: readPid() + var module = __webpack_module_cache__[moduleId] = { + exports: {} }; - node_fs__rspack_import_1["default"].mkdirSync(node_path__rspack_import_2["default"].dirname(LOG_FILE), { - recursive: true - }); - const log = node_fs__rspack_import_1["default"].openSync(LOG_FILE, "a"); - const child = (0,node_child_process__rspack_import_0.spawn)(process.execPath, [ - SERVER_ENTRY - ], { - cwd: ROOT, - env: { - ...process.env, - PORT: String(port) - }, - detached: true, - stdio: [ - "ignore", - log, - log - ] - }); - child.unref(); - node_fs__rspack_import_1["default"].writeFileSync(PID_FILE, String(child.pid)); - for(let i = 0; i < 40; i++){ - if (await healthy()) return { - started: true, - pid: child.pid - }; - await new Promise((r)=>setTimeout(r, 150)); - } - throw new Error(`server did not become healthy on ${base}; see ${LOG_FILE}`); + __webpack_modules__[moduleId](module, module.exports, __webpack_require__); + return module.exports; } -function readPid() { - try { - return Number(node_fs__rspack_import_1["default"].readFileSync(PID_FILE, "utf8")); - } catch { - return null; - } -} -function stop() { - const pid = readPid(); - if (!pid) return { - stopped: false, - message: "no pidfile; nothing to stop" +__webpack_require__.c = __webpack_module_cache__; +(()=>{ + var hasSymbol = typeof Symbol === "function"; + var rspackQueues = hasSymbol ? Symbol("rspack queues") : "__rspack_queues"; + var rspackExports = __webpack_require__.aE = hasSymbol ? Symbol("rspack exports") : "__webpack_exports__"; + var rspackError = hasSymbol ? Symbol("rspack error") : "__rspack_error"; + var rspackDone = hasSymbol ? Symbol("rspack done") : "__rspack_done"; + var rspackDefer = __webpack_require__.zS = hasSymbol ? Symbol("rspack defer") : "__rspack_defer"; + __webpack_require__.zT = (asyncDeps)=>{ + var hasUnresolvedAsyncSubgraph = asyncDeps.some((id)=>{ + var cache = __webpack_module_cache__[id]; + return !cache || cache[rspackDone] === false; + }); + if (hasUnresolvedAsyncSubgraph) { + return { + then (onFulfilled, onRejected) { + return Promise.all(asyncDeps.map(__webpack_require__)).then(onFulfilled, onRejected); + } + }; + } }; - try { - process.kill(pid, "SIGTERM"); - node_fs__rspack_import_1["default"].rmSync(PID_FILE, { - force: true + var resolveQueue = (queue)=>{ + if (queue && queue.d < 1) { + queue.d = 1; + queue.forEach((fn)=>fn.r--); + queue.forEach((fn)=>fn.r-- ? fn.r++ : fn()); + } + }; + var wrapDeps = (deps)=>{ + return deps.map((dep)=>{ + if (dep !== null && typeof dep === "object") { + if (!dep[rspackQueues] && dep[rspackDefer]) { + var asyncDeps = __webpack_require__.zT(dep[rspackDefer]); + if (asyncDeps) { + var d = dep; + dep = { + then (onFulfilled, onRejected) { + asyncDeps.then(()=>onFulfilled(d), onRejected); + } + }; + } else return dep; + } + if (dep[rspackQueues]) return dep; + if (dep.then) { + var queue = []; + queue.d = 0; + dep.then((r)=>{ + obj[rspackExports] = r; + resolveQueue(queue); + }, (e)=>{ + obj[rspackError] = e; + resolveQueue(queue); + }); + var obj = {}; + obj[rspackDefer] = false; + obj[rspackQueues] = (fn)=>fn(queue); + return obj; + } + } + var ret = {}; + ret[rspackQueues] = ()=>{}; + ret[rspackExports] = dep; + return ret; }); - return { - stopped: true, - pid - }; - } catch (e) { - node_fs__rspack_import_1["default"].rmSync(PID_FILE, { - force: true + }; + __webpack_require__.a = (module, body, hasAwait, useModuleExports)=>{ + var queue; + hasAwait && ((queue = []).d = -1); + var depQueues = new Set(); + var exports = module.exports; + var currentDeps; + var outerResolve; + var reject; + var promise = new Promise((resolve, rej)=>{ + reject = rej; + outerResolve = resolve; }); - return { - stopped: false, - pid, - message: e.code === "ESRCH" ? "process already gone" : e.message + promise[rspackExports] = exports; + promise[rspackQueues] = (fn)=>{ + queue && fn(queue), depQueues.forEach(fn), promise["catch"](()=>{}); }; - } -} -/** Plugin name / id / skill id → hash route. Exact hits first, then substring. */ async function resolveHash(q) { - if (!q) return ""; - const lib = await (await fetch(`${base}/api/library`)).json(); - const all = [ - ...lib.installed, - ...lib.marketplace - ]; - const norm = (s)=>String(s || "").toLowerCase(); - const nq = norm(q); - const byId = all.find((p)=>p.plugin_id === q); - if (byId) return `#/p/${byId.plugin_id}`; - for (const p of lib.installed){ - const skill = (p.local?.skills || []).find((s)=>norm(s.id) === nq || norm(s.name) === nq); - if (skill) return `#/p/${p.plugin_id}/s/${encodeURIComponent(skill.id)}`; - } - const byName = all.find((p)=>norm(p.name) === nq) || all.find((p)=>norm(p.name).includes(nq)); - if (byName) return `#/p/${byName.plugin_id}`; - for (const p of lib.installed){ - const skill = (p.local?.skills || []).find((s)=>norm(s.id).includes(nq)); - if (skill) return `#/p/${p.plugin_id}/s/${encodeURIComponent(skill.id)}`; - } - return ""; -} -function openInBrowser(url) { - const opener = process.platform === "darwin" ? "open" : process.platform === "win32" ? "start" : "xdg-open"; - return new Promise((resolve)=>(0,node_child_process__rspack_import_0.execFile)(opener, [ - url - ], ()=>resolve())); -} -try { - switch(command){ - case "start": - { - const r = await start(); - out({ - ok: true, - url: `${base}/`, - ...r, - message: r.started ? `started on ${base}` : `already running on ${base}` + module.exports = promise; + var asyncModule = module; + if (useModuleExports) { + asyncModule = Object.create(module); + asyncModule.exports = exports; + } + var handle = (deps)=>{ + currentDeps = wrapDeps(deps); + var fn; + var getResult = ()=>{ + return currentDeps.map((d)=>{ + if (d[rspackDefer]) return d; + if (d[rspackError]) throw d[rspackError]; + return d[rspackExports]; }); - break; - } - case "stop": - out({ - ok: true, - ...stop() + }; + var promise = new Promise((resolve)=>{ + fn = ()=>resolve(getResult); + fn.r = 0; + var fnQueue = (q)=>q !== queue && !depQueues.has(q) && (depQueues.add(q), q && !q.d && (fn.r++, q.push(fn))); + currentDeps.map((dep)=>dep[rspackDefer] || dep[rspackQueues](fnQueue)); }); - break; - case "status": - { - const up = await healthy(); - out({ - ok: true, - running: up, - url: `${base}/`, - pid: readPid(), - message: up ? `running on ${base}` : "not running" - }); - break; - } - case "open": - { - const r = await start(); - const hash = await resolveHash(query); - const url = `${base}/${hash}`; - if (browser) await openInBrowser(url); - out({ - ok: true, - url, - resolved: Boolean(hash) || !query, - query: query || null, - started: r.started - }); - break; - } - default: - console.error(`unknown command: ${command}\nusage: plugin-library [--json] [--browser] [--port N]`); - process.exit(2); - } -} catch (e) { - if (json) console.log(JSON.stringify({ - ok: false, - error: e.message - })); - else console.error(e.message); - process.exit(1); -} - -__rspack_async_done(); -} catch(e) { __rspack_async_done(e); } }, 1); - -}, - -}); -// The module cache -var __webpack_module_cache__ = {}; - -// The require function -function __webpack_require__(moduleId) { - -// Check if module is in cache -var cachedModule = __webpack_module_cache__[moduleId]; -if (cachedModule !== undefined) { -return cachedModule.exports; -} -// Create a new module (and put it into the cache) -var module = (__webpack_module_cache__[moduleId] = { -exports: {} -}); -// Execute the module function -__webpack_modules__[moduleId](module, module.exports, __webpack_require__); - -// Return the exports of the module -return module.exports; - -} - -// expose the module cache -__webpack_require__.c = __webpack_module_cache__; - -// webpack/runtime/async_module -(() => { -var hasSymbol = typeof Symbol === "function"; -var rspackQueues = hasSymbol ? Symbol("rspack queues") : "__rspack_queues"; -var rspackExports = __webpack_require__.aE = hasSymbol ? Symbol("rspack exports") : "__webpack_exports__"; -var rspackError = hasSymbol ? Symbol("rspack error") : "__rspack_error"; -var rspackDone = hasSymbol ? Symbol("rspack done") : "__rspack_done"; -var rspackDefer = __webpack_require__.zS = hasSymbol ? Symbol("rspack defer") : "__rspack_defer"; -__webpack_require__.zT = (asyncDeps) => { - var hasUnresolvedAsyncSubgraph = asyncDeps.some((id) => { - var cache = __webpack_module_cache__[id]; - return !cache || cache[rspackDone] === false; - }); - if (hasUnresolvedAsyncSubgraph) { - return ({ then(onFulfilled, onRejected) { return Promise.all(asyncDeps.map(__webpack_require__)).then(onFulfilled, onRejected) } }); - } -} -var resolveQueue = (queue) => { - if (queue && queue.d < 1) { - queue.d = 1; - queue.forEach((fn) => (fn.r--)); - queue.forEach((fn) => (fn.r-- ? fn.r++ : fn())); - } -} -var wrapDeps = (deps) => { - return deps.map((dep) => { - if (dep !== null && typeof dep === "object") { - if(!dep[rspackQueues] && dep[rspackDefer]) { - var asyncDeps = __webpack_require__.zT(dep[rspackDefer]); - if (asyncDeps) { - var d = dep; - dep = { - then(onFulfilled, onRejected) { - asyncDeps.then(() => (onFulfilled(d)), onRejected); - } - }; - } else return dep; - } - if (dep[rspackQueues]) return dep; - if (dep.then) { - var queue = []; - queue.d = 0; - dep.then((r) => { - obj[rspackExports] = r; - resolveQueue(queue); - },(e) => { - obj[rspackError] = e; - resolveQueue(queue); - }); - var obj = {}; - obj[rspackDefer] = false; - obj[rspackQueues] = (fn) => (fn(queue)); - return obj; - } - } - var ret = {}; - ret[rspackQueues] = () => {}; - ret[rspackExports] = dep; - return ret; - }); -}; -__webpack_require__.a = (module, body, hasAwait, useModuleExports) => { - var queue; - hasAwait && ((queue = []).d = -1); - var depQueues = new Set(); - var exports = module.exports; - var currentDeps; - var outerResolve; - var reject; - var promise = new Promise((resolve, rej) => { - reject = rej; - outerResolve = resolve; - }); - promise[rspackExports] = exports; - promise[rspackQueues] = (fn) => { queue && fn(queue), depQueues.forEach(fn), promise["catch"](() => {}); }; - module.exports = promise; - var asyncModule = module; - if (useModuleExports) { - asyncModule = Object.create(module); - asyncModule.exports = exports; - } - var handle = (deps) => { - currentDeps = wrapDeps(deps); - var fn; - var getResult = () => { - return currentDeps.map((d) => { - if(d[rspackDefer]) return d; - if (d[rspackError]) throw d[rspackError]; - return d[rspackExports]; - }); - } - var promise = new Promise((resolve) => { - fn = () => (resolve(getResult)); - fn.r = 0; - var fnQueue = (q) => (q !== queue && !depQueues.has(q) && (depQueues.add(q), q && !q.d && (fn.r++, q.push(fn)))); - currentDeps.map((dep) => (dep[rspackDefer] || dep[rspackQueues](fnQueue))); - }); - return fn.r ? promise : getResult(); - }; - var done = (err) => ((err ? reject(promise[rspackError] = err) : (useModuleExports && (exports = promise[rspackExports] = asyncModule.exports), outerResolve(exports))), resolveQueue(queue), promise[rspackDone] = true); - body(handle, done, asyncModule); - queue && queue.d < 0 && (queue.d = 0); -}; - + return fn.r ? promise : getResult(); + }; + var done = (err)=>(err ? reject(promise[rspackError] = err) : (useModuleExports && (exports = promise[rspackExports] = asyncModule.exports), outerResolve(exports)), resolveQueue(queue), promise[rspackDone] = true); + body(handle, done, asyncModule); + queue && queue.d < 0 && (queue.d = 0); + }; })(); -// module cache are used so entry inlining is disabled -// startup -// Load entry module and return exports var __webpack_exports__ = __webpack_require__("./bin/plugin-library.mjs"); __webpack_exports__ = await __webpack_exports__; diff --git a/package-lock.json b/package-lock.json index 813317c..27e9e97 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "license": "MIT", "devDependencies": { "@types/node": "^24.0.0", - "agent-bundle": "https://pkg.pr.new/ScriptedAlchemy/agent-bundle/agent-bundle@4f62216f30", + "agent-bundle": "https://pkg.pr.new/ScriptedAlchemy/agent-bundle/agent-bundle@b4e38409f4", "typescript": "^7.0.0" }, "engines": { @@ -1268,9 +1268,9 @@ } }, "node_modules/agent-bundle": { - "version": "0.0.0-preview-4f62216", - "resolved": "https://pkg.pr.new/ScriptedAlchemy/agent-bundle/agent-bundle@4f62216f30", - "integrity": "sha512-kn/oPCRyBeXzNBUqyzINcnlHJwInUlP0lS490FMOaPgeoQB6341MZkaA0T4nXUBCyeKF/kgjqlxiQCRNacCIhw==", + "version": "0.0.0-preview-b4e3840", + "resolved": "https://pkg.pr.new/ScriptedAlchemy/agent-bundle/agent-bundle@b4e38409f4", + "integrity": "sha512-k6MACgqSDqLBsXSi6ijjsNXwYwnocWhXDimtkIkdu1db9VYfc6ijQQukAqXUy23hNTRsuNpK86p9qZO0om2Z4g==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -1304,7 +1304,7 @@ "node": ">=22.19.0" }, "peerDependencies": { - "@agent-bundle/runtime": "0.0.0-preview-4f62216", + "@agent-bundle/runtime": "0.0.0-preview-b4e3840", "@rstest/core": "^0.11.10", "react": "^19.2.0" }, diff --git a/package.json b/package.json index 2236f8f..1edebf3 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ }, "devDependencies": { "@types/node": "^24.0.0", - "agent-bundle": "https://pkg.pr.new/ScriptedAlchemy/agent-bundle/agent-bundle@4f62216f30", + "agent-bundle": "https://pkg.pr.new/ScriptedAlchemy/agent-bundle/agent-bundle@b4e38409f4", "typescript": "^7.0.0" } }