@agi-ventures-canada/hackathon-cli 0.1.1 → 0.1.3

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 (72) hide show
  1. package/dist/_chunks/assign.mjs +1 -1
  2. package/dist/_chunks/assign.mjs.map +1 -1
  3. package/dist/_chunks/assignments-create.mjs +2 -2
  4. package/dist/_chunks/assignments-create.mjs.map +1 -1
  5. package/dist/_chunks/assignments-list.mjs +6 -6
  6. package/dist/_chunks/assignments-list.mjs.map +1 -1
  7. package/dist/_chunks/create.mjs.map +1 -1
  8. package/dist/_chunks/create3.mjs.map +1 -1
  9. package/dist/_chunks/create4.mjs.map +1 -1
  10. package/dist/_chunks/create5.mjs +1 -1
  11. package/dist/_chunks/create5.mjs.map +1 -1
  12. package/dist/_chunks/create6.mjs +9 -3
  13. package/dist/_chunks/create6.mjs.map +1 -1
  14. package/dist/_chunks/criteria-create.mjs +1 -1
  15. package/dist/_chunks/criteria-create.mjs.map +1 -1
  16. package/dist/_chunks/criteria-list.mjs +1 -1
  17. package/dist/_chunks/criteria-list.mjs.map +1 -1
  18. package/dist/_chunks/criteria-update.mjs +1 -1
  19. package/dist/_chunks/criteria-update.mjs.map +1 -1
  20. package/dist/_chunks/delete.mjs +1 -1
  21. package/dist/_chunks/delete.mjs.map +1 -1
  22. package/dist/_chunks/get.mjs +6 -6
  23. package/dist/_chunks/get.mjs.map +1 -1
  24. package/dist/_chunks/get2.mjs +2 -2
  25. package/dist/_chunks/get2.mjs.map +1 -1
  26. package/dist/_chunks/get3.mjs +5 -5
  27. package/dist/_chunks/get3.mjs.map +1 -1
  28. package/dist/_chunks/get4.mjs +5 -5
  29. package/dist/_chunks/get4.mjs.map +1 -1
  30. package/dist/_chunks/hackathons.mjs +2 -2
  31. package/dist/_chunks/hackathons.mjs.map +1 -1
  32. package/dist/_chunks/invitations-list.mjs +1 -1
  33. package/dist/_chunks/invitations-list.mjs.map +1 -1
  34. package/dist/_chunks/judges-add.mjs +1 -1
  35. package/dist/_chunks/judges-add.mjs.map +1 -1
  36. package/dist/_chunks/judges-list.mjs +1 -1
  37. package/dist/_chunks/judges-list.mjs.map +1 -1
  38. package/dist/_chunks/list.mjs +2 -2
  39. package/dist/_chunks/list.mjs.map +1 -1
  40. package/dist/_chunks/list2.mjs +1 -1
  41. package/dist/_chunks/list2.mjs.map +1 -1
  42. package/dist/_chunks/list4.mjs +1 -1
  43. package/dist/_chunks/list4.mjs.map +1 -1
  44. package/dist/_chunks/list5.mjs +4 -4
  45. package/dist/_chunks/list5.mjs.map +1 -1
  46. package/dist/_chunks/login.mjs +4 -0
  47. package/dist/_chunks/login.mjs.map +1 -1
  48. package/dist/_chunks/org.mjs +1 -1
  49. package/dist/_chunks/org.mjs.map +1 -1
  50. package/dist/_chunks/pick-results.mjs +23 -19
  51. package/dist/_chunks/pick-results.mjs.map +1 -1
  52. package/dist/_chunks/reorder.mjs +1 -1
  53. package/dist/_chunks/reorder.mjs.map +1 -1
  54. package/dist/_chunks/reorder2.mjs +1 -1
  55. package/dist/_chunks/reorder2.mjs.map +1 -1
  56. package/dist/_chunks/resolve.mjs +1 -4
  57. package/dist/_chunks/resolve.mjs.map +1 -1
  58. package/dist/_chunks/results.mjs +6 -6
  59. package/dist/_chunks/results.mjs.map +1 -1
  60. package/dist/_chunks/submissions.mjs +3 -3
  61. package/dist/_chunks/submissions.mjs.map +1 -1
  62. package/dist/_chunks/update-check.mjs +92 -0
  63. package/dist/_chunks/update-check.mjs.map +1 -0
  64. package/dist/_chunks/update.mjs +3 -3
  65. package/dist/_chunks/update.mjs.map +1 -1
  66. package/dist/_chunks/update4.mjs +2 -2
  67. package/dist/_chunks/update4.mjs.map +1 -1
  68. package/dist/_chunks/update5.mjs +56 -0
  69. package/dist/_chunks/update5.mjs.map +1 -0
  70. package/dist/cli.mjs +25 -8
  71. package/dist/cli.mjs.map +1 -1
  72. package/package.json +1 -1
@@ -24,11 +24,11 @@ async function runHackathonsList(client, options) {
24
24
  label: "Status"
25
25
  },
26
26
  {
27
- key: "starts_at",
27
+ key: "startsAt",
28
28
  label: "Starts"
29
29
  },
30
30
  {
31
- key: "ends_at",
31
+ key: "endsAt",
32
32
  label: "Ends"
33
33
  }
34
34
  ]));
@@ -1 +1 @@
1
- {"version":3,"file":"list.mjs","names":[],"sources":["../../src/commands/hackathons/list.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport { formatJson, formatTable } from \"../../output.js\"\nimport type { Hackathon } from \"../../types.js\"\n\nexport async function runHackathonsList(\n client: OatmealClient,\n options: { json?: boolean }\n): Promise<void> {\n const data = await client.get<{ hackathons: Hackathon[] }>(\"/api/dashboard/hackathons\")\n\n if (options.json) {\n console.log(formatJson(data))\n return\n }\n\n if (!data.hackathons?.length) {\n console.log(\"No hackathons found.\")\n return\n }\n\n console.log(\n formatTable(data.hackathons, [\n { key: \"name\", label: \"Name\" },\n { key: \"slug\", label: \"Slug\" },\n { key: \"status\", label: \"Status\" },\n { key: \"starts_at\", label: \"Starts\" },\n { key: \"ends_at\", label: \"Ends\" },\n ])\n )\n}\n"],"mappings":";;AAIA,eAAsB,kBACpB,QACA,SACe;CACf,MAAM,OAAO,MAAM,OAAO,IAAiC,4BAA4B;AAEvF,KAAI,QAAQ,MAAM;AAChB,UAAQ,IAAI,WAAW,KAAK,CAAC;AAC7B;;AAGF,KAAI,CAAC,KAAK,YAAY,QAAQ;AAC5B,UAAQ,IAAI,uBAAuB;AACnC;;AAGF,SAAQ,IACN,YAAY,KAAK,YAAY;EAC3B;GAAE,KAAK;GAAQ,OAAO;GAAQ;EAC9B;GAAE,KAAK;GAAQ,OAAO;GAAQ;EAC9B;GAAE,KAAK;GAAU,OAAO;GAAU;EAClC;GAAE,KAAK;GAAa,OAAO;GAAU;EACrC;GAAE,KAAK;GAAW,OAAO;;EAC1B,CAAC,CACH"}
1
+ {"version":3,"file":"list.mjs","names":[],"sources":["../../src/commands/hackathons/list.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport { formatJson, formatTable } from \"../../output.js\"\nimport type { Hackathon } from \"../../types.js\"\n\nexport async function runHackathonsList(\n client: OatmealClient,\n options: { json?: boolean }\n): Promise<void> {\n const data = await client.get<{ hackathons: Hackathon[] }>(\"/api/dashboard/hackathons\")\n\n if (options.json) {\n console.log(formatJson(data))\n return\n }\n\n if (!data.hackathons?.length) {\n console.log(\"No hackathons found.\")\n return\n }\n\n console.log(\n formatTable(data.hackathons, [\n { key: \"name\", label: \"Name\" },\n { key: \"slug\", label: \"Slug\" },\n { key: \"status\", label: \"Status\" },\n { key: \"startsAt\", label: \"Starts\" },\n { key: \"endsAt\", label: \"Ends\" },\n ])\n )\n}\n"],"mappings":";;AAIA,eAAsB,kBACpB,QACA,SACe;CACf,MAAM,OAAO,MAAM,OAAO,IAAiC,4BAA4B;AAEvF,KAAI,QAAQ,MAAM;AAChB,UAAQ,IAAI,WAAW,KAAK,CAAC;AAC7B;;AAGF,KAAI,CAAC,KAAK,YAAY,QAAQ;AAC5B,UAAQ,IAAI,uBAAuB;AACnC;;AAGF,SAAQ,IACN,YAAY,KAAK,YAAY;EAC3B;GAAE,KAAK;GAAQ,OAAO;GAAQ;EAC9B;GAAE,KAAK;GAAQ,OAAO;GAAQ;EAC9B;GAAE,KAAK;GAAU,OAAO;GAAU;EAClC;GAAE,KAAK;GAAY,OAAO;GAAU;EACpC;GAAE,KAAK;GAAU,OAAO;;EACzB,CAAC,CACH"}
@@ -26,7 +26,7 @@ async function runJobsList(client, args, options) {
26
26
  label: "Status"
27
27
  },
28
28
  {
29
- key: "created_at",
29
+ key: "createdAt",
30
30
  label: "Created"
31
31
  }
32
32
  ]));
@@ -1 +1 @@
1
- {"version":3,"file":"list2.mjs","names":[],"sources":["../../src/commands/jobs/list.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport { formatJson, formatTable } from \"../../output.js\"\nimport type { Job } from \"../../types.js\"\n\nexport async function runJobsList(\n client: OatmealClient,\n args: string[],\n options: { json?: boolean }\n): Promise<void> {\n let limit: number | undefined\n for (let i = 0; i < args.length; i++) {\n if (args[i] === \"--limit\") limit = parseInt(args[++i], 10)\n }\n\n const data = await client.get<{ jobs: Job[] }>(\"/api/dashboard/jobs\", {\n params: { limit },\n })\n\n if (options.json) {\n console.log(formatJson(data))\n return\n }\n\n if (!data.jobs?.length) {\n console.log(\"No jobs found.\")\n return\n }\n\n console.log(\n formatTable(data.jobs, [\n { key: \"id\", label: \"ID\" },\n { key: \"type\", label: \"Type\" },\n { key: \"status\", label: \"Status\" },\n { key: \"created_at\", label: \"Created\" },\n ])\n )\n}\n"],"mappings":";;AAIA,eAAsB,YACpB,QACA,MACA,SACe;CACf,IAAI;AACJ,MAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,IAC/B,KAAI,KAAK,OAAO,UAAW,SAAQ,SAAS,KAAK,EAAE,IAAI,GAAG;CAG5D,MAAM,OAAO,MAAM,OAAO,IAAqB,uBAAuB,EACpE,QAAQ,EAAE,OAAO,EAClB,CAAC;AAEF,KAAI,QAAQ,MAAM;AAChB,UAAQ,IAAI,WAAW,KAAK,CAAC;AAC7B;;AAGF,KAAI,CAAC,KAAK,MAAM,QAAQ;AACtB,UAAQ,IAAI,iBAAiB;AAC7B;;AAGF,SAAQ,IACN,YAAY,KAAK,MAAM;EACrB;GAAE,KAAK;GAAM,OAAO;GAAM;EAC1B;GAAE,KAAK;GAAQ,OAAO;GAAQ;EAC9B;GAAE,KAAK;GAAU,OAAO;GAAU;EAClC;GAAE,KAAK;GAAc,OAAO;;EAC7B,CAAC,CACH"}
1
+ {"version":3,"file":"list2.mjs","names":[],"sources":["../../src/commands/jobs/list.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport { formatJson, formatTable } from \"../../output.js\"\nimport type { Job } from \"../../types.js\"\n\nexport async function runJobsList(\n client: OatmealClient,\n args: string[],\n options: { json?: boolean }\n): Promise<void> {\n let limit: number | undefined\n for (let i = 0; i < args.length; i++) {\n if (args[i] === \"--limit\") limit = parseInt(args[++i], 10)\n }\n\n const data = await client.get<{ jobs: Job[] }>(\"/api/dashboard/jobs\", {\n params: { limit },\n })\n\n if (options.json) {\n console.log(formatJson(data))\n return\n }\n\n if (!data.jobs?.length) {\n console.log(\"No jobs found.\")\n return\n }\n\n console.log(\n formatTable(data.jobs, [\n { key: \"id\", label: \"ID\" },\n { key: \"type\", label: \"Type\" },\n { key: \"status\", label: \"Status\" },\n { key: \"createdAt\", label: \"Created\" },\n ])\n )\n}\n"],"mappings":";;AAIA,eAAsB,YACpB,QACA,MACA,SACe;CACf,IAAI;AACJ,MAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,IAC/B,KAAI,KAAK,OAAO,UAAW,SAAQ,SAAS,KAAK,EAAE,IAAI,GAAG;CAG5D,MAAM,OAAO,MAAM,OAAO,IAAqB,uBAAuB,EACpE,QAAQ,EAAE,OAAO,EAClB,CAAC;AAEF,KAAI,QAAQ,MAAM;AAChB,UAAQ,IAAI,WAAW,KAAK,CAAC;AAC7B;;AAGF,KAAI,CAAC,KAAK,MAAM,QAAQ;AACtB,UAAQ,IAAI,iBAAiB;AAC7B;;AAGF,SAAQ,IACN,YAAY,KAAK,MAAM;EACrB;GAAE,KAAK;GAAM,OAAO;GAAM;EAC1B;GAAE,KAAK;GAAQ,OAAO;GAAQ;EAC9B;GAAE,KAAK;GAAU,OAAO;GAAU;EAClC;GAAE,KAAK;GAAa,OAAO;;EAC5B,CAAC,CACH"}
@@ -24,7 +24,7 @@ async function runPrizesList(client, hackathonId, options) {
24
24
  label: "Value"
25
25
  },
