palmier 0.8.0 → 0.8.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 (132) hide show
  1. package/CLAUDE.md +13 -0
  2. package/README.md +11 -11
  3. package/dist/agents/agent.d.ts +0 -4
  4. package/dist/agents/claude.js +1 -1
  5. package/dist/agents/codex.js +2 -2
  6. package/dist/agents/cursor.js +1 -1
  7. package/dist/agents/deepagents.js +1 -1
  8. package/dist/agents/gemini.js +3 -2
  9. package/dist/agents/goose.js +1 -1
  10. package/dist/agents/hermes.js +1 -1
  11. package/dist/agents/kiro.js +1 -1
  12. package/dist/agents/opencode.js +1 -1
  13. package/dist/agents/qoder.js +1 -1
  14. package/dist/agents/shared-prompt.d.ts +0 -3
  15. package/dist/agents/shared-prompt.js +0 -3
  16. package/dist/app-registry.d.ts +10 -0
  17. package/dist/app-registry.js +44 -0
  18. package/dist/commands/info.d.ts +0 -3
  19. package/dist/commands/info.js +0 -5
  20. package/dist/commands/init.d.ts +0 -3
  21. package/dist/commands/init.js +2 -11
  22. package/dist/commands/pair.d.ts +1 -4
  23. package/dist/commands/pair.js +1 -12
  24. package/dist/commands/restart.d.ts +0 -3
  25. package/dist/commands/restart.js +0 -3
  26. package/dist/commands/run.d.ts +1 -14
  27. package/dist/commands/run.js +18 -61
  28. package/dist/commands/serve.d.ts +0 -3
  29. package/dist/commands/serve.js +33 -27
  30. package/dist/config.d.ts +0 -8
  31. package/dist/config.js +0 -8
  32. package/dist/device-capabilities.d.ts +1 -1
  33. package/dist/event-queues.d.ts +6 -21
  34. package/dist/event-queues.js +6 -21
  35. package/dist/events.d.ts +0 -6
  36. package/dist/events.js +1 -9
  37. package/dist/index.js +0 -1
  38. package/dist/mcp-handler.js +1 -2
  39. package/dist/mcp-tools.d.ts +0 -3
  40. package/dist/mcp-tools.js +14 -18
  41. package/dist/nats-client.d.ts +0 -3
  42. package/dist/nats-client.js +1 -4
  43. package/dist/pending-requests.d.ts +4 -18
  44. package/dist/pending-requests.js +4 -18
  45. package/dist/platform/index.d.ts +1 -4
  46. package/dist/platform/index.js +1 -4
  47. package/dist/platform/linux.d.ts +3 -9
  48. package/dist/platform/linux.js +9 -20
  49. package/dist/platform/platform.d.ts +1 -4
  50. package/dist/platform/windows.d.ts +2 -5
  51. package/dist/platform/windows.js +19 -39
  52. package/dist/pwa/assets/index-B0F9mtid.css +1 -0
  53. package/dist/pwa/assets/index-SYs3mcdJ.js +120 -0
  54. package/dist/pwa/assets/{web-CF-N8Di6.js → web-C6lkQj9J.js} +1 -1
  55. package/dist/pwa/assets/{web-BpM3fNCn.js → web-Z1623me-.js} +1 -1
  56. package/dist/pwa/index.html +2 -2
  57. package/dist/pwa/service-worker.js +1 -1
  58. package/dist/rpc-handler.d.ts +0 -6
  59. package/dist/rpc-handler.js +19 -48
  60. package/dist/spawn-command.d.ts +10 -25
  61. package/dist/spawn-command.js +7 -15
  62. package/dist/task.d.ts +6 -64
  63. package/dist/task.js +7 -70
  64. package/dist/transports/http-transport.d.ts +0 -4
  65. package/dist/transports/http-transport.js +6 -28
  66. package/dist/transports/nats-transport.d.ts +0 -4
  67. package/dist/transports/nats-transport.js +3 -9
  68. package/dist/types.d.ts +3 -7
  69. package/dist/update-checker.d.ts +1 -4
  70. package/dist/update-checker.js +2 -5
  71. package/package.json +1 -1
  72. package/palmier-server/README.md +1 -1
  73. package/palmier-server/pwa/src/App.css +170 -20
  74. package/palmier-server/pwa/src/App.tsx +15 -1
  75. package/palmier-server/pwa/src/components/HostMenu.tsx +282 -473
  76. package/palmier-server/pwa/src/components/RunDetailView.tsx +3 -3
  77. package/palmier-server/pwa/src/components/SessionsView.tsx +57 -25
  78. package/palmier-server/pwa/src/components/SwipeToDeleteRow.tsx +160 -0
  79. package/palmier-server/pwa/src/components/TaskCard.tsx +12 -4
  80. package/palmier-server/pwa/src/components/TaskForm.tsx +230 -33
  81. package/palmier-server/pwa/src/components/TasksView.tsx +5 -0
  82. package/palmier-server/pwa/src/constants.ts +1 -1
  83. package/palmier-server/pwa/src/native/Device.ts +66 -0
  84. package/palmier-server/pwa/src/pages/Dashboard.tsx +11 -6
  85. package/palmier-server/pwa/src/pages/PairHost.tsx +18 -2
  86. package/palmier-server/pwa/src/types.ts +1 -1
  87. package/palmier-server/server/src/index.ts +7 -7
  88. package/palmier-server/server/src/routes/device.ts +4 -4
  89. package/palmier-server/spec.md +47 -6
  90. package/src/agents/agent.ts +0 -4
  91. package/src/agents/claude.ts +1 -1
  92. package/src/agents/codex.ts +2 -2
  93. package/src/agents/cursor.ts +1 -1
  94. package/src/agents/deepagents.ts +1 -1
  95. package/src/agents/gemini.ts +3 -2
  96. package/src/agents/goose.ts +1 -1
  97. package/src/agents/hermes.ts +1 -1
  98. package/src/agents/kiro.ts +1 -1
  99. package/src/agents/opencode.ts +1 -1
  100. package/src/agents/qoder.ts +1 -1
  101. package/src/agents/shared-prompt.ts +0 -3
  102. package/src/app-registry.ts +52 -0
  103. package/src/commands/info.ts +0 -5
  104. package/src/commands/init.ts +2 -11
  105. package/src/commands/pair.ts +1 -12
  106. package/src/commands/restart.ts +0 -3
  107. package/src/commands/run.ts +18 -65
  108. package/src/commands/serve.ts +31 -27
  109. package/src/config.ts +0 -8
  110. package/src/device-capabilities.ts +4 -3
  111. package/src/event-queues.ts +6 -21
  112. package/src/events.ts +1 -9
  113. package/src/index.ts +0 -1
  114. package/src/mcp-handler.ts +1 -2
  115. package/src/mcp-tools.ts +14 -20
  116. package/src/nats-client.ts +1 -4
  117. package/src/pending-requests.ts +4 -18
  118. package/src/platform/index.ts +1 -4
  119. package/src/platform/linux.ts +9 -20
  120. package/src/platform/platform.ts +1 -4
  121. package/src/platform/windows.ts +19 -40
  122. package/src/rpc-handler.ts +20 -48
  123. package/src/spawn-command.ts +11 -27
  124. package/src/task.ts +7 -70
  125. package/src/transports/http-transport.ts +6 -39
  126. package/src/transports/nats-transport.ts +3 -9
  127. package/src/types.ts +3 -10
  128. package/src/update-checker.ts +2 -5
  129. package/test/task-parsing.test.ts +2 -3
  130. package/test/windows-xml.test.ts +11 -12
  131. package/dist/pwa/assets/index-FP1Mipr6.js +0 -120
  132. package/dist/pwa/assets/index-bLTn8zBj.css +0 -1
