@xopcai/xopc 0.0.127 → 0.0.129

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 (334) hide show
  1. package/dist/browser-ext/manifest.json +1 -1
  2. package/dist/extensions/telegram/xopc.extension.json +1 -1
  3. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-CgGgO4OV.js → agent-avatar-dicebear-DHzfg5D-.js} +1 -1
  4. package/dist/gateway/static/root/assets/agents-CMxKKFQD.js +2 -0
  5. package/dist/gateway/static/root/assets/app-management-settings-panel-ptk9c5BN.js +1 -0
  6. package/dist/gateway/static/root/assets/{appearance-settings-BnHQW7Hv.js → appearance-settings-bYeEj3IW.js} +1 -1
  7. package/dist/gateway/static/root/assets/apps-page-DdZvDf5B.js +1 -0
  8. package/dist/gateway/static/root/assets/{archive-plugin-5NXT7Zqv.js → archive-plugin-Dy6lsTHw.js} +1 -1
  9. package/dist/gateway/static/root/assets/{attachment-load-DghwhYe0.js → attachment-load-qOtBYR6Y.js} +1 -1
  10. package/dist/gateway/static/root/assets/{automation-suggestion-card-DYmESgwl.js → automation-suggestion-card-BFH-RfaV.js} +1 -1
  11. package/dist/gateway/static/root/assets/automations-page-B8JTjkCr.js +4 -0
  12. package/dist/gateway/static/root/assets/{binary-plugins-DSbPKdWX.js → binary-plugins-DJvi_thc.js} +1 -1
  13. package/dist/gateway/static/root/assets/{block-editor-CoZ-_np-.js → block-editor-DlMnizlt.js} +4 -4
  14. package/dist/gateway/static/root/assets/browser-settings-page-slHLiZgi.js +8 -0
  15. package/dist/gateway/static/root/assets/capability-presets-api-D4q7vHVJ.js +1 -0
  16. package/dist/gateway/static/root/assets/capability-presets-settings-panel-Dng8Grpv.js +1 -0
  17. package/dist/gateway/static/root/assets/channel-recipient-api-BrW5Kcgc.js +1 -0
  18. package/dist/gateway/static/root/assets/channels-settings-KIsISXw0.js +1 -0
  19. package/dist/gateway/static/root/assets/{code-editor-gbRgS14t.js → code-editor--tMO38Tr.js} +1 -1
  20. package/dist/gateway/static/root/assets/connectors-page-C5fx4Qs9.js +2 -0
  21. package/dist/gateway/static/root/assets/desktop-pet-Jmdn6q47.js +1 -0
  22. package/dist/gateway/static/root/assets/{desktop-pet-settings-npJ0Oh5p.js → desktop-pet-settings-B-u63N4e.js} +1 -1
  23. package/dist/gateway/static/root/assets/{directory-picker-path-field-BR2ItBuf.js → directory-picker-path-field-8p1ehIHn.js} +1 -1
  24. package/dist/gateway/static/root/assets/dreaming-settings-CCkKP-I4.js +3 -0
  25. package/dist/gateway/static/root/assets/{extension-debug-page-Tl0f1rNv.js → extension-debug-page-DJ1ABK95.js} +1 -1
  26. package/dist/gateway/static/root/assets/{extension-page-Ck7QuwE3.js → extension-page-CP9P2lGM.js} +1 -1
  27. package/dist/gateway/static/root/assets/extension-settings-page-DnhU-tx0.js +1 -0
  28. package/dist/gateway/static/root/assets/fetch-BMjlW0g1.js +1 -0
  29. package/dist/gateway/static/root/assets/gateway-config-api-CjxDn46s.js +1 -0
  30. package/dist/gateway/static/root/assets/gateway-settings-TING7224.js +1 -0
  31. package/dist/gateway/static/root/assets/{gateway-startup-retry-Yh8h3hkj.js → gateway-startup-retry-CY5W2Pp4.js} +1 -1
  32. package/dist/gateway/static/root/assets/goal-create-dialog-2lPbGfp3.js +1 -0
  33. package/dist/gateway/static/root/assets/goal-detail-page-DHWVRafk.js +4 -0
  34. package/dist/gateway/static/root/assets/goals-config-api-BqhuxG8P.js +1 -0
  35. package/dist/gateway/static/root/assets/goals-page-CMk-9ZYN.js +2 -0
  36. package/dist/gateway/static/root/assets/goals-settings-BHzOAU_l.js +1 -0
  37. package/dist/gateway/static/root/assets/heartbeat-settings-BQIm0P3V.js +1 -0
  38. package/dist/gateway/static/root/assets/{html-workspace-editor-DV90ddkE.js → html-workspace-editor-COqmtESs.js} +1 -1
  39. package/dist/gateway/static/root/assets/index-C4k6QSXw.js +257 -0
  40. package/dist/gateway/static/root/assets/index-EKmpPvZj.css +1 -0
  41. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-CfQrt_Rb.js → keyboard-shortcuts-settings-BrENZzM7.js} +1 -1
  42. package/dist/gateway/static/root/assets/logs-page-BiL302Ve.js +2 -0
  43. package/dist/gateway/static/root/assets/{markdown-editor-BFOjBBla.js → markdown-editor-jD1LPiP-.js} +2 -2
  44. package/dist/gateway/static/root/assets/{markdown-split-BwiMdCf_.js → markdown-split-BYF4ReGM.js} +1 -1
  45. package/dist/gateway/static/root/assets/{media-plugins-DhoizyZv.js → media-plugins-CpQDz-QJ.js} +1 -1
  46. package/dist/gateway/static/root/assets/messages-YzjnURPJ.js +3 -0
  47. package/dist/gateway/static/root/assets/models-hub-panel-CFPpl3Cq.js +2 -0
  48. package/dist/gateway/static/root/assets/notes-page-BurgcdVZ.js +1 -0
  49. package/dist/gateway/static/root/assets/notes-workbench-BAELRM_O.js +2 -0
  50. package/dist/gateway/static/root/assets/{page-tabs-DDC2t4Z8.js → page-tabs-RnYYOIWO.js} +1 -1
  51. package/dist/gateway/static/root/assets/{preview-open-alternatives-BTmk-XDM.js → preview-open-alternatives-CTRt06Ri.js} +1 -1
  52. package/dist/gateway/static/root/assets/project-detail-page-iXX1Ceo2.js +1 -0
  53. package/dist/gateway/static/root/assets/projects-page-GDVTFAY7.js +1 -0
  54. package/dist/gateway/static/root/assets/remote-access-hub-BUrbUnwv.js +1 -0
  55. package/dist/gateway/static/root/assets/{save-bar-controls-DqU-yKIh.js → save-bar-controls-c4pZeikq.js} +1 -1
  56. package/dist/gateway/static/root/assets/{schedule-field-CUttkoSB.js → schedule-field-Cb6R7iuP.js} +1 -1
  57. package/dist/gateway/static/root/assets/{schema-form-CVSQA9nI.js → schema-form-BqET_hEP.js} +1 -1
  58. package/dist/gateway/static/root/assets/sessions-page-CiOreA2k.js +1 -0
  59. package/dist/gateway/static/root/assets/settings-advanced-gate-C-qvptlu.js +1 -0
  60. package/dist/gateway/static/root/assets/{settings-collapsible-section-CK7ogS-P.js → settings-collapsible-section-DuOvqNsI.js} +1 -1
  61. package/dist/gateway/static/root/assets/{settings-form-section-Bugp38Fa.js → settings-form-section-DptSsbWd.js} +1 -1
  62. package/dist/gateway/static/root/assets/settings-loading-skeleton-BlVfBCb9.js +1 -0
  63. package/dist/gateway/static/root/assets/{settings-page-layout-DBRWwdhh.js → settings-page-layout-DVt69dJJ.js} +1 -1
  64. package/dist/gateway/static/root/assets/settings-page-xQx2Pkg5.js +1 -0
  65. package/dist/gateway/static/root/assets/setup-status-panel-DWB8VdLK.js +1 -0
  66. package/dist/gateway/static/root/assets/share-preview-page-8m_ACH0z.js +2 -0
  67. package/dist/gateway/static/root/assets/shares-settings-CgxfhNxI.js +1 -0
  68. package/dist/gateway/static/root/assets/skill-reload-api-BBFUOxmf.js +1 -0
  69. package/dist/gateway/static/root/assets/skills-page-bo695odu.js +2 -0
  70. package/dist/gateway/static/root/assets/{system-settings-panel-DJ6YuLqR.js → system-settings-panel-CW22OkZ4.js} +1 -1
  71. package/dist/gateway/static/root/assets/{typed-models-lib-B0T7N8Km.js → typed-models-lib-BqpGAKxV.js} +1 -1
  72. package/dist/gateway/static/root/assets/url-DFGNSBNT.js +1 -0
  73. package/dist/gateway/static/root/assets/use-channel-catalog-CPdJ0o0i.js +1 -0
  74. package/dist/gateway/static/root/assets/user-profile-settings-panel-CERVLuaW.js +1 -0
  75. package/dist/gateway/static/root/assets/{utils-CehXcWAY.js → utils-BnmysurA.js} +1 -1
  76. package/dist/gateway/static/root/assets/vendor-codemirror-C1WKjCk5.js +45 -0
  77. package/dist/gateway/static/root/assets/voice-api-key-field-Jr3jvPcB.js +1 -0
  78. package/dist/gateway/static/root/assets/work-item-detail-page-B-8rex4u.js +1 -0
  79. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-c4jeaohQ.js → workflow-run-setup-panel-Ci9GSPnS.js} +2 -2
  80. package/dist/gateway/static/root/assets/{workflow-start-dialog-ENRHjoqa.js → workflow-start-dialog-BhDj8pqH.js} +1 -1
  81. package/dist/gateway/static/root/assets/workflows-page-Brb3UGvs.js +18 -0
  82. package/dist/gateway/static/root/index.html +7 -6
  83. package/dist/package.js +1 -1
  84. package/dist/src/agent/agent-manager.d.ts +3 -0
  85. package/dist/src/agent/agent-manager.js +14 -6
  86. package/dist/src/agent/agent-manager.js.map +1 -1
  87. package/dist/src/agent/capabilities/definitions.d.ts +14 -0
  88. package/dist/src/agent/capabilities/definitions.js +19 -0
  89. package/dist/src/agent/capabilities/definitions.js.map +1 -1
  90. package/dist/src/agent/goals/post-turn.js +23 -2
  91. package/dist/src/agent/goals/post-turn.js.map +1 -1
  92. package/dist/src/agent/messaging/command-handler.d.ts +4 -0
  93. package/dist/src/agent/messaging/command-handler.js +6 -0
  94. package/dist/src/agent/messaging/command-handler.js.map +1 -1
  95. package/dist/src/agent/service.d.ts +2 -0
  96. package/dist/src/agent/service.js +23 -0
  97. package/dist/src/agent/service.js.map +1 -1
  98. package/dist/src/agent/skills/hub-lock.d.ts +5 -5
  99. package/dist/src/agent/skills/hub-lock.js +12 -12
  100. package/dist/src/agent/skills/hub-lock.js.map +1 -1
  101. package/dist/src/agent/skills/hub-pull.d.ts +15 -0
  102. package/dist/src/agent/skills/hub-pull.js +299 -24
  103. package/dist/src/agent/skills/hub-pull.js.map +1 -1
  104. package/dist/src/agent/skills/index.js +4 -40
  105. package/dist/src/agent/skills/index.js.map +1 -1
  106. package/dist/src/agent/skills/install-target.d.ts +3 -0
  107. package/dist/src/agent/skills/install-target.js +11 -0
  108. package/dist/src/agent/skills/install-target.js.map +1 -0
  109. package/dist/src/agent/skills/managed-store.d.ts +5 -3
  110. package/dist/src/agent/skills/managed-store.js +10 -9
  111. package/dist/src/agent/skills/managed-store.js.map +1 -1
  112. package/dist/src/agent/skills/marketplace/adapters/store/adapter.js +5 -3
  113. package/dist/src/agent/skills/marketplace/adapters/store/adapter.js.map +1 -1
  114. package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.d.ts +21 -1
  115. package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.js +62 -6
  116. package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.js.map +1 -1
  117. package/dist/src/agent/skills/marketplace/resolve-adapter.js +1 -1
  118. package/dist/src/agent/skills/marketplace/resolve-adapter.js.map +1 -1
  119. package/dist/src/agent/skills/skill-manage-ops.js +2 -2
  120. package/dist/src/agent/skills/skill-manage-ops.js.map +1 -1
  121. package/dist/src/agent/skills/skill-manager.js +1 -6
  122. package/dist/src/agent/skills/skill-manager.js.map +1 -1
  123. package/dist/src/agent/skills/workspace-skills-dir.d.ts +1 -0
  124. package/dist/src/agent/skills/workspace-skills-dir.js +5 -1
  125. package/dist/src/agent/skills/workspace-skills-dir.js.map +1 -1
  126. package/dist/src/agent/tools/automation-tool.d.ts +6 -6
  127. package/dist/src/agent/tools/browser/tool/schemas.d.ts +20 -20
  128. package/dist/src/agent/tools/composio-tool.d.ts +3 -3
  129. package/dist/src/agent/tools/desktop-pet-tool.d.ts +7 -7
  130. package/dist/src/agent/tools/factory.d.ts +3 -0
  131. package/dist/src/agent/tools/factory.js +6 -1
  132. package/dist/src/agent/tools/factory.js.map +1 -1
  133. package/dist/src/agent/tools/goal-tool.d.ts +16 -16
  134. package/dist/src/agent/tools/index.d.ts +1 -0
  135. package/dist/src/agent/tools/index.js +2 -1
  136. package/dist/src/agent/tools/skill-install-tool.d.ts +28 -0
  137. package/dist/src/agent/tools/skill-install-tool.js +81 -0
  138. package/dist/src/agent/tools/skill-install-tool.js.map +1 -0
  139. package/dist/src/agent/tools/skill-manage-tool.js +3 -6
  140. package/dist/src/agent/tools/skill-manage-tool.js.map +1 -1
  141. package/dist/src/agent/tools/tool-manual-tool.d.ts +2 -2
  142. package/dist/src/agent/tools/xopc-use-tool.d.ts +5 -5
  143. package/dist/src/automations/domain/types.d.ts +1 -0
  144. package/dist/src/automations/draft/automation-draft-service.js +1 -1
  145. package/dist/src/automations/service/automation-service.js +9 -0
  146. package/dist/src/automations/service/automation-service.js.map +1 -1
  147. package/dist/src/browser/schemas.d.ts +52 -52
  148. package/dist/src/capabilities/store-connector.d.ts +17 -0
  149. package/dist/src/capabilities/store-connector.js +191 -0
  150. package/dist/src/capabilities/store-connector.js.map +1 -0
  151. package/dist/src/chat-commands/builtins/skill.d.ts +1 -0
  152. package/dist/src/chat-commands/builtins/skill.js +132 -0
  153. package/dist/src/chat-commands/builtins/skill.js.map +1 -0
  154. package/dist/src/chat-commands/context.d.ts +3 -0
  155. package/dist/src/chat-commands/context.js +2 -0
  156. package/dist/src/chat-commands/context.js.map +1 -1
  157. package/dist/src/chat-commands/index.d.ts +1 -0
  158. package/dist/src/chat-commands/index.js +3 -1
  159. package/dist/src/chat-commands/index.js.map +1 -1
  160. package/dist/src/chat-commands/types.d.ts +17 -0
  161. package/dist/src/cli/command-loaders.js +1 -0
  162. package/dist/src/cli/command-loaders.js.map +1 -1
  163. package/dist/src/cli/command-manifest.js +4 -0
  164. package/dist/src/cli/command-manifest.js.map +1 -1
  165. package/dist/src/cli/commands/agent.js +2 -2
  166. package/dist/src/cli/commands/connectors.d.ts +4 -0
  167. package/dist/src/cli/commands/connectors.js +96 -0
  168. package/dist/src/cli/commands/connectors.js.map +1 -0
  169. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  170. package/dist/src/cli/commands/extension-marketplace.js +1 -1
  171. package/dist/src/cli/commands/gateway/lifecycle.js +1 -1
  172. package/dist/src/cli/commands/models.js +1 -1
  173. package/dist/src/cli/commands/onboard.js +1 -1
  174. package/dist/src/cli/commands/profile.js +1 -1
  175. package/dist/src/cli/commands/skills.js +1 -1
  176. package/dist/src/cli/commands/tunnel.js +1 -1
  177. package/dist/src/cli/commands/update.js +1 -1
  178. package/dist/src/cli/extension-cli-register.js +1 -1
  179. package/dist/src/config/agent-profile.js +1 -1
  180. package/dist/src/config/index.js +1 -1
  181. package/dist/src/config/schema.js +2 -2
  182. package/dist/src/config/schema.js.map +1 -1
  183. package/dist/src/connectors/health.js +1 -1
  184. package/dist/src/connectors/install.js +3 -1
  185. package/dist/src/connectors/install.js.map +1 -1
  186. package/dist/src/connectors/materialize.js +2 -0
  187. package/dist/src/connectors/materialize.js.map +1 -1
  188. package/dist/src/connectors/types.d.ts +19 -1
  189. package/dist/src/extensions/install.js +1 -1
  190. package/dist/src/extensions/types/manifest.d.ts +1 -1
  191. package/dist/src/extensions/update.js +5 -3
  192. package/dist/src/extensions/update.js.map +1 -1
  193. package/dist/src/gateway/agents-admin.js +1 -1
  194. package/dist/src/gateway/chat-stream/mapper.js +5 -1
  195. package/dist/src/gateway/chat-stream/mapper.js.map +1 -1
  196. package/dist/src/gateway/chat-stream/protocol.d.ts +2 -0
  197. package/dist/src/gateway/hono/lib/config-payload.js +1 -1
  198. package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
  199. package/dist/src/gateway/hono/middleware/auth.d.ts +2 -2
  200. package/dist/src/gateway/hono/middleware/logger.d.ts +1 -1
  201. package/dist/src/gateway/hono/middleware/route-errors.d.ts +1 -1
  202. package/dist/src/gateway/hono/middleware/strict-rate-limit.d.ts +2 -2
  203. package/dist/src/gateway/hono/routes/capabilities.d.ts +3 -0
  204. package/dist/src/gateway/hono/routes/capabilities.js +79 -0
  205. package/dist/src/gateway/hono/routes/capabilities.js.map +1 -0
  206. package/dist/src/gateway/hono/routes/commands-skills.js +81 -3
  207. package/dist/src/gateway/hono/routes/commands-skills.js.map +1 -1
  208. package/dist/src/gateway/hono/routes/connectors.js +2 -2
  209. package/dist/src/gateway/hono/routes/goals.js +212 -3
  210. package/dist/src/gateway/hono/routes/goals.js.map +1 -1
  211. package/dist/src/gateway/hono/routes/index.js +2 -0
  212. package/dist/src/gateway/hono/routes/index.js.map +1 -1
  213. package/dist/src/gateway/hono/routes/lazy-bundles.js +8 -0
  214. package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
  215. package/dist/src/gateway/hono/routes/mcp.js +1 -1
  216. package/dist/src/gateway/hono/routes/mobile.d.ts +3 -0
  217. package/dist/src/gateway/hono/routes/mobile.js +113 -0
  218. package/dist/src/gateway/hono/routes/mobile.js.map +1 -0
  219. package/dist/src/gateway/hono/routes/projects.js +17 -0
  220. package/dist/src/gateway/hono/routes/projects.js.map +1 -1
  221. package/dist/src/gateway/hono/routes/workspace.js +4 -1
  222. package/dist/src/gateway/hono/routes/workspace.js.map +1 -1
  223. package/dist/src/gateway/hono/sse.d.ts +3 -3
  224. package/dist/src/gateway/run-loop.js +1 -1
  225. package/dist/src/gateway/service/marketplace-service.d.ts +23 -1
  226. package/dist/src/gateway/service/marketplace-service.js +57 -6
  227. package/dist/src/gateway/service/marketplace-service.js.map +1 -1
  228. package/dist/src/gateway/service.d.ts +2 -0
  229. package/dist/src/gateway/service.js +12 -2
  230. package/dist/src/gateway/service.js.map +1 -1
  231. package/dist/src/goals/goal-contract-draft.d.ts +15 -0
  232. package/dist/src/goals/goal-contract-draft.js +114 -0
  233. package/dist/src/goals/goal-contract-draft.js.map +1 -0
  234. package/dist/src/goals/goal-evidence-review.d.ts +15 -0
  235. package/dist/src/goals/goal-evidence-review.js +91 -0
  236. package/dist/src/goals/goal-evidence-review.js.map +1 -0
  237. package/dist/src/goals/goal-runner.js +3 -1
  238. package/dist/src/goals/goal-runner.js.map +1 -1
  239. package/dist/src/goals/goal-service.d.ts +17 -1
  240. package/dist/src/goals/goal-service.js +44 -3
  241. package/dist/src/goals/goal-service.js.map +1 -1
  242. package/dist/src/goals/goal-store.d.ts +18 -1
  243. package/dist/src/goals/goal-store.js +190 -1
  244. package/dist/src/goals/goal-store.js.map +1 -1
  245. package/dist/src/goals/index.d.ts +4 -0
  246. package/dist/src/goals/index.js +3 -1
  247. package/dist/src/goals/types.d.ts +42 -0
  248. package/dist/src/mcp/channel-bridge.js +1 -1
  249. package/dist/src/mobile/notification-service.d.ts +8 -0
  250. package/dist/src/mobile/notification-service.js +139 -0
  251. package/dist/src/mobile/notification-service.js.map +1 -0
  252. package/dist/src/mobile/notification-store.d.ts +28 -0
  253. package/dist/src/mobile/notification-store.js +134 -0
  254. package/dist/src/mobile/notification-store.js.map +1 -0
  255. package/dist/src/mobile/notification-types.d.ts +37 -0
  256. package/dist/src/mobile/notification-types.js +11 -0
  257. package/dist/src/mobile/notification-types.js.map +1 -0
  258. package/dist/src/storage/sqlite/migrations/026_goal_contracts.sql +10 -0
  259. package/dist/src/storage/sqlite/migrations/027_mobile_notifications.sql +43 -0
  260. package/dist/src/storage/sqlite/migrations/028_goal_evidence_requirements.sql +47 -0
  261. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  262. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  263. package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
  264. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  265. package/dist/src/storage/sqlite/schema.js +1 -1
  266. package/dist/src/storage/sqlite/schema.sql +44 -0
  267. package/dist/src/tui/tui-startup-resources.js +1 -1
  268. package/package.json +1 -1
  269. package/skills/THIRD_PARTY_NOTICES.md +16 -0
  270. package/skills/creative/algorithmic-art/SKILL.md +37 -0
  271. package/skills/creative/algorithmic-art/templates/generator-template.js +27 -0
  272. package/skills/creative/algorithmic-art/templates/viewer.html +27 -0
  273. package/skills/documents/doc-coauthoring/SKILL.md +40 -0
  274. package/skills/documents/doc-coauthoring/references/reader-review.md +9 -0
  275. package/skills/documents/docx/SKILL.md +40 -0
  276. package/skills/documents/docx/references/editing-checklist.md +8 -0
  277. package/skills/documents/docx/scripts/inspect_ooxml.py +36 -0
  278. package/skills/documents/docx/scripts/render_docx.py +33 -0
  279. package/skills/documents/pdf/SKILL.md +47 -0
  280. package/skills/documents/pdf/references/operations.md +16 -0
  281. package/skills/documents/pdf/scripts/inspect_pdf.py +41 -0
  282. package/skills/documents/pdf/scripts/render_pdf.py +32 -0
  283. package/skills/documents/pptx/SKILL.md +41 -0
  284. package/skills/documents/pptx/references/qa-checklist.md +6 -0
  285. package/skills/documents/pptx/scripts/inspect_ooxml.py +34 -0
  286. package/skills/documents/pptx/scripts/render_pptx.py +33 -0
  287. package/skills/engineering/define-goal/SKILL.md +41 -0
  288. package/skills/engineering/define-goal/references/objective-rubric.md +12 -0
  289. package/dist/gateway/static/root/assets/agents-k59l7NMb.js +0 -2
  290. package/dist/gateway/static/root/assets/app-management-settings-panel-DeQsTsyy.js +0 -1
  291. package/dist/gateway/static/root/assets/apps-page-BG9b4abG.js +0 -1
  292. package/dist/gateway/static/root/assets/automations-page-De8mVutL.js +0 -4
  293. package/dist/gateway/static/root/assets/browser-settings-page-C_ZRa4LF.js +0 -8
  294. package/dist/gateway/static/root/assets/capability-presets-api-hny224j-.js +0 -1
  295. package/dist/gateway/static/root/assets/capability-presets-settings-panel-Drc0qLsw.js +0 -1
  296. package/dist/gateway/static/root/assets/channel-recipient-api-DAlOHxKJ.js +0 -1
  297. package/dist/gateway/static/root/assets/channels-settings-CA20zBV9.js +0 -1
  298. package/dist/gateway/static/root/assets/connectors-page-qMyMB5te.js +0 -2
  299. package/dist/gateway/static/root/assets/desktop-pet-XG6Vb_fZ.js +0 -1
  300. package/dist/gateway/static/root/assets/dreaming-settings-CkUZ997f.js +0 -3
  301. package/dist/gateway/static/root/assets/extension-settings-page-3RMhQtZ3.js +0 -1
  302. package/dist/gateway/static/root/assets/fetch-pg2ErdAk.js +0 -1
  303. package/dist/gateway/static/root/assets/gateway-config-api-DbG97ia2.js +0 -1
  304. package/dist/gateway/static/root/assets/gateway-settings-B8cyqKk-.js +0 -1
  305. package/dist/gateway/static/root/assets/goal-create-dialog-DmeW7Zz3.js +0 -1
  306. package/dist/gateway/static/root/assets/goal-detail-page-DrTyGbVD.js +0 -1
  307. package/dist/gateway/static/root/assets/goals-config-api-CxCWGIBB.js +0 -1
  308. package/dist/gateway/static/root/assets/goals-page-DV1bJhIh.js +0 -2
  309. package/dist/gateway/static/root/assets/goals-settings-9DrfOkP5.js +0 -1
  310. package/dist/gateway/static/root/assets/heartbeat-settings-KaDpZrv0.js +0 -1
  311. package/dist/gateway/static/root/assets/index-C2F0Clvm.js +0 -256
  312. package/dist/gateway/static/root/assets/index-COQSX5d_.css +0 -1
  313. package/dist/gateway/static/root/assets/logs-page-C9dpiNTF.js +0 -2
  314. package/dist/gateway/static/root/assets/messages-DmnbiNxU.js +0 -3
  315. package/dist/gateway/static/root/assets/models-hub-panel-zdCdmBmH.js +0 -2
  316. package/dist/gateway/static/root/assets/notes-page-MpGeFfPt.js +0 -1
  317. package/dist/gateway/static/root/assets/notes-workbench-DYCM3yd2.js +0 -2
  318. package/dist/gateway/static/root/assets/project-detail-page-Cu0ElRnS.js +0 -1
  319. package/dist/gateway/static/root/assets/projects-page-DakNaUjZ.js +0 -1
  320. package/dist/gateway/static/root/assets/remote-access-hub-DYKjt7L9.js +0 -1
  321. package/dist/gateway/static/root/assets/sessions-page-CcGHDsz1.js +0 -1
  322. package/dist/gateway/static/root/assets/settings-advanced-gate-CuFdeKNu.js +0 -1
  323. package/dist/gateway/static/root/assets/settings-page-0AJoUvxi.js +0 -1
  324. package/dist/gateway/static/root/assets/setup-status-panel-D6a_hEk7.js +0 -1
  325. package/dist/gateway/static/root/assets/share-preview-page-BtsuETKF.js +0 -2
  326. package/dist/gateway/static/root/assets/shares-settings-CcEFT7S9.js +0 -1
  327. package/dist/gateway/static/root/assets/skill-reload-api-BcN_RuTD.js +0 -1
  328. package/dist/gateway/static/root/assets/skills-page-BbRZZZA5.js +0 -2
  329. package/dist/gateway/static/root/assets/use-channel-catalog-C6vrxdzZ.js +0 -1
  330. package/dist/gateway/static/root/assets/user-profile-settings-panel-DZ0nKMgj.js +0 -1
  331. package/dist/gateway/static/root/assets/vendor-codemirror-BvNgyE1Q.js +0 -45
  332. package/dist/gateway/static/root/assets/voice-api-key-field-2QKflCx8.js +0 -1
  333. package/dist/gateway/static/root/assets/work-item-detail-page-DfJnuWq1.js +0 -1
  334. package/dist/gateway/static/root/assets/workflows-page-BJwwFTm_.js +0 -18
