@rubytech/create-sitedesk-code 0.1.525 → 0.1.527

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 (205) hide show
  1. package/dist/__tests__/samba-provision.test.js +46 -1
  2. package/dist/__tests__/websockify-bind-wiring.test.js +47 -0
  3. package/dist/index.js +39 -1
  4. package/dist/samba-provision.js +37 -0
  5. package/package.json +1 -1
  6. package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +80 -13
  7. package/payload/platform/plugins/admin/skills/whats-new/SKILL.md +13 -0
  8. package/payload/platform/plugins/docs/references/admin-ui.md +70 -4
  9. package/payload/platform/plugins/docs/references/internals.md +1 -1
  10. package/payload/platform/plugins/docs/references/platform.md +1 -1
  11. package/payload/platform/plugins/linkedin-extension/extension/README.md +10 -2
  12. package/payload/platform/plugins/linkedin-extension/extension/background/sw.js +37 -4
  13. package/payload/platform/plugins/linkedin-extension/extension/content/profile.js +17 -2
  14. package/payload/platform/plugins/linkedin-extension/extension/content/thread.js +17 -2
  15. package/payload/platform/plugins/linkedin-extension/extension/manifest.json +1 -0
  16. package/payload/platform/plugins/linkedin-extension/extension/options/options.html +1 -0
  17. package/payload/platform/plugins/linkedin-extension/extension/options/options.js +78 -3
  18. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/routine-roster-audit.test.js +63 -1
  19. package/payload/platform/plugins/scheduling/mcp/dist/scripts/__tests__/routine-roster-audit.test.js.map +1 -1
  20. package/payload/platform/plugins/scheduling/mcp/dist/scripts/agent-turn-dispatch.d.ts +35 -0
  21. package/payload/platform/plugins/scheduling/mcp/dist/scripts/agent-turn-dispatch.d.ts.map +1 -1
  22. package/payload/platform/plugins/scheduling/mcp/dist/scripts/agent-turn-dispatch.js +78 -0
  23. package/payload/platform/plugins/scheduling/mcp/dist/scripts/agent-turn-dispatch.js.map +1 -1
  24. package/payload/platform/plugins/scheduling/mcp/dist/scripts/check-due-events.js +13 -1
  25. package/payload/platform/plugins/scheduling/mcp/dist/scripts/check-due-events.js.map +1 -1
  26. package/payload/platform/scripts/vnc.sh +45 -1
  27. package/payload/server/{chunk-VUXKXOJU.js → chunk-7MGR5M6G.js} +4 -2
  28. package/payload/server/{chunk-WT2PFGY4.js → chunk-KY3BBT67.js} +216 -1
  29. package/payload/server/{manager-4TJK3YOY.js → manager-6XOWHREK.js} +1 -1
  30. package/payload/server/maxy-edge.js +226 -6
  31. package/payload/server/public/activity.html +5 -5
  32. package/payload/server/public/agents.html +4 -4
  33. package/payload/server/public/assets/{AdminLoginScreens-BgDjueVe.js → AdminLoginScreens-DSt9DYZZ.js} +1 -1
  34. package/payload/server/public/assets/AdminLoginScreens-DSt9DYZZ.js.br +0 -0
  35. package/payload/server/public/assets/AdminLoginScreens-DSt9DYZZ.js.gz +0 -0
  36. package/payload/server/public/assets/{AdminShell-YctTrR-D.js → AdminShell-MM3_yp3N.js} +1 -1
  37. package/payload/server/public/assets/AdminShell-MM3_yp3N.js.br +0 -0
  38. package/payload/server/public/assets/AdminShell-MM3_yp3N.js.gz +0 -0
  39. package/payload/server/public/assets/{activity-DGQt5ys_.js → activity-aVvbaVd4.js} +1 -1
  40. package/payload/server/public/assets/activity-aVvbaVd4.js.br +0 -0
  41. package/payload/server/public/assets/activity-aVvbaVd4.js.gz +0 -0
  42. package/payload/server/public/assets/{admin-DnUxbB3P.js → admin-B0lQnkH-.js} +1 -1
  43. package/payload/server/public/assets/admin-B0lQnkH-.js.br +0 -0
  44. package/payload/server/public/assets/admin-B0lQnkH-.js.gz +0 -0
  45. package/payload/server/public/assets/{agents-Bc2LZjwC.js → agents-CrpVTPRG.js} +1 -1
  46. package/payload/server/public/assets/agents-CrpVTPRG.js.br +0 -0
  47. package/payload/server/public/assets/agents-CrpVTPRG.js.gz +0 -0
  48. package/payload/server/public/assets/browser-CYHUzTop.js +1 -0
  49. package/payload/server/public/assets/browser-CYHUzTop.js.br +0 -0
  50. package/payload/server/public/assets/browser-CYHUzTop.js.gz +0 -0
  51. package/payload/server/public/assets/{calendar-D25EhXbD.js → calendar-4IWQpwYv.js} +1 -1
  52. package/payload/server/public/assets/calendar-4IWQpwYv.js.br +0 -0
  53. package/payload/server/public/assets/calendar-4IWQpwYv.js.gz +0 -0
  54. package/payload/server/public/assets/chat-DmjZTqnV.js +1 -0
  55. package/payload/server/public/assets/chat-DmjZTqnV.js.br +0 -0
  56. package/payload/server/public/assets/chat-DmjZTqnV.js.gz +0 -0
  57. package/payload/server/public/assets/chevron-left-CIl-s3LZ.js +1 -0
  58. package/payload/server/public/assets/chevron-left-CIl-s3LZ.js.br +0 -0
  59. package/payload/server/public/assets/chevron-right-DpAi2BsF.js +1 -0
  60. package/payload/server/public/assets/chevron-right-DpAi2BsF.js.br +0 -0
  61. package/payload/server/public/assets/clock-CGuM9VRx.js +1 -0
  62. package/payload/server/public/assets/clock-CGuM9VRx.js.br +0 -0
  63. package/payload/server/public/assets/data-BpdFiZKH.js +1 -0
  64. package/payload/server/public/assets/data-BpdFiZKH.js.br +2 -0
  65. package/payload/server/public/assets/data-BpdFiZKH.js.gz +0 -0
  66. package/payload/server/public/assets/{file-download-CiGklOfA.js → file-download-DayBHhKS.js} +1 -1
  67. package/payload/server/public/assets/file-download-DayBHhKS.js.br +0 -0
  68. package/payload/server/public/assets/file-download-DayBHhKS.js.gz +0 -0
  69. package/payload/server/public/assets/{file-text-XjJPULAZ.js → file-text-BSyhVH0m.js} +1 -1
  70. package/payload/server/public/assets/file-text-BSyhVH0m.js.br +0 -0
  71. package/payload/server/public/assets/file-text-BSyhVH0m.js.gz +0 -0
  72. package/payload/server/public/assets/{graph-BjHJ0z_6.js → graph-Bjv3Tc3B.js} +1 -1
  73. package/payload/server/public/assets/graph-Bjv3Tc3B.js.br +0 -0
  74. package/payload/server/public/assets/graph-Bjv3Tc3B.js.gz +0 -0
  75. package/payload/server/public/assets/{graph-labels-D-0u37KA.js → graph-labels-DegLKGdx.js} +1 -1
  76. package/payload/server/public/assets/graph-labels-DegLKGdx.js.br +0 -0
  77. package/payload/server/public/assets/graph-labels-DegLKGdx.js.gz +0 -0
  78. package/payload/server/public/assets/{maximize-2-BJ9S-nfS.js → maximize-2-DJFG2EXJ.js} +1 -1
  79. package/payload/server/public/assets/maximize-2-DJFG2EXJ.js.br +0 -0
  80. package/payload/server/public/assets/maximize-2-DJFG2EXJ.js.gz +0 -0
  81. package/payload/server/public/assets/{operator-Cay4rOOK.js → operator-Du9Ve_PR.js} +1 -1
  82. package/payload/server/public/assets/operator-Du9Ve_PR.js.br +0 -0
  83. package/payload/server/public/assets/operator-Du9Ve_PR.js.gz +0 -0
  84. package/payload/server/public/assets/{page-shuh4ES9.js → page-DgHYxG3M.js} +1 -1
  85. package/payload/server/public/assets/page-DgHYxG3M.js.br +0 -0
  86. package/payload/server/public/assets/page-DgHYxG3M.js.gz +0 -0
  87. package/payload/server/public/assets/{page-Cci_j_y7.js → page-qV1ypb6i.js} +5 -5
  88. package/payload/server/public/assets/page-qV1ypb6i.js.br +0 -0
  89. package/payload/server/public/assets/page-qV1ypb6i.js.gz +0 -0
  90. package/payload/server/public/assets/{public-BbJcQGsO.js → public-CNVEM-Bx.js} +1 -1
  91. package/payload/server/public/assets/public-CNVEM-Bx.js.br +0 -0
  92. package/payload/server/public/assets/public-CNVEM-Bx.js.gz +0 -0
  93. package/payload/server/public/assets/{rotate-ccw-jeSVwUAv.js → rotate-ccw-DQCaky8_.js} +1 -1
  94. package/payload/server/public/assets/rotate-ccw-DQCaky8_.js.br +0 -0
  95. package/payload/server/public/assets/rotate-ccw-DQCaky8_.js.gz +0 -0
  96. package/payload/server/public/assets/{routines-D3M1Wh3a.js → routines-DwK5FeLm.js} +1 -1
  97. package/payload/server/public/assets/routines-DwK5FeLm.js.br +0 -0
  98. package/payload/server/public/assets/routines-DwK5FeLm.js.gz +0 -0
  99. package/payload/server/public/assets/{skills-Bhej2ub1.js → skills-CosN3uA4.js} +1 -1
  100. package/payload/server/public/assets/skills-CosN3uA4.js.br +0 -0
  101. package/payload/server/public/assets/skills-CosN3uA4.js.gz +0 -0
  102. package/payload/server/public/assets/tasks-f0QikHmw.js +3 -0
  103. package/payload/server/public/assets/tasks-f0QikHmw.js.br +0 -0
  104. package/payload/server/public/assets/tasks-f0QikHmw.js.gz +0 -0
  105. package/payload/server/public/assets/{time-entry-format-r5UY9rjG.js → time-entry-format-DLTdS35_.js} +1 -1
  106. package/payload/server/public/assets/time-entry-format-DLTdS35_.js.br +0 -0
  107. package/payload/server/public/assets/time-entry-format-DLTdS35_.js.gz +0 -0
  108. package/payload/server/public/assets/{triangle-alert--PCKaewD.js → triangle-alert-CpwrbdYq.js} +1 -1
  109. package/payload/server/public/assets/triangle-alert-CpwrbdYq.js.br +3 -0
  110. package/payload/server/public/assets/triangle-alert-CpwrbdYq.js.gz +0 -0
  111. package/payload/server/public/assets/{useCopyFeedback-Dg5lNgqH.js → useCopyFeedback-D01gSp36.js} +1 -1
  112. package/payload/server/public/assets/useCopyFeedback-D01gSp36.js.br +0 -0
  113. package/payload/server/public/assets/useCopyFeedback-D01gSp36.js.gz +0 -0
  114. package/payload/server/public/assets/useSubAccountSwitcher-CJzJ9xV3.css +1 -0
  115. package/payload/server/public/assets/useSubAccountSwitcher-CJzJ9xV3.css.br +0 -0
  116. package/payload/server/public/assets/useSubAccountSwitcher-CJzJ9xV3.css.gz +0 -0
  117. package/payload/server/public/assets/{useVoiceRecorder-BY6ZsGMH.js → useVoiceRecorder-DiPgyDUy.js} +1 -1
  118. package/payload/server/public/assets/useVoiceRecorder-DiPgyDUy.js.br +0 -0
  119. package/payload/server/public/assets/useVoiceRecorder-DiPgyDUy.js.gz +0 -0
  120. package/payload/server/public/assets/{wrench-Bw1FMolk.js → wrench-C5SJreEu.js} +1 -1
  121. package/payload/server/public/assets/wrench-C5SJreEu.js.br +1 -0
  122. package/payload/server/public/assets/wrench-C5SJreEu.js.gz +0 -0
  123. package/payload/server/public/brand-defaults.css +1 -1
  124. package/payload/server/public/browser.html +4 -4
  125. package/payload/server/public/calendar.html +7 -7
  126. package/payload/server/public/chat.html +13 -13
  127. package/payload/server/public/data.html +12 -12
  128. package/payload/server/public/graph.html +9 -9
  129. package/payload/server/public/index.html +15 -15
  130. package/payload/server/public/operator.html +14 -14
  131. package/payload/server/public/public.html +13 -13
  132. package/payload/server/public/routines.html +7 -7
  133. package/payload/server/public/skills.html +5 -5
  134. package/payload/server/public/tasks.html +6 -6
  135. package/payload/server/server.js +53 -9
  136. package/payload/server/public/assets/AdminLoginScreens-BgDjueVe.js.br +0 -0
  137. package/payload/server/public/assets/AdminLoginScreens-BgDjueVe.js.gz +0 -0
  138. package/payload/server/public/assets/AdminShell-YctTrR-D.js.br +0 -0
  139. package/payload/server/public/assets/AdminShell-YctTrR-D.js.gz +0 -0
  140. package/payload/server/public/assets/activity-DGQt5ys_.js.br +0 -0
  141. package/payload/server/public/assets/activity-DGQt5ys_.js.gz +0 -0
  142. package/payload/server/public/assets/admin-DnUxbB3P.js.br +0 -0
  143. package/payload/server/public/assets/admin-DnUxbB3P.js.gz +0 -0
  144. package/payload/server/public/assets/agents-Bc2LZjwC.js.br +0 -0
  145. package/payload/server/public/assets/agents-Bc2LZjwC.js.gz +0 -0
  146. package/payload/server/public/assets/browser-BtF7SzvG.js +0 -1
  147. package/payload/server/public/assets/browser-BtF7SzvG.js.br +0 -0
  148. package/payload/server/public/assets/browser-BtF7SzvG.js.gz +0 -0
  149. package/payload/server/public/assets/calendar-D25EhXbD.js.br +0 -0
  150. package/payload/server/public/assets/calendar-D25EhXbD.js.gz +0 -0
  151. package/payload/server/public/assets/chat-z4jsHFXg.js +0 -1
  152. package/payload/server/public/assets/chat-z4jsHFXg.js.br +0 -0
  153. package/payload/server/public/assets/chat-z4jsHFXg.js.gz +0 -0
  154. package/payload/server/public/assets/chevron-left-BD09SN6R.js +0 -1
  155. package/payload/server/public/assets/chevron-right-ChmWeo7T.js +0 -1
  156. package/payload/server/public/assets/chevron-right-ChmWeo7T.js.br +0 -0
  157. package/payload/server/public/assets/clock-Yqf7Ke7I.js +0 -1
  158. package/payload/server/public/assets/clock-Yqf7Ke7I.js.br +0 -0
  159. package/payload/server/public/assets/clock-Yqf7Ke7I.js.gz +0 -0
  160. package/payload/server/public/assets/data-RmnKj5nC.js +0 -1
  161. package/payload/server/public/assets/data-RmnKj5nC.js.br +0 -2
  162. package/payload/server/public/assets/data-RmnKj5nC.js.gz +0 -0
  163. package/payload/server/public/assets/file-download-CiGklOfA.js.br +0 -0
  164. package/payload/server/public/assets/file-download-CiGklOfA.js.gz +0 -0
  165. package/payload/server/public/assets/file-text-XjJPULAZ.js.br +0 -0
  166. package/payload/server/public/assets/file-text-XjJPULAZ.js.gz +0 -0
  167. package/payload/server/public/assets/graph-BjHJ0z_6.js.br +0 -0
  168. package/payload/server/public/assets/graph-BjHJ0z_6.js.gz +0 -0
  169. package/payload/server/public/assets/graph-labels-D-0u37KA.js.br +0 -0
  170. package/payload/server/public/assets/graph-labels-D-0u37KA.js.gz +0 -0
  171. package/payload/server/public/assets/maximize-2-BJ9S-nfS.js.br +0 -0
  172. package/payload/server/public/assets/maximize-2-BJ9S-nfS.js.gz +0 -0
  173. package/payload/server/public/assets/operator-Cay4rOOK.js.br +0 -0
  174. package/payload/server/public/assets/operator-Cay4rOOK.js.gz +0 -0
  175. package/payload/server/public/assets/page-Cci_j_y7.js.br +0 -0
  176. package/payload/server/public/assets/page-Cci_j_y7.js.gz +0 -0
  177. package/payload/server/public/assets/page-shuh4ES9.js.br +0 -0
  178. package/payload/server/public/assets/page-shuh4ES9.js.gz +0 -0
  179. package/payload/server/public/assets/public-BbJcQGsO.js.br +0 -0
  180. package/payload/server/public/assets/public-BbJcQGsO.js.gz +0 -0
  181. package/payload/server/public/assets/rotate-ccw-jeSVwUAv.js.br +0 -0
  182. package/payload/server/public/assets/rotate-ccw-jeSVwUAv.js.gz +0 -0
  183. package/payload/server/public/assets/routines-D3M1Wh3a.js.br +0 -0
  184. package/payload/server/public/assets/routines-D3M1Wh3a.js.gz +0 -0
  185. package/payload/server/public/assets/skills-Bhej2ub1.js.br +0 -0
  186. package/payload/server/public/assets/skills-Bhej2ub1.js.gz +0 -0
  187. package/payload/server/public/assets/tasks-qY-dtOI2.js +0 -1
  188. package/payload/server/public/assets/tasks-qY-dtOI2.js.br +0 -0
  189. package/payload/server/public/assets/tasks-qY-dtOI2.js.gz +0 -0
  190. package/payload/server/public/assets/time-entry-format-r5UY9rjG.js.br +0 -0
  191. package/payload/server/public/assets/time-entry-format-r5UY9rjG.js.gz +0 -0
  192. package/payload/server/public/assets/triangle-alert--PCKaewD.js.br +0 -2
  193. package/payload/server/public/assets/triangle-alert--PCKaewD.js.gz +0 -0
  194. package/payload/server/public/assets/useCopyFeedback-Dg5lNgqH.js.br +0 -0
  195. package/payload/server/public/assets/useCopyFeedback-Dg5lNgqH.js.gz +0 -0
  196. package/payload/server/public/assets/useSubAccountSwitcher-BYfe9vj8.css +0 -1
  197. package/payload/server/public/assets/useSubAccountSwitcher-BYfe9vj8.css.br +0 -0
  198. package/payload/server/public/assets/useSubAccountSwitcher-BYfe9vj8.css.gz +0 -0
  199. package/payload/server/public/assets/useVoiceRecorder-BY6ZsGMH.js.br +0 -0
  200. package/payload/server/public/assets/useVoiceRecorder-BY6ZsGMH.js.gz +0 -0
  201. package/payload/server/public/assets/wrench-Bw1FMolk.js.br +0 -0
  202. package/payload/server/public/assets/wrench-Bw1FMolk.js.gz +0 -0
  203. /package/payload/server/public/assets/{useSubAccountSwitcher-CnpeWIYq.js → useSubAccountSwitcher-BRHYXwGO.js} +0 -0
  204. /package/payload/server/public/assets/{useSubAccountSwitcher-CnpeWIYq.js.br → useSubAccountSwitcher-BRHYXwGO.js.br} +0 -0
  205. /package/payload/server/public/assets/{useSubAccountSwitcher-CnpeWIYq.js.gz → useSubAccountSwitcher-BRHYXwGO.js.gz} +0 -0