26
26
  {
27
- key: "assigned_submission_name",
27
+ key: "assignedSubmissionName",
28
28
  label: "Assigned To"
29
29
  }
30
30
  ]));
@@ -1 +1 @@
1
- {"version":3,"file":"list4.mjs","names":[],"sources":["../../src/commands/prizes/list.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport { formatJson, formatTable } from \"../../output.js\"\nimport type { Prize } from \"../../types.js\"\n\nexport async function runPrizesList(\n client: OatmealClient,\n hackathonId: string,\n options: { json?: boolean }\n): Promise<void> {\n const data = await client.get<{ prizes: Prize[] }>(\n `/api/dashboard/hackathons/${hackathonId}/prizes`\n )\n\n if (options.json) {\n console.log(formatJson(data))\n return\n }\n\n if (!data.prizes?.length) {\n console.log(\"No prizes found.\")\n return\n }\n\n console.log(\n formatTable(data.prizes, [\n { key: \"name\", label: \"Name\" },\n { key: \"type\", label: \"Type\" },\n { key: \"value\", label: \"Value\" },\n { key: \"assigned_submission_name\", label: \"Assigned To\" },\n ])\n )\n}\n"],"mappings":";;AAIA,eAAsB,cACpB,QACA,aACA,SACe;CACf,MAAM,OAAO,MAAM,OAAO,IACxB,6BAA6B,YAAY,SAC1C;AAED,KAAI,QAAQ,MAAM;AAChB,UAAQ,IAAI,WAAW,KAAK,CAAC;AAC7B;;AAGF,KAAI,CAAC,KAAK,QAAQ,QAAQ;AACxB,UAAQ,IAAI,mBAAmB;AAC/B;;AAGF,SAAQ,IACN,YAAY,KAAK,QAAQ;EACvB;GAAE,KAAK;GAAQ,OAAO;GAAQ;EAC9B;GAAE,KAAK;GAAQ,OAAO;GAAQ;EAC9B;GAAE,KAAK;GAAS,OAAO;GAAS;EAChC;GAAE,KAAK;GAA4B,OAAO;;EAC3C,CAAC,CACH"}
1
+ {"version":3,"file":"list4.mjs","names":[],"sources":["../../src/commands/prizes/list.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport { formatJson, formatTable } from \"../../output.js\"\nimport type { Prize } from \"../../types.js\"\n\nexport async function runPrizesList(\n client: OatmealClient,\n hackathonId: string,\n options: { json?: boolean }\n): Promise<void> {\n const data = await client.get<{ prizes: Prize[] }>(\n `/api/dashboard/hackathons/${hackathonId}/prizes`\n )\n\n if (options.json) {\n console.log(formatJson(data))\n return\n }\n\n if (!data.prizes?.length) {\n console.log(\"No prizes found.\")\n return\n }\n\n console.log(\n formatTable(data.prizes, [\n { key: \"name\", label: \"Name\" },\n { key: \"type\", label: \"Type\" },\n { key: \"value\", label: \"Value\" },\n { key: \"assignedSubmissionName\", label: \"Assigned To\" },\n ])\n )\n}\n"],"mappings":";;AAIA,eAAsB,cACpB,QACA,aACA,SACe;CACf,MAAM,OAAO,MAAM,OAAO,IACxB,6BAA6B,YAAY,SAC1C;AAED,KAAI,QAAQ,MAAM;AAChB,UAAQ,IAAI,WAAW,KAAK,CAAC;AAC7B;;AAGF,KAAI,CAAC,KAAK,QAAQ,QAAQ;AACxB,UAAQ,IAAI,mBAAmB;AAC/B;;AAGF,SAAQ,IACN,YAAY,KAAK,QAAQ;EACvB;GAAE,KAAK;GAAQ,OAAO;GAAQ;EAC9B;GAAE,KAAK;GAAQ,OAAO;GAAQ;EAC9B;GAAE,KAAK;GAAS,OAAO;GAAS;EAChC;GAAE,KAAK;GAA0B,OAAO;;EACzC,CAAC,CACH"}
@@ -12,7 +12,7 @@ async function runSchedulesList(client, options) {
12
12
  }
13
13
  const rows = data.schedules.map((s) => ({
14
14
  ...s,
15
- enabled_str: s.enabled ? "Enabled" : "Disabled"
15
+ activeStr: s.isActive ? "Enabled" : "Disabled"
16
16
  }));
