forge-openclaw-plugin 0.3.16 → 0.3.18
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.
- package/dist/assets/{action-bar-DgrmzFrI.js → action-bar-BAZevCEA.js} +1 -1
- package/dist/assets/{activity-page-CF451ueg.js → activity-page-CnT_hnCU.js} +1 -1
- package/dist/assets/{ai-surface-workspace-DtwybxJB.js → ai-surface-workspace-GPZzIIut.js} +1 -1
- package/dist/assets/artifacts-page-Bqjp0L-L.js +2 -0
- package/dist/assets/{atlas-panel-CB3uYk_K.js → atlas-panel-B95nrYpZ.js} +1 -1
- package/dist/assets/{board-CuxQRKPJ.js → board-CGgOvBP9.js} +1 -1
- package/dist/assets/{calendar-page-BYsDuLnh.js → calendar-page-mlr94wIS.js} +1 -1
- package/dist/assets/{calendar-rules-DXuOv2J-.js → calendar-rules-DdxPmBZJ.js} +1 -1
- package/dist/assets/{calendar-week-toolbar-8PJmiUE_.js → calendar-week-toolbar-Cu8V6zv1.js} +1 -1
- package/dist/assets/{charts-BzT4pUPg.js → charts-Cdtn55ol.js} +1 -1
- package/dist/assets/{companion-sync-lab-page-DzWNOaBh.js → companion-sync-lab-page-CJI5jf8W.js} +1 -1
- package/dist/assets/{daily-metrics-dashboard-CHcYxDhs.js → daily-metrics-dashboard-CXESx7bU.js} +1 -1
- package/dist/assets/{define-workbench-box-DcI0_QKW.js → define-workbench-box-Dbl9W7oE.js} +1 -1
- package/dist/assets/{entity-link-multiselect-C--AiCMb.js → entity-link-multiselect-DZ_jAjs4.js} +1 -1
- package/dist/assets/{entity-note-count-link-xne6mshj.js → entity-note-count-link-FOK_qhcC.js} +1 -1
- package/dist/assets/{entity-notes-surface-jy6Psist.js → entity-notes-surface-Dq9dFKjD.js} +1 -1
- package/dist/assets/execution-board-D9hkXKC2.js +1 -0
- package/dist/assets/{faceted-token-search-BMQ1Wwzt.js → faceted-token-search-BeShxjkc.js} +1 -1
- package/dist/assets/{flagship-signal-deck-DjcskRwF.js → flagship-signal-deck-DZx_HEH9.js} +1 -1
- package/dist/assets/{floating-action-menu-cGhbJ2tc.js → floating-action-menu-CFrgvQJi.js} +1 -1
- package/dist/assets/{forms-D1qJ3oOP.js → forms-DhEGHkFR.js} +1 -1
- package/dist/assets/{generic-node-view-DNVwfqqq.js → generic-node-view-C1kLClIm.js} +1 -1
- package/dist/assets/{goal-detail-page-dAbyCilO.js → goal-detail-page-BhMrnVQs.js} +1 -1
- package/dist/assets/{goal-dialog-DH50D0tP.js → goal-dialog-BlZHh3dw.js} +1 -1
- package/dist/assets/goals-page-CesC8IkZ.js +1 -0
- package/dist/assets/{graph-BF4IsheG.js → graph-U1J6VkbG.js} +1 -1
- package/dist/assets/habits-page-DHxZSThT.js +1 -0
- package/dist/assets/{health-boxes-BPTgGM6G.js → health-boxes-BZjIqiiG.js} +1 -1
- package/dist/assets/index-CHbe1sy1.css +1 -0
- package/dist/assets/index-Dj8q65se.js +2 -0
- package/dist/assets/{inline-note-fields-D4mCM1gO.js → inline-note-fields-DpmCMAJf.js} +1 -1
- package/dist/assets/{insight-flow-dialog-Btp6bkbV.js → insight-flow-dialog-DNIe0sts.js} +1 -1
- package/dist/assets/{insights-page-1qM4mxjS.js → insights-page-D_N_MWGu.js} +3 -3
- package/dist/assets/{kanban-boxes-u_A-UJG-.js → kanban-boxes-DTDG5UEJ.js} +1 -1
- package/dist/assets/{kanban-page-CKCa_3Qb.js → kanban-page-DEvIY5IW.js} +1 -1
- package/dist/assets/knowledge-graph-page-CvXSnnG5.js +1 -0
- package/dist/assets/{life-force-page-BZlyA144.js → life-force-page-CgvUrqQb.js} +1 -1
- package/dist/assets/{life-force-workspace-CtAWZXNw.js → life-force-workspace-BNeMbRHf.js} +1 -1
- package/dist/assets/{maps-BTVHALP8.js → maps-Dk9tZqTA.js} +1 -1
- package/dist/assets/{metric-tile-Bkx2btO2.js → metric-tile-DAhX60rg.js} +1 -1
- package/dist/assets/{motion-DcgUnXhY.js → motion-DeJZhOSA.js} +1 -1
- package/dist/assets/{movement-boxes-QZ2EIS9q.js → movement-boxes-BOqU18NH.js} +1 -1
- package/dist/assets/{movement-page-B-3ihggI.js → movement-page-DCDeUynh.js} +1 -1
- package/dist/assets/{note-markdown-BWedRE3c.js → note-markdown-Cxj84-0j.js} +1 -1
- package/dist/assets/{note-tags-input-DZkCqI1w.js → note-tags-input-CP0-EPpE.js} +1 -1
- package/dist/assets/{notes-boxes-DGFmt7Dp.js → notes-boxes-C7WPT7mf.js} +1 -1
- package/dist/assets/notes-page-Dll8PIks.js +1 -0
- package/dist/assets/{open-in-graph-button-CjvkEj1P.js → open-in-graph-button-BHl16hJP.js} +1 -1
- package/dist/assets/{orbit-map-CRHSPenk.js → orbit-map-De0qpMpY.js} +1 -1
- package/dist/assets/overview-page-C1RX7dcq.js +1 -0
- package/dist/assets/page-hero-DYmFM6-q.js +1 -0
- package/dist/assets/pill-cluster-ClkmFVFT.js +1 -0
- package/dist/assets/{preference-entity-handoff-button-CfCQl3cW.js → preference-entity-handoff-button-1XXtBsUF.js} +1 -1
- package/dist/assets/{preferences-page-OltGdsQ2.js → preferences-page-OwfPIQwe.js} +1 -1
- package/dist/assets/{project-collections-FfBIVwXu.js → project-collections-DfmkBk9d.js} +1 -1
- package/dist/assets/project-detail-page-BC_MNaca.js +1 -0
- package/dist/assets/{project-dialog-B_J1ESMk.js → project-dialog-BuZdXECa.js} +1 -1
- package/dist/assets/project-management-hierarchy-page-AhEHe60K.js +1 -0
- package/dist/assets/{project-management-section-nav-DBNHt9p5.js → project-management-section-nav-CnaseOqL.js} +1 -1
- package/dist/assets/{projects-boxes-BvlVsO5q.js → projects-boxes-D0zM8PfY.js} +1 -1
- package/dist/assets/projects-page-ltrWfLrA.js +1 -0
- package/dist/assets/psyche-behaviors-page-CPurgDg6.js +5 -0
- package/dist/assets/{psyche-flashcards-page-05606-97.js → psyche-flashcards-page-DnUSe-bb.js} +1 -1
- package/dist/assets/{psyche-goal-map-page-Cw-aqS3Y.js → psyche-goal-map-page-uWocO7kZ.js} +1 -1
- package/dist/assets/{psyche-graph-0E22QHPe.js → psyche-graph-BDszV3UN.js} +1 -1
- package/dist/assets/{psyche-metrics-page-DBFVPeMa.js → psyche-metrics-page-CIJLJTPy.js} +1 -1
- package/dist/assets/psyche-mode-guide-page-uC8L4WvH.js +1 -0
- package/dist/assets/psyche-modes-page-CtBeRA_3.js +1 -0
- package/dist/assets/psyche-page-Ds3QDsin.js +1 -0
- package/dist/assets/psyche-patterns-page-Cvq5WshW.js +5 -0
- package/dist/assets/{psyche-questionnaire-builder-page-DEt0UDsz.js → psyche-questionnaire-builder-page-Cg5Upe6z.js} +1 -1
- package/dist/assets/{psyche-questionnaire-detail-page-BXQbOE6A.js → psyche-questionnaire-detail-page-D4jEnNoh.js} +1 -1
- package/dist/assets/psyche-questionnaire-run-detail-page-CWoZEY31.js +1 -0
- package/dist/assets/{psyche-questionnaire-run-page-D_EokOQm.js → psyche-questionnaire-run-page-Yg_VG2vq.js} +1 -1
- package/dist/assets/{psyche-questionnaires-page-D1Ov2L4n.js → psyche-questionnaires-page-BqeOJRj7.js} +1 -1
- package/dist/assets/{psyche-report-detail-page-9HyPr8BJ.js → psyche-report-detail-page-BtcMQ7mk.js} +3 -3
- package/dist/assets/psyche-reports-page-tagvW0To.js +1 -0
- package/dist/assets/{psyche-schemas-DDol0j-g.js → psyche-schemas-CvRSkI_u.js} +1 -1
- package/dist/assets/psyche-schemas-beliefs-page-4NL3415v.js +9 -0
- package/dist/assets/{psyche-screen-time-page-DJMDR5oo.js → psyche-screen-time-page-Bc5AwZHQ.js} +1 -1
- package/dist/assets/{psyche-self-observation-page-DFKXG1Yv.js → psyche-self-observation-page-CUrUYbQ_.js} +1 -1
- package/dist/assets/{psyche-values-page-TWKth89J.js → psyche-values-page-BshT2sXE.js} +2 -2
- package/dist/assets/{question-flow-dialog-D-_EvoAt.js → question-flow-dialog-CPyXCqA-.js} +2 -2
- package/dist/assets/{report-chain-fields-Dy-jBQDn.js → report-chain-fields-C0UMLpze.js} +1 -1
- package/dist/assets/rewards-page-D9BzsNPW.js +1 -0
- package/dist/assets/{scheduling-rules-editor-CAd290IE.js → scheduling-rules-editor-DiA6KkQ4.js} +1 -1
- package/dist/assets/{schema-badge-BLaVI1D7.js → schema-badge-DURw2eYH.js} +1 -1
- package/dist/assets/{schemas-B0Pa-V-A.js → schemas-D_z2C8l1.js} +1 -1
- package/dist/assets/{select-menu-DcS4Ukjf.js → select-menu-BUB8__Nx.js} +1 -1
- package/dist/assets/{settings-agents-page-Bt38HhEJ.js → settings-agents-page-Kk98Whcf.js} +1 -1
- package/dist/assets/settings-bin-page-BnJ-mgy2.js +1 -0
- package/dist/assets/{settings-calendar-page-DPSSZV3s.js → settings-calendar-page-CdhlUnUW.js} +3 -3
- package/dist/assets/{settings-data-page-BdHsD1C_.js → settings-data-page-BvvuZNbb.js} +1 -1
- package/dist/assets/{settings-logs-page-D9OnWoFq.js → settings-logs-page-CrzkXxtZ.js} +1 -1
- package/dist/assets/{settings-mobile-page-DFpsXA4M.js → settings-mobile-page-Dl582NK6.js} +1 -1
- package/dist/assets/settings-models-page-COoBw28S.js +1 -0
- package/dist/assets/{settings-page-m_3iYPwU.js → settings-page-DqnlOCgo.js} +1 -1
- package/dist/assets/{settings-rewards-page-B2aBm-dA.js → settings-rewards-page-Cw5QSTjy.js} +1 -1
- package/dist/assets/{settings-section-nav-CMeU19Rx.js → settings-section-nav-C1NcWveT.js} +1 -1
- package/dist/assets/{settings-users-page-D8jyewJl.js → settings-users-page-0opvepcM.js} +1 -1
- package/dist/assets/{settings-wiki-page-DjOgQJAh.js → settings-wiki-page-CkpnUkiZ.js} +1 -1
- package/dist/assets/{sleep-page-D8-dA4bE.js → sleep-page-DrS1zs3B.js} +1 -1
- package/dist/assets/{sports-page-CK3PgPKB.js → sports-page-EVnB_zjB.js} +1 -1
- package/dist/assets/{state-Bpe5dF3T.js → state-DWw8Jay_.js} +1 -1
- package/dist/assets/{strategies-page-aFpJath-.js → strategies-page-COhyv_SH.js} +1 -1
- package/dist/assets/{strategy-detail-page-CobF5qLv.js → strategy-detail-page-BaCVkvIu.js} +1 -1
- package/dist/assets/{strategy-dialog-Fgoaoob5.js → strategy-dialog-DvlPo9WV.js} +1 -1
- package/dist/assets/{surface-D0dqgX-k.js → surface-Dg5fauKP.js} +1 -1
- package/dist/assets/{table-U7otr5go.js → table-CWVROEBP.js} +1 -1
- package/dist/assets/task-detail-page-3IeMYIXl.js +1 -0
- package/dist/assets/{task-dialog-eCDTF8xe.js → task-dialog-B7ZT4KE5.js} +5 -5
- package/dist/assets/timebox-planning-dialog-DoZzpEBp.js +1 -0
- package/dist/assets/{today-boxes-CYfskVrM.js → today-boxes-BbUNpb16.js} +1 -1
- package/dist/assets/today-page-adKXN2g1.js +1 -0
- package/dist/assets/training-load-page-DTYbu9f0.js +1 -0
- package/dist/assets/{ui-B9TWEtCx.js → ui-CdEDMtXF.js} +1 -1
- package/dist/assets/{use-anchored-overlay-position-BY4kNzPj.js → use-anchored-overlay-position-Cracjgo6.js} +1 -1
- package/dist/assets/{use-psyche-focus-target-BhNedCZB.js → use-psyche-focus-target-DvRgu-94.js} +1 -1
- package/dist/assets/{user-badge-MEZuJiir.js → user-badge-B8hYK6NU.js} +1 -1
- package/dist/assets/{user-select-field-fx129Uh6.js → user-select-field-akGHK-2t.js} +1 -1
- package/dist/assets/{utility-widgets-h5eG2jvc.js → utility-widgets-D4KsKxLT.js} +2 -2
- package/dist/assets/{vendor-BwL6m4SE.js → vendor-y_uz1Wft.js} +222 -212
- package/dist/assets/{vitals-page-eoFnQ3XL.js → vitals-page-Cjcxh-kO.js} +1 -1
- package/dist/assets/{weekly-review-page-C7BU1gkK.js → weekly-review-page-CR57efzH.js} +1 -1
- package/dist/assets/{weight-loss-page-Cc7Do3XY.js → weight-loss-page-Bk7YkB7b.js} +1 -1
- package/dist/assets/{wiki-article-markdown-CCKoSptz.js → wiki-article-markdown-um6gpmGQ.js} +2 -2
- package/dist/assets/{wiki-editor-page-BpbxZrgz.js → wiki-editor-page-DdP5hvjZ.js} +5 -5
- package/dist/assets/{wiki-ingest-history-page-D5Wfr8pc.js → wiki-ingest-history-page-DSTndduq.js} +1 -1
- package/dist/assets/{wiki-ingest-modal-DhRVsEwC.js → wiki-ingest-modal-PNW3CJ-o.js} +1 -1
- package/dist/assets/wiki-page-CsJlPyQ6.js +1 -0
- package/dist/assets/{workbench-flow-page-y9FxDbKO.js → workbench-flow-page-DFtIKgNe.js} +3 -3
- package/dist/assets/{workbench-page-Da16AZvN.js → workbench-page-DEpKjMEv.js} +1 -1
- package/dist/assets/workout-detail-page-BwfEhxA_.js +2 -0
- package/dist/index.html +8 -8
- package/dist/openclaw/parity.d.ts +1 -1
- package/dist/openclaw/parity.js +10 -0
- package/dist/openclaw/routes.js +78 -0
- package/dist/openclaw/tools.js +42 -0
- package/dist/server/apps/api/migrations/072_artifact_store.sql +106 -0
- package/dist/server/apps/api/migrations/073_artifact_entity_links_repair.sql +24 -0
- package/dist/server/apps/api/src/app.js +364 -3
- package/dist/server/apps/api/src/openapi.js +570 -1
- package/dist/server/apps/api/src/repositories/entity-links.js +66 -0
- package/dist/server/apps/api/src/services/artifacts.js +1059 -0
- package/dist/server/apps/api/src/services/entity-crud.js +22 -0
- package/dist/server/apps/api/src/services/knowledge-graph.js +45 -0
- package/dist/server/apps/api/src/services/psyche-observation-calendar.js +1 -0
- package/dist/server/apps/api/src/types.js +2 -0
- package/dist/server/apps/web/src/lib/api.js +69 -0
- package/dist/server/apps/web/src/lib/entity-visuals.js +10 -1
- package/dist/server/apps/web/src/lib/knowledge-graph-types.js +9 -0
- package/openclaw.plugin.json +2 -1
- package/package.json +1 -1
- package/server/migrations/072_artifact_store.sql +106 -0
- package/server/migrations/073_artifact_entity_links_repair.sql +24 -0
- package/skills/forge-openclaw/SKILL.md +57 -4
- package/skills/forge-openclaw/entity_conversation_playbooks.md +215 -14
- package/skills/forge-openclaw/psyche_entity_playbooks.md +20 -0
- package/dist/assets/execution-board-BSUZCIIx.js +0 -1
- package/dist/assets/goals-page-DkMy9mPD.js +0 -1
- package/dist/assets/habits-page-CCQR8rg6.js +0 -1
- package/dist/assets/index-VzCGTBS_.css +0 -1
- package/dist/assets/index-izRKx6JK.js +0 -2
- package/dist/assets/knowledge-graph-page-BZOxRv19.js +0 -1
- package/dist/assets/notes-page-DYkn04tz.js +0 -1
- package/dist/assets/overview-page-D6LsjPWe.js +0 -1
- package/dist/assets/page-hero-BLhM8FF3.js +0 -1
- package/dist/assets/pill-cluster-B5bYs_e2.js +0 -1
- package/dist/assets/project-detail-page-CCm3iZPQ.js +0 -1
- package/dist/assets/project-management-hierarchy-page-BNzvtNZj.js +0 -1
- package/dist/assets/projects-page-BUf7KV-_.js +0 -1
- package/dist/assets/psyche-behaviors-page-jtyhdpJ1.js +0 -5
- package/dist/assets/psyche-mode-guide-page-DI-LNEDT.js +0 -1
- package/dist/assets/psyche-modes-page-CaMupyfi.js +0 -1
- package/dist/assets/psyche-page-CFBq0YKf.js +0 -1
- package/dist/assets/psyche-patterns-page-sp4ikoef.js +0 -5
- package/dist/assets/psyche-questionnaire-run-detail-page-Cd3ClsSK.js +0 -1
- package/dist/assets/psyche-reports-page-BeyJg5fb.js +0 -1
- package/dist/assets/psyche-schemas-beliefs-page-DNmf-Vma.js +0 -9
- package/dist/assets/rewards-page-D3ymEd2X.js +0 -1
- package/dist/assets/settings-bin-page-DqyVI1i1.js +0 -1
- package/dist/assets/settings-models-page-DaFXLp-O.js +0 -1
- package/dist/assets/task-detail-page-CDK79bzk.js +0 -1
- package/dist/assets/timebox-planning-dialog-CNZIGSpd.js +0 -1
- package/dist/assets/today-page-Bnh8wopq.js +0 -1
- package/dist/assets/training-load-page-C7lq-jqy.js +0 -1
- package/dist/assets/wiki-page-1vf-HErs.js +0 -1
- package/dist/assets/workout-detail-page-Cq0YamXF.js +0 -2
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/maps-Dk9tZqTA.js","assets/vendor-y_uz1Wft.js","assets/vendor-CRS-psbw.css","assets/maps-B-YMMjus.css"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{S as D,e as P,j,C as c,T as B,I as H,B as E,ec as I,ea as K,ed as W}from"./index-Dj8q65se.js";import{b_ as Q,r as h,j as e,aC as O,cP as q,bt as Z,bC as Y,dz as G,cs as U}from"./vendor-y_uz1Wft.js";import{j as V,i as X,k as J}from"./state-DWw8Jay_.js";import"./maps-Dk9tZqTA.js";import{P as ee}from"./page-hero-DYmFM6-q.js";import{R as C,A as te,C as ae,X as T,Y as _,T as z,a as se,e as ie,B as re}from"./charts-Cdtn55ol.js";import"./motion-DeJZhOSA.js";import"./ui-CdEDMtXF.js";import"./board-CGgOvBP9.js";import"./forms-DhEGHkFR.js";const A={below_z1:"#94a3b8",zone_1:"#38bdf8",zone_2:"#22c55e",zone_3:"#eab308",zone_4:"#f97316",zone_5:"#ef4444"};function k(t){return t?`${Math.round(t/60)}m`:"0m"}function F(t,s){const o=new Intl.DateTimeFormat(void 0,{weekday:"short",day:"numeric",month:"short"}),n=new Intl.DateTimeFormat(void 0,{hour:"2-digit",minute:"2-digit"});return`${o.format(new Date(t))} · ${n.format(new Date(t))} - ${n.format(new Date(s))}`}function $(t){const s=typeof t=="number"?Math.floor(t):Number.parseFloat(String(t??""));return Number.isFinite(s)?new Date(s).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"}):""}function ne(t,s){if(typeof t=="number"){const o=Number.isInteger(t)?String(t):t.toFixed(1);return s&&s!=="count"?`${o} ${s}`:o}return typeof t=="boolean"?t?"Yes":"No":t==null?"n/a":String(t)}function oe(t){return t.length===0?null:{minLat:Math.min(...t.map(s=>s.latitude)),maxLat:Math.max(...t.map(s=>s.latitude)),minLon:Math.min(...t.map(s=>s.longitude)),maxLon:Math.max(...t.map(s=>s.longitude))}}function le({points:t}){var g;const s=h.useRef(null),[o,n]=h.useState(!1),u=typeof window<"u"?((g=window.localStorage.getItem("forge.map.tile-url"))==null?void 0:g.trim())??"":"";h.useEffect(()=>{let x=!1,i=null;if(!u||!s.current||t.length<2){n(!1);return}return I(()=>import("./maps-Dk9tZqTA.js").then(r=>r.m),__vite__mapDeps([0,1,2,3])).then(r=>{x||!s.current||(i=new r.Map({container:s.current,style:{version:8,sources:{tiles:{type:"raster",tiles:[u],tileSize:256}},layers:[{id:"tiles",type:"raster",source:"tiles"}]},center:[t[0].longitude,t[0].latitude],zoom:13,attributionControl:!1}),i.on("load",()=>{if(!i)return;const d=t.map(m=>[m.longitude,m.latitude]);i.addSource("route",{type:"geojson",data:{type:"Feature",properties:{},geometry:{type:"LineString",coordinates:d}}}),i.addLayer({id:"route",type:"line",source:"route",paint:{"line-color":"#f97316","line-width":4}});const f=d.reduce((m,p)=>m.extend(p),new r.LngLatBounds(d[0],d[0]));i.fitBounds(f,{padding:44,maxZoom:15}),n(!0)}))}),()=>{x=!0,i==null||i.remove()}},[t,u]);const l=oe(t),v=h.useMemo(()=>{if(!l||t.length<2)return"";const x=720,i=280,r=Math.max(1e-6,l.maxLon-l.minLon),d=Math.max(1e-6,l.maxLat-l.minLat);return t.map(f=>{const m=(f.longitude-l.minLon)/r*x,p=i-(f.latitude-l.minLat)/d*i;return`${m.toFixed(1)},${p.toFixed(1)}`}).join(" ")},[l,t]);return e.jsxs("div",{className:"relative min-h-[280px] overflow-hidden rounded-[8px] border border-[var(--ui-border-subtle)] bg-[var(--ui-surface-1)]",children:[e.jsx("div",{ref:s,className:"absolute inset-0"}),o?null:e.jsxs("svg",{viewBox:"0 0 720 280",className:"absolute inset-0 h-full w-full",children:[e.jsx("rect",{width:"720",height:"280",fill:"var(--ui-surface-1)"}),v?e.jsx("polyline",{points:v,fill:"none",stroke:"#f97316",strokeWidth:"5",strokeLinecap:"round",strokeLinejoin:"round"}):null]}),e.jsx("div",{className:"absolute left-3 top-3 max-w-[calc(100%-1.5rem)] rounded-[8px] border border-[var(--ui-border-subtle)] bg-[var(--surface-glass)] px-3 py-2 text-xs text-[var(--ui-ink-medium)] backdrop-blur",children:u?"Local-first map tiles configured":"No tile source configured; showing private route shape only"})]})}function de({zones:t}){return e.jsx("div",{className:"grid gap-3",children:t.map(s=>e.jsxs("div",{className:"grid gap-2",children:[e.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-3 text-sm",children:[e.jsx("span",{className:"min-w-0 break-words text-[var(--ui-ink-medium)] [overflow-wrap:anywhere]",children:s.label}),e.jsxs("span",{className:"shrink-0 text-[var(--ui-ink-strong)]",children:[(s.percentage*100).toFixed(1),"% · ",k(s.seconds)]})]}),e.jsx("div",{className:"h-2 overflow-hidden rounded-full bg-[var(--ui-surface-2)]",children:e.jsx("div",{className:"h-full rounded-full",style:{width:`${Math.max(1,s.percentage*100)}%`,background:A[s.key]??"#f8fafc"}})})]},s.key))})}function we(){var p,y,N,b,S,L,R,M;const{workoutId:t=""}=Q(),s=V(),o=X({queryKey:["workout-detail",t],queryFn:()=>W(t),enabled:t.length>0}),n=o.data,[u,l]=h.useState(""),[v,g]=h.useState("");h.useEffect(()=>{n!=null&&n.workout&&(l(n.workout.meaningText??""),g(n.workout.tags.join(", ")))},[n==null?void 0:n.workout]);const x=J({mutationFn:()=>K(t,{meaningText:u,tags:v.split(",").map(a=>a.trim()).filter(Boolean)}),onSuccess:async()=>{await s.invalidateQueries({queryKey:["workout-detail",t]}),await s.invalidateQueries({queryKey:["forge-fitness"]})}});if(o.isLoading)return e.jsx(D,{title:"Loading workout"});if(o.isError||!n)return e.jsx(P,{eyebrow:"Workout detail",error:o.error??new Error("Forge could not load this workout detail."),onRetry:()=>void o.refetch()});const{workout:i,analytics:r,evidence:d}=n,f=d.timeSeries.filter(a=>a.metricKey==="heart_rate").map((a,w)=>({time:Date.parse(a.startedAt)+w/1e3,bpm:a.value})),m=r.zoneDurations.map(a=>({zone:a.label,minutes:Math.round(a.seconds/60),fill:A[a.key]??"#f8fafc"}));return e.jsxs("div",{className:"grid gap-6",children:[e.jsxs(O,{to:"/sports",className:"inline-flex w-fit items-center gap-2 text-sm text-[var(--ui-ink-soft)] transition hover:text-[var(--ui-ink-strong)]",children:[e.jsx(q,{className:"size-4"}),"Back to sports"]}),e.jsx(ee,{eyebrow:"Workout evidence",title:i.workoutTypeLabel??i.workoutType,description:`${F(i.startedAt,i.endedAt)} · ${i.sourceDevice||"Apple Health"}`,actions:e.jsxs("div",{className:"flex flex-wrap gap-2",children:[e.jsx(j,{children:k(i.durationSeconds)}),e.jsxs(j,{tone:"meta",children:[r.confidence," HR zones"]}),(p=r.routeSummary)!=null&&p.hasRoute?e.jsxs(j,{tone:"meta",children:[r.routeSummary.pointCount," route points"]}):null]})}),e.jsxs("section",{className:"grid gap-4 lg:grid-cols-4",children:[e.jsxs(c,{children:[e.jsx("div",{className:"text-sm text-[var(--ui-ink-soft)]",children:"Avg HR"}),e.jsx("div",{className:"mt-3 font-display text-4xl text-[var(--ui-ink-strong)]",children:r.hrSummary.averageHr??i.averageHeartRate??"n/a"}),e.jsx("div",{className:"mt-1 text-sm text-[var(--ui-ink-faint)]",children:"bpm"})]}),e.jsxs(c,{children:[e.jsx("div",{className:"text-sm text-[var(--ui-ink-soft)]",children:"Max HR"}),e.jsx("div",{className:"mt-3 font-display text-4xl text-[var(--ui-ink-strong)]",children:r.hrSummary.maxHr??i.maxHeartRate??"n/a"}),e.jsx("div",{className:"mt-1 text-sm text-[var(--ui-ink-faint)]",children:"bpm"})]}),e.jsxs(c,{children:[e.jsx("div",{className:"text-sm text-[var(--ui-ink-soft)]",children:"Training load"}),e.jsx("div",{className:"mt-3 font-display text-4xl text-[var(--ui-ink-strong)]",children:r.load.trimp??"n/a"}),e.jsx("div",{className:"mt-1 text-sm text-[var(--ui-ink-faint)]",children:"Forge TRIMP"})]}),e.jsxs(c,{children:[e.jsx("div",{className:"text-sm text-[var(--ui-ink-soft)]",children:"HR coverage"}),e.jsxs("div",{className:"mt-3 font-display text-4xl text-[var(--ui-ink-strong)]",children:[Math.round((r.dataQuality.sampleCoverage??0)*100),"%"]}),e.jsxs("div",{className:"mt-1 text-sm text-[var(--ui-ink-faint)]",children:[r.dataQuality.heartRateSampleCount??0," samples"]})]})]}),e.jsxs("section",{className:"grid min-w-0 gap-4 xl:grid-cols-[minmax(0,1.25fr)_minmax(280px,0.75fr)]",children:[e.jsxs(c,{className:"min-h-[360px] min-w-0 overflow-hidden",children:[e.jsxs("div",{className:"flex items-center gap-2 text-[var(--ui-ink-strong)]",children:[e.jsx(Z,{className:"size-4 text-[var(--primary)]"}),"Heart-rate timeline"]}),e.jsx("div",{className:"mt-4 h-[300px]",children:f.length>0?e.jsx(C,{width:"100%",height:"100%",children:e.jsxs(te,{data:f,children:[e.jsx("defs",{children:e.jsxs("linearGradient",{id:"hrFill",x1:"0",y1:"0",x2:"0",y2:"1",children:[e.jsx("stop",{offset:"0%",stopColor:"#ef4444",stopOpacity:.38}),e.jsx("stop",{offset:"100%",stopColor:"#ef4444",stopOpacity:.04})]})}),e.jsx(ae,{stroke:"var(--ui-border-subtle)",vertical:!1}),e.jsx(T,{dataKey:"time",interval:"preserveStartEnd",tick:{fill:"var(--ui-ink-soft)",fontSize:11},tickFormatter:$,type:"number",domain:["dataMin","dataMax"]}),e.jsx(_,{tick:{fill:"var(--ui-ink-soft)",fontSize:11},width:42}),e.jsx(z,{labelFormatter:$,contentStyle:{background:"var(--surface-glass)",border:"1px solid var(--ui-border-subtle)",borderRadius:8,color:"var(--ui-ink-strong)"}}),e.jsx(se,{type:"monotone",dataKey:"bpm",stroke:"#ef4444",fill:"url(#hrFill)",strokeWidth:2,dot:!1})]})}):e.jsx("div",{className:"grid h-full place-items-center rounded-[8px] bg-[var(--ui-surface-1)] text-sm text-[var(--ui-ink-soft)]",children:"No raw HR timeline has been synced for this workout yet."})})]}),e.jsxs(c,{className:"min-w-0 overflow-hidden",children:[e.jsxs("div",{className:"flex items-center gap-2 text-[var(--ui-ink-strong)]",children:[e.jsx(Y,{className:"size-4 text-[var(--primary)]"}),"Zone mix"]}),e.jsx("div",{className:"mt-4",children:e.jsx(de,{zones:r.zoneDurations})}),e.jsx("div",{className:"mt-5 h-[180px]",children:e.jsx(C,{width:"100%",height:"100%",children:e.jsxs(ie,{data:m,children:[e.jsx(T,{dataKey:"zone",tick:{fill:"var(--ui-ink-soft)",fontSize:10}}),e.jsx(_,{tick:{fill:"var(--ui-ink-soft)",fontSize:10},width:34}),e.jsx(z,{contentStyle:{background:"var(--surface-glass)",border:"1px solid var(--ui-border-subtle)",borderRadius:8,color:"var(--ui-ink-strong)"}}),e.jsx(re,{dataKey:"minutes",radius:[4,4,0,0]})]})})})]})]}),e.jsxs("section",{className:"grid min-w-0 gap-4 xl:grid-cols-[minmax(0,1fr)_360px]",children:[e.jsxs(c,{className:"min-w-0 overflow-hidden",children:[e.jsxs("div",{className:"flex items-center gap-2 text-[var(--ui-ink-strong)]",children:[e.jsx(G,{className:"size-4 text-[var(--primary)]"}),"Route"]}),e.jsx("div",{className:"mt-4",children:d.routePoints.length>1?e.jsx(le,{points:d.routePoints}):e.jsx("div",{className:"grid min-h-[240px] place-items-center rounded-[8px] bg-[var(--ui-surface-1)] text-sm text-[var(--ui-ink-soft)]",children:"No route evidence is available for this workout."})})]}),e.jsxs(c,{className:"min-w-0 overflow-hidden",children:[e.jsx("div",{className:"text-[var(--ui-ink-strong)]",children:"Captured metrics"}),e.jsx("div",{className:"mt-4 grid gap-3",children:(((y=i.details)==null?void 0:y.metrics)??[]).slice(0,14).map(a=>e.jsxs("div",{className:"min-w-0 rounded-[8px] bg-[var(--ui-surface-1)] px-3 py-2",children:[e.jsx("div",{className:"break-words text-sm text-[var(--ui-ink-soft)] [overflow-wrap:anywhere]",children:a.label}),e.jsx("div",{className:"mt-1 break-words text-[var(--ui-ink-strong)] [overflow-wrap:anywhere]",children:ne(a.value,a.unit)})]},`${a.category}:${a.key}:${a.statistic}`))})]})]}),e.jsxs("section",{className:"grid min-w-0 gap-4 lg:grid-cols-[minmax(0,1fr)_minmax(280px,0.7fr)]",children:[e.jsxs(c,{className:"min-w-0 overflow-hidden",children:[e.jsx("div",{className:"text-[var(--ui-ink-strong)]",children:"Events and phases"}),e.jsxs("div",{className:"mt-4 grid gap-3",children:[[...((N=i.details)==null?void 0:N.events)??[],...((b=i.details)==null?void 0:b.components)??[]].slice(0,18).map((a,w)=>e.jsxs("div",{className:"min-w-0 rounded-[8px] bg-[var(--ui-surface-1)] px-4 py-3",children:[e.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-3",children:[e.jsx("div",{className:"min-w-0 break-words text-[var(--ui-ink-strong)] [overflow-wrap:anywhere]",children:"label"in a?a.label:a.activity.canonicalLabel}),e.jsx(j,{tone:"meta",children:k(a.durationSeconds)})]}),e.jsx("div",{className:"mt-1 text-sm text-[var(--ui-ink-soft)]",children:F(a.startedAt,a.endedAt??a.startedAt)})]},`${"type"in a?a.type:a.externalUid}:${a.startedAt}:${w}`)),(((L=(S=i.details)==null?void 0:S.events)==null?void 0:L.length)??0)+(((M=(R=i.details)==null?void 0:R.components)==null?void 0:M.length)??0)===0?e.jsx("div",{className:"rounded-[8px] bg-[var(--ui-surface-1)] p-4 text-sm text-[var(--ui-ink-soft)]",children:"No provider events or phases were captured."}):null]})]}),e.jsxs(c,{className:"min-w-0 overflow-hidden",children:[e.jsx("div",{className:"text-[var(--ui-ink-strong)]",children:"Reflection"}),e.jsxs("div",{className:"mt-4 grid gap-4",children:[e.jsxs("label",{className:"grid gap-2",children:[e.jsx("span",{className:"text-sm text-[var(--ui-ink-soft)]",children:"Meaning and impact"}),e.jsx(B,{className:"min-h-[160px]",value:u,onChange:a=>l(a.target.value)})]}),e.jsxs("label",{className:"grid gap-2",children:[e.jsx("span",{className:"text-sm text-[var(--ui-ink-soft)]",children:"Tags"}),e.jsx(H,{value:v,onChange:a=>g(a.target.value)})]}),e.jsxs(E,{type:"button",pending:x.isPending,pendingLabel:"Saving",onClick:()=>x.mutate(),children:[e.jsx(U,{className:"size-4"}),"Save reflection"]})]})]})]})]})}export{we as WorkoutDetailPage};
|
package/dist/index.html
CHANGED
|
@@ -130,15 +130,15 @@
|
|
|
130
130
|
}
|
|
131
131
|
}
|
|
132
132
|
</style>
|
|
133
|
-
<script type="module" crossorigin src="/forge/assets/index-
|
|
134
|
-
<link rel="modulepreload" crossorigin href="/forge/assets/vendor-
|
|
135
|
-
<link rel="modulepreload" crossorigin href="/forge/assets/state-
|
|
136
|
-
<link rel="modulepreload" crossorigin href="/forge/assets/motion-
|
|
137
|
-
<link rel="modulepreload" crossorigin href="/forge/assets/ui-
|
|
138
|
-
<link rel="modulepreload" crossorigin href="/forge/assets/board-
|
|
139
|
-
<link rel="modulepreload" crossorigin href="/forge/assets/forms-
|
|
133
|
+
<script type="module" crossorigin src="/forge/assets/index-Dj8q65se.js"></script>
|
|
134
|
+
<link rel="modulepreload" crossorigin href="/forge/assets/vendor-y_uz1Wft.js">
|
|
135
|
+
<link rel="modulepreload" crossorigin href="/forge/assets/state-DWw8Jay_.js">
|
|
136
|
+
<link rel="modulepreload" crossorigin href="/forge/assets/motion-DeJZhOSA.js">
|
|
137
|
+
<link rel="modulepreload" crossorigin href="/forge/assets/ui-CdEDMtXF.js">
|
|
138
|
+
<link rel="modulepreload" crossorigin href="/forge/assets/board-CGgOvBP9.js">
|
|
139
|
+
<link rel="modulepreload" crossorigin href="/forge/assets/forms-DhEGHkFR.js">
|
|
140
140
|
<link rel="stylesheet" crossorigin href="/forge/assets/vendor-CRS-psbw.css">
|
|
141
|
-
<link rel="stylesheet" crossorigin href="/forge/assets/index-
|
|
141
|
+
<link rel="stylesheet" crossorigin href="/forge/assets/index-CHbe1sy1.css">
|
|
142
142
|
</head>
|
|
143
143
|
<body class="bg-canvas text-ink antialiased">
|
|
144
144
|
<div id="root">
|
|
@@ -2,7 +2,7 @@ export type ApiRouteKey = `${Uppercase<string>} ${string}`;
|
|
|
2
2
|
export type ForgeSupportedPluginApiRoute = {
|
|
3
3
|
method: Uppercase<string>;
|
|
4
4
|
path: string;
|
|
5
|
-
purpose: "diagnostics" | "calendar" | "overview" | "operator_context" | "onboarding" | "psyche" | "xp" | "weekly_review" | "entities" | "work" | "insights" | "wiki" | "health" | "movement" | "life_force" | "workbench" | "preferences" | "questionnaires";
|
|
5
|
+
purpose: "diagnostics" | "calendar" | "overview" | "operator_context" | "onboarding" | "psyche" | "xp" | "weekly_review" | "entities" | "work" | "insights" | "wiki" | "health" | "movement" | "life_force" | "workbench" | "artifact" | "preferences" | "questionnaires";
|
|
6
6
|
};
|
|
7
7
|
export declare const FORGE_SUPPORTED_PLUGIN_API_ROUTES: ForgeSupportedPluginApiRoute[];
|
|
8
8
|
export declare function makeApiRouteKey(method: string, path: string): ApiRouteKey;
|
package/dist/openclaw/parity.js
CHANGED
|
@@ -143,6 +143,16 @@ export const FORGE_SUPPORTED_PLUGIN_API_ROUTES = [
|
|
|
143
143
|
path: "/api/v1/workbench/flows/:id/nodes/:nodeId/output",
|
|
144
144
|
purpose: "workbench"
|
|
145
145
|
},
|
|
146
|
+
{ method: "GET", path: "/api/v1/artifacts", purpose: "artifact" },
|
|
147
|
+
{ method: "POST", path: "/api/v1/artifacts", purpose: "artifact" },
|
|
148
|
+
{ method: "GET", path: "/api/v1/artifacts/:id", purpose: "artifact" },
|
|
149
|
+
{ method: "PATCH", path: "/api/v1/artifacts/:id", purpose: "artifact" },
|
|
150
|
+
{ method: "POST", path: "/api/v1/artifacts/:id/scan", purpose: "artifact" },
|
|
151
|
+
{ method: "POST", path: "/api/v1/artifacts/:id/enrich", purpose: "artifact" },
|
|
152
|
+
{ method: "POST", path: "/api/v1/artifacts/:id/links", purpose: "artifact" },
|
|
153
|
+
{ method: "POST", path: "/api/v1/artifacts/:id/trust", purpose: "artifact" },
|
|
154
|
+
{ method: "GET", path: "/api/v1/artifacts/:id/versions", purpose: "artifact" },
|
|
155
|
+
{ method: "GET", path: "/api/v1/artifacts/:id/audit", purpose: "artifact" },
|
|
146
156
|
{ method: "GET", path: "/api/v1/calendar/overview", purpose: "calendar" },
|
|
147
157
|
{
|
|
148
158
|
method: "GET",
|
package/dist/openclaw/routes.js
CHANGED
|
@@ -499,6 +499,84 @@ export const FORGE_PLUGIN_ROUTE_GROUPS = [
|
|
|
499
499
|
}
|
|
500
500
|
]
|
|
501
501
|
},
|
|
502
|
+
{
|
|
503
|
+
path: "/forge/v1/artifacts",
|
|
504
|
+
match: "prefix",
|
|
505
|
+
operations: [
|
|
506
|
+
{
|
|
507
|
+
method: "GET",
|
|
508
|
+
pattern: /^\/forge\/v1\/artifacts$/,
|
|
509
|
+
upstreamPath: "/api/v1/artifacts",
|
|
510
|
+
target: (_match, url) => passthroughSearch("/api/v1/artifacts", url)
|
|
511
|
+
},
|
|
512
|
+
{
|
|
513
|
+
method: "POST",
|
|
514
|
+
pattern: /^\/forge\/v1\/artifacts$/,
|
|
515
|
+
upstreamPath: "/api/v1/artifacts",
|
|
516
|
+
requestBody: "json",
|
|
517
|
+
requiresToken: true,
|
|
518
|
+
target: (_match, url) => passthroughSearch("/api/v1/artifacts", url)
|
|
519
|
+
},
|
|
520
|
+
{
|
|
521
|
+
method: "GET",
|
|
522
|
+
pattern: /^\/forge\/v1\/artifacts\/([^/]+)$/,
|
|
523
|
+
upstreamPath: "/api/v1/artifacts/:id",
|
|
524
|
+
target: (match, url) => passthroughSearch(`/api/v1/artifacts/${match[1]}`, url)
|
|
525
|
+
},
|
|
526
|
+
{
|
|
527
|
+
method: "PATCH",
|
|
528
|
+
pattern: /^\/forge\/v1\/artifacts\/([^/]+)$/,
|
|
529
|
+
upstreamPath: "/api/v1/artifacts/:id",
|
|
530
|
+
requestBody: "json",
|
|
531
|
+
requiresToken: true,
|
|
532
|
+
target: (match, url) => passthroughSearch(`/api/v1/artifacts/${match[1]}`, url)
|
|
533
|
+
},
|
|
534
|
+
{
|
|
535
|
+
method: "POST",
|
|
536
|
+
pattern: /^\/forge\/v1\/artifacts\/([^/]+)\/scan$/,
|
|
537
|
+
upstreamPath: "/api/v1/artifacts/:id/scan",
|
|
538
|
+
requestBody: "json",
|
|
539
|
+
requiresToken: true,
|
|
540
|
+
target: (match, url) => passthroughSearch(`/api/v1/artifacts/${match[1]}/scan`, url)
|
|
541
|
+
},
|
|
542
|
+
{
|
|
543
|
+
method: "POST",
|
|
544
|
+
pattern: /^\/forge\/v1\/artifacts\/([^/]+)\/enrich$/,
|
|
545
|
+
upstreamPath: "/api/v1/artifacts/:id/enrich",
|
|
546
|
+
requestBody: "json",
|
|
547
|
+
requiresToken: true,
|
|
548
|
+
target: (match, url) => passthroughSearch(`/api/v1/artifacts/${match[1]}/enrich`, url)
|
|
549
|
+
},
|
|
550
|
+
{
|
|
551
|
+
method: "POST",
|
|
552
|
+
pattern: /^\/forge\/v1\/artifacts\/([^/]+)\/links$/,
|
|
553
|
+
upstreamPath: "/api/v1/artifacts/:id/links",
|
|
554
|
+
requestBody: "json",
|
|
555
|
+
requiresToken: true,
|
|
556
|
+
target: (match, url) => passthroughSearch(`/api/v1/artifacts/${match[1]}/links`, url)
|
|
557
|
+
},
|
|
558
|
+
{
|
|
559
|
+
method: "POST",
|
|
560
|
+
pattern: /^\/forge\/v1\/artifacts\/([^/]+)\/trust$/,
|
|
561
|
+
upstreamPath: "/api/v1/artifacts/:id/trust",
|
|
562
|
+
requestBody: "json",
|
|
563
|
+
requiresToken: true,
|
|
564
|
+
target: (match, url) => passthroughSearch(`/api/v1/artifacts/${match[1]}/trust`, url)
|
|
565
|
+
},
|
|
566
|
+
{
|
|
567
|
+
method: "GET",
|
|
568
|
+
pattern: /^\/forge\/v1\/artifacts\/([^/]+)\/versions$/,
|
|
569
|
+
upstreamPath: "/api/v1/artifacts/:id/versions",
|
|
570
|
+
target: (match, url) => passthroughSearch(`/api/v1/artifacts/${match[1]}/versions`, url)
|
|
571
|
+
},
|
|
572
|
+
{
|
|
573
|
+
method: "GET",
|
|
574
|
+
pattern: /^\/forge\/v1\/artifacts\/([^/]+)\/audit$/,
|
|
575
|
+
upstreamPath: "/api/v1/artifacts/:id/audit",
|
|
576
|
+
target: (match, url) => passthroughSearch(`/api/v1/artifacts/${match[1]}/audit`, url)
|
|
577
|
+
}
|
|
578
|
+
]
|
|
579
|
+
},
|
|
502
580
|
{
|
|
503
581
|
path: "/forge/v1/calendar",
|
|
504
582
|
match: "prefix",
|
package/dist/openclaw/tools.js
CHANGED
|
@@ -232,6 +232,42 @@ const workbenchRouteSpecs = {
|
|
|
232
232
|
path: "/api/v1/workbench/flows/:id/nodes/:nodeId/output"
|
|
233
233
|
}
|
|
234
234
|
};
|
|
235
|
+
const artifactRouteSpecs = {
|
|
236
|
+
list: { method: "GET", path: "/api/v1/artifacts" },
|
|
237
|
+
createWithBytes: {
|
|
238
|
+
method: "POST",
|
|
239
|
+
path: "/api/v1/artifacts",
|
|
240
|
+
requiresToken: true
|
|
241
|
+
},
|
|
242
|
+
readMetadata: { method: "GET", path: "/api/v1/artifacts/:id" },
|
|
243
|
+
updateMetadata: {
|
|
244
|
+
method: "PATCH",
|
|
245
|
+
path: "/api/v1/artifacts/:id",
|
|
246
|
+
requiresToken: true
|
|
247
|
+
},
|
|
248
|
+
rescan: {
|
|
249
|
+
method: "POST",
|
|
250
|
+
path: "/api/v1/artifacts/:id/scan",
|
|
251
|
+
requiresToken: true
|
|
252
|
+
},
|
|
253
|
+
enrichWithLlm: {
|
|
254
|
+
method: "POST",
|
|
255
|
+
path: "/api/v1/artifacts/:id/enrich",
|
|
256
|
+
requiresToken: true
|
|
257
|
+
},
|
|
258
|
+
replaceGenericLinks: {
|
|
259
|
+
method: "POST",
|
|
260
|
+
path: "/api/v1/artifacts/:id/links",
|
|
261
|
+
requiresToken: true
|
|
262
|
+
},
|
|
263
|
+
trustState: {
|
|
264
|
+
method: "POST",
|
|
265
|
+
path: "/api/v1/artifacts/:id/trust",
|
|
266
|
+
requiresToken: true
|
|
267
|
+
},
|
|
268
|
+
versions: { method: "GET", path: "/api/v1/artifacts/:id/versions" },
|
|
269
|
+
audit: { method: "GET", path: "/api/v1/artifacts/:id/audit" }
|
|
270
|
+
};
|
|
235
271
|
const optionalString = () => Type.Optional(Type.String());
|
|
236
272
|
const optionalNullableString = () => Type.Optional(Type.Union([Type.String(), Type.Null()]));
|
|
237
273
|
const optionalDeleteMode = () => Type.Optional(Type.Union([Type.Literal("soft"), Type.Literal("hard")]));
|
|
@@ -578,6 +614,12 @@ export function registerForgePluginTools(api, config) {
|
|
|
578
614
|
description: "Call one allowed dedicated Workbench route after the conversation has narrowed to flow catalog, flow CRUD, execution, run history, published output, node result, or latest node output. Do not use batch CRUD for Workbench.",
|
|
579
615
|
routeSpecs: workbenchRouteSpecs
|
|
580
616
|
});
|
|
617
|
+
registerSpecializedRouteTool(api, config, {
|
|
618
|
+
name: "forge_call_artifact_route",
|
|
619
|
+
label: "Forge Artifact Route",
|
|
620
|
+
description: "Call one allowed dedicated Artifact Store route for metadata listing, trusted upload, metadata update, static rescan, LLM metadata enrichment, generic entity-link replacement, trust state, versions, or audit. Do not expose download, open, execute, preview, or transform stored file bytes as an agent.",
|
|
621
|
+
routeSpecs: artifactRouteSpecs
|
|
622
|
+
});
|
|
581
623
|
registerReadTool(api, config, {
|
|
582
624
|
name: "forge_get_user_directory",
|
|
583
625
|
label: "Forge User Directory",
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
CREATE TABLE IF NOT EXISTS artifact_blobs (
|
|
2
|
+
content_sha256 TEXT PRIMARY KEY,
|
|
3
|
+
storage_key TEXT NOT NULL UNIQUE,
|
|
4
|
+
byte_size INTEGER NOT NULL,
|
|
5
|
+
detected_mime_type TEXT NOT NULL DEFAULT '',
|
|
6
|
+
created_at TEXT NOT NULL
|
|
7
|
+
);
|
|
8
|
+
|
|
9
|
+
CREATE TABLE IF NOT EXISTS artifacts (
|
|
10
|
+
id TEXT PRIMARY KEY,
|
|
11
|
+
title TEXT NOT NULL,
|
|
12
|
+
short_description TEXT NOT NULL DEFAULT '',
|
|
13
|
+
description TEXT NOT NULL DEFAULT '',
|
|
14
|
+
original_file_name TEXT NOT NULL,
|
|
15
|
+
storage_key TEXT NOT NULL,
|
|
16
|
+
storage_path TEXT NOT NULL,
|
|
17
|
+
content_sha256 TEXT NOT NULL,
|
|
18
|
+
byte_size INTEGER NOT NULL,
|
|
19
|
+
detected_extension TEXT NOT NULL,
|
|
20
|
+
declared_mime_type TEXT NOT NULL DEFAULT '',
|
|
21
|
+
detected_mime_type TEXT NOT NULL DEFAULT '',
|
|
22
|
+
format_family TEXT NOT NULL,
|
|
23
|
+
source_kind TEXT NOT NULL DEFAULT 'upload',
|
|
24
|
+
source_label TEXT NOT NULL DEFAULT '',
|
|
25
|
+
uploaded_by_user_id TEXT,
|
|
26
|
+
uploaded_by_agent_id TEXT,
|
|
27
|
+
acting_for_user_id TEXT,
|
|
28
|
+
artifact_state TEXT NOT NULL DEFAULT 'active',
|
|
29
|
+
danger_score INTEGER NOT NULL DEFAULT 0,
|
|
30
|
+
danger_level TEXT NOT NULL DEFAULT 'low',
|
|
31
|
+
download_policy TEXT NOT NULL DEFAULT 'human_only',
|
|
32
|
+
scan_results_json TEXT NOT NULL DEFAULT '{}',
|
|
33
|
+
enrichment_results_json TEXT NOT NULL DEFAULT '{}',
|
|
34
|
+
metadata_json TEXT NOT NULL DEFAULT '{}',
|
|
35
|
+
created_at TEXT NOT NULL,
|
|
36
|
+
updated_at TEXT NOT NULL,
|
|
37
|
+
FOREIGN KEY (content_sha256) REFERENCES artifact_blobs(content_sha256)
|
|
38
|
+
);
|
|
39
|
+
|
|
40
|
+
CREATE INDEX IF NOT EXISTS idx_artifacts_updated
|
|
41
|
+
ON artifacts (updated_at DESC);
|
|
42
|
+
|
|
43
|
+
CREATE INDEX IF NOT EXISTS idx_artifacts_state_danger
|
|
44
|
+
ON artifacts (artifact_state, danger_level, updated_at DESC);
|
|
45
|
+
|
|
46
|
+
CREATE INDEX IF NOT EXISTS idx_artifacts_sha
|
|
47
|
+
ON artifacts (content_sha256, updated_at DESC);
|
|
48
|
+
|
|
49
|
+
CREATE TABLE IF NOT EXISTS artifact_versions (
|
|
50
|
+
id TEXT PRIMARY KEY,
|
|
51
|
+
artifact_id TEXT NOT NULL,
|
|
52
|
+
version_number INTEGER NOT NULL,
|
|
53
|
+
content_sha256 TEXT NOT NULL,
|
|
54
|
+
storage_key TEXT NOT NULL,
|
|
55
|
+
byte_size INTEGER NOT NULL,
|
|
56
|
+
original_file_name TEXT NOT NULL,
|
|
57
|
+
scan_results_json TEXT NOT NULL DEFAULT '{}',
|
|
58
|
+
enrichment_results_json TEXT NOT NULL DEFAULT '{}',
|
|
59
|
+
created_by_actor TEXT,
|
|
60
|
+
created_at TEXT NOT NULL,
|
|
61
|
+
FOREIGN KEY (artifact_id) REFERENCES artifacts(id) ON DELETE CASCADE,
|
|
62
|
+
FOREIGN KEY (content_sha256) REFERENCES artifact_blobs(content_sha256),
|
|
63
|
+
UNIQUE (artifact_id, version_number)
|
|
64
|
+
);
|
|
65
|
+
|
|
66
|
+
CREATE INDEX IF NOT EXISTS idx_artifact_versions_artifact
|
|
67
|
+
ON artifact_versions (artifact_id, version_number DESC);
|
|
68
|
+
|
|
69
|
+
CREATE TABLE IF NOT EXISTS entity_links (
|
|
70
|
+
source_entity_type TEXT NOT NULL,
|
|
71
|
+
source_entity_id TEXT NOT NULL,
|
|
72
|
+
target_entity_type TEXT NOT NULL,
|
|
73
|
+
target_entity_id TEXT NOT NULL,
|
|
74
|
+
anchor_key TEXT NOT NULL DEFAULT '',
|
|
75
|
+
relationship TEXT NOT NULL DEFAULT 'related',
|
|
76
|
+
created_by_actor TEXT,
|
|
77
|
+
created_at TEXT NOT NULL,
|
|
78
|
+
PRIMARY KEY (
|
|
79
|
+
source_entity_type,
|
|
80
|
+
source_entity_id,
|
|
81
|
+
target_entity_type,
|
|
82
|
+
target_entity_id,
|
|
83
|
+
anchor_key,
|
|
84
|
+
relationship
|
|
85
|
+
)
|
|
86
|
+
);
|
|
87
|
+
|
|
88
|
+
CREATE INDEX IF NOT EXISTS idx_entity_links_source
|
|
89
|
+
ON entity_links (source_entity_type, source_entity_id, created_at DESC);
|
|
90
|
+
|
|
91
|
+
CREATE INDEX IF NOT EXISTS idx_entity_links_target
|
|
92
|
+
ON entity_links (target_entity_type, target_entity_id, created_at DESC);
|
|
93
|
+
|
|
94
|
+
CREATE TABLE IF NOT EXISTS artifact_audit_events (
|
|
95
|
+
id TEXT PRIMARY KEY,
|
|
96
|
+
artifact_id TEXT NOT NULL,
|
|
97
|
+
event_type TEXT NOT NULL,
|
|
98
|
+
actor TEXT,
|
|
99
|
+
source TEXT NOT NULL,
|
|
100
|
+
metadata_json TEXT NOT NULL DEFAULT '{}',
|
|
101
|
+
created_at TEXT NOT NULL,
|
|
102
|
+
FOREIGN KEY (artifact_id) REFERENCES artifacts(id) ON DELETE CASCADE
|
|
103
|
+
);
|
|
104
|
+
|
|
105
|
+
CREATE INDEX IF NOT EXISTS idx_artifact_audit_events_artifact
|
|
106
|
+
ON artifact_audit_events (artifact_id, created_at DESC);
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
CREATE TABLE IF NOT EXISTS entity_links (
|
|
2
|
+
source_entity_type TEXT NOT NULL,
|
|
3
|
+
source_entity_id TEXT NOT NULL,
|
|
4
|
+
target_entity_type TEXT NOT NULL,
|
|
5
|
+
target_entity_id TEXT NOT NULL,
|
|
6
|
+
anchor_key TEXT NOT NULL DEFAULT '',
|
|
7
|
+
relationship TEXT NOT NULL DEFAULT 'related',
|
|
8
|
+
created_by_actor TEXT,
|
|
9
|
+
created_at TEXT NOT NULL,
|
|
10
|
+
PRIMARY KEY (
|
|
11
|
+
source_entity_type,
|
|
12
|
+
source_entity_id,
|
|
13
|
+
target_entity_type,
|
|
14
|
+
target_entity_id,
|
|
15
|
+
anchor_key,
|
|
16
|
+
relationship
|
|
17
|
+
)
|
|
18
|
+
);
|
|
19
|
+
|
|
20
|
+
CREATE INDEX IF NOT EXISTS idx_entity_links_source
|
|
21
|
+
ON entity_links (source_entity_type, source_entity_id, created_at DESC);
|
|
22
|
+
|
|
23
|
+
CREATE INDEX IF NOT EXISTS idx_entity_links_target
|
|
24
|
+
ON entity_links (target_entity_type, target_entity_id, created_at DESC);
|