@@ -9,6 +9,7 @@ Unpacked-extension dev build. No Chrome Web Store publication.
9
9
  3. **Load unpacked** → select this `extension/` directory.
10
10
  4. Click the new puzzle icon → open **SiteDesk LinkedIn Ingest** options.
11
11
  5. Paste your admin host (e.g. `https://your-tunnel.example.com`) and your admin **session key** (the value of `session_key` on the cookie or query in your admin browser). Save.
12
+ 6. Chrome asks you to allow the extension to talk to that host. **Allow it.** The pill cannot post without it, so declining saves nothing.
12
13
 
13
14
  ## Use
14
15
 
@@ -16,7 +17,14 @@ Unpacked-extension dev build. No Chrome Web Store publication.
16
17
  - Click the **Add to SiteDesk** pill at the top of the page.
17
18
  - The pill turns green and writes one `:KnowledgeDocument` plus the entities the body assertively states.
18
19
 
19
- If the pill turns amber and shows **Sign in to SiteDesk**, your session key has expired — open the options page and paste a fresh one.
20
+ The pill tells you which thing is wrong:
21
+
22
+ | Pill | Meaning | Fix |
23
+ |---|---|---|
24
+ | **Sign in to SiteDesk** (amber) | the session key expired | open options, paste a fresh key |
25
+ | **Grant access** (amber) | the admin host was never allowed, so the post never left the browser | open options, Save, allow the prompt |
26
+ | **SiteDesk unreachable** (red) | the host was allowed but did not answer | check the tunnel and the admin server |
27
+ | **Capture failed** (red) | the admin rejected the payload, or the extension's own service worker did not answer | read the service-worker console: `reason=extract` is a rejected payload, `reason=worker-unreachable` is the worker |
20
28
 