17
17
  console.log(formatTable(rows, [
18
18
  {
@@ -20,15 +20,15 @@ async function runSchedulesList(client, options) {
20
20
  label: "Name"
21
21
  },
22
22
  {
23
- key: "cron_expression",
23
+ key: "cronExpression",
24
24
  label: "Cron"
25
25
  },
26
26
  {
27
- key: "enabled_str",
27
+ key: "activeStr",
28
28
  label: "Status"
29
29
  },
30
30
  {
31
- key: "next_run_at",
31
+ key: "nextRunAt",
32
32
  label: "Next Run"
33
33
  }
34
34
  ]));
@@ -1 +1 @@
1
- {"version":3,"file":"list5.mjs","names":[],"sources":["../../src/commands/schedules/list.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport { formatJson, formatTable } from \"../../output.js\"\nimport type { Schedule } from \"../../types.js\"\n\nexport async function runSchedulesList(\n client: OatmealClient,\n options: { json?: boolean }\n): Promise<void> {\n const data = await client.get<{ schedules: Schedule[] }>(\"/api/dashboard/schedules\")\n\n if (options.json) {\n console.log(formatJson(data))\n return\n }\n\n if (!data.schedules?.length) {\n console.log(\"No schedules found.\")\n return\n }\n\n const rows = data.schedules.map((s) => ({\n ...s,\n enabled_str: s.enabled ? \"Enabled\" : \"Disabled\",\n }))\n\n console.log(\n formatTable(rows, [\n { key: \"name\", label: \"Name\" },\n { key: \"cron_expression\", label: \"Cron\" },\n { key: \"enabled_str\", label: \"Status\" },\n { key: \"next_run_at\", label: \"Next Run\" },\n ])\n )\n}\n"],"mappings":";;AAIA,eAAsB,iBACpB,QACA,SACe;CACf,MAAM,OAAO,MAAM,OAAO,IAA+B,2BAA2B;AAEpF,KAAI,QAAQ,MAAM;AAChB,UAAQ,IAAI,WAAW,KAAK,CAAC;AAC7B;;AAGF,KAAI,CAAC,KAAK,WAAW,QAAQ;AAC3B,UAAQ,IAAI,sBAAsB;AAClC;;CAGF,MAAM,OAAO,KAAK,UAAU,KAAK,OAAO;EACtC,GAAG;EACH,aAAa,EAAE,UAAU,YAAY;EACtC,EAAE;AAEH,SAAQ,IACN,YAAY,MAAM;EAChB;GAAE,KAAK;GAAQ,OAAO;GAAQ;EAC9B;GAAE,KAAK;GAAmB,OAAO;GAAQ;EACzC;GAAE,KAAK;GAAe,OAAO;GAAU;EACvC;GAAE,KAAK;GAAe,OAAO;;EAC9B,CAAC,CACH"}
1
+ {"version":3,"file":"list5.mjs","names":[],"sources":["../../src/commands/schedules/list.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport { formatJson, formatTable } from \"../../output.js\"\nimport type { Schedule } from \"../../types.js\"\n\nexport async function runSchedulesList(\n client: OatmealClient,\n options: { json?: boolean }\n): Promise<void> {\n const data = await client.get<{ schedules: Schedule[] }>(\"/api/dashboard/schedules\")\n\n if (options.json) {\n console.log(formatJson(data))\n return\n }\n\n if (!data.schedules?.length) {\n console.log(\"No schedules found.\")\n return\n }\n\n const rows = data.schedules.map((s) => ({\n ...s,\n activeStr: s.isActive ? \"Enabled\" : \"Disabled\",\n }))\n\n console.log(\n formatTable(rows, [\n { key: \"name\", label: \"Name\" },\n { key: \"cronExpression\", label: \"Cron\" },\n { key: \"activeStr\", label: \"Status\" },\n { key: \"nextRunAt\", label: \"Next Run\" },\n ])\n )\n}\n"],"mappings":";;AAIA,eAAsB,iBACpB,QACA,SACe;CACf,MAAM,OAAO,MAAM,OAAO,IAA+B,2BAA2B;AAEpF,KAAI,QAAQ,MAAM;AAChB,UAAQ,IAAI,WAAW,KAAK,CAAC;AAC7B;;AAGF,KAAI,CAAC,KAAK,WAAW,QAAQ;AAC3B,UAAQ,IAAI,sBAAsB;AAClC;;CAGF,MAAM,OAAO,KAAK,UAAU,KAAK,OAAO;EACtC,GAAG;EACH,WAAW,EAAE,WAAW,YAAY;EACrC,EAAE;AAEH,SAAQ,IACN,YAAY,MAAM;EAChB;GAAE,KAAK;GAAQ,OAAO;GAAQ;EAC9B;GAAE,KAAK;GAAkB,OAAO;GAAQ;EACxC;GAAE,KAAK;GAAa,OAAO;GAAU;EACrC;GAAE,KAAK;GAAa,OAAO;;EAC5B,CAAC,CACH"}
@@ -50,6 +50,10 @@ async function runLogin(args) {
50
50
  }
51
51
  const deviceToken = randomBytes(32).toString("hex");
52
52
  const authUrl = `${baseUrl}/cli-auth?token=${deviceToken}`;
53
+ const initClient = new OatmealClient({ baseUrl });
54
+ try {
55
+ await initClient.get("/api/public/cli-auth/poll", { params: { token: deviceToken } });
56
+ } catch {}
53
57
  p.log.info(`Opening browser to sign in...`);
54
58
  p.log.info(authUrl);
55
59
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"login.mjs","names":[],"sources":["../../src/commands/login.ts"],"sourcesContent":["import { randomBytes } from \"node:crypto\"\nimport { execSync } from \"node:child_process\"\nimport * as p from \"@clack/prompts\"\nimport { OatmealClient } from \"../client.js\"\nimport { loadConfig, saveConfig } from \"../config.js\"\nimport { AUTH_TIMEOUT_MS, DEFAULT_BASE_URL, POLL_INTERVAL_MS } from \"../constants.js\"\nimport type { CliConfig, WhoAmIResponse } from \"../types.js\"\n\ninterface LoginOptions {\n apiKey?: string\n noBrowser?: boolean\n baseUrl?: string\n yes?: boolean\n}\n\nexport function parseLoginOptions(args: string[]): LoginOptions {\n const options: LoginOptions = {}\n for (let i = 0; i < args.length; i++) {\n switch (args[i]) {\n case \"--api-key\":\n options.apiKey = args[++i]\n break\n case \"--no-browser\":\n options.noBrowser = true\n break\n case \"--base-url\":\n options.baseUrl = args[++i]\n break\n case \"--yes\":\n case \"-y\":\n options.yes = true\n break\n }\n }\n return options\n}\n\nexport async function runLogin(args: string[]): Promise<void> {\n const options = parseLoginOptions(args)\n const baseUrl = options.baseUrl ?? DEFAULT_BASE_URL\n\n const existingConfig = loadConfig()\n if (existingConfig && !options.yes && !options.apiKey && !process.env.HACKATHON_API_KEY) {\n const overwrite = await p.confirm({\n message: \"You are already logged in. Overwrite existing config?\",\n })\n if (p.isCancel(overwrite) || !overwrite) {\n p.log.info(\"Login cancelled.\")\n return\n }\n }\n\n const key = options.apiKey ?? process.env.HACKATHON_API_KEY\n if (key) {\n await validateAndSaveKey(key, baseUrl)\n return\n }\n\n if (options.noBrowser || !process.stdout.isTTY) {\n const pastedKey = await p.password({ message: \"Paste your API key:\" })\n if (p.isCancel(pastedKey)) {\n p.log.info(\"Login cancelled.\")\n return\n }\n await validateAndSaveKey(pastedKey, baseUrl)\n return\n }\n\n const deviceToken = randomBytes(32).toString(\"hex\")\n const authUrl = `${baseUrl}/cli-auth?token=${deviceToken}`\n\n p.log.info(`Opening browser to sign in...`)\n p.log.info(authUrl)\n\n try {\n openBrowser(authUrl)\n } catch {\n p.log.warn(\"Could not open browser. Visit the URL above manually.\")\n }\n\n const spinner = p.spinner()\n spinner.start(\"Waiting for authentication...\")\n\n try {\n const apiKey = await pollForKey(baseUrl, deviceToken)\n spinner.stop(\"Authenticated!\")\n await validateAndSaveKey(apiKey, baseUrl)\n } catch (error) {\n spinner.stop(\"Authentication failed.\")\n throw error\n }\n}\n\nfunction openBrowser(url: string): void {\n const platform = process.platform\n const cmd =\n platform === \"darwin\"\n ? \"open\"\n : platform === \"win32\"\n ? \"start\"\n : \"xdg-open\"\n execSync(`${cmd} \"${url}\"`, { stdio: \"ignore\" })\n}\n\nasync function pollForKey(baseUrl: string, deviceToken: string): Promise<string> {\n const client = new OatmealClient({ baseUrl })\n const start = Date.now()\n\n while (Date.now() - start < AUTH_TIMEOUT_MS) {\n const result = await client.get<{ status: string; apiKey?: string }>(\n \"/api/public/cli-auth/poll\",\n { params: { token: deviceToken } }\n )\n\n if (result.status === \"complete\" && result.apiKey) {\n return result.apiKey\n }\n\n if (result.status === \"expired\") {\n throw new Error(\"Authentication session expired. Please try again.\")\n }\n\n await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS))\n }\n\n throw new Error(\"Authentication timed out after 5 minutes. Please try again.\")\n}\n\nasync function validateAndSaveKey(apiKey: string, baseUrl: string): Promise<void> {\n const client = new OatmealClient({ baseUrl, apiKey })\n\n const spinner = p.spinner()\n spinner.start(\"Validating API key...\")\n\n try {\n const whoami = await client.get<WhoAmIResponse>(\"/api/v1/whoami\")\n spinner.stop(\"Key validated!\")\n\n const config: CliConfig = {\n apiKey,\n baseUrl,\n tenantId: whoami.tenantId,\n keyId: whoami.keyId,\n scopes: whoami.scopes,\n }\n\n saveConfig(config)\n\n p.log.success(`Logged in! Key saved to ~/.hackathon/config.json`)\n p.log.info(`Tenant: ${whoami.tenantId}`)\n p.log.info(`Scopes: ${whoami.scopes.join(\", \")}`)\n } catch (error) {\n spinner.stop(\"Validation failed.\")\n throw error\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"login.mjs","names":[],"sources":["../../src/commands/login.ts"],"sourcesContent":["import { randomBytes } from \"node:crypto\"\nimport { execSync } from \"node:child_process\"\nimport * as p from \"@clack/prompts\"\nimport { OatmealClient } from \"../client.js\"\nimport { loadConfig, saveConfig } from \"../config.js\"\nimport { AUTH_TIMEOUT_MS, DEFAULT_BASE_URL, POLL_INTERVAL_MS } from \"../constants.js\"\nimport type { CliConfig, WhoAmIResponse } from \"../types.js\"\n\ninterface LoginOptions {\n apiKey?: string\n noBrowser?: boolean\n baseUrl?: string\n yes?: boolean\n}\n\nexport function parseLoginOptions(args: string[]): LoginOptions {\n const options: LoginOptions = {}\n for (let i = 0; i < args.length; i++) {\n switch (args[i]) {\n case \"--api-key\":\n options.apiKey = args[++i]\n break\n case \"--no-browser\":\n options.noBrowser = true\n break\n case \"--base-url\":\n options.baseUrl = args[++i]\n break\n case \"--yes\":\n case \"-y\":\n options.yes = true\n break\n }\n }\n return options\n}\n\nexport async function runLogin(args: string[]): Promise<void> {\n const options = parseLoginOptions(args)\n const baseUrl = options.baseUrl ?? DEFAULT_BASE_URL\n\n const existingConfig = loadConfig()\n if (existingConfig && !options.yes && !options.apiKey && !process.env.HACKATHON_API_KEY) {\n const overwrite = await p.confirm({\n message: \"You are already logged in. Overwrite existing config?\",\n })\n if (p.isCancel(overwrite) || !overwrite) {\n p.log.info(\"Login cancelled.\")\n return\n }\n }\n\n const key = options.apiKey ?? process.env.HACKATHON_API_KEY\n if (key) {\n await validateAndSaveKey(key, baseUrl)\n return\n }\n\n if (options.noBrowser || !process.stdout.isTTY) {\n const pastedKey = await p.password({ message: \"Paste your API key:\" })\n if (p.isCancel(pastedKey)) {\n p.log.info(\"Login cancelled.\")\n return\n }\n await validateAndSaveKey(pastedKey, baseUrl)\n return\n }\n\n const deviceToken = randomBytes(32).toString(\"hex\")\n const authUrl = `${baseUrl}/cli-auth?token=${deviceToken}`\n\n const initClient = new OatmealClient({ baseUrl })\n try {\n await initClient.get(\"/api/public/cli-auth/poll\", { params: { token: deviceToken } })\n } catch {\n // Session creation failed — continue anyway, poll loop will retry\n }\n\n p.log.info(`Opening browser to sign in...`)\n p.log.info(authUrl)\n\n try {\n openBrowser(authUrl)\n } catch {\n p.log.warn(\"Could not open browser. Visit the URL above manually.\")\n }\n\n const spinner = p.spinner()\n spinner.start(\"Waiting for authentication...\")\n\n try {\n const apiKey = await pollForKey(baseUrl, deviceToken)\n spinner.stop(\"Authenticated!\")\n await validateAndSaveKey(apiKey, baseUrl)\n } catch (error) {\n spinner.stop(\"Authentication failed.\")\n throw error\n }\n}\n\nfunction openBrowser(url: string): void {\n const platform = process.platform\n const cmd =\n platform === \"darwin\"\n ? \"open\"\n : platform === \"win32\"\n ? \"start\"\n : \"xdg-open\"\n execSync(`${cmd} \"${url}\"`, { stdio: \"ignore\" })\n}\n\nasync function pollForKey(baseUrl: string, deviceToken: string): Promise<string> {\n const client = new OatmealClient({ baseUrl })\n const start = Date.now()\n\n while (Date.now() - start < AUTH_TIMEOUT_MS) {\n const result = await client.get<{ status: string; apiKey?: string }>(\n \"/api/public/cli-auth/poll\",\n { params: { token: deviceToken } }\n )\n\n if (result.status === \"complete\" && result.apiKey) {\n return result.apiKey\n }\n\n if (result.status === \"expired\") {\n throw new Error(\"Authentication session expired. Please try again.\")\n }\n\n await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS))\n }\n\n throw new Error(\"Authentication timed out after 5 minutes. Please try again.\")\n}\n\nasync function validateAndSaveKey(apiKey: string, baseUrl: string): Promise<void> {\n const client = new OatmealClient({ baseUrl, apiKey })\n\n const spinner = p.spinner()\n spinner.start(\"Validating API key...\")\n\n try {\n const whoami = await client.get<WhoAmIResponse>(\"/api/v1/whoami\")\n spinner.stop(\"Key validated!\")\n\n const config: CliConfig = {\n apiKey,\n baseUrl,\n tenantId: whoami.tenantId,\n keyId: whoami.keyId,\n scopes: whoami.scopes,\n }\n\n saveConfig(config)\n\n p.log.success(`Logged in! Key saved to ~/.hackathon/config.json`)\n p.log.info(`Tenant: ${whoami.tenantId}`)\n p.log.info(`Scopes: ${whoami.scopes.join(\", \")}`)\n } catch (error) {\n spinner.stop(\"Validation failed.\")\n throw error\n }\n}\n"],"mappings":"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"}
@@ -25,7 +25,7 @@ async function runBrowseOrg(client, slug, options) {
25
25
  },
26
26
  {
27
27
  label: "Hackathons",
28
- value: String(data.hackathon_count ?? 0)
28
+ value: String(data.organizedHackathons?.length ?? 0)
29
29
  }
30
30
  ]));
31
31
  }
@@ -1 +1 @@
1
- {"version":3,"file":"org.mjs","names":[],"sources":["../../src/commands/browse/org.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport { formatDetail, formatJson } from \"../../output.js\"\nimport type { OrgProfile } from \"../../types.js\"\n\nexport async function runBrowseOrg(\n client: OatmealClient,\n slug: string,\n options: { json?: boolean }\n): Promise<void> {\n if (!slug) {\n console.error(\"Usage: hackathon browse org <slug>\")\n process.exit(1)\n }\n\n const data = await client.get<OrgProfile>(\n `/api/public/orgs/${encodeURIComponent(slug)}`\n )\n\n if (options.json) {\n console.log(formatJson(data))\n return\n }\n\n console.log(\n formatDetail([\n { label: \"Name\", value: data.name },\n { label: \"Slug\", value: data.slug },\n { label: \"Description\", value: data.description },\n { label: \"Hackathons\", value: String(data.hackathon_count ?? 0) },\n ])\n )\n}\n"],"mappings":";;AAIA,eAAsB,aACpB,QACA,MACA,SACe;AACf,KAAI,CAAC,MAAM;AACT,UAAQ,MAAM,qCAAqC;AACnD,UAAQ,KAAK,EAAE;;CAGjB,MAAM,OAAO,MAAM,OAAO,IACxB,oBAAoB,mBAAmB,KAAK,GAC7C;AAED,KAAI,QAAQ,MAAM;AAChB,UAAQ,IAAI,WAAW,KAAK,CAAC;AAC7B;;AAGF,SAAQ,IACN,aAAa;EACX;GAAE,OAAO;GAAQ,OAAO,KAAK;GAAM;EACnC;GAAE,OAAO;GAAQ,OAAO,KAAK;GAAM;EACnC;GAAE,OAAO;GAAe,OAAO,KAAK;GAAa;EACjD;GAAE,OAAO;GAAc,OAAO,OAAO,KAAK,mBAAmB,EAAA;;EAC9D,CAAC,CACH"}
1
+ {"version":3,"file":"org.mjs","names":[],"sources":["../../src/commands/browse/org.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport { formatDetail, formatJson } from \"../../output.js\"\nimport type { OrgProfile } from \"../../types.js\"\n\nexport async function runBrowseOrg(\n client: OatmealClient,\n slug: string,\n options: { json?: boolean }\n): Promise<void> {\n if (!slug) {\n console.error(\"Usage: hackathon browse org <slug>\")\n process.exit(1)\n }\n\n const data = await client.get<OrgProfile>(\n `/api/public/orgs/${encodeURIComponent(slug)}`\n )\n\n if (options.json) {\n console.log(formatJson(data))\n return\n }\n\n console.log(\n formatDetail([\n { label: \"Name\", value: data.name },\n { label: \"Slug\", value: data.slug },\n { label: \"Description\", value: data.description },\n { label: \"Hackathons\", value: String(data.organizedHackathons?.length ?? 0) },\n ])\n )\n}\n"],"mappings":";;AAIA,eAAsB,aACpB,QACA,MACA,SACe;AACf,KAAI,CAAC,MAAM;AACT,UAAQ,MAAM,qCAAqC;AACnD,UAAQ,KAAK,EAAE;;CAGjB,MAAM,OAAO,MAAM,OAAO,IACxB,oBAAoB,mBAAmB,KAAK,GAC7C;AAED,KAAI,QAAQ,MAAM;AAChB,UAAQ,IAAI,WAAW,KAAK,CAAC;AAC7B;;AAGF,SAAQ,IACN,aAAa;EACX;GAAE,OAAO;GAAQ,OAAO,KAAK;GAAM;EACnC;GAAE,OAAO;GAAQ,OAAO,KAAK;GAAM;EACnC;GAAE,OAAO;GAAe,OAAO,KAAK;GAAa;EACjD;GAAE,OAAO;GAAc,OAAO,OAAO,KAAK,qBAAqB,UAAU,EAAA;;EAC1E,CAAC,CACH"}
@@ -6,28 +6,32 @@ async function runPickResults(client, hackathonId, options) {
6
6
  console.log(formatJson(data));
7
7
  return;
8
8
  }
