@spinabot/brigade 1.13.0 → 1.14.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.
Files changed (59) hide show
  1. package/convex/logs.d.ts +3 -3
  2. package/convex/memory.d.ts +21 -21
  3. package/convex/schema.d.ts +9 -9
  4. package/convex/skills.d.ts +3 -3
  5. package/dist/buildstamp.json +1 -1
  6. package/dist/cli/commands/config-cmd.d.ts +12 -19
  7. package/dist/cli/commands/config-cmd.d.ts.map +1 -1
  8. package/dist/cli/commands/config-cmd.js +14 -197
  9. package/dist/cli/commands/config-cmd.js.map +1 -1
  10. package/dist/core/agents-crud-ops.d.ts +15 -0
  11. package/dist/core/agents-crud-ops.d.ts.map +1 -0
  12. package/dist/core/agents-crud-ops.js +27 -0
  13. package/dist/core/agents-crud-ops.js.map +1 -0
  14. package/dist/core/agents-ops.d.ts +43 -0
  15. package/dist/core/agents-ops.d.ts.map +1 -0
  16. package/dist/core/agents-ops.js +117 -0
  17. package/dist/core/agents-ops.js.map +1 -0
  18. package/dist/core/channels-ops.d.ts +30 -0
  19. package/dist/core/channels-ops.d.ts.map +1 -0
  20. package/dist/core/channels-ops.js +52 -0
  21. package/dist/core/channels-ops.js.map +1 -0
  22. package/dist/core/config-ops.d.ts +77 -0
  23. package/dist/core/config-ops.d.ts.map +1 -0
  24. package/dist/core/config-ops.js +241 -0
  25. package/dist/core/config-ops.js.map +1 -0
  26. package/dist/core/exec-ops.d.ts +48 -0
  27. package/dist/core/exec-ops.d.ts.map +1 -0
  28. package/dist/core/exec-ops.js +101 -0
  29. package/dist/core/exec-ops.js.map +1 -0
  30. package/dist/core/integrations-ops.d.ts +25 -0
  31. package/dist/core/integrations-ops.d.ts.map +1 -0
  32. package/dist/core/integrations-ops.js +40 -0
  33. package/dist/core/integrations-ops.js.map +1 -0
  34. package/dist/core/memory-ops.d.ts +20 -0
  35. package/dist/core/memory-ops.d.ts.map +1 -0
  36. package/dist/core/memory-ops.js +40 -0
  37. package/dist/core/memory-ops.js.map +1 -0
  38. package/dist/core/pairing-ops.d.ts +33 -0
  39. package/dist/core/pairing-ops.d.ts.map +1 -0
  40. package/dist/core/pairing-ops.js +78 -0
  41. package/dist/core/pairing-ops.js.map +1 -0
  42. package/dist/core/provider-ops.d.ts +17 -0
  43. package/dist/core/provider-ops.d.ts.map +1 -0
  44. package/dist/core/provider-ops.js +29 -0
  45. package/dist/core/provider-ops.js.map +1 -0
  46. package/dist/core/server.d.ts.map +1 -1
  47. package/dist/core/server.js +91 -0
  48. package/dist/core/server.js.map +1 -1
  49. package/dist/core/sessions-ops.d.ts +25 -0
  50. package/dist/core/sessions-ops.d.ts.map +1 -0
  51. package/dist/core/sessions-ops.js +77 -0
  52. package/dist/core/sessions-ops.js.map +1 -0
  53. package/dist/core/skills-ops.d.ts +14 -0
  54. package/dist/core/skills-ops.d.ts.map +1 -0
  55. package/dist/core/skills-ops.js +28 -0
  56. package/dist/core/skills-ops.js.map +1 -0
  57. package/dist/protocol/methods.d.ts +478 -0
  58. package/dist/protocol/methods.d.ts.map +1 -1
  59. package/package.json +1 -1
