@ai-ecoverse/slicc-agent 3.41.0 → 3.42.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/README.md +23 -4
  2. package/bin/agent +9 -4
  3. package/dist/client.js +4 -1
  4. package/dist/client.js.map +2 -2
  5. package/dist/host.js +59 -21
  6. package/dist/host.js.map +3 -3
  7. package/dist/index.js +6 -0
  8. package/dist/index.js.map +2 -2
  9. package/dist/main.js +4 -0
  10. package/dist/main.js.map +2 -2
  11. package/dist/owner.js +2 -1
  12. package/dist/owner.js.map +2 -2
  13. package/dist/readonly.js +13 -0
  14. package/dist/readonly.js.map +2 -2
  15. package/dist/remote/host.js +10 -4
  16. package/dist/remote/host.js.map +2 -2
  17. package/dist/remote/pages.js +216 -0
  18. package/dist/remote/pages.js.map +7 -0
  19. package/dist/scoops/cli.js +17 -0
  20. package/dist/scoops/cli.js.map +2 -2
  21. package/dist/scoops/index.js +4 -2
  22. package/dist/scoops/index.js.map +2 -2
  23. package/dist/scoops/requests.js +14 -2
  24. package/dist/scoops/requests.js.map +2 -2
  25. package/dist/scoops/service.js.map +1 -1
  26. package/dist/services.js +2 -0
  27. package/dist/services.js.map +2 -2
  28. package/dist/spectrum/index.js +7 -0
  29. package/dist/spectrum/index.js.map +3 -3
  30. package/dist/spectrum/page-port.js +132 -0
  31. package/dist/spectrum/page-port.js.map +7 -0
  32. package/dist/sprinkles/index.js +1 -2
  33. package/dist/sprinkles/index.js.map +2 -2
  34. package/dist/types/client.d.ts +2 -0
  35. package/dist/types/host.d.ts +8 -3
  36. package/dist/types/index.d.ts +3 -2
  37. package/dist/types/owner.d.ts +1 -0
  38. package/dist/types/readonly.d.ts +2 -0
  39. package/dist/types/remote/host.d.ts +10 -0
  40. package/dist/types/remote/pages.d.ts +76 -0
  41. package/dist/types/scoops/cli.d.ts +7 -0
  42. package/dist/types/scoops/index.d.ts +1 -0
  43. package/dist/types/scoops/requests.d.ts +2 -1
  44. package/dist/types/scoops/service.d.ts +1 -0
  45. package/dist/types/services.d.ts +2 -0
  46. package/dist/types/spectrum/index.d.ts +4 -0
  47. package/dist/types/spectrum/page-port.d.ts +32 -0
  48. package/dist/types/sprinkles/index.d.ts +1 -1
  49. package/dist/worker.js +2 -1
  50. package/dist/worker.js.map +2 -2
  51. package/package.json +1 -1
  52. package/packages/vfs-root/skills/agent/SKILL.md +2 -0
  53. package/packages/vfs-root/skills/sprinkles/SKILL.md +1 -1
@@ -0,0 +1,32 @@
1
+ import type { AgentConnection } from '../client.ts';
2
+ import type { PageCaller, PageResult, PageTab } from '../remote/pages.ts';
3
+ import type { AgentAdapter } from './agent-port.ts';
4
+ export declare const REPORT_MS = 250;
5
+ export declare const POLL_MS = 10000;
6
+ export type PageRun = (argv: readonly string[], caller: PageCaller) => PageResult | Promise<PageResult>;
7
+ export interface PageTarget {
8
+ addEventListener(type: string, listener: () => void, options?: boolean): void;
9
+ removeEventListener(type: string, listener: () => void, options?: boolean): void;
10
+ }
11
+ export interface PageDocument extends PageTarget {
12
+ readonly visibilityState: string;
13
+ hasFocus(): boolean;
14
+ }
15
+ export interface PageOptions {
16
+ tab: string;
17
+ run?: PageRun;
18
+ document?: PageDocument;
19
+ window?: PageTarget;
20
+ now?: () => number;
21
+ reportMs?: number;
22
+ pollMs?: number;
23
+ }
24
+ export declare class PageAdapter {
25
+ #private;
26
+ readonly done: Promise<void>;
27
+ constructor(connection: AgentConnection, agent: AgentAdapter, options: PageOptions & {
28
+ run: PageRun;
29
+ });
30
+ state(): PageTab;
31
+ dispose(): Promise<void>;
32
+ }
@@ -33,7 +33,7 @@ export interface SprinklesAttach {
33
33
  dir?: string;
34
34
  intercept?: (id: string, payload: SprinklePayload, context: Context) => Promise<boolean>;
35
35
  }
