Welcome 👋
Neo.manager.rpc.Api reads a remote API description (services, their methods and streams) and registers one entry per call. Each entry resolves its type and url from the most specific level that sets one, falling back to a default. It is a short, pure method with no test yet: a table of inputs and outputs, and nothing to mock.
This is a good first issue for Hacktoberfest 2026. It needs Node.js and a clone of this repository: no Docker, no AI setup.
[!IMPORTANT]
Reserved for first-time Neo.mjs contributors. The maintainer team will not claim, edit, or implement this issue through 2026-10-31. Comment here to claim it, and ask anything on this issue.
Set up once: follow Set up the engine from a clone, including npm run bundle-browser-deps: without it the unit suite selects zero tests.
Where things live
- Source:
src/manager/rpc/Api.mjs, the singleton Neo.manager.rpc.Api with registerApi(api). Read an entry back with Api.get('Service.method').
- New test file:
test/playwright/unit/manager/rpc/Api.spec.mjs
- Pattern to copy:
test/playwright/unit/util/Array.spec.mjs (the setup() call and imports)
- Tip: the singleton has no reset, so give every test its own service names (e.g.
TestUsers1). An API description looks like {url, type, services: {Users: {url, type, methods: {read: {}}, streams: {feed: {}}}}}.
What to cover
Register {url: 'https://api.test/', type: 'ajax', services: {Users: {url: 'https://users.test/', methods: {read: {}, create: {type: 'websocket'}, destroy: {url: 'https://x.test/'}}, streams: {feed: {}}}, Tasks: {type: 'websocket', methods: {list: {}}, streams: {live: {type: 'sse'}}}}}, then:
| Entry |
Expected |
Users.read |
type: 'ajax' (the API's), url: 'https://users.test/' (the service's), method: 'read', service: 'Users' |
Users.create |
type: 'websocket': the method's own type wins |
Users.destroy |
url: 'https://x.test/': the method's own url wins |
Tasks.list |
type: 'websocket' (the service's), url: 'https://api.test/' (the API's) |
Tasks.live |
type: 'sse', isStream: true |
Users.feed |
type: 'ajax', isStream: true. A stream without its own type takes the API's ajax before its websocket default. Pin it as it is, and if you think a stream should not inherit ajax, say so on this issue. |
Then register {services: {Bare: {methods: {ping: {}}, streams: {tick: {}}}}} (no API-level type or url):
| Entry |
Expected |
Bare.ping |
type: 'ajax' (the method default), url undefined |
Bare.tick |
type: 'websocket' (the stream default), isStream: true |
Done when
Out of scope
Calling a registered method over the network, and the parsers, normalizers and pipelines an entry can name.
While you wait for review
You just pinned one small piece of a multi-threaded application engine: in Neo.mjs your app's code runs inside a web worker, and the main thread only paints. Two things worth ten minutes:
- See the part nobody expects. Run
npm run build-themes -- -n -e dev -t all and npm run server-start, open apps/workstation/, and drag a tab out of the browser window. It becomes its own OS window, still running, with the same component instances and the same worker. Benefits: Introduction explains why that is possible.
- Your coding agent can go much further here. The skills this repository's AI maintainers work with are published on npm as
neo-agent-skills, and they need no Knowledge Base and no Memory Core. With Claude or GPT beside you, the help wanted issues are within reach after this one.
Maintainer notes
Curated under #18985 (Hacktoberfest 2026). Found work: no unit or component spec names this module on dev (2026-09-24). Every row in the table was run in the unit environment on dev before filing, and the values are the measured ones.
Live latest-open sweep: the latest 20 open issues at 2026-09-24T15:22Z, plus a search for IdGenerator, CountryFlags and rpc Api registerApi; no equivalent. A2A: no claim on this scope. Memory Core: no prior decision.
Origin Session ID: 101d2ce9-9f43-4f5a-9ae2-3c75bf8f6fcf
Welcome 👋
Neo.manager.rpc.Apireads a remote API description (services, their methods and streams) and registers one entry per call. Each entry resolves itstypeandurlfrom the most specific level that sets one, falling back to a default. It is a short, pure method with no test yet: a table of inputs and outputs, and nothing to mock.This is a good first issue for Hacktoberfest 2026. It needs Node.js and a clone of this repository: no Docker, no AI setup.
Set up once: follow Set up the engine from a clone, including
npm run bundle-browser-deps: without it the unit suite selects zero tests.Where things live
src/manager/rpc/Api.mjs, the singletonNeo.manager.rpc.ApiwithregisterApi(api). Read an entry back withApi.get('Service.method').test/playwright/unit/manager/rpc/Api.spec.mjstest/playwright/unit/util/Array.spec.mjs(thesetup()call and imports)TestUsers1). An API description looks like{url, type, services: {Users: {url, type, methods: {read: {}}, streams: {feed: {}}}}}.What to cover
Register
{url: 'https://api.test/', type: 'ajax', services: {Users: {url: 'https://users.test/', methods: {read: {}, create: {type: 'websocket'}, destroy: {url: 'https://x.test/'}}, streams: {feed: {}}}, Tasks: {type: 'websocket', methods: {list: {}}, streams: {live: {type: 'sse'}}}}}, then:Users.readtype: 'ajax'(the API's),url: 'https://users.test/'(the service's),method: 'read',service: 'Users'Users.createtype: 'websocket': the method's own type winsUsers.destroyurl: 'https://x.test/': the method's own url winsTasks.listtype: 'websocket'(the service's),url: 'https://api.test/'(the API's)Tasks.livetype: 'sse',isStream: trueUsers.feedtype: 'ajax',isStream: true. A stream without its own type takes the API'sajaxbefore itswebsocketdefault. Pin it as it is, and if you think a stream should not inheritajax, say so on this issue.Then register
{services: {Bare: {methods: {ping: {}}, streams: {tick: {}}}}}(no API-leveltypeorurl):Bare.pingtype: 'ajax'(the method default),urlundefinedBare.ticktype: 'websocket'(the stream default),isStream: trueDone when
test/playwright/unit/manager/rpc/Api.spec.mjsexists, following the pattern file's setup.test(...)per table row.src/.npm run test-unit -- test/playwright/unit/manager/rpc/Api.spec.mjspasses.npm run test-unitpasses.Out of scope
Calling a registered method over the network, and the parsers, normalizers and pipelines an entry can name.
While you wait for review
You just pinned one small piece of a multi-threaded application engine: in Neo.mjs your app's code runs inside a web worker, and the main thread only paints. Two things worth ten minutes:
npm run build-themes -- -n -e dev -t allandnpm run server-start, openapps/workstation/, and drag a tab out of the browser window. It becomes its own OS window, still running, with the same component instances and the same worker. Benefits: Introduction explains why that is possible.neo-agent-skills, and they need no Knowledge Base and no Memory Core. With Claude or GPT beside you, thehelp wantedissues are within reach after this one.Maintainer notes
Curated under #18985 (Hacktoberfest 2026). Found work: no unit or component spec names this module on
dev(2026-09-24). Every row in the table was run in the unit environment ondevbefore filing, and the values are the measured ones. Live latest-open sweep: the latest 20 open issues at 2026-09-24T15:22Z, plus a search forIdGenerator,CountryFlagsandrpc Api registerApi; no equivalent. A2A: no claim on this scope. Memory Core: no prior decision.Origin Session ID: 101d2ce9-9f43-4f5a-9ae2-3c75bf8f6fcf