syntaur 0.40.0 → 0.41.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/dashboard/dist/assets/{_basePickBy-D6criIXV.js → _basePickBy-CMGil-NY.js} +1 -1
  3. package/dashboard/dist/assets/{_baseUniq-CKxMpzId.js → _baseUniq-DllyUaEJ.js} +1 -1
  4. package/dashboard/dist/assets/{arc-9r-o7jsh.js → arc-C6fNP_LJ.js} +1 -1
  5. package/dashboard/dist/assets/{architectureDiagram-2XIMDMQ5-CNC47xK1.js → architectureDiagram-2XIMDMQ5-CxXDnbMY.js} +1 -1
  6. package/dashboard/dist/assets/{blockDiagram-WCTKOSBZ-CxLXL7nx.js → blockDiagram-WCTKOSBZ-B8UDJhxg.js} +1 -1
  7. package/dashboard/dist/assets/{c4Diagram-IC4MRINW-BLbJctin.js → c4Diagram-IC4MRINW-9XDZP3AD.js} +1 -1
  8. package/dashboard/dist/assets/channel-OsoeK3Lk.js +1 -0
  9. package/dashboard/dist/assets/{chunk-4BX2VUAB-CDbpfqib.js → chunk-4BX2VUAB-D1LR7D9Y.js} +1 -1
  10. package/dashboard/dist/assets/{chunk-55IACEB6-L4WI8t-Y.js → chunk-55IACEB6-sumE5d0X.js} +1 -1
  11. package/dashboard/dist/assets/{chunk-FMBD7UC4-By5-igEn.js → chunk-FMBD7UC4-C-Iy8wke.js} +1 -1
  12. package/dashboard/dist/assets/{chunk-JSJVCQXG-Q9k6_65Q.js → chunk-JSJVCQXG-Clyrcmzt.js} +1 -1
  13. package/dashboard/dist/assets/{chunk-KX2RTZJC-BHIFtGWH.js → chunk-KX2RTZJC-BQqetgrP.js} +1 -1
  14. package/dashboard/dist/assets/{chunk-NQ4KR5QH-B4NuJ8C_.js → chunk-NQ4KR5QH-Cw60fnx2.js} +1 -1
  15. package/dashboard/dist/assets/{chunk-QZHKN3VN-BQyRAT6J.js → chunk-QZHKN3VN-Dv40SU2-.js} +1 -1
  16. package/dashboard/dist/assets/{chunk-WL4C6EOR-De4b_Qs3.js → chunk-WL4C6EOR-DFiOufrs.js} +1 -1
  17. package/dashboard/dist/assets/classDiagram-VBA2DB6C-BKX6nUBp.js +1 -0
  18. package/dashboard/dist/assets/classDiagram-v2-RAHNMMFH-BKX6nUBp.js +1 -0
  19. package/dashboard/dist/assets/clone-f-TTh9ms.js +1 -0
  20. package/dashboard/dist/assets/{cose-bilkent-S5V4N54A-DrH8QqS8.js → cose-bilkent-S5V4N54A-DV306SRn.js} +1 -1
  21. package/dashboard/dist/assets/{dagre-KLK3FWXG-DPchOAoI.js → dagre-KLK3FWXG-DaQ1pWLV.js} +1 -1
  22. package/dashboard/dist/assets/{diagram-E7M64L7V-jehxXjzH.js → diagram-E7M64L7V-2fsjMT-T.js} +1 -1
  23. package/dashboard/dist/assets/{diagram-IFDJBPK2-Dk0Hd4w_.js → diagram-IFDJBPK2-CoaSyKLw.js} +1 -1
  24. package/dashboard/dist/assets/{diagram-P4PSJMXO-CTg6e3e_.js → diagram-P4PSJMXO-C_j6Kd6q.js} +1 -1
  25. package/dashboard/dist/assets/{erDiagram-INFDFZHY-C53s82M7.js → erDiagram-INFDFZHY-CpOdYJWS.js} +1 -1
  26. package/dashboard/dist/assets/{flowDiagram-PKNHOUZH-DuNh0Fc7.js → flowDiagram-PKNHOUZH-KVRjmhbG.js} +1 -1
  27. package/dashboard/dist/assets/{ganttDiagram-A5KZAMGK-B74hkBwP.js → ganttDiagram-A5KZAMGK-CA_n5ynk.js} +1 -1
  28. package/dashboard/dist/assets/{gitGraphDiagram-K3NZZRJ6-CTwOleky.js → gitGraphDiagram-K3NZZRJ6-DKkS_iH8.js} +1 -1
  29. package/dashboard/dist/assets/{graph-DuB65SUX.js → graph-C6ehraTW.js} +1 -1
  30. package/dashboard/dist/assets/{index-BZ5hEn-I.css → index-CdHziP5R.css} +1 -1
  31. package/dashboard/dist/assets/{index-IKAckop6.js → index-SW4WrQLg.js} +88 -88
  32. package/dashboard/dist/assets/{infoDiagram-LFFYTUFH-CPgiVLQb.js → infoDiagram-LFFYTUFH-H1Eg4YK9.js} +1 -1
  33. package/dashboard/dist/assets/{ishikawaDiagram-PHBUUO56-Di5CEnNR.js → ishikawaDiagram-PHBUUO56-DSrc4sub.js} +1 -1
  34. package/dashboard/dist/assets/{journeyDiagram-4ABVD52K-B1RhycTR.js → journeyDiagram-4ABVD52K-Bl_0LgIo.js} +1 -1
  35. package/dashboard/dist/assets/{kanban-definition-K7BYSVSG-vw0FgyVD.js → kanban-definition-K7BYSVSG-Cq2WGyif.js} +1 -1
  36. package/dashboard/dist/assets/{layout-D4u8D4QF.js → layout-DJv9vite.js} +1 -1
  37. package/dashboard/dist/assets/{linear-vN7TVTLe.js → linear-CAef3hQD.js} +1 -1
  38. package/dashboard/dist/assets/{mermaid.core-CkrBXB3x.js → mermaid.core-B_gAmtAa.js} +4 -4
  39. package/dashboard/dist/assets/{mindmap-definition-YRQLILUH-DF83eEZe.js → mindmap-definition-YRQLILUH-4aIWu_CK.js} +1 -1
  40. package/dashboard/dist/assets/{pieDiagram-SKSYHLDU-s6OowTfq.js → pieDiagram-SKSYHLDU-1ThATMqf.js} +1 -1
  41. package/dashboard/dist/assets/{quadrantDiagram-337W2JSQ-BdInZyNW.js → quadrantDiagram-337W2JSQ-BEq2jVyN.js} +1 -1
  42. package/dashboard/dist/assets/{requirementDiagram-Z7DCOOCP-ChbwbMIW.js → requirementDiagram-Z7DCOOCP-DbYJrAQ9.js} +1 -1
  43. package/dashboard/dist/assets/{sankeyDiagram-WA2Y5GQK-DISdO2ue.js → sankeyDiagram-WA2Y5GQK-DMr3kn8l.js} +1 -1
  44. package/dashboard/dist/assets/{sequenceDiagram-2WXFIKYE-D12TBnwJ.js → sequenceDiagram-2WXFIKYE-BR03-l-y.js} +1 -1
  45. package/dashboard/dist/assets/{stateDiagram-RAJIS63D-CgCT1a9a.js → stateDiagram-RAJIS63D-DUj-dVll.js} +1 -1
  46. package/dashboard/dist/assets/stateDiagram-v2-FVOUBMTO-Dzzbhq6b.js +1 -0
  47. package/dashboard/dist/assets/{timeline-definition-YZTLITO2-Cp3_SQeH.js → timeline-definition-YZTLITO2-DpN8jElm.js} +1 -1
  48. package/dashboard/dist/assets/{treemap-KZPCXAKY-CuMtPlep.js → treemap-KZPCXAKY-CyUTDKiM.js} +1 -1
  49. package/dashboard/dist/assets/{vennDiagram-LZ73GAT5-CoLZAO3b.js → vennDiagram-LZ73GAT5-DRJFiQmT.js} +1 -1
  50. package/dashboard/dist/assets/{xychartDiagram-JWTSCODW-D96zGIQV.js → xychartDiagram-JWTSCODW-DcrZVnQ-.js} +1 -1
  51. package/dashboard/dist/index.html +2 -2
  52. package/dist/dashboard/server.js +139 -24
  53. package/dist/dashboard/server.js.map +1 -1
  54. package/dist/index.js +184 -30
  55. package/dist/index.js.map +1 -1
  56. package/dist/launch/index.d.ts +30 -0
  57. package/dist/launch/index.js +108 -20
  58. package/dist/launch/index.js.map +1 -1
  59. package/package.json +1 -1
  60. package/platforms/claude-code/.claude-plugin/plugin.json +1 -1
  61. package/platforms/codex/.codex-plugin/plugin.json +1 -1
  62. package/platforms/hermes/plugins/syntaur/__pycache__/__init__.cpython-312.pyc +0 -0
  63. package/platforms/hermes/plugins/syntaur/__pycache__/boundary.cpython-312.pyc +0 -0
  64. package/dashboard/dist/assets/channel-3nrYYZ_g.js +0 -1
  65. package/dashboard/dist/assets/classDiagram-VBA2DB6C-B2kUF3N9.js +0 -1
  66. package/dashboard/dist/assets/classDiagram-v2-RAHNMMFH-B2kUF3N9.js +0 -1
  67. package/dashboard/dist/assets/clone-CNGwk6vy.js +0 -1
  68. package/dashboard/dist/assets/stateDiagram-v2-FVOUBMTO-wC4ehH_U.js +0 -1