21
29
  ## File layout
22
30
 
@@ -26,7 +34,7 @@ If the pill turns amber and shows **Sign in to SiteDesk**, your session key has
26
34
  | `content/extractors.js` | Pure DOM extractor functions. Loaded first into each content-script context. |
27
35
  | `content/profile.js` | Profile pill + click handler. |
28
36
  | `content/thread.js` | Thread pill + click handler. |
29
- | `background/sw.js` | Service worker. POSTs envelopes to the admin route. |
37
+ | `background/sw.js` | Service worker. Checks the admin-host grant, then POSTs envelopes to the admin route. |
30
38
  | `options/options.html` + `options/options.js` | Admin host + session-key entry. |
31
39
  | `assets/pill.css` | Pill styling. |
32
40
  | `__tests__/` | jsdom unit tests for the extractors, run via vitest from `platform/ui`. |
@@ -1,5 +1,16 @@
1
1
  // Service worker. Receives envelopes from content scripts, POSTs them
2
- // to the admin host with the bearer token stored in extension options.
2
+ // to the admin host with the session key stored in extension options.
3
+ //
4
+ // Task 2185 — the manifest's static host_permissions cover linkedin.com only,
5
+ // so the admin host has to be granted at runtime from the options page before
6
+ // this fetch is permission-exempt. Without the grant Chrome treats the POST as
7
+ // an ordinary cross-origin request and preflights it (the content type is
8
+ // application/json, which is not CORS-safelisted); the admin route answers no
9
+ // preflight, so the request dies in the browser and the server never sees it.
10
+ //
11
+ // The grant is checked BEFORE the fetch on purpose: a missing grant and an
12
+ // unreachable host both surface as the same `TypeError: Failed to fetch`, so
13
+ // asking first is the only way to tell an operator which one they have.
3
14
 
