@spinabot/brigade 1.0.1 → 1.1.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.
- package/convex/_generated/api.d.ts +85 -0
- package/convex/_generated/api.js +23 -0
- package/convex/_generated/dataModel.d.ts +60 -0
- package/convex/_generated/server.d.ts +143 -0
- package/convex/_generated/server.js +93 -0
- package/convex/admin.d.ts +57 -0
- package/convex/admin.ts +315 -0
- package/convex/auth.d.ts +159 -0
- package/convex/auth.ts +217 -0
- package/convex/blobs.d.ts +38 -0
- package/convex/blobs.ts +115 -0
- package/convex/channels.d.ts +150 -0
- package/convex/channels.ts +455 -0
- package/convex/config.d.ts +67 -0
- package/convex/config.ts +168 -0
- package/convex/cron.d.ts +237 -0
- package/convex/cron.ts +199 -0
- package/convex/execApprovals.d.ts +31 -0
- package/convex/execApprovals.ts +58 -0
- package/convex/extensions.d.ts +30 -0
- package/convex/extensions.ts +51 -0
- package/convex/health.d.ts +18 -0
- package/convex/health.ts +69 -0
- package/convex/instance.d.ts +34 -0
- package/convex/instance.ts +82 -0
- package/convex/logs.d.ts +178 -0
- package/convex/logs.ts +253 -0
- package/convex/memory.d.ts +354 -0
- package/convex/memory.ts +536 -0
- package/convex/messages.d.ts +124 -0
- package/convex/messages.ts +347 -0
- package/convex/org.d.ts +75 -0
- package/convex/org.ts +99 -0
- package/convex/schema.d.ts +1130 -0
- package/convex/schema.ts +847 -0
- package/convex/sessions.d.ts +100 -0
- package/convex/sessions.ts +105 -0
- package/convex/skills.d.ts +73 -0
- package/convex/skills.ts +102 -0
- package/convex/subagents.d.ts +214 -0
- package/convex/subagents.ts +99 -0
- package/convex/tsconfig.json +23 -0
- package/convex/whatsappAuth.d.ts +52 -0
- package/convex/whatsappAuth.ts +151 -0
- package/convex/workspace.d.ts +49 -0
- package/convex/workspace.ts +106 -0
- package/dist/buildstamp.json +1 -1
- package/dist/cli/commands/convex-cmd.d.ts +27 -0
- package/dist/cli/commands/convex-cmd.d.ts.map +1 -0
- package/dist/cli/commands/convex-cmd.js +162 -0
- package/dist/cli/commands/convex-cmd.js.map +1 -0
- package/dist/cli/program/build-program.d.ts.map +1 -1
- package/dist/cli/program/build-program.js +64 -0
- package/dist/cli/program/build-program.js.map +1 -1
- package/dist/config/paths.d.ts +3 -0
- package/dist/config/paths.d.ts.map +1 -1
- package/dist/config/paths.js +39 -0
- package/dist/config/paths.js.map +1 -1
- package/package.json +7 -1
- package/scripts/convex-dev.mjs +321 -0
- package/scripts/convex-push.mjs +69 -0
- package/scripts/install-convex.mjs +123 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
/* TypeScript project config for the Convex functions directory. The convex
|
|
3
|
+
* CLI's deploy-time "Running TypeScript..." step compiles this folder; with
|
|
4
|
+
* NO tsconfig here it ran in an emitting mode and planted compiled .js/.map
|
|
5
|
+
* files next to the sources — which the NEXT deploy's bundler picked up as
|
|
6
|
+
* duplicate entry points ("Two output files share the same path"), making
|
|
7
|
+
* every successful push break the following one. `noEmit` is the fix; the
|
|
8
|
+
* rest mirrors Convex's standard template for the function runtime.
|
|
9
|
+
*/
|
|
10
|
+
"compilerOptions": {
|
|
11
|
+
"allowJs": true,
|
|
12
|
+
"strict": true,
|
|
13
|
+
"target": "ESNext",
|
|
14
|
+
"lib": ["ES2021", "dom"],
|
|
15
|
+
"forceConsistentCasingInFileNames": true,
|
|
16
|
+
"module": "ESNext",
|
|
17
|
+
"moduleResolution": "Bundler",
|
|
18
|
+
"isolatedModules": true,
|
|
19
|
+
"skipLibCheck": true,
|
|
20
|
+
"noEmit": true
|
|
21
|
+
},
|
|
22
|
+
"include": ["./**/*"]
|
|
23
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/** Pre-hydrate the whole keystore in one query — Baileys reads keys inside
|
|
2
|
+
* the Signal decrypt path, so the adapter serves them from an in-process
|
|
3
|
+
* cache filled here at connect time. Oversized values come back as a
|
|
4
|
+
* download URL instead of inline bytes. */
|
|
5
|
+
export declare const loadAll: import("convex/server").RegisteredQuery<"public", {
|
|
6
|
+
accountId: string;
|
|
7
|
+
ownerId: string;
|
|
8
|
+
}, Promise<{
|
|
9
|
+
creds: ArrayBuffer | null;
|
|
10
|
+
keys: ({
|
|
11
|
+
keyType: string;
|
|
12
|
+
keyId: string;
|
|
13
|
+
url: string | null;
|
|
14
|
+
payload?: undefined;
|
|
15
|
+
} | {
|
|
16
|
+
keyType: string;
|
|
17
|
+
keyId: string;
|
|
18
|
+
payload: ArrayBuffer | undefined;
|
|
19
|
+
url?: undefined;
|
|
20
|
+
})[];
|
|
21
|
+
}>>;
|
|
22
|
+
export declare const writeCreds: import("convex/server").RegisteredMutation<"public", {
|
|
23
|
+
accountId: string;
|
|
24
|
+
payload: ArrayBuffer;
|
|
25
|
+
ownerId: string;
|
|
26
|
+
}, Promise<{
|
|
27
|
+
updated: boolean;
|
|
28
|
+
}>>;
|
|
29
|
+
/** Batched key upserts + deletes in one transaction — mirrors Baileys'
|
|
30
|
+
* transaction batching (addTransactionCapability flushes whole
|
|
31
|
+
* SignalDataSets). An entry with neither payload nor storageId is a
|
|
32
|
+
* DELETE (Baileys sets null to remove keys). */
|
|
33
|
+
export declare const writeKeys: import("convex/server").RegisteredMutation<"public", {
|
|
34
|
+
entries: {
|
|
35
|
+
payload?: ArrayBuffer | undefined;
|
|
36
|
+
storageId?: import("convex/values").GenericId<"_storage"> | undefined;
|
|
37
|
+
keyType: string;
|
|
38
|
+
keyId: string;
|
|
39
|
+
}[];
|
|
40
|
+
accountId: string;
|
|
41
|
+
ownerId: string;
|
|
42
|
+
}, Promise<{
|
|
43
|
+
count: number;
|
|
44
|
+
}>>;
|
|
45
|
+
/** Wipe an account's auth state entirely (logout / unlink). */
|
|
46
|
+
export declare const clearAccount: import("convex/server").RegisteredMutation<"public", {
|
|
47
|
+
accountId: string;
|
|
48
|
+
ownerId: string;
|
|
49
|
+
}, Promise<{
|
|
50
|
+
removedKeys: number;
|
|
51
|
+
}>>;
|
|
52
|
+
//# sourceMappingURL=whatsappAuth.d.ts.map
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
// convex/whatsappAuth.ts — Baileys AuthenticationState backing tables.
|
|
2
|
+
//
|
|
3
|
+
// The convex-mode replacement for useMultiFileAuthState's ~900-file auth
|
|
4
|
+
// dir. creds = one sealed blob; keys = one row per (keyType, keyId) with a
|
|
5
|
+
// File Storage spill for oversized values (LTHashState). All payloads are
|
|
6
|
+
// sealed client-side — this module never sees plaintext key material.
|
|
7
|
+
|
|
8
|
+
import { v } from "convex/values";
|
|
9
|
+
import { mutation, query } from "./_generated/server.js";
|
|
10
|
+
|
|
11
|
+
/** Pre-hydrate the whole keystore in one query — Baileys reads keys inside
|
|
12
|
+
* the Signal decrypt path, so the adapter serves them from an in-process
|
|
13
|
+
* cache filled here at connect time. Oversized values come back as a
|
|
14
|
+
* download URL instead of inline bytes. */
|
|
15
|
+
export const loadAll = query({
|
|
16
|
+
args: { ownerId: v.string(), accountId: v.string() },
|
|
17
|
+
handler: async (ctx, args) => {
|
|
18
|
+
const credsRow = await ctx.db
|
|
19
|
+
.query("whatsappAuthCreds")
|
|
20
|
+
.withIndex("by_owner_account", (q) =>
|
|
21
|
+
q.eq("ownerId", args.ownerId).eq("accountId", args.accountId),
|
|
22
|
+
)
|
|
23
|
+
.first();
|
|
24
|
+
const keyRows = await ctx.db
|
|
25
|
+
.query("whatsappAuthKeys")
|
|
26
|
+
.withIndex("by_owner_account", (q) =>
|
|
27
|
+
q.eq("ownerId", args.ownerId).eq("accountId", args.accountId),
|
|
28
|
+
)
|
|
29
|
+
.collect();
|
|
30
|
+
const keys = [];
|
|
31
|
+
for (const row of keyRows) {
|
|
32
|
+
if (row.storageId) {
|
|
33
|
+
const url = await ctx.storage.getUrl(row.storageId);
|
|
34
|
+
keys.push({ keyType: row.keyType, keyId: row.keyId, url });
|
|
35
|
+
} else {
|
|
36
|
+
keys.push({ keyType: row.keyType, keyId: row.keyId, payload: row.payload });
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return { creds: credsRow?.payload ?? null, keys };
|
|
40
|
+
},
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
export const writeCreds = mutation({
|
|
44
|
+
args: { ownerId: v.string(), accountId: v.string(), payload: v.bytes() },
|
|
45
|
+
handler: async (ctx, args) => {
|
|
46
|
+
const existing = await ctx.db
|
|
47
|
+
.query("whatsappAuthCreds")
|
|
48
|
+
.withIndex("by_owner_account", (q) =>
|
|
49
|
+
q.eq("ownerId", args.ownerId).eq("accountId", args.accountId),
|
|
50
|
+
)
|
|
51
|
+
.first();
|
|
52
|
+
const row = { ...args, updatedAt: Date.now() };
|
|
53
|
+
if (existing) {
|
|
54
|
+
await ctx.db.replace(existing._id, row);
|
|
55
|
+
return { updated: true };
|
|
56
|
+
}
|
|
57
|
+
await ctx.db.insert("whatsappAuthCreds", row);
|
|
58
|
+
return { updated: false };
|
|
59
|
+
},
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
/** Batched key upserts + deletes in one transaction — mirrors Baileys'
|
|
63
|
+
* transaction batching (addTransactionCapability flushes whole
|
|
64
|
+
* SignalDataSets). An entry with neither payload nor storageId is a
|
|
65
|
+
* DELETE (Baileys sets null to remove keys). */
|
|
66
|
+
export const writeKeys = mutation({
|
|
67
|
+
args: {
|
|
68
|
+
ownerId: v.string(),
|
|
69
|
+
accountId: v.string(),
|
|
70
|
+
entries: v.array(
|
|
71
|
+
v.object({
|
|
72
|
+
keyType: v.string(),
|
|
73
|
+
keyId: v.string(),
|
|
74
|
+
payload: v.optional(v.bytes()),
|
|
75
|
+
storageId: v.optional(v.id("_storage")),
|
|
76
|
+
}),
|
|
77
|
+
),
|
|
78
|
+
},
|
|
79
|
+
handler: async (ctx, args) => {
|
|
80
|
+
for (const entry of args.entries) {
|
|
81
|
+
const existing = await ctx.db
|
|
82
|
+
.query("whatsappAuthKeys")
|
|
83
|
+
.withIndex("by_owner_account_type_id", (q) =>
|
|
84
|
+
q
|
|
85
|
+
.eq("ownerId", args.ownerId)
|
|
86
|
+
.eq("accountId", args.accountId)
|
|
87
|
+
.eq("keyType", entry.keyType)
|
|
88
|
+
.eq("keyId", entry.keyId),
|
|
89
|
+
)
|
|
90
|
+
.first();
|
|
91
|
+
const isDelete = entry.payload === undefined && entry.storageId === undefined;
|
|
92
|
+
if (isDelete) {
|
|
93
|
+
if (existing) {
|
|
94
|
+
// Reap the spilled File Storage blob first — deleting only the
|
|
95
|
+
// row would orphan the object (storage isn't ref-counted).
|
|
96
|
+
if (existing.storageId) await ctx.storage.delete(existing.storageId);
|
|
97
|
+
await ctx.db.delete(existing._id);
|
|
98
|
+
}
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
const row = {
|
|
102
|
+
ownerId: args.ownerId,
|
|
103
|
+
accountId: args.accountId,
|
|
104
|
+
keyType: entry.keyType,
|
|
105
|
+
keyId: entry.keyId,
|
|
106
|
+
...(entry.payload !== undefined ? { payload: entry.payload } : {}),
|
|
107
|
+
...(entry.storageId !== undefined ? { storageId: entry.storageId } : {}),
|
|
108
|
+
updatedAt: Date.now(),
|
|
109
|
+
};
|
|
110
|
+
if (existing) {
|
|
111
|
+
// If the prior value spilled to File Storage and the new value
|
|
112
|
+
// doesn't reuse the same object, delete the old blob to avoid an
|
|
113
|
+
// orphan (overwrite with inline payload, or a fresh spill).
|
|
114
|
+
if (existing.storageId && existing.storageId !== entry.storageId) {
|
|
115
|
+
await ctx.storage.delete(existing.storageId);
|
|
116
|
+
}
|
|
117
|
+
await ctx.db.replace(existing._id, row);
|
|
118
|
+
} else {
|
|
119
|
+
await ctx.db.insert("whatsappAuthKeys", row);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return { count: args.entries.length };
|
|
123
|
+
},
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
/** Wipe an account's auth state entirely (logout / unlink). */
|
|
127
|
+
export const clearAccount = mutation({
|
|
128
|
+
args: { ownerId: v.string(), accountId: v.string() },
|
|
129
|
+
handler: async (ctx, args) => {
|
|
130
|
+
const credsRow = await ctx.db
|
|
131
|
+
.query("whatsappAuthCreds")
|
|
132
|
+
.withIndex("by_owner_account", (q) =>
|
|
133
|
+
q.eq("ownerId", args.ownerId).eq("accountId", args.accountId),
|
|
134
|
+
)
|
|
135
|
+
.first();
|
|
136
|
+
if (credsRow) await ctx.db.delete(credsRow._id);
|
|
137
|
+
const keyRows = await ctx.db
|
|
138
|
+
.query("whatsappAuthKeys")
|
|
139
|
+
.withIndex("by_owner_account", (q) =>
|
|
140
|
+
q.eq("ownerId", args.ownerId).eq("accountId", args.accountId),
|
|
141
|
+
)
|
|
142
|
+
.collect();
|
|
143
|
+
for (const row of keyRows) {
|
|
144
|
+
// Reap any spilled File Storage blob before dropping the row so an
|
|
145
|
+
// unlink/logout leaves nothing behind in storage.
|
|
146
|
+
if (row.storageId) await ctx.storage.delete(row.storageId);
|
|
147
|
+
await ctx.db.delete(row._id);
|
|
148
|
+
}
|
|
149
|
+
return { removedKeys: keyRows.length };
|
|
150
|
+
},
|
|
151
|
+
});
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
export declare const listPersona: import("convex/server").RegisteredQuery<"public", {
|
|
2
|
+
agentId: string;
|
|
3
|
+
}, Promise<{
|
|
4
|
+
_id: import("convex/values").GenericId<"personaFiles">;
|
|
5
|
+
_creationTime: number;
|
|
6
|
+
agentId: string;
|
|
7
|
+
name: "AGENTS.md" | "SOUL.md" | "IDENTITY.md" | "USER.md" | "TOOLS.md" | "BOOTSTRAP.md" | "MEMORY.md" | "HEARTBEAT.md";
|
|
8
|
+
content: ArrayBuffer;
|
|
9
|
+
updatedAt: number;
|
|
10
|
+
}[]>>;
|
|
11
|
+
export declare const getPersona: import("convex/server").RegisteredQuery<"public", {
|
|
12
|
+
agentId: string;
|
|
13
|
+
name: "AGENTS.md" | "SOUL.md" | "IDENTITY.md" | "USER.md" | "TOOLS.md" | "BOOTSTRAP.md" | "MEMORY.md" | "HEARTBEAT.md";
|
|
14
|
+
}, Promise<{
|
|
15
|
+
_id: import("convex/values").GenericId<"personaFiles">;
|
|
16
|
+
_creationTime: number;
|
|
17
|
+
agentId: string;
|
|
18
|
+
name: "AGENTS.md" | "SOUL.md" | "IDENTITY.md" | "USER.md" | "TOOLS.md" | "BOOTSTRAP.md" | "MEMORY.md" | "HEARTBEAT.md";
|
|
19
|
+
content: ArrayBuffer;
|
|
20
|
+
updatedAt: number;
|
|
21
|
+
} | null>>;
|
|
22
|
+
export declare const writePersona: import("convex/server").RegisteredMutation<"public", {
|
|
23
|
+
agentId: string;
|
|
24
|
+
name: "AGENTS.md" | "SOUL.md" | "IDENTITY.md" | "USER.md" | "TOOLS.md" | "BOOTSTRAP.md" | "MEMORY.md" | "HEARTBEAT.md";
|
|
25
|
+
content: ArrayBuffer;
|
|
26
|
+
}, Promise<{
|
|
27
|
+
created: boolean;
|
|
28
|
+
}>>;
|
|
29
|
+
export declare const deletePersona: import("convex/server").RegisteredMutation<"public", {
|
|
30
|
+
agentId: string;
|
|
31
|
+
name: "AGENTS.md" | "SOUL.md" | "IDENTITY.md" | "USER.md" | "TOOLS.md" | "BOOTSTRAP.md" | "MEMORY.md" | "HEARTBEAT.md";
|
|
32
|
+
}, Promise<boolean>>;
|
|
33
|
+
export declare const getState: import("convex/server").RegisteredQuery<"public", {
|
|
34
|
+
agentId: string;
|
|
35
|
+
}, Promise<{
|
|
36
|
+
_id: import("convex/values").GenericId<"workspaceState">;
|
|
37
|
+
_creationTime: number;
|
|
38
|
+
bootstrapSeededAt?: string | undefined;
|
|
39
|
+
setupCompletedAt?: string | undefined;
|
|
40
|
+
version: number;
|
|
41
|
+
agentId: string;
|
|
42
|
+
} | null>>;
|
|
43
|
+
export declare const setBootstrapSeeded: import("convex/server").RegisteredMutation<"public", {
|
|
44
|
+
agentId: string;
|
|
45
|
+
}, Promise<void>>;
|
|
46
|
+
export declare const setSetupCompleted: import("convex/server").RegisteredMutation<"public", {
|
|
47
|
+
agentId: string;
|
|
48
|
+
}, Promise<void>>;
|
|
49
|
+
//# sourceMappingURL=workspace.d.ts.map
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
// convex/workspace.ts — personaFiles + workspaceState
|
|
2
|
+
import { v } from "convex/values";
|
|
3
|
+
import { mutation, query } from "./_generated/server.js";
|
|
4
|
+
|
|
5
|
+
const PersonaName = v.union(
|
|
6
|
+
v.literal("AGENTS.md"),
|
|
7
|
+
v.literal("SOUL.md"),
|
|
8
|
+
v.literal("IDENTITY.md"),
|
|
9
|
+
v.literal("USER.md"),
|
|
10
|
+
v.literal("TOOLS.md"),
|
|
11
|
+
v.literal("BOOTSTRAP.md"),
|
|
12
|
+
v.literal("MEMORY.md"),
|
|
13
|
+
v.literal("HEARTBEAT.md"),
|
|
14
|
+
);
|
|
15
|
+
|
|
16
|
+
export const listPersona = query({
|
|
17
|
+
args: { agentId: v.string() },
|
|
18
|
+
handler: async (ctx, args) => {
|
|
19
|
+
return ctx.db
|
|
20
|
+
.query("personaFiles")
|
|
21
|
+
.withIndex("by_agent", (q) => q.eq("agentId", args.agentId))
|
|
22
|
+
.collect();
|
|
23
|
+
},
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
export const getPersona = query({
|
|
27
|
+
args: { agentId: v.string(), name: PersonaName },
|
|
28
|
+
handler: async (ctx, args) => {
|
|
29
|
+
return ctx.db
|
|
30
|
+
.query("personaFiles")
|
|
31
|
+
.withIndex("by_agent_name", (q) => q.eq("agentId", args.agentId).eq("name", args.name))
|
|
32
|
+
.first();
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
export const writePersona = mutation({
|
|
37
|
+
args: { agentId: v.string(), name: PersonaName, content: v.bytes() },
|
|
38
|
+
handler: async (ctx, args) => {
|
|
39
|
+
const existing = await ctx.db
|
|
40
|
+
.query("personaFiles")
|
|
41
|
+
.withIndex("by_agent_name", (q) => q.eq("agentId", args.agentId).eq("name", args.name))
|
|
42
|
+
.first();
|
|
43
|
+
const payload = { agentId: args.agentId, name: args.name, content: args.content, updatedAt: Date.now() };
|
|
44
|
+
if (existing) {
|
|
45
|
+
await ctx.db.replace(existing._id, payload);
|
|
46
|
+
return { created: false };
|
|
47
|
+
}
|
|
48
|
+
await ctx.db.insert("personaFiles", payload);
|
|
49
|
+
return { created: true };
|
|
50
|
+
},
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
export const deletePersona = mutation({
|
|
54
|
+
args: { agentId: v.string(), name: PersonaName },
|
|
55
|
+
handler: async (ctx, args) => {
|
|
56
|
+
const existing = await ctx.db
|
|
57
|
+
.query("personaFiles")
|
|
58
|
+
.withIndex("by_agent_name", (q) => q.eq("agentId", args.agentId).eq("name", args.name))
|
|
59
|
+
.first();
|
|
60
|
+
if (!existing) return false;
|
|
61
|
+
await ctx.db.delete(existing._id);
|
|
62
|
+
return true;
|
|
63
|
+
},
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
export const getState = query({
|
|
67
|
+
args: { agentId: v.string() },
|
|
68
|
+
handler: async (ctx, args) => {
|
|
69
|
+
return ctx.db
|
|
70
|
+
.query("workspaceState")
|
|
71
|
+
.withIndex("by_agent", (q) => q.eq("agentId", args.agentId))
|
|
72
|
+
.first();
|
|
73
|
+
},
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
export const setBootstrapSeeded = mutation({
|
|
77
|
+
args: { agentId: v.string() },
|
|
78
|
+
handler: async (ctx, args) => {
|
|
79
|
+
const existing = await ctx.db
|
|
80
|
+
.query("workspaceState")
|
|
81
|
+
.withIndex("by_agent", (q) => q.eq("agentId", args.agentId))
|
|
82
|
+
.first();
|
|
83
|
+
const now = new Date().toISOString();
|
|
84
|
+
if (existing) {
|
|
85
|
+
await ctx.db.patch(existing._id, { bootstrapSeededAt: now });
|
|
86
|
+
} else {
|
|
87
|
+
await ctx.db.insert("workspaceState", { agentId: args.agentId, version: 1, bootstrapSeededAt: now });
|
|
88
|
+
}
|
|
89
|
+
},
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
export const setSetupCompleted = mutation({
|
|
93
|
+
args: { agentId: v.string() },
|
|
94
|
+
handler: async (ctx, args) => {
|
|
95
|
+
const existing = await ctx.db
|
|
96
|
+
.query("workspaceState")
|
|
97
|
+
.withIndex("by_agent", (q) => q.eq("agentId", args.agentId))
|
|
98
|
+
.first();
|
|
99
|
+
const now = new Date().toISOString();
|
|
100
|
+
if (existing) {
|
|
101
|
+
await ctx.db.patch(existing._id, { setupCompletedAt: now });
|
|
102
|
+
} else {
|
|
103
|
+
await ctx.db.insert("workspaceState", { agentId: args.agentId, version: 1, setupCompletedAt: now });
|
|
104
|
+
}
|
|
105
|
+
},
|
|
106
|
+
});
|
package/dist/buildstamp.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"builtAt":
|
|
1
|
+
{"builtAt":1782026537206,"head":"080b5b983677f2e2f28801c30744e9d3108004ba"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `brigade convex <dev|start|status|stop|push|codegen>` — drive the bundled
|
|
3
|
+
* self-hosted Convex backend that powers Brigade's convex storage mode.
|
|
4
|
+
*
|
|
5
|
+
* Brigade ships the Convex backend + dashboard binaries and the orchestrator
|
|
6
|
+
* scripts inside the package, so this works both from a repo checkout and from
|
|
7
|
+
* a global `npm i -g` install (any cwd). The actual work lives in the
|
|
8
|
+
* `scripts/*.mjs` orchestrators; this command resolves the package root + the
|
|
9
|
+
* per-user bin/data directories, exports them as env vars, and spawns the
|
|
10
|
+
* right script so the scripts behave identically in either layout.
|
|
11
|
+
*
|
|
12
|
+
* brigade convex dev — install binaries if missing, then boot the
|
|
13
|
+
* backend + dashboard in the foreground (Ctrl-C
|
|
14
|
+
* to stop). `start` is an alias.
|
|
15
|
+
* brigade convex status — probe the backend and report running / not.
|
|
16
|
+
* brigade convex push — deploy the bundled convex/ functions.
|
|
17
|
+
* brigade convex codegen — regenerate the convex/_generated client.
|
|
18
|
+
* brigade convex stop — reminder that `dev` is foreground (Ctrl-C).
|
|
19
|
+
*/
|
|
20
|
+
export interface ConvexCommandOptions {
|
|
21
|
+
action: "dev" | "start" | "status" | "stop" | "push" | "codegen";
|
|
22
|
+
host?: string;
|
|
23
|
+
port?: number;
|
|
24
|
+
json?: boolean;
|
|
25
|
+
}
|
|
26
|
+
export declare function runConvexCommand(opts: ConvexCommandOptions): Promise<number>;
|
|
27
|
+
//# sourceMappingURL=convex-cmd.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"convex-cmd.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/convex-cmd.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAYH,MAAM,WAAW,oBAAoB;IACpC,MAAM,EAAE,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IACjE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;CACf;AAeD,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,CA+IlF"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `brigade convex <dev|start|status|stop|push|codegen>` — drive the bundled
|
|
3
|
+
* self-hosted Convex backend that powers Brigade's convex storage mode.
|
|
4
|
+
*
|
|
5
|
+
* Brigade ships the Convex backend + dashboard binaries and the orchestrator
|
|
6
|
+
* scripts inside the package, so this works both from a repo checkout and from
|
|
7
|
+
* a global `npm i -g` install (any cwd). The actual work lives in the
|
|
8
|
+
* `scripts/*.mjs` orchestrators; this command resolves the package root + the
|
|
9
|
+
* per-user bin/data directories, exports them as env vars, and spawns the
|
|
10
|
+
* right script so the scripts behave identically in either layout.
|
|
11
|
+
*
|
|
12
|
+
* brigade convex dev — install binaries if missing, then boot the
|
|
13
|
+
* backend + dashboard in the foreground (Ctrl-C
|
|
14
|
+
* to stop). `start` is an alias.
|
|
15
|
+
* brigade convex status — probe the backend and report running / not.
|
|
16
|
+
* brigade convex push — deploy the bundled convex/ functions.
|
|
17
|
+
* brigade convex codegen — regenerate the convex/_generated client.
|
|
18
|
+
* brigade convex stop — reminder that `dev` is foreground (Ctrl-C).
|
|
19
|
+
*/
|
|
20
|
+
import { spawn, spawnSync } from "node:child_process";
|
|
21
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
22
|
+
import { join } from "node:path";
|
|
23
|
+
import { resolvePackageRoot, resolveConvexBinDir, resolveConvexDataDir, } from "../../config/paths.js";
|
|
24
|
+
const DEFAULT_HOST = "127.0.0.1";
|
|
25
|
+
const DEFAULT_PORT = 3210;
|
|
26
|
+
const DASHBOARD_PORT = 6791;
|
|
27
|
+
/** Friendly rendering of a data dir — collapses $HOME to ~ for the boot note. */
|
|
28
|
+
function friendlyPath(p) {
|
|
29
|
+
const home = process.env.HOME || process.env.USERPROFILE || "";
|
|
30
|
+
if (home && p.startsWith(home)) {
|
|
31
|
+
return `~${p.slice(home.length)}`;
|
|
32
|
+
}
|
|
33
|
+
return p;
|
|
34
|
+
}
|
|
35
|
+
export async function runConvexCommand(opts) {
|
|
36
|
+
const pkgRoot = resolvePackageRoot();
|
|
37
|
+
const binDir = resolveConvexBinDir();
|
|
38
|
+
const dataDir = resolveConvexDataDir();
|
|
39
|
+
// Hand the resolved locations to the orchestrator scripts so they behave the
|
|
40
|
+
// same from a repo checkout and a global install.
|
|
41
|
+
const env = {
|
|
42
|
+
...process.env,
|
|
43
|
+
BRIGADE_CONVEX_BIN_DIR: binDir,
|
|
44
|
+
BRIGADE_CONVEX_DATA_DIR: dataDir,
|
|
45
|
+
BRIGADE_PACKAGE_ROOT: pkgRoot,
|
|
46
|
+
};
|
|
47
|
+
if (opts.action === "dev" || opts.action === "start") {
|
|
48
|
+
// 1) Ensure the backend + dashboard binaries are present (no-op when
|
|
49
|
+
// already downloaded). Fail fast if the install step errors.
|
|
50
|
+
const install = spawnSync(process.execPath, [join(pkgRoot, "scripts", "install-convex.mjs")], {
|
|
51
|
+
env,
|
|
52
|
+
stdio: "inherit",
|
|
53
|
+
});
|
|
54
|
+
if (install.status !== 0)
|
|
55
|
+
return 1;
|
|
56
|
+
// 2) Boot the backend + dashboard in the foreground.
|
|
57
|
+
process.stdout.write(`Starting Convex (data: ${friendlyPath(dataDir)})\n` +
|
|
58
|
+
` backend → http://${DEFAULT_HOST}:${DEFAULT_PORT}\n` +
|
|
59
|
+
` dashboard → http://${DEFAULT_HOST}:${DASHBOARD_PORT}\n` +
|
|
60
|
+
` Press Ctrl-C to stop.\n\n`);
|
|
61
|
+
const child = spawn(process.execPath, [join(pkgRoot, "scripts", "convex-dev.mjs")], {
|
|
62
|
+
env,
|
|
63
|
+
stdio: "inherit",
|
|
64
|
+
});
|
|
65
|
+
// Forward termination signals so Ctrl-C / SIGTERM reach the orchestrator
|
|
66
|
+
// (it owns the backend process + dashboard server and shuts them down
|
|
67
|
+
// gracefully). The orchestrator exits on the signal; we resolve with its
|
|
68
|
+
// exit code below.
|
|
69
|
+
const forward = (sig) => {
|
|
70
|
+
try {
|
|
71
|
+
child.kill(sig);
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
/* child already gone */
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
const onSigint = () => forward("SIGINT");
|
|
78
|
+
const onSigterm = () => forward("SIGTERM");
|
|
79
|
+
process.on("SIGINT", onSigint);
|
|
80
|
+
process.on("SIGTERM", onSigterm);
|
|
81
|
+
return await new Promise((resolveProm) => {
|
|
82
|
+
child.on("exit", (code) => {
|
|
83
|
+
process.off("SIGINT", onSigint);
|
|
84
|
+
process.off("SIGTERM", onSigterm);
|
|
85
|
+
resolveProm(code ?? 0);
|
|
86
|
+
});
|
|
87
|
+
child.on("error", () => {
|
|
88
|
+
process.off("SIGINT", onSigint);
|
|
89
|
+
process.off("SIGTERM", onSigterm);
|
|
90
|
+
resolveProm(1);
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
if (opts.action === "push") {
|
|
95
|
+
return (spawnSync(process.execPath, [join(pkgRoot, "scripts", "convex-push.mjs")], {
|
|
96
|
+
env,
|
|
97
|
+
stdio: "inherit",
|
|
98
|
+
}).status ?? 1);
|
|
99
|
+
}
|
|
100
|
+
if (opts.action === "status") {
|
|
101
|
+
const host = opts.host ?? DEFAULT_HOST;
|
|
102
|
+
const port = opts.port ?? DEFAULT_PORT;
|
|
103
|
+
const url = `http://${host}:${port}`;
|
|
104
|
+
const controller = new AbortController();
|
|
105
|
+
const timer = setTimeout(() => controller.abort(), 2_000);
|
|
106
|
+
try {
|
|
107
|
+
const res = await fetch(`${url}/version`, { signal: controller.signal });
|
|
108
|
+
clearTimeout(timer);
|
|
109
|
+
if (!res.ok) {
|
|
110
|
+
if (opts.json) {
|
|
111
|
+
process.stdout.write(`${JSON.stringify({ running: false, url, status: res.status })}\n`);
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
process.stdout.write(`Convex is not running on ${host}:${port}\n`);
|
|
115
|
+
}
|
|
116
|
+
return 1;
|
|
117
|
+
}
|
|
118
|
+
const version = (await res.text()).trim();
|
|
119
|
+
if (opts.json) {
|
|
120
|
+
process.stdout.write(`${JSON.stringify({ running: true, url, version })}\n`);
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
process.stdout.write(`Convex is running on ${url} (version ${version || "unknown"})\n`);
|
|
124
|
+
}
|
|
125
|
+
return 0;
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
clearTimeout(timer);
|
|
129
|
+
if (opts.json) {
|
|
130
|
+
process.stdout.write(`${JSON.stringify({ running: false, url })}\n`);
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
process.stdout.write(`Convex is not running on ${host}:${port}\n`);
|
|
134
|
+
}
|
|
135
|
+
return 1;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
if (opts.action === "stop") {
|
|
139
|
+
// Kept deliberately simple + safe: `brigade convex dev` runs in the
|
|
140
|
+
// foreground, so there's no daemon PID to signal. Killing arbitrary
|
|
141
|
+
// processes by port would be unsafe; tell the operator how to stop it.
|
|
142
|
+
process.stdout.write("`brigade convex dev` runs in the foreground — stop it with Ctrl-C in its terminal.\n");
|
|
143
|
+
return 0;
|
|
144
|
+
}
|
|
145
|
+
if (opts.action === "codegen") {
|
|
146
|
+
const keyFile = join(dataDir, "admin-key.txt");
|
|
147
|
+
if (!existsSync(keyFile)) {
|
|
148
|
+
process.stderr.write("No Convex backend found — run `brigade convex dev` first.\n");
|
|
149
|
+
return 1;
|
|
150
|
+
}
|
|
151
|
+
const key = readFileSync(keyFile, "utf8").trim();
|
|
152
|
+
return (spawnSync("npx", ["convex", "codegen", "--admin-key", key, "--url", `http://${DEFAULT_HOST}:${DEFAULT_PORT}`], {
|
|
153
|
+
cwd: pkgRoot,
|
|
154
|
+
env,
|
|
155
|
+
stdio: "inherit",
|
|
156
|
+
shell: process.platform === "win32", // resolves npx.cmd on Windows
|
|
157
|
+
}).status ?? 1);
|
|
158
|
+
}
|
|
159
|
+
// Exhaustive — every action is handled above.
|
|
160
|
+
return 1;
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=convex-cmd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"convex-cmd.js","sourceRoot":"","sources":["../../../src/cli/commands/convex-cmd.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build-program.d.ts","sourceRoot":"","sources":["../../../src/cli/program/build-program.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"build-program.d.ts","sourceRoot":"","sources":["../../../src/cli/program/build-program.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiGpC,wBAAgB,YAAY,IAAI,OAAO,CAq7CtC"}
|