@@ -26,6 +26,14 @@ interface ParsedOpenUrl {
26
26
  * process may still be writing the transcript.
27
27
  */
28
28
  mode?: SessionMode;
29
+ /**
30
+ * Optional agent id to launch with (the `agent=` query param). Lets the
31
+ * dashboard's "Open in agent" picker launch a specific runner profile instead
32
+ * of the configured default. Only honored for `kind === 'assignment'`; for
33
+ * sessions the agent is pinned by the session record, so the value is
34
+ * parsed-but-ignored rather than rejected (keeps the parser simple).
35
+ */
36
+ agent?: string;
29
37
  }
30
38
  /**
31
39
  * Parse a `syntaur://open?assignment=<id>` or `syntaur://open?session=<id>` URL.
@@ -69,6 +77,20 @@ interface AgentConfig {
69
77
  resolveFromShellAliases?: boolean;
70
78
  resume?: SessionInvocation;
71
79
  fork?: SessionInvocation;
80
+ /**
81
+ * Optional LLM model for this runner profile, injected into the launched CLI
82
+ * as a generic `--model <value>` flag (see `modelFlagArgs`). Blank/undefined
83
+ * omits the flag entirely (today's behavior). Works for agents whose CLI
84
+ * accepts `--model` (claude, codex); leave blank for agents that don't.
85
+ */
86
+ model?: string;
87
+ /**
88
+ * Optional playbook slug for this runner profile. When set, a fresh "Open in
89
+ * agent" launch seeds a prompt that grabs the assignment AND runs this
90
+ * playbook end-to-end (see `INITIAL_PROMPT`). Blank/undefined keeps the plain
91
+ * `/grab-assignment` seed.
92
+ */
93
+ playbook?: string;
72
94
  }