4
15
  const TAG = '[linkedin-ext-post]'
5
16
 
@@ -11,11 +22,30 @@ async function getConfig() {
11
22
  }
12
23
  }
13
24
 
25
+ // Chrome match pattern covering every path on the admin host's origin.
26
+ function originPattern(adminHost) {
27
+ return new URL(adminHost).origin + '/*'
28
+ }
29
+
14
30
  async function postEnvelope(envelope) {
15
31
  const { adminHost, sessionKey } = await getConfig()
16
32
  if (!adminHost) return { ok: false, reason: 'auth', detail: 'admin-host-missing' }
17
33
  if (!sessionKey) return { ok: false, reason: 'auth', detail: 'session-key-missing' }
18
34
 
35
+ let origin
36
+ try {
37
+ origin = originPattern(adminHost)
38
+ } catch {
39
+ return { ok: false, reason: 'permission', detail: 'admin-host-not-a-url' }
40
+ }
41
+
42
+ const granted = await chrome.permissions.contains({ origins: [origin] })
43
+ console.log(
44
+ TAG + ' op=permission dispatchId=' + envelope.dispatchId +
45
+ ' origin=' + origin + ' granted=' + granted,
46
+ )
47
+ if (!granted) return { ok: false, reason: 'permission', detail: 'host-not-granted origin=' + origin }
48
+
19
49
  const url = adminHost + '/api/admin/linkedin-ingest'
20
50
  const started = Date.now()
21
51
  let res
@@ -26,12 +56,15 @@ async function postEnvelope(envelope) {
26
56
  body: JSON.stringify({ ...envelope, session_key: sessionKey }),
27
57
  })
