@spinabot/brigade 1.0.1 → 1.0.2
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/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":1782023379616,"head":"61cbf9e328c11cd48b152ce27039e857cffbc271"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@spinabot/brigade",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "Brigade — your personal AI crew",
|
|
5
5
|
"homepage": "https://brigade-agent.ai",
|
|
6
6
|
"author": "Spinabot",
|
|
@@ -32,9 +32,15 @@
|
|
|
32
32
|
"brigade.mjs",
|
|
33
33
|
"scripts/run-brigade.mjs",
|
|
34
34
|
"scripts/build-done.mjs",
|
|
35
|
+
"scripts/install-convex.mjs",
|
|
36
|
+
"scripts/convex-dev.mjs",
|
|
37
|
+
"scripts/convex-push.mjs",
|
|
35
38
|
"dist/**/*",
|
|
36
39
|
"templates/**/*",
|
|
37
40
|
"skills/**/*",
|
|
41
|
+
"convex/**/*.ts",
|
|
42
|
+
"convex/_generated/**",
|
|
43
|
+
"convex/tsconfig.json",
|
|
38
44
|
"README.md",
|
|
39
45
|
"LICENSE"
|
|
40
46
|
],
|