syntaur 0.44.0 → 0.45.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 (70) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/dashboard/dist/assets/{_basePickBy-CNjxCBYf.js → _basePickBy-RQBuJKcX.js} +1 -1
  3. package/dashboard/dist/assets/{_baseUniq-1yktSv9L.js → _baseUniq-_J7s4kD3.js} +1 -1
  4. package/dashboard/dist/assets/{arc-CUp_7cxd.js → arc-_9SyUgKQ.js} +1 -1
  5. package/dashboard/dist/assets/{architectureDiagram-2XIMDMQ5-BhQNIov3.js → architectureDiagram-2XIMDMQ5-C8LeFMgr.js} +1 -1
  6. package/dashboard/dist/assets/{blockDiagram-WCTKOSBZ-BbrHpJX7.js → blockDiagram-WCTKOSBZ-gMh0EPEh.js} +1 -1
  7. package/dashboard/dist/assets/{c4Diagram-IC4MRINW-BzAgIl-O.js → c4Diagram-IC4MRINW-cHwecwLI.js} +1 -1
  8. package/dashboard/dist/assets/channel-C36dnl_e.js +1 -0
  9. package/dashboard/dist/assets/{chunk-4BX2VUAB-DxR-gcvU.js → chunk-4BX2VUAB-Bb2anYuQ.js} +1 -1
  10. package/dashboard/dist/assets/{chunk-55IACEB6-DgMbDP9S.js → chunk-55IACEB6-DYIRGzA1.js} +1 -1
  11. package/dashboard/dist/assets/{chunk-FMBD7UC4-zECir1CK.js → chunk-FMBD7UC4-sgRWBbaF.js} +1 -1
  12. package/dashboard/dist/assets/{chunk-JSJVCQXG-Cnl5h8xD.js → chunk-JSJVCQXG-DlYKMl_j.js} +1 -1
  13. package/dashboard/dist/assets/{chunk-KX2RTZJC-Ck2VpQt9.js → chunk-KX2RTZJC-D0YDLAOF.js} +1 -1
  14. package/dashboard/dist/assets/{chunk-NQ4KR5QH-B8kgPwoS.js → chunk-NQ4KR5QH-D-Y-CUx6.js} +1 -1
  15. package/dashboard/dist/assets/{chunk-QZHKN3VN-CsN9VGXC.js → chunk-QZHKN3VN-D7FpSvb5.js} +1 -1
  16. package/dashboard/dist/assets/{chunk-WL4C6EOR-BP27dBI1.js → chunk-WL4C6EOR-CtXgQLdS.js} +1 -1
  17. package/dashboard/dist/assets/classDiagram-VBA2DB6C-BsoGa6_a.js +1 -0
  18. package/dashboard/dist/assets/classDiagram-v2-RAHNMMFH-BsoGa6_a.js +1 -0
  19. package/dashboard/dist/assets/clone-Bz6jW3OY.js +1 -0
  20. package/dashboard/dist/assets/{cose-bilkent-S5V4N54A-m2V_HPK-.js → cose-bilkent-S5V4N54A-YbTaohoJ.js} +1 -1
  21. package/dashboard/dist/assets/{dagre-KLK3FWXG-CZfxqYb1.js → dagre-KLK3FWXG-CMtwGAnP.js} +1 -1
  22. package/dashboard/dist/assets/{diagram-E7M64L7V-DtzcWFtr.js → diagram-E7M64L7V-D8wBMBAX.js} +1 -1
  23. package/dashboard/dist/assets/{diagram-IFDJBPK2-D2IymgnX.js → diagram-IFDJBPK2-DfudLpiJ.js} +1 -1
  24. package/dashboard/dist/assets/{diagram-P4PSJMXO-D24UPsRu.js → diagram-P4PSJMXO-CyMy61wE.js} +1 -1
  25. package/dashboard/dist/assets/{erDiagram-INFDFZHY-CZKUJMzt.js → erDiagram-INFDFZHY-BlB4ZQl9.js} +1 -1
  26. package/dashboard/dist/assets/{flowDiagram-PKNHOUZH-DL_F8pzV.js → flowDiagram-PKNHOUZH-DbhDQJM3.js} +1 -1
  27. package/dashboard/dist/assets/{ganttDiagram-A5KZAMGK-D8fgmRAI.js → ganttDiagram-A5KZAMGK-DJFqteNi.js} +1 -1
  28. package/dashboard/dist/assets/{gitGraphDiagram-K3NZZRJ6-2-zNwJhX.js → gitGraphDiagram-K3NZZRJ6-D8etA_mm.js} +1 -1
  29. package/dashboard/dist/assets/{graph-BGFPrUov.js → graph-Ce86jeZn.js} +1 -1
  30. package/dashboard/dist/assets/index-DRng26Jg.js +567 -0
  31. package/dashboard/dist/assets/index-DzHQIE2n.css +1 -0
  32. package/dashboard/dist/assets/{infoDiagram-LFFYTUFH-C_AYIIRq.js → infoDiagram-LFFYTUFH-Cx35U-h8.js} +1 -1
  33. package/dashboard/dist/assets/{ishikawaDiagram-PHBUUO56-BF1Td7it.js → ishikawaDiagram-PHBUUO56-C04Y2nj8.js} +1 -1
  34. package/dashboard/dist/assets/{journeyDiagram-4ABVD52K-EMMIV9Ho.js → journeyDiagram-4ABVD52K-D8-cxbxE.js} +1 -1
  35. package/dashboard/dist/assets/{kanban-definition-K7BYSVSG-Bf_bRjc1.js → kanban-definition-K7BYSVSG-DVKqMylP.js} +1 -1
  36. package/dashboard/dist/assets/{layout-DVtc1c49.js → layout-98xZDpgu.js} +1 -1
  37. package/dashboard/dist/assets/{linear-B-_q9tMu.js → linear-0jk_IwAc.js} +1 -1
  38. package/dashboard/dist/assets/{mermaid.core-DsNAtlU2.js → mermaid.core-C337VWfr.js} +4 -4
  39. package/dashboard/dist/assets/{mindmap-definition-YRQLILUH-CIk_H2CD.js → mindmap-definition-YRQLILUH-8sNYGYEP.js} +1 -1
  40. package/dashboard/dist/assets/{pieDiagram-SKSYHLDU-CuqaiuOZ.js → pieDiagram-SKSYHLDU-afcmzHxf.js} +1 -1
  41. package/dashboard/dist/assets/{quadrantDiagram-337W2JSQ-By2Uoys0.js → quadrantDiagram-337W2JSQ-B4RjcpOq.js} +1 -1
  42. package/dashboard/dist/assets/{requirementDiagram-Z7DCOOCP-RQe6sA24.js → requirementDiagram-Z7DCOOCP-CRavU6cI.js} +1 -1
  43. package/dashboard/dist/assets/{sankeyDiagram-WA2Y5GQK-BWqm0u7o.js → sankeyDiagram-WA2Y5GQK-DFomU3z-.js} +1 -1
  44. package/dashboard/dist/assets/{sequenceDiagram-2WXFIKYE-DZ4Esix3.js → sequenceDiagram-2WXFIKYE-CGKO7nmK.js} +1 -1
  45. package/dashboard/dist/assets/{stateDiagram-RAJIS63D-Xae5htdZ.js → stateDiagram-RAJIS63D-BjFI1K8h.js} +1 -1
  46. package/dashboard/dist/assets/stateDiagram-v2-FVOUBMTO-BtxefYKD.js +1 -0
  47. package/dashboard/dist/assets/{timeline-definition-YZTLITO2-DxW_e6Qq.js → timeline-definition-YZTLITO2-BBo8XJFG.js} +1 -1
  48. package/dashboard/dist/assets/{treemap-KZPCXAKY-BTD-CY69.js → treemap-KZPCXAKY-COd6i6TE.js} +1 -1
  49. package/dashboard/dist/assets/{vennDiagram-LZ73GAT5-BhpyjM1r.js → vennDiagram-LZ73GAT5-CGQweQ36.js} +1 -1
  50. package/dashboard/dist/assets/{xychartDiagram-JWTSCODW-BmQJbBCA.js → xychartDiagram-JWTSCODW-mfJ5So7N.js} +1 -1
  51. package/dashboard/dist/index.html +2 -2
  52. package/dist/dashboard/server.js +237 -94
  53. package/dist/dashboard/server.js.map +1 -1
  54. package/dist/index.js +258 -107
  55. package/dist/index.js.map +1 -1
  56. package/dist/launch/index.d.ts +2 -1
  57. package/dist/launch/index.js +159 -95
  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-Dcp4Ds-Z.js +0 -1
  65. package/dashboard/dist/assets/classDiagram-VBA2DB6C-CnkOuwPH.js +0 -1
  66. package/dashboard/dist/assets/classDiagram-v2-RAHNMMFH-CnkOuwPH.js +0 -1
  67. package/dashboard/dist/assets/clone-cpjQdgQb.js +0 -1
  68. package/dashboard/dist/assets/index-C4lUbUTt.js +0 -566
  69. package/dashboard/dist/assets/index-D1f1wB-7.css +0 -1
  70. package/dashboard/dist/assets/stateDiagram-v2-FVOUBMTO-BfD_wvla.js +0 -1