28
58
  } catch (err) {
29
- console.error(TAG + ' dispatchId=' + envelope.dispatchId + ' status=network ms=' + (Date.now() - started))
30
- return { ok: false, reason: 'network', detail: err && err.message ? err.message : String(err) }
59
+ console.error(
60
+ TAG + ' op=fetch dispatchId=' + envelope.dispatchId +
61
+ ' status=unreachable ms=' + (Date.now() - started),
62
+ )
63
+ return { ok: false, reason: 'unreachable', detail: err && err.message ? err.message : String(err) }
31
64
  }
32
65
 
33
66
  const ms = Date.now() - started
34
- console.log(TAG + ' dispatchId=' + envelope.dispatchId + ' status=' + res.status + ' ms=' + ms)
67
+ console.log(TAG + ' op=fetch dispatchId=' + envelope.dispatchId + ' status=' + res.status + ' ms=' + ms)
35
68
 
36
69
  if (res.status === 401) return { ok: false, reason: 'auth', detail: 'session-rejected' }
37
70
  if (res.status >= 500) return { ok: false, reason: 'server', detail: 'http-' + res.status }
@@ -38,13 +38,17 @@
38
38
  try {
39
39
  reply = await chrome.runtime.sendMessage({ type: 'linkedin-ingest', envelope: envelope })
40
40
  } catch (err) {
41
- console.error(TAG_ERROR + ' reason=network detail=' + (err && err.message ? err.message : String(err)))
41
+ console.error(TAG_ERROR + ' reason=worker-unreachable detail=' + (err && err.message ? err.message : String(err)))
42
42
  setState(pill, 'error', 'Capture failed')
43
43
  return
44
44
  }
45
45
 
46
46
  if (!reply || !reply.ok) {
47
- const reason = (reply && reply.reason) || 'network'
47
+ // `worker-unreachable` is the extension's OWN service worker failing to
48
+ // answer. It is not `unreachable`, which means the admin host did not
49
+ // answer — blaming SiteDesk here sends the operator to check a tunnel that
50
+ // was never involved.
51
+ const reason = (reply && reply.reason) || 'worker-unreachable'
48
52
  const detail = (reply && reply.detail) || ''
49
53
  console.error(TAG_ERROR + ' reason=' + reason + ' detail=' + detail)
50
54
  if (reason === 'auth') {
@@ -52,6 +56,17 @@
52
56
  pill.onclick = function () { chrome.runtime.openOptionsPage() }
53
57
  return
54
58
  }
59
+ // Task 2185 — the admin host was never granted, so the POST never left
60
+ // the browser. Sending the operator to the options page is the fix.
61
+ if (reason === 'permission') {
62
+ setState(pill, 'auth', 'Grant access')
63
+ pill.onclick = function () { chrome.runtime.openOptionsPage() }
64
+ return
65
+ }
66
+ if (reason === 'unreachable') {
67
+ setState(pill, 'error', 'SiteDesk unreachable')
68
+ return
69
+ }
55
70
  setState(pill, 'error', 'Capture failed')
56
71
  return
57
72
  }
@@ -40,13 +40,17 @@
40
40
  try {
41
41
  reply = await chrome.runtime.sendMessage({ type: 'linkedin-ingest', envelope: envelope })
42
42
  } catch (err) {
43
- console.error(TAG_ERROR + ' reason=network detail=' + (err && err.message ? err.message : String(err)))
43
+ console.error(TAG_ERROR + ' reason=worker-unreachable detail=' + (err && err.message ? err.message : String(err)))
44
44
  setState(pill, 'error', 'Capture failed')
45
45
  return
46
46
  }
47
47
 
48
48
  if (!reply || !reply.ok) {
49
- const reason = (reply && reply.reason) || 'network'
49
+ // `worker-unreachable` is the extension's OWN service worker failing to
50
+ // answer. It is not `unreachable`, which means the admin host did not
51
+ // answer — blaming SiteDesk here sends the operator to check a tunnel that
52
+ // was never involved.
53
+ const reason = (reply && reply.reason) || 'worker-unreachable'
50
54
  const detail = (reply && reply.detail) || ''
51
55
  console.error(TAG_ERROR + ' reason=' + reason + ' detail=' + detail)
52
56
  if (reason === 'auth') {
@@ -54,6 +58,17 @@
54
58
  pill.onclick = function () { chrome.runtime.openOptionsPage() }
55
59
  return
56
60
  }
61
+ // Task 2185 — the admin host was never granted, so the POST never left
62
+ // the browser. Sending the operator to the options page is the fix.
63
+ if (reason === 'permission') {
64
+ setState(pill, 'auth', 'Grant access')
65
+ pill.onclick = function () { chrome.runtime.openOptionsPage() }
66
+ return
67
+ }
68
+ if (reason === 'unreachable') {
69
+ setState(pill, 'error', 'SiteDesk unreachable')
70
+ return
71
+ }
57
72
  setState(pill, 'error', 'Capture failed')
58
73
  return
59
74
  }
@@ -5,6 +5,7 @@
5
5
  "description": "Add an Add-to-SiteDesk pill to LinkedIn profiles and DM threads. One click captures the page and posts to your SiteDesk admin.",
6
6
  "permissions": ["storage", "activeTab"],
7
7
  "host_permissions": ["https://www.linkedin.com/*"],
8
+ "optional_host_permissions": ["http://*/*", "https://*/*"],
8
9
  "background": {
9
10
  "service_worker": "background/sw.js"
10
11
  },
@@ -18,6 +18,7 @@
18
18
  <body>
19
19
  <h1>SiteDesk LinkedIn Ingest</h1>
20
20
  <p>Point the extension at your SiteDesk admin host and paste your admin session key. The pill on LinkedIn will then post one-click captures to your admin.</p>
