@agenthippo-ai/agenthippo 0.1.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/LICENSE +21 -0
- package/bin/agenthippo.js +2 -0
- package/out/agentpack/github.js +547 -0
- package/out/agentpack/index.js +66 -0
- package/out/agentpack/install.js +297 -0
- package/out/agentpack/manager.js +441 -0
- package/out/agentpack/manifest.js +135 -0
- package/out/agentpack/paths.js +475 -0
- package/out/agentpack/publish.js +248 -0
- package/out/agentpack/stores.js +554 -0
- package/out/agentpack/types.js +5 -0
- package/out/analytics/dashboard/artifactManager.js +439 -0
- package/out/analytics/dashboard/fleetDisplayUtils.js +159 -0
- package/out/analytics/dashboard/fleetOrchestrator.js +142 -0
- package/out/analytics/dashboard/fleetRegistry.js +79 -0
- package/out/analytics/dashboard/fleetRowDefaults.js +87 -0
- package/out/analytics/dashboard/fleetScriptAdapter.js +146 -0
- package/out/analytics/dashboard/fleetStatusUtils.js +30 -0
- package/out/analytics/dashboard/fleetTitleUtils.js +68 -0
- package/out/analytics/dashboard/fleetTypes.js +29 -0
- package/out/analytics/dashboard/index.js +17 -0
- package/out/analytics/dashboard/indexingService.js +422 -0
- package/out/analytics/dashboard/localFleetAdapter.js +222 -0
- package/out/analytics/dashboard/performanceMonitor.js +76 -0
- package/out/analytics/dashboard/processManager.js +209 -0
- package/out/analytics/dashboard/provider.js +3885 -0
- package/out/analytics/dashboard/queryRunner.js +994 -0
- package/out/analytics/dashboard/refreshPolicy.js +16 -0
- package/out/analytics/dashboard/scheduledFleetFingerprint.js +22 -0
- package/out/analytics/dashboard/scheduledFleetStorage.js +241 -0
- package/out/analytics/dashboard/scheduledFleetUtils.js +22 -0
- package/out/analytics/dashboard/sessionEventFleetStats.js +118 -0
- package/out/analytics/dashboard/sessionJsonlFleet.js +204 -0
- package/out/analytics/dashboard/teamViewDiscovery.js +106 -0
- package/out/analytics/dashboard/viewsConfigMerge.js +221 -0
- package/out/analytics/dashboard/webview/analytics-panel.html +155 -0
- package/out/analytics/dashboard/webview/codicon.ttf +0 -0
- package/out/analytics/dashboard/webview/index.html +78 -0
- package/out/analytics/dashboard/webview/panel.js +2295 -0
- package/out/analytics/dashboard/webview/runtime-bridge.js +82 -0
- package/out/analytics/dashboard/webview/styles.css +1009 -0
- package/out/analytics/lifecycle.js +43 -0
- package/out/analytics/service.js +1279 -0
- package/out/analytics/sessionEvents.js +231 -0
- package/out/auth/bootstrapApply.js +72 -0
- package/out/auth/brokerClient.js +126 -0
- package/out/auth/callbackUri.js +59 -0
- package/out/auth/callbackUriParse.js +59 -0
- package/out/auth/githubStoreGate.js +70 -0
- package/out/auth/loopbackAuthServer.js +165 -0
- package/out/auth/pkce.js +9 -0
- package/out/auth/provider.js +239 -0
- package/out/auth/sessionStore.js +193 -0
- package/out/auth/signInFlow.js +182 -0
- package/out/auth/types.js +12 -0
- package/out/auth-broker/config.js +62 -0
- package/out/auth-broker/jwt.js +105 -0
- package/out/auth-broker/pkce.js +57 -0
- package/out/auth-broker/server.js +539 -0
- package/out/auth-broker/store.js +273 -0
- package/out/base-prompts/gateway/openclaw-starter.json5 +144 -0
- package/out/base-prompts/gateway/slack-socket-mode-minimal.manifest.json +44 -0
- package/out/base-prompts/mcp-servers/.mcp.json +13 -0
- package/out/base-prompts/mcp-servers/langfuse-analytics/README.md +142 -0
- package/out/base-prompts/mcp-servers/langfuse-analytics/mcp.json +13 -0
- package/out/base-prompts/mcp-servers/langfuse-analytics/package-lock.json +1192 -0
- package/out/base-prompts/mcp-servers/langfuse-analytics/package.json +23 -0
- package/out/base-prompts/mcp-servers/langfuse-analytics/scripts/run-with-env.sh +12 -0
- package/out/base-prompts/mcp-servers/langfuse-analytics/scripts/sdk-test.js +102 -0
- package/out/base-prompts/mcp-servers/langfuse-analytics/scripts/simple-test.js +137 -0
- package/out/base-prompts/mcp-servers/langfuse-analytics/scripts/test-client.js +118 -0
- package/out/base-prompts/mcp-servers/langfuse-analytics/scripts/test-server.js +209 -0
- package/out/base-prompts/mcp-servers/langfuse-analytics/src/client.ts +431 -0
- package/out/base-prompts/mcp-servers/langfuse-analytics/src/index.ts +270 -0
- package/out/base-prompts/mcp-servers/langfuse-analytics/tsconfig.json +18 -0
- package/out/base-prompts/rules/AGENTS.md +204 -0
- package/out/base-prompts/skills/agent-browser/SKILL.md +102 -0
- package/out/base-prompts/skills/agent-builder/SKILL.md +73 -0
- package/out/base-prompts/skills/agent-builder/references/agent-pack.md +63 -0
- package/out/base-prompts/skills/agent-builder/references/crewai.md +66 -0
- package/out/base-prompts/skills/agent-builder/references/langchain.md +60 -0
- package/out/base-prompts/skills/agent-builder/references/raw-sdk.md +73 -0
- package/out/base-prompts/skills/agent-engine-creator/SKILL.md +586 -0
- package/out/base-prompts/skills/agent-engine-installer/SKILL.md +106 -0
- package/out/base-prompts/skills/agent-engine-installer/scripts/install-engine.mjs +259 -0
- package/out/base-prompts/skills/agent-engine-installer/scripts/install-engine.ps1 +189 -0
- package/out/base-prompts/skills/agenthippo-cli/SKILL.md +69 -0
- package/out/base-prompts/skills/agenthippo-cli/scripts/install.sh +63 -0
- package/out/base-prompts/skills/agentpack-creator/SKILL.md +375 -0
- package/out/base-prompts/skills/agentpack-creator/references/agent-templates.md +261 -0
- package/out/base-prompts/skills/agentpack-creator/references/agents-md-guide.md +195 -0
- package/out/base-prompts/skills/agentpack-creator/scripts/init_pack.py +391 -0
- package/out/base-prompts/skills/agentpack-creator/scripts/init_pack_test.py +294 -0
- package/out/base-prompts/skills/agentpack-testbench/SKILL.md +135 -0
- package/out/base-prompts/skills/algorithmic-art/LICENSE.txt +202 -0
- package/out/base-prompts/skills/algorithmic-art/SKILL.md +405 -0
- package/out/base-prompts/skills/algorithmic-art/templates/generator_template.js +223 -0
- package/out/base-prompts/skills/algorithmic-art/templates/viewer.html +599 -0
- package/out/base-prompts/skills/debug-agent/SKILL.md +83 -0
- package/out/base-prompts/skills/desktop-automation/SKILL.md +166 -0
- package/out/base-prompts/skills/desktop-automation/references/agenthippo-ui-recipes.md +441 -0
- package/out/base-prompts/skills/desktop-automation/scripts/windows-desktop-uia.psm1 +280 -0
- package/out/base-prompts/skills/docx/LICENSE.txt +30 -0
- package/out/base-prompts/skills/docx/SKILL.md +197 -0
- package/out/base-prompts/skills/docx/docx-js.md +350 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/mce/mc.xsd +75 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- package/out/base-prompts/skills/docx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
- package/out/base-prompts/skills/docx/ooxml/scripts/pack.py +159 -0
- package/out/base-prompts/skills/docx/ooxml/scripts/unpack.py +29 -0
- package/out/base-prompts/skills/docx/ooxml/scripts/validate.py +69 -0
- package/out/base-prompts/skills/docx/ooxml/scripts/validation/__init__.py +15 -0
- package/out/base-prompts/skills/docx/ooxml/scripts/validation/base.py +951 -0
- package/out/base-prompts/skills/docx/ooxml/scripts/validation/docx.py +274 -0
- package/out/base-prompts/skills/docx/ooxml/scripts/validation/pptx.py +315 -0
- package/out/base-prompts/skills/docx/ooxml/scripts/validation/redlining.py +279 -0
- package/out/base-prompts/skills/docx/ooxml.md +610 -0
- package/out/base-prompts/skills/docx/scripts/__init__.py +1 -0
- package/out/base-prompts/skills/docx/scripts/document.py +1276 -0
- package/out/base-prompts/skills/docx/scripts/templates/comments.xml +3 -0
- package/out/base-prompts/skills/docx/scripts/templates/commentsExtended.xml +3 -0
- package/out/base-prompts/skills/docx/scripts/templates/commentsExtensible.xml +3 -0
- package/out/base-prompts/skills/docx/scripts/templates/commentsIds.xml +3 -0
- package/out/base-prompts/skills/docx/scripts/templates/people.xml +3 -0
- package/out/base-prompts/skills/docx/scripts/utilities.py +374 -0
- package/out/base-prompts/skills/gateway-outbound/SKILL.md +136 -0
- package/out/base-prompts/skills/mcp-builder/LICENSE.txt +202 -0
- package/out/base-prompts/skills/mcp-builder/SKILL.md +328 -0
- package/out/base-prompts/skills/mcp-builder/reference/evaluation.md +602 -0
- package/out/base-prompts/skills/mcp-builder/reference/mcp_best_practices.md +249 -0
- package/out/base-prompts/skills/mcp-builder/reference/node_mcp_server.md +970 -0
- package/out/base-prompts/skills/mcp-builder/reference/python_mcp_server.md +719 -0
- package/out/base-prompts/skills/mcp-builder/scripts/connections.py +151 -0
- package/out/base-prompts/skills/mcp-builder/scripts/evaluation.py +373 -0
- package/out/base-prompts/skills/mcp-builder/scripts/example_evaluation.xml +22 -0
- package/out/base-prompts/skills/mcp-builder/scripts/requirements.txt +2 -0
- package/out/base-prompts/skills/openclaw/SKILL.md +406 -0
- package/out/base-prompts/skills/openclaw/scripts/run-smoke.sh +61 -0
- package/out/base-prompts/skills/pdf/LICENSE.txt +30 -0
- package/out/base-prompts/skills/pdf/SKILL.md +294 -0
- package/out/base-prompts/skills/pdf/forms.md +205 -0
- package/out/base-prompts/skills/pdf/reference.md +612 -0
- package/out/base-prompts/skills/pdf/scripts/check_bounding_boxes.py +70 -0
- package/out/base-prompts/skills/pdf/scripts/check_bounding_boxes_test.py +226 -0
- package/out/base-prompts/skills/pdf/scripts/check_fillable_fields.py +12 -0
- package/out/base-prompts/skills/pdf/scripts/convert_pdf_to_images.py +35 -0
- package/out/base-prompts/skills/pdf/scripts/create_validation_image.py +41 -0
- package/out/base-prompts/skills/pdf/scripts/extract_form_field_info.py +152 -0
- package/out/base-prompts/skills/pdf/scripts/fill_fillable_fields.py +114 -0
- package/out/base-prompts/skills/pdf/scripts/fill_pdf_form_with_annotations.py +108 -0
- package/out/base-prompts/skills/pptx/LICENSE.txt +30 -0
- package/out/base-prompts/skills/pptx/SKILL.md +484 -0
- package/out/base-prompts/skills/pptx/html2pptx.md +625 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/mce/mc.xsd +75 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- package/out/base-prompts/skills/pptx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
- package/out/base-prompts/skills/pptx/ooxml/scripts/pack.py +159 -0
- package/out/base-prompts/skills/pptx/ooxml/scripts/unpack.py +29 -0
- package/out/base-prompts/skills/pptx/ooxml/scripts/validate.py +69 -0
- package/out/base-prompts/skills/pptx/ooxml/scripts/validation/__init__.py +15 -0
- package/out/base-prompts/skills/pptx/ooxml/scripts/validation/base.py +951 -0
- package/out/base-prompts/skills/pptx/ooxml/scripts/validation/docx.py +274 -0
- package/out/base-prompts/skills/pptx/ooxml/scripts/validation/pptx.py +315 -0
- package/out/base-prompts/skills/pptx/ooxml/scripts/validation/redlining.py +279 -0
- package/out/base-prompts/skills/pptx/ooxml.md +427 -0
- package/out/base-prompts/skills/pptx/scripts/html2pptx.js +984 -0
- package/out/base-prompts/skills/pptx/scripts/inventory.py +1020 -0
- package/out/base-prompts/skills/pptx/scripts/rearrange.py +231 -0
- package/out/base-prompts/skills/pptx/scripts/replace.py +385 -0
- package/out/base-prompts/skills/pptx/scripts/thumbnail.py +450 -0
- package/out/base-prompts/skills/prompt-lab/SKILL.md +149 -0
- package/out/base-prompts/skills/prompt-lab/scripts/query-analytics.sh +2551 -0
- package/out/base-prompts/skills/skill-creator/LICENSE.txt +202 -0
- package/out/base-prompts/skills/skill-creator/SKILL.md +371 -0
- package/out/base-prompts/skills/skill-creator/references/output-patterns.md +82 -0
- package/out/base-prompts/skills/skill-creator/references/workflows.md +28 -0
- package/out/base-prompts/skills/skill-creator/scripts/init_skill.py +303 -0
- package/out/base-prompts/skills/skill-creator/scripts/package_skill.py +110 -0
- package/out/base-prompts/skills/skill-creator/scripts/quick_validate.py +95 -0
- package/out/base-prompts/skills/skill-installer/SKILL.md +251 -0
- package/out/base-prompts/skills/skill-installer/references/store-api.md +219 -0
- package/out/base-prompts/skills/spotlight-dashboard/SKILL.md +83 -0
- package/out/base-prompts/skills/spotlight-insights/SKILL.md +101 -0
- package/out/base-prompts/skills/spotlight-optimize/SKILL.md +93 -0
- package/out/base-prompts/skills/spotlight-optimize/scripts/query-analytics.sh +2551 -0
- package/out/base-prompts/skills/spotlight-query/SKILL.md +314 -0
- package/out/base-prompts/skills/spotlight-query/references/otel-schema.md +163 -0
- package/out/base-prompts/skills/spotlight-query/scripts/query-analytics.sh +2551 -0
- package/out/base-prompts/skills/spotlight-query/scripts/query-analytics.test.sh +744 -0
- package/out/base-prompts/skills/spotlight-query/scripts/test-fixtures/analytics/sessions/sess-test-1.jsonl +14 -0
- package/out/base-prompts/skills/spotlight-query/scripts/test-fixtures/analytics/traces/.duckdb-index.json +7 -0
- package/out/base-prompts/skills/spotlight-query/scripts/test-fixtures/analytics/traces/sample.jsonl +5 -0
- package/out/base-prompts/skills/spotlight-report/SKILL.md +86 -0
- package/out/base-prompts/skills/spotlight-visualize/SKILL.md +92 -0
- package/out/base-prompts/skills/spotlight-visualize/scripts/query-analytics.sh +2551 -0
- package/out/base-prompts/skills/xlsx/LICENSE.txt +30 -0
- package/out/base-prompts/skills/xlsx/SKILL.md +289 -0
- package/out/base-prompts/skills/xlsx/recalc.py +178 -0
- package/out/branding.js +23 -0
- package/out/cli/commands/anywhere.js +66 -0
- package/out/cli/commands/ask.js +243 -0
- package/out/cli/commands/auth-broker.js +24 -0
- package/out/cli/commands/auth.js +219 -0
- package/out/cli/commands/chat.js +354 -0
- package/out/cli/commands/deploy.js +223 -0
- package/out/cli/commands/gateway.js +160 -0
- package/out/cli/commands/pack.js +220 -0
- package/out/cli/commands/probe-custom-engine.js +82 -0
- package/out/cli/commands/serve.js +583 -0
- package/out/cli/commands/store.js +919 -0
- package/out/cli/credential-context.js +113 -0
- package/out/cli/deploy-init.js +2087 -0
- package/out/cli/deps.js +238 -0
- package/out/cli/index.js +390 -0
- package/out/cli/pack-loader.js +376 -0
- package/out/cli/run-custom-engine-runner.js +318 -0
- package/out/cli/runtime.js +409 -0
- package/out/cli/serve-hardening.js +325 -0
- package/out/cli/state-sync.js +135 -0
- package/out/cli/utils.js +220 -0
- package/out/cli/vscode-shim.js +86 -0
- package/out/engines/base.js +159 -0
- package/out/engines/claude.js +1215 -0
- package/out/engines/codex.js +759 -0
- package/out/engines/custom.js +632 -0
- package/out/engines/customEngineIpc.js +95 -0
- package/out/engines/customEngineRunnerEmbed.js +107 -0
- package/out/engines/customRegistry.js +274 -0
- package/out/engines/embeddedCustomEngineRunner.generated.js +9 -0
- package/out/engines/engineApiKey.js +138 -0
- package/out/engines/factory.js +45 -0
- package/out/engines/install.js +372 -0
- package/out/engines/persistentEngineWorker.js +320 -0
- package/out/engines/publish.js +341 -0
- package/out/engines/types.js +17 -0
- package/out/examples/run-headless-repl.js +291 -0
- package/out/examples/run-headless.js +187 -0
- package/out/extension.js +4472 -0
- package/out/gateway/bridge.js +805 -0
- package/out/gateway/cli-agent-id.js +36 -0
- package/out/gateway/client.js +303 -0
- package/out/gateway/client.test.js +395 -0
- package/out/gateway/gateway-scope-errors.js +14 -0
- package/out/gateway/gatewayBackup.js +76 -0
- package/out/gateway/gatewayRouteIndex.js +371 -0
- package/out/gateway/gatewaySessionStore.js +243 -0
- package/out/gateway/index.js +31 -0
- package/out/gateway/lifecycle.js +3056 -0
- package/out/gateway/openclaw-channel-routing.js +317 -0
- package/out/gateway/outboundHandles.js +373 -0
- package/out/gateway/outboundPaths.js +72 -0
- package/out/gateway/outboundSend.js +254 -0
- package/out/gateway/protocol.js +48 -0
- package/out/gateway/resetMappings.js +52 -0
- package/out/gateway/service.js +1244 -0
- package/out/gateway/sessionRouting.js +77 -0
- package/out/headless/index.js +505 -0
- package/out/headless/sync.js +473 -0
- package/out/mcp/publish.js +143 -0
- package/out/mcp.js +597 -0
- package/out/permissions.js +108 -0
- package/out/permissions.mapping.yaml +68 -0
- package/out/registry/index.js +332 -0
- package/out/remote/handleRemoteChat.js +122 -0
- package/out/remote/remotePackStatusBar.js +103 -0
- package/out/remote/serveClient.js +216 -0
- package/out/remoteSkills.js +191 -0
- package/out/runtime/index.js +32 -0
- package/out/runtime/interfaces/config-provider.js +32 -0
- package/out/runtime/interfaces/edit-tracker.js +22 -0
- package/out/runtime/interfaces/index.js +29 -0
- package/out/runtime/interfaces/logger.js +40 -0
- package/out/runtime/interfaces/permission-handler.js +66 -0
- package/out/runtime/interfaces/session-store.js +342 -0
- package/out/runtime/vscode/index.js +20 -0
- package/out/runtime/vscode/vscode-config-provider.js +77 -0
- package/out/runtime/vscode/vscode-edit-tracker.js +120 -0
- package/out/runtime/vscode/vscode-logger.js +30 -0
- package/out/runtime/vscode/vscode-permission-handler.js +72 -0
- package/out/runtime/vscode/vscode-session-store.js +22 -0
- package/out/scripts/agentide-litellm.ps1 +501 -0
- package/out/scripts/agentide-litellm.sh +700 -0
- package/out/scripts/agentide_litellm_hooks_v1.py +604 -0
- package/out/scripts/analytics/agent-fleet-widget.js +954 -0
- package/out/scripts/analytics/agentide-litellm-otel.config.yaml +160 -0
- package/out/scripts/analytics/default-seed-scripts.json +12 -0
- package/out/scripts/analytics/duckdbLocator.js +29 -0
- package/out/scripts/analytics/fleet-local-adapter.js +246 -0
- package/out/scripts/analytics/fleet-workflow.sh +263 -0
- package/out/scripts/analytics/generate-default-charts.py +685 -0
- package/out/scripts/analytics/hotspot-analysis-widget.js +909 -0
- package/out/scripts/analytics/index-traces.py +1394 -0
- package/out/scripts/analytics/install-analytics.sh +286 -0
- package/out/scripts/analytics/live-fleet-4-collector.cjs +315 -0
- package/out/scripts/analytics/live-fleet-4-daemon.mjs +134 -0
- package/out/scripts/analytics/live-fleet-4-widget.cjs +433 -0
- package/out/scripts/analytics/otel-collector.yaml +55 -0
- package/out/scripts/analytics/query-analytics.ps1 +396 -0
- package/out/scripts/analytics/query-analytics.sh +2551 -0
- package/out/scripts/analytics/session-comparison-widget.js +1468 -0
- package/out/scripts/analytics/session-timeline-widget.js +2137 -0
- package/out/scripts/analytics/setup-analytics.ps1 +432 -0
- package/out/scripts/analytics/setup-analytics.sh +854 -0
- package/out/scripts/analytics/start-analytics.ps1 +169 -0
- package/out/scripts/analytics/start-analytics.sh +323 -0
- package/out/scripts/analytics/token-cost-flamegraph-widget.js +954 -0
- package/out/scripts/analytics/token-cost-trend-widget.js +1062 -0
- package/out/scripts/analytics/workflows-collector.cjs +315 -0
- package/out/scripts/analytics/workflows-daemon.mjs +186 -0
- package/out/scripts/analytics/workflows-widget.cjs +433 -0
- package/out/scripts/analytics/wow-model-widget.js +191 -0
- package/out/scripts/gateway/Dockerfile.serve +45 -0
- package/out/scripts/gateway/docker-serve.sh +248 -0
- package/out/scripts/gateway/setup-gateway-server.ps1 +953 -0
- package/out/scripts/gateway/setup-gateway-server.sh +935 -0
- package/out/scripts/gateway/setup-gateway.ps1 +1813 -0
- package/out/scripts/gateway/setup-gateway.sh +1541 -0
- package/out/scripts/setup-cli.ps1 +86 -0
- package/out/scripts/setup-cli.sh +117 -0
- package/out/scripts/tools-manifest.json +83 -0
- package/out/scripts/vendor-tools.mjs +234 -0
- package/out/session.js +272 -0
- package/out/shared/agentEngines.js +170 -0
- package/out/shared/index.js +109 -0
- package/out/shared/models.js +235 -0
- package/out/shared/providers.js +202 -0
- package/out/skills/publish.js +178 -0
- package/out/spotlight/install.js +339 -0
- package/out/spotlight/publish.js +544 -0
- package/out/spotlight/yaml.js +31 -0
- package/out/store/github/setup.js +235 -0
- package/out/store/github/templates/build-index.ts +339 -0
- package/out/store/github/templates/build-index.yml +97 -0
- package/out/store/github/templates/package.json +11 -0
- package/out/store/index.js +755 -0
- package/out/store/oramaIndex.js +884 -0
- package/out/store/shared.js +241 -0
- package/out/sync.js +1827 -0
- package/out/terminalLogger.js +358 -0
- package/out/test/agentEnvFile.test.js +97 -0
- package/out/test/agentYaml.test.js +373 -0
- package/out/test/agentpack.test.js +639 -0
- package/out/test/analytics-lifecycle.test.js +174 -0
- package/out/test/analytics.test.js +524 -0
- package/out/test/auth-bootstrapApply.test.js +102 -0
- package/out/test/auth-broker.test.js +434 -0
- package/out/test/auth-callback.test.js +62 -0
- package/out/test/branding.test.js +229 -0
- package/out/test/cli-agent-id.test.js +55 -0
- package/out/test/credential-context.test.js +105 -0
- package/out/test/customEngineInstall.test.js +100 -0
- package/out/test/customRegistry.test.js +122 -0
- package/out/test/deploy-init.test.js +532 -0
- package/out/test/deps-auto-install.test.js +81 -0
- package/out/test/engine-integration.test.js +297 -0
- package/out/test/enginePaths.test.js +195 -0
- package/out/test/enginePublish.test.js +82 -0
- package/out/test/fleetDisplayUtils.test.js +96 -0
- package/out/test/gateway-client.test.js +381 -0
- package/out/test/gateway-lifecycle.test.js +608 -0
- package/out/test/gateway-outbound.test.js +531 -0
- package/out/test/gateway-reset-mappings.test.js +221 -0
- package/out/test/gateway-route-index.test.js +235 -0
- package/out/test/gateway-session-routing.test.js +47 -0
- package/out/test/gateway-session-store.test.js +216 -0
- package/out/test/github.test.js +232 -0
- package/out/test/headless-sync.test.js +279 -0
- package/out/test/helpers/manifest-fixtures.js +27 -0
- package/out/test/mcp-obo.test.js +82 -0
- package/out/test/mcp.test.js +307 -0
- package/out/test/openclaw-channel-routing.test.js +191 -0
- package/out/test/pathSafety.test.js +63 -0
- package/out/test/permissions.test.js +175 -0
- package/out/test/persistent-engine-worker.test.js +220 -0
- package/out/test/refreshPolicy.test.js +60 -0
- package/out/test/registry.test.js +351 -0
- package/out/test/runtime.test.js +349 -0
- package/out/test/scheduledFleetStorage.test.js +72 -0
- package/out/test/serve-hardening.test.js +192 -0
- package/out/test/serveClient.test.js +173 -0
- package/out/test/sessionJsonlFleet.test.js +78 -0
- package/out/test/shared.test.js +173 -0
- package/out/test/skills-mcp.test.js +299 -0
- package/out/test/spotlightPublish.test.js +299 -0
- package/out/test/spotlightYaml.test.js +58 -0
- package/out/test/state-sync-peer.test.js +74 -0
- package/out/test/store.test.js +331 -0
- package/out/test/stores.test.js +504 -0
- package/out/test/sync-switch.test.js +251 -0
- package/out/test/teamViewDiscovery.test.js +90 -0
- package/out/test/toolPath.test.js +120 -0
- package/out/test/utils.test.js +308 -0
- package/out/test/viewsConfigMerge.test.js +180 -0
- package/out/test/windows-command-line.test.js +75 -0
- package/out/utils/agentEnvFile.js +131 -0
- package/out/utils/binary.js +175 -0
- package/out/utils/index.js +37 -0
- package/out/utils/network.js +74 -0
- package/out/utils/pathSafety.js +60 -0
- package/out/utils/paths.js +116 -0
- package/out/utils/pid.js +180 -0
- package/out/utils/pythonRunner.js +258 -0
- package/out/utils/resolveNodeBinary.js +168 -0
- package/out/utils/toolPath.js +83 -0
- package/out/utils/windowsCommandLine.js +29 -0
- package/out/utils.js +915 -0
- package/out/workspaceFolders.js +59 -0
- package/package.json +41 -0
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*---------------------------------------------------------------------------------------------
|
|
3
|
+
* Copyright (c) AgentHippo.ai. All rights reserved.
|
|
4
|
+
*--------------------------------------------------------------------------------------------*/
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(o, k2, desc);
|
|
12
|
+
}) : (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
o[k2] = m[k];
|
|
15
|
+
}));
|
|
16
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
17
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
18
|
+
}) : function(o, v) {
|
|
19
|
+
o["default"] = v;
|
|
20
|
+
});
|
|
21
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
22
|
+
var ownKeys = function(o) {
|
|
23
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
24
|
+
var ar = [];
|
|
25
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
26
|
+
return ar;
|
|
27
|
+
};
|
|
28
|
+
return ownKeys(o);
|
|
29
|
+
};
|
|
30
|
+
return function (mod) {
|
|
31
|
+
if (mod && mod.__esModule) return mod;
|
|
32
|
+
var result = {};
|
|
33
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
34
|
+
__setModuleDefault(result, mod);
|
|
35
|
+
return result;
|
|
36
|
+
};
|
|
37
|
+
})();
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.AGENT_TEAM_VIEW_TAGS = exports.FLEET_VIEW_TAG = exports.TEAM_VIEW_TAG = void 0;
|
|
40
|
+
exports.discoverTeamTaggedViews = discoverTeamTaggedViews;
|
|
41
|
+
const fs_1 = require("fs");
|
|
42
|
+
const path = __importStar(require("path"));
|
|
43
|
+
const viewsConfigMerge_1 = require("./viewsConfigMerge");
|
|
44
|
+
/** `view.yaml` tag: view is eligible for the Agent Team sidebar picker. */
|
|
45
|
+
exports.TEAM_VIEW_TAG = 'team';
|
|
46
|
+
/** `view.yaml` tag: fleet-style views also appear in the Agent Team picker. */
|
|
47
|
+
exports.FLEET_VIEW_TAG = 'fleet';
|
|
48
|
+
/** Tags that make a view eligible for Agent Team discovery (built-in `fleet` view is separate). */
|
|
49
|
+
exports.AGENT_TEAM_VIEW_TAGS = [exports.TEAM_VIEW_TAG, exports.FLEET_VIEW_TAG];
|
|
50
|
+
function hasAgentTeamTag(tags) {
|
|
51
|
+
if (!Array.isArray(tags)) {
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
const eligible = new Set(exports.AGENT_TEAM_VIEW_TAGS);
|
|
55
|
+
return tags.some(tag => typeof tag === 'string' && eligible.has(tag.trim().toLowerCase()));
|
|
56
|
+
}
|
|
57
|
+
async function readTeamTaggedView(viewRoot, dirName) {
|
|
58
|
+
const viewYamlPath = path.join(viewRoot, 'view.yaml');
|
|
59
|
+
let raw;
|
|
60
|
+
try {
|
|
61
|
+
raw = await fs_1.promises.readFile(viewYamlPath, 'utf-8');
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return undefined;
|
|
65
|
+
}
|
|
66
|
+
const yaml = require('js-yaml');
|
|
67
|
+
const parsed = yaml.load(raw);
|
|
68
|
+
if (!parsed || typeof parsed !== 'object' || !hasAgentTeamTag(parsed.tags)) {
|
|
69
|
+
return undefined;
|
|
70
|
+
}
|
|
71
|
+
const id = (0, viewsConfigMerge_1.normalizeDashboardViewId)(typeof parsed.id === 'string' ? parsed.id : dirName, dirName);
|
|
72
|
+
const name = typeof parsed.name === 'string' && parsed.name.trim() ? parsed.name.trim() : id;
|
|
73
|
+
const scope = parsed.scope === 'workspace' ? 'workspace' : 'global';
|
|
74
|
+
return { id, name, scope };
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Scan analytics roots for views whose view.yaml includes the `team` or `fleet` tag.
|
|
78
|
+
* Workspace-scoped entries override global entries with the same id.
|
|
79
|
+
*/
|
|
80
|
+
async function discoverTeamTaggedViews(analyticsRoots) {
|
|
81
|
+
const byId = new Map();
|
|
82
|
+
for (const root of analyticsRoots) {
|
|
83
|
+
const viewsDir = path.join(root, 'views');
|
|
84
|
+
let entries;
|
|
85
|
+
try {
|
|
86
|
+
entries = await fs_1.promises.readdir(viewsDir, { withFileTypes: true });
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
for (const entry of entries) {
|
|
92
|
+
if (!entry.isDirectory()) {
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
const record = await readTeamTaggedView(path.join(viewsDir, entry.name), entry.name);
|
|
96
|
+
if (!record || record.id === 'fleet') {
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
const existing = byId.get(record.id);
|
|
100
|
+
if (!existing || (existing.scope === 'global' && record.scope === 'workspace')) {
|
|
101
|
+
byId.set(record.id, record);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return [...byId.values()].sort((a, b) => a.name.localeCompare(b.name));
|
|
106
|
+
}
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*---------------------------------------------------------------------------------------------
|
|
3
|
+
* Copyright (c) AgentHippo.ai. All rights reserved.
|
|
4
|
+
*--------------------------------------------------------------------------------------------*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.REQUEST_VIEW_EXPORT_SNAPSHOT_MESSAGE = exports.VIEW_EXPORT_SNAPSHOT_MESSAGE = exports.WORKFLOWS_SIDECAR_SCRIPTS = exports.WORKFLOWS_RUN_SCRIPT = exports.WORKFLOWS_VIEW_ID = exports.FLEET_WIDGET_SCRIPT = void 0;
|
|
7
|
+
exports.createDefaultWorkflowsView = createDefaultWorkflowsView;
|
|
8
|
+
exports.viewRunsFleetWidget = viewRunsFleetWidget;
|
|
9
|
+
exports.resolveRefreshOnNavigate = resolveRefreshOnNavigate;
|
|
10
|
+
exports.resolveGalleryLayout = resolveGalleryLayout;
|
|
11
|
+
exports.resolvePreserveFleetIframe = resolvePreserveFleetIframe;
|
|
12
|
+
exports.shouldPreserveFleetIframe = shouldPreserveFleetIframe;
|
|
13
|
+
exports.buildViewExportSnapshotMessages = buildViewExportSnapshotMessages;
|
|
14
|
+
exports.shouldRunScriptsOnNavigation = shouldRunScriptsOnNavigation;
|
|
15
|
+
exports.normalizeDashboardViewId = normalizeDashboardViewId;
|
|
16
|
+
exports.formatDisplayNameForAllocatedViewId = formatDisplayNameForAllocatedViewId;
|
|
17
|
+
exports.createDefaultDashboardViewsConfig = createDefaultDashboardViewsConfig;
|
|
18
|
+
exports.resolveMergedActiveViewId = resolveMergedActiveViewId;
|
|
19
|
+
exports.mergeDashboardViewsConfigs = mergeDashboardViewsConfigs;
|
|
20
|
+
exports.FLEET_WIDGET_SCRIPT = 'agent-fleet-widget.js';
|
|
21
|
+
/** Built-in Workflows view (multi-agent pipeline timeline). */
|
|
22
|
+
exports.WORKFLOWS_VIEW_ID = 'workflows';
|
|
23
|
+
exports.WORKFLOWS_RUN_SCRIPT = 'workflows-widget.cjs';
|
|
24
|
+
/**
|
|
25
|
+
* Sidecars seeded next to the run widget but never executed on refresh:
|
|
26
|
+
* the collector/daemon the widget spawns, plus `fleet-workflow.sh` — the writer
|
|
27
|
+
* agents call to emit workflow status (location-independent; writes to the workspace).
|
|
28
|
+
*/
|
|
29
|
+
exports.WORKFLOWS_SIDECAR_SCRIPTS = ['workflows-collector.cjs', 'workflows-daemon.mjs', 'fleet-workflow.sh'];
|
|
30
|
+
function createDefaultWorkflowsView() {
|
|
31
|
+
return {
|
|
32
|
+
id: exports.WORKFLOWS_VIEW_ID,
|
|
33
|
+
name: 'Workflows',
|
|
34
|
+
scope: 'global',
|
|
35
|
+
scripts: [exports.WORKFLOWS_RUN_SCRIPT],
|
|
36
|
+
bundledScripts: exports.WORKFLOWS_SIDECAR_SCRIPTS,
|
|
37
|
+
system: true,
|
|
38
|
+
refreshOnNavigate: 'always',
|
|
39
|
+
layout: 'fleet-dashboard',
|
|
40
|
+
preserveFleetIframe: true,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
/** Host ↔ panel: push `exports/<viewId>.json` to the webview. */
|
|
44
|
+
exports.VIEW_EXPORT_SNAPSHOT_MESSAGE = 'viewExportSnapshot';
|
|
45
|
+
/** Panel ↔ host / iframe ↔ panel: request a view export snapshot. */
|
|
46
|
+
exports.REQUEST_VIEW_EXPORT_SNAPSHOT_MESSAGE = 'requestViewExportSnapshot';
|
|
47
|
+
function normalizeScriptBasename(name) {
|
|
48
|
+
return name.trim().replace(/^.*[/\\]/, '').toLowerCase();
|
|
49
|
+
}
|
|
50
|
+
function viewRunsFleetWidget(view) {
|
|
51
|
+
return view.scripts.some(script => normalizeScriptBasename(script) === exports.FLEET_WIDGET_SCRIPT);
|
|
52
|
+
}
|
|
53
|
+
function resolveRefreshOnNavigate(view) {
|
|
54
|
+
if (view.refreshOnNavigate === 'always' || view.refreshOnNavigate === 'when-empty') {
|
|
55
|
+
return view.refreshOnNavigate;
|
|
56
|
+
}
|
|
57
|
+
return viewRunsFleetWidget(view) ? 'always' : 'when-empty';
|
|
58
|
+
}
|
|
59
|
+
function resolveGalleryLayout(view) {
|
|
60
|
+
if (view.layout === 'fleet-dashboard' || view.layout === 'gallery') {
|
|
61
|
+
return view.layout;
|
|
62
|
+
}
|
|
63
|
+
return resolveRefreshOnNavigate(view) === 'always' ? 'fleet-dashboard' : 'gallery';
|
|
64
|
+
}
|
|
65
|
+
function resolvePreserveFleetIframe(view) {
|
|
66
|
+
if (view.preserveFleetIframe === false) {
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
if (view.preserveFleetIframe === true) {
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
return resolveGalleryLayout(view) === 'fleet-dashboard';
|
|
73
|
+
}
|
|
74
|
+
function shouldPreserveFleetIframe(view) {
|
|
75
|
+
return resolvePreserveFleetIframe(view);
|
|
76
|
+
}
|
|
77
|
+
const VIEW_EXPORT_SESSION_CHUNK_BYTES = 192 * 1024;
|
|
78
|
+
const VIEW_EXPORT_SESSION_CHUNK_SIZE = 100;
|
|
79
|
+
/** Build one or more iframe snapshot messages (chunk only oversized sessions[]). */
|
|
80
|
+
function buildViewExportSnapshotMessages(parsed) {
|
|
81
|
+
const sessions = Array.isArray(parsed.sessions) ? parsed.sessions : [];
|
|
82
|
+
const snapshotMeta = {
|
|
83
|
+
ok: true,
|
|
84
|
+
sessionCount: sessions.length,
|
|
85
|
+
cliActive: Boolean(parsed.diagnostics?.cliActive),
|
|
86
|
+
daemonHint: false,
|
|
87
|
+
};
|
|
88
|
+
if (!Array.isArray(parsed.sessions)) {
|
|
89
|
+
return [{ payload: parsed, meta: snapshotMeta }];
|
|
90
|
+
}
|
|
91
|
+
const sessionsBytes = Buffer.byteLength(JSON.stringify(sessions), 'utf8');
|
|
92
|
+
if (sessionsBytes <= VIEW_EXPORT_SESSION_CHUNK_BYTES) {
|
|
93
|
+
return [{ payload: parsed, meta: snapshotMeta }];
|
|
94
|
+
}
|
|
95
|
+
const snapshotBase = { ...parsed, sessions: [] };
|
|
96
|
+
const chunkCount = Math.max(1, Math.ceil(sessions.length / VIEW_EXPORT_SESSION_CHUNK_SIZE));
|
|
97
|
+
const snapshotId = `${Date.now()}-${sessions.length}-${sessionsBytes}`;
|
|
98
|
+
const messages = [];
|
|
99
|
+
for (let chunkIndex = 0; chunkIndex < chunkCount; chunkIndex += 1) {
|
|
100
|
+
messages.push({
|
|
101
|
+
payload: {
|
|
102
|
+
...snapshotBase,
|
|
103
|
+
sessions: sessions.slice(chunkIndex * VIEW_EXPORT_SESSION_CHUNK_SIZE, (chunkIndex + 1) * VIEW_EXPORT_SESSION_CHUNK_SIZE),
|
|
104
|
+
},
|
|
105
|
+
meta: {
|
|
106
|
+
...snapshotMeta,
|
|
107
|
+
chunkedSessions: true,
|
|
108
|
+
chunkIndex,
|
|
109
|
+
chunkCount,
|
|
110
|
+
snapshotId,
|
|
111
|
+
},
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
return messages;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Spotlight refresh policy for navigation (view switch).
|
|
118
|
+
* @see extensions/agentide/src/analytics/dashboard/README.md
|
|
119
|
+
*/
|
|
120
|
+
function shouldRunScriptsOnNavigation(view, artifactTypes) {
|
|
121
|
+
if (resolveRefreshOnNavigate(view) === 'always') {
|
|
122
|
+
return true;
|
|
123
|
+
}
|
|
124
|
+
return !artifactTypes.some(type => type === 'chart');
|
|
125
|
+
}
|
|
126
|
+
function normalizeDashboardViewId(raw, fallback = 'global') {
|
|
127
|
+
const normalized = (raw ?? fallback)
|
|
128
|
+
.trim()
|
|
129
|
+
.toLowerCase()
|
|
130
|
+
.replace(/[^a-z0-9._-]+/g, '-')
|
|
131
|
+
.replace(/^-+|-+$/g, '');
|
|
132
|
+
return normalized || fallback;
|
|
133
|
+
}
|
|
134
|
+
/** Align display name with numeric id suffix (e.g. workspace-copy-3 → "Workspace Copy 3"). */
|
|
135
|
+
function formatDisplayNameForAllocatedViewId(displayBase, allocatedId, normalizeId = normalizeDashboardViewId) {
|
|
136
|
+
const baseId = normalizeId(displayBase, 'view');
|
|
137
|
+
if (allocatedId === baseId) {
|
|
138
|
+
return displayBase;
|
|
139
|
+
}
|
|
140
|
+
const numericSuffixPrefix = `${baseId}-`;
|
|
141
|
+
if (allocatedId.startsWith(numericSuffixPrefix)) {
|
|
142
|
+
const suffix = allocatedId.slice(numericSuffixPrefix.length);
|
|
143
|
+
if (/^\d+$/.test(suffix)) {
|
|
144
|
+
return `${displayBase} ${suffix}`;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return displayBase;
|
|
148
|
+
}
|
|
149
|
+
function createDefaultDashboardViewsConfig(defaultActiveViewId = 'global') {
|
|
150
|
+
return {
|
|
151
|
+
version: 1,
|
|
152
|
+
activeViewId: defaultActiveViewId,
|
|
153
|
+
views: [
|
|
154
|
+
{ id: 'global', name: 'Global', scope: 'global', scripts: [], system: true },
|
|
155
|
+
{ id: 'workspace', name: 'Workspace', scope: 'workspace', scripts: [], system: true },
|
|
156
|
+
{ id: 'fleet', name: 'Fleet', scope: 'global', scripts: ['agent-fleet-widget.js'], system: true },
|
|
157
|
+
createDefaultWorkflowsView(),
|
|
158
|
+
],
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Resolve activeViewId against the merged catalog; may return a fallback when the stored id is orphan.
|
|
163
|
+
*/
|
|
164
|
+
function resolveMergedActiveViewId(mergedViews, candidateActive, defaults, options) {
|
|
165
|
+
const preferWorkspace = options?.preferWorkspaceScopeFallback === true;
|
|
166
|
+
const normalizedCandidate = candidateActive
|
|
167
|
+
? normalizeDashboardViewId(candidateActive, '')
|
|
168
|
+
: '';
|
|
169
|
+
if (normalizedCandidate && mergedViews.some(view => view.id === normalizedCandidate)) {
|
|
170
|
+
return normalizedCandidate;
|
|
171
|
+
}
|
|
172
|
+
if (preferWorkspace && mergedViews.some(view => view.id === 'workspace')) {
|
|
173
|
+
return 'workspace';
|
|
174
|
+
}
|
|
175
|
+
if (mergedViews.some(view => view.id === defaults.activeViewId)) {
|
|
176
|
+
return defaults.activeViewId;
|
|
177
|
+
}
|
|
178
|
+
if (mergedViews.some(view => view.id === 'global')) {
|
|
179
|
+
return 'global';
|
|
180
|
+
}
|
|
181
|
+
const custom = mergedViews.find(view => view.system !== true && view.id !== 'fleet' && view.id !== 'workspace' && view.id !== 'global');
|
|
182
|
+
if (custom) {
|
|
183
|
+
return custom.id;
|
|
184
|
+
}
|
|
185
|
+
return defaults.activeViewId;
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Merge global (home) and workspace panel views.yaml configs.
|
|
189
|
+
* Workspace views override global entries with the same id.
|
|
190
|
+
* When workspace yaml exists, workspace activeViewId wins (may name any merged view, including global-scoped).
|
|
191
|
+
* Otherwise global activeViewId is used.
|
|
192
|
+
*/
|
|
193
|
+
function mergeDashboardViewsConfigs(globalConfig, workspaceConfig, defaults = createDefaultDashboardViewsConfig()) {
|
|
194
|
+
const globalNorm = globalConfig ?? defaults;
|
|
195
|
+
const viewsById = new Map();
|
|
196
|
+
for (const view of globalNorm.views) {
|
|
197
|
+
viewsById.set(view.id, view);
|
|
198
|
+
}
|
|
199
|
+
if (workspaceConfig) {
|
|
200
|
+
for (const view of workspaceConfig.views) {
|
|
201
|
+
viewsById.set(view.id, view);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
const mergedViews = [...viewsById.values()];
|
|
205
|
+
if (workspaceConfig) {
|
|
206
|
+
const workspaceActive = normalizeDashboardViewId(workspaceConfig.activeViewId, defaults.activeViewId);
|
|
207
|
+
return {
|
|
208
|
+
activeViewId: resolveMergedActiveViewId(mergedViews, workspaceActive, defaults, {
|
|
209
|
+
preferWorkspaceScopeFallback: true,
|
|
210
|
+
}),
|
|
211
|
+
views: mergedViews,
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
const globalActive = normalizeDashboardViewId(globalNorm.activeViewId, defaults.activeViewId);
|
|
215
|
+
return {
|
|
216
|
+
activeViewId: resolveMergedActiveViewId(mergedViews, globalActive, defaults, {
|
|
217
|
+
preferWorkspaceScopeFallback: false,
|
|
218
|
+
}),
|
|
219
|
+
views: mergedViews,
|
|
220
|
+
};
|
|
221
|
+
}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
<div id="app">
|
|
2
|
+
<!-- Summary section (cost, token summary) – can be hidden or scrolled away -->
|
|
3
|
+
<div id="summary-section" class="summary-section">
|
|
4
|
+
<div class="summary-section-header">
|
|
5
|
+
<span class="summary-section-title">Cost & tokens</span>
|
|
6
|
+
<button type="button" id="summary-toggle-btn" class="toolbar-btn summary-toggle-btn" title="Hide summary section" aria-label="Hide summary">Hide</button>
|
|
7
|
+
</div>
|
|
8
|
+
<div id="summary-cards" style="display: none;"></div>
|
|
9
|
+
</div>
|
|
10
|
+
|
|
11
|
+
<!-- Gallery Toolbar -->
|
|
12
|
+
<div id="gallery-toolbar">
|
|
13
|
+
<div class="toolbar-menu-container">
|
|
14
|
+
<button id="toolbar-menu-btn" class="toolbar-btn icon-only" title="Dashboard menu" aria-label="Dashboard menu" aria-haspopup="true" aria-expanded="false">
|
|
15
|
+
<span class="btn-icon menu-icon">☰</span>
|
|
16
|
+
</button>
|
|
17
|
+
<div id="toolbar-menu-dropdown" class="toolbar-dropdown" role="menu" aria-hidden="true">
|
|
18
|
+
<button class="dropdown-item" role="menuitem" data-action="new-view">
|
|
19
|
+
<span class="dropdown-icon">➕</span>
|
|
20
|
+
New view
|
|
21
|
+
</button>
|
|
22
|
+
<button class="dropdown-item" role="menuitem" data-action="duplicate-view">
|
|
23
|
+
<span class="dropdown-icon">📄</span>
|
|
24
|
+
Duplicate view
|
|
25
|
+
</button>
|
|
26
|
+
<button class="dropdown-item" role="menuitem" data-action="rename-view">
|
|
27
|
+
<span class="dropdown-icon">✏️</span>
|
|
28
|
+
Rename view
|
|
29
|
+
</button>
|
|
30
|
+
<button class="dropdown-item" role="menuitem" data-action="delete-view">
|
|
31
|
+
<span class="dropdown-icon">🗑️</span>
|
|
32
|
+
Delete view
|
|
33
|
+
</button>
|
|
34
|
+
<button class="dropdown-item" role="menuitem" data-action="edit-view-scripts">
|
|
35
|
+
<span class="dropdown-icon">📂</span>
|
|
36
|
+
Open view scripts
|
|
37
|
+
</button>
|
|
38
|
+
<button id="share-scripts-only-menu-item" class="dropdown-item" role="menuitem" data-action="share-scripts-only">
|
|
39
|
+
<span class="dropdown-icon">↑</span>
|
|
40
|
+
Share scripts only to store
|
|
41
|
+
</button>
|
|
42
|
+
<button class="dropdown-item" role="menuitem" data-action="refresh-all-views">
|
|
43
|
+
<span class="dropdown-icon">🔁</span>
|
|
44
|
+
Refresh all views
|
|
45
|
+
</button>
|
|
46
|
+
<div class="dropdown-divider" role="separator"></div>
|
|
47
|
+
<button class="dropdown-item" role="menuitem" data-action="reset-home">
|
|
48
|
+
<span class="dropdown-icon">🗑</span>
|
|
49
|
+
Reset charts (home)
|
|
50
|
+
</button>
|
|
51
|
+
<button class="dropdown-item" role="menuitem" data-action="reset-workspace">
|
|
52
|
+
<span class="dropdown-icon">📁</span>
|
|
53
|
+
Reset charts (workspace)
|
|
54
|
+
</button>
|
|
55
|
+
<div class="dropdown-divider" role="separator"></div>
|
|
56
|
+
<button class="dropdown-item" role="menuitem" data-action="reenable-charts">
|
|
57
|
+
<span class="dropdown-icon">👁</span>
|
|
58
|
+
Re-enable hidden charts
|
|
59
|
+
</button>
|
|
60
|
+
</div>
|
|
61
|
+
</div>
|
|
62
|
+
<span class="toolbar-title"> </span>
|
|
63
|
+
<div class="toolbar-actions">
|
|
64
|
+
<select id="view-select" class="toolbar-select" title="Choose dashboard view">
|
|
65
|
+
<option value="__add_view__">+ Add view…</option>
|
|
66
|
+
<option value="global">Global</option>
|
|
67
|
+
<option value="workspace">Workspace</option>
|
|
68
|
+
</select>
|
|
69
|
+
<select id="agent-filter-select" class="toolbar-select" title="Filter by agent pack name">
|
|
70
|
+
<option value="">All agents</option>
|
|
71
|
+
</select>
|
|
72
|
+
<div class="toolbar-icon-group">
|
|
73
|
+
<button id="refresh-charts-btn" class="toolbar-btn icon-only" title="Refresh current view with latest data" aria-label="Refresh current view with latest data">
|
|
74
|
+
<span class="btn-icon">↻</span>
|
|
75
|
+
</button>
|
|
76
|
+
<button id="share-view-btn" class="toolbar-btn icon-only" title="Publish current view to store (full bundle)" aria-label="Publish current view to store (full bundle)">
|
|
77
|
+
<span class="btn-icon" aria-hidden="true">↑</span>
|
|
78
|
+
</button>
|
|
79
|
+
<button id="install-view-btn" class="toolbar-btn icon-only" title="Install Spotlight view from store" aria-label="Install Spotlight view from store">
|
|
80
|
+
<span class="btn-icon" aria-hidden="true">↓</span>
|
|
81
|
+
</button>
|
|
82
|
+
</div>
|
|
83
|
+
</div>
|
|
84
|
+
</div>
|
|
85
|
+
|
|
86
|
+
<!-- Refresh Hint -->
|
|
87
|
+
<div id="refresh-hint" style="display: none;">
|
|
88
|
+
<span>New data available. Use the refresh icon.</span>
|
|
89
|
+
</div>
|
|
90
|
+
|
|
91
|
+
<!-- Gallery Section -->
|
|
92
|
+
<section id="gallery">
|
|
93
|
+
<div id="loading-state" class="state-container">
|
|
94
|
+
<div class="spinner"></div>
|
|
95
|
+
<p class="state-title">Loading...</p>
|
|
96
|
+
</div>
|
|
97
|
+
|
|
98
|
+
<div id="empty-state" class="state-container" style="display: none;">
|
|
99
|
+
<div class="state-icon">📊</div>
|
|
100
|
+
<p class="state-title">No visualizations yet</p>
|
|
101
|
+
<p class="state-hint">Charts will appear here automatically when Spotlight data is available. You can also ask the AI to create custom charts.</p>
|
|
102
|
+
<div class="quick-prompts">
|
|
103
|
+
<button class="quick-prompt" data-prompt="Show me a cost breakdown by model as a pie chart using matplotlib">
|
|
104
|
+
Cost by model
|
|
105
|
+
</button>
|
|
106
|
+
<button class="quick-prompt" data-prompt="Create a line chart of my daily costs for the past week using matplotlib">
|
|
107
|
+
Daily costs
|
|
108
|
+
</button>
|
|
109
|
+
<button class="quick-prompt" data-prompt="Visualize my top sessions by cost as a bar chart">
|
|
110
|
+
Top sessions
|
|
111
|
+
</button>
|
|
112
|
+
</div>
|
|
113
|
+
</div>
|
|
114
|
+
|
|
115
|
+
<div id="generating-state" style="display: none;">
|
|
116
|
+
<div class="generating-header">
|
|
117
|
+
<div class="spinner"></div>
|
|
118
|
+
<span class="generating-title">Generating charts...</span>
|
|
119
|
+
</div>
|
|
120
|
+
<p class="generating-hint">Querying traces and building 6 visualizations</p>
|
|
121
|
+
<button id="cancel-generate-btn">Cancel</button>
|
|
122
|
+
</div>
|
|
123
|
+
|
|
124
|
+
<div id="failed-state" style="display: none;">
|
|
125
|
+
<div class="error-icon">⚠️</div>
|
|
126
|
+
<p class="error-title">Couldn't generate charts</p>
|
|
127
|
+
<p class="error-message" id="error-message"></p>
|
|
128
|
+
<button id="retry-generate-btn">Try again</button>
|
|
129
|
+
<p class="fallback-hint">Use the button below to ask for charts manually.</p>
|
|
130
|
+
</div>
|
|
131
|
+
|
|
132
|
+
<div id="gallery-content" style="display: none;"></div>
|
|
133
|
+
</section>
|
|
134
|
+
|
|
135
|
+
<!-- Ask AI Bar -->
|
|
136
|
+
<div id="ask-ai-bar">
|
|
137
|
+
<p class="ask-ai-hint">Need a visualization or to drilldown on something?</p>
|
|
138
|
+
<button id="ask-ai-btn">
|
|
139
|
+
<span class="icon">✨</span>
|
|
140
|
+
<span>Ask Agent Hippo</span>
|
|
141
|
+
</button>
|
|
142
|
+
</div>
|
|
143
|
+
|
|
144
|
+
<!-- New view name modal (replaces prompt(); webviews don't support window.prompt) -->
|
|
145
|
+
<div id="new-view-modal" class="modal-overlay" role="dialog" aria-labelledby="new-view-modal-title" aria-modal="true" aria-hidden="true" style="display: none;">
|
|
146
|
+
<div class="modal-content">
|
|
147
|
+
<h2 id="new-view-modal-title" class="modal-title">New view name</h2>
|
|
148
|
+
<input type="text" id="new-view-name-input" class="modal-input" placeholder="View name" autocomplete="off" />
|
|
149
|
+
<div class="modal-actions">
|
|
150
|
+
<button type="button" id="new-view-modal-cancel" class="modal-btn modal-btn-secondary">Cancel</button>
|
|
151
|
+
<button type="button" id="new-view-modal-ok" class="modal-btn modal-btn-primary">OK</button>
|
|
152
|
+
</div>
|
|
153
|
+
</div>
|
|
154
|
+
</div>
|
|
155
|
+
</div>
|
|
Binary file
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<!--
|
|
3
|
+
Spotlight Dashboard Template
|
|
4
|
+
This file is a reference only - the actual HTML is generated by provider.ts with:
|
|
5
|
+
- CSP nonces for scripts
|
|
6
|
+
- WebView URIs for resources
|
|
7
|
+
- Panel files resolved from .agentide/analytics/panel/ (user) or bundled defaults
|
|
8
|
+
|
|
9
|
+
Architecture:
|
|
10
|
+
- runtime-bridge.js - bundled; wraps acquireVsCodeApi(), exposes window.panelApi
|
|
11
|
+
- panel.js - seeded from panel.js; uses panelApi for messaging
|
|
12
|
+
- panel.css - seeded from styles.css; VS Code theme-aware styles
|
|
13
|
+
- panel.html - seeded from analytics-panel.html; the HTML body content below
|
|
14
|
+
|
|
15
|
+
Users can customize the dashboard by editing files in .agentide/analytics/panel/.
|
|
16
|
+
The extension never overwrites user-modified files.
|
|
17
|
+
-->
|
|
18
|
+
<html lang="en">
|
|
19
|
+
<head>
|
|
20
|
+
<meta charset="UTF-8">
|
|
21
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
22
|
+
<title>Spotlight Dashboard</title>
|
|
23
|
+
</head>
|
|
24
|
+
<body>
|
|
25
|
+
<!-- Panel HTML body is injected here from panel.html (or analytics-panel.html fallback) -->
|
|
26
|
+
<div id="app">
|
|
27
|
+
<!-- Summary Cards (instant metrics) -->
|
|
28
|
+
<div id="summary-cards" style="display: none;"></div>
|
|
29
|
+
|
|
30
|
+
<!-- Refresh Hint (shown when data is stale) -->
|
|
31
|
+
<div id="refresh-hint" style="display: none;">
|
|
32
|
+
<span>Data has changed since charts were generated</span>
|
|
33
|
+
<button id="refresh-defaults-btn">Refresh</button>
|
|
34
|
+
</div>
|
|
35
|
+
|
|
36
|
+
<!-- Gallery Section -->
|
|
37
|
+
<section id="gallery">
|
|
38
|
+
<!-- Loading State -->
|
|
39
|
+
<div id="loading-state" class="state-container">
|
|
40
|
+
<div class="spinner"></div>
|
|
41
|
+
<p class="state-title">Loading...</p>
|
|
42
|
+
</div>
|
|
43
|
+
|
|
44
|
+
<!-- Empty State -->
|
|
45
|
+
<div id="empty-state" class="state-container" style="display: none;">
|
|
46
|
+
<div class="state-icon">📊</div>
|
|
47
|
+
<p class="state-title">No visualizations yet</p>
|
|
48
|
+
<p class="state-hint">Ask the AI to chart your Spotlight data.</p>
|
|
49
|
+
<div class="quick-prompts">
|
|
50
|
+
<button class="quick-prompt" data-prompt="Show me a cost breakdown by model as a pie chart using matplotlib">
|
|
51
|
+
Cost by model
|
|
52
|
+
</button>
|
|
53
|
+
<button class="quick-prompt" data-prompt="Create a line chart of my daily costs for the past week using matplotlib">
|
|
54
|
+
Daily costs
|
|
55
|
+
</button>
|
|
56
|
+
<button class="quick-prompt" data-prompt="Visualize my top sessions by cost as a bar chart">
|
|
57
|
+
Top sessions
|
|
58
|
+
</button>
|
|
59
|
+
</div>
|
|
60
|
+
</div>
|
|
61
|
+
|
|
62
|
+
<!-- Generating / Failed / Content states -->
|
|
63
|
+
<div id="generating-state" style="display: none;">...</div>
|
|
64
|
+
<div id="failed-state" style="display: none;">...</div>
|
|
65
|
+
<div id="gallery-content" style="display: none;"></div>
|
|
66
|
+
</section>
|
|
67
|
+
|
|
68
|
+
<!-- Ask AI Bar -->
|
|
69
|
+
<div id="ask-ai-bar">
|
|
70
|
+
<button id="ask-ai-btn">Ask Agent Hippo</button>
|
|
71
|
+
</div>
|
|
72
|
+
</div>
|
|
73
|
+
|
|
74
|
+
<!-- Scripts: bridge first, then panel module -->
|
|
75
|
+
<!-- <script nonce="..." src="runtime-bridge.js"></script> -->
|
|
76
|
+
<!-- <script nonce="..." src="panel.js"></script> -->
|
|
77
|
+
</body>
|
|
78
|
+
</html>
|