73
95
 
74
96
  interface WorkspaceVisibilityConfig {
@@ -208,6 +230,14 @@ interface ResolveLaunchPlanInput {
208
230
  * dialog can confirm a different terminal without mutating user config.
209
231
  */
210
232
  terminalOverride?: TerminalChoice;
233
+ /**
234
+ * Only consulted when `kind === 'assignment'`. The agent id to launch with,
235
+ * wired from `?agent=<id>` on the incoming `syntaur://` URL so the dashboard's
236
+ * "Open in agent" picker can launch a specific runner profile. When unset,
237
+ * falls back to `pickAgent(config)` (the default agent). An unknown id throws
238
+ * `LaunchError('agent-not-configured')`.
239
+ */
240
+ agentId?: string;
211
241
  }
212
242
  /**
213
243
  * Pick the agent the "Open in agent" flow should use. Order of preference:
@@ -696,6 +696,28 @@ var init_hotkeysCatalog = __esm({
696
696
  });
697
697
 
698
698
  // src/utils/agents-schema.ts
699
+ function modelFlagArgs(agent) {
700
+ const m = agent.model?.trim();
701
+ return m ? ["--model", m] : [];
702
+ }
703
+ function stripModelFlags(args) {
704
+ const out = [];
705
+ for (let i = 0; i < args.length; i++) {
706
+ const a = args[i];
707
+ if (a === "--model" || a === "-m") {
708
+ i++;
709
+ continue;
710
+ }
711
+ if (a.startsWith("--model=") || a.startsWith("-m=")) continue;
712
+ out.push(a);
713
+ }
714
+ return out;
715
+ }
716
+ function applyModelFlag(agent, baseArgs) {
717
+ const flag = modelFlagArgs(agent);
718
+ if (flag.length === 0) return baseArgs;
719
+ return [...stripModelFlags(baseArgs), ...flag];
720
+ }
699
721
  var BUILTIN_AGENTS, AGENT_ID_PATTERN, PROMPT_ARG_POSITIONS;
700
722
  var init_agents_schema = __esm({
701
723
  "src/utils/agents-schema.ts"() {
@@ -750,6 +772,16 @@ var init_agents_schema = __esm({
750
772
  }
751
773
  });
752
774
 
775
+ // src/utils/slug.ts
776
+ function isValidSlug(slug) {
777
+ return /^[a-z0-9]+(-[a-z0-9]+)*$/.test(slug);
778
+ }
779
+ var init_slug = __esm({
780
+ "src/utils/slug.ts"() {
781
+ "use strict";
782
+ }
783
+ });
784
+
753
785
  // src/utils/workspace-visibility-schema.ts
754
786
  function normalizeHiddenList(input) {
755
787
  if (!Array.isArray(input)) return [];
@@ -818,6 +850,16 @@ function validateAgentList(agents) {
818
850
  `agent "${agent.id}" has invalid promptArgPosition "${agent.promptArgPosition}" \u2014 expected first|last|none`
819
851
  );
820
852
  }
853
+ if (agent.model !== void 0 && /[\r\n]/.test(agent.model)) {
854
+ throw new AgentConfigError(
855
+ `agent "${agent.id}" has invalid model \u2014 must be a single line (no newlines)`
856
+ );
857
+ }
858
+ if (agent.playbook !== void 0 && agent.playbook.trim() !== "" && !isValidSlug(agent.playbook)) {
859
+ throw new AgentConfigError(
860
+ `agent "${agent.id}" has invalid playbook "${agent.playbook}" \u2014 must be a valid playbook slug`
861
+ );
862
+ }
821
863
  validateSessionInvocation(agent, "resume", agent.resume);
822
864
  validateSessionInvocation(agent, "fork", agent.fork);
823
865
  if (agent.default) defaults++;
@@ -1195,6 +1237,8 @@ function parseAgentsConfig(content) {
1195
1237
  ...current.promptArgPosition ? { promptArgPosition: current.promptArgPosition } : {},
1196
1238
  ...current.default ? { default: true } : {},
1197
1239
  ...current.resolveFromShellAliases ? { resolveFromShellAliases: true } : {},
1240
+ ...current.model ? { model: current.model } : {},
1241
+ ...current.playbook ? { playbook: current.playbook } : {},
1198
1242
  ...current.resume ? { resume: current.resume } : {},
1199
1243
  ...current.fork ? { fork: current.fork } : {}
1200
1244
  });
@@ -1377,6 +1421,12 @@ function assignAgentField(target, key, rawValue) {
1377
1421
  case "resolveFromShellAliases":
1378
1422
  target.resolveFromShellAliases = value === "true";
1379
1423
  break;
1424
+ case "model":
1425
+ target.model = value;
1426
+ break;
1427
+ case "playbook":
1428
+ target.playbook = value;
1429
+ break;
1380
1430
  }
1381
1431
  }
1382
1432
  async function readConfig() {
@@ -1511,6 +1561,7 @@ var init_config2 = __esm({
1511
1561
  init_lifecycle();
1512
1562
  init_hotkeysCatalog();
1513
1563
  init_agents_schema();
1564
+ init_slug();
1514
1565
  init_terminal_schema();
1515
1566
  init_workspace_visibility_schema();
1516
1567
  DEFAULT_CONFIG = {
@@ -1560,7 +1611,9 @@ var init_config2 = __esm({
1560
1611
  "command",
1561
1612
  "promptArgPosition",
1562
1613
  "default",
1563
- "resolveFromShellAliases"
1614
+ "resolveFromShellAliases",
1615
+ "model",
1616
+ "playbook"
1564
1617
  ]);
1565
1618
  migratedConfigPaths = /* @__PURE__ */ new Set();
1566
1619
  TerminalConfigError = class extends Error {
@@ -1645,13 +1698,6 @@ var init_assignment_resolver = __esm({
1645
1698
  }
1646
1699
  });
1647
1700
 
1648
- // src/utils/slug.ts
1649
- var init_slug = __esm({
1650
- "src/utils/slug.ts"() {
1651
- "use strict";
1652
- }
1653
- });
1654
-
1655
1701
  // src/utils/playbooks.ts
1656
1702
  import { resolve as resolve8 } from "path";
1657
1703
  import { readdir as readdir4, readFile as readFile7, unlink } from "fs/promises";
@@ -2832,6 +2878,17 @@ function parseOpenUrl(input) {
2832
2878
  }
2833
2879
  terminal = candidate;
2834
2880
  }