36
- export declare const USAGE = "usage:\n sprinkle list every sprinkle in /home/sprinkles, with its owner\n sprinkle show <name> show a sprinkle in your chat\n sprinkle own <name> [<agent>] send its messages to <agent> (cone, cone-<n> or a scoop's handle)\n\nA sprinkle is an .shtml file in /home/sprinkles, as <name>.shtml or <name>/<name>.shtml.\nEvery one of them has a button in the rail; edit the file and the open panel reloads.\n";
36
+ export declare const USAGE = "usage:\n sprinkle list every sprinkle in /home/sprinkles, with its owner\n sprinkle show <name> show a sprinkle in your chat\n sprinkle own <name> [<agent>] send its messages to <agent> (cone, cone-<n> or a scoop's handle)\n sprinkle open|close <name> the same as panel open|close sprinkle:<name>\n\nA sprinkle is an .shtml file in /home/sprinkles, as <name>.shtml or <name>/<name>.shtml.\nEvery one of them has a button in the rail; edit the file and the open panel reloads.\n";
37
37
  export declare function ownerOf(agents: Agents, owner: string | undefined): string;
38
38
  export declare function setupSprinkles(): {
39
39
  attach(options: SprinklesAttach, context: Context): Promise<SprinklesRuntime>;
package/dist/worker.js CHANGED
@@ -3,8 +3,9 @@ function serveConnections(scope, host) {
3
3
  const message = data;
4
4
  const port = message?.connect;
5
5
  if (!port) return;
6
+ const pages = message?.pages === false ? { pages: false } : {};
6
7
  host.then(
7
- (ready) => ready.connect(port, { readOnly: message?.readOnly === true }),
8
+ (ready) => ready.connect(port, { readOnly: message?.readOnly === true, ...pages }),
8
9
  () => port.close?.()
9
10
  );
10
11
  });
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/worker.ts"],
4
- "sourcesContent": ["import type { AgentHost } from './host.ts';\nimport type { PortEndpoint } from './wire.ts';\n\nexport interface WorkerScope {\n addEventListener(type: 'message', listener: (event: MessageEvent) => void): void;\n}\n\nexport function serveConnections(scope: WorkerScope, host: Promise<AgentHost>): void {\n scope.addEventListener('message', ({ data }) => {\n const message = data as { connect?: PortEndpoint; readOnly?: boolean } | null;\n const port = message?.connect;\n if (!port) return;\n host.then(\n (ready) => ready.connect(port, { readOnly: message?.readOnly === true }),\n () => port.close?.()\n );\n });\n}\n\nexport interface KernelPorts {\n kernel: MessagePort;\n admin?: MessagePort;\n}\n\nexport function kernelPorts(scope: WorkerScope): Promise<KernelPorts> {\n return new Promise((resolve) => {\n scope.addEventListener('message', ({ data }) => {\n const message = data as { kernel?: MessagePort; admin?: MessagePort } | null;\n const kernel = message?.kernel;\n if (!kernel) return;\n resolve(message.admin ? { kernel, admin: message.admin } : { kernel });\n });\n });\n}\n\nexport function kernelPort(scope: WorkerScope): Promise<MessagePort> {\n return kernelPorts(scope).then((ports) => ports.kernel);\n}\n"],
5
- "mappings": "AAOO,SAAS,iBAAiB,OAAoB,MAAgC;AACnF,QAAM,iBAAiB,WAAW,CAAC,EAAE,KAAK,MAAM;AAC9C,UAAM,UAAU;AAChB,UAAM,OAAO,SAAS;AACtB,QAAI,CAAC,KAAM;AACX,SAAK;AAAA,MACH,CAAC,UAAU,MAAM,QAAQ,MAAM,EAAE,UAAU,SAAS,aAAa,KAAK,CAAC;AAAA,MACvE,MAAM,KAAK,QAAQ;AAAA,IACrB;AAAA,EACF,CAAC;AACH;AAOO,SAAS,YAAY,OAA0C;AACpE,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,UAAM,iBAAiB,WAAW,CAAC,EAAE,KAAK,MAAM;AAC9C,YAAM,UAAU;AAChB,YAAM,SAAS,SAAS;AACxB,UAAI,CAAC,OAAQ;AACb,cAAQ,QAAQ,QAAQ,EAAE,QAAQ,OAAO,QAAQ,MAAM,IAAI,EAAE,OAAO,CAAC;AAAA,IACvE,CAAC;AAAA,EACH,CAAC;AACH;AAEO,SAAS,WAAW,OAA0C;AACnE,SAAO,YAAY,KAAK,EAAE,KAAK,CAAC,UAAU,MAAM,MAAM;AACxD;",
4
+ "sourcesContent": ["import type { AgentHost } from './host.ts';\nimport type { PortEndpoint } from './wire.ts';\n\nexport interface WorkerScope {\n addEventListener(type: 'message', listener: (event: MessageEvent) => void): void;\n}\n\nexport function serveConnections(scope: WorkerScope, host: Promise<AgentHost>): void {\n scope.addEventListener('message', ({ data }) => {\n const message = data as { connect?: PortEndpoint; readOnly?: boolean; pages?: boolean } | null;\n const port = message?.connect;\n if (!port) return;\n const pages = message?.pages === false ? { pages: false } : {};\n host.then(\n (ready) => ready.connect(port, { readOnly: message?.readOnly === true, ...pages }),\n () => port.close?.()\n );\n });\n}\n\nexport interface KernelPorts {\n kernel: MessagePort;\n admin?: MessagePort;\n}\n\nexport function kernelPorts(scope: WorkerScope): Promise<KernelPorts> {\n return new Promise((resolve) => {\n scope.addEventListener('message', ({ data }) => {\n const message = data as { kernel?: MessagePort; admin?: MessagePort } | null;\n const kernel = message?.kernel;\n if (!kernel) return;\n resolve(message.admin ? { kernel, admin: message.admin } : { kernel });\n });\n });\n}\n\nexport function kernelPort(scope: WorkerScope): Promise<MessagePort> {\n return kernelPorts(scope).then((ports) => ports.kernel);\n}\n"],
5
+ "mappings": "AAOO,SAAS,iBAAiB,OAAoB,MAAgC;AACnF,QAAM,iBAAiB,WAAW,CAAC,EAAE,KAAK,MAAM;AAC9C,UAAM,UAAU;AAChB,UAAM,OAAO,SAAS;AACtB,QAAI,CAAC,KAAM;AACX,UAAM,QAAQ,SAAS,UAAU,QAAQ,EAAE,OAAO,MAAM,IAAI,CAAC;AAC7D,SAAK;AAAA,MACH,CAAC,UAAU,MAAM,QAAQ,MAAM,EAAE,UAAU,SAAS,aAAa,MAAM,GAAG,MAAM,CAAC;AAAA,MACjF,MAAM,KAAK,QAAQ;AAAA,IACrB;AAAA,EACF,CAAC;AACH;AAOO,SAAS,YAAY,OAA0C;AACpE,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,UAAM,iBAAiB,WAAW,CAAC,EAAE,KAAK,MAAM;AAC9C,YAAM,UAAU;AAChB,YAAM,SAAS,SAAS;AACxB,UAAI,CAAC,OAAQ;AACb,cAAQ,QAAQ,QAAQ,EAAE,QAAQ,OAAO,QAAQ,MAAM,IAAI,EAAE,OAAO,CAAC;AAAA,IACvE,CAAC;AAAA,EACH,CAAC;AACH;AAEO,SAAS,WAAW,OAA0C;AACnE,SAAO,YAAY,KAAK,EAAE,KAAK,CAAC,UAAU,MAAM,MAAM;AACxD;",
6
6
  "names": []
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-ecoverse/slicc-agent",
3
- "version": "3.41.0",
3
+ "version": "3.42.0",
4
4
  "description": "SLICC's agent core on pi durable: an agent worker, session storage, remoting and pi extensions",
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",
@@ -46,6 +46,8 @@ A scoop starts with your provider, model and thinking level. Use `--model provid
46
46
 
47
47
  `models` lists the models you can use, `models current` prints yours, and `models use <provider/model> [--thinking <level>]` switches your own model, as the Settings picker does.
48
48
 
49
+ `panel list` shows the panels of the SLICC tab showing your cone, and `panel open|close|focus|move <id>` rearranges them (`panel --help` has the rest). Exit 3 means no tab shows your cone, and exit 4 means the tab didn't answer.
50
+
49
51
  Without `--tools`, a scoop gets read, write, edit and bash; `--tools read,bash` is an allowlist. grep, find and ls map to bash, and bash can change files, so no tool list is truly read-only. A scoop's read, write and edit tools reach only its folder, /tmp and its working folder, and read /home; its bash is not confined, and the scoop is told so.
50
52
 
51
53
  ## Inspect, talk, stop
@@ -55,4 +55,4 @@ sprinkle show <name> # show it in your chat, inline
55
55
  sprinkle own <name> [<agent>] # send its licks to an agent: cone, cone-<n> or a scoop's handle
56
56
  ```
57
57
 
58
- To retire a sprinkle, delete its file. v6's `sprinkle open`, `reload`, `send`, `close` and `chat` don't exist here; the command says what to do instead.
58
+ To retire a sprinkle, delete its file. `sprinkle open <name>` and `sprinkle close <name>` are `panel open sprinkle:<name>` and `panel close sprinkle:<name>`. v6's `reload`, `send` and `chat` don't exist here; the command says what to do instead.