9
- if (!data.picks?.length) {
9
+ const entries = Object.entries(data.results);
10
+ if (!entries.length) {
10
11
  console.log("No pick results available.");
11
12
  return;
12
13
  }
13
- const rows = data.picks.map((pick) => ({
14
- ...pick,
15
- judges_list: pick.judges.join(", ")
16
- }));
17
- console.log(formatTable(rows, [
18
- {
19
- key: "submission_name",
20
- label: "Submission"
21
- },
22
- {
23
- key: "pick_count",
24
- label: "Picks"
25
- },
26
- {
27
- key: "judges_list",
28
- label: "Judges"
29
- }
30
- ]));
14
+ for (const [prizeId, picks] of entries) {
15
+ console.log(`\nPrize: ${prizeId}`);
16
+ console.log(formatTable(picks, [
17
+ {
18
+ key: "submissionId",
19
+ label: "Submission"
20
+ },
21
+ {
22
+ key: "firstPicks",
23
+ label: "1st Picks"
24
+ },
25
+ {
26
+ key: "averageRank",
27
+ label: "Avg Rank"
28
+ },
29
+ {
30
+ key: "totalPicks",
31
+ label: "Total Picks"
32
+ }
33
+ ]));
34
+ }
31
35
  }
32
36
  //#endregion
33
37
  export { runPickResults };
@@ -1 +1 @@
1
- {"version":3,"file":"pick-results.mjs","names":[],"sources":["../../src/commands/judging/pick-results.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport { formatJson, formatTable } from \"../../output.js\"\nimport type { PickResults } from \"../../types.js\"\n\nexport async function runPickResults(\n client: OatmealClient,\n hackathonId: string,\n options: { json?: boolean }\n): Promise<void> {\n const data = await client.get<PickResults>(\n `/api/dashboard/hackathons/${hackathonId}/judging/pick-results`\n )\n\n if (options.json) {\n console.log(formatJson(data))\n return\n }\n\n if (!data.picks?.length) {\n console.log(\"No pick results available.\")\n return\n }\n\n const rows = data.picks.map((pick) => ({\n ...pick,\n judges_list: pick.judges.join(\", \"),\n }))\n\n console.log(\n formatTable(rows, [\n { key: \"submission_name\", label: \"Submission\" },\n { key: \"pick_count\", label: \"Picks\" },\n { key: \"judges_list\", label: \"Judges\" },\n ])\n )\n}\n"],"mappings":";;AAIA,eAAsB,eACpB,QACA,aACA,SACe;CACf,MAAM,OAAO,MAAM,OAAO,IACxB,6BAA6B,YAAY,uBAC1C;AAED,KAAI,QAAQ,MAAM;AAChB,UAAQ,IAAI,WAAW,KAAK,CAAC;AAC7B;;AAGF,KAAI,CAAC,KAAK,OAAO,QAAQ;AACvB,UAAQ,IAAI,6BAA6B;AACzC;;CAGF,MAAM,OAAO,KAAK,MAAM,KAAK,UAAU;EACrC,GAAG;EACH,aAAa,KAAK,OAAO,KAAK,KAAA;EAC/B,EAAE;AAEH,SAAQ,IACN,YAAY,MAAM;EAChB;GAAE,KAAK;GAAmB,OAAO;GAAc;EAC/C;GAAE,KAAK;GAAc,OAAO;GAAS;EACrC;GAAE,KAAK;GAAe,OAAO;;EAC9B,CAAC,CACH"}
1
+ {"version":3,"file":"pick-results.mjs","names":[],"sources":["../../src/commands/judging/pick-results.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport { formatJson, formatTable } from \"../../output.js\"\n\ninterface PickResultEntry {\n submissionId: string\n firstPicks: number\n averageRank: number\n totalPicks: number\n}\n\ntype PickResultsResponse = {\n results: Record<string, PickResultEntry[]>\n}\n\nexport async function runPickResults(\n client: OatmealClient,\n hackathonId: string,\n options: { json?: boolean }\n): Promise<void> {\n const data = await client.get<PickResultsResponse>(\n `/api/dashboard/hackathons/${hackathonId}/judging/pick-results`\n )\n\n if (options.json) {\n console.log(formatJson(data))\n return\n }\n\n const entries = Object.entries(data.results)\n if (!entries.length) {\n console.log(\"No pick results available.\")\n return\n }\n\n for (const [prizeId, picks] of entries) {\n console.log(`\\nPrize: ${prizeId}`)\n console.log(\n formatTable(picks, [\n { key: \"submissionId\", label: \"Submission\" },\n { key: \"firstPicks\", label: \"1st Picks\" },\n { key: \"averageRank\", label: \"Avg Rank\" },\n { key: \"totalPicks\", label: \"Total Picks\" },\n ])\n )\n }\n}\n"],"mappings":";;AAcA,eAAsB,eACpB,QACA,aACA,SACe;CACf,MAAM,OAAO,MAAM,OAAO,IACxB,6BAA6B,YAAY,uBAC1C;AAED,KAAI,QAAQ,MAAM;AAChB,UAAQ,IAAI,WAAW,KAAK,CAAC;AAC7B;;CAGF,MAAM,UAAU,OAAO,QAAQ,KAAK,QAAQ;AAC5C,KAAI,CAAC,QAAQ,QAAQ;AACnB,UAAQ,IAAI,6BAA6B;AACzC;;AAGF,MAAK,MAAM,CAAC,SAAS,UAAU,SAAS;AACtC,UAAQ,IAAI,YAAY,UAAU;AAClC,UAAQ,IACN,YAAY,OAAO;GACjB;IAAE,KAAK;IAAgB,OAAO;IAAc;GAC5C;IAAE,KAAK;IAAc,OAAO;IAAa;GACzC;IAAE,KAAK;IAAe,OAAO;IAAY;GACzC;IAAE,KAAK;IAAc,OAAO;;GAC7B,CAAC,CACH"}
@@ -7,7 +7,7 @@ async function runJudgeDisplayReorder(client, hackathonId, args) {
7
7
  console.error("Error: --ids is required (comma-separated profile IDs in desired order)");
8
8
  process.exit(1);
9
9
  }
10
- await client.post(`/api/dashboard/hackathons/${hackathonId}/judges/display/reorder`, { profile_ids: ids });
10
+ await client.post(`/api/dashboard/hackathons/${hackathonId}/judges/display/reorder`, { orderedIds: ids });
11
11
  console.log(formatSuccess(`Reordered ${ids.length} judge display profiles`));
12
12
  }
13
13
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"reorder.mjs","names":[],"sources":["../../src/commands/judge-display/reorder.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport { formatSuccess } from \"../../output.js\"\n\nexport async function runJudgeDisplayReorder(\n client: OatmealClient,\n hackathonId: string,\n args: string[]\n): Promise<void> {\n let ids: string[] = []\n for (let i = 0; i < args.length; i++) {\n if (args[i] === \"--ids\") {\n ids = args[++i]?.split(\",\").map((s) => s.trim()) ?? []\n }\n }\n\n if (!ids.length) {\n console.error(\"Error: --ids is required (comma-separated profile IDs in desired order)\")\n process.exit(1)\n }\n\n await client.post(\n `/api/dashboard/hackathons/${hackathonId}/judges/display/reorder`,\n { profile_ids: ids }\n )\n console.log(formatSuccess(`Reordered ${ids.length} judge display profiles`))\n}\n"],"mappings":";;AAGA,eAAsB,uBACpB,QACA,aACA,MACe;CACf,IAAI,MAAgB,EAAE;AACtB,MAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,IAC/B,KAAI,KAAK,OAAO,QACd,OAAM,KAAK,EAAE,IAAI,MAAM,IAAI,CAAC,KAAK,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE;AAI1D,KAAI,CAAC,IAAI,QAAQ;AACf,UAAQ,MAAM,0EAA0E;AACxF,UAAQ,KAAK,EAAE;;AAGjB,OAAM,OAAO,KACX,6BAA6B,YAAY,0BACzC,EAAE,aAAa,KAAK,CACrB;AACD,SAAQ,IAAI,cAAc,aAAa,IAAI,OAAO,yBAAyB,CAAC"}
1
+ {"version":3,"file":"reorder.mjs","names":[],"sources":["../../src/commands/judge-display/reorder.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport { formatSuccess } from \"../../output.js\"\n\nexport async function runJudgeDisplayReorder(\n client: OatmealClient,\n hackathonId: string,\n args: string[]\n): Promise<void> {\n let ids: string[] = []\n for (let i = 0; i < args.length; i++) {\n if (args[i] === \"--ids\") {\n ids = args[++i]?.split(\",\").map((s) => s.trim()) ?? []\n }\n }\n\n if (!ids.length) {\n console.error(\"Error: --ids is required (comma-separated profile IDs in desired order)\")\n process.exit(1)\n }\n\n await client.post(\n `/api/dashboard/hackathons/${hackathonId}/judges/display/reorder`,\n { orderedIds: ids }\n )\n console.log(formatSuccess(`Reordered ${ids.length} judge display profiles`))\n}\n"],"mappings":";;AAGA,eAAsB,uBACpB,QACA,aACA,MACe;CACf,IAAI,MAAgB,EAAE;AACtB,MAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,IAC/B,KAAI,KAAK,OAAO,QACd,OAAM,KAAK,EAAE,IAAI,MAAM,IAAI,CAAC,KAAK,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE;AAI1D,KAAI,CAAC,IAAI,QAAQ;AACf,UAAQ,MAAM,0EAA0E;AACxF,UAAQ,KAAK,EAAE;;AAGjB,OAAM,OAAO,KACX,6BAA6B,YAAY,0BACzC,EAAE,YAAY,KAAK,CACpB;AACD,SAAQ,IAAI,cAAc,aAAa,IAAI,OAAO,yBAAyB,CAAC"}
@@ -7,7 +7,7 @@ async function runPrizesReorder(client, hackathonId, args) {
7
7
  console.error("Error: --ids is required (comma-separated prize IDs in desired order)");
8
8
  process.exit(1);
9
9
  }
10
- await client.post(`/api/dashboard/hackathons/${hackathonId}/prizes/reorder`, { prize_ids: ids });
10
+ await client.post(`/api/dashboard/hackathons/${hackathonId}/prizes/reorder`, { orderedIds: ids });
11
11
  console.log(formatSuccess(`Reordered ${ids.length} prizes`));
