@robbeverhelst/do 1.421.0 → 1.423.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 (2) hide show
  1. package/dist/do.js +600 -86
  2. package/package.json +1 -1
package/dist/do.js CHANGED
@@ -14420,7 +14420,7 @@ var configError = (message) => new CliError("config", message, EXIT.CONFIG);
14420
14420
 
14421
14421
  // src/meta.ts
14422
14422
  var CLI_NAME = "do";
14423
- var VERSION = "1.421.0";
14423
+ var VERSION = "1.423.0";
14424
14424
  var API_PREFIX = "/api/v1";
14425
14425
  var DEFAULT_API_URL = "http://localhost:3001";
14426
14426
 
@@ -18304,6 +18304,7 @@ var userSettings = pgTable("user_settings", {
18304
18304
  ui: settingsUi("ui").notNull().default("v1"),
18305
18305
  skin: text("skin").$type().notNull().default("do"),
18306
18306
  skinVariant: text("skin_variant"),
18307
+ skinColors: text("skin_colors"),
18307
18308
  healthTodayHints: text("health_today_hints").array().notNull().default(sql`'{supplements,sleep}'::text[]`),
18308
18309
  createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
18309
18310
  updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow()
@@ -19895,6 +19896,7 @@ var echoAgentRunSchema = object({
19895
19896
  externalId: string2(),
19896
19897
  threadId: string2(),
19897
19898
  postId: string2().nullable(),
19899
+ agentId: string2(),
19898
19900
  kind: _enum2(["kanban", "job", "session"]).nullable(),
19899
19901
  title: string2(),
19900
19902
  agent: postCardWhoSchema,
@@ -20655,13 +20657,15 @@ var agentChatThreads = pgTable("agent_chat_threads", {
20655
20657
  icon: text("icon"),
20656
20658
  description: text("description"),
20657
20659
  memoryScope: text("memory_scope"),
20660
+ mirror: text("mirror").notNull().default("off"),
20658
20661
  lastMessageAt: timestamp("last_message_at", { withTimezone: true }),
20659
20662
  archivedAt: timestamp("archived_at", { withTimezone: true }),
20660
20663
  createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
20661
20664
  updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow()
20662
20665
  }, (t) => [
20663
20666
  index("agent_chat_threads_member_idx").on(t.tenantId, t.userId, t.updatedAt),
20664
- uniqueIndex("agent_chat_threads_slug_uniq").on(t.tenantId, t.userId, t.slug).where(sql`${t.slug} is not null`)
20667
+ uniqueIndex("agent_chat_threads_slug_uniq").on(t.tenantId, t.userId, t.slug).where(sql`${t.slug} is not null`),
20668
+ check2("agent_chat_threads_mirror_chk", sql`${t.mirror} in ('off', 'now', 'all')`)
20665
20669
  ]);
20666
20670
  var agentChatTurns = pgTable("agent_chat_turns", {
20667
20671
  id: text("id").primaryKey(),
@@ -28826,15 +28830,129 @@ var documentOperations = defineOperations({
28826
28830
  }
28827
28831
  });
28828
28832
 
28833
+ // ../../packages/schema/src/contracts/echo-trust.ts
28834
+ var line5 = (max) => string2().trim().min(1).max(max);
28835
+ var echoTrustKeySchema = string2().regex(/^[a-z0-9][a-z0-9-]{0,59}$/, "lower-case letters, digits and dashes, at most 60");
28836
+ var echoActionSchema = object({
28837
+ id: ulidSchema,
28838
+ key: string2(),
28839
+ by: object({ id: string2(), name: string2() }),
28840
+ thread: echoThreadRefSchema.nullable(),
28841
+ kind: string2(),
28842
+ what: string2(),
28843
+ why: string2(),
28844
+ undo: string2().nullable(),
28845
+ undoNote: string2().nullable(),
28846
+ undoUntil: exports_coerce.date().nullable(),
28847
+ at: exports_coerce.date(),
28848
+ undoRequestedAt: exports_coerce.date().nullable(),
28849
+ undoneAt: exports_coerce.date().nullable(),
28850
+ updatedAt: exports_coerce.date()
28851
+ });
28852
+ var putEchoActionInputSchema = object({
28853
+ by: agentNameSchema,
28854
+ thread: line5(40).nullish(),
28855
+ kind: line5(40),
28856
+ what: line5(300),
28857
+ why: line5(160),
28858
+ undo: line5(80).nullish(),
28859
+ undoNote: line5(80).nullish(),
28860
+ undoUntil: exports_coerce.date().nullish(),
28861
+ at: exports_coerce.date().optional(),
28862
+ undone: boolean2().optional()
28863
+ }).strict();
28864
+ var echoActionsQuerySchema = object({ since: exports_coerce.date().optional() });
28865
+ var echoMemorySchema = object({
28866
+ id: ulidSchema,
28867
+ key: string2(),
28868
+ thread: echoThreadRefSchema,
28869
+ text: string2(),
28870
+ source: string2().nullable(),
28871
+ lastUsedAt: exports_coerce.date().nullable(),
28872
+ editedAt: exports_coerce.date().nullable(),
28873
+ forgottenAt: exports_coerce.date().nullable(),
28874
+ updatedAt: exports_coerce.date()
28875
+ });
28876
+ var putEchoMemoryInputSchema = object({
28877
+ thread: line5(40),
28878
+ text: line5(400),
28879
+ source: line5(80).nullish(),
28880
+ lastUsedAt: exports_coerce.date().nullish()
28881
+ }).strict();
28882
+ var editEchoMemoryInputSchema = object({ text: line5(400) }).strict();
28883
+ var echoMemoriesQuerySchema = object({
28884
+ thread: line5(40).optional(),
28885
+ forgotten: _enum2(["true", "false"]).transform((v) => v === "true").optional()
28886
+ });
28887
+
28888
+ // ../../packages/schema/src/operations/echo-actions.ts
28889
+ var NO_USER = "The key has no user identity (actions and memories are per member).";
28890
+ var KEY_SCHEMA = { key: echoTrustKeySchema };
28891
+ var keyParam = (what) => ({
28892
+ key: {
28893
+ description: `The ${what}'s handle, the agent's own: lower-case letters, digits and dashes.`,
28894
+ pattern: "^[a-z0-9][a-z0-9-]{0,59}$"
28895
+ }
28896
+ });
28897
+ var ACTION = "`{ id, key, by: { id, name }, thread: { id, title, slug, icon } | null, kind, what, why, undo, undoNote, undoUntil, at, undoRequestedAt, undoneAt }`";
28898
+ var echoActionOperations = defineOperations({
28899
+ list: {
28900
+ method: "get",
28901
+ path: "/echo/actions",
28902
+ scopes: ["agents:read"],
28903
+ tag: "Agents",
28904
+ summary: "List the actions taken outside do",
28905
+ description: `What the member's agents did outside do since \`since\` (default the last day), the newest first: ${ACTION}. \`undoRequestedAt\` says the member asked for Undo; report it done with \`undone: true\`.`,
28906
+ query: [
28907
+ {
28908
+ name: "since",
28909
+ description: "From when, an ISO date-time (default a day ago).",
28910
+ type: "string"
28911
+ }
28912
+ ],
28913
+ querySchema: echoActionsQuerySchema,
28914
+ status: 200,
28915
+ response: { description: "The actions.", list: true },
28916
+ errors: { 400: true, 403: NO_USER }
28917
+ },
28918
+ put: {
28919
+ method: "put",
28920
+ path: "/echo/actions/{key}",
28921
+ pathParams: keyParam("action"),
28922
+ pathParamSchemas: KEY_SCHEMA,
28923
+ scopes: ["agents:write"],
28924
+ tag: "Agents",
28925
+ summary: "Report an action taken outside do",
28926
+ description: "Who did it (`by`, an Agent's name), the member's standing `thread` it was done in (by slug), its `kind` (`Deploy`, `Mail sent`), `what` it did, `why` it was allowed (`You approved at 13:41`, `Rule: drafts are free`), and how to `undo` it (until `undoUntil`) or why it can't be (`undoNote`). `at` is when it was done (default now). `undone: true` reports the member's Undo done. An unknown agent or thread is a 404.",
28927
+ body: putEchoActionInputSchema,
28928
+ status: 200,
28929
+ response: { description: "The action." },
28930
+ errors: { 400: true, 403: NO_USER, 404: "No such agent or thread." }
28931
+ },
28932
+ undo: {
28933
+ method: "post",
28934
+ path: "/echo/actions/{key}/undo",
28935
+ pathParams: keyParam("action"),
28936
+ pathParamSchemas: KEY_SCHEMA,
28937
+ scopes: ["agents:write"],
28938
+ tag: "Agents",
28939
+ summary: "Ask for an action to be undone",
28940
+ description: "Stamps `undoRequestedAt`, which the agent reads until it reports the action undone. One that can't be undone, is undone already or is past its `undoUntil` is a 409. An unknown key is a 404.",
28941
+ status: 200,
28942
+ response: { description: "The action." },
28943
+ errors: { 403: NO_USER, 404: true, 409: "It can't be undone." }
28944
+ }
28945
+ });
28946
+
28829
28947
  // ../../packages/schema/src/operations/echo-handoffs.ts
28830
- var NO_USER = "The key has no user identity (handoffs are per member).";
28948
+ var NO_USER2 = "The key has no user identity (handoffs are per member).";
28831
28949
  var KEY = {
28832
28950
  key: {
28833
28951
  description: "The handoff's handle, the agent's own (`renovate-fold`): lower-case letters, digits and dashes.",
28834
28952
  pattern: "^[a-z0-9][a-z0-9-]{0,59}$"
28835
28953
  }
28836
28954
  };
28837
- var KEY_SCHEMA = { key: echoHandoffKeySchema };
28955
+ var KEY_SCHEMA2 = { key: echoHandoffKeySchema };
28838
28956
  var VIEW = "`{ id, key, from: { id, name }, to: { id, name }, what, thread: { id, title, slug, icon } | null, state, sentAt, seenAt, pickedAt, doneAt, nudgedAt }`";
28839
28957
  var echoHandoffOperations = defineOperations({
28840
28958
  list: {
@@ -28846,13 +28964,13 @@ var echoHandoffOperations = defineOperations({
28846
28964
  description: `The handoffs between the member's agents, the newest first: every one not done, and those done in the last day: ${VIEW}. \`nudgedAt\` says the member nudged the one it went to; a \`to\` the agent didn't set means the member gave it to someone else.`,
28847
28965
  status: 200,
28848
28966
  response: { description: "The handoffs.", list: true },
28849
- errors: { 403: NO_USER }
28967
+ errors: { 403: NO_USER2 }
28850
28968
  },
28851
28969
  put: {
28852
28970
  method: "put",
28853
28971
  path: "/echo/handoffs/{key}",
28854
28972
  pathParams: KEY,
28855
- pathParamSchemas: KEY_SCHEMA,
28973
+ pathParamSchemas: KEY_SCHEMA2,
28856
28974
  scopes: ["agents:write"],
28857
28975
  tag: "Agents",
28858
28976
  summary: "Declare a handoff or move it along",
@@ -28860,26 +28978,26 @@ var echoHandoffOperations = defineOperations({
28860
28978
  body: putEchoHandoffInputSchema,
28861
28979
  status: 200,
28862
28980
  response: { description: "The handoff." },
28863
- errors: { 400: true, 403: NO_USER, 404: "No such agent or thread." }
28981
+ errors: { 400: true, 403: NO_USER2, 404: "No such agent or thread." }
28864
28982
  },
28865
28983
  nudge: {
28866
28984
  method: "post",
28867
28985
  path: "/echo/handoffs/{key}/nudge",
28868
28986
  pathParams: KEY,
28869
- pathParamSchemas: KEY_SCHEMA,
28987
+ pathParamSchemas: KEY_SCHEMA2,
28870
28988
  scopes: ["agents:write"],
28871
28989
  tag: "Agents",
28872
28990
  summary: "Nudge the agent a handoff went to",
28873
28991
  description: "Stamps `nudgedAt`, which the agent reads until the handoff moves on. A handoff already picked up or done is a 409. An unknown key is a 404.",
28874
28992
  status: 200,
28875
28993
  response: { description: "The handoff." },
28876
- errors: { 403: NO_USER, 404: true, 409: "It was picked up already." }
28994
+ errors: { 403: NO_USER2, 404: true, 409: "It was picked up already." }
28877
28995
  },
28878
28996
  reassign: {
28879
28997
  method: "patch",
28880
28998
  path: "/echo/handoffs/{key}",
28881
28999
  pathParams: KEY,
28882
- pathParamSchemas: KEY_SCHEMA,
29000
+ pathParamSchemas: KEY_SCHEMA2,
28883
29001
  scopes: ["agents:write"],
28884
29002
  tag: "Agents",
28885
29003
  summary: "Give a handoff to another agent",
@@ -28887,20 +29005,108 @@ var echoHandoffOperations = defineOperations({
28887
29005
  body: reassignEchoHandoffInputSchema,
28888
29006
  status: 200,
28889
29007
  response: { description: "The handoff." },
28890
- errors: { 400: true, 403: NO_USER, 404: true, 409: "It's done." }
29008
+ errors: { 400: true, 403: NO_USER2, 404: true, 409: "It's done." }
28891
29009
  },
28892
29010
  remove: {
28893
29011
  method: "delete",
28894
29012
  path: "/echo/handoffs/{key}",
28895
29013
  pathParams: KEY,
28896
- pathParamSchemas: KEY_SCHEMA,
29014
+ pathParamSchemas: KEY_SCHEMA2,
28897
29015
  scopes: ["agents:write"],
28898
29016
  tag: "Agents",
28899
29017
  summary: "Remove a handoff",
28900
29018
  description: "The agent drops the handoff. An unknown key is a 404.",
28901
29019
  status: 204,
28902
29020
  response: { description: "Removed." },
28903
- errors: { 403: NO_USER, 404: true }
29021
+ errors: { 403: NO_USER2, 404: true }
29022
+ }
29023
+ });
29024
+
29025
+ // ../../packages/schema/src/operations/echo-memories.ts
29026
+ var NO_USER3 = "The key has no user identity (actions and memories are per member).";
29027
+ var KEY_SCHEMA3 = { key: echoTrustKeySchema };
29028
+ var keyParam2 = (what) => ({
29029
+ key: {
29030
+ description: `The ${what}'s handle, the agent's own: lower-case letters, digits and dashes.`,
29031
+ pattern: "^[a-z0-9][a-z0-9-]{0,59}$"
29032
+ }
29033
+ });
29034
+ var MEMORY = "`{ id, key, thread: { id, title, slug, icon }, text, source, lastUsedAt, editedAt, forgottenAt }`";
29035
+ var echoMemoryOperations = defineOperations({
29036
+ list: {
29037
+ method: "get",
29038
+ path: "/echo/memories",
29039
+ scopes: ["agents:read"],
29040
+ tag: "Agents",
29041
+ summary: "List what the agent remembers",
29042
+ description: `What the agent remembers in the member's threads, by thread and the most recently used first: ${MEMORY}. \`editedAt\` says the member changed the words; with \`forgotten=true\` the list also has the ones the member had forgotten (\`forgottenAt\`), to drop.`,
29043
+ query: [
29044
+ { name: "thread", description: "Only this thread's (its slug).", type: "string" },
29045
+ {
29046
+ name: "forgotten",
29047
+ description: "Include the forgotten ones (`true`).",
29048
+ type: "string",
29049
+ enum: ["true", "false"]
29050
+ }
29051
+ ],
29052
+ querySchema: echoMemoriesQuerySchema,
29053
+ status: 200,
29054
+ response: { description: "The memories.", list: true },
29055
+ errors: { 400: true, 403: NO_USER3, 404: "No such thread." }
29056
+ },
29057
+ put: {
29058
+ method: "put",
29059
+ path: "/echo/memories/{key}",
29060
+ pathParams: keyParam2("memory"),
29061
+ pathParamSchemas: KEY_SCHEMA3,
29062
+ scopes: ["agents:write"],
29063
+ tag: "Agents",
29064
+ summary: "Declare a memory",
29065
+ description: "The member's `thread` it belongs to (by slug), the words (`text`), where it learned it (`source`) and when it last used it (`lastUsedAt`). Declaring it again takes the words as given and clears `editedAt`. One the member had forgotten stays forgotten (a 409); an unknown thread is a 404.",
29066
+ body: putEchoMemoryInputSchema,
29067
+ status: 200,
29068
+ response: { description: "The memory." },
29069
+ errors: { 400: true, 403: NO_USER3, 404: "No such thread.", 409: "It was forgotten." }
29070
+ },
29071
+ edit: {
29072
+ method: "patch",
29073
+ path: "/echo/memories/{key}",
29074
+ pathParams: keyParam2("memory"),
29075
+ pathParamSchemas: KEY_SCHEMA3,
29076
+ scopes: ["agents:write"],
29077
+ tag: "Agents",
29078
+ summary: "Change a memory's words",
29079
+ description: "The member's own words for it (`text`); stamps `editedAt`, which the agent reads. A forgotten one is a 409; an unknown key is a 404.",
29080
+ body: editEchoMemoryInputSchema,
29081
+ status: 200,
29082
+ response: { description: "The memory." },
29083
+ errors: { 400: true, 403: NO_USER3, 404: true, 409: "It was forgotten." }
29084
+ },
29085
+ forget: {
29086
+ method: "post",
29087
+ path: "/echo/memories/{key}/forget",
29088
+ pathParams: keyParam2("memory"),
29089
+ pathParamSchemas: KEY_SCHEMA3,
29090
+ scopes: ["agents:write"],
29091
+ tag: "Agents",
29092
+ summary: "Have a memory forgotten",
29093
+ description: "Stamps `forgottenAt`: it leaves Memory and actions, and the agent reads it (`forgotten=true`), drops it and never uses it again. An unknown key is a 404.",
29094
+ status: 200,
29095
+ response: { description: "The memory." },
29096
+ errors: { 403: NO_USER3, 404: true }
29097
+ },
29098
+ remove: {
29099
+ method: "delete",
29100
+ path: "/echo/memories/{key}",
29101
+ pathParams: keyParam2("memory"),
29102
+ pathParamSchemas: KEY_SCHEMA3,
29103
+ scopes: ["agents:write"],
29104
+ tag: "Agents",
29105
+ summary: "Remove a memory",
29106
+ description: "The agent drops the memory. An unknown key is a 404.",
29107
+ status: 204,
29108
+ response: { description: "Removed." },
29109
+ errors: { 403: NO_USER3, 404: true }
28904
29110
  }
28905
29111
  });
28906
29112
 
@@ -28990,14 +29196,14 @@ var reportEchoScheduleRunInputSchema = object({
28990
29196
  var echoScheduleKeyParamSchema = object({ key: echoScheduleKeySchema });
28991
29197
 
28992
29198
  // ../../packages/schema/src/operations/echo-schedules.ts
28993
- var NO_USER2 = "The key has no user identity (scheduled posts are per member).";
29199
+ var NO_USER4 = "The key has no user identity (scheduled posts are per member).";
28994
29200
  var KEY2 = {
28995
29201
  key: {
28996
29202
  description: "The job's handle, the agent's own (`wake`, `pings`): lower-case letters, digits and dashes.",
28997
29203
  pattern: "^[a-z0-9][a-z0-9-]{0,39}$"
28998
29204
  }
28999
29205
  };
29000
- var KEY_SCHEMA2 = { key: echoScheduleKeySchema };
29206
+ var KEY_SCHEMA4 = { key: echoScheduleKeySchema };
29001
29207
  var VIEW2 = "`{ id, key, name, thread: { id, title, slug, icon }, agentId, desk, times, everyMinutes, weekdays, level, levelNote, paused, runRequested, lastRunAt, lastStatus, lastNote }`";
29002
29208
  var echoScheduleOperations = defineOperations({
29003
29209
  list: {
@@ -29009,13 +29215,13 @@ var echoScheduleOperations = defineOperations({
29009
29215
  description: `Every job that posts into the member's threads on a clock, by name: ${VIEW2}. \`times\` are \`HH:MM\` on the member's wall clock; with \`everyMinutes\` the job repeats from the first until midnight; \`weekdays\` are ISO (1 = Monday), empty for every day. \`level\` says how its posts land (\`now\` pushes, \`today\` a card in its thread, \`digest\` folded into one line, \`silent\` only in its history). A \`paused\` job doesn't run; \`runRequested\` asks for a run now.`,
29010
29216
  status: 200,
29011
29217
  response: { description: "The scheduled posts.", list: true },
29012
- errors: { 403: NO_USER2 }
29218
+ errors: { 403: NO_USER4 }
29013
29219
  },
29014
29220
  put: {
29015
29221
  method: "put",
29016
29222
  path: "/echo/schedules/{key}",
29017
29223
  pathParams: KEY2,
29018
- pathParamSchemas: KEY_SCHEMA2,
29224
+ pathParamSchemas: KEY_SCHEMA4,
29019
29225
  scopes: ["agents:write"],
29020
29226
  tag: "Agents",
29021
29227
  summary: "Declare a scheduled post",
@@ -29023,13 +29229,13 @@ var echoScheduleOperations = defineOperations({
29023
29229
  body: putEchoScheduleInputSchema,
29024
29230
  status: 200,
29025
29231
  response: { description: "The scheduled post." },
29026
- errors: { 400: true, 403: NO_USER2, 404: "No such thread." }
29232
+ errors: { 400: true, 403: NO_USER4, 404: "No such thread." }
29027
29233
  },
29028
29234
  update: {
29029
29235
  method: "patch",
29030
29236
  path: "/echo/schedules/{key}",
29031
29237
  pathParams: KEY2,
29032
- pathParamSchemas: KEY_SCHEMA2,
29238
+ pathParamSchemas: KEY_SCHEMA4,
29033
29239
  scopes: ["agents:write"],
29034
29240
  tag: "Agents",
29035
29241
  summary: "Change a scheduled post's level or pause it",
@@ -29037,26 +29243,26 @@ var echoScheduleOperations = defineOperations({
29037
29243
  body: updateEchoScheduleInputSchema,
29038
29244
  status: 200,
29039
29245
  response: { description: "The scheduled post." },
29040
- errors: { 400: true, 403: NO_USER2, 404: true }
29246
+ errors: { 400: true, 403: NO_USER4, 404: true }
29041
29247
  },
29042
29248
  runNow: {
29043
29249
  method: "post",
29044
29250
  path: "/echo/schedules/{key}/run",
29045
29251
  pathParams: KEY2,
29046
- pathParamSchemas: KEY_SCHEMA2,
29252
+ pathParamSchemas: KEY_SCHEMA4,
29047
29253
  scopes: ["agents:write"],
29048
29254
  tag: "Agents",
29049
29255
  summary: "Ask for a scheduled post now",
29050
29256
  description: "Asks the agent to run the job now: it reads `runRequested` on the job until it reports the run. A paused job is a 409. An unknown key is a 404.",
29051
29257
  status: 200,
29052
29258
  response: { description: "The scheduled post." },
29053
- errors: { 403: NO_USER2, 404: true, 409: "The job is paused." }
29259
+ errors: { 403: NO_USER4, 404: true, 409: "The job is paused." }
29054
29260
  },
29055
29261
  report: {
29056
29262
  method: "post",
29057
29263
  path: "/echo/schedules/{key}/runs",
29058
29264
  pathParams: KEY2,
29059
- pathParamSchemas: KEY_SCHEMA2,
29265
+ pathParamSchemas: KEY_SCHEMA4,
29060
29266
  scopes: ["agents:write"],
29061
29267
  tag: "Agents",
29062
29268
  summary: "Report a scheduled post's run",
@@ -29064,20 +29270,81 @@ var echoScheduleOperations = defineOperations({
29064
29270
  body: reportEchoScheduleRunInputSchema,
29065
29271
  status: 200,
29066
29272
  response: { description: "The scheduled post." },
29067
- errors: { 400: true, 403: NO_USER2, 404: true }
29273
+ errors: { 400: true, 403: NO_USER4, 404: true }
29068
29274
  },
29069
29275
  remove: {
29070
29276
  method: "delete",
29071
29277
  path: "/echo/schedules/{key}",
29072
29278
  pathParams: KEY2,
29073
- pathParamSchemas: KEY_SCHEMA2,
29279
+ pathParamSchemas: KEY_SCHEMA4,
29074
29280
  scopes: ["agents:write"],
29075
29281
  tag: "Agents",
29076
29282
  summary: "Remove a scheduled post",
29077
29283
  description: "The agent no longer runs the job. An unknown key is a 404.",
29078
29284
  status: 204,
29079
29285
  response: { description: "Removed." },
29080
- errors: { 403: NO_USER2, 404: true }
29286
+ errors: { 403: NO_USER4, 404: true }
29287
+ }
29288
+ });
29289
+
29290
+ // ../../packages/schema/src/contracts/echo-search.ts
29291
+ var ECHO_SEARCH_TABS = ["all", "decisions", "messages", "cards", "files"];
29292
+ var ECHO_SEARCH_KINDS = ["decision", "message", "card", "file", "memory"];
29293
+ var echoSearchQuerySchema = object({
29294
+ q: string2().trim().min(1).max(200),
29295
+ tab: _enum2(ECHO_SEARCH_TABS).default("all"),
29296
+ thread: string2().trim().min(1).max(40).optional(),
29297
+ since: exports_coerce.date().optional()
29298
+ });
29299
+ var echoSearchResultSchema = object({
29300
+ id: string2(),
29301
+ kind: _enum2(ECHO_SEARCH_KINDS),
29302
+ thread: echoThreadRefSchema,
29303
+ at: exports_coerce.date(),
29304
+ by: string2().nullable(),
29305
+ text: string2(),
29306
+ cardType: string2().nullable(),
29307
+ card: object({ type: string2(), data: unknown() }).nullable(),
29308
+ updatedAt: exports_coerce.date()
29309
+ });
29310
+ var echoSearchSchema = object({
29311
+ results: array(echoSearchResultSchema),
29312
+ saved: array(echoSearchResultSchema),
29313
+ counts: object({
29314
+ all: number2().int(),
29315
+ decisions: number2().int(),
29316
+ messages: number2().int(),
29317
+ cards: number2().int(),
29318
+ files: number2().int()
29319
+ })
29320
+ });
29321
+
29322
+ // ../../packages/schema/src/operations/echo-search.ts
29323
+ var NO_USER5 = "The key has no user identity (the threads are per member).";
29324
+ var RESULT = "`{ id, kind: decision | message | card | file | memory, thread: { id, title, slug, icon }, at, by, text, cardType }`";
29325
+ var echoSearchOperations = defineOperations({
29326
+ search: {
29327
+ method: "get",
29328
+ path: "/echo/search",
29329
+ scopes: ["agents:read"],
29330
+ tag: "Agents",
29331
+ summary: "Search the member's threads",
29332
+ description: `Every post (its words and its card) and every memory in the member's threads that has \`q\`, the newest first, at most 50: \`{ results: [${RESULT}], counts: { all, decisions, messages, cards, files } }\`. \`tab\` narrows the results (the counts stay the whole search's); \`thread\` (a slug) and \`since\` narrow both. Archived threads and forgotten memories are left out.`,
29333
+ query: [
29334
+ { name: "q", description: "The words to find.", type: "string", required: true },
29335
+ {
29336
+ name: "tab",
29337
+ description: "Only decisions, messages, cards (a decision and a file are cards too) or files.",
29338
+ type: "string",
29339
+ enum: [...ECHO_SEARCH_TABS]
29340
+ },
29341
+ { name: "thread", description: "Only this thread's (its slug).", type: "string" },
29342
+ { name: "since", description: "Only since then, an ISO date-time.", type: "string" }
29343
+ ],
29344
+ querySchema: echoSearchQuerySchema,
29345
+ status: 200,
29346
+ response: { description: "The results and the counts per tab." },
29347
+ errors: { 400: true, 403: NO_USER5, 404: "No such thread." }
29081
29348
  }
29082
29349
  });
29083
29350
 
@@ -29173,6 +29440,7 @@ var threadTopicKindSchema = threadKindSchema.extract([
29173
29440
  var threadAnchorTypeSchema = _enum2(["task", "project", "habit", "note"]);
29174
29441
  var threadAnchorSchema = object({ type: threadAnchorTypeSchema, id: string2() });
29175
29442
  var threadNotifyLevelSchema = _enum2(["now", "today", "digest", "off"]);
29443
+ var threadMirrorSchema = _enum2(["off", "now", "all"]);
29176
29444
  var threadMemoryScopeSchema = _enum2(["personal", "work", "none", "isolated", "inherit"]);
29177
29445
  var threadIconSchema = string2().regex(/^[a-z][a-z0-9-]{0,23}$/, "an icon is a lowercase icon name");
29178
29446
  var ECHO_THREAD_DESCRIPTION_MAX = 200;
@@ -29209,6 +29477,7 @@ var echoThreadSummarySchema = object({
29209
29477
  description: string2().nullable().default(null),
29210
29478
  memoryScope: threadMemoryScopeSchema.default("personal"),
29211
29479
  notifyLevel: threadNotifyLevelSchema.default("now"),
29480
+ mirror: threadMirrorSchema.default("off"),
29212
29481
  lastMessageAt: exports_coerce.date().nullable().default(null),
29213
29482
  lastLine: string2().nullable().default(null),
29214
29483
  lastByMember: boolean2().default(false),
@@ -29266,9 +29535,10 @@ var updateEchoThreadInputSchema = object({
29266
29535
  kind: threadTopicKindSchema.optional(),
29267
29536
  icon: threadIconSchema.optional(),
29268
29537
  description: threadDescriptionSchema.optional(),
29269
- memoryScope: threadMemoryScopeSchema.optional()
29538
+ memoryScope: threadMemoryScopeSchema.optional(),
29539
+ mirror: threadMirrorSchema.optional()
29270
29540
  }).strict().refine((e) => Object.values(e).some((v) => v !== undefined), {
29271
- message: "send push, notifyLevel, title, areaIds, archived, peopleCapture, kind, icon, description or memoryScope"
29541
+ message: "send push, notifyLevel, title, areaIds, archived, peopleCapture, kind, icon, description, memoryScope or mirror"
29272
29542
  });
29273
29543
  var echoPostReadSchema = object({
29274
29544
  postId: string2(),
@@ -29281,7 +29551,7 @@ var createEchoThreadInputSchema = object({
29281
29551
  }).strict();
29282
29552
 
29283
29553
  // ../../packages/schema/src/operations/echo-threads.ts
29284
- var NO_USER3 = "The key has no user identity (threads are per member).";
29554
+ var NO_USER6 = "The key has no user identity (threads are per member).";
29285
29555
  var echoThreadOperations = defineOperations({
29286
29556
  list: {
29287
29557
  method: "get",
@@ -29289,7 +29559,7 @@ var echoThreadOperations = defineOperations({
29289
29559
  scopes: ["agents:read"],
29290
29560
  tag: "Agents",
29291
29561
  summary: "List agent threads",
29292
- description: "The member's most recent agent threads, newest first: `id`, `title` (the first question), `turnCount`, `createdAt`, `updatedAt`. Each also says what it is for (`kind`: `personal`, `work`, `system`, `client`, `object` or `shared`), the do object it hangs on (`anchor`: `{ type, id }`, null for a topic) and the thread it started from (`parentId`), its `icon`, `description` and `memoryScope` (`personal`, `work`, `none`, `isolated`, `inherit`), the most its posts may push in do v2 (`notifyLevel`: `now`, `today`, `digest` or `off`), when its last message was written (`lastMessageAt`) with that message as one plain line (`lastLine`), and how many of the agent's posts there are unseen (`needsYou` for Needs you, `unseen` for any that isn't silent).",
29562
+ description: "The member's most recent agent threads, newest first: `id`, `title` (the first question), `turnCount`, `createdAt`, `updatedAt`. Each also says what it is for (`kind`: `personal`, `work`, `system`, `client`, `object` or `shared`), the do object it hangs on (`anchor`: `{ type, id }`, null for a topic) and the thread it started from (`parentId`), its `icon`, `description` and `memoryScope` (`personal`, `work`, `none`, `isolated`, `inherit`), the most its posts may push in do v2 (`notifyLevel`: `now`, `today`, `digest` or `off`), which of its posts the member's Telegram mirrors (`mirror`: `off`, `now` for Now only, or `all`), when its last message was written (`lastMessageAt`) with that message as one plain line (`lastLine`), and how many of the agent's posts there are unseen (`needsYou` for Needs you, `unseen` for any that isn't silent).",
29293
29563
  query: [
29294
29564
  {
29295
29565
  name: "limit",
@@ -29302,7 +29572,7 @@ var echoThreadOperations = defineOperations({
29302
29572
  querySchema: echoThreadsQuerySchema,
29303
29573
  status: 200,
29304
29574
  response: { description: "The member's threads.", list: true },
29305
- errors: { 400: true, 403: NO_USER3 }
29575
+ errors: { 400: true, 403: NO_USER6 }
29306
29576
  },
29307
29577
  create: {
29308
29578
  method: "post",
@@ -29315,7 +29585,7 @@ var echoThreadOperations = defineOperations({
29315
29585
  bodyOptional: true,
29316
29586
  status: 201,
29317
29587
  response: { description: "The new current thread." },
29318
- errors: { 403: NO_USER3 }
29588
+ errors: { 403: NO_USER6 }
29319
29589
  },
29320
29590
  current: {
29321
29591
  method: "get",
@@ -29326,7 +29596,7 @@ var echoThreadOperations = defineOperations({
29326
29596
  description: "The thread the agent panel opens on (the most recently used), with its turns oldest first: question, reply, `status` (`streaming` | `done` | `error` | `cancelled`), the change-feed cursor `since`, the changes and the confirmations. `{ thread: null }` before the first.",
29327
29597
  status: 200,
29328
29598
  response: { description: "`{ thread }`." },
29329
- errors: { 403: NO_USER3 }
29599
+ errors: { 403: NO_USER6 }
29330
29600
  },
29331
29601
  briefs: {
29332
29602
  method: "get",
@@ -29346,7 +29616,7 @@ var echoThreadOperations = defineOperations({
29346
29616
  querySchema: echoBriefsQuerySchema,
29347
29617
  status: 200,
29348
29618
  response: { description: "`{ briefs }`." },
29349
- errors: { 400: true, 403: NO_USER3 }
29619
+ errors: { 400: true, 403: NO_USER6 }
29350
29620
  },
29351
29621
  get: {
29352
29622
  method: "get",
@@ -29357,7 +29627,7 @@ var echoThreadOperations = defineOperations({
29357
29627
  description: "One of the member's threads with its turns, oldest first. Another member's thread is a 404.",
29358
29628
  status: 200,
29359
29629
  response: { description: "The thread." },
29360
- errors: { 403: NO_USER3, 404: true }
29630
+ errors: { 403: NO_USER6, 404: true }
29361
29631
  },
29362
29632
  update: {
29363
29633
  method: "patch",
@@ -29365,11 +29635,11 @@ var echoThreadOperations = defineOperations({
29365
29635
  scopes: ["agents:write"],
29366
29636
  tag: "Agents",
29367
29637
  summary: "Change an agent thread",
29368
- description: "What the agent's posts in this thread may push to the member's devices (do-4): `all` (Needs you, and Told quietly), `needs_you` (only what waits on the member) or `off`. For later and Silent posts never push. Returns the thread as the list shows it. Another member's thread is a 404. Rename a thread (`title`), change the Areas a standing thread links (`areaIds`), or archive it (`archived: true`; `false` brings it back). An archived thread leaves the list and its slug no longer reaches it. The home thread (named after the Space's agent) can't be archived. Say what a topic is for (`kind`: `personal`, `work`, `system` or `client`); a thread on a thing keeps `object`, a 400. Set its `icon`, its one-line `description` (`\"\"` clears it) and which memory the agent answers with (`memoryScope`: `personal`, `work`, `none`, `isolated` or `inherit`).",
29638
+ description: "What the agent's posts in this thread may push to the member's devices (do-4): `all` (Needs you, and Told quietly), `needs_you` (only what waits on the member) or `off`. For later and Silent posts never push. Returns the thread as the list shows it. Another member's thread is a 404. Rename a thread (`title`), change the Areas a standing thread links (`areaIds`), or archive it (`archived: true`; `false` brings it back). An archived thread leaves the list and its slug no longer reaches it. The home thread (named after the Space's agent) can't be archived. Say what a topic is for (`kind`: `personal`, `work`, `system` or `client`); a thread on a thing keeps `object`, a 400. Set its `icon`, its one-line `description` (`\"\"` clears it) and which memory the agent answers with (`memoryScope`: `personal`, `work`, `none`, `isolated` or `inherit`). Set what Telegram mirrors of it (`mirror`: `off`, `now` or `all`; Echo \u203A Notifications).",
29369
29639
  body: updateEchoThreadInputSchema,
29370
29640
  status: 200,
29371
29641
  response: { description: "The thread as the list shows it, with its `push`." },
29372
- errors: { 400: true, 403: NO_USER3, 404: true }
29642
+ errors: { 400: true, 403: NO_USER6, 404: true }
29373
29643
  },
29374
29644
  addStanding: {
29375
29645
  method: "post",
@@ -29381,7 +29651,7 @@ var echoThreadOperations = defineOperations({
29381
29651
  body: createStandingThreadInputSchema,
29382
29652
  status: 201,
29383
29653
  response: { description: "The standing thread." },
29384
- errors: { 400: true, 403: NO_USER3, 409: true }
29654
+ errors: { 400: true, 403: NO_USER6, 409: true }
29385
29655
  }
29386
29656
  });
29387
29657
 
@@ -30584,6 +30854,10 @@ var themePackScopeSchema = _enum2(settingsThemePackScope.enumValues);
30584
30854
  var settingsUiSchema = _enum2(settingsUi.enumValues);
30585
30855
  var settingsSkinSchema = _enum2(SETTINGS_SKINS);
30586
30856
  var settingsSkinVariantSchema = string2().regex(/^[a-z0-9][a-z0-9-]{0,47}$/);
30857
+ var COLORS_TOML_LINE = /^\s*[a-z_]+\s*=\s*["']?(#[0-9a-f]{3,8}|rgba?\([^)]*\))["']?\s*(#.*)?$/gim;
30858
+ var settingsSkinColorsSchema = string2().max(8192).refine((text) => (text.match(COLORS_TOML_LINE) ?? []).length >= 2, {
30859
+ message: 'expected a colors.toml: lines like background = "#1a1b26"'
30860
+ });
30587
30861
  var HEALTH_TODAY_HINTS = ["supplements", "sleep", "appointment", "episode"];
30588
30862
  var healthTodayHintSchema = _enum2(HEALTH_TODAY_HINTS);
30589
30863
  var HEALTH_TODAY_HINTS_DEFAULT = ["supplements", "sleep"];
@@ -30608,6 +30882,7 @@ var userSettingsSchema = createSelectSchema(userSettings, {
30608
30882
  ui: settingsUiSchema.default("v1"),
30609
30883
  skin: string2().default("do").transform((s) => settingsSkinSchema.safeParse(s).success ? s : "do"),
30610
30884
  skinVariant: string2().nullable().default(null),
30885
+ skinColors: string2().nullable().default(null),
30611
30886
  healthTodayHints: array(string2()).default([...HEALTH_TODAY_HINTS_DEFAULT]).transform((ids) => ids.filter((id) => healthTodayHintSchema.safeParse(id).success)),
30612
30887
  createdAt: exports_coerce.date(),
30613
30888
  updatedAt: exports_coerce.date()
@@ -30640,6 +30915,7 @@ var updateUserSettingsInputSchema = createUpdateSchema(userSettings, {
30640
30915
  ui: settingsUiSchema.optional(),
30641
30916
  skin: settingsSkinSchema.optional(),
30642
30917
  skinVariant: settingsSkinVariantSchema.nullable().optional(),
30918
+ skinColors: settingsSkinColorsSchema.nullable().optional(),
30643
30919
  healthTodayHints: array(healthTodayHintSchema).transform((ids) => HEALTH_TODAY_HINTS.filter((id) => ids.includes(id))).optional()
30644
30920
  }).omit({
30645
30921
  id: true,
@@ -51212,10 +51488,246 @@ var commands18 = [
51212
51488
  }
51213
51489
  ];
51214
51490
 
51491
+ // src/commands/echo-search.ts
51492
+ function renderEchoSearch(data, mode) {
51493
+ const { results = [], counts } = data;
51494
+ const lines = results.length ? results.map((r) => ` ${r.kind.padEnd(8)} ${paint(mode, "dim", `#${r.thread.slug ?? r.thread.title}`)} ${r.text}${r.by ? paint(mode, "dim", ` \u2014 ${r.by}`) : ""}`) : [paint(mode, "dim", "(nothing found)")];
51495
+ const tally = counts ? Object.entries(counts).map(([tab, n]) => `${tab} ${n}`).join(" \xB7 ") : "";
51496
+ return [...lines, ...tally ? [paint(mode, "dim", tally)] : []].join(`
51497
+ `);
51498
+ }
51499
+ var commands19 = [
51500
+ {
51501
+ spec: {
51502
+ path: ["echo", "search"],
51503
+ summary: "Search your threads: messages, cards, decisions, files and memories.",
51504
+ args: [{ name: "words", required: true, description: "What to find." }],
51505
+ flags: [
51506
+ {
51507
+ name: "tab",
51508
+ type: "string",
51509
+ description: "Only decisions, messages, cards or files (default all)."
51510
+ },
51511
+ { name: "thread", type: "string", description: "Only this thread's (its slug)." },
51512
+ { name: "since", type: "string", description: "Only since then (ISO)." }
51513
+ ],
51514
+ scopes: [...echoSearchOperations.search.scopes],
51515
+ returns: "EchoSearch",
51516
+ notes: "At most 50 results, newest first; the counts are the whole search's. Archived threads and forgotten memories are left out."
51517
+ },
51518
+ run: async ({ args, flags, requireClient }) => ({
51519
+ data: await requireClient().get(pathOf(echoSearchOperations.search), {
51520
+ query: {
51521
+ q: [requireArg(args, 0, "words"), ...args.slice(1)].join(" "),
51522
+ tab: flagString(flags, "tab"),
51523
+ thread: flagString(flags, "thread"),
51524
+ since: flagString(flags, "since")
51525
+ }
51526
+ }),
51527
+ render: renderEchoSearch
51528
+ })
51529
+ }
51530
+ ];
51531
+
51532
+ // src/commands/echo-trust.ts
51533
+ var keyArg = (what) => ({
51534
+ name: "key",
51535
+ required: true,
51536
+ description: `The ${what}'s handle: lower-case letters, digits and dashes.`
51537
+ });
51538
+ var keyPath3 = (op, args, what) => pathOf(op, { key: requireArg(args, 0, `${what} key`) });
51539
+ var commands20 = [
51540
+ {
51541
+ spec: {
51542
+ path: ["echo", "actions", "list"],
51543
+ summary: "List what your agents did outside do (the last day, or since --since).",
51544
+ args: [],
51545
+ flags: [
51546
+ { name: "since", type: "string", description: "From when (ISO); default a day ago." }
51547
+ ],
51548
+ scopes: [...echoActionOperations.list.scopes],
51549
+ returns: "EchoAction[]",
51550
+ notes: "undoRequestedAt says you asked for Undo; the agent reports it done with --undone."
51551
+ },
51552
+ run: async ({ flags, requireClient }) => ({
51553
+ data: await requireClient().getPage(pathOf(echoActionOperations.list), {
51554
+ query: { since: flagString(flags, "since") }
51555
+ }),
51556
+ render: renderList
51557
+ })
51558
+ },
51559
+ {
51560
+ spec: {
51561
+ path: ["echo", "actions", "set"],
51562
+ summary: "Report an action taken outside do, or update it (the agent's).",
51563
+ args: [keyArg("action")],
51564
+ flags: [
51565
+ { name: "by", type: "string", description: "The agent that did it, by name." },
51566
+ { name: "thread", type: "string", description: "The standing thread it was done in." },
51567
+ { name: "kind", type: "string", description: "What kind (Deploy, Mail sent)." },
51568
+ { name: "what", type: "string", description: "What it did, one line." },
51569
+ { name: "why", type: "string", description: "Why it was allowed." },
51570
+ { name: "undo", type: "string", description: "How to undo it (Roll back to v1.363.0)." },
51571
+ { name: "undo-note", type: "string", description: "Why it can't be undone." },
51572
+ { name: "undo-until", type: "string", description: "Until when Undo is possible (ISO)." },
51573
+ { name: "at", type: "string", description: "When it was done (ISO); default now." },
51574
+ { name: "undone", type: "boolean", description: "Report the member's Undo done." }
51575
+ ],
51576
+ scopes: [...echoActionOperations.put.scopes],
51577
+ returns: "EchoAction",
51578
+ notes: "An unknown agent or thread is a 404."
51579
+ },
51580
+ run: async ({ args, flags, requireClient }) => {
51581
+ const by = flagString(flags, "by");
51582
+ const kind = flagString(flags, "kind");
51583
+ const what = flagString(flags, "what");
51584
+ const why = flagString(flags, "why");
51585
+ if (!by || !kind || !what || !why)
51586
+ throw usageError("--by, --kind, --what and --why are required");
51587
+ const optional = {
51588
+ thread: flagString(flags, "thread"),
51589
+ undo: flagString(flags, "undo"),
51590
+ undoNote: flagString(flags, "undo-note"),
51591
+ undoUntil: flagString(flags, "undo-until"),
51592
+ at: flagString(flags, "at")
51593
+ };
51594
+ return {
51595
+ data: await requireClient().put(keyPath3(echoActionOperations.put, args, "action"), {
51596
+ by,
51597
+ kind,
51598
+ what,
51599
+ why,
51600
+ ...Object.fromEntries(Object.entries(optional).filter(([, v]) => v !== undefined)),
51601
+ ...flagBool(flags, "undone") ? { undone: true } : {}
51602
+ }),
51603
+ render: renderRecord
51604
+ };
51605
+ }
51606
+ },
51607
+ {
51608
+ spec: {
51609
+ path: ["echo", "actions", "undo"],
51610
+ summary: "Ask for an action to be undone.",
51611
+ args: [keyArg("action")],
51612
+ flags: [],
51613
+ scopes: [...echoActionOperations.undo.scopes],
51614
+ returns: "EchoAction",
51615
+ notes: "One that can't be undone, is undone already or is past its time is a 409."
51616
+ },
51617
+ run: async ({ args, requireClient }) => ({
51618
+ data: await requireClient().post(keyPath3(echoActionOperations.undo, args, "action"), {}),
51619
+ render: renderRecord
51620
+ })
51621
+ },
51622
+ {
51623
+ spec: {
51624
+ path: ["echo", "memory", "list"],
51625
+ summary: "List what the agent remembers in your threads.",
51626
+ args: [],
51627
+ flags: [
51628
+ { name: "thread", type: "string", description: "Only this thread's (its slug)." },
51629
+ { name: "forgotten", type: "boolean", description: "Include the forgotten ones." }
51630
+ ],
51631
+ scopes: [...echoMemoryOperations.list.scopes],
51632
+ returns: "EchoMemory[]",
51633
+ notes: "editedAt says you changed the words; forgottenAt says drop it."
51634
+ },
51635
+ run: async ({ flags, requireClient }) => ({
51636
+ data: await requireClient().getPage(pathOf(echoMemoryOperations.list), {
51637
+ query: {
51638
+ thread: flagString(flags, "thread"),
51639
+ forgotten: flagBool(flags, "forgotten") ? "true" : undefined
51640
+ }
51641
+ }),
51642
+ render: renderList
51643
+ })
51644
+ },
51645
+ {
51646
+ spec: {
51647
+ path: ["echo", "memory", "set"],
51648
+ summary: "Declare a memory in one of your threads, or update it (the agent's).",
51649
+ args: [keyArg("memory")],
51650
+ flags: [
51651
+ { name: "thread", type: "string", description: "The thread it belongs to (its slug)." },
51652
+ { name: "text", type: "string", description: "What it remembers." },
51653
+ { name: "source", type: "string", description: "Where it learned it." },
51654
+ { name: "last-used", type: "string", description: "When it last used it (ISO)." }
51655
+ ],
51656
+ scopes: [...echoMemoryOperations.put.scopes],
51657
+ returns: "EchoMemory",
51658
+ notes: "Takes the words as given and clears editedAt. A forgotten one stays forgotten (409)."
51659
+ },
51660
+ run: async ({ args, flags, requireClient }) => {
51661
+ const thread = flagString(flags, "thread");
51662
+ const text = flagString(flags, "text");
51663
+ if (!thread || !text)
51664
+ throw usageError("--thread and --text are required");
51665
+ const source = flagString(flags, "source");
51666
+ const lastUsedAt = flagString(flags, "last-used");
51667
+ return {
51668
+ data: await requireClient().put(keyPath3(echoMemoryOperations.put, args, "memory"), {
51669
+ thread,
51670
+ text,
51671
+ ...source ? { source } : {},
51672
+ ...lastUsedAt ? { lastUsedAt } : {}
51673
+ }),
51674
+ render: renderRecord
51675
+ };
51676
+ }
51677
+ },
51678
+ {
51679
+ spec: {
51680
+ path: ["echo", "memory", "edit"],
51681
+ summary: "Change a memory's words.",
51682
+ args: [keyArg("memory"), { name: "text", required: true, description: "The new words." }],
51683
+ flags: [],
51684
+ scopes: [...echoMemoryOperations.edit.scopes],
51685
+ returns: "EchoMemory",
51686
+ notes: "A forgotten one is a 409."
51687
+ },
51688
+ run: async ({ args, requireClient }) => ({
51689
+ data: await requireClient().patch(keyPath3(echoMemoryOperations.edit, args, "memory"), {
51690
+ text: requireArg(args, 1, "text")
51691
+ }),
51692
+ render: renderRecord
51693
+ })
51694
+ },
51695
+ {
51696
+ spec: {
51697
+ path: ["echo", "memory", "forget"],
51698
+ summary: "Have a memory forgotten: the agent drops it and never uses it again.",
51699
+ args: [keyArg("memory")],
51700
+ flags: [],
51701
+ scopes: [...echoMemoryOperations.forget.scopes],
51702
+ returns: "EchoMemory",
51703
+ notes: "An unknown key is a 404."
51704
+ },
51705
+ run: async ({ args, requireClient }) => ({
51706
+ data: await requireClient().post(keyPath3(echoMemoryOperations.forget, args, "memory"), {}),
51707
+ render: renderRecord
51708
+ })
51709
+ },
51710
+ {
51711
+ spec: {
51712
+ path: ["echo", "memory", "rm"],
51713
+ summary: "Remove a memory (the agent drops it).",
51714
+ args: [keyArg("memory")],
51715
+ flags: [],
51716
+ scopes: [...echoMemoryOperations.remove.scopes],
51717
+ returns: "nothing",
51718
+ notes: "An unknown key is a 404."
51719
+ },
51720
+ run: async ({ args, requireClient }) => {
51721
+ await requireClient().delete(keyPath3(echoMemoryOperations.remove, args, "memory"));
51722
+ return { data: { removed: requireArg(args, 0, "memory key") }, render: renderRecord };
51723
+ }
51724
+ }
51725
+ ];
51726
+
51215
51727
  // src/commands/files.ts
51216
51728
  import { readFileSync as readFileSync5, writeFileSync as writeFileSync2 } from "fs";
51217
51729
  import { basename as basename2 } from "path";
51218
- var commands19 = [
51730
+ var commands21 = [
51219
51731
  {
51220
51732
  spec: {
51221
51733
  path: ["files", "list"],
@@ -51385,7 +51897,7 @@ var commands19 = [
51385
51897
  ];
51386
51898
 
51387
51899
  // src/commands/food.ts
51388
- var commands20 = [
51900
+ var commands22 = [
51389
51901
  {
51390
51902
  spec: {
51391
51903
  path: ["foods", "search"],
@@ -51940,7 +52452,7 @@ var commands20 = [
51940
52452
  // src/commands/guest-lists.ts
51941
52453
  import { writeFileSync as writeFileSync3 } from "fs";
51942
52454
  import { basename as basename3 } from "path";
51943
- var commands21 = [
52455
+ var commands23 = [
51944
52456
  {
51945
52457
  spec: {
51946
52458
  path: ["guest-lists", "overview"],
@@ -52030,7 +52542,7 @@ var commands21 = [
52030
52542
  ];
52031
52543
 
52032
52544
  // src/commands/guests.ts
52033
- var commands22 = [
52545
+ var commands24 = [
52034
52546
  {
52035
52547
  spec: {
52036
52548
  path: ["guests", "sent"],
@@ -52115,7 +52627,7 @@ function renderItems(data, mode) {
52115
52627
  var habitArg = { name: "id", required: true, description: "The checklist habit's ULID." };
52116
52628
  var itemArg = { name: "item-id", required: true, description: "The item's ULID." };
52117
52629
  var NOT_CHECKLIST = "A habit that isn't a checklist answers 409.";
52118
- var commands23 = [
52630
+ var commands25 = [
52119
52631
  {
52120
52632
  spec: {
52121
52633
  path: ["habit", "items"],
@@ -52469,7 +52981,7 @@ function seasonFromFlags(flags) {
52469
52981
  const season = flagString(flags, "season");
52470
52982
  return season === undefined ? {} : { activeMonths: seasonFromFlag(season) };
52471
52983
  }
52472
- var commands24 = [
52984
+ var commands26 = [
52473
52985
  {
52474
52986
  spec: {
52475
52987
  path: ["habits", "create"],
@@ -53718,7 +54230,7 @@ function healthRecordHandlers() {
53718
54230
  }
53719
54231
  return out;
53720
54232
  }
53721
- var commands25 = pairCommands(HEALTH_COMMAND_SPECS, {
54233
+ var commands27 = pairCommands(HEALTH_COMMAND_SPECS, {
53722
54234
  ...healthRecordHandlers(),
53723
54235
  "health record": async ({ flags, requireClient }) => {
53724
54236
  const body = parseInput(logHealthInputSchema, readDataFlag(flags));
@@ -54033,7 +54545,7 @@ var commands25 = pairCommands(HEALTH_COMMAND_SPECS, {
54033
54545
  });
54034
54546
 
54035
54547
  // src/commands/house.ts
54036
- var commands26 = [
54548
+ var commands28 = [
54037
54549
  {
54038
54550
  spec: {
54039
54551
  path: ["house"],
@@ -54315,7 +54827,7 @@ function renderSorting(data, _mode) {
54315
54827
  ].join(`
54316
54828
  `);
54317
54829
  }
54318
- var commands27 = [
54830
+ var commands29 = [
54319
54831
  defineCommand({
54320
54832
  operation: inboxOperations.list,
54321
54833
  path: ["inbox"],
@@ -54407,7 +54919,7 @@ var commands27 = [
54407
54919
  ];
54408
54920
 
54409
54921
  // src/commands/incidents.ts
54410
- var commands28 = [
54922
+ var commands30 = [
54411
54923
  {
54412
54924
  spec: {
54413
54925
  path: ["incidents", "open"],
@@ -54636,7 +55148,7 @@ function journalDateArg(args, verb) {
54636
55148
  }
54637
55149
  return date;
54638
55150
  }
54639
- var commands29 = [
55151
+ var commands31 = [
54640
55152
  defineCommand({
54641
55153
  operation: journalOperations.day,
54642
55154
  path: ["journal", "day"],
@@ -55199,7 +55711,7 @@ function renderCreatedKey(data, mode) {
55199
55711
  ].join(`
55200
55712
  `);
55201
55713
  }
55202
- var commands30 = [
55714
+ var commands32 = [
55203
55715
  {
55204
55716
  spec: {
55205
55717
  path: ["keys", "list"],
@@ -55335,7 +55847,7 @@ var KIND_FLAG2 = {
55335
55847
  type: "string",
55336
55848
  description: "The kind of an unknown word (pages, eggs, health, note, or a word taught before); remembered for the Space."
55337
55849
  };
55338
- var commands31 = [
55850
+ var commands33 = [
55339
55851
  {
55340
55852
  spec: {
55341
55853
  path: ["log"],
@@ -55410,7 +55922,7 @@ var commands31 = [
55410
55922
  ];
55411
55923
 
55412
55924
  // src/commands/mail-campaigns.ts
55413
- var commands32 = [
55925
+ var commands34 = [
55414
55926
  {
55415
55927
  spec: {
55416
55928
  path: ["mail-campaigns", "list"],
@@ -55725,7 +56237,7 @@ async function serveMcp(io, target) {
55725
56237
  }
55726
56238
 
55727
56239
  // src/commands/mcp.ts
55728
- var commands33 = [
56240
+ var commands35 = [
55729
56241
  {
55730
56242
  spec: {
55731
56243
  path: ["mcp"],
@@ -55770,7 +56282,7 @@ var commands33 = [
55770
56282
  ];
55771
56283
 
55772
56284
  // src/commands/members.ts
55773
- var commands34 = [
56285
+ var commands36 = [
55774
56286
  {
55775
56287
  spec: {
55776
56288
  path: ["invite", "create"],
@@ -55895,7 +56407,7 @@ var commands34 = [
55895
56407
  ];
55896
56408
 
55897
56409
  // src/commands/metrics.ts
55898
- var commands35 = [
56410
+ var commands37 = [
55899
56411
  {
55900
56412
  spec: {
55901
56413
  path: ["metrics", "list"],
@@ -56023,7 +56535,7 @@ async function setModuleVisibility(args, requireClient, on) {
56023
56535
  render: renderRecord
56024
56536
  };
56025
56537
  }
56026
- var commands36 = [
56538
+ var commands38 = [
56027
56539
  {
56028
56540
  spec: {
56029
56541
  path: ["modules", "list"],
@@ -56252,7 +56764,7 @@ function shareFlag(flags) {
56252
56764
  function localMonth(now) {
56253
56765
  return `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, "0")}`;
56254
56766
  }
56255
- var commands37 = [
56767
+ var commands39 = [
56256
56768
  defineCommand({
56257
56769
  operation: moneyOperations.listAccounts,
56258
56770
  path: ["money", "accounts"],
@@ -57421,7 +57933,7 @@ var commands37 = [
57421
57933
  ];
57422
57934
 
57423
57935
  // src/commands/notes.ts
57424
- var commands38 = [
57936
+ var commands40 = [
57425
57937
  {
57426
57938
  spec: {
57427
57939
  path: ["notes", "backlinks"],
@@ -57543,7 +58055,7 @@ var commands38 = [
57543
58055
  ];
57544
58056
 
57545
58057
  // src/commands/orca.ts
57546
- var commands39 = [
58058
+ var commands41 = [
57547
58059
  {
57548
58060
  spec: {
57549
58061
  path: ["orca", "list"],
@@ -57909,7 +58421,7 @@ function linkBody(args) {
57909
58421
  return parseInput(familyTreeLinkInputSchema, { kind, a: ref, b: other });
57910
58422
  throw usageError("the kind is parent, child or partner");
57911
58423
  }
57912
- var commands40 = [
58424
+ var commands42 = [
57913
58425
  {
57914
58426
  spec: {
57915
58427
  path: ["people", "propose"],
@@ -58598,7 +59110,7 @@ var commands40 = [
58598
59110
 
58599
59111
  // src/commands/places.ts
58600
59112
  import { readFileSync as readFileSync10 } from "fs";
58601
- var commands41 = [
59113
+ var commands43 = [
58602
59114
  {
58603
59115
  spec: {
58604
59116
  path: ["places", "import"],
@@ -58655,7 +59167,7 @@ async function planDecision({ args, requireClient }, verb) {
58655
59167
  render: renderPlan
58656
59168
  };
58657
59169
  }
58658
- var commands42 = [
59170
+ var commands44 = [
58659
59171
  {
58660
59172
  spec: {
58661
59173
  path: ["plans", "list"],
@@ -58882,7 +59394,7 @@ var commands42 = [
58882
59394
  ];
58883
59395
 
58884
59396
  // src/commands/presets.ts
58885
- var commands43 = [
59397
+ var commands45 = [
58886
59398
  {
58887
59399
  spec: {
58888
59400
  path: ["presets", "list"],
@@ -58979,7 +59491,7 @@ function renderReviewSummary(data, mode) {
58979
59491
  return out.join(`
58980
59492
  `);
58981
59493
  }
58982
- var commands44 = [
59494
+ var commands46 = [
58983
59495
  {
58984
59496
  spec: {
58985
59497
  path: ["progress"],
@@ -59188,7 +59700,7 @@ function renderUpdates(data, mode) {
59188
59700
  return updates.map((u) => updateLine(u, mode)).join(`
59189
59701
  `);
59190
59702
  }
59191
- var commands45 = [
59703
+ var commands47 = [
59192
59704
  defineCommand({
59193
59705
  operation: projectOperations.update,
59194
59706
  path: ["projects", "set"],
@@ -59785,7 +60297,7 @@ var routineCommands = [
59785
60297
  }
59786
60298
  }
59787
60299
  ];
59788
- var commands46 = [
60300
+ var commands48 = [
59789
60301
  ...routineCommands,
59790
60302
  {
59791
60303
  spec: {
@@ -59908,7 +60420,7 @@ var commands46 = [
59908
60420
  ];
59909
60421
 
59910
60422
  // src/commands/rsvp-answers.ts
59911
- var commands47 = [
60423
+ var commands49 = [
59912
60424
  {
59913
60425
  spec: {
59914
60426
  path: ["rsvp-answers", "list"],
@@ -59962,7 +60474,7 @@ var commands47 = [
59962
60474
  ];
59963
60475
 
59964
60476
  // src/commands/rsvp-links.ts
59965
- var commands48 = [
60477
+ var commands50 = [
59966
60478
  {
59967
60479
  spec: {
59968
60480
  path: ["rsvp-links", "list"],
@@ -60058,7 +60570,7 @@ var commands48 = [
60058
60570
  ];
60059
60571
 
60060
60572
  // src/commands/rsvp-questions.ts
60061
- var commands49 = [
60573
+ var commands51 = [
60062
60574
  {
60063
60575
  spec: {
60064
60576
  path: ["rsvp-questions", "presets"],
@@ -60630,7 +61142,7 @@ function sessionFlags(flags) {
60630
61142
  body.occurredOn = on;
60631
61143
  return body;
60632
61144
  }
60633
- var commands50 = [
61145
+ var commands52 = [
60634
61146
  {
60635
61147
  spec: {
60636
61148
  path: ["runs", "change"],
@@ -60947,7 +61459,7 @@ var commands50 = [
60947
61459
  ];
60948
61460
 
60949
61461
  // src/commands/search.ts
60950
- var commands51 = [
61462
+ var commands53 = [
60951
61463
  {
60952
61464
  spec: {
60953
61465
  path: ["search"],
@@ -60980,7 +61492,7 @@ var commands51 = [
60980
61492
  ];
60981
61493
 
60982
61494
  // src/commands/seating-proposals.ts
60983
- var commands52 = [
61495
+ var commands54 = [
60984
61496
  {
60985
61497
  spec: {
60986
61498
  path: ["seating-proposals", "list"],
@@ -61067,7 +61579,7 @@ var commands52 = [
61067
61579
  ];
61068
61580
 
61069
61581
  // src/commands/sensors.ts
61070
- var commands53 = [
61582
+ var commands55 = [
61071
61583
  {
61072
61584
  spec: {
61073
61585
  path: ["sensors", "status"],
@@ -61227,7 +61739,7 @@ var commands53 = [
61227
61739
  ];
61228
61740
 
61229
61741
  // src/commands/settings.ts
61230
- var commands54 = [
61742
+ var commands56 = [
61231
61743
  {
61232
61744
  spec: {
61233
61745
  path: ["settings", "get"],
@@ -61248,7 +61760,7 @@ var commands54 = [
61248
61760
  flags: [{ name: "data", type: "string", description: "JSON of fields to change." }],
61249
61761
  scopes: [...settingsOperations.update.scopes],
61250
61762
  returns: "UserSettings",
61251
- notes: `Appearance keys: glass (liquid|frosted|solid), followSky, nightUntilWake, largerText, reduceMotion, showStreakNumbers, themePack (do|skyrim|pokemon), themePackScope (section|everywhere). App: ui (v1|v2), skin (do|te|omarchy: the do v2 theme), skinVariant (a palette id such as catppuccin-latte, or null: the theme's palette). E.g. --data '{"showStreakNumbers":false}'.`
61763
+ notes: `Appearance keys: glass (liquid|frosted|solid), followSky, nightUntilWake, largerText, reduceMotion, showStreakNumbers, themePack (do|skyrim|pokemon), themePackScope (section|everywhere). App: ui (v1|v2), skin (do|te|omarchy: the do v2 theme), skinVariant (a palette id such as catppuccin-latte, custom for your own, or null: the theme's palette), skinColors (your own palette: a colors.toml as text, or null). E.g. --data '{"showStreakNumbers":false}'.`
61252
61764
  },
61253
61765
  run: async ({ flags, requireClient }) => {
61254
61766
  const body = parseInput(updateUserSettingsInputSchema, readDataFlag(flags));
@@ -61261,7 +61773,7 @@ var commands54 = [
61261
61773
  ];
61262
61774
 
61263
61775
  // src/commands/sharing.ts
61264
- var commands55 = [
61776
+ var commands57 = [
61265
61777
  {
61266
61778
  spec: {
61267
61779
  path: ["share"],
@@ -61394,7 +61906,7 @@ var commands55 = [
61394
61906
  ];
61395
61907
 
61396
61908
  // src/commands/space.ts
61397
- var commands56 = [
61909
+ var commands58 = [
61398
61910
  {
61399
61911
  spec: {
61400
61912
  path: ["space", "address"],
@@ -61450,7 +61962,7 @@ var commands56 = [
61450
61962
  ];
61451
61963
 
61452
61964
  // src/commands/tap-tags.ts
61453
- var commands57 = [
61965
+ var commands59 = [
61454
61966
  {
61455
61967
  spec: {
61456
61968
  path: ["tap-tags", "tap"],
@@ -61478,7 +61990,7 @@ var BY = {
61478
61990
  type: "string",
61479
61991
  description: "The blocking task's ref (DO-147) or ULID."
61480
61992
  };
61481
- var commands58 = [
61993
+ var commands60 = [
61482
61994
  defineCommand({
61483
61995
  operation: taskBlockOperations.addBlocker,
61484
61996
  path: ["tasks", "block"],
@@ -61544,7 +62056,7 @@ function renderSeries(data, mode) {
61544
62056
  }).join(`
61545
62057
  `);
61546
62058
  }
61547
- var commands59 = [
62059
+ var commands61 = [
61548
62060
  defineCommand({
61549
62061
  operation: taskSeriesOperations.make,
61550
62062
  path: ["tasks", "make-series"],
@@ -61699,7 +62211,7 @@ function repeatFromFlags(flags) {
61699
62211
  out.anchor = "from_completion";
61700
62212
  return out;
61701
62213
  }
61702
- var commands60 = [
62214
+ var commands62 = [
61703
62215
  {
61704
62216
  spec: {
61705
62217
  path: ["capture"],
@@ -62157,7 +62669,7 @@ var commands60 = [
62157
62669
  ];
62158
62670
 
62159
62671
  // src/commands/time-blocks.ts
62160
- var commands61 = [
62672
+ var commands63 = [
62161
62673
  {
62162
62674
  spec: {
62163
62675
  path: ["time-blocks", "record"],
@@ -62349,7 +62861,7 @@ function renderLandedCounts(data, mode) {
62349
62861
  return out.join(`
62350
62862
  `);
62351
62863
  }
62352
- var commands62 = [
62864
+ var commands64 = [
62353
62865
  {
62354
62866
  spec: {
62355
62867
  path: ["today"],
@@ -62721,7 +63233,7 @@ function renderViews(data, mode) {
62721
63233
  function renderView(data, mode) {
62722
63234
  return renderViews([data], mode);
62723
63235
  }
62724
- var commands63 = [
63236
+ var commands65 = [
62725
63237
  defineCommand({
62726
63238
  operation: workViewOperations.list,
62727
63239
  path: ["views", "list"],
@@ -62840,7 +63352,7 @@ var commands63 = [
62840
63352
  ];
62841
63353
 
62842
63354
  // src/commands/worktree-links.ts
62843
- var commands64 = [
63355
+ var commands66 = [
62844
63356
  {
62845
63357
  spec: {
62846
63358
  path: ["worktree-links", "list"],
@@ -63010,7 +63522,9 @@ var FEATURE_COMMANDS = [
63010
63522
  ...commands61,
63011
63523
  ...commands62,
63012
63524
  ...commands63,
63013
- ...commands64
63525
+ ...commands64,
63526
+ ...commands65,
63527
+ ...commands66
63014
63528
  ];
63015
63529
 
63016
63530
  // src/registry.ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@robbeverhelst/do",
3
- "version": "1.421.0",
3
+ "version": "1.423.0",
4
4
  "private": false,
5
5
  "description": "do — the agent-drivable CLI over the public /api/v1 surface",
6
6
  "homepage": "https://github.com/robbeverhelst/do/tree/main/apps/cli",