pikiloom 0.4.60 → 0.4.62

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 (31) hide show
  1. package/package.json +2 -1
  2. package/packages/kernel/README.md +20 -7
  3. package/packages/kernel/dist/drivers/acp.js +30 -163
  4. package/packages/kernel/dist/drivers/claude.d.ts +4 -21
  5. package/packages/kernel/dist/drivers/claude.js +88 -57
  6. package/packages/kernel/dist/drivers/codex.d.ts +0 -10
  7. package/packages/kernel/dist/drivers/codex.js +47 -144
  8. package/packages/kernel/dist/drivers/gemini.js +9 -27
  9. package/packages/kernel/dist/drivers/hermes.d.ts +1 -2
  10. package/packages/kernel/dist/drivers/hermes.js +1 -4
  11. package/packages/kernel/dist/drivers/index.d.ts +5 -4
  12. package/packages/kernel/dist/drivers/index.js +8 -4
  13. package/packages/kernel/dist/{workspace → drivers}/native.d.ts +0 -1
  14. package/packages/kernel/dist/{workspace → drivers}/native.js +1 -1
  15. package/packages/kernel/dist/drivers/rpc.d.ts +45 -0
  16. package/packages/kernel/dist/drivers/rpc.js +130 -0
  17. package/packages/kernel/dist/drivers/shared.d.ts +21 -0
  18. package/packages/kernel/dist/drivers/shared.js +66 -0
  19. package/packages/kernel/dist/index.d.ts +2 -1
  20. package/packages/kernel/dist/index.js +10 -2
  21. package/packages/kernel/dist/protocol/index.d.ts +5 -0
  22. package/packages/kernel/dist/protocol/index.js +10 -0
  23. package/packages/kernel/dist/runtime/hub.js +4 -8
  24. package/packages/kernel/dist/workspace/index.d.ts +1 -2
  25. package/packages/kernel/dist/workspace/index.js +3 -2
  26. package/packages/kernel/dist/workspace/mcp.js +6 -16
  27. package/packages/kernel/dist/workspace/npm-search.d.ts +9 -0
  28. package/packages/kernel/dist/workspace/npm-search.js +21 -0
  29. package/packages/kernel/dist/workspace/sessions.js +6 -9
  30. package/packages/kernel/dist/workspace/skills.d.ts +11 -0
  31. package/packages/kernel/dist/workspace/skills.js +14 -20
@@ -1,8 +1,5 @@
1
1
  import path from 'node:path';