@@ -554,6 +554,17 @@ CREATE TABLE IF NOT EXISTS goal_context_messages (
554
554
  FOREIGN KEY (goal_id) REFERENCES goals(goal_id) ON DELETE CASCADE
555
555
  );
556
556
 
557
+ CREATE TABLE IF NOT EXISTS goal_contracts (
558
+ goal_id TEXT PRIMARY KEY,
559
+ version INTEGER NOT NULL DEFAULT 1,
560
+ objective TEXT NOT NULL,
561
+ scope_boundary TEXT,
562
+ evidence_plan_json TEXT NOT NULL DEFAULT '[]',
563
+ created_at INTEGER NOT NULL,
564
+ updated_at INTEGER NOT NULL,
565
+ FOREIGN KEY (goal_id) REFERENCES goals(goal_id) ON DELETE CASCADE
566
+ );
567
+
557
568
  CREATE TABLE IF NOT EXISTS goal_queue (
558
569
  queue_id TEXT PRIMARY KEY,
559
570
  goal_id TEXT NOT NULL,
@@ -650,6 +661,39 @@ CREATE TABLE IF NOT EXISTS goal_evidence (
650
661
  CREATE INDEX IF NOT EXISTS idx_goal_evidence_goal_created
651
662
  ON goal_evidence(goal_id, created_at DESC);
652
663
 
664
+ CREATE TABLE IF NOT EXISTS goal_evidence_requirements (
665
+ requirement_id TEXT PRIMARY KEY,
666
+ goal_id TEXT NOT NULL,
667
+ text TEXT NOT NULL,
668
+ status TEXT NOT NULL DEFAULT 'pending',
669
+ review_reason TEXT,
670
+ review_confidence REAL,
671
+ reviewed_by TEXT,
672
+ reviewed_at INTEGER,
673
+ requires_human_approval INTEGER NOT NULL DEFAULT 1,
674
+ created_at INTEGER NOT NULL,
675
+ updated_at INTEGER NOT NULL,
676
+ sort_order INTEGER NOT NULL,
677
+ UNIQUE(goal_id, text),
678
+ FOREIGN KEY (goal_id) REFERENCES goals(goal_id) ON DELETE CASCADE
679
+ );
680
+
681
+ CREATE INDEX IF NOT EXISTS idx_goal_evidence_requirements_goal_order
682
+ ON goal_evidence_requirements(goal_id, sort_order ASC);
683
+
684
+ CREATE TABLE IF NOT EXISTS goal_evidence_requirement_links (
685
+ requirement_id TEXT NOT NULL,
686
+ evidence_id TEXT NOT NULL,
687
+ linked_by TEXT NOT NULL,
688
+ created_at INTEGER NOT NULL,
689
+ PRIMARY KEY (requirement_id, evidence_id),
690
+ FOREIGN KEY (requirement_id) REFERENCES goal_evidence_requirements(requirement_id) ON DELETE CASCADE,
691
+ FOREIGN KEY (evidence_id) REFERENCES goal_evidence(evidence_id) ON DELETE CASCADE
692
+ );
693
+
694
+ CREATE INDEX IF NOT EXISTS idx_goal_evidence_requirement_links_evidence
695
+ ON goal_evidence_requirement_links(evidence_id);
696
+
653
697
  CREATE TABLE IF NOT EXISTS goal_session_links (
654
698
  goal_id TEXT NOT NULL,
655
699
  session_key TEXT NOT NULL,
@@ -5,9 +5,9 @@ import { resolveBootstrapFilesSync } from "../agent/bootstrap/bootstrap-files.js
5
5
  import { createWorkflowCatalog } from "../agent/workflow/catalog.js";
6
6
  import { createSkillConfigManager, isSkillEnabled } from "../agent/skills/config.js";
7
7
  import { loadSkills } from "../agent/skills/index.js";
8
+ import { listConnectorInstances } from "../connectors/instances.js";
8
9
  import { getWorkspacePath } from "../config/workspace-path-helpers.js";
9
10
  import "../config/index.js";
10
- import { listConnectorInstances } from "../connectors/instances.js";
11
11
  import { basename } from "node:path";
12
12
  //#region src/tui/tui-startup-resources.ts
13
13
  init_paths();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xopcai/xopc",
3
- "version": "0.0.127",
3
+ "version": "0.0.129",
4
4
  "description": "Local-first AI system that remembers context, coordinates AI, and sustains long-term progress.",
5
5
  "type": "module",
6
6
  "main": "dist/src/index.js",
@@ -0,0 +1,16 @@
1
+ # Skill provenance
2
+
3
+ The skills in this directory are maintained as part of xopc.
4
+
5
+ ## 2026-07 built-in capability packs
6
+
7
+ - `engineering/define-goal` and `creative/algorithmic-art` were designed after reviewing
8
+ Apache-2.0-licensed reference material supplied during product planning. Their instructions and
9
+ assets in this repository were written independently for xopc; no reference files or branding
10
+ are redistributed here.
11
+ - `documents/pdf`, `documents/docx`, `documents/pptx`, and
12
+ `documents/doc-coauthoring` are clean-room xopc instructions. They do not contain text,
13
+ scripts, templates, or assets from the restricted reference materials reviewed during planning.
14
+
15
+ Before replacing an xopc skill with externally sourced material, confirm that its license permits
16
+ copying, modification, and redistribution in the xopc npm package.
@@ -0,0 +1,37 @@
1
+ ---
2
+ name: algorithmic-art
3
+ description: Design reproducible, interactive generative-art studies as self-contained browser artifacts or workspace assets.
4
+ metadata:
5
+ xopc:
6
+ emoji: "✨"
7
+ requires_tools:
8
+ - write_file
9
+ - image_generate
10
+ ---
11
+
12
+ # Generative art
13
+
14
+ Use this skill when the user asks for algorithmic or generative visual work. Build an expressive system,
15
+ not a static image with random decoration.
16
+
17
+ ## Creative process
18
+
19
+ 1. Extract a compact conceptual seed from the brief: mood, reference, material, motion, or tension.
20
+ 2. Describe the system in plain language: its rules, forces, palette logic, and source of variation.
21
+ 3. Implement a reproducible artifact with a visible seed and a small set of meaningful parameters.
22
+ 4. Make the controls change the system's behaviour, not just cosmetic values.
23
+ 5. Inspect several seeds and tune density, contrast, performance, and composition before delivery.
24
+
25
+ ## Artifact rules
26
+
27
+ - Prefer a self-contained HTML artifact for interactive work. It may load a stable public rendering
28
+ library when necessary, but all artwork logic and controls belong in the artifact.
29
+ - Keep the interface neutral and xopc-branded; do not reproduce another product's styling or marks.
30
+ - Include seed navigation, reset, regeneration, and export when creating an interactive browser piece.
31
+ - Use seeded pseudo-randomness so the same seed and parameters produce the same result.
32
+ - Respect the user's visual references without claiming an artist's identity or copying protected work.
33
+
34
+ ## Included resources
35
+
36
+ - `templates/viewer.html`: a neutral, self-contained starting point with seed and export controls.
37
+ - `templates/generator-template.js`: a compact seeded-system scaffold.
@@ -0,0 +1,27 @@
1
+ // Bundled algorithmic-art starter.
2
+ let seed = 1;
3
+ let params = { density: 180, drift: 0.008, scale: 0.015 };
4
+
5
+ function seededRandom(value) {
6
+ const x = Math.sin(value) * 10000;
7
+ return x - Math.floor(x);
8
+ }
9
+
10
+ function field(x, y, index) {
11
+ return Math.sin(x * params.scale + index) + Math.cos(y * params.scale - index * params.drift);
12
+ }
13
+
14
+ function createStudy(canvas, context) {
15
+ context.clearRect(0, 0, canvas.width, canvas.height);
16
+ context.fillStyle = '#f7f8fc';
17
+ context.fillRect(0, 0, canvas.width, canvas.height);
18
+ for (let index = 0; index < params.density; index += 1) {
19
+ const x = seededRandom(seed + index * 17) * canvas.width;
20
+ const y = seededRandom(seed + index * 31) * canvas.height;
21
+ const hue = 210 + field(x, y, index) * 28;
22
+ context.fillStyle = `hsla(${hue}, 62%, 38%, 0.45)`;
23
+ context.beginPath();
24
+ context.arc(x, y, 2 + Math.abs(field(x, y, index)) * 4, 0, Math.PI * 2);
25
+ context.fill();
26
+ }
27
+ }
@@ -0,0 +1,27 @@
1
+ <!doctype html><!-- Bundled algorithmic-art viewer. -->
2
+ <html lang="en">
3
+ <meta charset="utf-8">
4
+ <meta name="viewport" content="width=device-width, initial-scale=1">
5
+ <title>Generative study</title>
6
+ <style>
7
+ body { margin: 0; background: #eef1f7; color: #172033; font: 14px/1.4 system-ui, sans-serif; }
8
+ main { display: grid; gap: 16px; grid-template-columns: minmax(0, 1fr) 260px; max-width: 1100px; margin: 32px auto; padding: 0 20px; }
9
+ canvas { width: 100%; aspect-ratio: 1; background: #f7f8fc; border: 1px solid #cbd3e1; }
10
+ aside { align-self: start; padding: 16px; background: #fff; border: 1px solid #cbd3e1; border-radius: 10px; }
11
+ label, button { display: block; width: 100%; margin: 0 0 10px; } button { padding: 8px; }
12
+ </style>
13
+ <main>
14
+ <canvas id="art" width="900" height="900"></canvas>
15
+ <aside>
16
+ <label>Seed <input id="seed" type="number" value="1"></label>
17
+ <button id="previous">Previous seed</button><button id="next">Next seed</button>
18
+ <button id="random">Random seed</button><button id="export">Export PNG</button>
19
+ </aside>
20
+ </main>
21
+ <script>
22
+ const canvas = document.querySelector('#art'); const context = canvas.getContext('2d');
23
+ let seed = 1; const draw = () => { context.fillStyle = '#f7f8fc'; context.fillRect(0, 0, 900, 900); for (let i = 0; i < 180; i += 1) { const n = Math.sin(seed * 13 + i * 19) * 10000; const r = n - Math.floor(n); context.fillStyle = `hsla(${190 + r * 90},65%,40%,.45)`; context.beginPath(); context.arc(r * 900, ((Math.sin(seed + i * 7) + 1) / 2) * 900, 3 + r * 7, 0, Math.PI * 2); context.fill(); } };
24
+ const setSeed = value => { seed = Number(value); document.querySelector('#seed').value = seed; draw(); };
25
+ document.querySelector('#seed').onchange = event => setSeed(event.target.value); document.querySelector('#previous').onclick = () => setSeed(seed - 1); document.querySelector('#next').onclick = () => setSeed(seed + 1); document.querySelector('#random').onclick = () => setSeed(Math.floor(Math.random() * 2 ** 31)); document.querySelector('#export').onclick = () => { const link = document.createElement('a'); link.href = canvas.toDataURL('image/png'); link.download = `study-${seed}.png`; link.click(); }; draw();
26
+ </script>
27
+ </html>
@@ -0,0 +1,40 @@
1
+ ---
2
+ name: doc-coauthoring
3
+ description: Co-author substantial proposals, specifications, RFCs, and decision documents through context, structure, and reader-focused review.
4
+ metadata:
5
+ xopc:
6
+ emoji: "🤝"
7
+ requires_tools:
8
+ - read_file
9
+ - write_file
10
+ ---
11
+
12
+ # Document co-authoring
13
+
14
+ Use this workflow for substantial documentation, proposals, specifications, or decision records.
15
+ Offer it as a structured option; if the user prefers a direct draft, work directly.
16
+
17
+ ## 1. Establish context
18
+
19
+ Identify the document type, primary readers, intended decision or effect, deadline, required format,
20
+ and known constraints. Invite an unstructured context dump and separate facts, assumptions, open
21
+ questions, and stakeholder concerns.
22
+
23
+ ## 2. Build the document
24
+
25
+ Propose an outline before writing long sections. Develop one section at a time, keeping alternatives
26
+ and rejected options visible where they affect the decision. Use concrete ownership, dates, criteria,
27
+ and dependencies instead of vague future promises.
28
+
29
+ ## 3. Reader review
30
+
31
+ Predict the questions a reader without the author's context will ask. Check that the document answers
32
+ them, that terms are defined, and that the recommendation follows from the evidence. A separate-agent
33
+ reader test is optional and requires the user's approval before delegation.
34
+
35
+ ## Completion
36
+
37
+ Deliver a clean draft plus a short list of unresolved facts, decisions, and requested review. Do not
38
+ invent citations, commitments, estimates, or approvals.
39
+
40
+ Use `references/reader-review.md` when performing the final reader-focused pass.
@@ -0,0 +1,9 @@
1
+ # Reader review prompts
2
+
3
+ Review the draft as a reader who did not attend the prior discussion:
4
+
5
+ - What decision, action, or approval is requested?
6
+ - What problem and constraints make that action necessary now?
7
+ - Which alternatives were considered, and why is the recommendation preferable?
8
+ - What must happen next, by whom, and by when?
9
+ - Which claims need a source, owner, estimate, or explicit assumption label?
@@ -0,0 +1,40 @@
1
+ ---
2
+ name: docx
3
+ description: Create, inspect, edit, render, and validate Word DOCX artifacts while preserving templates and tracked content.
4
+ metadata:
5
+ xopc:
6
+ emoji: "📝"
7
+ requires_tools:
8
+ - read_file
9
+ - write_file
10
+ - exec_command
11
+ ---
12
+
13
+ # DOCX workbench
14
+
15
+ Use this skill for Word documents and `.docx` artifacts. A DOCX is a package of XML parts; protect
16
+ the package structure and preserve source files unless the user explicitly requests replacement.
17
+
18
+ ## Create and edit
19
+
20
+ 1. Inspect an existing document before editing: page size, margins, headings, sections, headers,
21
+ footers, tables, images, comments, and tracked changes.
22
+ 2. When a template exists, match its styles and layout. Do not impose a new design system.
23
+ 3. For a new document, set page size and named styles intentionally; use semantic headings, real
24
+ lists, and accessible descriptive text for meaningful images.
25
+ 4. Save a new output file, then validate package integrity and render it for visual review.
26
+
27
+ ## Verification
28
+
29
+ - Check expected headings, tables, links, and page breaks after generation.
30
+ - Inspect at least the first page and each altered page when layout matters.
31
+ - Preserve tracked changes and comments by default. Accept, reject, or delete them only with explicit
32
+ user direction.
33
+ - If a conversion or renderer is unavailable, say so and leave the document unmodified rather than
34
+ guessing at an XML edit.
35
+
36
+ ## Included resources
37
+
38
+ - `scripts/inspect_ooxml.py`: lists package parts and extracts a bounded text preview.
39
+ - `scripts/render_docx.py`: converts a DOCX to PDF with local LibreOffice and renders pages to PNG.
40
+ - `references/editing-checklist.md`: template-preserving edit and QA checklist.
@@ -0,0 +1,8 @@
1
+ # DOCX editing checklist for the bundled skill
2
+
3
+ Before editing, record the template's page size, section breaks, heading styles, headers/footers,
4
+ table style, and whether revisions or comments exist. After editing, inspect altered pages for broken
5
+ wrapping, split tables, missing headers, and unintended style substitution.
6
+
7
+ Use `scripts/inspect_ooxml.py` before and after a structural edit. Use `scripts/render_docx.py` for
8
+ visual QA when LibreOffice and Poppler are installed.
@@ -0,0 +1,36 @@
1
+ #!/usr/bin/env python3
2
+ """Inspect the structure of a DOCX package without changing it for the bundled skill."""
3
+
4
+ import argparse
5
+ import json
6
+ import re
7
+ import zipfile
8
+ from pathlib import Path
9
+
10
+
11
+ def main() -> None:
12
+ parser = argparse.ArgumentParser(description="Inspect a DOCX package")
13
+ parser.add_argument("input", type=Path)
14
+ parser.add_argument("--max-chars", type=int, default=4000)
15
+ args = parser.parse_args()
16
+
17
+ if not args.input.is_file() or args.input.suffix.lower() != ".docx":
18
+ raise SystemExit("input must be an existing .docx file")
19
+
20
+ with zipfile.ZipFile(args.input) as archive:
21
+ parts = sorted(archive.namelist())
22
+ document_xml = archive.read("word/document.xml").decode("utf-8", errors="replace")
23
+
24
+ text = " ".join(re.findall(r"<w:t[^>]*>(.*?)</w:t>", document_xml))
25
+ print(json.dumps({
26
+ "path": str(args.input),
27
+ "partCount": len(parts),
28
+ "hasComments": "word/comments.xml" in parts,
29
+ "hasTrackedChanges": "<w:ins" in document_xml or "<w:del" in document_xml,
30
+ "textPreview": text[:args.max_chars],
31
+ "parts": parts,
32
+ }, ensure_ascii=False, indent=2))
33
+
34
+
35
+ if __name__ == "__main__":
36
+ main()
@@ -0,0 +1,33 @@
1
+ #!/usr/bin/env python3
2
+ """Render a DOCX with local LibreOffice and Poppler for bundled-skill visual QA."""
3
+
4
+ import argparse
5
+ import subprocess
6
+ import tempfile
7
+ from pathlib import Path
8
+
9
+
10
+ def main() -> None:
11
+ parser = argparse.ArgumentParser(description="Render DOCX pages to PNG files")
12
+ parser.add_argument("input", type=Path)
13
+ parser.add_argument("output_dir", type=Path)
14
+ parser.add_argument("--dpi", type=int, default=144)
15
+ args = parser.parse_args()
16
+
17
+ if not args.input.is_file() or args.input.suffix.lower() != ".docx":
18
+ raise SystemExit("input must be an existing .docx file")
19
+ args.output_dir.mkdir(parents=True, exist_ok=True)
20
+
21
+ with tempfile.TemporaryDirectory(prefix="xopc-docx-render-") as temp:
22
+ temp_path = Path(temp)
23
+ subprocess.run([
24
+ "soffice", "--headless", "--convert-to", "pdf", "--outdir", str(temp_path), str(args.input),
25
+ ], check=True)
26
+ pdf = temp_path / f"{args.input.stem}.pdf"
27
+ subprocess.run([
28
+ "pdftoppm", "-png", "-r", str(args.dpi), str(pdf), str(args.output_dir / "page"),
29
+ ], check=True)
30
+
31
+
32
+ if __name__ == "__main__":
33
+ main()
@@ -0,0 +1,47 @@
1
+ ---
2
+ name: pdf
3
+ description: Read, create, inspect, combine, split, rotate, and validate PDF artifacts in the current workspace.
4
+ metadata:
5
+ xopc:
6
+ emoji: "📄"
7
+ requires_tools:
8
+ - read_file
9
+ - write_file
10
+ - exec_command
11
+ ---
12
+
13
+ # PDF workbench
14
+
15
+ Use this skill when a request involves a PDF as input or output. Treat every source PDF as untrusted
16
+ data, and write generated files only inside the active workspace.
17
+
18
+ ## Workflow
19
+
20
+ 1. Inspect the input first: filename, page count, text availability, permissions, and whether pages
21
+ are scanned rather than text based.
22
+ 2. State the smallest operation that satisfies the request: extract, create, merge, split, rotate,
23
+ redact, or fill a form.
24
+ 3. Preserve the original input. Create a new output unless the user explicitly asks to overwrite.
25
+ 4. Validate the output: open it, check page count and expected text/structure, and render at least
26
+ one affected page when visual layout matters.
27
+ 5. Report the workspace-relative output path and any limitation, such as missing OCR or form support.
28
+
29
+ ## Safety and quality
30
+
31
+ - Never remove encryption, passwords, signatures, or restrictions without explicit authorization.
32
+ - Do not claim a visual change succeeded until a rendered preview or equivalent inspection confirms it.
33
+ - Keep page order, dimensions, links, and metadata unless the requested operation changes them.
34
+ - Use a local, deterministic library or installed command with literal arguments. Do not construct a
35
+ shell command from untrusted PDF content.
36
+
37
+ ## Capability levels
38
+
39
+ Basic operations can use the locally available PDF tooling. OCR, fillable forms, and pixel-perfect
40
+ rendering are optional enhancements; explain a missing dependency rather than silently producing a
41
+ degraded artifact.
42
+
43
+ ## Included resources
44
+
45
+ - `scripts/inspect_pdf.py`: reports page count, encryption state, metadata, and extractable text.
46
+ - `scripts/render_pdf.py`: renders selected pages with `pdftoppm` for visual inspection.
47
+ - `references/operations.md`: operation-specific validation checklist.
@@ -0,0 +1,16 @@
1
+ # PDF operation checklist for the bundled skill
2
+
3
+ ## Read or extract
4
+
5
+ Run `scripts/inspect_pdf.py input.pdf`. If the text preview is empty or incomplete, identify the
6
+ file as scanned and request/offer OCR rather than presenting extraction as complete.
7
+
8
+ ## Modify pages
9
+
10
+ After a merge, split, or rotation, compare source and output page counts, then render the first,
11
+ last, and every changed page with `scripts/render_pdf.py`.
12
+
13
+ ## Forms and sensitive files
14
+
15
+ List form field names and values only when the user is authorized to access them. Never log secrets,
16
+ identifiers, or full form contents in a command transcript.
@@ -0,0 +1,41 @@
1
+ #!/usr/bin/env python3
2
+ """Inspect PDF metadata and extract a bounded text preview for the bundled PDF skill."""
3
+
4
+ import argparse
5
+ import json
6
+ from pathlib import Path
7
+
8
+
9
+ def main() -> None:
10
+ parser = argparse.ArgumentParser(description="Inspect a PDF without modifying it")
11
+ parser.add_argument("input", type=Path)
12
+ parser.add_argument("--max-chars", type=int, default=4000)
13
+ args = parser.parse_args()
14
+
15
+ if not args.input.is_file() or args.input.suffix.lower() != ".pdf":
16
+ raise SystemExit("input must be an existing .pdf file")
17
+
18
+ try:
19
+ from pypdf import PdfReader
20
+ except ModuleNotFoundError as error:
21
+ raise SystemExit("pypdf is required: install it in the active Python environment") from error
22
+
23
+ reader = PdfReader(str(args.input))
24
+ preview = ""
25
+ if not reader.is_encrypted:
26
+ for page in reader.pages:
27
+ preview += page.extract_text() or ""
28
+ if len(preview) >= args.max_chars:
29
+ break
30
+
31
+ print(json.dumps({
32
+ "path": str(args.input),
33
+ "pages": len(reader.pages),
34
+ "encrypted": reader.is_encrypted,
35
+ "metadata": {key: str(value) for key, value in (reader.metadata or {}).items()},
36
+ "textPreview": preview[:args.max_chars],
37
+ }, ensure_ascii=False, indent=2))
38
+
39
+
40
+ if __name__ == "__main__":
41
+ main()
@@ -0,0 +1,32 @@
1
+ #!/usr/bin/env python3
2
+ """Render a PDF page range with Poppler for the bundled PDF skill."""
3
+
4
+ import argparse
5
+ import subprocess
6
+ from pathlib import Path
7
+
8
+
9
+ def main() -> None:
10
+ parser = argparse.ArgumentParser(description="Render PDF pages to PNG files")
11
+ parser.add_argument("input", type=Path)
12
+ parser.add_argument("output_dir", type=Path)
13
+ parser.add_argument("--first-page", type=int, default=1)
14
+ parser.add_argument("--last-page", type=int)
15
+ parser.add_argument("--dpi", type=int, default=144)
16
+ args = parser.parse_args()
17
+
18
+ if not args.input.is_file() or args.input.suffix.lower() != ".pdf":
19
+ raise SystemExit("input must be an existing .pdf file")
20
+ if args.first_page < 1 or args.dpi < 36:
21
+ raise SystemExit("first page must be positive and dpi must be at least 36")
22
+
23
+ args.output_dir.mkdir(parents=True, exist_ok=True)
24
+ command = ["pdftoppm", "-png", "-r", str(args.dpi), "-f", str(args.first_page)]
25
+ if args.last_page is not None:
26
+ command.extend(["-l", str(args.last_page)])
27
+ command.extend([str(args.input), str(args.output_dir / "page")])
28
+ subprocess.run(command, check=True)
29
+
30
+
31
+ if __name__ == "__main__":
32
+ main()
@@ -0,0 +1,41 @@
1
+ ---
2
+ name: pptx
3
+ description: Create, inspect, edit, render, and validate PowerPoint PPTX presentations with deliberate visual hierarchy.
4
+ metadata:
5
+ xopc:
6
+ emoji: "📊"
7
+ requires_tools:
8
+ - read_file
9
+ - write_file
10
+ - exec_command
11
+ ---
12
+
13
+ # PPTX studio
14
+
15
+ Use this skill for slide decks and `.pptx` files. Preserve supplied templates and always visually
16
+ inspect changed slides before calling the result complete.
17
+
18
+ ## Workflow
19
+
20
+ 1. Inspect the deck's slide size, master/layout use, typography, palette, notes, and representative
21
+ slides before editing.
22
+ 2. Draft the narrative first: audience, decision or action, slide sequence, and evidence per slide.
23
+ 3. Reuse the template's layouts when one is supplied. For new decks, establish a small type scale,
24
+ restrained palette, and one consistent visual motif.
25
+ 4. Make every slide earn its space. Prefer diagrams, data, images, or meaningful shapes over dense
26
+ bullet lists.
27
+ 5. Render a contact sheet and inspect every modified slide for clipping, overlap, unreadable text,
28
+ contrast, and broken media.
29
+
30
+ ## Guardrails
31
+
32
+ - Do not overwrite a source presentation unless the user explicitly requests it.
33
+ - Preserve speaker notes, comments, and hidden slides unless the request changes them.
34
+ - Keep data claims traceable; label estimates and placeholders.
35
+ - Report the output path and any slides that require a human visual decision.
36
+
37
+ ## Included resources
38
+
39
+ - `scripts/inspect_ooxml.py`: inventories slides, notes, and embedded media.
40
+ - `scripts/render_pptx.py`: converts a deck with local LibreOffice and creates PNG slide previews.
41
+ - `references/qa-checklist.md`: narrative and visual review checklist.
@@ -0,0 +1,6 @@
1
+ # Presentation QA checklist for the bundled skill
2
+
3
+ Check the audience and takeaway for each slide, then inspect rendered previews for clipped text,
4
+ overlap, illegible contrast, inconsistent alignment, missing images, and unintentional blank space.
5
+ Confirm that titles tell the narrative without relying on spoken explanation and that notes remain
6
+ present when the source deck used them.
@@ -0,0 +1,34 @@
1
+ #!/usr/bin/env python3
2
+ """Inspect PPTX slide and media structure without modifying it for the bundled skill."""
3
+
4
+ import argparse
5
+ import json
6
+ import zipfile
7
+ from pathlib import Path
8
+
9
+
10
+ def main() -> None:
11
+ parser = argparse.ArgumentParser(description="Inspect a PPTX package")
12
+ parser.add_argument("input", type=Path)
13
+ args = parser.parse_args()
14
+
15
+ if not args.input.is_file() or args.input.suffix.lower() != ".pptx":
16
+ raise SystemExit("input must be an existing .pptx file")
17
+
18
+ with zipfile.ZipFile(args.input) as archive:
19
+ parts = archive.namelist()
20
+ slides = sorted(part for part in parts if part.startswith("ppt/slides/slide") and part.endswith(".xml"))
21
+ notes = sorted(part for part in parts if part.startswith("ppt/notesSlides/") and part.endswith(".xml"))
22
+ media = sorted(part for part in parts if part.startswith("ppt/media/"))
23
+ print(json.dumps({
24
+ "path": str(args.input),
25
+ "slideCount": len(slides),
26
+ "noteSlideCount": len(notes),
27
+ "mediaCount": len(media),
28
+ "slides": slides,
29
+ "media": media,
30
+ }, ensure_ascii=False, indent=2))
31
+
32
+
33
+ if __name__ == "__main__":
34
+ main()
@@ -0,0 +1,33 @@
1
+ #!/usr/bin/env python3
2
+ """Render a PPTX with local LibreOffice and Poppler for bundled-skill slide QA."""
3
+
4
+ import argparse
5
+ import subprocess
6
+ import tempfile
7
+ from pathlib import Path
8
+
9
+
10
+ def main() -> None:
11
+ parser = argparse.ArgumentParser(description="Render PPTX slides to PNG files")
12
+ parser.add_argument("input", type=Path)
13
+ parser.add_argument("output_dir", type=Path)
14
+ parser.add_argument("--dpi", type=int, default=144)
15
+ args = parser.parse_args()
16
+
17
+ if not args.input.is_file() or args.input.suffix.lower() != ".pptx":
18
+ raise SystemExit("input must be an existing .pptx file")
19
+ args.output_dir.mkdir(parents=True, exist_ok=True)
20
+
21
+ with tempfile.TemporaryDirectory(prefix="xopc-pptx-render-") as temp:
22
+ temp_path = Path(temp)
23
+ subprocess.run([
24
+ "soffice", "--headless", "--convert-to", "pdf", "--outdir", str(temp_path), str(args.input),
25
+ ], check=True)
26
+ pdf = temp_path / f"{args.input.stem}.pdf"
27
+ subprocess.run([
28
+ "pdftoppm", "-png", "-r", str(args.dpi), str(pdf), str(args.output_dir / "slide"),
29
+ ], check=True)
30
+
31
+
32
+ if __name__ == "__main__":
33
+ main()