package/convex/logs.d.ts CHANGED
@@ -1,11 +1,11 @@
1
1
  export declare const appendSessionEvent: import("convex/server").RegisteredMutation<"public", {
2
2
  toolName?: string | undefined;
3
+ role?: string | undefined;
3
4
  content?: ArrayBuffer | undefined;
4
5
  args?: ArrayBuffer | undefined;
5
6
  aborted?: boolean | undefined;
6
7
  inner?: string | undefined;
7
8
  delta?: string | undefined;
8
- role?: string | undefined;
9
9
  stopReason?: string | undefined;
10
10
  errorMessage?: string | undefined;
11
11
  toolCallId?: string | undefined;
@@ -33,12 +33,12 @@ export declare const readSessionEventTail: import("convex/server").RegisteredQue
33
33
  _id: import("convex/values").GenericId<"sessionEvents">;
34
34
  _creationTime: number;
35
35
  toolName?: string | undefined;
36
+ role?: string | undefined;
36
37
  content?: ArrayBuffer | undefined;
37
38
  args?: ArrayBuffer | undefined;
38
39
  aborted?: boolean | undefined;
39
40
  inner?: string | undefined;
40
41
  delta?: string | undefined;
41
- role?: string | undefined;
42
42
  stopReason?: string | undefined;
43
43
  errorMessage?: string | undefined;
44
44
  toolCallId?: string | undefined;
@@ -65,12 +65,12 @@ export declare const findLastError: import("convex/server").RegisteredQuery<"pub
65
65
  _id: import("convex/values").GenericId<"sessionEvents">;
66
66
  _creationTime: number;
67
67
  toolName?: string | undefined;
68
+ role?: string | undefined;
68
69
  content?: ArrayBuffer | undefined;
69
70
  args?: ArrayBuffer | undefined;
70
71
  aborted?: boolean | undefined;
71
72
  inner?: string | undefined;
72
73
  delta?: string | undefined;
73
- role?: string | undefined;
74
74
  stopReason?: string | undefined;
75
75
  errorMessage?: string | undefined;
76
76
  toolCallId?: string | undefined;
@@ -7,7 +7,7 @@ export declare const listFacts: import("convex/server").RegisteredQuery<"public"
7
7
  _creationTime: number;
8
8
  metadata?: any;
9
9
  status?: "asserted" | "provisional" | "confirmed" | "disputed" | "retracted" | undefined;
10
- sourceType?: "user_instruction" | "owner_message" | "channel_message" | "tool_output" | "retrieved_document" | "compaction" | "extraction" | "dream" | undefined;
10
+ sourceType?: "dream" | "user_instruction" | "owner_message" | "channel_message" | "tool_output" | "retrieved_document" | "compaction" | "extraction" | undefined;
11
11
  sourceTurn?: string | undefined;
12
12
  supersedes?: string[] | undefined;
13
13
  links?: {
@@ -30,11 +30,11 @@ export declare const listFacts: import("convex/server").RegisteredQuery<"public"
30
30
  createdBySessionKey?: string | undefined;
31
31
  createdByAccountId?: string | undefined;
32
32
  createdAt: number;
33
- memoryId: string;
34
33
  content: ArrayBuffer;
34
+ memoryId: string;
35
35
  segment: "project" | "context" | "identity" | "preference" | "correction" | "relationship" | "knowledge";
36
- tier: "short" | "long" | "permanent";
37
36
  importance: number;
37
+ tier: "short" | "long" | "permanent";
38
38
  decayRate: number;
39
39
  accessCount: number;
40
40
  lastAccessedAt: number;
@@ -44,7 +44,7 @@ export declare const listFacts: import("convex/server").RegisteredQuery<"public"
44
44
  export declare const writeFact: import("convex/server").RegisteredMutation<"public", {
45
45
  metadata?: any;
46
46
  status?: "asserted" | "provisional" | "confirmed" | "disputed" | "retracted" | undefined;
47
- sourceType?: "user_instruction" | "owner_message" | "channel_message" | "tool_output" | "retrieved_document" | "compaction" | "extraction" | "dream" | undefined;
47
+ sourceType?: "dream" | "user_instruction" | "owner_message" | "channel_message" | "tool_output" | "retrieved_document" | "compaction" | "extraction" | undefined;
48
48
  sourceTurn?: string | undefined;
49
49
  supersedes?: string[] | undefined;
50
50
  links?: {
@@ -66,11 +66,11 @@ export declare const writeFact: import("convex/server").RegisteredMutation<"publ
66
66
  createdByConversationId?: string | undefined;
67
67
  createdBySessionKey?: string | undefined;
68
68
  createdByAccountId?: string | undefined;
69
- memoryId: string;
70
69
  content: ArrayBuffer;
70
+ memoryId: string;
71
71
  segment: "project" | "context" | "identity" | "preference" | "correction" | "relationship" | "knowledge";
72
- tier: "short" | "long" | "permanent";
73
72
  importance: number;
73
+ tier: "short" | "long" | "permanent";
74
74
  decayRate: number;
75
75
  workspaceId: string;
76
76
  }, Promise<{
@@ -78,7 +78,7 @@ export declare const writeFact: import("convex/server").RegisteredMutation<"publ
78
78
  _creationTime: number;
79
79
  metadata?: any;
80
80
  status?: "asserted" | "provisional" | "confirmed" | "disputed" | "retracted" | undefined;
81
- sourceType?: "user_instruction" | "owner_message" | "channel_message" | "tool_output" | "retrieved_document" | "compaction" | "extraction" | "dream" | undefined;
81
+ sourceType?: "dream" | "user_instruction" | "owner_message" | "channel_message" | "tool_output" | "retrieved_document" | "compaction" | "extraction" | undefined;
82
82
  sourceTurn?: string | undefined;
83
83
  supersedes?: string[] | undefined;
84
84
  links?: {
@@ -101,11 +101,11 @@ export declare const writeFact: import("convex/server").RegisteredMutation<"publ
101
101
  createdBySessionKey?: string | undefined;
102
102
  createdByAccountId?: string | undefined;
103
103
  createdAt: number;
104
- memoryId: string;
105
104
  content: ArrayBuffer;
105
+ memoryId: string;
106
106
  segment: "project" | "context" | "identity" | "preference" | "correction" | "relationship" | "knowledge";
107
- tier: "short" | "long" | "permanent";
108
107
  importance: number;
108
+ tier: "short" | "long" | "permanent";
109
109
  decayRate: number;
110
110
  accessCount: number;
111
111
  lastAccessedAt: number;
@@ -123,7 +123,7 @@ export declare const listAllFacts: import("convex/server").RegisteredQuery<"publ
123
123
  _creationTime: number;
124
124
  metadata?: any;
125
125
  status?: "asserted" | "provisional" | "confirmed" | "disputed" | "retracted" | undefined;
126
- sourceType?: "user_instruction" | "owner_message" | "channel_message" | "tool_output" | "retrieved_document" | "compaction" | "extraction" | "dream" | undefined;
126
+ sourceType?: "dream" | "user_instruction" | "owner_message" | "channel_message" | "tool_output" | "retrieved_document" | "compaction" | "extraction" | undefined;
127
127
  sourceTurn?: string | undefined;
128
128
  supersedes?: string[] | undefined;
129
129
  links?: {
@@ -146,11 +146,11 @@ export declare const listAllFacts: import("convex/server").RegisteredQuery<"publ
146
146
  createdBySessionKey?: string | undefined;
147
147
  createdByAccountId?: string | undefined;
148
148
  createdAt: number;
149
- memoryId: string;
150
149
  content: ArrayBuffer;
150
+ memoryId: string;
151
151
  segment: "project" | "context" | "identity" | "preference" | "correction" | "relationship" | "knowledge";
152
- tier: "short" | "long" | "permanent";
153
152
  importance: number;
153
+ tier: "short" | "long" | "permanent";
154
154
  decayRate: number;
155
155
  accessCount: number;
156
156
  lastAccessedAt: number;
@@ -163,7 +163,7 @@ export declare const listAllFacts: import("convex/server").RegisteredQuery<"publ
163
163
  export declare const upsertFactRecord: import("convex/server").RegisteredMutation<"public", {
164
164
  metadata?: any;
165
165
  status?: "asserted" | "provisional" | "confirmed" | "disputed" | "retracted" | undefined;
166
- sourceType?: "user_instruction" | "owner_message" | "channel_message" | "tool_output" | "retrieved_document" | "compaction" | "extraction" | "dream" | undefined;
166
+ sourceType?: "dream" | "user_instruction" | "owner_message" | "channel_message" | "tool_output" | "retrieved_document" | "compaction" | "extraction" | undefined;
167
167
  sourceTurn?: string | undefined;
168
168
  supersedes?: string[] | undefined;
169
169
  links?: {
@@ -186,11 +186,11 @@ export declare const upsertFactRecord: import("convex/server").RegisteredMutatio
186
186
  createdBySessionKey?: string | undefined;
187
187
  createdByAccountId?: string | undefined;
188
188
  createdAt: number;
189
- memoryId: string;
190
189
  content: ArrayBuffer;
190
+ memoryId: string;
191
191
  segment: "project" | "context" | "identity" | "preference" | "correction" | "relationship" | "knowledge";
192
- tier: "short" | "long" | "permanent";
193
192
  importance: number;
193
+ tier: "short" | "long" | "permanent";
194
194
  decayRate: number;
195
195
  accessCount: number;
196
196
  lastAccessedAt: number;
@@ -273,7 +273,7 @@ export declare const searchContent: import("convex/server").RegisteredQuery<"pub
273
273
  _creationTime: number;
274
274
  metadata?: any;
275
275
  status?: "asserted" | "provisional" | "confirmed" | "disputed" | "retracted" | undefined;
276
- sourceType?: "user_instruction" | "owner_message" | "channel_message" | "tool_output" | "retrieved_document" | "compaction" | "extraction" | "dream" | undefined;
276
+ sourceType?: "dream" | "user_instruction" | "owner_message" | "channel_message" | "tool_output" | "retrieved_document" | "compaction" | "extraction" | undefined;
277
277
  sourceTurn?: string | undefined;
278
278
  supersedes?: string[] | undefined;
279
279
  links?: {
@@ -296,11 +296,11 @@ export declare const searchContent: import("convex/server").RegisteredQuery<"pub
296
296
  createdBySessionKey?: string | undefined;
297
297
  createdByAccountId?: string | undefined;
298
298
  createdAt: number;
299
- memoryId: string;
300
299
  content: ArrayBuffer;
300
+ memoryId: string;
301
301
  segment: "project" | "context" | "identity" | "preference" | "correction" | "relationship" | "knowledge";
302
- tier: "short" | "long" | "permanent";
303
302
  importance: number;
303
+ tier: "short" | "long" | "permanent";
304
304
  decayRate: number;
305
305
  accessCount: number;
306
306
  lastAccessedAt: number;
@@ -317,7 +317,7 @@ export declare const findSimilar: import("convex/server").RegisteredQuery<"publi
317
317
  _creationTime: number;
318
318
  metadata?: any;
319
319
  status?: "asserted" | "provisional" | "confirmed" | "disputed" | "retracted" | undefined;
320
- sourceType?: "user_instruction" | "owner_message" | "channel_message" | "tool_output" | "retrieved_document" | "compaction" | "extraction" | "dream" | undefined;
320
+ sourceType?: "dream" | "user_instruction" | "owner_message" | "channel_message" | "tool_output" | "retrieved_document" | "compaction" | "extraction" | undefined;
321
321
  sourceTurn?: string | undefined;
322
322
  supersedes?: string[] | undefined;
323
323
  links?: {
@@ -340,11 +340,11 @@ export declare const findSimilar: import("convex/server").RegisteredQuery<"publi
340
340
  createdBySessionKey?: string | undefined;
341
341
  createdByAccountId?: string | undefined;
342
342
  createdAt: number;
343
- memoryId: string;
344
343
  content: ArrayBuffer;
344
+ memoryId: string;
345
345
  segment: "project" | "context" | "identity" | "preference" | "correction" | "relationship" | "knowledge";
346
- tier: "short" | "long" | "permanent";
347
346
  importance: number;
347
+ tier: "short" | "long" | "permanent";
348
348
  decayRate: number;
349
349
  accessCount: number;
350
350
  lastAccessedAt: number;
@@ -135,7 +135,7 @@ declare const _default: import("convex/server").SchemaDefinition<{
135
135
  memoryFacts: import("convex/server").TableDefinition<import("convex/values").VObject<{
136
136
  metadata?: any;
137
137
  status?: "asserted" | "provisional" | "confirmed" | "disputed" | "retracted" | undefined;
138
- sourceType?: "user_instruction" | "owner_message" | "channel_message" | "tool_output" | "retrieved_document" | "compaction" | "extraction" | "dream" | undefined;
138
+ sourceType?: "dream" | "user_instruction" | "owner_message" | "channel_message" | "tool_output" | "retrieved_document" | "compaction" | "extraction" | undefined;
139
139
  sourceTurn?: string | undefined;
140
140
  supersedes?: string[] | undefined;
141
141
  links?: {
@@ -158,11 +158,11 @@ declare const _default: import("convex/server").SchemaDefinition<{
158
158
  createdBySessionKey?: string | undefined;
159
159
  createdByAccountId?: string | undefined;
160
160
  createdAt: number;
161
- memoryId: string;
162
161
  content: ArrayBuffer;
162
+ memoryId: string;
163
163
  segment: "project" | "context" | "identity" | "preference" | "correction" | "relationship" | "knowledge";
164
- tier: "short" | "long" | "permanent";
165
164
  importance: number;
165
+ tier: "short" | "long" | "permanent";
166
166
  decayRate: number;
167
167
  accessCount: number;
168
168
  lastAccessedAt: number;
@@ -187,7 +187,7 @@ declare const _default: import("convex/server").SchemaDefinition<{
187
187
  createdByConversationId: import("convex/values").VString<string | undefined, "optional">;
188
188
  createdBySessionKey: import("convex/values").VString<string | undefined, "optional">;
189
189
  createdByAccountId: import("convex/values").VString<string | undefined, "optional">;
190
- sourceType: import("convex/values").VUnion<"user_instruction" | "owner_message" | "channel_message" | "tool_output" | "retrieved_document" | "compaction" | "extraction" | "dream" | undefined, [import("convex/values").VLiteral<"user_instruction", "required">, import("convex/values").VLiteral<"owner_message", "required">, import("convex/values").VLiteral<"channel_message", "required">, import("convex/values").VLiteral<"tool_output", "required">, import("convex/values").VLiteral<"retrieved_document", "required">, import("convex/values").VLiteral<"compaction", "required">, import("convex/values").VLiteral<"extraction", "required">, import("convex/values").VLiteral<"dream", "required">], "optional", never>;
190
+ sourceType: import("convex/values").VUnion<"dream" | "user_instruction" | "owner_message" | "channel_message" | "tool_output" | "retrieved_document" | "compaction" | "extraction" | undefined, [import("convex/values").VLiteral<"user_instruction", "required">, import("convex/values").VLiteral<"owner_message", "required">, import("convex/values").VLiteral<"channel_message", "required">, import("convex/values").VLiteral<"tool_output", "required">, import("convex/values").VLiteral<"retrieved_document", "required">, import("convex/values").VLiteral<"compaction", "required">, import("convex/values").VLiteral<"extraction", "required">, import("convex/values").VLiteral<"dream", "required">], "optional", never>;
191
191
  links: import("convex/values").VArray<{
192
192
  reason?: string | undefined;
193
193
  strength?: number | undefined;
@@ -214,7 +214,7 @@ declare const _default: import("convex/server").SchemaDefinition<{
214
214
  subjectKey: import("convex/values").VString<string | undefined, "optional">;
215
215
  metadata: import("convex/values").VAny<any, "optional", string>;
216
216
  embedding: import("convex/values").VArray<number[] | undefined, import("convex/values").VFloat64<number, "required">, "optional">;
217
- }, "required", "metadata" | "createdAt" | "status" | "memoryId" | "sourceType" | "content" | "segment" | "tier" | "importance" | "decayRate" | "accessCount" | "lastAccessedAt" | "sourceTurn" | "supersedes" | "lifecycle" | "links" | "validFrom" | "validTo" | "confidence" | "sourcePointers" | "embedding" | "modality" | "mediaPointer" | "subjectKey" | "workspaceId" | "createdByKind" | "createdByChannelId" | "createdByConversationId" | "createdBySessionKey" | "createdByAccountId" | `metadata.${string}`>, {
217
+ }, "required", "metadata" | "createdAt" | "status" | "content" | "memoryId" | "segment" | "importance" | "sourceType" | "tier" | "decayRate" | "accessCount" | "lastAccessedAt" | "sourceTurn" | "supersedes" | "lifecycle" | "links" | "validFrom" | "validTo" | "confidence" | "sourcePointers" | "embedding" | "modality" | "mediaPointer" | "subjectKey" | "workspaceId" | "createdByKind" | "createdByChannelId" | "createdByConversationId" | "createdBySessionKey" | "createdByAccountId" | `metadata.${string}`>, {
218
218
  by_workspace_lifecycle_createdAt: ["workspaceId", "lifecycle", "createdAt", "_creationTime"];
219
219
  by_workspace_memoryId: ["workspaceId", "memoryId", "_creationTime"];
220
220
  by_workspace_segment_lifecycle: ["workspaceId", "segment", "lifecycle", "_creationTime"];
@@ -371,12 +371,12 @@ declare const _default: import("convex/server").SchemaDefinition<{
371
371
  }, {}, {}>;
372
372
  sessionEvents: import("convex/server").TableDefinition<import("convex/values").VObject<{
373
373
  toolName?: string | undefined;
374
+ role?: string | undefined;
374
375
  content?: ArrayBuffer | undefined;
375
376
  args?: ArrayBuffer | undefined;
376
377
  aborted?: boolean | undefined;
377
378
  inner?: string | undefined;
378
379
  delta?: string | undefined;
379
- role?: string | undefined;
380
380
  stopReason?: string | undefined;
381
381
  errorMessage?: string | undefined;
382
382
  toolCallId?: string | undefined;
@@ -421,7 +421,7 @@ declare const _default: import("convex/server").SchemaDefinition<{
421
421
  messageCount: import("convex/values").VFloat64<number | undefined, "optional">;
422
422
  success: import("convex/values").VBoolean<boolean | undefined, "optional">;
423
423
  finalError: import("convex/values").VString<string | undefined, "optional">;
424
- }, "required", "type" | "agentId" | "sessionKey" | "toolName" | "content" | "ts" | "args" | "aborted" | "inner" | "delta" | "role" | "stopReason" | "errorMessage" | "toolCallId" | "isError" | "result" | "attempt" | "maxAttempts" | "delayMs" | "success" | "finalError" | "willRetry" | "messageCount" | "day" | "ownerId">, {
424
+ }, "required", "type" | "agentId" | "sessionKey" | "toolName" | "role" | "content" | "ts" | "args" | "aborted" | "inner" | "delta" | "stopReason" | "errorMessage" | "toolCallId" | "isError" | "result" | "attempt" | "maxAttempts" | "delayMs" | "success" | "finalError" | "willRetry" | "messageCount" | "day" | "ownerId">, {
425
425
  by_owner_day: ["ownerId", "day", "_creationTime"];
426
426
  by_owner_session: ["ownerId", "sessionKey", "ts", "_creationTime"];
427
427
  by_owner_error: ["ownerId", "isError", "ts", "_creationTime"];
@@ -859,10 +859,10 @@ declare const _default: import("convex/server").SchemaDefinition<{
859
859
  source: "bundled" | "config" | "managed" | "personal" | "project" | "workspace";
860
860
  description: string;
861
861
  createdAt: number;
862
+ body: string;
862
863
  ownerId: string;
863
864
  updatedAt: number;
864
865
  frontmatter: string;
865
- body: string;
866
866
  eligibility: {
867
867
  os: string[];
868
868
  requiresBins: string[];
@@ -895,7 +895,7 @@ declare const _default: import("convex/server").SchemaDefinition<{
895
895
  disableModelInvocation: import("convex/values").VBoolean<boolean, "required">;
896
896
  createdAt: import("convex/values").VFloat64<number, "required">;
897
897
  updatedAt: import("convex/values").VFloat64<number, "required">;
898
- }, "required", "agentId" | "name" | "source" | "description" | "createdAt" | "ownerId" | "updatedAt" | "frontmatter" | "body" | "eligibility" | "disableModelInvocation" | "eligibility.os" | "eligibility.requiresBins" | "eligibility.requiresAnyBins" | "eligibility.requiresEnv" | "eligibility.requiresConfig">, {
898
+ }, "required", "agentId" | "name" | "source" | "description" | "createdAt" | "body" | "ownerId" | "updatedAt" | "frontmatter" | "eligibility" | "disableModelInvocation" | "eligibility.os" | "eligibility.requiresBins" | "eligibility.requiresAnyBins" | "eligibility.requiresEnv" | "eligibility.requiresConfig">, {
899
899
  by_owner_name: ["ownerId", "name", "_creationTime"];
900
900
  by_owner_scope_name: ["ownerId", "source", "agentId", "name", "_creationTime"];
901
901
  by_owner_source: ["ownerId", "source", "_creationTime"];
@@ -10,10 +10,10 @@ export declare const list: import("convex/server").RegisteredQuery<"public", {
10
10
  source: "bundled" | "config" | "managed" | "personal" | "project" | "workspace";
11
11
  description: string;
12
12
  createdAt: number;
13
+ body: string;
13
14
  ownerId: string;
14
15
  updatedAt: number;
15
16
  frontmatter: string;
16
- body: string;
17
17
  eligibility: {
18
18
  os: string[];
19
19
  requiresBins: string[];
@@ -34,10 +34,10 @@ export declare const get: import("convex/server").RegisteredQuery<"public", {
34
34
  source: "bundled" | "config" | "managed" | "personal" | "project" | "workspace";
35
35
  description: string;
36
36
  createdAt: number;
37
+ body: string;
37
38
  ownerId: string;
38
39
  updatedAt: number;
39
40
  frontmatter: string;
40
- body: string;
41
41
  eligibility: {
42
42
  os: string[];
43
43
  requiresBins: string[];
@@ -52,9 +52,9 @@ export declare const upsert: import("convex/server").RegisteredMutation<"public"
52
52
  name: string;
53
53
  source: "bundled" | "config" | "managed" | "personal" | "project" | "workspace";
54
54
  description: string;
55
+ body: string;
55
56
  ownerId: string;
56
57
  frontmatter: string;
57
- body: string;
58
58
  eligibility: {
59
59
  os: string[];
60
60
  requiresBins: string[];
@@ -1 +1 @@
1
- {"builtAt":1782487324269,"head":"ab1a71d75d3e570070899e5e4d4552506ad4cd4b","version":"1.13.0"}
1
+ {"builtAt":1782494628001,"head":"0bb31be61f20c7c0a1de17024a71ea185306c42a","version":"1.14.0"}
@@ -1,18 +1,17 @@
1
1
  /**
2
- * `brigade config <list|get|set|unset|file>` — config CRUD over brigade.json.
2
+ * `brigade config <list|get|set|unset|file|schema|validate>` — config CRUD
3
+ * over brigade.json.
3
4
  *
4
- * - 4 subcommands (no `schema` / `validate` Brigade's TypeBox schema is
5
- * private and validation happens automatically on every write through
6
- * `writeBrigadeConfig`).
7
- * - Dot-notation only (no `path[0]` array indexing) Brigade's super-
8
- * config has no positional arrays the user would target by index.
9
- * - JSON5 parsing for `set` values when --strict-json is off (numbers,
10
- * booleans, arrays, objects) with raw-string fallback.
11
- * - Atomic write + 4-deep .bak rotation already inherited from
12
- * `writeBrigadeConfig` — no extra wiring needed.
5
+ * The path parsing, nested get/set/delete, value parsing, and secret redaction
6
+ * all live in `core/config-ops.ts` SHARED with the `config.*` gateway RPCs so
7
+ * the CLI and a remote client mutate config (and redact secrets) identically.
8
+ * This file is the thin CLI shell: arg handling + stdout/exit-code formatting.
9
+ *
10
+ * - Dot-notation paths (+ escaped dots + bracket indices/keys).
11
+ * - JSON5 parsing for `set` values when --strict-json is off, raw-string fallback.
12
+ * - Atomic write + .bak rotation inherited from `saveConfig`.
13
13
  * - Secrets redaction in `list`/`get`: any segment matching
14
- * /^(key|apiKey|token|password|secret)$/i (case-insensitive) renders
15
- * as `__BRIGADE_REDACTED__`.
14
+ * /^(key|apiKey|token|password|secret|...)$/i renders as `__BRIGADE_REDACTED__`.
16
15
  *
17
16
  * On-disk path: `~/.brigade/brigade.json` (resolved via BRIGADE_DIR).
18
17
  */
@@ -41,19 +40,13 @@ export declare function runConfigFile(opts?: {
41
40
  /**
42
41
  * Print the brigade.json TypeBox schema as JSON — useful for IDE /
43
42
  * external-tool autocompletion against the live shape.
44
- *
45
- * The output is the in-memory TypeBox schema descriptor (with `type`,
46
- * `properties`, `required`, etc.) — JSON-Schema-compatible enough to feed
47
- * into a JSON-Schema-aware editor.
48
43
  */
49
44
  export declare function runConfigSchema(_opts?: {}): Promise<number>;
50
45
  /**
51
46
  * Validate the on-disk brigade.json against the TypeBox schema. Reports a
52
47
  * pass/fail line plus per-issue path + message when invalid.
53
48
  *
54
- * Exit codes:
55
- * 0 — config is valid (or doesn't exist yet — empty file is benign)
56
- * 1 — config is invalid; issues listed
49
+ * Exit codes: 0 — valid (or absent); 1 — invalid (issues listed).
57
50
  */
58
51
  export declare function runConfigValidate(opts?: {
59
52
  json?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"config-cmd.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/config-cmd.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAKH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAezC,MAAM,WAAW,gBAAgB;IAChC,IAAI,CAAC,EAAE,OAAO,CAAC;CACf;AACD,MAAM,WAAW,gBAAgB;IAChC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;CACjB;AACD,MAAM,WAAW,iBAAiB;IACjC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACnB;AAiLD,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,gBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC,CAoBhG;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,GAAE,gBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC,CA8BlH;AAED,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAsBpG;AAED,wBAAsB,aAAa,CAAC,IAAI,GAAE,iBAAsB,GAAG,OAAO,CAAC,MAAM,CAAC,CAUjF;AAED,wBAAsB,aAAa,CAAC,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAQlF;AAED;;;;;;;GAOG;AACH,wBAAsB,eAAe,CAAC,KAAK,GAAE,EAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAGrE;AAED;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAuCtF;AAID,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsD5D"}
1
+ {"version":3,"file":"config-cmd.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/config-cmd.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAKH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiBzC,MAAM,WAAW,gBAAgB;IAChC,IAAI,CAAC,EAAE,OAAO,CAAC;CACf;AACD,MAAM,WAAW,gBAAgB;IAChC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;CACjB;AACD,MAAM,WAAW,iBAAiB;IACjC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACnB;AAID,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,gBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC,CAoBhG;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,GAAE,gBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC,CA8BlH;AAED,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAsBpG;AAED,wBAAsB,aAAa,CAAC,IAAI,GAAE,iBAAsB,GAAG,OAAO,CAAC,MAAM,CAAC,CAUjF;AAED,wBAAsB,aAAa,CAAC,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAQlF;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,KAAK,GAAE,EAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAGrE;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAuCtF;AAID,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsD5D"}
@@ -1,202 +1,25 @@
1
1
  /**
2
- * `brigade config <list|get|set|unset|file>` — config CRUD over brigade.json.
2
+ * `brigade config <list|get|set|unset|file|schema|validate>` — config CRUD
3
+ * over brigade.json.
3
4
  *
4
- * - 4 subcommands (no `schema` / `validate` Brigade's TypeBox schema is
5
- * private and validation happens automatically on every write through
6
- * `writeBrigadeConfig`).
7
- * - Dot-notation only (no `path[0]` array indexing) Brigade's super-
8
- * config has no positional arrays the user would target by index.
9
- * - JSON5 parsing for `set` values when --strict-json is off (numbers,
10
- * booleans, arrays, objects) with raw-string fallback.
11
- * - Atomic write + 4-deep .bak rotation already inherited from
12
- * `writeBrigadeConfig` — no extra wiring needed.
5
+ * The path parsing, nested get/set/delete, value parsing, and secret redaction
6
+ * all live in `core/config-ops.ts` SHARED with the `config.*` gateway RPCs so
7
+ * the CLI and a remote client mutate config (and redact secrets) identically.
8
+ * This file is the thin CLI shell: arg handling + stdout/exit-code formatting.
9
+ *
10
+ * - Dot-notation paths (+ escaped dots + bracket indices/keys).
11
+ * - JSON5 parsing for `set` values when --strict-json is off, raw-string fallback.
12
+ * - Atomic write + .bak rotation inherited from `saveConfig`.
13
13
  * - Secrets redaction in `list`/`get`: any segment matching
14
- * /^(key|apiKey|token|password|secret)$/i (case-insensitive) renders
15
- * as `__BRIGADE_REDACTED__`.
14
+ * /^(key|apiKey|token|password|secret|...)$/i renders as `__BRIGADE_REDACTED__`.
16
15
  *
17
16
  * On-disk path: `~/.brigade/brigade.json` (resolved via BRIGADE_DIR).
18
17
  */
19
18
  import * as path from "node:path";
20
19
  import chalk from "chalk";
21
- import JSON5 from "json5";
22
20
  import { BrigadeConfigSchema, BRIGADE_CONFIG_FILENAME, collectBrigadeConfigErrors, } from "../../core/brigade-config.js";
23
21
  import { BRIGADE_DIR, loadConfig, saveConfig } from "../../core/config.js";
24
- const REDACTED_SENTINEL = "__BRIGADE_REDACTED__";
25
- // Case-insensitive match — segments that smell secret get their VALUE redacted
26
- // in `list` and `get` output. The actual on-disk file is unchanged.
27
- const SENSITIVE_SEGMENT = /^(key|apikey|token|secret|password|refreshtoken|accesstoken)$/i;
28
- /* ───────────────────────── path helpers ───────────────────────── */
29
- /**
30
- * Parse a config path into segments. Supports:
31
- *
32
- * - dot-notation: `agents.defaults.provider`
33
- * - escaped dot: `keys.foo\.bar` → ["keys", "foo.bar"]
34
- * - bracket array index: `agents.fallbacks[0]` → ["agents", "fallbacks", "0"]
35
- * - bracket literal key: `secrets.providers["my.vault"]` → ["secrets", "providers", "my.vault"]
36
- *
37
- * Bracket support is the genuine ergonomic win (operators editing array
38
- * slots in `agents.defaults.model.fallbacks[]` shouldn't have to fall
39
- * through to `--strict-json` whole-array overwrites).
40
- */
41
- function parsePath(raw) {
42
- const trimmed = raw.trim();
43
- if (trimmed.length === 0) {
44
- throw new Error("config path is empty");
45
- }
46
- const segments = [];
47
- let buf = "";
48
- for (let i = 0; i < trimmed.length; i++) {
49
- const ch = trimmed[i];
50
- // Escape a literal dot inside a key.
51
- if (ch === "\\" && trimmed[i + 1] === ".") {
52
- buf += ".";
53
- i++;
54
- continue;
55
- }
56
- // Dot separator.
57
- if (ch === ".") {
58
- if (buf.length === 0) {
59
- throw new Error(`empty segment in config path "${raw}"`);
60
- }
61
- segments.push(buf);
62
- buf = "";
63
- continue;
64
- }
65
- // Bracket: either array index `[0]` or literal key `["foo.bar"]`.
66
- if (ch === "[") {
67
- if (buf.length > 0) {
68
- segments.push(buf);
69
- buf = "";
70
- }
71
- const close = trimmed.indexOf("]", i);
72
- if (close === -1) {
73
- throw new Error(`unclosed "[" in config path "${raw}"`);
74
- }
75
- let inside = trimmed.slice(i + 1, close).trim();
76
- // Strip optional surrounding quotes — accept both `[0]` and `["key"]`.
77
- if ((inside.startsWith('"') && inside.endsWith('"')) ||
78
- (inside.startsWith("'") && inside.endsWith("'"))) {
79
- inside = inside.slice(1, -1);
80
- }
81
- if (inside.length === 0) {
82
- throw new Error(`empty bracket segment in config path "${raw}"`);
83
- }
84
- segments.push(inside);
85
- i = close;
86
- continue;
87
- }
88
- buf += ch;
89
- }
90
- if (buf.length > 0)
91
- segments.push(buf);
92
- if (segments.length === 0) {
93
- throw new Error(`unable to parse config path "${raw}"`);
94
- }
95
- return segments;
96
- }
97
- /** True iff the segment looks like a non-negative integer (array index). */
98
- function isIndexSegment(seg) {
99
- return /^[0-9]+$/.test(seg);
100
- }
101
- function getNested(root, segments) {
102
- let cur = root;
103
- for (const seg of segments) {
104
- if (cur === null || cur === undefined)
105
- return undefined;
106
- if (Array.isArray(cur) && isIndexSegment(seg)) {
107
- cur = cur[Number(seg)];
108
- continue;
109
- }
110
- if (typeof cur !== "object")
111
- return undefined;
112
- cur = cur[seg];
113
- }
114
- return cur;
115
- }
116
- function setNested(root, segments, value) {
117
- let cur = root;
118
- for (let i = 0; i < segments.length - 1; i++) {
119
- const seg = segments[i] ?? "";
120
- const nextSeg = segments[i + 1] ?? "";
121
- const wantArray = isIndexSegment(nextSeg);
122
- const existing = Array.isArray(cur) && isIndexSegment(seg) ? cur[Number(seg)] : cur[seg];
123
- if (existing === undefined || existing === null || typeof existing !== "object") {
124
- // Create container in the right shape for the NEXT segment.
125
- const fresh = wantArray ? [] : {};
126
- if (Array.isArray(cur) && isIndexSegment(seg)) {
127
- cur[Number(seg)] = fresh;
128
- }
129
- else {
130
- cur[seg] = fresh;
131
- }
132
- cur = fresh;
133
- }
134
- else {
135
- cur = Array.isArray(cur) && isIndexSegment(seg) ? cur[Number(seg)] : cur[seg];
136
- }
137
- }
138
- const tail = segments[segments.length - 1] ?? "";
139
- if (Array.isArray(cur) && isIndexSegment(tail)) {
140
- cur[Number(tail)] = value;
141
- }
142
- else {
143
- cur[tail] = value;
144
- }
145
- }
146
- function deleteNested(root, segments) {
147
- let cur = root;
148
- for (let i = 0; i < segments.length - 1; i++) {
149
- const seg = segments[i] ?? "";
150
- const next = Array.isArray(cur) && isIndexSegment(seg) ? cur[Number(seg)] : cur?.[seg];
151
- if (next === undefined || next === null || typeof next !== "object")
152
- return false;
153
- cur = next;
154
- }
155
- const tail = segments[segments.length - 1] ?? "";
156
- if (Array.isArray(cur) && isIndexSegment(tail)) {
157
- const idx = Number(tail);
158
- if (idx < cur.length) {
159
- cur.splice(idx, 1); // shift down — matches array-mutation semantics
160
- return true;
161
- }
162
- return false;
163
- }
164
- if (cur && typeof cur === "object" && tail in cur) {
165
- delete cur[tail];
166
- return true;
167
- }
168
- return false;
169
- }
170
- /* ───────────────────────── value parsing ─────────────────────── */
171
- function parseValue(raw, opts = {}) {
172
- if (opts.strictJson) {
173
- return JSON.parse(raw);
174
- }
175
- try {
176
- return JSON5.parse(raw);
177
- }
178
- catch {
179
- // Fall through to raw string when JSON5 can't parse it.
180
- return raw;
181
- }
182
- }
183
- /* ───────────────────────── redaction ─────────────────────────── */
184
- function redactDeep(value, segmentsParent = []) {
185
- if (value === null || typeof value !== "object")
186
- return value;
187
- if (Array.isArray(value))
188
- return value.map((v) => redactDeep(v, segmentsParent));
189
- const out = {};
190
- for (const [k, v] of Object.entries(value)) {
191
- if (SENSITIVE_SEGMENT.test(k) && typeof v === "string" && v.length > 0) {
192
- out[k] = REDACTED_SENTINEL;
193
- }
194
- else {
195
- out[k] = redactDeep(v, [...segmentsParent, k]);
196
- }
197
- }
198
- return out;
199
- }
22
+ import { deleteNested, getNested, parseConfigValue, parsePath, redactDeep, setNested, } from "../../core/config-ops.js";
200
23
  /* ───────────────────────── runtime ───────────────────────────── */
201
24
  export async function runConfigGet(rawPath, opts = {}) {
202
25
  const cfg = loadConfig();
@@ -224,7 +47,7 @@ export async function runConfigSet(rawPath, rawValue, opts = {}) {
224
47
  const segments = parsePath(rawPath);
225
48
  let parsed;
226
49
  try {
227
- parsed = parseValue(rawValue, { strictJson: opts.strictJson });
50
+ parsed = parseConfigValue(rawValue, { strictJson: opts.strictJson });
228
51
  }
229
52
  catch (err) {
230
53
  process.stderr.write(`brigade config: failed to parse value: ${err.message}\n`);
@@ -294,10 +117,6 @@ export async function runConfigFile(opts = {}) {
294
117
  /**
295
118
  * Print the brigade.json TypeBox schema as JSON — useful for IDE /
296
119
  * external-tool autocompletion against the live shape.
297
- *
298
- * The output is the in-memory TypeBox schema descriptor (with `type`,
299
- * `properties`, `required`, etc.) — JSON-Schema-compatible enough to feed
300
- * into a JSON-Schema-aware editor.
301
120
  */
302
121
  export async function runConfigSchema(_opts = {}) {
303
122
  process.stdout.write(`${JSON.stringify(BrigadeConfigSchema, null, 2)}\n`);
@@ -307,9 +126,7 @@ export async function runConfigSchema(_opts = {}) {
307
126
  * Validate the on-disk brigade.json against the TypeBox schema. Reports a
308
127
  * pass/fail line plus per-issue path + message when invalid.
309
128
  *
310
- * Exit codes:
311
- * 0 — config is valid (or doesn't exist yet — empty file is benign)
312
- * 1 — config is invalid; issues listed
129
+ * Exit codes: 0 — valid (or absent); 1 — invalid (issues listed).
313
130
  */
314
131
  export async function runConfigValidate(opts = {}) {
315
132
  const filePath = path.join(BRIGADE_DIR, BRIGADE_CONFIG_FILENAME);