2881
+ const agentVals = url.searchParams.getAll("agent");
2882
+ if (agentVals.length > 1) {
2883
+ throw new OpenUrlError(
2884
+ "duplicate-param",
2885
+ "URL has more than one `agent` query param"
2886
+ );
2887
+ }
2888
+ let agent;
2889
+ if (agentVals.length === 1 && agentVals[0].trim() !== "") {
2890
+ agent = agentVals[0];
2891
+ }
2835
2892
  if (assignmentVals.length === 1) {
2836
2893
  const id = assignmentVals[0];
2837
2894
  if (id.trim() === "") {
@@ -2840,7 +2897,12 @@ function parseOpenUrl(input) {
2840
2897
  "`assignment` query param is empty"
2841
2898
  );
2842
2899
  }
2843
- return { kind: "assignment", id, ...terminal ? { terminal } : {} };
2900
+ return {
2901
+ kind: "assignment",
2902
+ id,
2903
+ ...terminal ? { terminal } : {},
2904
+ ...agent ? { agent } : {}
2905
+ };
2844
2906
  }
2845
2907
  if (sessionVals.length === 1) {
2846
2908
  const id = sessionVals[0];
@@ -2865,7 +2927,13 @@ function parseOpenUrl(input) {
2865
2927
  }
2866
2928
  mode = raw;
2867
2929
  }