@@ -38,7 +38,7 @@ interface ParsedOpenUrl {
38
38
  * Optional one-shot launch-prompt override (the `prompt=` query param) — the
39
39
  * dashboard's editable prompt box sends the (possibly edited) template here.
40
40
  * Only set for `kind === 'assignment'` (sessions take their first message
41
- * from history). Single-line and length-bounded (`MAX_OPEN_PROMPT_LENGTH`).
41
+ * from history). Length-bounded (`MAX_OPEN_PROMPT_LENGTH`).
42
42
  * Presence-significant: an empty string is a deliberate override (re-resolves
43
43
  * to the fallback seed), distinct from `undefined` (no override).
44
44
  */
@@ -174,6 +174,7 @@ interface RawFactDeclaration {
174
174
  type: string;
175
175
  binds: string | null;
176
176
  }
177
+
177
178
  interface StatusConfig {
178
179
  statuses: StatusDefinition[];
179
180
  order: string[];
@@ -1028,7 +1028,11 @@ var init_fields = __esm({
1028
1028
  tags: { kind: "list" },
1029
1029
  archived: { kind: "bool" },
1030
1030
  title: { kind: "substring" },
1031
- search: { kind: "substring", get: (i) => i["title"] },
1031
+ // `search` reads a dedicated `searchText` haystack when the item provides one
1032
+ // (so the dashboard can match title + slug + project like its filter box),
1033
+ // falling back to `title` when absent. Backward-compatible: title-only when no
1034
+ // searchText. The `title` field stays title-only.
1035
+ search: { kind: "substring", get: (i) => i["searchText"] ?? i["title"] },
1032
1036
  created: { kind: "timestamp" },
1033
1037
  updated: { kind: "timestamp" },
1034
1038
  completedat: { kind: "timestamp", get: (i) => i["completedAt"] },
@@ -1663,17 +1667,7 @@ var init_query = __esm({
1663
1667
  }
1664
1668
  });
1665
1669
 
1666
- // src/lifecycle/derive.ts
1667
- var derive_exports = {};
1668
- __export(derive_exports, {
1669
- DERIVE_FIELDS: () => DERIVE_FIELDS,
1670
- acceptFactDeclarations: () => acceptFactDeclarations,
1671
- buildDeriveRegistry: () => buildDeriveRegistry,
1672
- buildQueryRegistry: () => buildQueryRegistry,
1673
- deriveDimensions: () => deriveDimensions,
1674
- factFieldNames: () => factFieldNames,
1675
- validateDeriveCondition: () => validateDeriveCondition
1676
- });
1670
+ // src/utils/fact-registry.ts
1677
1671
  function factFieldNames(decl) {
1678
1672
  const name = decl.name;
1679
1673
  const exportNames = {
@@ -1740,85 +1734,63 @@ function buildQueryRegistry(accepted) {
1740
1734
  for (const decl of accepted) addFactFields(registry, decl);
1741
1735
  return registry;
1742
1736
  }
1743
- function validateDeriveCondition(when, registry = DERIVE_FIELDS) {
1744
- if (when === "*") return null;
1745
- const parsed = parseQuery(when);
1746
- if (!parsed.ast) return parsed.errors[0]?.message ?? "unparseable condition";
1747
- try {
1748
- compileNode(parsed.ast, registry);
1749
- return null;
1750
- } catch (err) {
1751
- if (err instanceof CompileError) return err.errors[0]?.message ?? "invalid condition";
1752
- throw err;
1753
- }
1754
- }
1755
- function compiledWhen(registry, when) {
1756
- let cache = conditionCache.get(registry);
1757
- if (!cache) {
1758
- cache = /* @__PURE__ */ new Map();
1759
- conditionCache.set(registry, cache);
1760
- }
1761
- let pred = cache.get(when);
1762
- if (!pred) {
1763
- if (when === "*") {
1764
- pred = () => true;
1737
+ function queryFieldNames(declarations) {
1738
+ const builtins = [
1739
+ "status",
1740
+ "priority",
1741
+ "type",
1742
+ "assignee",
1743
+ "project",
1744
+ "tag",
1745
+ "tags",
1746
+ "archived",
1747
+ "title",
1748
+ "search",
1749
+ "created",
1750
+ "updated",
1751
+ "completedAt",
1752
+ "statusAge",
1753
+ "phase",
1754
+ "disposition",
1755
+ "phaseAge",
1756
+ "hasRealObjective",
1757
+ "acRealTotal",
1758
+ "acRealChecked",
1759
+ "acAllChecked",
1760
+ "planExists",
1761
+ "planApproved",
1762
+ "workspaceSet",
1763
+ "implementationStarted",
1764
+ "depsSatisfied",
1765
+ "unresolvedQuestions",
1766
+ "progressStaleDays",
1767
+ "blocked",
1768
+ "parked",
1769
+ "reviewRequested",
1770
+ "pinned"
1771
+ ];
1772
+ const custom = [];
1773
+ for (const decl of declarations) {
1774
+ const names = factFieldNames(decl);
1775
+ if (decl.type === "attestation") {
1776
+ custom.push(
1777
+ names.exports.fact,
1778
+ names.exports.approved,
1779
+ names.exports.changesRequested,
1780
+ names.exports.by,
1781
+ names.exports.approvedBy
1782
+ );
1765
1783
  } else {
1766
- const parsed = parseQuery(when);
1767
- if (!parsed.ast) {
1768
- throw new CompileError(parsed.errors);
1769
- }
1770
- pred = compileNode(parsed.ast, registry);
1771
- }
1772
- cache.set(when, pred);
1773
- }
1774
- return pred;
1775
- }
1776
- function deriveDimensions(input) {
1777
- const { facts, derive, currentStatus, terminalStatuses, knownStatusIds, override } = input;
1778
- const registry = input.registry ?? DERIVE_FIELDS;
1779
- if (terminalStatuses.has(currentStatus)) return null;
1780
- const ctx = { now: 0 };
1781
- const item = facts;
1782
- let phase = derive.phaseLadder[0]?.phase ?? currentStatus;
1783
- let nextAction = derive.phaseLadder[0]?.next ?? null;
1784
- for (let i = derive.phaseLadder.length - 1; i >= 0; i--) {
1785
- const rung = derive.phaseLadder[i];
1786
- if (compiledWhen(registry, rung.when)(item, ctx)) {
1787
- phase = rung.phase;
1788
- nextAction = rung.next ?? null;
1789
- break;
1784
+ custom.push(names.exports.fact);
1790
1785
  }
1791
1786
  }
1792
- let disposition = "active";
1793
- for (const rule of derive.disposition) {
1794
- if (rule.when === null || compiledWhen(registry, rule.when)(item, ctx)) {
1795
- disposition = rule.is;
1796
- break;
1797
- }
1798
- }
1799
- let derivedStatus;
1800
- switch (disposition) {
1801
- case "parked":
1802
- derivedStatus = knownStatusIds.has(derive.headline.parked) ? derive.headline.parked : phase;
1803
- break;
1804
- case "blocked":
1805
- derivedStatus = knownStatusIds.has(derive.headline.blocked) ? derive.headline.blocked : phase;
1806
- break;
1807
- default:
1808
- derivedStatus = phase;
1809
- }
1810
- let status = derivedStatus;
1811
- if (override && override.status && !terminalStatuses.has(override.status) && knownStatusIds.has(override.status)) {
1812
- status = override.status;
1813
- }
1814
- return { phase, disposition, derivedStatus, status, nextAction };
1787
+ return [...builtins, ...custom];
1815
1788
  }
1816
- var DERIVE_FIELDS, conditionCache;
1817
- var init_derive = __esm({
1818
- "src/lifecycle/derive.ts"() {
1789
+ var DERIVE_FIELDS;
1790
+ var init_fact_registry = __esm({
1791
+ "src/utils/fact-registry.ts"() {
1819
1792
  "use strict";
1820
1793
  init_query();
1821
- init_query();
1822
1794
  DERIVE_FIELDS = {
1823
1795
  hasrealobjective: { kind: "bool", get: (i) => i["hasRealObjective"] },
1824
1796
  acrealtotal: { kind: "number", get: (i) => i["acRealTotal"] },
@@ -1835,7 +1807,6 @@ var init_derive = __esm({
1835
1807
  reviewrequested: { kind: "bool", get: (i) => i["reviewRequested"] },
1836
1808
  pinned: { kind: "bool" }
1837
1809
  };
1838
- conditionCache = /* @__PURE__ */ new WeakMap();
1839
1810
  }
1840
1811
  });
1841
1812
 
@@ -3478,7 +3449,7 @@ var init_config2 = __esm({
3478
3449
  init_hotkeysCatalog();
3479
3450
  init_agents_schema();
3480
3451
  init_slug();
3481
- init_derive();
3452
+ init_fact_registry();
3482
3453
  init_query();
3483
3454
  init_terminal_schema();
3484
3455
  init_workspace_visibility_schema();
@@ -3656,6 +3627,103 @@ var init_assignment_resolver = __esm({
3656
3627
  }
3657
3628
  });
3658
3629
 
3630
+ // src/lifecycle/derive.ts
3631
+ var derive_exports = {};
3632
+ __export(derive_exports, {
3633
+ DERIVE_FIELDS: () => DERIVE_FIELDS,
3634
+ acceptFactDeclarations: () => acceptFactDeclarations,
3635
+ addFactFields: () => addFactFields,
3636
+ buildDeriveRegistry: () => buildDeriveRegistry,
3637
+ buildQueryRegistry: () => buildQueryRegistry,
3638
+ deriveDimensions: () => deriveDimensions,
3639
+ factFieldNames: () => factFieldNames,
3640
+ queryFieldNames: () => queryFieldNames,
3641
+ validateDeriveCondition: () => validateDeriveCondition
3642
+ });
3643
+ function validateDeriveCondition(when, registry = DERIVE_FIELDS) {
3644
+ if (when === "*") return null;
3645
+ const parsed = parseQuery(when);
3646
+ if (!parsed.ast) return parsed.errors[0]?.message ?? "unparseable condition";
3647
+ try {
3648
+ compileNode(parsed.ast, registry);
3649
+ return null;
3650
+ } catch (err) {
3651
+ if (err instanceof CompileError) return err.errors[0]?.message ?? "invalid condition";
3652
+ throw err;
3653
+ }
3654
+ }
3655
+ function compiledWhen(registry, when) {
3656
+ let cache = conditionCache.get(registry);
3657
+ if (!cache) {
3658
+ cache = /* @__PURE__ */ new Map();
3659
+ conditionCache.set(registry, cache);
3660
+ }
3661
+ let pred = cache.get(when);
3662
+ if (!pred) {
3663
+ if (when === "*") {
3664
+ pred = () => true;
3665
+ } else {
3666
+ const parsed = parseQuery(when);
3667
+ if (!parsed.ast) {
3668
+ throw new CompileError(parsed.errors);
3669
+ }
3670
+ pred = compileNode(parsed.ast, registry);
3671
+ }
3672
+ cache.set(when, pred);
3673
+ }
3674
+ return pred;
3675
+ }
3676
+ function deriveDimensions(input) {
3677
+ const { facts, derive, currentStatus, terminalStatuses, knownStatusIds, override } = input;
3678
+ const registry = input.registry ?? DERIVE_FIELDS;
3679
+ if (terminalStatuses.has(currentStatus)) return null;
3680
+ const ctx = { now: 0 };
3681
+ const item = facts;
3682
+ let phase = derive.phaseLadder[0]?.phase ?? currentStatus;
3683
+ let nextAction = derive.phaseLadder[0]?.next ?? null;
3684
+ for (let i = derive.phaseLadder.length - 1; i >= 0; i--) {
3685
+ const rung = derive.phaseLadder[i];
3686
+ if (compiledWhen(registry, rung.when)(item, ctx)) {
3687
+ phase = rung.phase;
3688
+ nextAction = rung.next ?? null;
3689
+ break;
3690
+ }
3691
+ }
3692
+ let disposition = "active";
3693
+ for (const rule of derive.disposition) {
3694
+ if (rule.when === null || compiledWhen(registry, rule.when)(item, ctx)) {
3695
+ disposition = rule.is;
3696
+ break;
3697
+ }
3698
+ }
3699
+ let derivedStatus;
3700
+ switch (disposition) {
3701
+ case "parked":
3702
+ derivedStatus = knownStatusIds.has(derive.headline.parked) ? derive.headline.parked : phase;
3703
+ break;
3704
+ case "blocked":
3705
+ derivedStatus = knownStatusIds.has(derive.headline.blocked) ? derive.headline.blocked : phase;
3706
+ break;
3707
+ default:
3708
+ derivedStatus = phase;
3709
+ }
3710
+ let status = derivedStatus;
3711
+ if (override && override.status && !terminalStatuses.has(override.status) && knownStatusIds.has(override.status)) {
3712
+ status = override.status;
3713
+ }
3714
+ return { phase, disposition, derivedStatus, status, nextAction };
3715
+ }
3716
+ var conditionCache;
3717
+ var init_derive = __esm({
3718
+ "src/lifecycle/derive.ts"() {
3719
+ "use strict";
3720
+ init_query();
3721
+ init_fact_registry();
3722
+ init_fact_registry();
3723
+ conditionCache = /* @__PURE__ */ new WeakMap();
3724
+ }
3725
+ });
3726
+
3659
3727
  // src/utils/playbooks.ts
3660
3728
  import { resolve as resolve8 } from "path";
3661
3729
  import { readdir as readdir4, readFile as readFile7, unlink } from "fs/promises";
@@ -4315,7 +4383,8 @@ async function getStatusConfig() {
4315
4383
  derive: config.statuses.derive ?? null,
4316
4384
  facts: config.statuses.facts ?? null,
4317
4385
  factDeclarations: accepted,
4318
- deriveRegistry: buildDeriveRegistry(accepted)
4386
+ deriveRegistry: buildDeriveRegistry(accepted),
4387
+ queryRegistry: buildQueryRegistry(accepted)
4319
4388
  };
4320
4389
  } else {
4321
4390
  const def = buildDefaultStatusConfig();
@@ -4329,7 +4398,8 @@ async function getStatusConfig() {
4329
4398
  derive: null,
4330
4399
  facts: null,
4331
4400
  factDeclarations: [],
4332
- deriveRegistry: buildDeriveRegistry([])
4401
+ deriveRegistry: buildDeriveRegistry([]),
4402
+ queryRegistry: buildQueryRegistry([])
4333
4403
  };
4334
4404
  }
4335
4405
  return _cachedConfig;
@@ -5285,12 +5355,6 @@ function parseOpenUrl(input) {
5285
5355
  let prompt;
5286
5356
  if (promptVals.length === 1) {
5287
5357
  const value = promptVals[0];
5288
- if (/[\r\n]/.test(value)) {
5289
- throw new OpenUrlError(
5290
- "invalid-prompt",
5291
- "`prompt` query param must be a single line (no newlines)"
5292
- );
5293
- }
5294
5358
  if (value.length > MAX_OPEN_PROMPT_LENGTH) {
5295
5359
  throw new OpenUrlError(
5296
5360
  "invalid-prompt",