agent-bundle 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/README.md +161 -0
- package/dist/agent/agent.d.ts +32 -0
- package/dist/agent/agent.js +241 -0
- package/dist/agent/agent.js.map +1 -0
- package/dist/agent/agent.test-helpers.d.ts +63 -0
- package/dist/agent/agent.test-helpers.js +170 -0
- package/dist/agent/agent.test-helpers.js.map +1 -0
- package/dist/agent/define-agent.d.ts +2 -0
- package/dist/agent/define-agent.js +18 -0
- package/dist/agent/define-agent.js.map +1 -0
- package/dist/agent/dependencies.d.ts +15 -0
- package/dist/agent/dependencies.js +14 -0
- package/dist/agent/dependencies.js.map +1 -0
- package/dist/agent/index.d.ts +4 -0
- package/dist/agent/index.js +5 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/internals.d.ts +28 -0
- package/dist/agent/internals.js +160 -0
- package/dist/agent/internals.js.map +1 -0
- package/dist/agent/session.d.ts +4 -0
- package/dist/agent/session.js +2 -0
- package/dist/agent/session.js.map +1 -0
- package/dist/agent/types.d.ts +52 -0
- package/dist/agent/types.js +2 -0
- package/dist/agent/types.js.map +1 -0
- package/dist/agent-loop/agent-loop.d.ts +27 -0
- package/dist/agent-loop/agent-loop.js +2 -0
- package/dist/agent-loop/agent-loop.js.map +1 -0
- package/dist/agent-loop/index.d.ts +4 -0
- package/dist/agent-loop/index.js +5 -0
- package/dist/agent-loop/index.js.map +1 -0
- package/dist/agent-loop/pi-mono/events.d.ts +3 -0
- package/dist/agent-loop/pi-mono/events.js +73 -0
- package/dist/agent-loop/pi-mono/events.js.map +1 -0
- package/dist/agent-loop/pi-mono/index.d.ts +1 -0
- package/dist/agent-loop/pi-mono/index.js +2 -0
- package/dist/agent-loop/pi-mono/index.js.map +1 -0
- package/dist/agent-loop/pi-mono/input.d.ts +6 -0
- package/dist/agent-loop/pi-mono/input.js +120 -0
- package/dist/agent-loop/pi-mono/input.js.map +1 -0
- package/dist/agent-loop/pi-mono/model.d.ts +7 -0
- package/dist/agent-loop/pi-mono/model.js +72 -0
- package/dist/agent-loop/pi-mono/model.js.map +1 -0
- package/dist/agent-loop/pi-mono/pi-mono-loop.d.ts +11 -0
- package/dist/agent-loop/pi-mono/pi-mono-loop.js +167 -0
- package/dist/agent-loop/pi-mono/pi-mono-loop.js.map +1 -0
- package/dist/agent-loop/pi-mono/pi-mono-loop.test-helpers.d.ts +28 -0
- package/dist/agent-loop/pi-mono/pi-mono-loop.test-helpers.js +76 -0
- package/dist/agent-loop/pi-mono/pi-mono-loop.test-helpers.js.map +1 -0
- package/dist/agent-loop/pi-mono/queue.d.ts +9 -0
- package/dist/agent-loop/pi-mono/queue.js +37 -0
- package/dist/agent-loop/pi-mono/queue.js.map +1 -0
- package/dist/agent-loop/pi-mono/tools.d.ts +4 -0
- package/dist/agent-loop/pi-mono/tools.js +164 -0
- package/dist/agent-loop/pi-mono/tools.js.map +1 -0
- package/dist/agent-loop/pi-mono/utils.d.ts +14 -0
- package/dist/agent-loop/pi-mono/utils.js +83 -0
- package/dist/agent-loop/pi-mono/utils.js.map +1 -0
- package/dist/agent-loop/system-prompt/fill.d.ts +1 -0
- package/dist/agent-loop/system-prompt/fill.js +19 -0
- package/dist/agent-loop/system-prompt/fill.js.map +1 -0
- package/dist/agent-loop/system-prompt/generate.d.ts +11 -0
- package/dist/agent-loop/system-prompt/generate.js +21 -0
- package/dist/agent-loop/system-prompt/generate.js.map +1 -0
- package/dist/agent-loop/system-prompt/index.d.ts +2 -0
- package/dist/agent-loop/system-prompt/index.js +3 -0
- package/dist/agent-loop/system-prompt/index.js.map +1 -0
- package/dist/agent-loop/types.d.ts +77 -0
- package/dist/agent-loop/types.js +2 -0
- package/dist/agent-loop/types.js.map +1 -0
- package/dist/cli/build/build.d.ts +35 -0
- package/dist/cli/build/build.js +174 -0
- package/dist/cli/build/build.js.map +1 -0
- package/dist/cli/build/build.test-helpers.d.ts +9 -0
- package/dist/cli/build/build.test-helpers.js +50 -0
- package/dist/cli/build/build.test-helpers.js.map +1 -0
- package/dist/cli/build/codegen-commands.d.ts +16 -0
- package/dist/cli/build/codegen-commands.js +81 -0
- package/dist/cli/build/codegen-commands.js.map +1 -0
- package/dist/cli/build/codegen.d.ts +55 -0
- package/dist/cli/build/codegen.js +212 -0
- package/dist/cli/build/codegen.js.map +1 -0
- package/dist/cli/build/e2b-template.d.ts +38 -0
- package/dist/cli/build/e2b-template.js +210 -0
- package/dist/cli/build/e2b-template.js.map +1 -0
- package/dist/cli/build/e2b-template.test-helpers.d.ts +19 -0
- package/dist/cli/build/e2b-template.test-helpers.js +80 -0
- package/dist/cli/build/e2b-template.test-helpers.js.map +1 -0
- package/dist/cli/build/sandbox-image.d.ts +35 -0
- package/dist/cli/build/sandbox-image.js +57 -0
- package/dist/cli/build/sandbox-image.js.map +1 -0
- package/dist/cli/build-codegen.d.ts +41 -0
- package/dist/cli/build-codegen.js +168 -0
- package/dist/cli/build-codegen.js.map +1 -0
- package/dist/cli/build-e2b-template.d.ts +38 -0
- package/dist/cli/build-e2b-template.js +223 -0
- package/dist/cli/build-e2b-template.js.map +1 -0
- package/dist/cli/build-e2b-template.test-helpers.d.ts +19 -0
- package/dist/cli/build-e2b-template.test-helpers.js +80 -0
- package/dist/cli/build-e2b-template.test-helpers.js.map +1 -0
- package/dist/cli/build-sandbox-image.d.ts +35 -0
- package/dist/cli/build-sandbox-image.js +57 -0
- package/dist/cli/build-sandbox-image.js.map +1 -0
- package/dist/cli/build.d.ts +30 -0
- package/dist/cli/build.js +151 -0
- package/dist/cli/build.js.map +1 -0
- package/dist/cli/build.test-helpers.d.ts +9 -0
- package/dist/cli/build.test-helpers.js +50 -0
- package/dist/cli/build.test-helpers.js.map +1 -0
- package/dist/cli/config/load-bundle-config.d.ts +2 -0
- package/dist/cli/config/load-bundle-config.js +20 -0
- package/dist/cli/config/load-bundle-config.js.map +1 -0
- package/dist/cli/config/resolve-project-root.d.ts +1 -0
- package/dist/cli/config/resolve-project-root.js +19 -0
- package/dist/cli/config/resolve-project-root.js.map +1 -0
- package/dist/cli/deploy/aws-cli.d.ts +42 -0
- package/dist/cli/deploy/aws-cli.js +95 -0
- package/dist/cli/deploy/aws-cli.js.map +1 -0
- package/dist/cli/deploy/aws-ecr.d.ts +20 -0
- package/dist/cli/deploy/aws-ecr.js +97 -0
- package/dist/cli/deploy/aws-ecr.js.map +1 -0
- package/dist/cli/deploy/aws-ecs-infra.d.ts +39 -0
- package/dist/cli/deploy/aws-ecs-infra.js +169 -0
- package/dist/cli/deploy/aws-ecs-infra.js.map +1 -0
- package/dist/cli/deploy/aws-ecs-role.d.ts +9 -0
- package/dist/cli/deploy/aws-ecs-role.js +114 -0
- package/dist/cli/deploy/aws-ecs-role.js.map +1 -0
- package/dist/cli/deploy/aws-ecs-service.d.ts +37 -0
- package/dist/cli/deploy/aws-ecs-service.js +207 -0
- package/dist/cli/deploy/aws-ecs-service.js.map +1 -0
- package/dist/cli/deploy/aws-ecs-shared.d.ts +59 -0
- package/dist/cli/deploy/aws-ecs-shared.js +30 -0
- package/dist/cli/deploy/aws-ecs-shared.js.map +1 -0
- package/dist/cli/deploy/aws-ecs.d.ts +3 -0
- package/dist/cli/deploy/aws-ecs.js +141 -0
- package/dist/cli/deploy/aws-ecs.js.map +1 -0
- package/dist/cli/deploy/aws-prerequisites.d.ts +16 -0
- package/dist/cli/deploy/aws-prerequisites.js +28 -0
- package/dist/cli/deploy/aws-prerequisites.js.map +1 -0
- package/dist/cli/deploy/aws-teardown.d.ts +13 -0
- package/dist/cli/deploy/aws-teardown.js +204 -0
- package/dist/cli/deploy/aws-teardown.js.map +1 -0
- package/dist/cli/deploy/deploy.d.ts +36 -0
- package/dist/cli/deploy/deploy.js +209 -0
- package/dist/cli/deploy/deploy.js.map +1 -0
- package/dist/cli/error.d.ts +1 -0
- package/dist/cli/error.js +4 -0
- package/dist/cli/error.js.map +1 -0
- package/dist/cli/generate/generate.d.ts +37 -0
- package/dist/cli/generate/generate.js +121 -0
- package/dist/cli/generate/generate.js.map +1 -0
- package/dist/cli/generate.d.ts +32 -0
- package/dist/cli/generate.js +102 -0
- package/dist/cli/generate.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +182 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/load-bundle-config.d.ts +2 -0
- package/dist/cli/load-bundle-config.js +20 -0
- package/dist/cli/load-bundle-config.js.map +1 -0
- package/dist/cli/resolve-project-root.d.ts +1 -0
- package/dist/cli/resolve-project-root.js +19 -0
- package/dist/cli/resolve-project-root.js.map +1 -0
- package/dist/cli/serve/dev.d.ts +6 -0
- package/dist/cli/serve/dev.js +73 -0
- package/dist/cli/serve/dev.js.map +1 -0
- package/dist/cli/serve/http.d.ts +12 -0
- package/dist/cli/serve/http.js +123 -0
- package/dist/cli/serve/http.js.map +1 -0
- package/dist/cli/serve/init.d.ts +42 -0
- package/dist/cli/serve/init.js +110 -0
- package/dist/cli/serve/init.js.map +1 -0
- package/dist/cli/serve/runtime.d.ts +25 -0
- package/dist/cli/serve/runtime.js +142 -0
- package/dist/cli/serve/runtime.js.map +1 -0
- package/dist/cli/serve/serve.d.ts +7 -0
- package/dist/cli/serve/serve.js +63 -0
- package/dist/cli/serve/serve.js.map +1 -0
- package/dist/cli/serve/serve.test-helpers.d.ts +36 -0
- package/dist/cli/serve/serve.test-helpers.js +205 -0
- package/dist/cli/serve/serve.test-helpers.js.map +1 -0
- package/dist/cli/serve/worktree-port.d.ts +36 -0
- package/dist/cli/serve/worktree-port.js +124 -0
- package/dist/cli/serve/worktree-port.js.map +1 -0
- package/dist/cli/serve-http.d.ts +12 -0
- package/dist/cli/serve-http.js +112 -0
- package/dist/cli/serve-http.js.map +1 -0
- package/dist/cli/serve-runtime.d.ts +16 -0
- package/dist/cli/serve-runtime.js +122 -0
- package/dist/cli/serve-runtime.js.map +1 -0
- package/dist/cli/serve.d.ts +33 -0
- package/dist/cli/serve.js +150 -0
- package/dist/cli/serve.js.map +1 -0
- package/dist/cli/serve.test-helpers.d.ts +30 -0
- package/dist/cli/serve.test-helpers.js +145 -0
- package/dist/cli/serve.test-helpers.js.map +1 -0
- package/dist/code-formatter/bundle.json +41 -0
- package/dist/code-formatter/index.ts +26 -0
- package/dist/code-formatter/package.json +10 -0
- package/dist/code-formatter/types.ts +2 -0
- package/dist/code-formatter-e2b/bundle.json +40 -0
- package/dist/code-formatter-e2b/index.ts +25 -0
- package/dist/code-formatter-e2b/package.json +10 -0
- package/dist/code-formatter-e2b/types.ts +2 -0
- package/dist/coding-assistant-ollama/bundle.json +43 -0
- package/dist/coding-assistant-ollama/index.ts +28 -0
- package/dist/coding-assistant-ollama/package.json +10 -0
- package/dist/coding-assistant-ollama/types.ts +2 -0
- package/dist/commands/find.d.ts +8 -0
- package/dist/commands/find.js +11 -0
- package/dist/commands/find.js.map +1 -0
- package/dist/commands/loader.d.ts +13 -0
- package/dist/commands/loader.js +163 -0
- package/dist/commands/loader.js.map +1 -0
- package/dist/commands/types.d.ts +7 -0
- package/dist/commands/types.js +2 -0
- package/dist/commands/types.js.map +1 -0
- package/dist/commands/with-commands.d.ts +6 -0
- package/dist/commands/with-commands.js +19 -0
- package/dist/commands/with-commands.js.map +1 -0
- package/dist/data-analyst/bundle.json +40 -0
- package/dist/data-analyst/index.ts +25 -0
- package/dist/data-analyst/package.json +10 -0
- package/dist/data-analyst/types.ts +2 -0
- package/dist/financial-analyst/bundle.json +40 -0
- package/dist/financial-analyst/index.ts +25 -0
- package/dist/financial-analyst/package.json +10 -0
- package/dist/financial-analyst/types.ts +2 -0
- package/dist/mcp/client-manager.d.ts +26 -0
- package/dist/mcp/client-manager.js +101 -0
- package/dist/mcp/client-manager.js.map +1 -0
- package/dist/mcp/connect-server.d.ts +21 -0
- package/dist/mcp/connect-server.js +170 -0
- package/dist/mcp/connect-server.js.map +1 -0
- package/dist/mcp/index.d.ts +2 -0
- package/dist/mcp/index.js +3 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/sandbox-stdio-transport.d.ts +32 -0
- package/dist/mcp/sandbox-stdio-transport.js +199 -0
- package/dist/mcp/sandbox-stdio-transport.js.map +1 -0
- package/dist/observability/hooks.d.ts +10 -0
- package/dist/observability/hooks.js +97 -0
- package/dist/observability/hooks.js.map +1 -0
- package/dist/observability/index.d.ts +6 -0
- package/dist/observability/index.js +7 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/metrics.d.ts +31 -0
- package/dist/observability/metrics.js +61 -0
- package/dist/observability/metrics.js.map +1 -0
- package/dist/observability/middleware.d.ts +12 -0
- package/dist/observability/middleware.js +45 -0
- package/dist/observability/middleware.js.map +1 -0
- package/dist/observability/otel-harness.test-util.d.ts +37 -0
- package/dist/observability/otel-harness.test-util.js +96 -0
- package/dist/observability/otel-harness.test-util.js.map +1 -0
- package/dist/observability/provider.d.ts +8 -0
- package/dist/observability/provider.js +19 -0
- package/dist/observability/provider.js.map +1 -0
- package/dist/observability/tracing.d.ts +14 -0
- package/dist/observability/tracing.js +40 -0
- package/dist/observability/tracing.js.map +1 -0
- package/dist/observability/types.d.ts +39 -0
- package/dist/observability/types.js +31 -0
- package/dist/observability/types.js.map +1 -0
- package/dist/personalized-recommend/bundle.json +64 -0
- package/dist/personalized-recommend/index.ts +41 -0
- package/dist/personalized-recommend/package.json +10 -0
- package/dist/personalized-recommend/types.ts +2 -0
- package/dist/plugins/loader.d.ts +11 -0
- package/dist/plugins/loader.js +100 -0
- package/dist/plugins/loader.js.map +1 -0
- package/dist/plugins/merge.d.ts +10 -0
- package/dist/plugins/merge.js +22 -0
- package/dist/plugins/merge.js.map +1 -0
- package/dist/plugins/parse.d.ts +10 -0
- package/dist/plugins/parse.js +139 -0
- package/dist/plugins/parse.js.map +1 -0
- package/dist/plugins/types.d.ts +28 -0
- package/dist/plugins/types.js +2 -0
- package/dist/plugins/types.js.map +1 -0
- package/dist/plugins/urls.d.ts +7 -0
- package/dist/plugins/urls.js +40 -0
- package/dist/plugins/urls.js.map +1 -0
- package/dist/runtime.d.ts +5 -0
- package/dist/runtime.js +3 -0
- package/dist/runtime.js.map +1 -0
- package/dist/sandbox/factory.d.ts +2 -0
- package/dist/sandbox/factory.js +27 -0
- package/dist/sandbox/factory.js.map +1 -0
- package/dist/sandbox/index.d.ts +4 -0
- package/dist/sandbox/index.js +5 -0
- package/dist/sandbox/index.js.map +1 -0
- package/dist/sandbox/providers/e2b.d.ts +28 -0
- package/dist/sandbox/providers/e2b.js +294 -0
- package/dist/sandbox/providers/e2b.js.map +1 -0
- package/dist/sandbox/providers/kubernetes-command-run.d.ts +8 -0
- package/dist/sandbox/providers/kubernetes-command-run.js +195 -0
- package/dist/sandbox/providers/kubernetes-command-run.js.map +1 -0
- package/dist/sandbox/providers/kubernetes-helpers.d.ts +31 -0
- package/dist/sandbox/providers/kubernetes-helpers.js +152 -0
- package/dist/sandbox/providers/kubernetes-helpers.js.map +1 -0
- package/dist/sandbox/providers/kubernetes-kubeconfig.d.ts +7 -0
- package/dist/sandbox/providers/kubernetes-kubeconfig.js +51 -0
- package/dist/sandbox/providers/kubernetes-kubeconfig.js.map +1 -0
- package/dist/sandbox/providers/kubernetes-spawn.d.ts +2 -0
- package/dist/sandbox/providers/kubernetes-spawn.js +42 -0
- package/dist/sandbox/providers/kubernetes-spawn.js.map +1 -0
- package/dist/sandbox/providers/kubernetes-spawn.utils.d.ts +32 -0
- package/dist/sandbox/providers/kubernetes-spawn.utils.js +249 -0
- package/dist/sandbox/providers/kubernetes-spawn.utils.js.map +1 -0
- package/dist/sandbox/providers/kubernetes.constants.d.ts +3 -0
- package/dist/sandbox/providers/kubernetes.constants.js +4 -0
- package/dist/sandbox/providers/kubernetes.constants.js.map +1 -0
- package/dist/sandbox/providers/kubernetes.d.ts +37 -0
- package/dist/sandbox/providers/kubernetes.js +258 -0
- package/dist/sandbox/providers/kubernetes.js.map +1 -0
- package/dist/sandbox/types.d.ts +57 -0
- package/dist/sandbox/types.js +2 -0
- package/dist/sandbox/types.js.map +1 -0
- package/dist/sandbox/utils.d.ts +1 -0
- package/dist/sandbox/utils.js +4 -0
- package/dist/sandbox/utils.js.map +1 -0
- package/dist/schema/bundle.d.ts +143 -0
- package/dist/schema/bundle.js +203 -0
- package/dist/schema/bundle.js.map +1 -0
- package/dist/service/command-routes.d.ts +8 -0
- package/dist/service/command-routes.js +44 -0
- package/dist/service/command-routes.js.map +1 -0
- package/dist/service/create-server.d.ts +9 -0
- package/dist/service/create-server.js +113 -0
- package/dist/service/create-server.js.map +1 -0
- package/dist/service/index.d.ts +1 -0
- package/dist/service/index.js +2 -0
- package/dist/service/index.js.map +1 -0
- package/dist/skills/index.d.ts +1 -0
- package/dist/skills/index.js +2 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/loader.d.ts +18 -0
- package/dist/skills/loader.js +142 -0
- package/dist/skills/loader.js.map +1 -0
- package/dist/skills/summaries.d.ts +8 -0
- package/dist/skills/summaries.js +9 -0
- package/dist/skills/summaries.js.map +1 -0
- package/dist/test-helpers/env.d.ts +2 -0
- package/dist/test-helpers/env.js +20 -0
- package/dist/test-helpers/env.js.map +1 -0
- package/dist/test-helpers/mock-agent.d.ts +56 -0
- package/dist/test-helpers/mock-agent.js +180 -0
- package/dist/test-helpers/mock-agent.js.map +1 -0
- package/dist/test-helpers/mock-sandbox.d.ts +33 -0
- package/dist/test-helpers/mock-sandbox.js +200 -0
- package/dist/test-helpers/mock-sandbox.js.map +1 -0
- package/dist/tui/index.d.ts +2 -0
- package/dist/tui/index.js +3 -0
- package/dist/tui/index.js.map +1 -0
- package/dist/tui/render.d.ts +8 -0
- package/dist/tui/render.js +40 -0
- package/dist/tui/render.js.map +1 -0
- package/dist/tui/tui.d.ts +19 -0
- package/dist/tui/tui.js +133 -0
- package/dist/tui/tui.js.map +1 -0
- package/dist/webui/create-webui-server.d.ts +22 -0
- package/dist/webui/create-webui-server.js +293 -0
- package/dist/webui/create-webui-server.js.map +1 -0
- package/dist/webui/event-bus.d.ts +16 -0
- package/dist/webui/event-bus.js +24 -0
- package/dist/webui/event-bus.js.map +1 -0
- package/dist/webui/index.d.ts +2 -0
- package/dist/webui/index.js +3 -0
- package/dist/webui/index.js.map +1 -0
- package/dist/webui/public/app.js +847 -0
- package/dist/webui/public/file-transfer.js +114 -0
- package/dist/webui/public/index.html +166 -0
- package/dist/webui/public/styles.css +1678 -0
- package/package.json +99 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/observability/metrics.ts"],"names":[],"mappings":"AAgCA,MAAM,UAAU,iBAAiB,CAAC,KAAY;IAC5C,OAAO;QACL,eAAe,EAAE,KAAK,CAAC,eAAe,CAAC,8BAA8B,EAAE;YACrE,WAAW,EAAE,sBAAsB;YACnC,IAAI,EAAE,IAAI;SACX,CAAC;QACF,cAAc,EAAE,KAAK,CAAC,mBAAmB,CAAC,6BAA6B,EAAE;YACvE,WAAW,EAAE,mCAAmC;YAChD,IAAI,EAAE,WAAW;SAClB,CAAC;KACH,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAY;IAC7C,OAAO;QACL,eAAe,EAAE,KAAK,CAAC,eAAe,CAAC,wBAAwB,EAAE;YAC/D,WAAW,EAAE,+BAA+B;YAC5C,IAAI,EAAE,IAAI;SACX,CAAC;QACF,aAAa,EAAE,KAAK,CAAC,mBAAmB,CAAC,sBAAsB,EAAE;YAC/D,WAAW,EAAE,gCAAgC;YAC7C,IAAI,EAAE,WAAW;SAClB,CAAC;KACH,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAY;IAC5C,OAAO;QACL,YAAY,EAAE,KAAK,CAAC,eAAe,CAAC,0BAA0B,EAAE;YAC9D,WAAW,EAAE,0BAA0B;YACvC,IAAI,EAAE,IAAI;SACX,CAAC;QACF,UAAU,EAAE,KAAK,CAAC,aAAa,CAAC,wBAAwB,EAAE;YACxD,WAAW,EAAE,6BAA6B;YAC1C,IAAI,EAAE,SAAS;SAChB,CAAC;KACH,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAY;IAC7C,OAAO;QACL,WAAW,EAAE,KAAK,CAAC,aAAa,CAAC,2BAA2B,EAAE;YAC5D,WAAW,EAAE,uBAAuB;YACpC,IAAI,EAAE,SAAS;SAChB,CAAC;QACF,YAAY,EAAE,KAAK,CAAC,aAAa,CAAC,4BAA4B,EAAE;YAC9D,WAAW,EAAE,wBAAwB;YACrC,IAAI,EAAE,SAAS;SAChB,CAAC;KACH,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAY;IAC3C,OAAO;QACL,YAAY,EAAE,KAAK,CAAC,eAAe,CAAC,wBAAwB,EAAE;YAC5D,WAAW,EAAE,uBAAuB;YACpC,IAAI,EAAE,IAAI;SACX,CAAC;QACF,UAAU,EAAE,KAAK,CAAC,aAAa,CAAC,sBAAsB,EAAE;YACtD,WAAW,EAAE,iCAAiC;YAC9C,IAAI,EAAE,SAAS;SAChB,CAAC;KACH,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Context, Next } from "hono";
|
|
2
|
+
import { type ObservabilityProvider } from "./types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Hono middleware that records HTTP request duration, active-request count,
|
|
5
|
+
* and wraps each request in a trace span.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* ```ts
|
|
9
|
+
* app.use("*", observabilityMiddleware(provider));
|
|
10
|
+
* ```
|
|
11
|
+
*/
|
|
12
|
+
export declare function observabilityMiddleware(provider: ObservabilityProvider): (c: Context, next: Next) => Promise<void>;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { createHttpMetrics } from "./metrics.js";
|
|
2
|
+
import { elapsed, now, withSpan } from "./tracing.js";
|
|
3
|
+
import { HttpAttributes } from "./types.js";
|
|
4
|
+
/**
|
|
5
|
+
* Hono middleware that records HTTP request duration, active-request count,
|
|
6
|
+
* and wraps each request in a trace span.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* ```ts
|
|
10
|
+
* app.use("*", observabilityMiddleware(provider));
|
|
11
|
+
* ```
|
|
12
|
+
*/
|
|
13
|
+
export function observabilityMiddleware(provider) {
|
|
14
|
+
const httpMetrics = createHttpMetrics(provider.meter);
|
|
15
|
+
return async function otelMiddleware(c, next) {
|
|
16
|
+
const method = c.req.method;
|
|
17
|
+
const path = c.req.path;
|
|
18
|
+
const startMs = now();
|
|
19
|
+
httpMetrics.activeRequests.add(1, { [HttpAttributes.METHOD]: method });
|
|
20
|
+
try {
|
|
21
|
+
await withSpan(provider.tracer, `HTTP ${method}`, {
|
|
22
|
+
[HttpAttributes.METHOD]: method,
|
|
23
|
+
[HttpAttributes.URL_PATH]: path,
|
|
24
|
+
}, async (span) => {
|
|
25
|
+
await next();
|
|
26
|
+
const route = c.req.routePath;
|
|
27
|
+
span.setAttributes({
|
|
28
|
+
[HttpAttributes.STATUS_CODE]: c.res.status,
|
|
29
|
+
[HttpAttributes.ROUTE]: route,
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
finally {
|
|
34
|
+
const status = c.res.status;
|
|
35
|
+
const route = c.req.routePath;
|
|
36
|
+
httpMetrics.requestDuration.record(elapsed(startMs), {
|
|
37
|
+
[HttpAttributes.METHOD]: method,
|
|
38
|
+
[HttpAttributes.STATUS_CODE]: status,
|
|
39
|
+
[HttpAttributes.ROUTE]: route,
|
|
40
|
+
});
|
|
41
|
+
httpMetrics.activeRequests.add(-1, { [HttpAttributes.METHOD]: method });
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../src/observability/middleware.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAoB,MAAM,cAAc,CAAC;AACnE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,cAAc,EAA8B,MAAM,YAAY,CAAC;AAExE;;;;;;;;GAQG;AACH,MAAM,UAAU,uBAAuB,CAAC,QAA+B;IACrE,MAAM,WAAW,GAAgB,iBAAiB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEnE,OAAO,KAAK,UAAU,cAAc,CAAC,CAAU,EAAE,IAAU;QACzD,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;QAC5B,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;QAExB,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC;QACtB,WAAW,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QAEvE,IAAI,CAAC;YACH,MAAM,QAAQ,CACZ,QAAQ,CAAC,MAAM,EACf,QAAQ,MAAM,EAAE,EAChB;gBACE,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,MAAM;gBAC/B,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,IAAI;aAChC,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;gBACb,MAAM,IAAI,EAAE,CAAC;gBAEb,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC;gBAC9B,IAAI,CAAC,aAAa,CAAC;oBACjB,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM;oBAC1C,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,KAAK;iBAC9B,CAAC,CAAC;YACL,CAAC,CACF,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;YAC5B,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC;YAC9B,WAAW,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;gBACnD,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,MAAM;gBAC/B,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,MAAM;gBACpC,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,KAAK;aAC9B,CAAC,CAAC;YACH,WAAW,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared OTEL test harness: sets up in-memory exporters and SDK providers
|
|
3
|
+
* for asserting on emitted spans and metrics in e2e tests.
|
|
4
|
+
*/
|
|
5
|
+
import { type Attributes } from "@opentelemetry/api";
|
|
6
|
+
import { BasicTracerProvider, InMemorySpanExporter, type ReadableSpan } from "@opentelemetry/sdk-trace-base";
|
|
7
|
+
import { InMemoryMetricExporter, MeterProvider, PeriodicExportingMetricReader, type MetricData } from "@opentelemetry/sdk-metrics";
|
|
8
|
+
import type { ObservabilityProvider } from "./types.js";
|
|
9
|
+
export type OtelTestHarness = {
|
|
10
|
+
provider: ObservabilityProvider;
|
|
11
|
+
spanExporter: InMemorySpanExporter;
|
|
12
|
+
metricExporter: InMemoryMetricExporter;
|
|
13
|
+
metricReader: PeriodicExportingMetricReader;
|
|
14
|
+
tracerProvider: BasicTracerProvider;
|
|
15
|
+
meterProvider: MeterProvider;
|
|
16
|
+
/** Flush metrics so they appear in the exporter, then return all collected metric data. */
|
|
17
|
+
collectMetrics: () => Promise<MetricData[]>;
|
|
18
|
+
/** Return all finished spans. */
|
|
19
|
+
getSpans: () => ReadableSpan[];
|
|
20
|
+
/** Find spans by name substring. */
|
|
21
|
+
findSpans: (nameSubstr: string) => ReadableSpan[];
|
|
22
|
+
/** Find metric data by descriptor name. */
|
|
23
|
+
findMetric: (name: string) => MetricData | undefined;
|
|
24
|
+
/** Shut down providers cleanly. */
|
|
25
|
+
shutdown: () => Promise<void>;
|
|
26
|
+
};
|
|
27
|
+
export declare function createOtelTestHarness(): OtelTestHarness;
|
|
28
|
+
/** Assert that a span has a specific attribute value. */
|
|
29
|
+
export declare function expectSpanAttribute(span: ReadableSpan, key: string, expected: unknown): void;
|
|
30
|
+
/** Assert that a span has OK status. */
|
|
31
|
+
export declare function expectSpanOk(span: ReadableSpan): void;
|
|
32
|
+
/** Assert that a span has ERROR status. */
|
|
33
|
+
export declare function expectSpanError(span: ReadableSpan): void;
|
|
34
|
+
/** Get sum of all data point values for a SUM metric. */
|
|
35
|
+
export declare function sumMetricValue(metric: MetricData, filterAttrs?: Attributes): number;
|
|
36
|
+
/** Check that the metric has at least one data point matching the given attributes. */
|
|
37
|
+
export declare function hasDataPoint(metric: MetricData, attrs: Attributes): boolean;
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared OTEL test harness: sets up in-memory exporters and SDK providers
|
|
3
|
+
* for asserting on emitted spans and metrics in e2e tests.
|
|
4
|
+
*/
|
|
5
|
+
import { SpanStatusCode } from "@opentelemetry/api";
|
|
6
|
+
import { BasicTracerProvider, InMemorySpanExporter, SimpleSpanProcessor, } from "@opentelemetry/sdk-trace-base";
|
|
7
|
+
import { AggregationTemporality, InMemoryMetricExporter, MeterProvider, PeriodicExportingMetricReader, } from "@opentelemetry/sdk-metrics";
|
|
8
|
+
export function createOtelTestHarness() {
|
|
9
|
+
const spanExporter = new InMemorySpanExporter();
|
|
10
|
+
const tracerProvider = new BasicTracerProvider({
|
|
11
|
+
spanProcessors: [new SimpleSpanProcessor(spanExporter)],
|
|
12
|
+
});
|
|
13
|
+
const metricExporter = new InMemoryMetricExporter(AggregationTemporality.CUMULATIVE);
|
|
14
|
+
const metricReader = new PeriodicExportingMetricReader({
|
|
15
|
+
exporter: metricExporter,
|
|
16
|
+
// Very long interval; we will call forceFlush manually.
|
|
17
|
+
exportIntervalMillis: 60_000,
|
|
18
|
+
});
|
|
19
|
+
const meterProvider = new MeterProvider({ readers: [metricReader] });
|
|
20
|
+
const provider = {
|
|
21
|
+
tracer: tracerProvider.getTracer("agent-bundle-e2e-test"),
|
|
22
|
+
meter: meterProvider.getMeter("agent-bundle-e2e-test"),
|
|
23
|
+
};
|
|
24
|
+
async function collectMetrics() {
|
|
25
|
+
await metricReader.forceFlush();
|
|
26
|
+
const allResourceMetrics = metricExporter.getMetrics();
|
|
27
|
+
return allResourceMetrics.flatMap((rm) => rm.scopeMetrics.flatMap((sm) => sm.metrics));
|
|
28
|
+
}
|
|
29
|
+
function getSpans() {
|
|
30
|
+
return spanExporter.getFinishedSpans();
|
|
31
|
+
}
|
|
32
|
+
function findSpans(nameSubstr) {
|
|
33
|
+
return getSpans().filter((s) => s.name.includes(nameSubstr));
|
|
34
|
+
}
|
|
35
|
+
function findMetric(name) {
|
|
36
|
+
// Collect synchronously from what is already flushed.
|
|
37
|
+
const allResourceMetrics = metricExporter.getMetrics();
|
|
38
|
+
const allMetrics = allResourceMetrics.flatMap((rm) => rm.scopeMetrics.flatMap((sm) => sm.metrics));
|
|
39
|
+
return allMetrics.find((m) => m.descriptor.name === name);
|
|
40
|
+
}
|
|
41
|
+
async function shutdown() {
|
|
42
|
+
await tracerProvider.shutdown();
|
|
43
|
+
await meterProvider.shutdown();
|
|
44
|
+
}
|
|
45
|
+
return {
|
|
46
|
+
provider,
|
|
47
|
+
spanExporter,
|
|
48
|
+
metricExporter,
|
|
49
|
+
metricReader,
|
|
50
|
+
tracerProvider,
|
|
51
|
+
meterProvider,
|
|
52
|
+
collectMetrics,
|
|
53
|
+
getSpans,
|
|
54
|
+
findSpans,
|
|
55
|
+
findMetric,
|
|
56
|
+
shutdown,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
/** Assert that a span has a specific attribute value. */
|
|
60
|
+
export function expectSpanAttribute(span, key, expected) {
|
|
61
|
+
const actual = span.attributes[key];
|
|
62
|
+
if (actual !== expected) {
|
|
63
|
+
throw new Error(`Expected span "${span.name}" attribute "${key}" to be ${JSON.stringify(expected)}, got ${JSON.stringify(actual)}`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/** Assert that a span has OK status. */
|
|
67
|
+
export function expectSpanOk(span) {
|
|
68
|
+
if (span.status.code !== SpanStatusCode.OK) {
|
|
69
|
+
throw new Error(`Expected span "${span.name}" to have OK status, got code=${span.status.code}`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/** Assert that a span has ERROR status. */
|
|
73
|
+
export function expectSpanError(span) {
|
|
74
|
+
if (span.status.code !== SpanStatusCode.ERROR) {
|
|
75
|
+
throw new Error(`Expected span "${span.name}" to have ERROR status, got code=${span.status.code}`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/** Get sum of all data point values for a SUM metric. */
|
|
79
|
+
export function sumMetricValue(metric, filterAttrs) {
|
|
80
|
+
let total = 0;
|
|
81
|
+
for (const dp of metric.dataPoints) {
|
|
82
|
+
if (filterAttrs && !matchesAttributes(dp.attributes, filterAttrs)) {
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
total += dp.value;
|
|
86
|
+
}
|
|
87
|
+
return total;
|
|
88
|
+
}
|
|
89
|
+
/** Check that the metric has at least one data point matching the given attributes. */
|
|
90
|
+
export function hasDataPoint(metric, attrs) {
|
|
91
|
+
return metric.dataPoints.some((dp) => matchesAttributes(dp.attributes, attrs));
|
|
92
|
+
}
|
|
93
|
+
function matchesAttributes(actual, expected) {
|
|
94
|
+
return Object.entries(expected).every(([key, value]) => actual[key] === value);
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=otel-harness.test-util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"otel-harness.test-util.js","sourceRoot":"","sources":["../../src/observability/otel-harness.test-util.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ObservabilityProvider } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Create an {@link ObservabilityProvider} from the OpenTelemetry global API.
|
|
4
|
+
*
|
|
5
|
+
* If no SDK is registered the returned tracer/meter are no-ops (zero overhead).
|
|
6
|
+
* Callers can also supply an explicit provider to override the globals.
|
|
7
|
+
*/
|
|
8
|
+
export declare function createObservabilityProvider(override?: Partial<ObservabilityProvider>): ObservabilityProvider;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { trace, metrics } from "@opentelemetry/api";
|
|
2
|
+
const LIBRARY_NAME = "agent-bundle";
|
|
3
|
+
// TODO: keep in sync with package.json version or read dynamically
|
|
4
|
+
const LIBRARY_VERSION = "0.1.0";
|
|
5
|
+
/**
|
|
6
|
+
* Create an {@link ObservabilityProvider} from the OpenTelemetry global API.
|
|
7
|
+
*
|
|
8
|
+
* If no SDK is registered the returned tracer/meter are no-ops (zero overhead).
|
|
9
|
+
* Callers can also supply an explicit provider to override the globals.
|
|
10
|
+
*/
|
|
11
|
+
export function createObservabilityProvider(override) {
|
|
12
|
+
return {
|
|
13
|
+
tracer: override?.tracer ??
|
|
14
|
+
trace.getTracer(LIBRARY_NAME, LIBRARY_VERSION),
|
|
15
|
+
meter: override?.meter ??
|
|
16
|
+
metrics.getMeter(LIBRARY_NAME, LIBRARY_VERSION),
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/observability/provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAIpD,MAAM,YAAY,GAAG,cAAc,CAAC;AACpC,mEAAmE;AACnE,MAAM,eAAe,GAAG,OAAO,CAAC;AAEhC;;;;;GAKG;AACH,MAAM,UAAU,2BAA2B,CACzC,QAAyC;IAEzC,OAAO;QACL,MAAM,EACJ,QAAQ,EAAE,MAAM;YAChB,KAAK,CAAC,SAAS,CAAC,YAAY,EAAE,eAAe,CAAC;QAChD,KAAK,EACH,QAAQ,EAAE,KAAK;YACf,OAAO,CAAC,QAAQ,CAAC,YAAY,EAAE,eAAe,CAAC;KAClD,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type Attributes, type Span, type Tracer } from "@opentelemetry/api";
|
|
2
|
+
/**
|
|
3
|
+
* Run `fn` inside a new span. The span is ended automatically and any thrown
|
|
4
|
+
* error is recorded before re-throwing.
|
|
5
|
+
*/
|
|
6
|
+
export declare function withSpan<T>(tracer: Tracer, name: string, attributes: Attributes, fn: (span: Span) => Promise<T>): Promise<T>;
|
|
7
|
+
/**
|
|
8
|
+
* Record an error on an existing span without ending it.
|
|
9
|
+
*/
|
|
10
|
+
export declare function recordSpanError(span: Span, error: unknown): void;
|
|
11
|
+
/** Return milliseconds elapsed since `startMs` (monotonic clock). */
|
|
12
|
+
export declare function elapsed(startMs: number): number;
|
|
13
|
+
/** Return a monotonic timestamp in milliseconds. */
|
|
14
|
+
export declare function now(): number;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { SpanStatusCode } from "@opentelemetry/api";
|
|
2
|
+
/**
|
|
3
|
+
* Run `fn` inside a new span. The span is ended automatically and any thrown
|
|
4
|
+
* error is recorded before re-throwing.
|
|
5
|
+
*/
|
|
6
|
+
export async function withSpan(tracer, name, attributes, fn) {
|
|
7
|
+
return tracer.startActiveSpan(name, { attributes }, async (span) => {
|
|
8
|
+
try {
|
|
9
|
+
const result = await fn(span);
|
|
10
|
+
span.setStatus({ code: SpanStatusCode.OK });
|
|
11
|
+
return result;
|
|
12
|
+
}
|
|
13
|
+
catch (error) {
|
|
14
|
+
recordSpanError(span, error);
|
|
15
|
+
throw error;
|
|
16
|
+
}
|
|
17
|
+
finally {
|
|
18
|
+
span.end();
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Record an error on an existing span without ending it.
|
|
24
|
+
*/
|
|
25
|
+
export function recordSpanError(span, error) {
|
|
26
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
27
|
+
span.setStatus({ code: SpanStatusCode.ERROR, message });
|
|
28
|
+
if (error instanceof Error) {
|
|
29
|
+
span.recordException(error);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/** Return milliseconds elapsed since `startMs` (monotonic clock). */
|
|
33
|
+
export function elapsed(startMs) {
|
|
34
|
+
return performance.now() - startMs;
|
|
35
|
+
}
|
|
36
|
+
/** Return a monotonic timestamp in milliseconds. */
|
|
37
|
+
export function now() {
|
|
38
|
+
return performance.now();
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=tracing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tracing.js","sourceRoot":"","sources":["../../src/observability/tracing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAA2C,MAAM,oBAAoB,CAAC;AAE7F;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,MAAc,EACd,IAAY,EACZ,UAAsB,EACtB,EAA8B;IAE9B,OAAO,MAAM,CAAC,eAAe,CAAC,IAAI,EAAE,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QACjE,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC;YAC9B,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,EAAE,CAAC,CAAC;YAC5C,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAC7B,MAAM,KAAK,CAAC;QACd,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,GAAG,EAAE,CAAC;QACb,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,IAAU,EAAE,KAAc;IACxD,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;IAExD,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,OAAO,CAAC,OAAe;IACrC,OAAO,WAAW,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC;AACrC,CAAC;AAED,oDAAoD;AACpD,MAAM,UAAU,GAAG;IACjB,OAAO,WAAW,CAAC,GAAG,EAAE,CAAC;AAC3B,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { Tracer, Meter } from "@opentelemetry/api";
|
|
2
|
+
/**
|
|
3
|
+
* Minimal observability surface injected into agent-bundle components.
|
|
4
|
+
*
|
|
5
|
+
* When the user registers an OpenTelemetry SDK at startup, the tracer and meter
|
|
6
|
+
* will emit real telemetry. Otherwise the OTEL API returns built-in no-ops
|
|
7
|
+
* with zero measurable overhead.
|
|
8
|
+
*/
|
|
9
|
+
export type ObservabilityProvider = {
|
|
10
|
+
readonly tracer: Tracer;
|
|
11
|
+
readonly meter: Meter;
|
|
12
|
+
};
|
|
13
|
+
/** HTTP server attributes (OTEL semantic conventions). */
|
|
14
|
+
export declare const HttpAttributes: {
|
|
15
|
+
readonly METHOD: "http.request.method";
|
|
16
|
+
readonly STATUS_CODE: "http.response.status_code";
|
|
17
|
+
readonly ROUTE: "http.route";
|
|
18
|
+
readonly URL_PATH: "url.path";
|
|
19
|
+
};
|
|
20
|
+
/** Agent lifecycle attributes. */
|
|
21
|
+
export declare const AgentAttributes: {
|
|
22
|
+
readonly AGENT_NAME: "agent.name";
|
|
23
|
+
readonly AGENT_STATUS: "agent.status";
|
|
24
|
+
readonly TOOL_NAME: "agent.tool.name";
|
|
25
|
+
readonly TOOL_ERROR: "agent.tool.error";
|
|
26
|
+
};
|
|
27
|
+
/** GenAI semantic conventions. */
|
|
28
|
+
export declare const GenAiAttributes: {
|
|
29
|
+
readonly INPUT_TOKENS: "gen_ai.usage.input_tokens";
|
|
30
|
+
readonly OUTPUT_TOKENS: "gen_ai.usage.output_tokens";
|
|
31
|
+
readonly MODEL: "gen_ai.request.model";
|
|
32
|
+
readonly PROVIDER: "gen_ai.system";
|
|
33
|
+
};
|
|
34
|
+
/** MCP attributes. */
|
|
35
|
+
export declare const McpAttributes: {
|
|
36
|
+
readonly SERVER_NAME: "mcp.server.name";
|
|
37
|
+
readonly TOOL_NAME: "mcp.tool.name";
|
|
38
|
+
readonly TOOL_ERROR: "mcp.tool.error";
|
|
39
|
+
};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/* ------------------------------------------------------------------ */
|
|
2
|
+
/* Semantic attribute constants */
|
|
3
|
+
/* ------------------------------------------------------------------ */
|
|
4
|
+
/** HTTP server attributes (OTEL semantic conventions). */
|
|
5
|
+
export const HttpAttributes = {
|
|
6
|
+
METHOD: "http.request.method",
|
|
7
|
+
STATUS_CODE: "http.response.status_code",
|
|
8
|
+
ROUTE: "http.route",
|
|
9
|
+
URL_PATH: "url.path",
|
|
10
|
+
};
|
|
11
|
+
/** Agent lifecycle attributes. */
|
|
12
|
+
export const AgentAttributes = {
|
|
13
|
+
AGENT_NAME: "agent.name",
|
|
14
|
+
AGENT_STATUS: "agent.status",
|
|
15
|
+
TOOL_NAME: "agent.tool.name",
|
|
16
|
+
TOOL_ERROR: "agent.tool.error",
|
|
17
|
+
};
|
|
18
|
+
/** GenAI semantic conventions. */
|
|
19
|
+
export const GenAiAttributes = {
|
|
20
|
+
INPUT_TOKENS: "gen_ai.usage.input_tokens",
|
|
21
|
+
OUTPUT_TOKENS: "gen_ai.usage.output_tokens",
|
|
22
|
+
MODEL: "gen_ai.request.model",
|
|
23
|
+
PROVIDER: "gen_ai.system",
|
|
24
|
+
};
|
|
25
|
+
/** MCP attributes. */
|
|
26
|
+
export const McpAttributes = {
|
|
27
|
+
SERVER_NAME: "mcp.server.name",
|
|
28
|
+
TOOL_NAME: "mcp.tool.name",
|
|
29
|
+
TOOL_ERROR: "mcp.tool.error",
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/observability/types.ts"],"names":[],"mappings":"AAcA,wEAAwE;AACxE,yEAAyE;AACzE,wEAAwE;AAExE,0DAA0D;AAC1D,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,MAAM,EAAE,qBAAqB;IAC7B,WAAW,EAAE,2BAA2B;IACxC,KAAK,EAAE,YAAY;IACnB,QAAQ,EAAE,UAAU;CACZ,CAAC;AAEX,kCAAkC;AAClC,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,UAAU,EAAE,YAAY;IACxB,YAAY,EAAE,cAAc;IAC5B,SAAS,EAAE,iBAAiB;IAC5B,UAAU,EAAE,kBAAkB;CACtB,CAAC;AAEX,kCAAkC;AAClC,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,YAAY,EAAE,2BAA2B;IACzC,aAAa,EAAE,4BAA4B;IAC3C,KAAK,EAAE,sBAAsB;IAC7B,QAAQ,EAAE,eAAe;CACjB,CAAC;AAEX,sBAAsB;AACtB,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,WAAW,EAAE,iBAAiB;IAC9B,SAAS,EAAE,eAAe;IAC1B,UAAU,EAAE,gBAAgB;CACpB,CAAC"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "personalized-recommend",
|
|
3
|
+
"namePascal": "PersonalizedRecommend",
|
|
4
|
+
"model": {
|
|
5
|
+
"provider": "openai",
|
|
6
|
+
"model": "gpt-5.3-codex"
|
|
7
|
+
},
|
|
8
|
+
"sandbox": {
|
|
9
|
+
"provider": "e2b",
|
|
10
|
+
"timeout": 300,
|
|
11
|
+
"resources": {
|
|
12
|
+
"cpu": 1,
|
|
13
|
+
"memory": "256MB"
|
|
14
|
+
},
|
|
15
|
+
"e2b": {
|
|
16
|
+
"template": "base",
|
|
17
|
+
"build": {
|
|
18
|
+
"dockerfile": "./Dockerfile"
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"prompt": {
|
|
23
|
+
"system": "You are a personalization assistant.\nUse memory tools to keep track of user preferences and events.\nUse product tools to recommend relevant products with concise reasons.\nPrefer tool-backed answers over assumptions.\n",
|
|
24
|
+
"variables": []
|
|
25
|
+
},
|
|
26
|
+
"systemPrompt": "You are a personalization assistant.\nUse memory tools to keep track of user preferences and events.\nUse product tools to recommend relevant products with concise reasons.\nPrefer tool-backed answers over assumptions.\n\n## Skills\n\n### update-memory\n---\nname: update-memory\ndescription: Update a user profile memory from a new user event.\n---\n\n# Update Memory\n\nWhen the user provides a new event or preference update:\n\n1. Call `mcp__memory__memory_read` with the user id.\n2. Merge the new event details into the existing profile object.\n3. Call `mcp__memory__memory_write` with the merged profile.\n4. Return a brief confirmation describing what was updated.\n\nRules:\n\n- Never overwrite unrelated fields with empty values.\n- Preserve existing profile keys unless the user explicitly changes them.\n- Include the user id in all memory tool calls.\n\n### recommend\n---\nname: recommend\ndescription: Generate ranked product recommendations from user profile memory.\n---\n\n# Recommend\n\nWhen asked for recommendations:\n\n1. Read the user profile with `mcp__memory__memory_read`.\n2. Search candidate products with `mcp__products__product_search`.\n3. Fetch specific product details with `mcp__products__product_detail` as needed.\n4. Return a ranked list of 3-5 recommendations with clear reasons.\n\nRules:\n\n- Match recommendations to the user profile preferences and recent events.\n- Exclude products that conflict with explicit dislikes when provided.\n- Prefer concise, actionable explanations.",
|
|
27
|
+
"skills": [
|
|
28
|
+
{
|
|
29
|
+
"name": "update-memory",
|
|
30
|
+
"description": "Update a user profile memory from a new user event.",
|
|
31
|
+
"sourcePath": "/Users/yujiachen/Projects/agent-bundle/demo/personalized-recommend/skills/update-memory/SKILL.md",
|
|
32
|
+
"content": "---\nname: update-memory\ndescription: Update a user profile memory from a new user event.\n---\n\n# Update Memory\n\nWhen the user provides a new event or preference update:\n\n1. Call `mcp__memory__memory_read` with the user id.\n2. Merge the new event details into the existing profile object.\n3. Call `mcp__memory__memory_write` with the merged profile.\n4. Return a brief confirmation describing what was updated.\n\nRules:\n\n- Never overwrite unrelated fields with empty values.\n- Preserve existing profile keys unless the user explicitly changes them.\n- Include the user id in all memory tool calls.\n"
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"name": "recommend",
|
|
36
|
+
"description": "Generate ranked product recommendations from user profile memory.",
|
|
37
|
+
"sourcePath": "/Users/yujiachen/Projects/agent-bundle/demo/personalized-recommend/skills/recommend/SKILL.md",
|
|
38
|
+
"content": "---\nname: recommend\ndescription: Generate ranked product recommendations from user profile memory.\n---\n\n# Recommend\n\nWhen asked for recommendations:\n\n1. Read the user profile with `mcp__memory__memory_read`.\n2. Search candidate products with `mcp__products__product_search`.\n3. Fetch specific product details with `mcp__products__product_detail` as needed.\n4. Return a ranked list of 3-5 recommendations with clear reasons.\n\nRules:\n\n- Match recommendations to the user profile preferences and recent events.\n- Exclude products that conflict with explicit dislikes when provided.\n- Prefer concise, actionable explanations.\n"
|
|
39
|
+
}
|
|
40
|
+
],
|
|
41
|
+
"commands": [],
|
|
42
|
+
"mcp": {
|
|
43
|
+
"servers": [
|
|
44
|
+
{
|
|
45
|
+
"transport": "stdio",
|
|
46
|
+
"name": "memory",
|
|
47
|
+
"command": "node",
|
|
48
|
+
"args": [
|
|
49
|
+
"/mcp/memory-server.mjs"
|
|
50
|
+
]
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"transport": "http",
|
|
54
|
+
"name": "products",
|
|
55
|
+
"url": "http://127.0.0.1:3102/mcp",
|
|
56
|
+
"auth": "bearer"
|
|
57
|
+
}
|
|
58
|
+
]
|
|
59
|
+
},
|
|
60
|
+
"sandboxImage": {
|
|
61
|
+
"provider": "e2b",
|
|
62
|
+
"ref": "base"
|
|
63
|
+
}
|
|
64
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { defineAgent } from "agent-bundle/runtime";
|
|
2
|
+
|
|
3
|
+
export const PersonalizedRecommend = defineAgent({
|
|
4
|
+
name: "personalized-recommend",
|
|
5
|
+
sandbox: {
|
|
6
|
+
provider: "e2b",
|
|
7
|
+
timeout: 300,
|
|
8
|
+
resources: {
|
|
9
|
+
cpu: 1,
|
|
10
|
+
memory: "256MB"
|
|
11
|
+
},
|
|
12
|
+
e2b: {
|
|
13
|
+
template: "base",
|
|
14
|
+
build: {
|
|
15
|
+
dockerfile: "./Dockerfile"
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
model: {
|
|
20
|
+
provider: "openai",
|
|
21
|
+
model: "gpt-5.3-codex"
|
|
22
|
+
},
|
|
23
|
+
systemPrompt: "You are a personalization assistant.\nUse memory tools to keep track of user preferences and events.\nUse product tools to recommend relevant products with concise reasons.\nPrefer tool-backed answers over assumptions.\n\n## Skills\n\n### update-memory\n---\nname: update-memory\ndescription: Update a user profile memory from a new user event.\n---\n\n# Update Memory\n\nWhen the user provides a new event or preference update:\n\n1. Call `mcp__memory__memory_read` with the user id.\n2. Merge the new event details into the existing profile object.\n3. Call `mcp__memory__memory_write` with the merged profile.\n4. Return a brief confirmation describing what was updated.\n\nRules:\n\n- Never overwrite unrelated fields with empty values.\n- Preserve existing profile keys unless the user explicitly changes them.\n- Include the user id in all memory tool calls.\n\n### recommend\n---\nname: recommend\ndescription: Generate ranked product recommendations from user profile memory.\n---\n\n# Recommend\n\nWhen asked for recommendations:\n\n1. Read the user profile with `mcp__memory__memory_read`.\n2. Search candidate products with `mcp__products__product_search`.\n3. Fetch specific product details with `mcp__products__product_detail` as needed.\n4. Return a ranked list of 3-5 recommendations with clear reasons.\n\nRules:\n\n- Match recommendations to the user profile preferences and recent events.\n- Exclude products that conflict with explicit dislikes when provided.\n- Prefer concise, actionable explanations.",
|
|
24
|
+
variables: [] as const,
|
|
25
|
+
mcp: [
|
|
26
|
+
{
|
|
27
|
+
transport: "stdio",
|
|
28
|
+
name: "memory",
|
|
29
|
+
command: "node",
|
|
30
|
+
args: [
|
|
31
|
+
"/mcp/memory-server.mjs"
|
|
32
|
+
]
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
transport: "http",
|
|
36
|
+
name: "products",
|
|
37
|
+
url: "http://127.0.0.1:3102/mcp",
|
|
38
|
+
auth: "bearer"
|
|
39
|
+
}
|
|
40
|
+
]
|
|
41
|
+
});
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { PluginEntry } from "../schema/bundle.js";
|
|
2
|
+
import type { PluginComponents } from "./types.js";
|
|
3
|
+
type FetchLike = (input: string, init?: RequestInit) => Promise<Response>;
|
|
4
|
+
export type LoadPluginOptions = {
|
|
5
|
+
cache?: boolean;
|
|
6
|
+
cacheDir?: string;
|
|
7
|
+
fetchImpl?: FetchLike;
|
|
8
|
+
};
|
|
9
|
+
export declare function loadPlugin(entry: PluginEntry, options?: LoadPluginOptions): Promise<PluginComponents>;
|
|
10
|
+
export declare function loadAllPlugins(entries: PluginEntry[], options?: LoadPluginOptions): Promise<PluginComponents[]>;
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
3
|
+
import { dirname, join } from "node:path";
|
|
4
|
+
import { parseCommandMarkdown, parseGitHubDirectoryListing, parseGitHubFileListing, parseMcpJson, parsePluginManifest, parseSkillMarkdown, } from "./parse.js";
|
|
5
|
+
import { toPluginCommandsApiUrl, toPluginCommandUrl, toPluginManifestUrl, toPluginMcpJsonUrl, toPluginSkillsApiUrl, toPluginSkillUrl, } from "./urls.js";
|
|
6
|
+
const DEFAULT_CACHE_DIR = "node_modules/.cache/agent-bundle/plugins";
|
|
7
|
+
function isNodeError(error) {
|
|
8
|
+
return error instanceof Error && "code" in error;
|
|
9
|
+
}
|
|
10
|
+
function createCachePath(url, cacheDir) {
|
|
11
|
+
const hash = createHash("sha256").update(url).digest("hex");
|
|
12
|
+
return join(cacheDir, hash);
|
|
13
|
+
}
|
|
14
|
+
async function readCachedContent(cachePath) {
|
|
15
|
+
try {
|
|
16
|
+
return await readFile(cachePath, "utf8");
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
if (isNodeError(error) && error.code === "ENOENT") {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
throw error;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
async function fetchRemoteContent(url, options) {
|
|
26
|
+
const shouldCache = options.cache ?? true;
|
|
27
|
+
const cacheDir = options.cacheDir ?? DEFAULT_CACHE_DIR;
|
|
28
|
+
const cachePath = createCachePath(url, cacheDir);
|
|
29
|
+
if (shouldCache) {
|
|
30
|
+
const cached = await readCachedContent(cachePath);
|
|
31
|
+
if (cached !== null) {
|
|
32
|
+
return cached;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
const fetchImpl = options.fetchImpl ?? globalThis.fetch;
|
|
36
|
+
const response = await fetchImpl(url);
|
|
37
|
+
if (!response.ok) {
|
|
38
|
+
throw new Error(`Failed to fetch ${url}: ${response.status} ${response.statusText}`.trim());
|
|
39
|
+
}
|
|
40
|
+
const content = await response.text();
|
|
41
|
+
if (shouldCache) {
|
|
42
|
+
await mkdir(dirname(cachePath), { recursive: true });
|
|
43
|
+
await writeFile(cachePath, content, "utf8");
|
|
44
|
+
}
|
|
45
|
+
return content;
|
|
46
|
+
}
|
|
47
|
+
async function fetchOptionalContent(url, options) {
|
|
48
|
+
try {
|
|
49
|
+
return await fetchRemoteContent(url, options);
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
async function resolveSkillNames(entry, options) {
|
|
56
|
+
if (entry.skills && entry.skills.length > 0) {
|
|
57
|
+
return entry.skills;
|
|
58
|
+
}
|
|
59
|
+
const apiUrl = toPluginSkillsApiUrl(entry);
|
|
60
|
+
const content = await fetchRemoteContent(apiUrl, { ...options, cache: false });
|
|
61
|
+
return parseGitHubDirectoryListing(content, apiUrl);
|
|
62
|
+
}
|
|
63
|
+
async function resolveCommandNames(entry, options) {
|
|
64
|
+
if (entry.commands) {
|
|
65
|
+
return entry.commands;
|
|
66
|
+
}
|
|
67
|
+
const apiUrl = toPluginCommandsApiUrl(entry);
|
|
68
|
+
try {
|
|
69
|
+
const content = await fetchRemoteContent(apiUrl, { ...options, cache: false });
|
|
70
|
+
return parseGitHubFileListing(content, apiUrl);
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return [];
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
export async function loadPlugin(entry, options = {}) {
|
|
77
|
+
const manifestUrl = toPluginManifestUrl(entry);
|
|
78
|
+
const manifestJson = await fetchRemoteContent(manifestUrl, options);
|
|
79
|
+
const metadata = parsePluginManifest(manifestJson, manifestUrl);
|
|
80
|
+
const skillNames = await resolveSkillNames(entry, options);
|
|
81
|
+
const skills = await Promise.all(skillNames.map(async (skillName) => {
|
|
82
|
+
const skillUrl = toPluginSkillUrl(entry, skillName);
|
|
83
|
+
const markdown = await fetchRemoteContent(skillUrl, options);
|
|
84
|
+
return parseSkillMarkdown(markdown, skillUrl);
|
|
85
|
+
}));
|
|
86
|
+
const commandNames = await resolveCommandNames(entry, options);
|
|
87
|
+
const commands = await Promise.all(commandNames.map(async (commandName) => {
|
|
88
|
+
const commandUrl = toPluginCommandUrl(entry, commandName);
|
|
89
|
+
const markdown = await fetchRemoteContent(commandUrl, options);
|
|
90
|
+
return parseCommandMarkdown(markdown, commandUrl);
|
|
91
|
+
}));
|
|
92
|
+
const mcpJsonUrl = toPluginMcpJsonUrl(entry);
|
|
93
|
+
const mcpJson = await fetchOptionalContent(mcpJsonUrl, options);
|
|
94
|
+
const mcpServers = mcpJson !== null ? parseMcpJson(mcpJson, mcpJsonUrl) : [];
|
|
95
|
+
return { skills, commands, mcpServers, metadata };
|
|
96
|
+
}
|
|
97
|
+
export async function loadAllPlugins(entries, options = {}) {
|
|
98
|
+
return await Promise.all(entries.map(async (entry) => loadPlugin(entry, options)));
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/plugins/loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { McpServerConfig } from "../agent/types.js";
|
|
2
|
+
import type { Command } from "../commands/types.js";
|
|
3
|
+
import type { Skill } from "../skills/loader.js";
|
|
4
|
+
import type { PluginComponents } from "./types.js";
|
|
5
|
+
export type MergedPluginResult = {
|
|
6
|
+
skills: Skill[];
|
|
7
|
+
commands: Command[];
|
|
8
|
+
mcpServers: McpServerConfig[];
|
|
9
|
+
};
|
|
10
|
+
export declare function mergePluginComponents(existingSkills: readonly Skill[], existingCommands: readonly Command[], existingMcpServers: readonly McpServerConfig[], pluginResults: readonly PluginComponents[]): MergedPluginResult;
|