21
+ <p>On Save, Chrome asks you to allow this extension to talk to that host. The capture pill cannot post without it, so declining leaves the extension unconfigured.</p>
21
22
 
22
23
  <label for="admin-host">Admin host</label>
23
24
  <input id="admin-host" type="url" placeholder="https://your-tunnel.example.com" />
@@ -1,15 +1,59 @@
1
- // Options-page glue. Reads existing values, saves on click.
1
+ // Options-page glue. Reads existing values, requests browser access for the
2
+ // configured admin host, probes it, then saves.
3
+ //
4
+ // Task 2185 — the manifest's static host_permissions cover linkedin.com only,
5
+ // so a service-worker fetch to the admin host is an ordinary cross-origin
6
+ // request that Chrome preflights and the admin route never answers. The
7
+ // runtime grant requested here is what makes that fetch permission-exempt.
8
+ // Without it every capture dies in the browser and the server sees nothing.
2
9
 
3
10
  const $host = document.getElementById('admin-host')
4
11
  const $key = document.getElementById('session-key')
5
12
  const $btn = document.getElementById('save')
6
13
  const $status = document.getElementById('status')
7
14
 
15
+ const TAG = '[linkedin-ext-options]'
16
+
8
17
  function setStatus(text, isError) {
9
18
  $status.textContent = text
10
19
  $status.classList.toggle('error', !!isError)
11
20
  }
12
21
 
22
+ // Chrome match pattern covering every path on the admin host's origin.
23
+ function originPattern(adminHost) {
24
+ return new URL(adminHost).origin + '/*'
25
+ }
26
+
27
+ // What the operator reads when the probe fails. The reason tokens are for the
28
+ // console; this page says what actually went wrong in plain words.
29
+ const PROBE_COPY = {
30
+ unreachable: 'that host did not answer',
31
+ auth: 'that host rejected the session key',
32
+ server: 'that host answered with an unexpected status',
33
+ }
34
+
35
+ // Config-time probe. The body carries none of the five envelope fields, so
36
+ // the route answers 400 {error:'schema', reason:'envelope', missing:[all
37
+ // five]} — a signature no real capture can produce, because both content
38
+ // scripts always set all five. Nothing is dispatched and nothing is written.
39
+ async function probe(adminHost, sessionKey) {
40
+ let res
41
+ try {
42
+ res = await fetch(adminHost + '/api/admin/linkedin-ingest', {
43
+ method: 'POST',
44
+ headers: { 'content-type': 'application/json' },
45
+ body: JSON.stringify({ session_key: sessionKey }),
46
+ })
47
+ } catch (err) {
48
+ return { ok: false, reason: 'unreachable', detail: err && err.message ? err.message : String(err) }
49
+ }
50
+ if (res.status === 401) return { ok: false, reason: 'auth', detail: 'session-rejected' }
51
+ let body = null
52
+ try { body = await res.json() } catch { /* non-JSON body */ }
53
+ if (res.status === 400 && body && body.error === 'schema') return { ok: true }
54
+ return { ok: false, reason: 'server', detail: 'http-' + res.status }
55
+ }
56
+
13
57
  async function load() {
14
58
  const stored = await chrome.storage.local.get(['adminHost', 'sessionKey'])
15
59
  if (typeof stored.adminHost === 'string') $host.value = stored.adminHost
@@ -17,13 +61,44 @@ async function load() {
17
61
  }
18
62
 
19
63
  async function save() {
20
- const adminHost = $host.value.trim()
64
+ const adminHost = $host.value.trim().replace(/\/+$/, '')
21
65
  const sessionKey = $key.value.trim()
22
66
  if (!adminHost) return setStatus('Admin host is required.', true)
23
67
  if (!/^https?:\/\//.test(adminHost)) return setStatus('Admin host must start with http(s)://.', true)
24
68
  if (!sessionKey) return setStatus('Session key is required.', true)
69
+
70
+ let origin
71
+ try {
72
+ origin = originPattern(adminHost)
73
+ } catch {
74
+ return setStatus('Admin host is not a valid URL.', true)
75
+ }
76
+
77
+ // A rejected request() is not a refusal — it means Chrome would not even ask
78
+ // (a malformed match pattern, no user gesture). Left uncaught it aborts save()
79
+ // with no status at all, so the operator clicks Save and sees nothing happen.
80
+ let granted
81
+ try {
82
+ granted = await chrome.permissions.request({ origins: [origin] })
83
+ } catch (err) {
84
+ const detail = err && err.message ? err.message : String(err)
85
+ console.error(TAG + ' op=permission origin=' + origin + ' granted=error detail=' + detail)
86
+ return setStatus('Chrome refused to ask for access to ' + origin + ': ' + detail, true)
87
+ }
88
+ console.log(TAG + ' op=permission origin=' + origin + ' granted=' + granted)
89
+ if (!granted) {
90
+ return setStatus(
91
+ 'Access to ' + origin + ' was declined, so nothing was saved. The pill cannot post without it.',
92
+ true,
93
+ )
94
+ }
95
+
96
+ const reachable = await probe(adminHost, sessionKey)
25
97
  await chrome.storage.local.set({ adminHost: adminHost, sessionKey: sessionKey })
26
- setStatus('Saved.', false)
98
+ if (reachable.ok) {
99
+ return setStatus('Saved. The admin host is reachable and accepted the session key.', false)
100
+ }
101
+ setStatus('Saved, but ' + PROBE_COPY[reachable.reason] + ' (' + reachable.detail + ')', true)
27
102
  }
28
103
 
29
104
  $btn.addEventListener('click', save)
@@ -8,7 +8,7 @@
8
8
  * cannot be told apart from a check that has stopped running.
9
9
  */
10
10
  import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
11
- import { auditRoutineRoster, auditDispatchModeNone, auditNullTimezone, auditStartDateNeverFired, dispatchGapReason, } from "../agent-turn-dispatch.js";
11
+ import { auditRoutineRoster, auditDispatchModeNone, auditNullTimezone, auditStartDateNeverFired, auditScheduledNoNextRun, dispatchGapReason, } from "../agent-turn-dispatch.js";
12
12
  import { ROUTINE_ROSTER_KEYS } from "../../../../../../lib/routine-templates/dist/index.js";
13
13
  const ACCT_A = "aaaaaaaa-1111-4111-8111-111111111111";
14
14
  const ACCT_B = "bbbbbbbb-2222-4222-8222-222222222222";
@@ -295,4 +295,66 @@ describe("auditStartDateNeverFired", () => {
295
295
  expect(lines()[0]).toContain("op=start-date-never-fired-error");
296
296
  });
297
297
  });