12
12
  }
13
13
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"reorder2.mjs","names":[],"sources":["../../src/commands/prizes/reorder.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport { formatSuccess } from \"../../output.js\"\n\nexport async function runPrizesReorder(\n client: OatmealClient,\n hackathonId: string,\n args: string[]\n): Promise<void> {\n let ids: string[] = []\n for (let i = 0; i < args.length; i++) {\n if (args[i] === \"--ids\") {\n ids = args[++i]?.split(\",\").map((s) => s.trim()) ?? []\n }\n }\n\n if (!ids.length) {\n console.error(\"Error: --ids is required (comma-separated prize IDs in desired order)\")\n process.exit(1)\n }\n\n await client.post(`/api/dashboard/hackathons/${hackathonId}/prizes/reorder`, {\n prize_ids: ids,\n })\n console.log(formatSuccess(`Reordered ${ids.length} prizes`))\n}\n"],"mappings":";;AAGA,eAAsB,iBACpB,QACA,aACA,MACe;CACf,IAAI,MAAgB,EAAE;AACtB,MAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,IAC/B,KAAI,KAAK,OAAO,QACd,OAAM,KAAK,EAAE,IAAI,MAAM,IAAI,CAAC,KAAK,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE;AAI1D,KAAI,CAAC,IAAI,QAAQ;AACf,UAAQ,MAAM,wEAAwE;AACtF,UAAQ,KAAK,EAAE;;AAGjB,OAAM,OAAO,KAAK,6BAA6B,YAAY,kBAAkB,EAC3E,WAAW,KACZ,CAAC;AACF,SAAQ,IAAI,cAAc,aAAa,IAAI,OAAO,SAAS,CAAC"}
1
+ {"version":3,"file":"reorder2.mjs","names":[],"sources":["../../src/commands/prizes/reorder.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport { formatSuccess } from \"../../output.js\"\n\nexport async function runPrizesReorder(\n client: OatmealClient,\n hackathonId: string,\n args: string[]\n): Promise<void> {\n let ids: string[] = []\n for (let i = 0; i < args.length; i++) {\n if (args[i] === \"--ids\") {\n ids = args[++i]?.split(\",\").map((s) => s.trim()) ?? []\n }\n }\n\n if (!ids.length) {\n console.error(\"Error: --ids is required (comma-separated prize IDs in desired order)\")\n process.exit(1)\n }\n\n await client.post(`/api/dashboard/hackathons/${hackathonId}/prizes/reorder`, {\n orderedIds: ids,\n })\n console.log(formatSuccess(`Reordered ${ids.length} prizes`))\n}\n"],"mappings":";;AAGA,eAAsB,iBACpB,QACA,aACA,MACe;CACf,IAAI,MAAgB,EAAE;AACtB,MAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,IAC/B,KAAI,KAAK,OAAO,QACd,OAAM,KAAK,EAAE,IAAI,MAAM,IAAI,CAAC,KAAK,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE;AAI1D,KAAI,CAAC,IAAI,QAAQ;AACf,UAAQ,MAAM,wEAAwE;AACtF,UAAQ,KAAK,EAAE;;AAGjB,OAAM,OAAO,KAAK,6BAA6B,YAAY,kBAAkB,EAC3E,YAAY,KACb,CAAC;AACF,SAAQ,IAAI,cAAc,aAAa,IAAI,OAAO,SAAS,CAAC"}
@@ -2,10 +2,7 @@
2
2
  const UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
3
3
  async function resolveHackathonId(client, idOrSlug) {
4
4
  if (UUID_REGEX.test(idOrSlug)) return idOrSlug;
5
- const match = (await client.get("/api/dashboard/hackathons", { params: {
6
- q: idOrSlug,
7
- limit: 1
8
- } })).hackathons?.find((h) => h.slug === idOrSlug);
5
+ const match = (await client.get("/api/dashboard/hackathons", { params: { q: idOrSlug } })).hackathons?.find((h) => h.slug === idOrSlug);
9
6
  if (!match) throw new Error(`Hackathon not found: "${idOrSlug}". Use a UUID or exact slug.`);
10
7
  return match.id;
11
8
  }
@@ -1 +1 @@
1
- {"version":3,"file":"resolve.mjs","names":[],"sources":["../../src/commands/hackathons/resolve.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport type { Hackathon } from \"../../types.js\"\n\nconst UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i\n\nexport async function resolveHackathonId(\n client: OatmealClient,\n idOrSlug: string\n): Promise<string> {\n if (UUID_REGEX.test(idOrSlug)) {\n return idOrSlug\n }\n\n const data = await client.get<{ hackathons: Hackathon[] }>(\"/api/dashboard/hackathons\", {\n params: { q: idOrSlug, limit: 1 },\n })\n\n const match = data.hackathons?.find((h) => h.slug === idOrSlug)\n if (!match) {\n throw new Error(`Hackathon not found: \"${idOrSlug}\". Use a UUID or exact slug.`)\n }\n\n return match.id\n}\n"],"mappings":";AAGA,MAAM,aAAa;AAEnB,eAAsB,mBACpB,QACA,UACiB;AACjB,KAAI,WAAW,KAAK,SAAS,CAC3B,QAAO;CAOT,MAAM,SAJO,MAAM,OAAO,IAAiC,6BAA6B,EACtF,QAAQ;EAAE,GAAG;EAAU,OAAO;EAAG,EAClC,CAAC,EAEiB,YAAY,MAAM,MAAM,EAAE,SAAS,SAAS;AAC/D,KAAI,CAAC,MACH,OAAM,IAAI,MAAM,yBAAyB,SAAS,8BAA8B;AAGlF,QAAO,MAAM"}
1
+ {"version":3,"file":"resolve.mjs","names":[],"sources":["../../src/commands/hackathons/resolve.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport type { Hackathon } from \"../../types.js\"\n\nconst UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i\n\nexport async function resolveHackathonId(\n client: OatmealClient,\n idOrSlug: string\n): Promise<string> {\n if (UUID_REGEX.test(idOrSlug)) {\n return idOrSlug\n }\n\n const data = await client.get<{ hackathons: Hackathon[] }>(\"/api/dashboard/hackathons\", {\n params: { q: idOrSlug },\n })\n\n const match = data.hackathons?.find((h) => h.slug === idOrSlug)\n if (!match) {\n throw new Error(`Hackathon not found: \"${idOrSlug}\". Use a UUID or exact slug.`)\n }\n\n return match.id\n}\n"],"mappings":";AAGA,MAAM,aAAa;AAEnB,eAAsB,mBACpB,QACA,UACiB;AACjB,KAAI,WAAW,KAAK,SAAS,CAC3B,QAAO;CAOT,MAAM,SAJO,MAAM,OAAO,IAAiC,6BAA6B,EACtF,QAAQ,EAAE,GAAG,UAAU,EACxB,CAAC,EAEiB,YAAY,MAAM,MAAM,EAAE,SAAS,SAAS;AAC/D,KAAI,CAAC,MACH,OAAM,IAAI,MAAM,yBAAyB,SAAS,8BAA8B;AAGlF,QAAO,MAAM"}
@@ -10,29 +10,29 @@ async function runBrowseResults(client, slug, options) {
10
10
  console.log(formatJson(data));
11
11
  return;
12
12
  }