@@ -736,6 +736,7 @@ body {
736
736
  display: flex;
737
737
  flex-direction: column;
738
738
  gap: 10px;
739
+ padding-bottom: calc(56px + var(--space-lg) * 2 + env(safe-area-inset-bottom, 0px));
739
740
  }
740
741
 
741
742
  /* ===== Task Card ===== */
@@ -1792,25 +1793,16 @@ body {
1792
1793
  z-index: 101;
1793
1794
  display: flex;
1794
1795
  flex-direction: column;
1796
+ overflow-y: auto;
1797
+ overscroll-behavior: contain;
1795
1798
  animation: drawerSlideIn 0.25s ease;
1796
1799
  }
1797
1800
 
1798
- .drawer-header {
1799
- display: flex;
1800
- align-items: center;
1801
- justify-content: space-between;
1802
- padding: var(--space-md);
1803
- border-bottom: 1px solid var(--color-border);
1804
- }
1805
-
1806
- .drawer-title {
1807
- font-size: 1.125rem;
1808
- font-weight: 800;
1809
- color: var(--color-primary);
1810
- letter-spacing: -0.04em;
1811
- }
1812
-
1813
1801
  .drawer-close-btn {
1802
+ position: absolute;
1803
+ top: 8px;
1804
+ right: 8px;
1805
+ z-index: 1;
1814
1806
  display: flex;
1815
1807
  align-items: center;
1816
1808
  justify-content: center;
@@ -1846,6 +1838,18 @@ body {
1846
1838
  margin-bottom: var(--space-sm);
1847
1839
  }
1848
1840
 
1841
+ .drawer-toggle-group {
1842
+ display: flex;
1843
+ flex-direction: column;
1844
+ gap: var(--space-sm);
1845
+ }
1846
+
1847
+ .drawer-toggle-group-divided {
1848
+ border-top: 1px solid var(--color-border);
1849
+ padding-top: var(--space-sm);
1850
+ margin-top: var(--space-xs);
1851
+ }
1852
+
1849
1853
  .drawer-toggle {
1850
1854
  display: flex;
1851
1855
  align-items: center;
@@ -1960,17 +1964,42 @@ body {
1960
1964
 
1961
1965
  /* ===== Tab bar ===== */
1962
1966
 
1963
- .tab-bar {
1964
- display: flex;
1965
- align-items: center;
1966
- background: color-mix(in srgb, var(--color-surface) 92%, transparent);
1967
- border-bottom: 1px solid var(--color-border);
1967
+ .app-header {
1968
1968
  position: sticky;
1969
1969
  top: 0;
1970
1970
  z-index: 10;
1971
+ background: color-mix(in srgb, var(--color-surface) 92%, transparent);
1972
+ border-bottom: 1px solid var(--color-border);
1971
1973
  backdrop-filter: blur(8px);
1972
1974
  }
1973
1975
 
1976
+ .app-title-bar {
1977
+ position: relative;
1978
+ display: flex;
1979
+ align-items: center;
1980
+ justify-content: center;
1981
+ padding: 8px 0;
1982
+ }
1983
+
1984
+ .app-title-bar .hamburger-btn {
1985
+ position: absolute;
1986
+ left: 4px;
1987
+ top: 50%;
1988
+ transform: translateY(-50%);
1989
+ }
1990
+
1991
+ .app-title {
1992
+ margin: 0;
1993
+ font-size: 1rem;
1994
+ font-weight: 600;
1995
+ color: var(--color-text);
1996
+ }
1997
+
1998
+ .tab-bar {
1999
+ display: flex;
2000
+ align-items: center;
2001
+ }
2002
+
1974
2003
  .tab-btn {
1975
2004
  flex: 1;
1976
2005
  display: flex;
@@ -2612,6 +2641,7 @@ body {
2612
2641
  display: flex;
2613
2642
  flex-direction: column;
2614
2643
  overflow-y: auto;
2644
+ overscroll-behavior: contain;
2615
2645
  animation: none;
2616
2646
  }
2617
2647
 
@@ -2624,4 +2654,124 @@ body {
2624
2654
  .dashboard-main {
2625
2655
  padding: var(--space-lg);
2626
2656
  }
2657
+
2658
+ .fab {
2659
+ right: max(var(--space-lg), calc((100vw - 1080px) / 2));
2660
+ }
2661
+ }
2662
+
2663
+ /* ===== Swipe-to-delete row ===== */
2664
+
2665
+ .swipe-row {
2666
+ position: relative;
2667
+ overflow: hidden;
2668
+ touch-action: pan-y; /* let vertical scroll through; capture horizontal ourselves */
2669
+ }
2670
+
2671
+ .swipe-row-action {
2672
+ position: absolute;
2673
+ top: 0;
2674
+ right: 0;
2675
+ bottom: 0;
2676
+ display: flex;
2677
+ align-items: center;
2678
+ justify-content: center;
2679
+ background: var(--color-error, #dc2626);
2680
+ color: #fff;
2681
+ border: none;
2682
+ font-size: 0.9375rem;
2683
+ font-weight: 600;
2684
+ cursor: pointer;
2685
+ padding: 0;
2686
+ }
2687
+
2688
+ .swipe-row-action:focus-visible {
2689
+ outline: 2px solid var(--color-accent, #2E5CE5);
2690
+ outline-offset: -4px;
2691
+ }
2692
+
2693
+ .swipe-row-content {
2694
+ position: relative;
2695
+ background: var(--color-surface);
2696
+ transition: transform 0.2s cubic-bezier(0.22, 1, 0.36, 1);
2697
+ will-change: transform;
2698
+ }
2699
+
2700
+ /* During an active drag, skip the transition so the row tracks the finger 1:1.
2701
+ On release the class is removed and the snap animates. */
2702
+ .swipe-row-content-dragging {
2703
+ transition: none;
2704
+ }
2705
+
2706
+ .app-filter-help {
2707
+ margin-top: var(--space-xs);
2708
+ }
2709
+
2710
+ .app-combobox {
2711
+ position: relative;
2712
+ }
2713
+
2714
+ .app-combobox-list {
2715
+ position: absolute;
2716
+ top: calc(100% + 2px);
2717
+ left: 0;
2718
+ right: 0;
2719
+ max-height: 280px;
2720
+ overflow-y: auto;
2721
+ overscroll-behavior: contain;
2722
+ background: var(--color-surface);
2723
+ border: 1px solid var(--color-border);
2724
+ border-radius: var(--radius-md);
2725
+ box-shadow: var(--shadow-md);
2726
+ list-style: none;
2727
+ margin: 0;
2728
+ padding: var(--space-xs) 0;
2729
+ z-index: 20;
2730
+ }
2731
+
2732
+ .app-combobox-row {
2733
+ display: flex;
2734
+ align-items: center;
2735
+ gap: var(--space-md);
2736
+ padding: 8px var(--space-md);
2737
+ cursor: pointer;
2738
+ user-select: none;
2739
+ }
2740
+
2741
+ .app-combobox-row:hover {
2742
+ background: var(--color-hover, rgba(0, 0, 0, 0.04));
2743
+ }
2744
+
2745
+ .app-combobox-icon {
2746
+ width: 28px;
2747
+ height: 28px;
2748
+ border-radius: 6px;
2749
+ flex-shrink: 0;
2750
+ }
2751
+
2752
+ .app-combobox-icon-placeholder {
2753
+ background: var(--color-border);
2754
+ }
2755
+
2756
+ .app-combobox-labels {
2757
+ display: flex;
2758
+ flex-direction: column;
2759
+ min-width: 0;
2760
+ flex: 1;
2761
+ }
2762
+
2763
+ .app-combobox-name {
2764
+ font-size: 0.9375rem;
2765
+ font-weight: 500;
2766
+ white-space: nowrap;
2767
+ overflow: hidden;
2768
+ text-overflow: ellipsis;
2769
+ }
2770
+
2771
+ .app-combobox-pkg {
2772
+ font-size: 0.75rem;
2773
+ color: var(--color-muted);
2774
+ white-space: nowrap;
2775
+ overflow: hidden;
2776
+ text-overflow: ellipsis;
2627
2777
  }
@@ -1,13 +1,27 @@
1
- import { Routes, Route } from "react-router-dom";
1
+ import { useEffect } from "react";
2
+ import { Routes, Route, useNavigate } from "react-router-dom";
2
3
  import { HostStoreProvider } from "./contexts/HostStoreContext";
3
4
  import { HostConnectionProvider } from "./contexts/HostConnectionContext";
5
+ import { Device } from "./native/Device";
4
6
  import Dashboard from "./pages/Dashboard";
5
7
  import PairHost from "./pages/PairHost";
6
8
 
9
+ /** Routes FCM notification taps (fired by DevicePlugin) into the client-side router. */
10
+ function DeepLinkRouter() {
11
+ const navigate = useNavigate();
12
+ useEffect(() => {
13
+ if (!Device) return;
14
+ const handle = Device.addListener("deepLink", ({ path }) => navigate(path));
15
+ return () => { handle.then((h) => h.remove()); };
16
+ }, [navigate]);
17
+ return null;
18
+ }
19
+
7
20
  export default function App() {
8
21
  return (
9
22
  <HostStoreProvider>
10
23
  <HostConnectionProvider>
24
+ <DeepLinkRouter />
11
25
  <Routes>
12
26
  <Route path="/" element={<Dashboard />} />
13
27
  <Route path="/tasks" element={<Dashboard />} />