298
+ /**
299
+ * Task 2141 — the routine that reads enabled and cannot be selected.
300
+ *
301
+ * The recurring query requires `nextRun IS NOT NULL`, so a scheduled recurring
302
+ * row with a NULL `nextRun` is never selected, never fires, and emits nothing:
303
+ * `/routines` shows `scheduled`, the automation filter admits it, and no line is
304
+ * written because nothing happened. The zero line is asserted as hard as the
305
+ * fault line — a check that only speaks when something is wrong cannot be told
306
+ * apart from a check that has stopped running.
307
+ */
308
+ describe("auditScheduledNoNextRun", () => {
309
+ it("counts and names a scheduled recurring routine whose nextRun is NULL", async () => {
310
+ const { driver } = driverReturning([{ accountId: ACCT_A, eventId: "e1" }]);
311
+ await auditScheduledNoNextRun(driver, [ACCT_A]);
312
+ expect(lines()).toEqual([
313
+ "[schedule-audit] op=scheduled-no-nextrun acct=aaaaaaaa count=1 eventIds=[e1]",
314
+ ]);
315
+ });
316
+ it("excludes suspended, one-time and armed rows, on the query", async () => {
317
+ // All three exclusions are query-side, and the stub replays whatever rows it
318
+ // is handed regardless of the Cypher, so a stubbed one-time row would be
319
+ // counted no matter what the predicate says. Asserting the query is the only
320
+ // assertion that proves them (same technique as Task 2146 above).
321
+ //
322
+ // The one-time exclusion is the load-bearing one: a one-time event dispatches
323
+ // off `startDate`, so a NULL nextRun there is correct and counting it would
324
+ // make this line noise on every account that holds one.
325
+ const { driver, run } = driverReturning([]);
326
+ await auditScheduledNoNextRun(driver, [ACCT_A]);
327
+ const cypher = String(run.mock.calls[0][0]);
328
+ expect(cypher).toContain("e.eventStatus = 'scheduled'");
329
+ expect(cypher).toContain("e.recurrence IS NOT NULL");
330
+ expect(cypher).toContain("e.nextRun IS NULL");
331
+ });
332
+ it("emits count=0 every tick when nothing is stalled", async () => {
333
+ const { driver } = driverReturning([]);
334
+ await auditScheduledNoNextRun(driver, [ACCT_A]);
335
+ expect(lines()).toEqual([
336
+ "[schedule-audit] op=scheduled-no-nextrun acct=aaaaaaaa count=0 eventIds=[]",
337
+ ]);
338
+ });
339
+ it("emits one line per local account, driven by the account list", async () => {
340
+ // The healthy account returns no row at all, and iterating the query result
341
+ // instead of the account list would emit nothing for it.
342
+ const { driver } = driverReturning([{ accountId: ACCT_A, eventId: "e1" }]);
343
+ await auditScheduledNoNextRun(driver, [ACCT_A, ACCT_B]);
344
+ expect(lines()).toEqual([
345
+ "[schedule-audit] op=scheduled-no-nextrun acct=aaaaaaaa count=1 eventIds=[e1]",
346
+ "[schedule-audit] op=scheduled-no-nextrun acct=bbbbbbbb count=0 eventIds=[]",
347
+ ]);
348
+ });
349
+ it("does nothing when there are no local accounts", async () => {
350
+ const { driver, run } = driverReturning([]);
351
+ await auditScheduledNoNextRun(driver, []);
352
+ expect(run).not.toHaveBeenCalled();
353
+ expect(lines()).toEqual([]);
354
+ });
355
+ it("never throws into the sweep", async () => {
356
+ await expect(auditScheduledNoNextRun(driverThrowing("bolt down"), [ACCT_A])).resolves.toBeUndefined();
357
+ expect(lines()[0]).toContain("op=scheduled-no-nextrun-error");
358
+ });
359
+ });
298
360
  //# sourceMappingURL=routine-roster-audit.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"routine-roster-audit.test.js","sourceRoot":"","sources":["../../../src/scripts/__tests__/routine-roster-audit.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"routine-roster-audit.test.js","sourceRoot":"","sources":["../../../src/scripts/__tests__/routine-roster-audit.test.ts"],"names":[],"mappings":"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"}