13
- if (!data.published) {
13
+ if (!data.isPublished) {
14
14
  console.log("Results have not been published yet.");
15
15
  return;
16
16
  }
17
- if (!data.rankings?.length) {
17
+ if (!data.results?.length) {
18
18
  console.log("No rankings available.");
19
19
  return;
20
20
  }
21
- console.log(formatTable(data.rankings, [
21
+ console.log(formatTable(data.results, [
22
22
  {
23
23
  key: "rank",
24
24
  label: "#"
25
25
  },
26
26
  {
27
- key: "submission_name",
27
+ key: "submissionTitle",
28
28
  label: "Submission"
29
29
  },
30
30
  {
31
- key: "team_name",
31
+ key: "teamName",
32
32
  label: "Team"
33
33
  },
34
34
  {
35
- key: "total_score",
35
+ key: "totalScore",
36
36
  label: "Score"
37
37
  }
38
38
  ]));
@@ -1 +1 @@
1
- {"version":3,"file":"results.mjs","names":[],"sources":["../../src/commands/browse/results.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport { formatJson, formatTable } from \"../../output.js\"\nimport type { ResultsData } from \"../../types.js\"\n\nexport async function runBrowseResults(\n client: OatmealClient,\n slug: string,\n options: { json?: boolean }\n): Promise<void> {\n if (!slug) {\n console.error(\"Usage: hackathon browse results <slug>\")\n process.exit(1)\n }\n\n const data = await client.get<ResultsData>(\n `/api/public/hackathons/${encodeURIComponent(slug)}/results`\n )\n\n if (options.json) {\n console.log(formatJson(data))\n return\n }\n\n if (!data.published) {\n console.log(\"Results have not been published yet.\")\n return\n }\n\n if (!data.rankings?.length) {\n console.log(\"No rankings available.\")\n return\n }\n\n console.log(\n formatTable(data.rankings, [\n { key: \"rank\", label: \"#\" },\n { key: \"submission_name\", label: \"Submission\" },\n { key: \"team_name\", label: \"Team\" },\n { key: \"total_score\", label: \"Score\" },\n ])\n )\n}\n"],"mappings":";;AAIA,eAAsB,iBACpB,QACA,MACA,SACe;AACf,KAAI,CAAC,MAAM;AACT,UAAQ,MAAM,yCAAyC;AACvD,UAAQ,KAAK,EAAE;;CAGjB,MAAM,OAAO,MAAM,OAAO,IACxB,0BAA0B,mBAAmB,KAAK,CAAC,UACpD;AAED,KAAI,QAAQ,MAAM;AAChB,UAAQ,IAAI,WAAW,KAAK,CAAC;AAC7B;;AAGF,KAAI,CAAC,KAAK,WAAW;AACnB,UAAQ,IAAI,uCAAuC;AACnD;;AAGF,KAAI,CAAC,KAAK,UAAU,QAAQ;AAC1B,UAAQ,IAAI,yBAAyB;AACrC;;AAGF,SAAQ,IACN,YAAY,KAAK,UAAU;EACzB;GAAE,KAAK;GAAQ,OAAO;GAAK;EAC3B;GAAE,KAAK;GAAmB,OAAO;GAAc;EAC/C;GAAE,KAAK;GAAa,OAAO;GAAQ;EACnC;GAAE,KAAK;GAAe,OAAO;;EAC9B,CAAC,CACH"}
1
+ {"version":3,"file":"results.mjs","names":[],"sources":["../../src/commands/browse/results.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport { formatJson, formatTable } from \"../../output.js\"\nimport type { ResultsData } from \"../../types.js\"\n\nexport async function runBrowseResults(\n client: OatmealClient,\n slug: string,\n options: { json?: boolean }\n): Promise<void> {\n if (!slug) {\n console.error(\"Usage: hackathon browse results <slug>\")\n process.exit(1)\n }\n\n const data = await client.get<ResultsData>(\n `/api/public/hackathons/${encodeURIComponent(slug)}/results`\n )\n\n if (options.json) {\n console.log(formatJson(data))\n return\n }\n\n if (!data.isPublished) {\n console.log(\"Results have not been published yet.\")\n return\n }\n\n if (!data.results?.length) {\n console.log(\"No rankings available.\")\n return\n }\n\n console.log(\n formatTable(data.results, [\n { key: \"rank\", label: \"#\" },\n { key: \"submissionTitle\", label: \"Submission\" },\n { key: \"teamName\", label: \"Team\" },\n { key: \"totalScore\", label: \"Score\" },\n ])\n )\n}\n"],"mappings":";;AAIA,eAAsB,iBACpB,QACA,MACA,SACe;AACf,KAAI,CAAC,MAAM;AACT,UAAQ,MAAM,yCAAyC;AACvD,UAAQ,KAAK,EAAE;;CAGjB,MAAM,OAAO,MAAM,OAAO,IACxB,0BAA0B,mBAAmB,KAAK,CAAC,UACpD;AAED,KAAI,QAAQ,MAAM;AAChB,UAAQ,IAAI,WAAW,KAAK,CAAC;AAC7B;;AAGF,KAAI,CAAC,KAAK,aAAa;AACrB,UAAQ,IAAI,uCAAuC;AACnD;;AAGF,KAAI,CAAC,KAAK,SAAS,QAAQ;AACzB,UAAQ,IAAI,yBAAyB;AACrC;;AAGF,SAAQ,IACN,YAAY,KAAK,SAAS;EACxB;GAAE,KAAK;GAAQ,OAAO;GAAK;EAC3B;GAAE,KAAK;GAAmB,OAAO;GAAc;EAC/C;GAAE,KAAK;GAAY,OAAO;GAAQ;EAClC;GAAE,KAAK;GAAc,OAAO;;EAC7B,CAAC,CACH"}
@@ -16,15 +16,15 @@ async function runBrowseSubmissions(client, slug, options) {
16
16
  }
17
17
  console.log(formatTable(data.submissions, [
18
18
  {
19
- key: "name",
19
+ key: "title",
20
20
  label: "Name"
21
21
  },
22
22
  {
23
- key: "team_name",
23
+ key: "submitter",
24
24
  label: "Team"
25
25
  },
26
26
  {
27
- key: "submitted_at",
27
+ key: "createdAt",
28
28
  label: "Submitted"
29
29
  }
30
30
  ]));
@@ -1 +1 @@
1
- {"version":3,"file":"submissions.mjs","names":[],"sources":["../../src/commands/browse/submissions.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport { formatJson, formatTable } from \"../../output.js\"\nimport type { Submission } from \"../../types.js\"\n\nexport async function runBrowseSubmissions(\n client: OatmealClient,\n slug: string,\n options: { json?: boolean }\n): Promise<void> {\n if (!slug) {\n console.error(\"Usage: hackathon browse submissions <slug>\")\n process.exit(1)\n }\n\n const data = await client.get<{ submissions: Submission[] }>(\n `/api/public/hackathons/${encodeURIComponent(slug)}/submissions`\n )\n\n if (options.json) {\n console.log(formatJson(data))\n return\n }\n\n if (!data.submissions?.length) {\n console.log(\"No submissions found.\")\n return\n }\n\n console.log(\n formatTable(data.submissions, [\n { key: \"name\", label: \"Name\" },\n { key: \"team_name\", label: \"Team\" },\n { key: \"submitted_at\", label: \"Submitted\" },\n ])\n )\n}\n"],"mappings":";;AAIA,eAAsB,qBACpB,QACA,MACA,SACe;AACf,KAAI,CAAC,MAAM;AACT,UAAQ,MAAM,6CAA6C;AAC3D,UAAQ,KAAK,EAAE;;CAGjB,MAAM,OAAO,MAAM,OAAO,IACxB,0BAA0B,mBAAmB,KAAK,CAAC,cACpD;AAED,KAAI,QAAQ,MAAM;AAChB,UAAQ,IAAI,WAAW,KAAK,CAAC;AAC7B;;AAGF,KAAI,CAAC,KAAK,aAAa,QAAQ;AAC7B,UAAQ,IAAI,wBAAwB;AACpC;;AAGF,SAAQ,IACN,YAAY,KAAK,aAAa;EAC5B;GAAE,KAAK;GAAQ,OAAO;GAAQ;EAC9B;GAAE,KAAK;GAAa,OAAO;GAAQ;EACnC;GAAE,KAAK;GAAgB,OAAO;;EAC/B,CAAC,CACH"}
1
+ {"version":3,"file":"submissions.mjs","names":[],"sources":["../../src/commands/browse/submissions.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport { formatJson, formatTable } from \"../../output.js\"\nimport type { Submission } from \"../../types.js\"\n\nexport async function runBrowseSubmissions(\n client: OatmealClient,\n slug: string,\n options: { json?: boolean }\n): Promise<void> {\n if (!slug) {\n console.error(\"Usage: hackathon browse submissions <slug>\")\n process.exit(1)\n }\n\n const data = await client.get<{ submissions: Submission[] }>(\n `/api/public/hackathons/${encodeURIComponent(slug)}/submissions`\n )\n\n if (options.json) {\n console.log(formatJson(data))\n return\n }\n\n if (!data.submissions?.length) {\n console.log(\"No submissions found.\")\n return\n }\n\n console.log(\n formatTable(data.submissions, [\n { key: \"title\", label: \"Name\" },\n { key: \"submitter\", label: \"Team\" },\n { key: \"createdAt\", label: \"Submitted\" },\n ])\n )\n}\n"],"mappings":";;AAIA,eAAsB,qBACpB,QACA,MACA,SACe;AACf,KAAI,CAAC,MAAM;AACT,UAAQ,MAAM,6CAA6C;AAC3D,UAAQ,KAAK,EAAE;;CAGjB,MAAM,OAAO,MAAM,OAAO,IACxB,0BAA0B,mBAAmB,KAAK,CAAC,cACpD;AAED,KAAI,QAAQ,MAAM;AAChB,UAAQ,IAAI,WAAW,KAAK,CAAC;AAC7B;;AAGF,KAAI,CAAC,KAAK,aAAa,QAAQ;AAC7B,UAAQ,IAAI,wBAAwB;AACpC;;AAGF,SAAQ,IACN,YAAY,KAAK,aAAa;EAC5B;GAAE,KAAK;GAAS,OAAO;GAAQ;EAC/B;GAAE,KAAK;GAAa,OAAO;GAAQ;EACnC;GAAE,KAAK;GAAa,OAAO;;EAC5B,CAAC,CACH"}
@@ -0,0 +1,92 @@
1
+ import { n as CONFIG_DIR, s as VERSION } from "./constants.mjs";
2
+ import { join } from "node:path";
3
+ import { existsSync, readFileSync, writeFileSync } from "node:fs";
4
+ //#region src/invocation.ts
5
+ const PACKAGE_NAME$1 = "@agi-ventures-canada/hackathon-cli";
6
+ function detectInvocationMode() {
7
+ const npmCommand = process.env.npm_command ?? "";
8
+ const execPath = process.env.npm_execpath ?? "";
9
+ const lifecycleEvent = process.env.npm_lifecycle_event ?? "";
10
+ const launcher = process.env._ ?? "";
11
+ const argv1 = process.argv[1] ?? "";
12
+ if (npmCommand === "run-script" && /bun/.test(execPath) || /packages\/cli\/src\/cli\.ts$/.test(argv1) || /packages\/cli\/dist\/cli\.mjs$/.test(argv1)) return "local-bun-script";
13
+ if (lifecycleEvent === "bunx" || npmCommand === "bunx" || /bunx/.test(launcher)) return "bunx";
14
+ if (npmCommand === "exec" || /npm/.test(execPath)) return "npx";
15
+ return "global";
16
+ }
17
+ function formatUpdateHint() {
18
+ switch (detectInvocationMode()) {
19
+ case "local-bun-script": return `Update this repo to get the new CLI version, or install the published CLI with \`bun install -g ${PACKAGE_NAME$1}@latest\`.`;
20
+ case "bunx": return `Run \`bunx ${PACKAGE_NAME$1} update\` to update.`;
21
+ case "npx": return `Run \`npx ${PACKAGE_NAME$1} update\` to update.`;
22
+ default: return "Run `hackathon update` to update.";
23
+ }
24
+ }
25
+ //#endregion
26
+ //#region src/update-check.ts
27
+ const PACKAGE_NAME = "@agi-ventures-canada/hackathon-cli";
28
+ const CHECK_FILE = join(CONFIG_DIR, "update-check.json");
29
+ const CHECK_INTERVAL_MS = 14400 * 1e3;
30
+ function readCache() {
31
+ if (!existsSync(CHECK_FILE)) return null;
32
+ try {
33
+ return JSON.parse(readFileSync(CHECK_FILE, "utf-8"));
34
+ } catch {
35
+ return null;
36
+ }
37
+ }
38
+ function writeCache(data) {
39
+ try {
40
+ writeFileSync(CHECK_FILE, JSON.stringify(data) + "\n", { mode: 384 });
41
+ } catch {}
42
+ }
43
+ async function fetchLatestVersion() {
44
+ try {
45
+ const controller = new AbortController();
46
+ const timeout = setTimeout(() => controller.abort(), 3e3);
47
+ const res = await fetch(`https://registry.npmjs.org/${PACKAGE_NAME}/latest`, { signal: controller.signal });
48
+ clearTimeout(timeout);
49
+ if (!res.ok) return null;
50
+ return (await res.json()).version ?? null;
51
+ } catch {
52
+ return null;
53
+ }
54
+ }
55
+ function compareVersions(a, b) {
56
+ const pa = a.split(".").map(Number);
57
+ const pb = b.split(".").map(Number);
58
+ for (let i = 0; i < 3; i++) {
59
+ if ((pa[i] ?? 0) < (pb[i] ?? 0)) return -1;
60
+ if ((pa[i] ?? 0) > (pb[i] ?? 0)) return 1;
61
+ }
62
+ return 0;
63
+ }
64
+ async function checkForUpdate() {
65
+ const cache = readCache();
66
+ const now = Date.now();
67
+ if (cache && now - cache.lastChecked < CHECK_INTERVAL_MS) {
68
+ if (compareVersions("0.1.0", cache.latestVersion) < 0) return {
69
+ current: VERSION,
70
+ latest: cache.latestVersion
71
+ };
72
+ return null;
73
+ }
74
+ const latest = await fetchLatestVersion();
75
+ if (!latest) return null;
76
+ writeCache({
77
+ lastChecked: now,
78
+ latestVersion: latest
79
+ });
80
+ if (compareVersions("0.1.0", latest) < 0) return {
81
+ current: VERSION,
82
+ latest
83
+ };
84
+ return null;
85
+ }
86
+ function formatUpdateNotice(info) {
87
+ return `\nUpdate available: ${info.current} → ${info.latest}\n${formatUpdateHint()}`;
88
+ }
89
+ //#endregion
90
+ export { checkForUpdate, formatUpdateNotice, detectInvocationMode as t };
91
+
92
+ //# sourceMappingURL=update-check.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-check.mjs","names":["PACKAGE_NAME"],"sources":["../../src/invocation.ts","../../src/update-check.ts"],"sourcesContent":["const PACKAGE_NAME = \"@agi-ventures-canada/hackathon-cli\"\n\nexport type InvocationMode = \"global\" | \"local-bun-script\" | \"bunx\" | \"npx\"\n\nexport function detectInvocationMode(): InvocationMode {\n const npmCommand = process.env.npm_command ?? \"\"\n const execPath = process.env.npm_execpath ?? \"\"\n const lifecycleEvent = process.env.npm_lifecycle_event ?? \"\"\n const launcher = process.env._ ?? \"\"\n const argv1 = process.argv[1] ?? \"\"\n\n if (\n (npmCommand === \"run-script\" && /bun/.test(execPath)) ||\n /packages\\/cli\\/src\\/cli\\.ts$/.test(argv1) ||\n /packages\\/cli\\/dist\\/cli\\.mjs$/.test(argv1)\n ) {\n return \"local-bun-script\"\n }\n\n if (\n lifecycleEvent === \"bunx\" ||\n npmCommand === \"bunx\" ||\n /bunx/.test(launcher)\n ) {\n return \"bunx\"\n }\n\n if (npmCommand === \"exec\" || /npm/.test(execPath)) {\n return \"npx\"\n }\n\n return \"global\"\n}\n\nexport function formatUpdateHint(): string {\n switch (detectInvocationMode()) {\n case \"local-bun-script\":\n return `Update this repo to get the new CLI version, or install the published CLI with \\`bun install -g ${PACKAGE_NAME}@latest\\`.`\n case \"bunx\":\n return `Run \\`bunx ${PACKAGE_NAME} update\\` to update.`\n case \"npx\":\n return `Run \\`npx ${PACKAGE_NAME} update\\` to update.`\n default:\n return \"Run `hackathon update` to update.\"\n }\n}\n","import { existsSync, readFileSync, writeFileSync } from \"node:fs\"\nimport { join } from \"node:path\"\nimport { CONFIG_DIR, VERSION } from \"./constants.js\"\nimport { formatUpdateHint } from \"./invocation.js\"\n\nconst PACKAGE_NAME = \"@agi-ventures-canada/hackathon-cli\"\nconst CHECK_FILE = join(CONFIG_DIR, \"update-check.json\")\nconst CHECK_INTERVAL_MS = 4 * 60 * 60 * 1000 // 4 hours\n\ninterface UpdateCheckCache {\n lastChecked: number\n latestVersion: string\n}\n\nfunction readCache(): UpdateCheckCache | null {\n if (!existsSync(CHECK_FILE)) return null\n try {\n return JSON.parse(readFileSync(CHECK_FILE, \"utf-8\")) as UpdateCheckCache\n } catch {\n return null\n }\n}\n\nfunction writeCache(data: UpdateCheckCache): void {\n try {\n writeFileSync(CHECK_FILE, JSON.stringify(data) + \"\\n\", { mode: 0o600 })\n } catch {\n // Silently ignore write failures\n }\n}\n\nasync function fetchLatestVersion(): Promise<string | null> {\n try {\n const controller = new AbortController()\n const timeout = setTimeout(() => controller.abort(), 3000)\n const res = await fetch(\n `https://registry.npmjs.org/${PACKAGE_NAME}/latest`,\n { signal: controller.signal }\n )\n clearTimeout(timeout)\n if (!res.ok) return null\n const data = (await res.json()) as { version?: string }\n return data.version ?? null\n } catch {\n return null\n }\n}\n\nfunction compareVersions(a: string, b: string): number {\n const pa = a.split(\".\").map(Number)\n const pb = b.split(\".\").map(Number)\n for (let i = 0; i < 3; i++) {\n if ((pa[i] ?? 0) < (pb[i] ?? 0)) return -1\n if ((pa[i] ?? 0) > (pb[i] ?? 0)) return 1\n }\n return 0\n}\n\nexport interface UpdateInfo {\n current: string\n latest: string\n}\n\nexport async function checkForUpdate(): Promise<UpdateInfo | null> {\n const cache = readCache()\n const now = Date.now()\n\n if (cache && now - cache.lastChecked < CHECK_INTERVAL_MS) {\n if (compareVersions(VERSION, cache.latestVersion) < 0) {\n return { current: VERSION, latest: cache.latestVersion }\n }\n return null\n }\n\n const latest = await fetchLatestVersion()\n if (!latest) return null\n\n writeCache({ lastChecked: now, latestVersion: latest })\n\n if (compareVersions(VERSION, latest) < 0) {\n return { current: VERSION, latest }\n }\n return null\n}\n\nexport function formatUpdateNotice(info: UpdateInfo): string {\n return `\\nUpdate available: ${info.current} → ${info.latest}\\n${formatUpdateHint()}`\n}\n"],"mappings":";;;;AAAA,MAAMA,iBAAe;AAIrB,SAAgB,uBAAuC;CACrD,MAAM,aAAa,QAAQ,IAAI,eAAe;CAC9C,MAAM,WAAW,QAAQ,IAAI,gBAAgB;CAC7C,MAAM,iBAAiB,QAAQ,IAAI,uBAAuB;CAC1D,MAAM,WAAW,QAAQ,IAAI,KAAK;CAClC,MAAM,QAAQ,QAAQ,KAAK,MAAM;AAEjC,KACG,eAAe,gBAAgB,MAAM,KAAK,SAAS,IACpD,+BAA+B,KAAK,MAAM,IAC1C,iCAAiC,KAAK,MAAM,CAE5C,QAAO;AAGT,KACE,mBAAmB,UACnB,eAAe,UACf,OAAO,KAAK,SAAS,CAErB,QAAO;AAGT,KAAI,eAAe,UAAU,MAAM,KAAK,SAAS,CAC/C,QAAO;AAGT,QAAO;;AAGT,SAAgB,mBAA2B;AACzC,SAAQ,sBAAsB,EAA9B;EACE,KAAK,mBACH,QAAO,mGAAmGA,eAAa;EACzH,KAAK,OACH,QAAO,cAAcA,eAAa;EACpC,KAAK,MACH,QAAO,aAAaA,eAAa;EACnC,QACE,QAAO;;;;;ACtCb,MAAM,eAAe;AACrB,MAAM,aAAa,KAAK,YAAY,oBAAoB;AACxD,MAAM,oBAAoB,QAAc;AAOxC,SAAS,YAAqC;AAC5C,KAAI,CAAC,WAAW,WAAW,CAAE,QAAO;AACpC,KAAI;AACF,SAAO,KAAK,MAAM,aAAa,YAAY,QAAQ,CAAC;SAC9C;AACN,SAAO;;;AAIX,SAAS,WAAW,MAA8B;AAChD,KAAI;AACF,gBAAc,YAAY,KAAK,UAAU,KAAK,GAAG,MAAM,EAAE,MAAM,KAAO,CAAC;SACjE;;AAKV,eAAe,qBAA6C;AAC1D,KAAI;EACF,MAAM,aAAa,IAAI,iBAAiB;EACxC,MAAM,UAAU,iBAAiB,WAAW,OAAO,EAAE,IAAK;EAC1D,MAAM,MAAM,MAAM,MAChB,8BAA8B,aAAa,UAC3C,EAAE,QAAQ,WAAW,QAAQ,CAC9B;AACD,eAAa,QAAQ;AACrB,MAAI,CAAC,IAAI,GAAI,QAAO;AAEpB,UADc,MAAM,IAAI,MAAM,EAClB,WAAW;SACjB;AACN,SAAO;;;AAIX,SAAS,gBAAgB,GAAW,GAAmB;CACrD,MAAM,KAAK,EAAE,MAAM,IAAI,CAAC,IAAI,OAAO;CACnC,MAAM,KAAK,EAAE,MAAM,IAAI,CAAC,IAAI,OAAO;AACnC,MAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,OAAK,GAAG,MAAM,MAAM,GAAG,MAAM,GAAI,QAAO;AACxC,OAAK,GAAG,MAAM,MAAM,GAAG,MAAM,GAAI,QAAO;;AAE1C,QAAO;;AAQT,eAAsB,iBAA6C;CACjE,MAAM,QAAQ,WAAW;CACzB,MAAM,MAAM,KAAK,KAAK;AAEtB,KAAI,SAAS,MAAM,MAAM,cAAc,mBAAmB;AACxD,MAAI,gBAAA,SAAyB,MAAM,cAAc,GAAG,EAClD,QAAO;GAAE,SAAS;GAAS,QAAQ,MAAM;GAAe;AAE1D,SAAO;;CAGT,MAAM,SAAS,MAAM,oBAAoB;AACzC,KAAI,CAAC,OAAQ,QAAO;AAEpB,YAAW;EAAE,aAAa;EAAK,eAAe;EAAQ,CAAC;AAEvD,KAAI,gBAAA,SAAyB,OAAO,GAAG,EACrC,QAAO;EAAE,SAAS;EAAS;EAAQ;AAErC,QAAO;;AAGT,SAAgB,mBAAmB,MAA0B;AAC3D,QAAO,uBAAuB,KAAK,QAAQ,KAAK,KAAK,OAAO,IAAI,kBAAkB"}
@@ -21,7 +21,7 @@ function parseUpdateOptions(args) {
21
21
  }
22
22
  async function runHackathonsUpdate(client, idOrSlug, args) {
23
23
  if (!idOrSlug) {
24
- console.error("Usage: hackathon hackathons update <id-or-slug> [--name ...] [--slug ...] [--description ...]");
24
+ console.error("Usage: hackathon events update <id-or-slug> [--name ...] [--slug ...] [--description ...]");
25
25
  process.exit(1);
26
26
  }
27
27
  const options = parseUpdateOptions(args);
@@ -34,12 +34,12 @@ async function runHackathonsUpdate(client, idOrSlug, args) {
34
34
  console.error("Error: provide at least one field to update (--name, --slug, --description)");
35
35
  process.exit(1);
36
36
  }
37
- const hackathon = await client.patch(`/api/dashboard/hackathons/${id}`, body);
37
+ const hackathon = await client.patch(`/api/dashboard/hackathons/${id}/settings`, body);
38
38
  if (options.json) {
39
39
  console.log(formatJson(hackathon));
40
40
  return;
41
41
  }
42
- console.log(formatSuccess(`Updated hackathon "${hackathon.name}"`));
42
+ console.log(formatSuccess(`Updated hackathon "${hackathon.name ?? id}"`));
43
43
  }
44
44
  //#endregion
45
45
  export { runHackathonsUpdate };
@@ -1 +1 @@
1
- {"version":3,"file":"update.mjs","names":[],"sources":["../../src/commands/hackathons/update.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport { formatJson, formatSuccess } from \"../../output.js\"\nimport type { Hackathon } from \"../../types.js\"\nimport { resolveHackathonId } from \"./resolve.js\"\n\ninterface UpdateOptions {\n name?: string\n slug?: string\n description?: string\n json?: boolean\n}\n\nexport function parseUpdateOptions(args: string[]): UpdateOptions {\n const options: UpdateOptions = {}\n for (let i = 0; i < args.length; i++) {\n switch (args[i]) {\n case \"--name\":\n options.name = args[++i]\n break\n case \"--slug\":\n options.slug = args[++i]\n break\n case \"--description\":\n options.description = args[++i]\n break\n case \"--json\":\n options.json = true\n break\n }\n }\n return options\n}\n\nexport async function runHackathonsUpdate(\n client: OatmealClient,\n idOrSlug: string,\n args: string[]\n): Promise<void> {\n if (!idOrSlug) {\n console.error(\"Usage: hackathon hackathons update <id-or-slug> [--name ...] [--slug ...] [--description ...]\")\n process.exit(1)\n }\n\n const options = parseUpdateOptions(args)\n const id = await resolveHackathonId(client, idOrSlug)\n\n const body: Record<string, string> = {}\n if (options.name) body.name = options.name\n if (options.slug) body.slug = options.slug\n if (options.description) body.description = options.description\n\n if (Object.keys(body).length === 0) {\n console.error(\"Error: provide at least one field to update (--name, --slug, --description)\")\n process.exit(1)\n }\n\n const hackathon = await client.patch<Hackathon>(`/api/dashboard/hackathons/${id}`, body)\n\n if (options.json) {\n console.log(formatJson(hackathon))\n return\n }\n\n console.log(formatSuccess(`Updated hackathon \"${hackathon.name}\"`))\n}\n"],"mappings":";;;AAYA,SAAgB,mBAAmB,MAA+B;CAChE,MAAM,UAAyB,EAAE;AACjC,MAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,IAC/B,SAAQ,KAAK,IAAb;EACE,KAAK;AACH,WAAQ,OAAO,KAAK,EAAE;AACtB;EACF,KAAK;AACH,WAAQ,OAAO,KAAK,EAAE;AACtB;EACF,KAAK;AACH,WAAQ,cAAc,KAAK,EAAE;AAC7B;EACF,KAAK;AACH,WAAQ,OAAO;AACf;;AAGN,QAAO;;AAGT,eAAsB,oBACpB,QACA,UACA,MACe;AACf,KAAI,CAAC,UAAU;AACb,UAAQ,MAAM,gGAAgG;AAC9G,UAAQ,KAAK,EAAE;;CAGjB,MAAM,UAAU,mBAAmB,KAAK;CACxC,MAAM,KAAK,MAAM,mBAAmB,QAAQ,SAAS;CAErD,MAAM,OAA+B,EAAE;AACvC,KAAI,QAAQ,KAAM,MAAK,OAAO,QAAQ;AACtC,KAAI,QAAQ,KAAM,MAAK,OAAO,QAAQ;AACtC,KAAI,QAAQ,YAAa,MAAK,cAAc,QAAQ;AAEpD,KAAI,OAAO,KAAK,KAAK,CAAC,WAAW,GAAG;AAClC,UAAQ,MAAM,8EAA8E;AAC5F,UAAQ,KAAK,EAAE;;CAGjB,MAAM,YAAY,MAAM,OAAO,MAAiB,6BAA6B,MAAM,KAAK;AAExF,KAAI,QAAQ,MAAM;AAChB,UAAQ,IAAI,WAAW,UAAU,CAAC;AAClC;;AAGF,SAAQ,IAAI,cAAc,sBAAsB,UAAU,KAAK,GAAG,CAAC"}
1
+ {"version":3,"file":"update.mjs","names":[],"sources":["../../src/commands/hackathons/update.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport { formatJson, formatSuccess } from \"../../output.js\"\nimport type { Hackathon } from \"../../types.js\"\nimport { resolveHackathonId } from \"./resolve.js\"\n\ninterface UpdateOptions {\n name?: string\n slug?: string\n description?: string\n json?: boolean\n}\n\nexport function parseUpdateOptions(args: string[]): UpdateOptions {\n const options: UpdateOptions = {}\n for (let i = 0; i < args.length; i++) {\n switch (args[i]) {\n case \"--name\":\n options.name = args[++i]\n break\n case \"--slug\":\n options.slug = args[++i]\n break\n case \"--description\":\n options.description = args[++i]\n break\n case \"--json\":\n options.json = true\n break\n }\n }\n return options\n}\n\nexport async function runHackathonsUpdate(\n client: OatmealClient,\n idOrSlug: string,\n args: string[]\n): Promise<void> {\n if (!idOrSlug) {\n console.error(\"Usage: hackathon events update <id-or-slug> [--name ...] [--slug ...] [--description ...]\")\n process.exit(1)\n }\n\n const options = parseUpdateOptions(args)\n const id = await resolveHackathonId(client, idOrSlug)\n\n const body: Record<string, string> = {}\n if (options.name) body.name = options.name\n if (options.slug) body.slug = options.slug\n if (options.description) body.description = options.description\n\n if (Object.keys(body).length === 0) {\n console.error(\"Error: provide at least one field to update (--name, --slug, --description)\")\n process.exit(1)\n }\n\n const hackathon = await client.patch<Hackathon>(`/api/dashboard/hackathons/${id}/settings`, body)\n\n if (options.json) {\n console.log(formatJson(hackathon))\n return\n }\n\n console.log(formatSuccess(`Updated hackathon \"${hackathon.name ?? id}\"`))\n}\n"],"mappings":";;;AAYA,SAAgB,mBAAmB,MAA+B;CAChE,MAAM,UAAyB,EAAE;AACjC,MAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,IAC/B,SAAQ,KAAK,IAAb;EACE,KAAK;AACH,WAAQ,OAAO,KAAK,EAAE;AACtB;EACF,KAAK;AACH,WAAQ,OAAO,KAAK,EAAE;AACtB;EACF,KAAK;AACH,WAAQ,cAAc,KAAK,EAAE;AAC7B;EACF,KAAK;AACH,WAAQ,OAAO;AACf;;AAGN,QAAO;;AAGT,eAAsB,oBACpB,QACA,UACA,MACe;AACf,KAAI,CAAC,UAAU;AACb,UAAQ,MAAM,4FAA4F;AAC1G,UAAQ,KAAK,EAAE;;CAGjB,MAAM,UAAU,mBAAmB,KAAK;CACxC,MAAM,KAAK,MAAM,mBAAmB,QAAQ,SAAS;CAErD,MAAM,OAA+B,EAAE;AACvC,KAAI,QAAQ,KAAM,MAAK,OAAO,QAAQ;AACtC,KAAI,QAAQ,KAAM,MAAK,OAAO,QAAQ;AACtC,KAAI,QAAQ,YAAa,MAAK,cAAc,QAAQ;AAEpD,KAAI,OAAO,KAAK,KAAK,CAAC,WAAW,GAAG;AAClC,UAAQ,MAAM,8EAA8E;AAC5F,UAAQ,KAAK,EAAE;;CAGjB,MAAM,YAAY,MAAM,OAAO,MAAiB,6BAA6B,GAAG,YAAY,KAAK;AAEjG,KAAI,QAAQ,MAAM;AAChB,UAAQ,IAAI,WAAW,UAAU,CAAC;AAClC;;AAGF,SAAQ,IAAI,cAAc,sBAAsB,UAAU,QAAQ,GAAG,GAAG,CAAC"}
@@ -29,8 +29,8 @@ async function runSchedulesUpdate(client, scheduleId, args) {
29
29
  const options = parseScheduleUpdateOptions(args);
30
30
  const body = {};
31
31
  if (options.name) body.name = options.name;
32
- if (options.cron) body.cron_expression = options.cron;
33
- if (options.enabled !== void 0) body.enabled = options.enabled;
32
+ if (options.cron) body.cronExpression = options.cron;
33
+ if (options.enabled !== void 0) body.isActive = options.enabled;
34
34
  if (Object.keys(body).length === 0) {
35
35
  console.error("Error: provide at least one field to update");
36
36
  process.exit(1);
@@ -1 +1 @@
1
- {"version":3,"file":"update4.mjs","names":[],"sources":["../../src/commands/schedules/update.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport { formatJson, formatSuccess } from \"../../output.js\"\nimport type { Schedule } from \"../../types.js\"\n\ninterface ScheduleUpdateOptions {\n name?: string\n cron?: string\n enabled?: boolean\n json?: boolean\n}\n\nexport function parseScheduleUpdateOptions(args: string[]): ScheduleUpdateOptions {\n const options: ScheduleUpdateOptions = {}\n for (let i = 0; i < args.length; i++) {\n switch (args[i]) {\n case \"--name\":\n options.name = args[++i]\n break\n case \"--cron\":\n options.cron = args[++i]\n break\n case \"--enable\":\n options.enabled = true\n break\n case \"--disable\":\n options.enabled = false\n break\n case \"--json\":\n options.json = true\n break\n }\n }\n return options\n}\n\nexport async function runSchedulesUpdate(\n client: OatmealClient,\n scheduleId: string,\n args: string[]\n): Promise<void> {\n if (!scheduleId) {\n console.error(\"Usage: hackathon schedules update <schedule-id> [--name ...] [--cron ...]\")\n process.exit(1)\n }\n\n const options = parseScheduleUpdateOptions(args)\n const body: Record<string, unknown> = {}\n if (options.name) body.name = options.name\n if (options.cron) body.cron_expression = options.cron\n if (options.enabled !== undefined) body.enabled = options.enabled\n\n if (Object.keys(body).length === 0) {\n console.error(\"Error: provide at least one field to update\")\n process.exit(1)\n }\n\n const schedule = await client.patch<Schedule>(\n `/api/dashboard/schedules/${scheduleId}`,\n body\n )\n\n if (options.json) {\n console.log(formatJson(schedule))\n return\n }\n\n console.log(formatSuccess(`Updated schedule \"${schedule.name}\"`))\n}\n"],"mappings":";;AAWA,SAAgB,2BAA2B,MAAuC;CAChF,MAAM,UAAiC,EAAE;AACzC,MAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,IAC/B,SAAQ,KAAK,IAAb;EACE,KAAK;AACH,WAAQ,OAAO,KAAK,EAAE;AACtB;EACF,KAAK;AACH,WAAQ,OAAO,KAAK,EAAE;AACtB;EACF,KAAK;AACH,WAAQ,UAAU;AAClB;EACF,KAAK;AACH,WAAQ,UAAU;AAClB;EACF,KAAK;AACH,WAAQ,OAAO;AACf;;AAGN,QAAO;;AAGT,eAAsB,mBACpB,QACA,YACA,MACe;AACf,KAAI,CAAC,YAAY;AACf,UAAQ,MAAM,4EAA4E;AAC1F,UAAQ,KAAK,EAAE;;CAGjB,MAAM,UAAU,2BAA2B,KAAK;CAChD,MAAM,OAAgC,EAAE;AACxC,KAAI,QAAQ,KAAM,MAAK,OAAO,QAAQ;AACtC,KAAI,QAAQ,KAAM,MAAK,kBAAkB,QAAQ;AACjD,KAAI,QAAQ,YAAY,KAAA,EAAW,MAAK,UAAU,QAAQ;AAE1D,KAAI,OAAO,KAAK,KAAK,CAAC,WAAW,GAAG;AAClC,UAAQ,MAAM,8CAA8C;AAC5D,UAAQ,KAAK,EAAE;;CAGjB,MAAM,WAAW,MAAM,OAAO,MAC5B,4BAA4B,cAC5B,KACD;AAED,KAAI,QAAQ,MAAM;AAChB,UAAQ,IAAI,WAAW,SAAS,CAAC;AACjC;;AAGF,SAAQ,IAAI,cAAc,qBAAqB,SAAS,KAAK,GAAG,CAAC"}
1
+ {"version":3,"file":"update4.mjs","names":[],"sources":["../../src/commands/schedules/update.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport { formatJson, formatSuccess } from \"../../output.js\"\nimport type { Schedule } from \"../../types.js\"\n\ninterface ScheduleUpdateOptions {\n name?: string\n cron?: string\n enabled?: boolean\n json?: boolean\n}\n\nexport function parseScheduleUpdateOptions(args: string[]): ScheduleUpdateOptions {\n const options: ScheduleUpdateOptions = {}\n for (let i = 0; i < args.length; i++) {\n switch (args[i]) {\n case \"--name\":\n options.name = args[++i]\n break\n case \"--cron\":\n options.cron = args[++i]\n break\n case \"--enable\":\n options.enabled = true\n break\n case \"--disable\":\n options.enabled = false\n break\n case \"--json\":\n options.json = true\n break\n }\n }\n return options\n}\n\nexport async function runSchedulesUpdate(\n client: OatmealClient,\n scheduleId: string,\n args: string[]\n): Promise<void> {\n if (!scheduleId) {\n console.error(\"Usage: hackathon schedules update <schedule-id> [--name ...] [--cron ...]\")\n process.exit(1)\n }\n\n const options = parseScheduleUpdateOptions(args)\n const body: Record<string, unknown> = {}\n if (options.name) body.name = options.name\n if (options.cron) body.cronExpression = options.cron\n if (options.enabled !== undefined) body.isActive = options.enabled\n\n if (Object.keys(body).length === 0) {\n console.error(\"Error: provide at least one field to update\")\n process.exit(1)\n }\n\n const schedule = await client.patch<Schedule>(\n `/api/dashboard/schedules/${scheduleId}`,\n body\n )\n\n if (options.json) {\n console.log(formatJson(schedule))\n return\n }\n\n console.log(formatSuccess(`Updated schedule \"${schedule.name}\"`))\n}\n"],"mappings":";;AAWA,SAAgB,2BAA2B,MAAuC;CAChF,MAAM,UAAiC,EAAE;AACzC,MAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,IAC/B,SAAQ,KAAK,IAAb;EACE,KAAK;AACH,WAAQ,OAAO,KAAK,EAAE;AACtB;EACF,KAAK;AACH,WAAQ,OAAO,KAAK,EAAE;AACtB;EACF,KAAK;AACH,WAAQ,UAAU;AAClB;EACF,KAAK;AACH,WAAQ,UAAU;AAClB;EACF,KAAK;AACH,WAAQ,OAAO;AACf;;AAGN,QAAO;;AAGT,eAAsB,mBACpB,QACA,YACA,MACe;AACf,KAAI,CAAC,YAAY;AACf,UAAQ,MAAM,4EAA4E;AAC1F,UAAQ,KAAK,EAAE;;CAGjB,MAAM,UAAU,2BAA2B,KAAK;CAChD,MAAM,OAAgC,EAAE;AACxC,KAAI,QAAQ,KAAM,MAAK,OAAO,QAAQ;AACtC,KAAI,QAAQ,KAAM,MAAK,iBAAiB,QAAQ;AAChD,KAAI,QAAQ,YAAY,KAAA,EAAW,MAAK,WAAW,QAAQ;AAE3D,KAAI,OAAO,KAAK,KAAK,CAAC,WAAW,GAAG;AAClC,UAAQ,MAAM,8CAA8C;AAC5D,UAAQ,KAAK,EAAE;;CAGjB,MAAM,WAAW,MAAM,OAAO,MAC5B,4BAA4B,cAC5B,KACD;AAED,KAAI,QAAQ,MAAM;AAChB,UAAQ,IAAI,WAAW,SAAS,CAAC;AACjC;;AAGF,SAAQ,IAAI,cAAc,qBAAqB,SAAS,KAAK,GAAG,CAAC"}