@harsh132/crew-ai 0.1.0 → 0.1.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.
package/README.md CHANGED
@@ -33,7 +33,7 @@ This runs on **testnets** — Arc testnet for payments and Sepolia for ENS names
33
33
  | `CREW_NETWORK` | `eip155:5042002` | Payment network (Arc testnet) |
34
34
  | `CREW_BACKEND` | the hosted crew backend | Names and organizations |
35
35
  | `CREW_AUTO_DEPOSIT` | on | Set to `off` to stop auto-depositing into Gateway |
36
- | `EDGEROUTER_HOME` | `~/.edgerouter` | Where the crew's key and data are kept |
36
+ | `CREW_HOME` | `~/.crew-ai` | Where the crew's key and data are kept |
37
37
 
38
38
  `crew --help` lists them too.
39
39
 
package/bin/crew.mjs CHANGED
@@ -32,11 +32,11 @@ Environment
32
32
  CREW_GATE inference gate URL
33
33
  CREW_BACKEND crew backend URL, for names and organizations
34
34
  CREW_AUTO_DEPOSIT set to "off" to stop depositing wallet USDC into Gateway
35
- EDGEROUTER_HOME where the crew's key and data live (default ~/.edgerouter)
35
+ CREW_HOME where the crew's key and data live (default ~/.crew-ai)
36
36
 
37
37
  Your crew's key is derived from your wallet's signature and cached in
38
- EDGEROUTER_HOME. Sign in with the same wallet on any computer to get the same
39
- crew back.`);
38
+ CREW_HOME. Sign in with the same wallet on any computer to get the same crew
39
+ back.`);
40
40
  process.exit(0);
41
41
  }
42
42
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@harsh132/crew-ai",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "A crew of AI agents that pay per call in USDC, each with its own ENS name and a budget it cannot raise.",
5
5
  "type": "module",