@@ -177,6 +177,41 @@ export declare function auditNullTimezone(driver: Driver, localAccountIds: strin
177
177
  * `count=0` is emitted every tick. Never throws (honours the sweep's contract).
178
178
  */
179
179
  export declare function auditStartDateNeverFired(driver: Driver, localAccountIds: string[]): Promise<void>;
180
+ /**
181
+ * Task 2141 — the routine that reads enabled and cannot be selected.
182
+ *
183
+ * The recurring query requires `e.nextRun IS NOT NULL` (check-due-events.ts:772),
184
+ * so a scheduled recurring row whose `nextRun` is NULL is never in the result
185
+ * set. It never fires, and every surface reports it healthy: `/routines` shows
186
+ * `scheduled`, the admin route's AUTOMATION_WHERE admits it, `schedule-list`'s
187
+ * `upcoming` admits it on `eventStatus IN ['scheduled','due']`, and nothing is
188
+ * logged, because nothing happened. This is the only control that names it.
189
+ *
190
+ * No writer on this tree produces the state today. `schedule-event` throws
191
+ * rather than store an unparseable recurrence and always seeds `nextRun`
192
+ * (:140-160); `schedule-update`'s recurrence branch writes both properties in
193
+ * one SET (:300-317); its status gate refuses `scheduled -> scheduled` and
194
+ * recomputes `nextRun` through `planResume` on the only admitted re-arm
195
+ * (:233-247, :322-324); the admin PATCH route no longer admits `eventStatus` at
196
+ * all and recomputes on a cron edit (routines.ts:569-578); single and bulk
197
+ * resume both recompute for a recurring row (routines.ts:798-810, :689-698); the
198
+ * sweep's own advance always writes a computed value (check-due-events.ts:824);
199
+ * and the roster seed writes `nextRun = null` ON CREATE only, at
200
+ * `eventStatus = 'suspended'` (routine-templates/src/index.ts:158-176).
201
+ *
202
+ * What this check is for is therefore twofold: rows already carrying the state
203
+ * on the fleet, written before those gates landed, which no surface will ever
204
+ * mention on their own; and the standing guard that turns a future writer
205
+ * regressing this invariant into one line rather than a routine that quietly
206
+ * stops delivering.
207
+ *
208
+ * One-time events are excluded on `recurrence IS NOT NULL`. They dispatch off
209
+ * `startDate` (check-due-events.ts:708), so a NULL `nextRun` there is
210
+ * correct and counting it would make this line noise.
211
+ *
212
+ * `count=0` is emitted every tick. Never throws (honours the sweep's contract).
213
+ */
214
+ export declare function auditScheduledNoNextRun(driver: Driver, localAccountIds: string[]): Promise<void>;
180
215
  /**
181
216
  * Task 2106 — the standing suspension census.
182
217
  *
@@ -1 +1 @@
1
- {"version":3,"file":"agent-turn-dispatch.d.ts","sourceRoot":"","sources":["../../src/scripts/agent-turn-dispatch.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent-turn-dispatch.d.ts","sourceRoot":"","sources":["../../src/scripts/agent-turn-dispatch.ts"],"names":[],"mappings":"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"}
@@ -551,6 +551,84 @@ export async function auditStartDateNeverFired(driver, localAccountIds) {
551
551
  }
552
552
  }
553
553
  }
554
+ /**
555
+ * Task 2141 — the routine that reads enabled and cannot be selected.
556
+ *
557
+ * The recurring query requires `e.nextRun IS NOT NULL` (check-due-events.ts:772),
558
+ * so a scheduled recurring row whose `nextRun` is NULL is never in the result
559
+ * set. It never fires, and every surface reports it healthy: `/routines` shows
560
+ * `scheduled`, the admin route's AUTOMATION_WHERE admits it, `schedule-list`'s
561
+ * `upcoming` admits it on `eventStatus IN ['scheduled','due']`, and nothing is
562
+ * logged, because nothing happened. This is the only control that names it.
563
+ *
564
+ * No writer on this tree produces the state today. `schedule-event` throws
565
+ * rather than store an unparseable recurrence and always seeds `nextRun`
566
+ * (:140-160); `schedule-update`'s recurrence branch writes both properties in
567
+ * one SET (:300-317); its status gate refuses `scheduled -> scheduled` and
568
+ * recomputes `nextRun` through `planResume` on the only admitted re-arm
569
+ * (:233-247, :322-324); the admin PATCH route no longer admits `eventStatus` at
570
+ * all and recomputes on a cron edit (routines.ts:569-578); single and bulk
571
+ * resume both recompute for a recurring row (routines.ts:798-810, :689-698); the
572
+ * sweep's own advance always writes a computed value (check-due-events.ts:824);
573
+ * and the roster seed writes `nextRun = null` ON CREATE only, at
574
+ * `eventStatus = 'suspended'` (routine-templates/src/index.ts:158-176).
575
+ *
576
+ * What this check is for is therefore twofold: rows already carrying the state
577
+ * on the fleet, written before those gates landed, which no surface will ever
578
+ * mention on their own; and the standing guard that turns a future writer
579
+ * regressing this invariant into one line rather than a routine that quietly
580
+ * stops delivering.
581
+ *
582
+ * One-time events are excluded on `recurrence IS NOT NULL`. They dispatch off
583
+ * `startDate` (check-due-events.ts:708), so a NULL `nextRun` there is
584
+ * correct and counting it would make this line noise.
585
+ *
586
+ * `count=0` is emitted every tick. Never throws (honours the sweep's contract).
587
+ */
588
+ export async function auditScheduledNoNextRun(driver, localAccountIds) {
589
+ if (localAccountIds.length === 0)
590
+ return;
591
+ const session = driver.session();
592
+ try {
593
+ const res = await session.run(`MATCH (e:Event)
594
+ WHERE e.accountId IN $localAccountIds
595
+ AND e.eventStatus = 'scheduled'
596
+ AND e.recurrence IS NOT NULL
597
+ AND e.nextRun IS NULL
598
+ RETURN e.accountId AS accountId, e.eventId AS eventId`, { localAccountIds });
599
+ const stalledByAccount = new Map();
600
+ for (const rec of res.records) {
601
+ const accountId = rec.get("accountId");
602
+ const list = stalledByAccount.get(accountId) ?? [];
603
+ list.push(rec.get("eventId"));
604
+ stalledByAccount.set(accountId, list);
605
+ }
606
+ // Driven by localAccountIds, not the result rows: an account with nothing
607
+ // stalled returns no row, and skipping it would make "none stalled" and
608
+ // "not looked at" the same silence on a multi-account box.
609
+ //
610
+ // Full event ids, not the 8-char prefix used for `acct=`: the id is what
611
+ // repairs the row. `schedule-update {eventId, recurrence}` with the cron the
612
+ // routine already carries recomputes `nextRun` in one call, so the line
613
+ // carries everything the repair needs without opening the graph.
614
+ for (const accountId of localAccountIds) {
615
+ const ids = stalledByAccount.get(accountId) ?? [];
616
+ console.error(`[schedule-audit] op=scheduled-no-nextrun acct=${accountId.slice(0, 8)} count=${ids.length} ` +
617
+ `eventIds=[${ids.join(",")}]`);
618
+ }
619
+ }
620
+ catch (err) {
621
+ console.error(`[schedule-audit] op=scheduled-no-nextrun-error detail=${err instanceof Error ? err.message : String(err)}`);
622
+ }
623
+ finally {
624
+ try {
625
+ await session.close();
626
+ }
627
+ catch {
628
+ // ignore
629
+ }
630
+ }
631
+ }
554
632
  /**
555
633
  * Task 2106 — the standing suspension census.
556
634
  *