@particle-academy/agent-integrations 0.24.0 → 0.26.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bridges/sheets.d.cts +3 -1
- package/dist/bridges/sheets.d.ts +3 -1
- package/dist/bridges/slides.d.cts +0 -1
- package/dist/bridges/slides.d.ts +0 -1
- package/dist/bridges-charts.cjs +77 -0
- package/dist/bridges-charts.cjs.map +1 -1
- package/dist/bridges-charts.js +2 -1
- package/dist/bridges-code.cjs +77 -0
- package/dist/bridges-code.cjs.map +1 -1
- package/dist/bridges-code.js +2 -1
- package/dist/bridges-files.cjs +1 -1
- package/dist/bridges-files.cjs.map +1 -1
- package/dist/bridges-files.js +1 -1
- package/dist/bridges-flow.cjs +77 -0
- package/dist/bridges-flow.cjs.map +1 -1
- package/dist/bridges-flow.js +2 -0
- package/dist/bridges-flow.js.map +1 -1
- package/dist/bridges-forms.cjs +77 -0
- package/dist/bridges-forms.cjs.map +1 -1
- package/dist/bridges-forms.js +2 -1
- package/dist/bridges-map.cjs +1 -1
- package/dist/bridges-map.cjs.map +1 -1
- package/dist/bridges-map.js +1 -1
- package/dist/bridges-scene.cjs +77 -0
- package/dist/bridges-scene.cjs.map +1 -1
- package/dist/bridges-scene.js +2 -1
- package/dist/bridges-screens.cjs +77 -0
- package/dist/bridges-screens.cjs.map +1 -1
- package/dist/bridges-screens.js +2 -1
- package/dist/bridges-sheets.cjs +85 -5
- package/dist/bridges-sheets.cjs.map +1 -1
- package/dist/bridges-sheets.js +2 -1
- package/dist/bridges-slides.cjs +86 -13
- package/dist/bridges-slides.cjs.map +1 -1
- package/dist/bridges-slides.js +2 -1
- package/dist/{chunk-FSUAKQ3X.js → chunk-46H4C5AP.js} +13 -9
- package/dist/chunk-46H4C5AP.js.map +1 -0
- package/dist/{chunk-5AD35HS5.js → chunk-775LJJTJ.js} +4 -2
- package/dist/chunk-775LJJTJ.js.map +1 -0
- package/dist/{chunk-UOMSY7MZ.js → chunk-CLFDQ2BW.js} +3 -3
- package/dist/{chunk-UOMSY7MZ.js.map → chunk-CLFDQ2BW.js.map} +1 -1
- package/dist/{chunk-SJ7H242B.js → chunk-EP3G4LYW.js} +4 -2
- package/dist/chunk-EP3G4LYW.js.map +1 -0
- package/dist/{chunk-VUMFO2UW.js → chunk-K3S6WSHZ.js} +4 -2
- package/dist/chunk-K3S6WSHZ.js.map +1 -0
- package/dist/{chunk-3VRQGDKV.js → chunk-NKRSLCS7.js} +3 -3
- package/dist/{chunk-3VRQGDKV.js.map → chunk-NKRSLCS7.js.map} +1 -1
- package/dist/{chunk-FYGMFIY5.js → chunk-QDF37J3V.js} +4 -2
- package/dist/chunk-QDF37J3V.js.map +1 -0
- package/dist/{chunk-4ZVSKAF5.js → chunk-V5BXBX7U.js} +9 -5
- package/dist/chunk-V5BXBX7U.js.map +1 -0
- package/dist/{chunk-CKK4QKD2.js → chunk-YMX7G3XM.js} +4 -2
- package/dist/chunk-YMX7G3XM.js.map +1 -0
- package/dist/index.cjs +104 -90
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +10 -10
- package/package.json +1 -1
- package/dist/chunk-4ZVSKAF5.js.map +0 -1
- package/dist/chunk-5AD35HS5.js.map +0 -1
- package/dist/chunk-CKK4QKD2.js.map +0 -1
- package/dist/chunk-FSUAKQ3X.js.map +0 -1
- package/dist/chunk-FYGMFIY5.js.map +0 -1
- package/dist/chunk-SJ7H242B.js.map +0 -1
- package/dist/chunk-VUMFO2UW.js.map +0 -1
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ensureUndoToolsRegistered } from './chunk-KJ5AOOV7.js';
|
|
1
2
|
import { wrapToolWithActivity } from './chunk-ULJL53DL.js';
|
|
2
3
|
import { textResult, errorResult } from './chunk-4KAIV6OD.js';
|
|
3
4
|
|
|
@@ -7,6 +8,7 @@ function registerScreensBridge(host, options) {
|
|
|
7
8
|
const { adapter } = options;
|
|
8
9
|
const agent = { ...DEFAULT_AGENT, ...options.agent ?? {} };
|
|
9
10
|
const disposers = [];
|
|
11
|
+
ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });
|
|
10
12
|
const target = (screenId) => ({
|
|
11
13
|
kind: "screens",
|
|
12
14
|
screenId,
|
|
@@ -176,5 +178,5 @@ function registerScreensBridge(host, options) {
|
|
|
176
178
|
}
|
|
177
179
|
|
|
178
180
|
export { registerScreensBridge };
|
|
179
|
-
//# sourceMappingURL=chunk-
|
|
180
|
-
//# sourceMappingURL=chunk-
|
|
181
|
+
//# sourceMappingURL=chunk-YMX7G3XM.js.map
|
|
182
|
+
//# sourceMappingURL=chunk-YMX7G3XM.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/bridges/screens.ts"],"names":[],"mappings":";;;;;AAkEA,IAAM,gBAAgB,EAAE,EAAA,EAAI,SAAS,IAAA,EAAM,OAAA,EAAS,OAAO,SAAA,EAAU;AAU9D,SAAS,qBAAA,CACd,MACA,OAAA,EACQ;AACR,EAAA,MAAM,EAAE,SAAQ,GAAI,OAAA;AACpB,EAAA,MAAM,KAAA,GAAQ,EAAE,GAAG,aAAA,EAAe,GAAI,OAAA,CAAQ,KAAA,IAAS,EAAC,EAAG;AAC3D,EAAA,MAAM,YAA+B,EAAC;AAItC,EAAA,yBAAA,CAA0B,IAAA,EAAM,EAAE,cAAA,EAAgB,KAAA,CAAM,IAAI,CAAA;AAE5D,EAAA,MAAM,MAAA,GAAS,CAAC,QAAA,MAAmC;AAAA,IACjD,IAAA,EAAM,SAAA;AAAA,IACN,QAAA;AAAA,IACA,KAAA,EAAO,UAAU,QAAQ,CAAA;AAAA,GAC3B,CAAA;AAEA,EAAA,MAAM,GAAA,GAAM,CACV,IAAA,EACA,WAAA,EACA,YACA,QAAA,EACA,OAAA,EACA,YACA,cAAA,KACG;AACH,IAAA,MAAM,OAAA,GAAU,OAAO,IAAA,KAAqB;AAC1C,MAAA,IAAI;AAAE,QAAA,OAAO,MAAM,QAAQ,IAAI,CAAA;AAAA,MAAG,SAC3B,CAAA,EAAG;AAAE,QAAA,OAAO,YAAY,CAAA,YAAa,KAAA,GAAQ,EAAE,OAAA,GAAU,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,MAAG;AAAA,IAC9E,CAAA;AACA,IAAA,MAAM,KAAA,GAAQ,UAAA,GACV,oBAAA,CAAqB,OAAA,EAAS;AAAA,MAC5B,QAAA,EAAU,IAAA;AAAA,MAAM,KAAA;AAAA,MAAO,IAAA,EAAM,SAAA;AAAA,MAC7B,eAAe,CAAC,EAAE,MAAK,KAAM,cAAA,GAAiB,IAAI,CAAA,IAAK;AAAA,KACxD,CAAA,GACD,OAAA;AACJ,IAAA,SAAA,CAAU,IAAA;AAAA,MACR,IAAA,CAAK,YAAA;AAAA,QACH,EAAE,IAAA,EAAM,WAAA,EAAa,WAAA,EAAa,EAAE,IAAA,EAAM,QAAA,EAAU,UAAA,EAA+B,QAAA,EAAU,oBAAA,EAAsB,KAAA,EAAM,EAAE;AAAA,QAC3H;AAAA;AACF,KACF;AAAA,EACF,CAAA;AAEA,EAAA,GAAA;AAAA,IACE,cAAA;AAAA,IACA,+FAAA;AAAA,IACA,EAAC;AAAA,IACD,EAAC;AAAA,IACD,MAAM;AACJ,MAAA,MAAM,OAAA,GAAU,QAAQ,WAAA,EAAY;AACpC,MAAA,MAAM,IAAA,GAAO,OAAA,CACV,GAAA,CAAI,CAAC,MAAM,CAAA,EAAG,CAAA,CAAE,MAAA,GAAS,QAAA,GAAM,GAAG,CAAA,CAAA,EAAI,CAAA,CAAE,EAAE,GAAG,CAAA,CAAE,KAAA,GAAQ,CAAA,QAAA,EAAM,CAAA,CAAE,KAAK,CAAA,CAAA,GAAK,EAAE,CAAA,EAAG,EAAE,IAAA,GAAO,CAAA,EAAA,EAAK,CAAA,CAAE,IAAI,CAAA,CAAA,CAAA,GAAM,EAAE,CAAA,CAAE,CAAA,CAC5G,KAAK,IAAI,CAAA;AACZ,MAAA,OAAO,UAAA,CAAW,QAAQ,cAAA,EAAgB,EAAE,SAAS,MAAA,EAAQ,OAAA,CAAQ,SAAA,EAAU,EAAG,CAAA;AAAA,IACpF,CAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,GAAA;AAAA,IACE,yBAAA;AAAA,IACA,+CAAA;AAAA,IACA,EAAC;AAAA,IACD,EAAC;AAAA,IACD,MAAM;AACJ,MAAA,MAAM,MAAA,GAAS,QAAQ,SAAA,EAAU;AACjC,MAAA,OAAO,UAAA,CAAW,MAAA,IAAU,QAAA,EAAU,EAAE,QAAQ,CAAA;AAAA,IAClD,CAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,GAAA;AAAA,IACE,oBAAA;AAAA,IACA,+HAAA;AAAA,IACA,EAAC;AAAA,IACD,EAAC;AAAA,IACD,MAAM;AACJ,MAAA,IAAI,CAAC,OAAA,CAAQ,SAAA,EAAW,OAAO,YAAY,0EAA0E,CAAA;AACrH,MAAA,MAAM,KAAA,GAAQ,QAAQ,SAAA,EAAU;AAChC,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,EAAG,CAAA,CAAE,KAAA,GAAQ,CAAA,QAAA,EAAM,CAAA,CAAE,KAAK,CAAA,CAAA,GAAK,EAAE,CAAA,EAAG,CAAA,CAAE,WAAA,GAAc,CAAA,EAAA,EAAK,CAAA,CAAE,WAAW,CAAA,CAAA,CAAA,GAAM,EAAE,CAAA,CAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAClI,MAAA,OAAO,UAAA,CAAW,IAAA,IAAQ,uBAAA,EAAyB,KAAK,CAAA;AAAA,IAC1D,CAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,GAAA;AAAA,IACE,gBAAA;AAAA,IACA,qGAAA;AAAA,IACA;AAAA,MACE,EAAA,EAAI,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,mCAAA,EAAoC;AAAA,MACvE,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MACxB,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,+DAAA,EAA2D;AAAA,MAChG,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,+DAAA;AAAgE,KACzG;AAAA,IACA,CAAC,MAAM,MAAM,CAAA;AAAA,IACb,CAAC,IAAA,KAAS;AACR,MAAA,IAAI,CAAC,OAAA,CAAQ,YAAA,EAAc,OAAO,YAAY,oCAAoC,CAAA;AAClF,MAAA,MAAM,EAAA,GAAK,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA;AACzB,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA;AAC7B,MAAA,IAAI,OAAA,CAAQ,aAAY,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,EAAE,CAAA,EAAG;AAClD,QAAA,OAAO,WAAA,CAAY,CAAA,OAAA,EAAU,EAAE,CAAA,8DAAA,CAAgE,CAAA;AAAA,MACjG;AACA,MAAA,OAAA,CAAQ,YAAA,CAAa;AAAA,QACnB,EAAA;AAAA,QACA,OAAO,OAAO,IAAA,CAAK,KAAA,KAAU,QAAA,GAAW,KAAK,KAAA,GAAQ,MAAA;AAAA,QACrD,IAAA;AAAA,QACA,MAAA,EAAS,KAAK,MAAA,IAAU,OAAO,KAAK,MAAA,KAAW,QAAA,GAAY,KAAK,MAAA,GAAoC;AAAA,OACrG,CAAA;AACD,MAAA,OAAA,CAAQ,UAAU,EAAE,CAAA;AACpB,MAAA,OAAO,UAAA,CAAW,WAAW,IAAI,CAAA,SAAA,EAAY,EAAE,CAAA,CAAA,CAAA,EAAK,EAAE,EAAA,EAAI,IAAA,EAAM,CAAA;AAAA,IAClE,CAAA;AAAA,IACA,IAAA;AAAA,IACA,CAAC,IAAA,KAAS,MAAA,CAAO,OAAO,IAAA,CAAK,EAAA,IAAM,EAAE,CAAC;AAAA,GACxC;AAEA,EAAA,GAAA;AAAA,IACE,iBAAA;AAAA,IACA,oGAAA;AAAA,IACA,EAAE,EAAA,EAAI,EAAE,IAAA,EAAM,UAAS,EAAE;AAAA,IACzB,CAAC,IAAI,CAAA;AAAA,IACL,CAAC,IAAA,KAAS;AACR,MAAA,IAAI,CAAC,OAAA,CAAQ,aAAA,EAAe,OAAO,YAAY,qCAAqC,CAAA;AACpF,MAAA,MAAM,EAAA,GAAK,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA;AACzB,MAAA,IAAI,CAAC,OAAA,CAAQ,WAAA,EAAY,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,EAAE,CAAA,EAAG;AACnD,QAAA,OAAO,WAAA,CAAY,CAAA,kBAAA,EAAqB,EAAE,CAAA,CAAE,CAAA;AAAA,MAC9C;AACA,MAAA,OAAA,CAAQ,cAAc,EAAE,CAAA;AACxB,MAAA,OAAO,WAAW,CAAA,iBAAA,EAAoB,EAAE,CAAA,CAAA,EAAI,EAAE,IAAI,CAAA;AAAA,IACpD,CAAA;AAAA,IACA,IAAA;AAAA,IACA,CAAC,IAAA,KAAS,MAAA,CAAO,OAAO,IAAA,CAAK,EAAA,IAAM,EAAE,CAAC;AAAA,GACxC;AAEA,EAAA,GAAA;AAAA,IACE,oBAAA;AAAA,IACA,mJAAA;AAAA,IACA;AAAA,MACE,EAAA,EAAI,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MACrB,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,CAAC,QAAA,EAAU,SAAA,EAAW,SAAA,EAAW,UAAA,EAAY,OAAO,CAAA;AAAE,KACxF;AAAA,IACA,CAAC,MAAM,QAAQ,CAAA;AAAA,IACf,CAAC,IAAA,KAAS;AACR,MAAA,IAAI,CAAC,OAAA,CAAQ,mBAAA,EAAqB,OAAO,YAAY,2CAA2C,CAAA;AAChG,MAAA,OAAA,CAAQ,mBAAA,CAAoB,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA,EAAG,EAAE,MAAA,EAAQ,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,EAAG,CAAA;AAC5E,MAAA,OAAO,UAAA,CAAW,CAAA,UAAA,EAAa,IAAA,CAAK,EAAE,WAAM,IAAA,CAAK,MAAM,CAAA,CAAA,EAAI,EAAE,IAAI,IAAA,CAAK,EAAA,EAAI,MAAA,EAAQ,IAAA,CAAK,QAAQ,CAAA;AAAA,IACjG,CAAA;AAAA,IACA,IAAA;AAAA,IACA,CAAC,IAAA,KAAS,MAAA,CAAO,OAAO,IAAA,CAAK,EAAA,IAAM,EAAE,CAAC;AAAA,GACxC;AAEA,EAAA,GAAA;AAAA,IACE,wBAAA;AAAA,IACA,oHAAA;AAAA,IACA;AAAA,MACE,EAAA,EAAI,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MACrB,OAAA,EAAS,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,0CAAA;AAA2C,KACrF;AAAA,IACA,CAAC,MAAM,SAAS,CAAA;AAAA,IAChB,CAAC,IAAA,KAAS;AACR,MAAA,IAAI,CAAC,OAAA,CAAQ,mBAAA,EAAqB,OAAO,YAAY,2CAA2C,CAAA;AAChG,MAAA,MAAM,EAAA,GAAK,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA;AACzB,MAAA,MAAM,OAAA,GAAW,KAAK,OAAA,IAAW,OAAO,KAAK,OAAA,KAAY,QAAA,GAAY,IAAA,CAAK,OAAA,GAAqC,EAAC;AAChH,MAAA,OAAA,CAAQ,mBAAA,CAAoB,IAAI,OAAO,CAAA;AACvC,MAAA,OAAO,WAAW,CAAA,mBAAA,EAAsB,EAAE,CAAA,CAAA,EAAI,EAAE,IAAI,CAAA;AAAA,IACtD,CAAA;AAAA,IACA,IAAA;AAAA,IACA,CAAC,IAAA,KAAS,MAAA,CAAO,OAAO,IAAA,CAAK,EAAA,IAAM,EAAE,CAAC;AAAA,GACxC;AAEA,EAAA,GAAA;AAAA,IACE,kBAAA;AAAA,IACA,wGAAA;AAAA,IACA,EAAE,MAAA,EAAQ,EAAE,MAAM,QAAA,EAAU,WAAA,EAAa,0BAAyB,EAAE;AAAA,IACpE,CAAC,QAAQ,CAAA;AAAA,IACT,CAAC,IAAA,KAAS;AACR,MAAA,MAAM,QAAA,GAAW,MAAA,CAAO,IAAA,CAAK,MAAA,IAAU,EAAE,CAAA;AACzC,MAAA,MAAM,OAAA,GAAU,QAAQ,WAAA,EAAY;AACpC,MAAA,IAAI,CAAC,QAAQ,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,QAAQ,CAAA,EAAG;AAC3C,QAAA,OAAO,WAAA,CAAY,CAAA,8BAAA,EAAiC,QAAQ,CAAA,2BAAA,CAA6B,CAAA;AAAA,MAC3F;AACA,MAAA,OAAA,CAAQ,UAAU,QAAQ,CAAA;AAC1B,MAAA,OAAO,WAAW,CAAA,aAAA,EAAgB,QAAQ,IAAI,EAAE,MAAA,EAAQ,UAAU,CAAA;AAAA,IACpE,CAAA;AAAA,IACA,IAAA;AAAA,IACA,CAAC,IAAA,KAAS,MAAA,CAAO,OAAO,IAAA,CAAK,MAAA,IAAU,EAAE,CAAC;AAAA,GAC5C;AAEA,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,SAAA;AAAA,IACJ,KAAA,EAAO,SAAA;AAAA,IACP,SAAS,MAAM;AAAE,MAAA,KAAA,MAAW,CAAA,IAAK,WAAW,CAAA,EAAE;AAAA,IAAG;AAAA,GACnD;AACF","file":"chunk-YMX7G3XM.js","sourcesContent":["import { textResult, errorResult } from \"../mcp/server\";\nimport type { ToolHost } from \"../mcp/tool-host\";\nimport type { JsonObject } from \"../mcp/types\";\nimport type { Bridge } from \"./types\";\nimport { wrapToolWithActivity } from \"../presence/wrap-tool-with-activity\";\nimport { ensureUndoToolsRegistered } from \"../undo/undo-tools\";\nimport type { AgentTarget } from \"../presence/types\";\n\n/**\n * Loose snapshot of a screen — what's in fancy-screens' ScreenMeta plus\n * the host's optional activity status. Kept here so this bridge has no\n * hard dep on fancy-screens.\n */\nexport type ScreenSnapshot = {\n id: string;\n title?: string;\n /** Whether this screen is the one the human / agent is looking at. */\n active: boolean;\n /** Optional category / kind (e.g. \"form\", \"whiteboard\"). */\n kind?: string;\n};\n\n/**\n * Spec for a dynamically-created screen. The host's `createScreen`\n * implementation looks up `kind` in its template registry and instantiates\n * the matching surface (form / whiteboard / sheet / chart / markdown / etc.).\n */\nexport type ScreenCreateSpec = {\n id: string;\n title?: string;\n /** Template kind. Hosts decide the catalog. */\n kind: string;\n /** Template-specific config. Form: { fields }. Sheet: { headers }. etc. */\n config?: Record<string, unknown>;\n};\n\n/**\n * Adapter exposes the host's screen-navigation surface to the bridge.\n * Hosts wire this up against react-router, a custom tab state, or the\n * fancy-screens registry — wherever \"current screen\" lives.\n *\n * The optional create / destroy / update hooks let agents author screens\n * dynamically against a host-defined template catalog.\n */\nexport type ScreensBridgeAdapter = {\n /** List every available screen. */\n listScreens: () => ScreenSnapshot[];\n /** Read which screen is currently active. */\n getActive: () => string | null;\n /** Navigate to a screen by id. Host updates router / tab state. */\n setActive: (screenId: string) => void;\n /** Optional: instantiate a new screen from a template + config. */\n createScreen?: (spec: ScreenCreateSpec) => void;\n /** Optional: remove a previously-created screen. */\n destroyScreen?: (screenId: string) => void;\n /** Optional: shallow-merge new config into an existing screen. */\n updateScreenContent?: (screenId: string, partial: Record<string, unknown>) => void;\n /** Optional: enumerate the kinds the host knows how to instantiate. */\n listKinds?: () => Array<{ kind: string; label?: string; description?: string; configSchema?: unknown }>;\n};\n\nexport type ScreensBridgeOptions = {\n adapter: ScreensBridgeAdapter;\n agent?: { id: string; name?: string; color?: string };\n};\n\nconst DEFAULT_AGENT = { id: \"agent\", name: \"Agent\", color: \"#a855f7\" };\n\n/**\n * registerScreensBridge — top-level navigation bridge so agents can\n * switch between screens (`screens_navigate`) and discover what surfaces\n * exist (`screens_list`, `screens_describe_active`).\n *\n * Pair with the per-surface bridges (whiteboard, form, sheet, etc.) so\n * the agent has both navigation and per-screen control.\n */\nexport function registerScreensBridge(\n host: ToolHost,\n options: ScreensBridgeOptions,\n): Bridge {\n const { adapter } = options;\n const agent = { ...DEFAULT_AGENT, ...(options.agent ?? {}) };\n const disposers: Array<() => void> = [];\n\n // agent_undo / agent_redo / agent_history are registered whenever any bridge\n // mounts, so undo availability doesn't hinge on which bridges are co-present.\n ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });\n\n const target = (screenId: string): AgentTarget => ({\n kind: \"screens\",\n screenId,\n label: `Screen ${screenId}`,\n });\n\n const reg = (\n name: string,\n description: string,\n properties: Record<string, unknown>,\n required: string[],\n handler: (args: JsonObject) => Promise<any> | any,\n isMutation: boolean,\n targetFromArgs?: (args: JsonObject) => AgentTarget,\n ) => {\n const wrapped = async (args: JsonObject) => {\n try { return await handler(args); }\n catch (e) { return errorResult(e instanceof Error ? e.message : String(e)); }\n };\n const final = isMutation\n ? wrapToolWithActivity(wrapped, {\n toolName: name, agent, kind: \"screens\",\n resolveTarget: ({ args }) => targetFromArgs?.(args) ?? null,\n })\n : wrapped;\n disposers.push(\n host.registerTool(\n { name, description, inputSchema: { type: \"object\", properties: properties as any, required, additionalProperties: false } },\n final as any,\n ),\n );\n };\n\n reg(\n \"screens_list\",\n \"List every screen the host has registered. Returns id, title, active flag, and optional kind.\",\n {},\n [],\n () => {\n const screens = adapter.listScreens();\n const text = screens\n .map((s) => `${s.active ? \"▸\" : \" \"} ${s.id}${s.title ? ` — ${s.title}` : \"\"}${s.kind ? ` [${s.kind}]` : \"\"}`)\n .join(\"\\n\");\n return textResult(text || \"(no screens)\", { screens, active: adapter.getActive() });\n },\n false,\n );\n\n reg(\n \"screens_describe_active\",\n \"Get the currently-active screen id (or null).\",\n {},\n [],\n () => {\n const active = adapter.getActive();\n return textResult(active ?? \"(none)\", { active });\n },\n false,\n );\n\n reg(\n \"screens_list_kinds\",\n \"List the screen kinds (templates) the host knows how to instantiate. Use this before screens_create to know what's available.\",\n {},\n [],\n () => {\n if (!adapter.listKinds) return errorResult(\"Host did not register a kind catalog. Cannot create screens dynamically.\");\n const kinds = adapter.listKinds();\n const text = kinds.map((k) => `${k.kind}${k.label ? ` — ${k.label}` : \"\"}${k.description ? ` (${k.description})` : \"\"}`).join(\"\\n\");\n return textResult(text || \"(no kinds registered)\", kinds);\n },\n false,\n );\n\n reg(\n \"screens_create\",\n \"Instantiate a new screen from a template kind + config. Switches the active view to the new screen.\",\n {\n id: { type: \"string\", description: \"Stable screen id. Must be unique.\" },\n title: { type: \"string\" },\n kind: { type: \"string\", description: \"Template kind — call screens_list_kinds for the catalog.\" },\n config: { type: \"object\", description: \"Template-specific config (e.g. { fields: [...] } for a form).\" },\n },\n [\"id\", \"kind\"],\n (args) => {\n if (!adapter.createScreen) return errorResult(\"Host did not provide createScreen.\");\n const id = String(args.id);\n const kind = String(args.kind);\n if (adapter.listScreens().find((s) => s.id === id)) {\n return errorResult(`Screen ${id} already exists. Use screens_destroy first or pick a fresh id.`);\n }\n adapter.createScreen({\n id,\n title: typeof args.title === \"string\" ? args.title : undefined,\n kind,\n config: (args.config && typeof args.config === \"object\") ? args.config as Record<string, unknown> : undefined,\n });\n adapter.setActive(id);\n return textResult(`Created ${kind} screen \"${id}\"`, { id, kind });\n },\n true,\n (args) => target(String(args.id ?? \"\")),\n );\n\n reg(\n \"screens_destroy\",\n \"Remove a previously-created screen. Active screen falls back to the first remaining one (or null).\",\n { id: { type: \"string\" } },\n [\"id\"],\n (args) => {\n if (!adapter.destroyScreen) return errorResult(\"Host did not provide destroyScreen.\");\n const id = String(args.id);\n if (!adapter.listScreens().find((s) => s.id === id)) {\n return errorResult(`No screen with id ${id}`);\n }\n adapter.destroyScreen(id);\n return textResult(`Destroyed screen ${id}`, { id });\n },\n true,\n (args) => target(String(args.id ?? \"\")),\n );\n\n reg(\n \"screens_set_layout\",\n \"Change the layout of an existing composite screen. Layouts: 'single', 'split-h' (left/right), 'split-v' (top/bottom), 'grid-2x2', 'stack' (tabs).\",\n {\n id: { type: \"string\" },\n layout: { type: \"string\", enum: [\"single\", \"split-h\", \"split-v\", \"grid-2x2\", \"stack\"] },\n },\n [\"id\", \"layout\"],\n (args) => {\n if (!adapter.updateScreenContent) return errorResult(\"Host did not provide updateScreenContent.\");\n adapter.updateScreenContent(String(args.id), { layout: String(args.layout) });\n return textResult(`Layout of ${args.id} → ${args.layout}`, { id: args.id, layout: args.layout });\n },\n true,\n (args) => target(String(args.id ?? \"\")),\n );\n\n reg(\n \"screens_update_content\",\n \"Merge new config into an existing screen (e.g. add a field to a form, append a sheet column, change chart series).\",\n {\n id: { type: \"string\" },\n partial: { type: \"object\", description: \"Shallow-merged into the screen's config.\" },\n },\n [\"id\", \"partial\"],\n (args) => {\n if (!adapter.updateScreenContent) return errorResult(\"Host did not provide updateScreenContent.\");\n const id = String(args.id);\n const partial = (args.partial && typeof args.partial === \"object\") ? args.partial as Record<string, unknown> : {};\n adapter.updateScreenContent(id, partial);\n return textResult(`Updated content of ${id}`, { id });\n },\n true,\n (args) => target(String(args.id ?? \"\")),\n );\n\n reg(\n \"screens_navigate\",\n \"Switch the human's view to a different screen. The host updates its router / tab state and re-renders.\",\n { screen: { type: \"string\", description: \"Screen id to activate.\" } },\n [\"screen\"],\n (args) => {\n const screenId = String(args.screen ?? \"\");\n const screens = adapter.listScreens();\n if (!screens.find((s) => s.id === screenId)) {\n return errorResult(`No screen registered with id \"${screenId}\". Call screens_list first.`);\n }\n adapter.setActive(screenId);\n return textResult(`Navigated to ${screenId}`, { screen: screenId });\n },\n true,\n (args) => target(String(args.screen ?? \"\")),\n );\n\n return {\n id: \"screens\",\n title: \"Screens\",\n dispose: () => { for (const d of disposers) d(); },\n };\n}\n"]}
|
package/dist/index.cjs
CHANGED
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var fancyAutoCommon = require('@particle-academy/fancy-auto-common');
|
|
4
|
-
var fancySheets = require('@particle-academy/fancy-sheets');
|
|
5
4
|
var react = require('react');
|
|
6
|
-
var fancySlides = require('@particle-academy/fancy-slides');
|
|
7
5
|
var jsxRuntime = require('react/jsx-runtime');
|
|
8
6
|
var reactDom = require('react-dom');
|
|
9
7
|
|
|
@@ -287,12 +285,89 @@ function extractMeta(result) {
|
|
|
287
285
|
return void 0;
|
|
288
286
|
}
|
|
289
287
|
|
|
288
|
+
// src/undo/undo-tools.ts
|
|
289
|
+
var installedHosts = /* @__PURE__ */ new WeakSet();
|
|
290
|
+
function ensureUndoToolsRegistered(host, options = {}) {
|
|
291
|
+
if (installedHosts.has(host)) return;
|
|
292
|
+
installedHosts.add(host);
|
|
293
|
+
registerUndoTools(host, options);
|
|
294
|
+
}
|
|
295
|
+
function registerUndoTools(host, options = {}) {
|
|
296
|
+
const defaultAgent = options.defaultAgentId ?? "agent";
|
|
297
|
+
const disposers = [];
|
|
298
|
+
const agentOf = (args) => typeof args?.agentId === "string" ? args.agentId : defaultAgent;
|
|
299
|
+
disposers.push(
|
|
300
|
+
host.registerTool(
|
|
301
|
+
{
|
|
302
|
+
name: "agent_undo",
|
|
303
|
+
description: "Undo the most recent action on the agent's stack. Optional agentId targets a specific agent.",
|
|
304
|
+
inputSchema: {
|
|
305
|
+
type: "object",
|
|
306
|
+
properties: { agentId: { type: "string" } },
|
|
307
|
+
additionalProperties: false
|
|
308
|
+
}
|
|
309
|
+
},
|
|
310
|
+
async (args) => {
|
|
311
|
+
const entry = await fancyAutoCommon.undoOne(agentOf(args));
|
|
312
|
+
if (!entry) return errorResult("Nothing to undo.");
|
|
313
|
+
return textResult(`Undid: ${entry.label}`, { entry: serialize(entry) });
|
|
314
|
+
}
|
|
315
|
+
)
|
|
316
|
+
);
|
|
317
|
+
disposers.push(
|
|
318
|
+
host.registerTool(
|
|
319
|
+
{
|
|
320
|
+
name: "agent_redo",
|
|
321
|
+
description: "Redo the most recently undone action.",
|
|
322
|
+
inputSchema: {
|
|
323
|
+
type: "object",
|
|
324
|
+
properties: { agentId: { type: "string" } },
|
|
325
|
+
additionalProperties: false
|
|
326
|
+
}
|
|
327
|
+
},
|
|
328
|
+
async (args) => {
|
|
329
|
+
const entry = await fancyAutoCommon.redoOne(agentOf(args));
|
|
330
|
+
if (!entry) return errorResult("Nothing to redo.");
|
|
331
|
+
return textResult(`Redid: ${entry.label}`, { entry: serialize(entry) });
|
|
332
|
+
}
|
|
333
|
+
)
|
|
334
|
+
);
|
|
335
|
+
disposers.push(
|
|
336
|
+
host.registerTool(
|
|
337
|
+
{
|
|
338
|
+
name: "agent_history",
|
|
339
|
+
description: "List the agent's undo stack (oldest first). Useful for understanding what's reversible.",
|
|
340
|
+
inputSchema: {
|
|
341
|
+
type: "object",
|
|
342
|
+
properties: { agentId: { type: "string" } },
|
|
343
|
+
additionalProperties: false
|
|
344
|
+
}
|
|
345
|
+
},
|
|
346
|
+
async (args) => {
|
|
347
|
+
const history = fancyAutoCommon.readHistory(agentOf(args)).map(serialize);
|
|
348
|
+
const text = history.map((e) => `${new Date(e.timestamp).toISOString()} ${e.bridgeId} ${e.action}: ${e.label}`).join("\n");
|
|
349
|
+
return textResult(text || "(empty)", history);
|
|
350
|
+
}
|
|
351
|
+
)
|
|
352
|
+
);
|
|
353
|
+
return () => disposers.forEach((d) => d());
|
|
354
|
+
}
|
|
355
|
+
function serialize(entry) {
|
|
356
|
+
return {
|
|
357
|
+
timestamp: entry.timestamp,
|
|
358
|
+
bridgeId: entry.bridgeId,
|
|
359
|
+
action: entry.action,
|
|
360
|
+
label: entry.label
|
|
361
|
+
};
|
|
362
|
+
}
|
|
363
|
+
|
|
290
364
|
// src/bridges/forms.ts
|
|
291
365
|
var DEFAULT_AGENT = { id: "agent", name: "Agent", color: "#a855f7" };
|
|
292
366
|
function registerFormBridge(host, options) {
|
|
293
367
|
const { adapter } = options;
|
|
294
368
|
const agent = { ...DEFAULT_AGENT, ...options.agent ?? {} };
|
|
295
369
|
const disposers = [];
|
|
370
|
+
ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });
|
|
296
371
|
const formId = adapter.id;
|
|
297
372
|
const target = (args) => ({
|
|
298
373
|
kind: "form",
|
|
@@ -438,11 +513,14 @@ function registerFormBridge(host, options) {
|
|
|
438
513
|
}
|
|
439
514
|
};
|
|
440
515
|
}
|
|
516
|
+
|
|
517
|
+
// src/bridges/sheets.ts
|
|
441
518
|
var DEFAULT_AGENT2 = { id: "agent", name: "Agent", color: "#a855f7" };
|
|
442
519
|
function registerSheetsBridge(host, options) {
|
|
443
520
|
const { adapter } = options;
|
|
444
521
|
const agent = { ...DEFAULT_AGENT2, ...options.agent ?? {} };
|
|
445
522
|
const disposers = [];
|
|
523
|
+
ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });
|
|
446
524
|
const target = (sheetId, address) => ({
|
|
447
525
|
kind: "sheet",
|
|
448
526
|
screenId: adapter.screenId,
|
|
@@ -556,13 +634,14 @@ function registerSheetsBridge(host, options) {
|
|
|
556
634
|
value: { description: "string | number | boolean | null. Strings starting with '=' are stored as formulas." }
|
|
557
635
|
},
|
|
558
636
|
["address", "value"],
|
|
559
|
-
(args) => {
|
|
637
|
+
async (args) => {
|
|
560
638
|
const sheetId = getSheetId(args);
|
|
561
639
|
const address = String(args.address);
|
|
562
640
|
const value = args.value;
|
|
563
641
|
const wb = adapter.getWorkbook();
|
|
564
642
|
if (!getSheet(wb, sheetId)) return errorResult(`No sheet ${sheetId}`);
|
|
565
|
-
|
|
643
|
+
const { reduceWorkbook } = await import('@particle-academy/fancy-sheets');
|
|
644
|
+
adapter.setWorkbook(reduceWorkbook(wb, setCellOp(sheetId, address, value)));
|
|
566
645
|
return textResult(`${sheetId}!${address} \u2190 ${JSON.stringify(value)}`, { sheet: sheetId, address, value });
|
|
567
646
|
},
|
|
568
647
|
true,
|
|
@@ -576,13 +655,14 @@ function registerSheetsBridge(host, options) {
|
|
|
576
655
|
cells: { type: "object" }
|
|
577
656
|
},
|
|
578
657
|
["cells"],
|
|
579
|
-
(args) => {
|
|
658
|
+
async (args) => {
|
|
580
659
|
const sheetId = getSheetId(args);
|
|
581
660
|
const wb = adapter.getWorkbook();
|
|
582
661
|
if (!getSheet(wb, sheetId)) return errorResult(`No sheet ${sheetId}`);
|
|
583
662
|
const cells = args.cells && typeof args.cells === "object" ? args.cells : {};
|
|
663
|
+
const { reduceWorkbook } = await import('@particle-academy/fancy-sheets');
|
|
584
664
|
let next = wb;
|
|
585
|
-
for (const [addr, v] of Object.entries(cells)) next =
|
|
665
|
+
for (const [addr, v] of Object.entries(cells)) next = reduceWorkbook(next, setCellOp(sheetId, addr, v));
|
|
586
666
|
adapter.setWorkbook(next);
|
|
587
667
|
return textResult(`Set ${Object.keys(cells).length} cells in ${sheetId}`, { sheet: sheetId, count: Object.keys(cells).length });
|
|
588
668
|
},
|
|
@@ -787,6 +867,7 @@ function registerCodeBridge(host, options) {
|
|
|
787
867
|
const { adapter } = options;
|
|
788
868
|
const agent = { ...DEFAULT_AGENT3, ...options.agent ?? {} };
|
|
789
869
|
const disposers = [];
|
|
870
|
+
ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });
|
|
790
871
|
const target = {
|
|
791
872
|
kind: "code",
|
|
792
873
|
screenId: adapter.screenId,
|
|
@@ -953,6 +1034,7 @@ function registerChartsBridge(host, options) {
|
|
|
953
1034
|
const { adapter } = options;
|
|
954
1035
|
const agent = { ...DEFAULT_AGENT4, ...options.agent ?? {} };
|
|
955
1036
|
const disposers = [];
|
|
1037
|
+
ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });
|
|
956
1038
|
const target = {
|
|
957
1039
|
kind: "chart",
|
|
958
1040
|
screenId: adapter.screenId,
|
|
@@ -1067,6 +1149,7 @@ function registerSceneBridge(host, options) {
|
|
|
1067
1149
|
const { adapter } = options;
|
|
1068
1150
|
const agent = { ...DEFAULT_AGENT5, ...options.agent ?? {} };
|
|
1069
1151
|
const disposers = [];
|
|
1152
|
+
ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });
|
|
1070
1153
|
const target = (objectId) => ({
|
|
1071
1154
|
kind: "scene",
|
|
1072
1155
|
screenId: adapter.screenId,
|
|
@@ -1264,6 +1347,7 @@ function registerScreensBridge(host, options) {
|
|
|
1264
1347
|
const { adapter } = options;
|
|
1265
1348
|
const agent = { ...DEFAULT_AGENT6, ...options.agent ?? {} };
|
|
1266
1349
|
const disposers = [];
|
|
1350
|
+
ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });
|
|
1267
1351
|
const target = (screenId) => ({
|
|
1268
1352
|
kind: "screens",
|
|
1269
1353
|
screenId,
|
|
@@ -1431,11 +1515,14 @@ function registerScreensBridge(host, options) {
|
|
|
1431
1515
|
}
|
|
1432
1516
|
};
|
|
1433
1517
|
}
|
|
1518
|
+
|
|
1519
|
+
// src/bridges/slides.ts
|
|
1434
1520
|
var DEFAULT_AGENT7 = { id: "agent", name: "Agent", color: "#a855f7" };
|
|
1435
1521
|
function registerSlidesBridge(host, options) {
|
|
1436
1522
|
const { adapter } = options;
|
|
1437
1523
|
const agent = { ...DEFAULT_AGENT7, ...options.agent ?? {} };
|
|
1438
1524
|
const disposers = [];
|
|
1525
|
+
ensureUndoToolsRegistered(host, { defaultAgentId: agent.id });
|
|
1439
1526
|
const deckTarget = () => ({
|
|
1440
1527
|
kind: "deck",
|
|
1441
1528
|
screenId: adapter.screenId,
|
|
@@ -1589,14 +1676,15 @@ function registerSlidesBridge(host, options) {
|
|
|
1589
1676
|
"Replace the entire deck atomically \u2014 stream a full presentation in. Pass a complete Deck object ({ id, title, theme, slides }). Validated + migrated before it lands; the prior deck is the undo snapshot.",
|
|
1590
1677
|
{ deck: { description: "A complete Deck object." } },
|
|
1591
1678
|
["deck"],
|
|
1592
|
-
(args) => {
|
|
1679
|
+
async (args) => {
|
|
1593
1680
|
const incoming = args.deck;
|
|
1594
1681
|
if (!incoming || typeof incoming !== "object") {
|
|
1595
1682
|
return errorResult("deck must be a complete Deck object ({ id, title, theme, slides }).");
|
|
1596
1683
|
}
|
|
1684
|
+
const { parseDeck } = await import('@particle-academy/fancy-slides');
|
|
1597
1685
|
let deck;
|
|
1598
1686
|
try {
|
|
1599
|
-
deck =
|
|
1687
|
+
deck = parseDeck(incoming);
|
|
1600
1688
|
} catch (e) {
|
|
1601
1689
|
return errorResult(e instanceof Error ? e.message : String(e));
|
|
1602
1690
|
}
|
|
@@ -1614,11 +1702,12 @@ function registerSlidesBridge(host, options) {
|
|
|
1614
1702
|
slide: { description: "Partial slide payload \u2014 id is auto-generated when absent." }
|
|
1615
1703
|
},
|
|
1616
1704
|
[],
|
|
1617
|
-
(args) => {
|
|
1705
|
+
async (args) => {
|
|
1618
1706
|
const deck = adapter.getDeck();
|
|
1619
1707
|
const incoming = args.slide && typeof args.slide === "object" ? args.slide : {};
|
|
1708
|
+
const { slideId: newSlideId } = await import('@particle-academy/fancy-slides');
|
|
1620
1709
|
const slide = {
|
|
1621
|
-
id: incoming.id ??
|
|
1710
|
+
id: incoming.id ?? newSlideId(),
|
|
1622
1711
|
layout: incoming.layout ?? "blank",
|
|
1623
1712
|
elements: incoming.elements ?? [],
|
|
1624
1713
|
background: incoming.background,
|
|
@@ -1732,12 +1821,13 @@ function registerSlidesBridge(host, options) {
|
|
|
1732
1821
|
element: { description: "Partial element \u2014 type/x/y/w/h required, id auto-generated when absent." }
|
|
1733
1822
|
},
|
|
1734
1823
|
["slideId", "element"],
|
|
1735
|
-
(args) => {
|
|
1824
|
+
async (args) => {
|
|
1736
1825
|
const slideId = str(args.slideId);
|
|
1737
1826
|
const incoming = args.element && typeof args.element === "object" ? args.element : {};
|
|
1738
1827
|
if (!incoming.type) return errorResult("element.type is required.");
|
|
1828
|
+
const { elementId: newElementId } = await import('@particle-academy/fancy-slides');
|
|
1739
1829
|
const element = {
|
|
1740
|
-
id: incoming.id ??
|
|
1830
|
+
id: incoming.id ?? newElementId(),
|
|
1741
1831
|
...incoming
|
|
1742
1832
|
};
|
|
1743
1833
|
adapter.apply({ op: "element.add", slideId, element });
|
|
@@ -1869,84 +1959,8 @@ function firstTextContent(slide) {
|
|
|
1869
1959
|
return void 0;
|
|
1870
1960
|
}
|
|
1871
1961
|
|
|
1872
|
-
// src/undo/undo-tools.ts
|
|
1873
|
-
var installedHosts = /* @__PURE__ */ new WeakSet();
|
|
1874
|
-
function ensureUndoToolsRegistered(host, options = {}) {
|
|
1875
|
-
if (installedHosts.has(host)) return;
|
|
1876
|
-
installedHosts.add(host);
|
|
1877
|
-
registerUndoTools(host, options);
|
|
1878
|
-
}
|
|
1879
|
-
function registerUndoTools(host, options = {}) {
|
|
1880
|
-
const defaultAgent = options.defaultAgentId ?? "agent";
|
|
1881
|
-
const disposers = [];
|
|
1882
|
-
const agentOf = (args) => typeof args?.agentId === "string" ? args.agentId : defaultAgent;
|
|
1883
|
-
disposers.push(
|
|
1884
|
-
host.registerTool(
|
|
1885
|
-
{
|
|
1886
|
-
name: "agent_undo",
|
|
1887
|
-
description: "Undo the most recent action on the agent's stack. Optional agentId targets a specific agent.",
|
|
1888
|
-
inputSchema: {
|
|
1889
|
-
type: "object",
|
|
1890
|
-
properties: { agentId: { type: "string" } },
|
|
1891
|
-
additionalProperties: false
|
|
1892
|
-
}
|
|
1893
|
-
},
|
|
1894
|
-
async (args) => {
|
|
1895
|
-
const entry = await fancyAutoCommon.undoOne(agentOf(args));
|
|
1896
|
-
if (!entry) return errorResult("Nothing to undo.");
|
|
1897
|
-
return textResult(`Undid: ${entry.label}`, { entry: serialize(entry) });
|
|
1898
|
-
}
|
|
1899
|
-
)
|
|
1900
|
-
);
|
|
1901
|
-
disposers.push(
|
|
1902
|
-
host.registerTool(
|
|
1903
|
-
{
|
|
1904
|
-
name: "agent_redo",
|
|
1905
|
-
description: "Redo the most recently undone action.",
|
|
1906
|
-
inputSchema: {
|
|
1907
|
-
type: "object",
|
|
1908
|
-
properties: { agentId: { type: "string" } },
|
|
1909
|
-
additionalProperties: false
|
|
1910
|
-
}
|
|
1911
|
-
},
|
|
1912
|
-
async (args) => {
|
|
1913
|
-
const entry = await fancyAutoCommon.redoOne(agentOf(args));
|
|
1914
|
-
if (!entry) return errorResult("Nothing to redo.");
|
|
1915
|
-
return textResult(`Redid: ${entry.label}`, { entry: serialize(entry) });
|
|
1916
|
-
}
|
|
1917
|
-
)
|
|
1918
|
-
);
|
|
1919
|
-
disposers.push(
|
|
1920
|
-
host.registerTool(
|
|
1921
|
-
{
|
|
1922
|
-
name: "agent_history",
|
|
1923
|
-
description: "List the agent's undo stack (oldest first). Useful for understanding what's reversible.",
|
|
1924
|
-
inputSchema: {
|
|
1925
|
-
type: "object",
|
|
1926
|
-
properties: { agentId: { type: "string" } },
|
|
1927
|
-
additionalProperties: false
|
|
1928
|
-
}
|
|
1929
|
-
},
|
|
1930
|
-
async (args) => {
|
|
1931
|
-
const history = fancyAutoCommon.readHistory(agentOf(args)).map(serialize);
|
|
1932
|
-
const text = history.map((e) => `${new Date(e.timestamp).toISOString()} ${e.bridgeId} ${e.action}: ${e.label}`).join("\n");
|
|
1933
|
-
return textResult(text || "(empty)", history);
|
|
1934
|
-
}
|
|
1935
|
-
)
|
|
1936
|
-
);
|
|
1937
|
-
return () => disposers.forEach((d) => d());
|
|
1938
|
-
}
|
|
1939
|
-
function serialize(entry) {
|
|
1940
|
-
return {
|
|
1941
|
-
timestamp: entry.timestamp,
|
|
1942
|
-
bridgeId: entry.bridgeId,
|
|
1943
|
-
action: entry.action,
|
|
1944
|
-
label: entry.label
|
|
1945
|
-
};
|
|
1946
|
-
}
|
|
1947
|
-
|
|
1948
1962
|
// src/bridges/map.ts
|
|
1949
|
-
var DEFAULT_AGENT8 = { id: "agent", name: "Agent", color: "#
|
|
1963
|
+
var DEFAULT_AGENT8 = { id: "agent", name: "Agent", color: "#a855f7" };
|
|
1950
1964
|
var num2 = (v, fallback) => typeof v === "number" && Number.isFinite(v) ? v : 0;
|
|
1951
1965
|
var str2 = (v, fallback = "") => typeof v === "string" ? v : fallback;
|
|
1952
1966
|
var newId = (prefix) => `${prefix}_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 7)}`;
|
|
@@ -2273,7 +2287,7 @@ function registerMapBridge(host, options) {
|
|
|
2273
2287
|
}
|
|
2274
2288
|
|
|
2275
2289
|
// src/bridges/files.ts
|
|
2276
|
-
var DEFAULT_AGENT9 = { id: "agent", name: "Agent", color: "#
|
|
2290
|
+
var DEFAULT_AGENT9 = { id: "agent", name: "Agent", color: "#a855f7" };
|
|
2277
2291
|
var str3 = (v, fallback = "") => typeof v === "string" ? v : fallback;
|
|
2278
2292
|
var num3 = (v, fallback) => typeof v === "number" && Number.isFinite(v) ? v : 0;
|
|
2279
2293
|
var asPaths = (v) => {
|