2868
- return { kind: "session", id, mode, ...terminal ? { terminal } : {} };
2930
+ return {
2931
+ kind: "session",
2932
+ id,
2933
+ mode,
2934
+ ...terminal ? { terminal } : {},
2935
+ ...agent ? { agent } : {}
2936
+ };
2869
2937
  }
2870
2938
  throw new OpenUrlError(
2871
2939
  "missing-id",
@@ -2880,6 +2948,7 @@ init_api();
2880
2948
 
2881
2949
  // src/tui/launch.ts
2882
2950
  init_api();
2951
+ init_agents_schema();
2883
2952
  import { spawn } from "child_process";
2884
2953
  import { mkdir as mkdir2, writeFile as writeFile4 } from "fs/promises";
2885
2954
  import { isAbsolute as isAbsolute3, resolve as resolve12 } from "path";
@@ -2927,13 +2996,18 @@ function formatFallbackCwdWarning(opts) {
2927
2996
 
2928
2997
  // src/tui/launch.ts
2929
2998
  var INITIAL_PROMPT = (params) => {
2930
- if (params.projectSlug) {
2931
- return `/grab-assignment ${params.projectSlug} ${params.assignmentSlug}`;
2932
- }
2933
- if (params.id) {
2934
- return `/grab-assignment --id ${params.id}`;
2999
+ const playbook = params.playbook?.trim();
3000
+ if (!playbook) {
3001
+ if (params.projectSlug) {
3002
+ return `/grab-assignment ${params.projectSlug} ${params.assignmentSlug}`;
3003
+ }
3004
+ if (params.id) {
3005
+ return `/grab-assignment --id ${params.id}`;
3006
+ }
3007
+ return `/grab-assignment ${params.assignmentSlug}`;
2935
3008
  }
2936
- return `/grab-assignment ${params.assignmentSlug}`;
3009
+ const grabClause = params.projectSlug ? `the assignment \`${params.projectSlug}/${params.assignmentSlug}\` using the /grab-assignment skill` : params.id ? `the assignment id \`${params.id}\` using /grab-assignment --id ${params.id}` : `the assignment \`${params.assignmentSlug}\` using the /grab-assignment skill`;
3010
+ return `Grab ${grabClause}, then load and run the \`${playbook}\` playbook using the /run-playbook skill and carry it out end-to-end.`;
2937
3011
  };
2938
3012
  function shellQuote(arg) {
2939
3013
  if (arg === "") return "''";
@@ -2941,7 +3015,7 @@ function shellQuote(arg) {
2941
3015
  }
2942
3016
  function buildAgentArgv(agent, prompt, env = process.env) {
2943
3017
  const position = agent.promptArgPosition ?? "first";
2944
- const baseArgs = [...agent.args ?? []];
3018
+ const baseArgs = applyModelFlag(agent, [...agent.args ?? []]);
2945
3019
  const agentArgs = position === "first" ? [prompt, ...baseArgs] : position === "last" ? [...baseArgs, prompt] : baseArgs;
2946
3020
  if (agent.resolveFromShellAliases) {
2947
3021
  const requested = env.SHELL;
@@ -2967,6 +3041,7 @@ function buildAgentArgv(agent, prompt, env = process.env) {
2967
3041
  init_agent_sessions();
2968
3042
 
2969
3043
  // src/launch/argv.ts
3044
+ init_agents_schema();
2970
3045
  import { isAbsolute as isAbsolute4 } from "path";
2971
3046
  var buildFreshArgv = buildAgentArgv;
2972
3047
  function buildSessionArgv(agent, sessionId, mode, env = process.env) {
@@ -2981,7 +3056,7 @@ function buildSessionArgv(agent, sessionId, mode, env = process.env) {
2981
3056
  (a) => a === "{id}" ? sessionId : a
2982
3057
  );
2983
3058
  const command = invocation.command ?? agent.command;
2984
- const agentArgs = [...agent.args ?? [], ...substituted];
3059
+ const agentArgs = [...applyModelFlag(agent, [...agent.args ?? []]), ...substituted];
2985
3060
  if (agent.resolveFromShellAliases) {
2986
3061
  const requested = env.SHELL;
2987
3062
  let shell = requested;
@@ -3062,13 +3137,26 @@ async function resolveAssignmentPlan(input, terminal) {
3062
3137
  }
3063
3138
  const cwd = picked.cwd;
3064
3139
  const fallbackWarning = picked.fallbackWarning;
3065
- const agent = pickAgent(input.config);
3140
+ let agent;
3141
+ if (input.agentId) {
3142
+ const found = getAgents(input.config).find((a) => a.id === input.agentId);
3143
+ if (!found) {
3144
+ throw new LaunchError(
3145
+ "agent-not-configured",
3146
+ `Agent "${input.agentId}" requested in the open URL is not in your agents list.`
3147
+ );
3148
+ }
3149
+ agent = found;
3150
+ } else {
3151
+ agent = pickAgent(input.config);
3152
+ }
3066
3153
  const { argv, shellFallbackWarning } = buildFreshArgv(
3067
3154
  agent,
3068
3155
  INITIAL_PROMPT({
3069
3156
  projectSlug: resolved.projectSlug,
3070
3157
  assignmentSlug: resolved.assignmentSlug,
3071
- id: resolved.id
3158
+ id: resolved.id,
3159
+ playbook: agent.playbook
3072
3160
  })
3073
3161
  );
3074
3162
  return {