@ai-ecoverse/slicc-agent 3.21.0 → 3.21.1

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.
@@ -137,9 +137,12 @@ function attachChanges(options) {
137
137
  const live = [];
138
138
  for (const repo of repos) {
139
139
  const found = await statusOf(env, repo, context);
140
- if (!found) continue;
140
+ if (!found) {
141
+ const still = await env.exists(joined(repo, ".git"), context);
142
+ if (!still.ok || !still.value) continue;
143
+ }
141
144
  live.push(repo);
142
- changes.push(...found);
145
+ changes.push(...found ?? view.value.changes.filter((change2) => change2.repo === repo));
143
146
  }
144
147
  repos = live;
145
148
  view.replace(context, { unavailable: live.length ? null : NO_REPO, changes });
@@ -163,19 +166,20 @@ function attachChanges(options) {
163
166
  clearTimeout(timer);
164
167
  timer = setTimeout(() => void kick(context), options.reloadMs);
165
168
  };
166
- const find = async (path, context) => {
167
- await refresh(context);
168
- const change = view.value.changes.find((item) => item.path === path);
169
- if (!change) throw new Error(`${path} has no pending change`);
170
- return change;
171
- };
169
+ const change = (path, context, act) => serial(async () => {
170
+ await scan(context);
171
+ const found = view.value.changes.find((item) => item.path === path);
172
+ if (!found) throw new Error(`${path} has no pending change`);
173
+ await act(found);
174
+ await scan(context);
175
+ });
172
176
  const start = async (context) => {
173
177
  await refresh(context);
174
178
  const watched = await env.watch(
175
179
  WATCHED.map((path) => ({ path, recursive: true, exclude: { names: ["node_modules"] } })),
176
- (change) => {
180
+ (change2) => {
177
181
  const known = repos ?? [];
178
- const paths = "paths" in change ? change.paths.filter((path) => !noise(path, known)) : null;
182
+ const paths = "paths" in change2 ? change2.paths.filter((path) => !noise(path, known)) : null;
179
183
  if (paths?.length === 0) return;
180
184
  if (!paths || rediscovers(paths, known)) repos = null;
181
185
  later(context);
@@ -194,27 +198,23 @@ function attachChanges(options) {
194
198
  opened ??= start(context);
195
199
  return opened;
196
200
  },
197
- async accept(path, context) {
198
- const change = await find(path, context);
199
- const rel = relative(change.path, change.repo);
200
- const ran = await run(env, ["git", "add", "-A", "--", rel], change.repo, context);
201
+ accept: (path, context) => change(path, context, async (found) => {
202
+ const rel = relative(found.path, found.repo);
203
+ const ran = await run(env, ["git", "add", "-A", "--", rel], found.repo, context);
201
204
  if (ran.code !== 0) throw failure(ran, `git add ${rel}`);
202
- await refresh(context);
203
- },
204
- async revert(path, context) {
205
- const change = await find(path, context);
206
- const rel = relative(change.path, change.repo);
207
- if (change.kind === "conflict")
208
- throw new Error(`${change.path} has a merge conflict; resolve it with git first.`);
209
- if (change.kind === "untracked") {
210
- const removed = await env.remove(change.path, { force: true }, context);
205
+ }),
206
+ revert: (path, context) => change(path, context, async (found) => {
207
+ const rel = relative(found.path, found.repo);
208
+ if (found.kind === "conflict")
209
+ throw new Error(`${found.path} has a merge conflict; resolve it with git first.`);
210
+ if (found.kind === "untracked") {
211
+ const removed = await env.remove(found.path, { force: true }, context);
211
212
  if (!removed.ok) throw removed.error;
212
213
  } else {
213
- const ran = await run(env, ["git", "restore", "--", rel], change.repo, context);
214
+ const ran = await run(env, ["git", "restore", "--", rel], found.repo, context);
214
215
  if (ran.code !== 0) throw failure(ran, `git restore ${rel}`);
215
216
  }
216
- await refresh(context);
217
- },
217
+ }),
218
218
  refresh,
219
219
  async close(context) {
220
220
  clearTimeout(timer);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/changes/index.ts"],
4
- "sourcesContent": ["import { type Context, type MutableReplicatedState, replicatedState } from '@earendil-works/chord';\nimport type { ExecutionEnv, FileWatcher } from '@earendil-works/pi-durable/env';\nimport type { Agents } from '../agents.ts';\nimport { HOME } from '../kernel/env.ts';\nimport {\n type ChangesView,\n type FileChange,\n failure,\n joined,\n MAX_FILES,\n NO_GIT,\n NO_REPO,\n type Pending,\n parseStatus,\n relative,\n run,\n SCAN_DEPTH,\n SCAN_ENTRIES,\n scanned,\n shown,\n textOf,\n within,\n} from './git.ts';\n\nexport interface ChangesRuntime {\n readonly view: MutableReplicatedState<ChangesView>;\n open(context: Context): Promise<void>;\n accept(path: string, context: Context): Promise<void>;\n revert(path: string, context: Context): Promise<void>;\n refresh(context: Context): Promise<void>;\n close(context: Context): Promise<void>;\n}\n\nexport const CHANGES_MS = 500;\n\nexport interface ChangesOptions {\n env: ExecutionEnv;\n agents: Agents;\n reloadMs: number;\n}\n\nconst WATCHED = [HOME, '/mnt', '/scoops'];\nconst EXCLUDED = ['/tmp', '/var/lib/slicc'];\n\ntype Env = ChangesOptions['env'];\n\nasync function walk(env: Env, dir: string, depth: number, out: Set<string>, context: Context) {\n const listed = await env.listDir(dir, context);\n if (!listed.ok) return;\n if (listed.value.some((entry) => entry.name === '.git')) {\n out.add(dir);\n return;\n }\n if (depth >= SCAN_DEPTH) return;\n const dirs = listed.value\n .filter((entry) => entry.kind === 'directory' && scanned(entry.name))\n .slice(0, SCAN_ENTRIES);\n for (const entry of dirs) await walk(env, entry.path, depth + 1, out, context);\n}\n\nasync function cwds(agents: Agents, context: Context): Promise<string[]> {\n const state = agents.state();\n const ids = [\n state.active,\n ...Object.keys(state.cones).filter((id) => id !== state.active),\n ...Object.entries(state.scoops)\n .filter(([, scoop]) => !scoop.gone && !scoop.dropped && !scoop.frozen)\n .map(([id]) => id),\n ];\n const out: string[] = [];\n for (const id of ids) {\n const conversation = await agents.conversation(id, context);\n if (conversation) out.push((await conversation.agent(context)).cwd ?? HOME);\n }\n return out;\n}\n\nasync function discover(options: ChangesOptions, context: Context): Promise<string[]> {\n const { env } = options;\n const found: string[] = [];\n for (const cwd of await cwds(options.agents, context)) {\n const top = await run(env, ['git', 'rev-parse', '--show-toplevel'], cwd, context);\n if (top.code === 0 && top.out.trim()) found.push(top.out.trim());\n }\n const walked = new Set<string>();\n await walk(env, HOME, 0, walked, context);\n const mounts = await env.listDir('/mnt', context);\n if (mounts.ok)\n for (const mount of mounts.value)\n if (mount.kind === 'directory') await walk(env, mount.path, 0, walked, context);\n const ordered = [...found, ...[...walked].sort()];\n return [...new Set(ordered)].filter(\n (root) => !EXCLUDED.some((excluded) => within(root, excluded))\n );\n}\n\nasync function sideOf(env: Env, repo: string, pending: Pending, context: Context) {\n const path = joined(repo, pending.path);\n const before =\n pending.status === 'added'\n ? null\n : await run(env, ['git', 'show', `:${pending.path}`], repo, context).then((ran) =>\n ran.code === 0 ? shown(ran.out) : null\n );\n const read = pending.status === 'deleted' ? null : await env.readBinaryFile(path, context);\n const after = read?.ok ? textOf(read.value) : null;\n const opaque =\n (pending.status !== 'added' && before === null) ||\n (pending.status !== 'deleted' && after === null);\n return { path, before: opaque ? null : before, after: opaque ? null : after };\n}\n\nasync function statusOf(env: Env, repo: string, context: Context): Promise<FileChange[] | null> {\n const ran = await run(\n env,\n [\n 'git',\n '--no-optional-locks',\n 'status',\n '--porcelain=v1',\n '-z',\n '--untracked-files=all',\n '--ignore-submodules=all',\n ],\n repo,\n context\n );\n if (ran.code !== 0) return null;\n const out: FileChange[] = [];\n for (const pending of parseStatus(ran.out).slice(0, MAX_FILES)) {\n const side = await sideOf(env, repo, pending, context);\n out.push({ ...side, repo, status: pending.status, kind: pending.kind });\n }\n return out.sort((a, b) => a.path.localeCompare(b.path));\n}\n\nconst STATE = ['index', 'HEAD', 'refs'];\n\nfunction noise(path: string, repos: readonly string[]): boolean {\n return repos.some((repo) => {\n const git = joined(repo, '.git');\n return (\n within(path, git) &&\n path !== git &&\n !STATE.includes(relative(path, git).split('/')[0] as string)\n );\n });\n}\n\nfunction rediscovers(paths: readonly string[], repos: readonly string[]): boolean {\n return paths.some((path) => {\n const parts = path.split('/');\n const git = parts.indexOf('.git');\n if (git > 0) return !repos.includes(parts.slice(0, git).join('/') || '/');\n if (parts.some((part) => part && !scanned(part))) return false;\n return !repos.some((repo) => within(path, repo));\n });\n}\n\nexport function attachChanges(options: ChangesOptions): ChangesRuntime {\n const { env } = options;\n const view = replicatedState<ChangesView>({ unavailable: null, changes: [] });\n let repos: string[] | null = null;\n let opened: Promise<void> | null = null;\n let watcher: FileWatcher | undefined;\n let stop = () => undefined as void;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let lock: Promise<unknown> = Promise.resolve();\n const serial = <T>(work: () => Promise<T>): Promise<T> => {\n const next = lock.then(work, work);\n lock = next.catch(() => undefined);\n return next;\n };\n const scan = async (context: Context) => {\n const git = await run(env, 'command -v git', HOME, context);\n if (git.code !== 0) {\n view.replace(context, { unavailable: NO_GIT, changes: [] });\n return;\n }\n repos ??= await discover(options, context);\n const changes: FileChange[] = [];\n const live: string[] = [];\n for (const repo of repos) {\n const found = await statusOf(env, repo, context);\n if (!found) continue;\n live.push(repo);\n changes.push(...found);\n }\n repos = live;\n view.replace(context, { unavailable: live.length ? null : NO_REPO, changes });\n };\n const refresh = (context: Context) => serial(() => scan(context));\n let running = false;\n let again = false;\n const kick = async (context: Context) => {\n if (running) {\n again = true;\n return;\n }\n running = true;\n do {\n again = false;\n await refresh(context).catch(() => undefined);\n } while (again);\n running = false;\n };\n const later = (context: Context) => {\n clearTimeout(timer);\n timer = setTimeout(() => void kick(context), options.reloadMs);\n };\n const find = async (path: string, context: Context) => {\n await refresh(context);\n const change = view.value.changes.find((item) => item.path === path);\n if (!change) throw new Error(`${path} has no pending change`);\n return change;\n };\n const start = async (context: Context) => {\n await refresh(context);\n const watched = await env.watch(\n WATCHED.map((path) => ({ path, recursive: true, exclude: { names: ['node_modules'] } })),\n (change) => {\n const known = repos ?? [];\n const paths = 'paths' in change ? change.paths.filter((path) => !noise(path, known)) : null;\n if (paths?.length === 0) return;\n if (!paths || rediscovers(paths, known)) repos = null;\n later(context);\n },\n context\n );\n watcher = watched.ok ? watched.value : undefined;\n stop = options.agents.onChange(() => {\n repos = null;\n later(context);\n });\n };\n return {\n view,\n open(context) {\n opened ??= start(context);\n return opened;\n },\n async accept(path, context) {\n const change = await find(path, context);\n const rel = relative(change.path, change.repo);\n const ran = await run(env, ['git', 'add', '-A', '--', rel], change.repo, context);\n if (ran.code !== 0) throw failure(ran, `git add ${rel}`);\n await refresh(context);\n },\n async revert(path, context) {\n const change = await find(path, context);\n const rel = relative(change.path, change.repo);\n if (change.kind === 'conflict')\n throw new Error(`${change.path} has a merge conflict; resolve it with git first.`);\n if (change.kind === 'untracked') {\n const removed = await env.remove(change.path, { force: true }, context);\n if (!removed.ok) throw removed.error;\n } else {\n const ran = await run(env, ['git', 'restore', '--', rel], change.repo, context);\n if (ran.code !== 0) throw failure(ran, `git restore ${rel}`);\n }\n await refresh(context);\n },\n refresh,\n async close(context) {\n clearTimeout(timer);\n stop();\n await watcher?.close(context);\n },\n };\n}\n"],
5
- "mappings": "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",
6
- "names": []
4
+ "sourcesContent": ["import { type Context, type MutableReplicatedState, replicatedState } from '@earendil-works/chord';\nimport type { ExecutionEnv, FileWatcher } from '@earendil-works/pi-durable/env';\nimport type { Agents } from '../agents.ts';\nimport { HOME } from '../kernel/env.ts';\nimport {\n type ChangesView,\n type FileChange,\n failure,\n joined,\n MAX_FILES,\n NO_GIT,\n NO_REPO,\n type Pending,\n parseStatus,\n relative,\n run,\n SCAN_DEPTH,\n SCAN_ENTRIES,\n scanned,\n shown,\n textOf,\n within,\n} from './git.ts';\n\nexport interface ChangesRuntime {\n readonly view: MutableReplicatedState<ChangesView>;\n open(context: Context): Promise<void>;\n accept(path: string, context: Context): Promise<void>;\n revert(path: string, context: Context): Promise<void>;\n refresh(context: Context): Promise<void>;\n close(context: Context): Promise<void>;\n}\n\nexport const CHANGES_MS = 500;\n\nexport interface ChangesOptions {\n env: ExecutionEnv;\n agents: Agents;\n reloadMs: number;\n}\n\nconst WATCHED = [HOME, '/mnt', '/scoops'];\nconst EXCLUDED = ['/tmp', '/var/lib/slicc'];\n\ntype Env = ChangesOptions['env'];\n\nasync function walk(env: Env, dir: string, depth: number, out: Set<string>, context: Context) {\n const listed = await env.listDir(dir, context);\n if (!listed.ok) return;\n if (listed.value.some((entry) => entry.name === '.git')) {\n out.add(dir);\n return;\n }\n if (depth >= SCAN_DEPTH) return;\n const dirs = listed.value\n .filter((entry) => entry.kind === 'directory' && scanned(entry.name))\n .slice(0, SCAN_ENTRIES);\n for (const entry of dirs) await walk(env, entry.path, depth + 1, out, context);\n}\n\nasync function cwds(agents: Agents, context: Context): Promise<string[]> {\n const state = agents.state();\n const ids = [\n state.active,\n ...Object.keys(state.cones).filter((id) => id !== state.active),\n ...Object.entries(state.scoops)\n .filter(([, scoop]) => !scoop.gone && !scoop.dropped && !scoop.frozen)\n .map(([id]) => id),\n ];\n const out: string[] = [];\n for (const id of ids) {\n const conversation = await agents.conversation(id, context);\n if (conversation) out.push((await conversation.agent(context)).cwd ?? HOME);\n }\n return out;\n}\n\nasync function discover(options: ChangesOptions, context: Context): Promise<string[]> {\n const { env } = options;\n const found: string[] = [];\n for (const cwd of await cwds(options.agents, context)) {\n const top = await run(env, ['git', 'rev-parse', '--show-toplevel'], cwd, context);\n if (top.code === 0 && top.out.trim()) found.push(top.out.trim());\n }\n const walked = new Set<string>();\n await walk(env, HOME, 0, walked, context);\n const mounts = await env.listDir('/mnt', context);\n if (mounts.ok)\n for (const mount of mounts.value)\n if (mount.kind === 'directory') await walk(env, mount.path, 0, walked, context);\n const ordered = [...found, ...[...walked].sort()];\n return [...new Set(ordered)].filter(\n (root) => !EXCLUDED.some((excluded) => within(root, excluded))\n );\n}\n\nasync function sideOf(env: Env, repo: string, pending: Pending, context: Context) {\n const path = joined(repo, pending.path);\n const before =\n pending.status === 'added'\n ? null\n : await run(env, ['git', 'show', `:${pending.path}`], repo, context).then((ran) =>\n ran.code === 0 ? shown(ran.out) : null\n );\n const read = pending.status === 'deleted' ? null : await env.readBinaryFile(path, context);\n const after = read?.ok ? textOf(read.value) : null;\n const opaque =\n (pending.status !== 'added' && before === null) ||\n (pending.status !== 'deleted' && after === null);\n return { path, before: opaque ? null : before, after: opaque ? null : after };\n}\n\nasync function statusOf(env: Env, repo: string, context: Context): Promise<FileChange[] | null> {\n const ran = await run(\n env,\n [\n 'git',\n '--no-optional-locks',\n 'status',\n '--porcelain=v1',\n '-z',\n '--untracked-files=all',\n '--ignore-submodules=all',\n ],\n repo,\n context\n );\n if (ran.code !== 0) return null;\n const out: FileChange[] = [];\n for (const pending of parseStatus(ran.out).slice(0, MAX_FILES)) {\n const side = await sideOf(env, repo, pending, context);\n out.push({ ...side, repo, status: pending.status, kind: pending.kind });\n }\n return out.sort((a, b) => a.path.localeCompare(b.path));\n}\n\nconst STATE = ['index', 'HEAD', 'refs'];\n\nfunction noise(path: string, repos: readonly string[]): boolean {\n return repos.some((repo) => {\n const git = joined(repo, '.git');\n return (\n within(path, git) &&\n path !== git &&\n !STATE.includes(relative(path, git).split('/')[0] as string)\n );\n });\n}\n\nfunction rediscovers(paths: readonly string[], repos: readonly string[]): boolean {\n return paths.some((path) => {\n const parts = path.split('/');\n const git = parts.indexOf('.git');\n if (git > 0) return !repos.includes(parts.slice(0, git).join('/') || '/');\n if (parts.some((part) => part && !scanned(part))) return false;\n return !repos.some((repo) => within(path, repo));\n });\n}\n\nexport function attachChanges(options: ChangesOptions): ChangesRuntime {\n const { env } = options;\n const view = replicatedState<ChangesView>({ unavailable: null, changes: [] });\n let repos: string[] | null = null;\n let opened: Promise<void> | null = null;\n let watcher: FileWatcher | undefined;\n let stop = () => undefined as void;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let lock: Promise<unknown> = Promise.resolve();\n const serial = <T>(work: () => Promise<T>): Promise<T> => {\n const next = lock.then(work, work);\n lock = next.catch(() => undefined);\n return next;\n };\n const scan = async (context: Context) => {\n const git = await run(env, 'command -v git', HOME, context);\n if (git.code !== 0) {\n view.replace(context, { unavailable: NO_GIT, changes: [] });\n return;\n }\n repos ??= await discover(options, context);\n const changes: FileChange[] = [];\n const live: string[] = [];\n for (const repo of repos) {\n const found = await statusOf(env, repo, context);\n if (!found) {\n const still = await env.exists(joined(repo, '.git'), context);\n if (!still.ok || !still.value) continue;\n }\n live.push(repo);\n changes.push(...(found ?? view.value.changes.filter((change) => change.repo === repo)));\n }\n repos = live;\n view.replace(context, { unavailable: live.length ? null : NO_REPO, changes });\n };\n const refresh = (context: Context) => serial(() => scan(context));\n let running = false;\n let again = false;\n const kick = async (context: Context) => {\n if (running) {\n again = true;\n return;\n }\n running = true;\n do {\n again = false;\n await refresh(context).catch(() => undefined);\n } while (again);\n running = false;\n };\n const later = (context: Context) => {\n clearTimeout(timer);\n timer = setTimeout(() => void kick(context), options.reloadMs);\n };\n const change = (path: string, context: Context, act: (found: FileChange) => Promise<void>) =>\n serial(async () => {\n await scan(context);\n const found = view.value.changes.find((item) => item.path === path);\n if (!found) throw new Error(`${path} has no pending change`);\n await act(found);\n await scan(context);\n });\n const start = async (context: Context) => {\n await refresh(context);\n const watched = await env.watch(\n WATCHED.map((path) => ({ path, recursive: true, exclude: { names: ['node_modules'] } })),\n (change) => {\n const known = repos ?? [];\n const paths = 'paths' in change ? change.paths.filter((path) => !noise(path, known)) : null;\n if (paths?.length === 0) return;\n if (!paths || rediscovers(paths, known)) repos = null;\n later(context);\n },\n context\n );\n watcher = watched.ok ? watched.value : undefined;\n stop = options.agents.onChange(() => {\n repos = null;\n later(context);\n });\n };\n return {\n view,\n open(context) {\n opened ??= start(context);\n return opened;\n },\n accept: (path, context) =>\n change(path, context, async (found) => {\n const rel = relative(found.path, found.repo);\n const ran = await run(env, ['git', 'add', '-A', '--', rel], found.repo, context);\n if (ran.code !== 0) throw failure(ran, `git add ${rel}`);\n }),\n revert: (path, context) =>\n change(path, context, async (found) => {\n const rel = relative(found.path, found.repo);\n if (found.kind === 'conflict')\n throw new Error(`${found.path} has a merge conflict; resolve it with git first.`);\n if (found.kind === 'untracked') {\n const removed = await env.remove(found.path, { force: true }, context);\n if (!removed.ok) throw removed.error;\n } else {\n const ran = await run(env, ['git', 'restore', '--', rel], found.repo, context);\n if (ran.code !== 0) throw failure(ran, `git restore ${rel}`);\n }\n }),\n refresh,\n async close(context) {\n clearTimeout(timer);\n stop();\n await watcher?.close(context);\n },\n };\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["change"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-ecoverse/slicc-agent",
3
- "version": "3.21.0",
3
+ "version": "3.21.1",
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",
@@ -63,7 +63,7 @@
63
63
  "devDependencies": {
64
64
  "@ai-ecoverse/slicc-kernel": "1.23.0",
65
65
  "@ai-ecoverse/slicc-shared-web": "1.10.0",
66
- "@ai-ecoverse/slicc-spectrum": "1.37.0",
66
+ "@ai-ecoverse/slicc-spectrum": "1.37.1",
67
67
  "@ai-ecoverse/wasm-bash": "5.3.0-8",
68
68
  "@ai-ecoverse/wasm-coreutils": "9.7.0-3",
69
69
  "@ai-ecoverse/wasm-git": "2.55.0-9",