6
6
  "bin": {
package/server/main.mjs CHANGED
@@ -139227,6 +139227,30 @@ var payFromTab = async (url, options) => {
139227
139227
  // apps/crew/server/crew.ts
139228
139228
  import { randomUUID as randomUUID2 } from "node:crypto";
139229
139229
 
139230
+ // apps/crew/server/home.ts
139231
+ import { cpSync, existsSync as existsSync2, mkdirSync as mkdirSync2 } from "node:fs";
139232
+ import { homedir as homedir2 } from "node:os";
139233
+ import { join as join2 } from "node:path";
139234
+ var CREW_HOME = process.env.CREW_HOME ?? join2(homedir2(), ".crew-ai");
139235
+ var EARLIER_HOME = join2(homedir2(), ".edgerouter");
139236
+ var CARRIED = ["wallet.json", "crew.json", "workspaces"];
139237
+ var adoptEarlierCrew = () => {
139238
+ if (process.env.CREW_HOME || existsSync2(CREW_HOME))
139239
+ return [];
139240
+ if (!existsSync2(join2(EARLIER_HOME, "crew.json")))
139241
+ return [];
139242
+ mkdirSync2(CREW_HOME, { recursive: true, mode: 448 });
139243
+ const carried = [];
139244
+ for (const entry of CARRIED) {
139245
+ const from16 = join2(EARLIER_HOME, entry);
139246
+ if (!existsSync2(from16))
139247
+ continue;
139248
+ cpSync(from16, join2(CREW_HOME, entry), { recursive: true, force: false, errorOnExist: false });
139249
+ carried.push(entry);
139250
+ }
139251
+ return carried;
139252
+ };
139253
+
139230
139254
  // packages/ens/src/deployment.ts
139231
139255
  var ENS_NETWORK = "eip155:11155111";
139232
139256
  var ENS = {
@@ -140638,11 +140662,10 @@ var ensureAgentName = async (clients, params) => {
140638
140662
  return { ...agent, minted: true };
140639
140663
  };
140640
140664
  // apps/crew/server/store.ts
140641
- import { mkdirSync as mkdirSync2, readFileSync as readFileSync2, writeFileSync as writeFileSync2, renameSync } from "node:fs";
140642
- import { homedir as homedir2 } from "node:os";
140643
- import { join as join2 } from "node:path";
140644
- var HOME = process.env.EDGEROUTER_HOME ?? join2(homedir2(), ".edgerouter");
140645
- var FILE = join2(HOME, "crew.json");
140665
+ import { mkdirSync as mkdirSync3, readFileSync as readFileSync2, writeFileSync as writeFileSync2, renameSync } from "node:fs";
140666
+ import { join as join3 } from "node:path";
140667
+ var HOME = CREW_HOME;
140668
+ var FILE = join3(HOME, "crew.json");
140646
140669
  var EMPTY = { version: 1, agents: [], projects: [] };
140647
140670
  var load = () => {
140648
140671
  try {
@@ -140663,7 +140686,7 @@ var load = () => {
140663
140686
  }
140664
140687
  };
140665
140688
  var save = (crew) => {
140666
- mkdirSync2(HOME, { recursive: true });
140689
+ mkdirSync3(HOME, { recursive: true });
140667
140690
  const temporary = `${FILE}.${process.pid}.tmp`;
140668
140691
  writeFileSync2(temporary, `${JSON.stringify(crew, null, 2)}
140669
140692
  `, "utf8");
@@ -140700,14 +140723,14 @@ var isPermission = (value) => (value in PERMISSIONS);
140700
140723
  var knownOnly = (asked) => asked.filter(isPermission);
140701
140724
 
140702
140725
  // apps/crew/server/projects.ts
140703
- import { existsSync as existsSync2, statSync } from "node:fs";
140726
+ import { existsSync as existsSync3, statSync } from "node:fs";
140704
140727
  import { realpath } from "node:fs/promises";
140705
140728
  import { homedir as homedir3 } from "node:os";
140706
- import { isAbsolute, join as join3, relative, resolve, sep } from "node:path";
140729
+ import { isAbsolute, join as join4, relative, resolve, sep } from "node:path";
140707
140730
  import { randomUUID } from "node:crypto";
140708
140731
  var HOME2 = homedir3();
140709
- var RUNTIME_HOME = join3(HOME2, ".edgerouter");
140710
- var WORKSPACES = join3(RUNTIME_HOME, "workspaces");
140732
+ var RUNTIME_HOME = CREW_HOME;
140733
+ var WORKSPACES = join4(RUNTIME_HOME, "workspaces");
140711
140734
  var newProjectId = () => `prj_${randomUUID().replace(/-/g, "").slice(0, 8)}`;
140712
140735
  var FORBIDDEN = [
140713
140736
  { test: (path) => within(RUNTIME_HOME, path) && !within(WORKSPACES, path), why: "the runtime keeps its wallet and its records there" },
@@ -140731,14 +140754,14 @@ var resolveIn = async (roots, asked, need) => {
140731
140754
  throw new Error("you have not been given access to any files");
140732
140755
  const target = isAbsolute(asked) ? resolve(asked) : resolve(roots[0].root, asked);
140733
140756
  let existing = target;
140734
- while (!existsSync2(existing)) {
140757
+ while (!existsSync3(existing)) {
140735
140758
  const up = resolve(existing, "..");
140736
140759
  if (up === existing)
140737
140760
  break;
140738
140761
  existing = up;
140739
140762
  }
140740
- const real = existsSync2(existing) ? await realpath(existing) : existing;
140741
- const realTarget = existing === target ? real : join3(real, relative(existing, target));
140763
+ const real = existsSync3(existing) ? await realpath(existing) : existing;
140764
+ const realTarget = existing === target ? real : join4(real, relative(existing, target));
140742
140765
  const grant = roots.find((candidate) => within(candidate.root, realTarget));
140743
140766
  if (!grant) {
140744
140767
  throw new Error(`${asked} is outside everything you have been given access to`);
@@ -140760,7 +140783,7 @@ var resolveIn = async (roots, asked, need) => {
140760
140783
  };
140761
140784
  var describeGrant = (path) => {
140762
140785
  const resolved = resolve(path.trim());
140763
- if (!existsSync2(resolved))
140786
+ if (!existsSync3(resolved))
140764
140787
  throw new Error(`${resolved} does not exist`);
140765
140788
  if (!statSync(resolved).isDirectory())
140766
140789
  throw new Error(`${resolved} is not a directory`);
@@ -140773,7 +140796,7 @@ var describeGrant = (path) => {
140773
140796
  } : {}
140774
140797
  };
140775
140798
  };
140776
- var workspacePathFor = (label) => join3(WORKSPACES, label);
140799
+ var workspacePathFor = (label) => join4(WORKSPACES, label);
140777
140800
 
140778
140801
  // apps/crew/server/events.ts
140779
140802
  var listeners = new Set;
@@ -140808,7 +140831,7 @@ var openWallet2 = async (network, gate) => {
140808
140831
  if (!network.startsWith("eip155:")) {
140809
140832
  throw new Error(`Crew pays in USDC on EVM chains; ${network} is not one. Unset CREW_NETWORK to use Arc.`);
140810
140833
  }
140811
- const stored = readSharedWallet();
140834
+ const stored = readSharedWallet(CREW_HOME);
140812
140835
  if (!stored)
140813
140836
  throw new Error("no signer key — unlock the crew with your wallet");
140814
140837
  const wallet2 = openEvmWallet({ privateKey: `0x${stored.privateKey}`, address: stored.address, network });
@@ -140886,7 +140909,7 @@ var autoDeposit = (network, onChange) => {
140886
140909
  return inFlight;
140887
140910
  if (Date.now() - lastFailureAt < RETRY_AFTER_MS)
140888
140911
  return Promise.resolve(null);
140889
- const stored = readSharedWallet();
140912
+ const stored = readSharedWallet(CREW_HOME);
140890
140913
  if (!stored)
140891
140914
  return Promise.resolve(null);
140892
140915
  const privateKey = `0x${stored.privateKey}`;
@@ -140945,7 +140968,7 @@ var nameGasOf = async (naming) => {
140945
140968
  if (!naming)
140946
140969
  return null;
140947
140970
  try {
140948
- const ens = openEnsSigner();
140971
+ const ens = openEnsSigner({ home: CREW_HOME });
140949
140972
  return await ens.public.getBalance({ address: ens.address });
140950
140973
  } catch {
140951
140974
  return;
@@ -140973,7 +140996,7 @@ var signerMayRegister = async (ens, registry, resolver) => {
140973
140996
  }
140974
140997
  };
140975
140998
  var setIdentity = async (runtime, name, derivedFrom) => {
140976
- const ens = openEnsSigner();
140999
+ const ens = openEnsSigner({ home: CREW_HOME });
140977
141000
  const client5 = createEnsClient();
140978
141001
  const registry = await registryOf(ens.public, name);
140979
141002
  if (!registry)
@@ -141040,7 +141063,7 @@ var boot = async (options) => {
141040
141063
  let naming = false;
141041
141064
  if (identity) {
141042
141065
  try {
141043
- const ens = openEnsSigner();
141066
+ const ens = openEnsSigner({ home: CREW_HOME });
141044
141067
  const registry = await registryOf(ens.public, identity.name);
141045
141068
  naming = registry !== null && registry.toLowerCase() === identity.registry.toLowerCase() && await signerMayRegister(ens, registry, identity.resolver);
141046
141069
  } catch {
@@ -141158,7 +141181,7 @@ var hire = async (runtime, params) => {
141158
141181
  if (runtime.naming && runtime.root) {
141159
141182
  emit({ type: "log", text: `minting ${label}.${runtime.root} …` });
141160
141183
  try {
141161
- const ens = openEnsSigner();
141184
+ const ens = openEnsSigner({ home: CREW_HOME });
141162
141185
  const named = await ensureAgentName({ public: ens.public, wallet: ens.wallet }, {
141163
141186
  label,
141164
141187
  parent: runtime.root,
@@ -141221,7 +141244,7 @@ var update2 = async (runtime, id, changes) => {
141221
141244
  if (changed && agent2.name && agent2.ensResolver) {
141222
141245
  emit({ type: "log", text: `publishing ${agent2.name}'s permissions …` });
141223
141246
  try {
141224
- const ens = openEnsSigner();
141247
+ const ens = openEnsSigner({ home: CREW_HOME });
141225
141248
  await setText({ public: ens.public, wallet: ens.wallet }, {
141226
141249
  resolver: agent2.ensResolver,
141227
141250
  name: agent2.name,
@@ -141274,7 +141297,7 @@ var update2 = async (runtime, id, changes) => {
141274
141297
  if (agent2.name && agent2.ensResolver && Object.keys(profile).length > 0) {
141275
141298
  emit({ type: "log", text: `updating ${agent2.name} …` });
141276
141299
  try {
141277
- const ens = openEnsSigner();
141300
+ const ens = openEnsSigner({ home: CREW_HOME });
141278
141301
  await setProfile({ public: ens.public, wallet: ens.wallet }, { resolver: agent2.ensResolver, name: agent2.name, ...profile });
141279
141302
  } catch (error) {
141280
141303
  emit({ type: "log", text: `${agent2.name} kept its old records: ${error.message}` });
@@ -141292,7 +141315,7 @@ var fire = async (runtime, id) => {
141292
141315
  if (agent2.name && agent2.ensParentRegistry) {
141293
141316
  emit({ type: "log", text: `clearing ${agent2.name} …` });
141294
141317
  try {
141295
- const ens = openEnsSigner();
141318
+ const ens = openEnsSigner({ home: CREW_HOME });
141296
141319
  const resolver = agent2.ensResolver ?? await createEnsClient().resolverOf(agent2.name) ?? undefined;
141297
141320
  await revokeAgentName({ public: ens.public, wallet: ens.wallet }, {
141298
141321
  parentRegistry: agent2.ensParentRegistry,
@@ -152216,7 +152239,7 @@ var modelFor = (gate, id2) => ({
152216
152239
  id: id2,
152217
152240
  name: id2,
152218
152241
  api: "openai-completions",
152219
- provider: "edgerouter",
152242
+ provider: "gate",
152220
152243
  baseUrl: new URL("/v1", gate).toString(),
152221
152244
  reasoning: false,
152222
152245
  input: ["text"],
@@ -152389,16 +152412,15 @@ var abandon = (agentId) => {
152389
152412
  };
152390
152413
 
152391
152414
  // apps/crew/server/tools.ts
152392
- import { mkdirSync as mkdirSync3 } from "node:fs";
152415
+ import { mkdirSync as mkdirSync4 } from "node:fs";
152393
152416
  import { readFile, writeFile, readdir, stat, mkdir } from "node:fs/promises";
152394
- import { homedir as homedir4 } from "node:os";
152395
- import { join as join4, dirname as dirname2, relative as relative2 } from "node:path";
152396
- var WORKSPACES2 = join4(homedir4(), ".edgerouter", "workspaces");
152417
+ import { join as join5, dirname as dirname2, relative as relative2 } from "node:path";
152418
+ var WORKSPACES2 = join5(CREW_HOME, "workspaces");
152397
152419
  var SKIP = /^(node_modules|\.git|\.next|dist|build|target|vendor|\.venv|__pycache__|\.cache|AppData|Windows|System32)$/i;
152398
152420
  var MAX_READ = 64 * 1024;
152399
152421
  var workspaceFor = (label) => {
152400
- const room = join4(WORKSPACES2, label);
152401
- mkdirSync3(room, { recursive: true });
152422
+ const room = join5(WORKSPACES2, label);
152423
+ mkdirSync4(room, { recursive: true });
152402
152424
  return room;
152403
152425
  };
152404
152426
  var said = (text) => ({ content: [{ type: "text", text }] });
@@ -152448,7 +152470,7 @@ var toolsFor = ({
152448
152470
  const lines = await Promise.all(entries.map(async (entry) => {
152449
152471
  if (entry.isDirectory())
152450
152472
  return `${entry.name}/`;
152451
- const info = await stat(join4(target2, entry.name));
152473
+ const info = await stat(join5(target2, entry.name));
152452
152474
  return `${entry.name} ${info.size} bytes`;
152453
152475
  }));
152454
152476
  return lines.sort().join(`
@@ -152517,7 +152539,7 @@ var toolsFor = ({
152517
152539
  return;
152518
152540
  if (SKIP.test(entry.name))
152519
152541
  continue;
152520
- const path2 = join4(directory, entry.name);
152542
+ const path2 = join5(directory, entry.name);
152521
152543
  if (entry.isDirectory()) {
152522
152544
  await walk3(path2);
152523
152545
  continue;
@@ -152813,7 +152835,7 @@ var askForBudget = async (runtime, agent3, amountMinor, reason) => {
152813
152835
 
152814
152836
  // apps/crew/server/main.ts
152815
152837
  import { readFile as readFile2, stat as stat2 } from "node:fs/promises";
152816
- import { dirname as dirname3, extname, join as join5, normalize as normalize3, sep as sep2 } from "node:path";
152838
+ import { dirname as dirname3, extname, join as join6, normalize as normalize3, sep as sep2 } from "node:path";
152817
152839
  import { fileURLToPath } from "node:url";
152818
152840
 
152819
152841
  // apps/crew/server/http.ts
@@ -152955,9 +152977,9 @@ var deriveSigner = async (account, signatures) => {
152955
152977
  const privateKey = keccak2563(concat3([toHex(DERIVATION), numberToHex(first.r, { size: 32 }), numberToHex(first.s, { size: 32 })]));
152956
152978
  return { privateKey, address: privateKeyToAccount(privateKey).address, derivedFrom: expected };
152957
152979
  };
152958
- var storedSigner = () => readSharedWallet();
152980
+ var storedSigner = () => readSharedWallet(CREW_HOME);
152959
152981
  var saveSigner = (signer) => {
152960
- const existing = readSharedWallet();
152982
+ const existing = readSharedWallet(CREW_HOME);
152961
152983
  if (existing) {
152962
152984
  if (getAddress2(existing.address) === getAddress2(signer.address))
152963
152985
  return;
@@ -152967,7 +152989,7 @@ var saveSigner = (signer) => {
152967
152989
  privateKey: signer.privateKey.slice(2),
152968
152990
  address: signer.address,
152969
152991
  derivedFrom: signer.derivedFrom
152970
- });
152992
+ }, CREW_HOME);
152971
152993
  };
152972
152994
 
152973
152995
  // apps/crew/server/funding.ts
@@ -152985,7 +153007,7 @@ var privyAppId = () => process.env.PRIVY_APP_ID ?? "cmtvmne8l002x0cl9zvp4lgc9";
152985
153007
 
152986
153008
  // apps/crew/server/main.ts
152987
153009
  var HERE = dirname3(fileURLToPath(import.meta.url));
152988
- var UI_DIR = process.env.CREW_UI_DIR ?? join5(HERE, "..", "dist");
153010
+ var UI_DIR = process.env.CREW_UI_DIR ?? join6(HERE, "..", "dist");
152989
153011
  var CONTENT_TYPES = {
152990
153012
  ".html": "text/html; charset=utf-8",
152991
153013
  ".js": "text/javascript; charset=utf-8",
@@ -153076,7 +153098,7 @@ var stateOf = (runtime) => ({
153076
153098
  }))
153077
153099
  });
153078
153100
  console.log(`
153079
- edgerouter crew
153101
+ crew ai
153080
153102
  `);
153081
153103
  console.log(` gate ${GATE}`);
153082
153104
  console.log(` network ${NETWORK}`);
@@ -153090,6 +153112,10 @@ var start = async () => {
153090
153112
  console.log(started.wallet.shortfall === undefined ? ` can spend ${formatAmount(started.wallet.network, started.wallet.spendableMinor)}` : started.wallet.shortfall === "undeposited" ? ` holds ${formatAmount(started.wallet.network, started.wallet.heldMinor ?? 0n)}, none of it deposited yet` : " not funded yet — the app will say what to do");
153091
153113
  console.log(` names ${started.root ? started.naming ? `under ${started.root}` : `off — ${started.root} owns no registry` : "none yet — choose a name in the page"}`);
153092
153114
  };
153115
+ var carried = adoptEarlierCrew();
153116
+ console.log(` home ${CREW_HOME}`);
153117
+ if (carried.length > 0)
153118
+ console.log(` data carried over ${carried.join(", ")} from the earlier location`);
153093
153119
  if (storedSigner()) {
153094
153120
  try {
153095
153121
  await start();
@@ -153129,10 +153155,10 @@ var serveUi = async (path2) => {
153129
153155
  } catch {
153130
153156
  return new Response("bad path", { status: 400 });
153131
153157
  }
153132
- const requested = join5(UI_DIR, relative3 || "index.html");
153158
+ const requested = join6(UI_DIR, relative3 || "index.html");
153133
153159
  if (requested !== UI_DIR && !requested.startsWith(UI_DIR + sep2))
153134
153160
  return new Response("not found", { status: 404 });
153135
- const target2 = await isFile(requested) ? requested : join5(UI_DIR, "index.html");
153161
+ const target2 = await isFile(requested) ? requested : join6(UI_DIR, "index.html");
153136
153162
  if (!await isFile(target2)) {
153137
153163
  return new Response("the UI is not built — run `bun run build` in apps/crew", { status: 404 });
153138
153164
  }