@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 +1 -1
- package/bin/crew.mjs +3 -3
- package/package.json +1 -1
- package/server/main.mjs +67 -41
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
|
-
| `
|
|
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
|
-
|
|
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
|
-
|
|
39
|
-
|
|
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
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
|
|
140642
|
-
import {
|
|
140643
|
-
|
|
140644
|
-
var
|
|
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
|
-
|
|
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
|
|
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
|
|
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 =
|
|
140710
|
-
var 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 (!
|
|
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 =
|
|
140741
|
-
const realTarget = existing === target ? real :
|
|
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 (!
|
|
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) =>
|
|
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: "
|
|
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
|
|
152415
|
+
import { mkdirSync as mkdirSync4 } from "node:fs";
|
|
152393
152416
|
import { readFile, writeFile, readdir, stat, mkdir } from "node:fs/promises";
|
|
152394
|
-
import {
|
|
152395
|
-
|
|
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 =
|
|
152401
|
-
|
|
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(
|
|
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 =
|
|
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
|
|
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 ??
|
|
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
|
-
|
|
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 =
|
|
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 :
|
|
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
|
}
|