2
- function splitKey(sessionKey) {
3
- const i = sessionKey.indexOf(':');
4
- return i < 0 ? { agent: '', sessionId: sessionKey } : { agent: sessionKey.slice(0, i), sessionId: sessionKey.slice(i + 1) };
5
- }
2
+ import { makeSessionKey, splitSessionKey } from '../protocol/index.js';
6
3
  function ts(iso) {
7
4
  if (!iso)
8
5
  return 0;
@@ -14,7 +11,7 @@ function newer(a, b) {
14
11
  }
15
12
  function managedToInfo(agent, rec) {
16
13
  return {
17
- sessionKey: `${agent}:${rec.sessionId}`,
14
+ sessionKey: makeSessionKey(agent, rec.sessionId),
18
15
  agent,
19
16
  sessionId: rec.sessionId,
20
17
  title: rec.title ?? null,
@@ -31,7 +28,7 @@ function managedToInfo(agent, rec) {
31
28
  }
32
29
  function nativeToInfo(agent, n) {
33
30
  return {
34
- sessionKey: `${agent}:${n.sessionId}`,
31
+ sessionKey: makeSessionKey(agent, n.sessionId),
35
32
  agent,
36
33
  sessionId: n.sessionId,
37
34
  title: n.title,
@@ -72,7 +69,7 @@ export class SessionsManager {
72
69
  if (!rec.workdir || path.resolve(rec.workdir) !== workdir)
73
70
  continue;
74
71
  }
75
- byKey.set(`${agent}:${rec.sessionId}`, managedToInfo(agent, rec));
72
+ byKey.set(makeSessionKey(agent, rec.sessionId), managedToInfo(agent, rec));
76
73
  }
77
74
  }
78
75
  // Native sessions (the agents' own stores) — inherently per-workdir.
@@ -89,7 +86,7 @@ export class SessionsManager {
89
86
  this.deps.log?.(`[sessions] ${agent}.listNativeSessions failed: ${e?.message || e}`);
90
87
  }
91
88
  for (const n of natives) {
92
- const key = `${agent}:${n.sessionId}`;
89
+ const key = makeSessionKey(agent, n.sessionId);
93
90
  const existing = byKey.get(key);
94
91
  if (existing) {
95
92
  // Same identity discovered both ways: managed record wins, but adopt the newer
@@ -118,7 +115,7 @@ export class SessionsManager {
118
115
  return typeof opts.limit === 'number' ? matched.slice(0, Math.max(0, opts.limit)) : matched;
119
116
  }
120
117
  async get(sessionKey, opts = {}) {
121
- const { agent, sessionId } = splitKey(sessionKey);
118
+ const { agent, sessionId } = splitSessionKey(sessionKey);
122
119
  if (!agent)
123
120
  return null;
124
121
  const rec = await this.deps.store.get(agent, sessionId).catch(() => null);
@@ -21,6 +21,17 @@ export interface SkillsManagerOptions {
21
21
  agentSkillDirs?: string[];
22
22
  log?: (msg: string) => void;
23
23
  }
24
+ export interface SkillMeta {
25
+ label: string | null;
26
+ description: string | null;
27
+ mcpRequires?: string[];
28
+ }
29
+ /**
30
+ * Parse a SKILL.md's frontmatter (label/name + description + mcp_requires), falling back
31
+ * to the first `# heading` for the label. Exported so an app scanning additional skill
32
+ * stores (e.g. an agent's own ~/.claude/skills) reads them with the same rules.
33
+ */
34
+ export declare function parseSkillMeta(content: string): SkillMeta;
24
35
  /** Make `linkPath` a symlink to `targetDir` (idempotent; replaces a stale link/dir). */
25
36
  export declare function ensureDirSymlink(linkPath: string, targetDir: string): void;
26
37
  export declare class SkillsManager {
@@ -1,13 +1,20 @@
1
1
  import fs from 'node:fs';
2
2
  import path from 'node:path';
3
+ import { searchNpmPackages } from './npm-search.js';
3
4
  const DEFAULT_AGENT_SKILL_DIRS = ['.claude/skills', '.agents/skills'];
4
- function parseSkillMeta(content) {
5
+ /**
6
+ * Parse a SKILL.md's frontmatter (label/name + description + mcp_requires), falling back
7
+ * to the first `# heading` for the label. Exported so an app scanning additional skill
8
+ * stores (e.g. an agent's own ~/.claude/skills) reads them with the same rules.
9
+ */
10
+ export function parseSkillMeta(content) {
5
11
  let label = null;
6
12
  let description = null;
7
13
  let mcpRequires;
8
14
  const fm = content.match(/^---\s*\n([\s\S]*?)\n---/);
9
15
  if (fm) {
10
- const lm = fm[1].match(/^label:\s*(.+)/m);
16
+ // Both frontmatter dialects: pikiloom's `label:` and the agent-native `name:`.
17
+ const lm = fm[1].match(/^label:\s*(.+)/m) || fm[1].match(/^name:\s*(.+)/m);
11
18
  if (lm)
12
19
  label = lm[1].trim();
13
20
  const dm = fm[1].match(/^description:\s*(.+)/m);
@@ -145,25 +152,12 @@ export class SkillsManager {
145
152
  /** Search installable skills on the npm registry (best-effort; [] on failure). */
146
153
  async search(query, limit = 20) {
147
154
  const q = (query || '').trim();
148
- const text = encodeURIComponent(`agent skill ${q}`.trim());
149
- const url = `https://registry.npmjs.org/-/v1/search?text=${text}&size=${Math.max(1, Math.min(50, limit))}`;
150
155
  try {
151
- const res = await fetch(url, { headers: { accept: 'application/json' } });
152
- if (!res.ok)
153
- return [];
154
- const data = await res.json();
155
- const objects = Array.isArray(data?.objects) ? data.objects : [];
156
- return objects.map((o) => {
157
- const pkg = o?.package ?? {};
158
- return {
159
- name: String(pkg.name ?? ''),
160
- description: pkg.description ?? null,
161
- source: 'npm',
162
- author: pkg.publisher?.username ?? pkg.author?.name ?? null,
163
- homepage: pkg.links?.homepage ?? pkg.links?.npm ?? null,
164
- version: pkg.version ?? null,
165
- };
166
- }).filter(s => s.name);
156
+ const hits = await searchNpmPackages(`agent skill ${q}`.trim(), Math.max(1, Math.min(50, limit)), fetch);
157
+ return hits.map(h => ({
158
+ name: h.name, description: h.description, source: 'npm',
159
+ author: h.author, homepage: h.homepage, version: h.version,
160
+ }));
167
161
  }
168
162
  catch (e) {
169
163
  this.log?.(`[skills] search failed: ${e?.message || e}`);