@robbeverhelst/do 1.275.0 → 1.277.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 +142 -7
  2. package/package.json +1 -1
package/dist/do.js CHANGED
@@ -3973,7 +3973,8 @@ var notificationType = pgEnum("notification_type", [
3973
3973
  "habit_reminder",
3974
3974
  "echo",
3975
3975
  "card",
3976
- "bank_link"
3976
+ "bank_link",
3977
+ "import_failed"
3977
3978
  ]);
3978
3979
  var notificationDomain = pgEnum("notification_domain", [
3979
3980
  "task",
@@ -21533,10 +21534,16 @@ var postReceiptInputSchema = object({
21533
21534
  parts: array(ulidSchema).min(1).max(10).optional(),
21534
21535
  about: _enum2(POST_RECEIPT_ABOUT_VALUES).optional()
21535
21536
  }).strict();
21537
+ var postReceiptPartSchema = object({
21538
+ id: string2(),
21539
+ type: string2(),
21540
+ title: string2()
21541
+ });
21536
21542
  var postReceiptSchema = object({
21537
21543
  nodeId: string2(),
21538
21544
  nodeType: string2(),
21539
21545
  parts: array(string2()).optional(),
21546
+ partNodes: array(postReceiptPartSchema).optional(),
21540
21547
  about: _enum2(POST_RECEIPT_ABOUT_VALUES).optional()
21541
21548
  });
21542
21549
  var POST_TITLE_MAX = 200;
@@ -22225,7 +22232,7 @@ var setHealthLabAnalyteInputSchema = object({
22225
22232
 
22226
22233
  // ../../packages/schema/src/contracts/files.ts
22227
22234
  var FILE_TEXT_MAX = 1e6;
22228
- var FILE_SOURCES = ["upload", "chat", "doccle_zip", "scan"];
22235
+ var FILE_SOURCES = ["upload", "chat", "doccle", "doccle_zip", "scan"];
22229
22236
  var fileSourceSchema = union([
22230
22237
  _enum2(FILE_SOURCES),
22231
22238
  string2().regex(/^gmail:[A-Za-z0-9_-]{1,200}$/, "gmail:<message id>")
@@ -22891,14 +22898,21 @@ var timeBlockStepSchema = object({
22891
22898
  title: string2(),
22892
22899
  refKind: _enum2(["free", "habit", "task"]),
22893
22900
  status: _enum2(["done", "skipped", "open"]),
22894
- at: exports_coerce.date().nullable()
22901
+ at: exports_coerce.date().nullable(),
22902
+ habitId: string2().nullable().optional()
22895
22903
  });
22904
+ var timeBlockEvidenceOriginSchema = discriminatedUnion("kind", [
22905
+ object({ kind: literal("habit"), id: string2() }),
22906
+ object({ kind: literal("thread"), id: string2() }),
22907
+ object({ kind: literal("url"), url: url({ protocol: /^https?$/ }) })
22908
+ ]);
22896
22909
  var timeBlockEvidenceSchema = object({
22897
22910
  source: _enum2(["habit", "check_in", "you", "agent", "device", "github", "do", "plan"]),
22898
22911
  label: string2(),
22899
22912
  at: exports_coerce.date().nullable(),
22900
22913
  agentName: string2().nullable(),
22901
- via: string2().nullable().optional()
22914
+ via: string2().nullable().optional(),
22915
+ origin: timeBlockEvidenceOriginSchema.nullable().optional()
22902
22916
  });
22903
22917
  var timeBlockReplacementSchema = object({
22904
22918
  id: string2(),
@@ -23022,7 +23036,16 @@ var planVsRecordMoveSchema = object({
23022
23036
  usually: string2(),
23023
23037
  words: string2(),
23024
23038
  days: number2().int(),
23025
- of: number2().int()
23039
+ of: number2().int(),
23040
+ latestId: string2().nullable().optional()
23041
+ });
23042
+ var planVsRecordEveningSchema = object({
23043
+ kept: number2().int(),
23044
+ of: number2().int(),
23045
+ days: number2().int(),
23046
+ weekdays: number2().int(),
23047
+ confidence: _enum2(["high", "medium", "low"]),
23048
+ words: string2()
23026
23049
  });
23027
23050
  var planVsRecordSuggestionSchema = object({
23028
23051
  templateId: string2(),
@@ -23040,7 +23063,8 @@ var planVsRecordSchema = object({
23040
23063
  week: array(planVsRecordDaySchema),
23041
23064
  hours: array(planVsRecordHoursSchema),
23042
23065
  moves: array(planVsRecordMoveSchema),
23043
- suggestion: planVsRecordSuggestionSchema.nullable()
23066
+ suggestion: planVsRecordSuggestionSchema.nullable(),
23067
+ evening: planVsRecordEveningSchema.nullable().default(null)
23044
23068
  });
23045
23069
 
23046
23070
  // ../../packages/schema/src/contracts/settings.ts
@@ -25302,6 +25326,7 @@ var runTeamMemberSchema = object({
25302
25326
  nature: shortText.nullish(),
25303
25327
  types: array(shortText).max(2).optional(),
25304
25328
  moves: array(shortText).max(4).optional(),
25329
+ hp: number2().int().min(0).max(100).nullish(),
25305
25330
  note: shortText.nullish(),
25306
25331
  status: _enum2(["team", "plan", "boxed"]).default("team")
25307
25332
  }).strict();
@@ -28226,7 +28251,7 @@ function parseCapture2(input, now) {
28226
28251
 
28227
28252
  // src/meta.ts
28228
28253
  var CLI_NAME = "do";
28229
- var VERSION = "1.275.0";
28254
+ var VERSION = "1.277.0";
28230
28255
  var API_PREFIX = "/api/v1";
28231
28256
  var DEFAULT_API_URL = "http://localhost:3001";
28232
28257
 
@@ -30984,6 +31009,66 @@ var COMMAND_SPECS = [
30984
31009
  returns: "DocumentFiled",
30985
31010
  notes: "GET /api/v1/documents/filed?source=. Off (403) until DOCUMENTS_IMPORT_ENABLED=true."
30986
31011
  },
31012
+ {
31013
+ path: ["documents", "doccle", "status"],
31014
+ summary: "Your Doccle import: whether it's connected, archive after import, how the last run went and why it's stuck, if it is.",
31015
+ args: [],
31016
+ flags: [],
31017
+ scopes: ["documents:read"],
31018
+ returns: "DoccleStatus",
31019
+ notes: "GET /api/v1/documents/doccle. The import files your Doccle mailbox into Papers every night (03:30 Brussels). `failure` says why it stopped (credentials, captcha, changed, unavailable) and what to do. Never shows the login."
31020
+ },
31021
+ {
31022
+ path: ["documents", "doccle", "sync"],
31023
+ summary: "Run your Doccle import now: each new Doccle document becomes a paper (sender, date, PDF), nothing twice.",
31024
+ args: [],
31025
+ flags: [],
31026
+ scopes: ["documents:write"],
31027
+ returns: "DoccleSyncResult",
31028
+ notes: "POST /api/v1/documents/doccle/sync. Deduped on Doccle's id and on the PDF's hash (so papers from a Doccle ZIP export aren't filed again). outcome: ok, failed (see failure), not_connected, off (DOCUMENTS_IMPORT_ENABLED isn't on), busy (a run is going)."
31029
+ },
31030
+ {
31031
+ path: ["documents", "doccle", "connect"],
31032
+ summary: "Give do your Doccle login so the nightly import can run. do checks it with Doccle first and keeps it sealed.",
31033
+ args: [],
31034
+ flags: [
31035
+ { name: "username", type: "string", description: "Your Doccle username (required)." },
31036
+ {
31037
+ name: "password-stdin",
31038
+ type: "boolean",
31039
+ description: "Read the password from the first line of stdin (else DO_DOCCLE_PASSWORD)."
31040
+ }
31041
+ ],
31042
+ scopes: ["documents:write"],
31043
+ returns: "DoccleStatus",
31044
+ notes: "PUT /api/v1/documents/doccle/login. The password is never a flag (shell history): pipe it in with --password-stdin or set DO_DOCCLE_PASSWORD. 422 when Doccle refuses the login or asks for a captcha (nothing is kept), 503 when Doccle is down. The login is never returned."
31045
+ },
31046
+ {
31047
+ path: ["documents", "doccle", "disconnect"],
31048
+ summary: "Forget your Doccle login: the nightly import stops. The papers it filed stay.",
31049
+ args: [],
31050
+ flags: [
31051
+ { name: "allow-destructive", type: "boolean", description: "Required to forget the login." }
31052
+ ],
31053
+ scopes: ["documents:write"],
31054
+ returns: "DoccleStatus",
31055
+ notes: "DELETE /api/v1/documents/doccle/login. Gated behind --allow-destructive."
31056
+ },
31057
+ {
31058
+ path: ["documents", "doccle", "set"],
31059
+ summary: "Change your Doccle import's setting: archive each document in Doccle once it's filed.",
31060
+ args: [],
31061
+ flags: [
31062
+ {
31063
+ name: "archive",
31064
+ type: "string",
31065
+ description: "on or off (off by default): archive in Doccle after import."
31066
+ }
31067
+ ],
31068
+ scopes: ["documents:write"],
31069
+ returns: "DoccleStatus",
31070
+ notes: "PATCH /api/v1/documents/doccle with { archiveAfterImport }."
31071
+ },
30987
31072
  {
30988
31073
  path: ["documents", "unmatched"],
30989
31074
  summary: "List the papers that ask for money (an amount due) and have no payment linked yet, oldest due first.",
@@ -36001,6 +36086,40 @@ var HANDLERS = {
36001
36086
  }),
36002
36087
  render: renderRecord
36003
36088
  }),
36089
+ "documents doccle status": async ({ requireClient }) => ({
36090
+ data: await requireClient().get("/documents/doccle"),
36091
+ render: renderRecord
36092
+ }),
36093
+ "documents doccle sync": async ({ requireClient }) => ({
36094
+ data: await requireClient().post("/documents/doccle/sync", {}),
36095
+ render: renderRecord
36096
+ }),
36097
+ "documents doccle connect": async ({ io, flags, requireClient }) => {
36098
+ const username = requireFlag(flags, "username", "documents doccle connect needs --username");
36099
+ const password = await readDocclePassword(io, flags);
36100
+ return {
36101
+ data: await requireClient().put("/documents/doccle/login", { username, password }),
36102
+ render: renderRecord
36103
+ };
36104
+ },
36105
+ "documents doccle disconnect": async ({ flags, requireClient }) => {
36106
+ assertDestructiveAllowed(flags, "forget the Doccle login");
36107
+ return {
36108
+ data: await requireClient().delete("/documents/doccle/login"),
36109
+ render: renderRecord
36110
+ };
36111
+ },
36112
+ "documents doccle set": async ({ flags, requireClient }) => {
36113
+ const archive = requireFlag(flags, "archive", "documents doccle set needs --archive on|off");
36114
+ if (archive !== "on" && archive !== "off")
36115
+ throw usageError("--archive takes on or off");
36116
+ return {
36117
+ data: await requireClient().patch("/documents/doccle", {
36118
+ archiveAfterImport: archive === "on"
36119
+ }),
36120
+ render: renderRecord
36121
+ };
36122
+ },
36004
36123
  "documents unmatched": async ({ requireClient }) => ({
36005
36124
  data: await requireClient().get("/documents/unmatched"),
36006
36125
  render: renderList
@@ -38485,6 +38604,22 @@ function redact(secret) {
38485
38604
  return "********";
38486
38605
  return `${secret.slice(0, 6)}\u2026${secret.slice(-2)}`;
38487
38606
  }
38607
+ var DOCCLE_PASSWORD_ENV = "DO_DOCCLE_PASSWORD";
38608
+ async function readDocclePassword(io, flags) {
38609
+ let password;
38610
+ if (flagBool(flags, "password-stdin")) {
38611
+ for await (const line of io.stdin ?? []) {
38612
+ password = line.replace(/\r?\n$/, "");
38613
+ break;
38614
+ }
38615
+ } else {
38616
+ password = io.env[DOCCLE_PASSWORD_ENV];
38617
+ }
38618
+ if (!password) {
38619
+ throw usageError(`documents doccle connect needs the password on stdin (--password-stdin) or in ${DOCCLE_PASSWORD_ENV}`);
38620
+ }
38621
+ return password;
38622
+ }
38488
38623
  var AGENT_KEY_ENV = "DO_AGENT_API_KEY";
38489
38624
  async function readAgentKey(io, flags) {
38490
38625
  if (flagBool(flags, "clear-key"))
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@robbeverhelst/do",
3
- "version": "1.275.0",
3
+ "version": "1.277.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",