@stigmer/cli 3.35.0 → 3.37.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/auth/auth0.d.ts.map +1 -1
- package/auth/auth0.js.map +1 -1
- package/auth/callback-server.d.ts.map +1 -1
- package/auth/callback-server.js.map +1 -1
- package/auth/index.d.ts.map +1 -1
- package/auth/index.js.map +1 -1
- package/auth/login.d.ts.map +1 -1
- package/auth/login.js.map +1 -1
- package/auth/pages.d.ts.map +1 -1
- package/auth/pages.js.map +1 -1
- package/auth/pkce.d.ts.map +1 -1
- package/auth/pkce.js.map +1 -1
- package/auth/token.d.ts.map +1 -1
- package/auth/token.js.map +1 -1
- package/backend.d.ts.map +1 -1
- package/backend.js.map +1 -1
- package/cli/stigmer.d.ts.map +1 -1
- package/cli/stigmer.js.map +1 -1
- package/client/client.d.ts.map +1 -1
- package/client/client.js.map +1 -1
- package/client/index.d.ts.map +1 -1
- package/client/index.js.map +1 -1
- package/commands/agent-exec-flags.d.ts.map +1 -1
- package/commands/agent-exec-flags.js.map +1 -1
- package/commands/apikey/duration.d.ts.map +1 -1
- package/commands/apikey/duration.js.map +1 -1
- package/commands/apikey/index.d.ts.map +1 -1
- package/commands/apikey/index.js.map +1 -1
- package/commands/apply.d.ts.map +1 -1
- package/commands/apply.js.map +1 -1
- package/commands/auth/index.d.ts.map +1 -1
- package/commands/auth/index.js.map +1 -1
- package/commands/auth/login.d.ts.map +1 -1
- package/commands/auth/login.js.map +1 -1
- package/commands/auth/whoami.d.ts.map +1 -1
- package/commands/auth/whoami.js.map +1 -1
- package/commands/bootstrap.d.ts.map +1 -1
- package/commands/bootstrap.js.map +1 -1
- package/commands/completion.d.ts.map +1 -1
- package/commands/completion.js.map +1 -1
- package/commands/config/backend.d.ts.map +1 -1
- package/commands/config/backend.js.map +1 -1
- package/commands/config/context.d.ts.map +1 -1
- package/commands/config/context.js.map +1 -1
- package/commands/config/index.d.ts.map +1 -1
- package/commands/config/index.js.map +1 -1
- package/commands/config/kv.d.ts.map +1 -1
- package/commands/config/kv.js.map +1 -1
- package/commands/connect.d.ts.map +1 -1
- package/commands/connect.js.map +1 -1
- package/commands/delete.d.ts.map +1 -1
- package/commands/delete.js.map +1 -1
- package/commands/diff.d.ts.map +1 -1
- package/commands/diff.js.map +1 -1
- package/commands/down.d.ts.map +1 -1
- package/commands/down.js.map +1 -1
- package/commands/download.d.ts.map +1 -1
- package/commands/download.js.map +1 -1
- package/commands/execution/approve.d.ts.map +1 -1
- package/commands/execution/approve.js.map +1 -1
- package/commands/execution/control.d.ts.map +1 -1
- package/commands/execution/control.js.map +1 -1
- package/commands/execution/index.d.ts.map +1 -1
- package/commands/execution/index.js.map +1 -1
- package/commands/execution/logs.d.ts.map +1 -1
- package/commands/execution/logs.js.map +1 -1
- package/commands/execution/trace.d.ts.map +1 -1
- package/commands/execution/trace.js.map +1 -1
- package/commands/get.d.ts.map +1 -1
- package/commands/get.js.map +1 -1
- package/commands/install.d.ts.map +1 -1
- package/commands/install.js.map +1 -1
- package/commands/internal-daemon.d.ts.map +1 -1
- package/commands/internal-daemon.js.map +1 -1
- package/commands/list.d.ts.map +1 -1
- package/commands/list.js.map +1 -1
- package/commands/logs.d.ts.map +1 -1
- package/commands/logs.js.map +1 -1
- package/commands/marketplace.d.ts.map +1 -1
- package/commands/marketplace.js.map +1 -1
- package/commands/mcp-server.d.ts.map +1 -1
- package/commands/mcp-server.js.map +1 -1
- package/commands/push.d.ts.map +1 -1
- package/commands/push.js.map +1 -1
- package/commands/reset.d.ts.map +1 -1
- package/commands/reset.js.map +1 -1
- package/commands/resume.d.ts.map +1 -1
- package/commands/resume.js.map +1 -1
- package/commands/run.d.ts.map +1 -1
- package/commands/run.js.map +1 -1
- package/commands/schedule.d.ts.map +1 -1
- package/commands/schedule.js.map +1 -1
- package/commands/search.d.ts.map +1 -1
- package/commands/search.js.map +1 -1
- package/commands/setup.d.ts.map +1 -1
- package/commands/setup.js.map +1 -1
- package/commands/share.d.ts.map +1 -1
- package/commands/share.js.map +1 -1
- package/commands/shared.d.ts.map +1 -1
- package/commands/shared.js.map +1 -1
- package/commands/status.d.ts.map +1 -1
- package/commands/status.js.map +1 -1
- package/commands/tag.d.ts.map +1 -1
- package/commands/tag.js.map +1 -1
- package/commands/up.d.ts.map +1 -1
- package/commands/up.js.map +1 -1
- package/commands/usage.d.ts.map +1 -1
- package/commands/usage.js.map +1 -1
- package/commands/validate.d.ts.map +1 -1
- package/commands/validate.js.map +1 -1
- package/commands/version.d.ts.map +1 -1
- package/commands/version.js.map +1 -1
- package/config/config.d.ts.map +1 -1
- package/config/config.js.map +1 -1
- package/config/index.d.ts.map +1 -1
- package/config/index.js.map +1 -1
- package/config/keys.d.ts.map +1 -1
- package/config/keys.js.map +1 -1
- package/config/paths.d.ts.map +1 -1
- package/config/paths.js.map +1 -1
- package/config/resolve.d.ts.map +1 -1
- package/config/resolve.js.map +1 -1
- package/errors/classify.d.ts.map +1 -1
- package/errors/classify.js.map +1 -1
- package/errors/cli-exit-error.d.ts.map +1 -1
- package/errors/cli-exit-error.js.map +1 -1
- package/errors/exit-codes.d.ts.map +1 -1
- package/errors/exit-codes.js.map +1 -1
- package/errors/handle.d.ts.map +1 -1
- package/errors/handle.js.map +1 -1
- package/errors/index.d.ts.map +1 -1
- package/errors/index.js.map +1 -1
- package/errors/usage-error.d.ts.map +1 -1
- package/errors/usage-error.js.map +1 -1
- package/index.d.ts.map +1 -1
- package/index.js.map +1 -1
- package/local/artifact.d.ts.map +1 -1
- package/local/artifact.js.map +1 -1
- package/local/bootstrap.d.ts.map +1 -1
- package/local/bootstrap.js.map +1 -1
- package/local/constants.d.ts.map +1 -1
- package/local/constants.js.map +1 -1
- package/local/daemon/components.d.ts.map +1 -1
- package/local/daemon/components.js.map +1 -1
- package/local/daemon/env.d.ts.map +1 -1
- package/local/daemon/env.js.map +1 -1
- package/local/daemon/host.d.ts.map +1 -1
- package/local/daemon/host.js.map +1 -1
- package/local/daemon/index.d.ts.map +1 -1
- package/local/daemon/index.js.map +1 -1
- package/local/daemon/launch.d.ts.map +1 -1
- package/local/daemon/launch.js.map +1 -1
- package/local/daemon/process.d.ts.map +1 -1
- package/local/daemon/process.js.map +1 -1
- package/local/daemon/supervisor.d.ts.map +1 -1
- package/local/daemon/supervisor.js.map +1 -1
- package/local/daemon/types.d.ts.map +1 -1
- package/local/daemon/types.js.map +1 -1
- package/local/llm-config.d.ts.map +1 -1
- package/local/llm-config.js.map +1 -1
- package/local/logs/tail.d.ts.map +1 -1
- package/local/logs/tail.js.map +1 -1
- package/local/logs/view.d.ts.map +1 -1
- package/local/logs/view.js.map +1 -1
- package/local/net/tcp.d.ts.map +1 -1
- package/local/net/tcp.js.map +1 -1
- package/local/operator-config.d.ts.map +1 -1
- package/local/operator-config.js.map +1 -1
- package/local/paths.d.ts.map +1 -1
- package/local/paths.js.map +1 -1
- package/local/reset.d.ts.map +1 -1
- package/local/reset.js.map +1 -1
- package/local/runtime/index.d.ts.map +1 -1
- package/local/runtime/index.js.map +1 -1
- package/local/runtime/node.d.ts.map +1 -1
- package/local/runtime/node.js.map +1 -1
- package/local/runtime/runner.d.ts.map +1 -1
- package/local/runtime/runner.js.map +1 -1
- package/local/runtime/runtimes-install.d.ts.map +1 -1
- package/local/runtime/runtimes-install.js.map +1 -1
- package/local/runtime/server.d.ts.map +1 -1
- package/local/runtime/server.js.map +1 -1
- package/local/runtime/which.d.ts.map +1 -1
- package/local/runtime/which.js.map +1 -1
- package/local/setup/prompt.d.ts.map +1 -1
- package/local/setup/prompt.js.map +1 -1
- package/local/setup/wizard.d.ts.map +1 -1
- package/local/setup/wizard.js.map +1 -1
- package/local/state/health-state.d.ts.map +1 -1
- package/local/state/health-state.js.map +1 -1
- package/local/state/index.d.ts.map +1 -1
- package/local/state/index.js.map +1 -1
- package/local/state/lock.d.ts.map +1 -1
- package/local/state/lock.js.map +1 -1
- package/local/state/log-rotation.d.ts.map +1 -1
- package/local/state/log-rotation.js.map +1 -1
- package/local/state/pidfile.d.ts.map +1 -1
- package/local/state/pidfile.js.map +1 -1
- package/local/state/proc.d.ts.map +1 -1
- package/local/state/proc.js.map +1 -1
- package/local/state/startup-config.d.ts.map +1 -1
- package/local/state/startup-config.js.map +1 -1
- package/local/status.d.ts.map +1 -1
- package/local/status.js.map +1 -1
- package/local/temporal/download.d.ts.map +1 -1
- package/local/temporal/download.js.map +1 -1
- package/local/temporal/index.d.ts.map +1 -1
- package/local/temporal/index.js.map +1 -1
- package/local/temporal/inspect.d.ts.map +1 -1
- package/local/temporal/inspect.js.map +1 -1
- package/local/temporal/manager.d.ts.map +1 -1
- package/local/temporal/manager.js.map +1 -1
- package/local/temporal/supervisor.d.ts.map +1 -1
- package/local/temporal/supervisor.js.map +1 -1
- package/local/webconsole/index.d.ts.map +1 -1
- package/local/webconsole/index.js.map +1 -1
- package/logger.d.ts.map +1 -1
- package/logger.js.map +1 -1
- package/marketplace/config.d.ts.map +1 -1
- package/marketplace/config.js.map +1 -1
- package/marketplace/github.d.ts.map +1 -1
- package/marketplace/github.js.map +1 -1
- package/marketplace/index.d.ts.map +1 -1
- package/marketplace/index.js.map +1 -1
- package/marketplace/install.d.ts.map +1 -1
- package/marketplace/install.js.map +1 -1
- package/marketplace/materialize.d.ts.map +1 -1
- package/marketplace/materialize.js.map +1 -1
- package/marketplace/official.d.ts.map +1 -1
- package/marketplace/official.js.map +1 -1
- package/marketplace/read.d.ts.map +1 -1
- package/marketplace/read.js.map +1 -1
- package/marketplace/ref.d.ts.map +1 -1
- package/marketplace/ref.js.map +1 -1
- package/marketplace/render.d.ts.map +1 -1
- package/marketplace/render.js.map +1 -1
- package/output/command-result.d.ts.map +1 -1
- package/output/command-result.js.map +1 -1
- package/output/confirm.d.ts.map +1 -1
- package/output/confirm.js.map +1 -1
- package/output/format.d.ts.map +1 -1
- package/output/format.js.map +1 -1
- package/output/index.d.ts.map +1 -1
- package/output/index.js.map +1 -1
- package/output/ndjson.d.ts.map +1 -1
- package/output/ndjson.js.map +1 -1
- package/output/proto.d.ts.map +1 -1
- package/output/proto.js.map +1 -1
- package/output/style.d.ts.map +1 -1
- package/output/style.js.map +1 -1
- package/output/table.d.ts.map +1 -1
- package/output/table.js.map +1 -1
- package/package.json +7 -7
- package/program.d.ts.map +1 -1
- package/program.js.map +1 -1
- package/registry/aliases.d.ts.map +1 -1
- package/registry/aliases.js.map +1 -1
- package/registry/index.d.ts.map +1 -1
- package/registry/index.js.map +1 -1
- package/registry/metadata.d.ts.map +1 -1
- package/registry/metadata.js.map +1 -1
- package/registry/registry.d.ts.map +1 -1
- package/registry/registry.js.map +1 -1
- package/registry/verb-support.d.ts.map +1 -1
- package/registry/verb-support.js.map +1 -1
- package/registry/verbs.d.ts.map +1 -1
- package/registry/verbs.js.map +1 -1
- package/resources/apply/apply.d.ts.map +1 -1
- package/resources/apply/apply.js.map +1 -1
- package/resources/apply/discovery.d.ts.map +1 -1
- package/resources/apply/discovery.js.map +1 -1
- package/resources/apply/handlers.d.ts.map +1 -1
- package/resources/apply/handlers.js.map +1 -1
- package/resources/connect/connect.d.ts.map +1 -1
- package/resources/connect/connect.js.map +1 -1
- package/resources/connect/discover.d.ts.map +1 -1
- package/resources/connect/discover.js.map +1 -1
- package/resources/connect/display.d.ts.map +1 -1
- package/resources/connect/display.js.map +1 -1
- package/resources/connect/oauth.d.ts.map +1 -1
- package/resources/connect/oauth.js.map +1 -1
- package/resources/cursor-pages.d.ts.map +1 -1
- package/resources/cursor-pages.js.map +1 -1
- package/resources/delete.d.ts.map +1 -1
- package/resources/delete.js.map +1 -1
- package/resources/diff.d.ts.map +1 -1
- package/resources/diff.js.map +1 -1
- package/resources/documents.d.ts.map +1 -1
- package/resources/documents.js.map +1 -1
- package/resources/download.d.ts.map +1 -1
- package/resources/download.js.map +1 -1
- package/resources/execution-approve.d.ts.map +1 -1
- package/resources/execution-approve.js.map +1 -1
- package/resources/execution-control.d.ts.map +1 -1
- package/resources/execution-control.js.map +1 -1
- package/resources/execution-format.d.ts.map +1 -1
- package/resources/execution-format.js.map +1 -1
- package/resources/execution-logs.d.ts.map +1 -1
- package/resources/execution-logs.js.map +1 -1
- package/resources/execution-trace.d.ts.map +1 -1
- package/resources/execution-trace.js.map +1 -1
- package/resources/execution.d.ts.map +1 -1
- package/resources/execution.js.map +1 -1
- package/resources/get-bindings.d.ts.map +1 -1
- package/resources/get-bindings.js.map +1 -1
- package/resources/get.d.ts.map +1 -1
- package/resources/get.js.map +1 -1
- package/resources/git.d.ts.map +1 -1
- package/resources/git.js.map +1 -1
- package/resources/ignore/index.d.ts.map +1 -1
- package/resources/ignore/index.js.map +1 -1
- package/resources/ignore/matcher.d.ts.map +1 -1
- package/resources/ignore/matcher.js.map +1 -1
- package/resources/list.d.ts.map +1 -1
- package/resources/list.js.map +1 -1
- package/resources/mcp/placeholder-resolver.d.ts.map +1 -1
- package/resources/mcp/placeholder-resolver.js.map +1 -1
- package/resources/mcp/runtime-env.d.ts.map +1 -1
- package/resources/mcp/runtime-env.js.map +1 -1
- package/resources/picker/ink.d.ts.map +1 -1
- package/resources/picker/ink.js.map +1 -1
- package/resources/picker/tty.d.ts.map +1 -1
- package/resources/picker/tty.js.map +1 -1
- package/resources/plugin.d.ts.map +1 -1
- package/resources/plugin.js.map +1 -1
- package/resources/reference.d.ts.map +1 -1
- package/resources/reference.js.map +1 -1
- package/resources/render.d.ts.map +1 -1
- package/resources/render.js.map +1 -1
- package/resources/run/agent-exec.d.ts.map +1 -1
- package/resources/run/agent-exec.js.map +1 -1
- package/resources/run/attachments.d.ts.map +1 -1
- package/resources/run/attachments.js.map +1 -1
- package/resources/run/create.d.ts.map +1 -1
- package/resources/run/create.js.map +1 -1
- package/resources/run/env.d.ts.map +1 -1
- package/resources/run/env.js.map +1 -1
- package/resources/run/epilogue.d.ts.map +1 -1
- package/resources/run/epilogue.js.map +1 -1
- package/resources/run/header.d.ts.map +1 -1
- package/resources/run/header.js.map +1 -1
- package/resources/run/prepare.d.ts.map +1 -1
- package/resources/run/prepare.js.map +1 -1
- package/resources/run/resolve.d.ts.map +1 -1
- package/resources/run/resolve.js.map +1 -1
- package/resources/run/resume.d.ts.map +1 -1
- package/resources/run/resume.js.map +1 -1
- package/resources/run/stream.d.ts.map +1 -1
- package/resources/run/stream.js.map +1 -1
- package/resources/run/workflow-stream.d.ts.map +1 -1
- package/resources/run/workflow-stream.js.map +1 -1
- package/resources/run/workspace.d.ts.map +1 -1
- package/resources/run/workspace.js.map +1 -1
- package/resources/schedule.d.ts.map +1 -1
- package/resources/schedule.js.map +1 -1
- package/resources/search.d.ts.map +1 -1
- package/resources/search.js.map +1 -1
- package/resources/session.d.ts.map +1 -1
- package/resources/session.js.map +1 -1
- package/resources/share.d.ts.map +1 -1
- package/resources/share.js.map +1 -1
- package/resources/skill.d.ts.map +1 -1
- package/resources/skill.js.map +1 -1
- package/resources/stream/approval-detect.d.ts.map +1 -1
- package/resources/stream/approval-detect.js.map +1 -1
- package/resources/stream/convert.d.ts.map +1 -1
- package/resources/stream/convert.js.map +1 -1
- package/resources/stream/diff.d.ts.map +1 -1
- package/resources/stream/diff.js.map +1 -1
- package/resources/stream/events.d.ts.map +1 -1
- package/resources/stream/events.js.map +1 -1
- package/resources/stream/headless.d.ts.map +1 -1
- package/resources/stream/headless.js.map +1 -1
- package/resources/stream/ink.d.ts.map +1 -1
- package/resources/stream/ink.js.map +1 -1
- package/resources/stream/render-ndjson.d.ts.map +1 -1
- package/resources/stream/render-ndjson.js.map +1 -1
- package/resources/stream/render-plaintext.d.ts.map +1 -1
- package/resources/stream/render-plaintext.js.map +1 -1
- package/resources/stream/snapshot.d.ts.map +1 -1
- package/resources/stream/snapshot.js.map +1 -1
- package/resources/stream/subagent.d.ts.map +1 -1
- package/resources/stream/subagent.js.map +1 -1
- package/resources/stream/submit.d.ts.map +1 -1
- package/resources/stream/submit.js.map +1 -1
- package/resources/stream/todo.d.ts.map +1 -1
- package/resources/stream/todo.js.map +1 -1
- package/resources/stream/tool-state.d.ts.map +1 -1
- package/resources/stream/tool-state.js.map +1 -1
- package/resources/stream/tty.d.ts.map +1 -1
- package/resources/stream/tty.js.map +1 -1
- package/resources/stream/workflow-event-view.d.ts.map +1 -1
- package/resources/stream/workflow-event-view.js.map +1 -1
- package/resources/stream/workflow-render-ndjson.d.ts.map +1 -1
- package/resources/stream/workflow-render-ndjson.js.map +1 -1
- package/resources/stream/workflow-render-plaintext.d.ts.map +1 -1
- package/resources/stream/workflow-render-plaintext.js.map +1 -1
- package/resources/tag.d.ts.map +1 -1
- package/resources/tag.js.map +1 -1
- package/resources/task-configs.d.ts.map +1 -1
- package/resources/task-configs.js.map +1 -1
- package/resources/usage.d.ts.map +1 -1
- package/resources/usage.js.map +1 -1
- package/resources/validate.d.ts.map +1 -1
- package/resources/validate.js.map +1 -1
- package/resources/version.d.ts.map +1 -1
- package/resources/version.js.map +1 -1
- package/runtime.d.ts.map +1 -1
- package/runtime.js.map +1 -1
- package/version.d.ts.map +1 -1
- package/version.js.map +1 -1
- package/src/auth/pkce.test.ts +0 -37
- package/src/auth/token.test.ts +0 -151
- package/src/client/client.test.ts +0 -142
- package/src/commands/apikey/duration.test.ts +0 -23
- package/src/commands/auth/login.test.ts +0 -52
- package/src/commands/auth/whoami.test.ts +0 -96
- package/src/commands/bootstrap.test.ts +0 -178
- package/src/commands/config/backend.test.ts +0 -122
- package/src/commands/config/context.test.ts +0 -171
- package/src/commands/connect.test.ts +0 -113
- package/src/commands/install.test.ts +0 -307
- package/src/commands/marketplace.test.ts +0 -205
- package/src/commands/mcp-server.test.ts +0 -65
- package/src/commands/validate.test.ts +0 -168
- package/src/config/config.test.ts +0 -132
- package/src/config/keys.test.ts +0 -61
- package/src/config/resolve.test.ts +0 -242
- package/src/errors/clierr.test.ts +0 -172
- package/src/local/artifact.test.ts +0 -54
- package/src/local/bootstrap.test.ts +0 -166
- package/src/local/daemon/components.test.ts +0 -148
- package/src/local/daemon/daemon.integration.test.ts +0 -216
- package/src/local/daemon/env.test.ts +0 -108
- package/src/local/daemon/launch.test.ts +0 -136
- package/src/local/daemon/supervisor.test.ts +0 -260
- package/src/local/llm-config.test.ts +0 -66
- package/src/local/logs/tail.test.ts +0 -70
- package/src/local/logs/view.test.ts +0 -46
- package/src/local/operator-config.test.ts +0 -72
- package/src/local/reset.test.ts +0 -53
- package/src/local/runtime/runtime.test.ts +0 -240
- package/src/local/runtime/runtimes-install.test.ts +0 -58
- package/src/local/runtime/server.test.ts +0 -253
- package/src/local/setup/wizard.test.ts +0 -94
- package/src/local/state/state.test.ts +0 -210
- package/src/local/status.test.ts +0 -108
- package/src/local/temporal/download.test.ts +0 -248
- package/src/local/temporal/inspect.test.ts +0 -83
- package/src/local/temporal/manager.test.ts +0 -64
- package/src/local/temporal/supervisor.test.ts +0 -77
- package/src/marketplace/__fixtures__/cursor-marketplace.ts +0 -69
- package/src/marketplace/config.test.ts +0 -254
- package/src/marketplace/github.test.ts +0 -394
- package/src/marketplace/install.test.ts +0 -261
- package/src/marketplace/official.test.ts +0 -107
- package/src/marketplace/read.test.ts +0 -93
- package/src/marketplace/ref.test.ts +0 -179
- package/src/output/command-result.test.ts +0 -73
- package/src/output/confirm.test.ts +0 -43
- package/src/output/format.test.ts +0 -65
- package/src/output/proto.test.ts +0 -72
- package/src/output/table.test.ts +0 -37
- package/src/program.test.ts +0 -62
- package/src/registry/aliases.test.ts +0 -142
- package/src/registry/registry.test.ts +0 -355
- package/src/resources/apply/apply.integration.test.ts +0 -353
- package/src/resources/apply/apply.test.ts +0 -134
- package/src/resources/apply/discovery.integration.test.ts +0 -99
- package/src/resources/connect/__fixtures__/stdio-crash.mjs +0 -6
- package/src/resources/connect/__fixtures__/stdio-server.mjs +0 -48
- package/src/resources/connect/connect.integration.test.ts +0 -383
- package/src/resources/connect/discover.test.ts +0 -84
- package/src/resources/connect/oauth.test.ts +0 -158
- package/src/resources/cursor-pages.test.ts +0 -55
- package/src/resources/diff.integration.test.ts +0 -103
- package/src/resources/diff.test.ts +0 -34
- package/src/resources/documents.test.ts +0 -67
- package/src/resources/execution-approve.test.ts +0 -50
- package/src/resources/execution-format.test.ts +0 -48
- package/src/resources/execution.integration.test.ts +0 -285
- package/src/resources/execution.test.ts +0 -138
- package/src/resources/ignore/ignore.test.ts +0 -62
- package/src/resources/mcp/placeholder-resolver.test.ts +0 -71
- package/src/resources/mcp/runtime-env.test.ts +0 -102
- package/src/resources/mutate-verbs.integration.test.ts +0 -455
- package/src/resources/picker/tty.test.ts +0 -37
- package/src/resources/plugin.test.ts +0 -379
- package/src/resources/push-download.integration.test.ts +0 -175
- package/src/resources/read-completion.integration.test.ts +0 -164
- package/src/resources/read-verbs.integration.test.ts +0 -603
- package/src/resources/reference.test.ts +0 -107
- package/src/resources/run/agent-exec.test.ts +0 -179
- package/src/resources/run/attachments.test.ts +0 -135
- package/src/resources/run/create.test.ts +0 -336
- package/src/resources/run/env.test.ts +0 -131
- package/src/resources/run/header.test.ts +0 -79
- package/src/resources/run/prepare.test.ts +0 -428
- package/src/resources/run/workflow-stream.integration.test.ts +0 -157
- package/src/resources/run/workspace.test.ts +0 -93
- package/src/resources/share.test.ts +0 -523
- package/src/resources/skill.test.ts +0 -364
- package/src/resources/stream/diff.test.ts +0 -338
- package/src/resources/stream/headless.test.ts +0 -119
- package/src/resources/stream/lazy-import.test.ts +0 -63
- package/src/resources/stream/render-ndjson.test.ts +0 -126
- package/src/resources/stream/render-plaintext.test.ts +0 -127
- package/src/resources/stream/snapshot.test.ts +0 -111
- package/src/resources/stream/submit.test.ts +0 -77
- package/src/resources/stream/workflow-event-view.test.ts +0 -116
- package/src/resources/stream/workflow-render.test.ts +0 -81
- package/src/resources/task-configs.test.ts +0 -98
- package/src/resources/usage.test.ts +0 -94
- package/src/resources/validate.test.ts +0 -79
|
@@ -1,523 +0,0 @@
|
|
|
1
|
-
// Unit tests for the share-agent resource layer. The critical contract is
|
|
2
|
-
// merge-preservation: `agentShare.apply` replaces the share's spec wholesale,
|
|
3
|
-
// so a CLI toggle must never wipe console-configured origins, visitor
|
|
4
|
-
// messages, credential bindings, or the audience.
|
|
5
|
-
|
|
6
|
-
import { create } from "@bufbuild/protobuf";
|
|
7
|
-
import { AgentSchema, type Agent } from "@stigmer/protos/ai/stigmer/agentic/agent/v1/api_pb";
|
|
8
|
-
import { AgentShareAudience } from "@stigmer/protos/ai/stigmer/agentic/agentshare/v1/spec_pb";
|
|
9
|
-
import { buildEmbedSnippet, type AgentShareInput, type Stigmer } from "@stigmer/sdk";
|
|
10
|
-
import { describe, expect, it } from "vitest";
|
|
11
|
-
import { classify, ExitCode, UsageError } from "../errors/index.js";
|
|
12
|
-
import { shareAgent } from "./share.js";
|
|
13
|
-
|
|
14
|
-
const CLOUD = { appOrigin: "https://app.stigmer.ai", isLocal: false };
|
|
15
|
-
const LOCAL = { appOrigin: "http://localhost:7234", isLocal: true };
|
|
16
|
-
|
|
17
|
-
function makeAgent(): Agent {
|
|
18
|
-
return create(AgentSchema, {
|
|
19
|
-
metadata: { id: "agt_01ARZ3NDEKTSV4RRFFQ69G5FAV", org: "acme", slug: "support-agent", name: "Support Agent" },
|
|
20
|
-
spec: {},
|
|
21
|
-
});
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
interface ShareFixture {
|
|
25
|
-
slug?: string;
|
|
26
|
-
enabled?: boolean;
|
|
27
|
-
audience?: AgentShareAudience;
|
|
28
|
-
allowedOrigins?: string[];
|
|
29
|
-
messages?: { rateLimited?: string; unavailable?: string; conversationEnded?: string };
|
|
30
|
-
environmentRefs?: { org: string; slug: string }[];
|
|
31
|
-
shareLinkToken?: string;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
// Plain-object AgentShare fixture: the CLI reads it structurally (metadata /
|
|
35
|
-
// spec / status), so proto construction adds nothing here.
|
|
36
|
-
function makeShare(fixture: ShareFixture = {}) {
|
|
37
|
-
const { shareLinkToken, slug, ...spec } = fixture;
|
|
38
|
-
return {
|
|
39
|
-
metadata: {
|
|
40
|
-
id: "ash_01ARZ3NDEKTSV4RRFFQ69G5FAV",
|
|
41
|
-
org: "acme",
|
|
42
|
-
slug: slug ?? "support-agent",
|
|
43
|
-
name: "Support Agent",
|
|
44
|
-
},
|
|
45
|
-
spec: {
|
|
46
|
-
agentRef: { org: "acme", slug: "support-agent" },
|
|
47
|
-
...spec,
|
|
48
|
-
},
|
|
49
|
-
...(shareLinkToken !== undefined ? { status: { shareLinkToken } } : {}),
|
|
50
|
-
};
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
// A minimal fake of the SDK surface shareAgent touches: agent resolution +
|
|
54
|
-
// call-recording agentShare getByAgent/apply/rotateShareLink (skill.test.ts
|
|
55
|
-
// convention). Apply answers with the applied input merged over the existing
|
|
56
|
-
// share (id assigned), mirroring the server's upsert. Rotation answers with
|
|
57
|
-
// the share re-stamped with `rotatedToken`, mirroring fresh entropy.
|
|
58
|
-
function fakeClient(
|
|
59
|
-
agent: Agent,
|
|
60
|
-
share: ReturnType<typeof makeShare> | null,
|
|
61
|
-
opts: { failWith?: Error; rotatedToken?: string } = {},
|
|
62
|
-
) {
|
|
63
|
-
const applies: AgentShareInput[] = [];
|
|
64
|
-
let rotations = 0;
|
|
65
|
-
let currentShare = share;
|
|
66
|
-
const client = {
|
|
67
|
-
agent: {
|
|
68
|
-
async get() {
|
|
69
|
-
return agent;
|
|
70
|
-
},
|
|
71
|
-
async getByReference() {
|
|
72
|
-
return agent;
|
|
73
|
-
},
|
|
74
|
-
},
|
|
75
|
-
agentShare: {
|
|
76
|
-
// Mirrors the server's org scope: a non-empty request org returns
|
|
77
|
-
// only that org's shares (the contract resolveCanonicalShare relies
|
|
78
|
-
// on to never surface another org's channel).
|
|
79
|
-
async getByAgent(input: { org?: string }) {
|
|
80
|
-
const items =
|
|
81
|
-
currentShare &&
|
|
82
|
-
(!input.org || currentShare.metadata.org === input.org)
|
|
83
|
-
? [currentShare]
|
|
84
|
-
: [];
|
|
85
|
-
return { totalCount: items.length, items };
|
|
86
|
-
},
|
|
87
|
-
async apply(input: AgentShareInput) {
|
|
88
|
-
if (opts.failWith) throw opts.failWith;
|
|
89
|
-
applies.push(input);
|
|
90
|
-
currentShare = {
|
|
91
|
-
metadata: {
|
|
92
|
-
id: currentShare?.metadata.id ?? "ash_01ARZ3NDEKTSV4RRFFQ69G5FAV",
|
|
93
|
-
org: input.org,
|
|
94
|
-
slug: input.slug ?? "",
|
|
95
|
-
name: input.name,
|
|
96
|
-
},
|
|
97
|
-
spec: {
|
|
98
|
-
agentRef: { org: input.agentRef.org, slug: input.agentRef.slug },
|
|
99
|
-
enabled: input.enabled ?? false,
|
|
100
|
-
audience: input.audience ?? AgentShareAudience.unspecified,
|
|
101
|
-
allowedOrigins: input.allowedOrigins ?? [],
|
|
102
|
-
messages: input.messages as never,
|
|
103
|
-
environmentRefs: input.environmentRefs ?? [],
|
|
104
|
-
},
|
|
105
|
-
...(currentShare?.status ? { status: currentShare.status } : {}),
|
|
106
|
-
} as ReturnType<typeof makeShare>;
|
|
107
|
-
return currentShare;
|
|
108
|
-
},
|
|
109
|
-
async rotateShareLink() {
|
|
110
|
-
rotations += 1;
|
|
111
|
-
currentShare = {
|
|
112
|
-
...(currentShare as ReturnType<typeof makeShare>),
|
|
113
|
-
status: { shareLinkToken: opts.rotatedToken ?? "fresh-token" },
|
|
114
|
-
};
|
|
115
|
-
return currentShare;
|
|
116
|
-
},
|
|
117
|
-
},
|
|
118
|
-
} as unknown as Stigmer;
|
|
119
|
-
return { client, applies, rotationCount: () => rotations };
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
describe("shareAgent merge-preservation (fails closed)", () => {
|
|
123
|
-
it("enabling preserves console-configured origins, messages, and bindings verbatim", async () => {
|
|
124
|
-
const share = makeShare({
|
|
125
|
-
enabled: false,
|
|
126
|
-
allowedOrigins: ["https://example.com", "https://docs.example.com"],
|
|
127
|
-
messages: { rateLimited: "Slow down!", unavailable: "Back soon.", conversationEnded: "Bye!" },
|
|
128
|
-
environmentRefs: [{ org: "acme", slug: "github-org-shared" }],
|
|
129
|
-
});
|
|
130
|
-
const { client, applies } = fakeClient(makeAgent(), share);
|
|
131
|
-
|
|
132
|
-
await shareAgent(client, "acme/support-agent", "acme", { enabled: true, ...CLOUD });
|
|
133
|
-
|
|
134
|
-
expect(applies).toHaveLength(1);
|
|
135
|
-
expect(applies[0].org).toBe("acme");
|
|
136
|
-
expect(applies[0].slug).toBe("support-agent");
|
|
137
|
-
expect(applies[0].agentRef).toEqual({ org: "acme", slug: "support-agent" });
|
|
138
|
-
expect(applies[0].enabled).toBe(true);
|
|
139
|
-
expect(applies[0].allowedOrigins).toEqual(["https://example.com", "https://docs.example.com"]);
|
|
140
|
-
expect(applies[0].messages?.rateLimited).toBe("Slow down!");
|
|
141
|
-
expect(applies[0].messages?.unavailable).toBe("Back soon.");
|
|
142
|
-
expect(applies[0].messages?.conversationEnded).toBe("Bye!");
|
|
143
|
-
expect(applies[0].environmentRefs).toEqual([{ org: "acme", slug: "github-org-shared" }]);
|
|
144
|
-
});
|
|
145
|
-
|
|
146
|
-
it("disabling preserves origins and messages, flipping only enabled", async () => {
|
|
147
|
-
const share = makeShare({
|
|
148
|
-
enabled: true,
|
|
149
|
-
allowedOrigins: ["https://example.com"],
|
|
150
|
-
messages: { rateLimited: "Slow down!" },
|
|
151
|
-
});
|
|
152
|
-
const { client, applies } = fakeClient(makeAgent(), share);
|
|
153
|
-
|
|
154
|
-
const result = await shareAgent(client, "acme/support-agent", "acme", { enabled: false, ...CLOUD });
|
|
155
|
-
|
|
156
|
-
expect(applies).toHaveLength(1);
|
|
157
|
-
expect(applies[0].enabled).toBe(false);
|
|
158
|
-
expect(applies[0].allowedOrigins).toEqual(["https://example.com"]);
|
|
159
|
-
expect(applies[0].messages?.rateLimited).toBe("Slow down!");
|
|
160
|
-
expect(result.message).toContain("Sharing disabled");
|
|
161
|
-
// No link/snippet on disable — the URL no longer works.
|
|
162
|
-
expect(result.sections).toHaveLength(0);
|
|
163
|
-
});
|
|
164
|
-
|
|
165
|
-
it("enabling a never-shared agent creates the canonical share", async () => {
|
|
166
|
-
const { client, applies } = fakeClient(makeAgent(), null);
|
|
167
|
-
|
|
168
|
-
await shareAgent(client, "acme/support-agent", "acme", { enabled: true, ...CLOUD });
|
|
169
|
-
|
|
170
|
-
expect(applies).toHaveLength(1);
|
|
171
|
-
// Create identity: the agent's own org/slug (the server's default,
|
|
172
|
-
// made explicit) with the agent reference and empty config.
|
|
173
|
-
expect(applies[0].slug).toBe("support-agent");
|
|
174
|
-
expect(applies[0].agentRef).toEqual({ org: "acme", slug: "support-agent" });
|
|
175
|
-
expect(applies[0].enabled).toBe(true);
|
|
176
|
-
expect(applies[0].allowedOrigins).toEqual([]);
|
|
177
|
-
expect(applies[0].messages?.rateLimited).toBe("");
|
|
178
|
-
expect(applies[0].environmentRefs).toEqual([]);
|
|
179
|
-
});
|
|
180
|
-
|
|
181
|
-
it("edits a renamed share under its own slug (never forks a second share)", async () => {
|
|
182
|
-
const share = makeShare({ slug: "help-desk", enabled: false });
|
|
183
|
-
const { client, applies } = fakeClient(makeAgent(), share);
|
|
184
|
-
|
|
185
|
-
const result = await shareAgent(client, "acme/support-agent", "acme", { enabled: true, ...CLOUD });
|
|
186
|
-
|
|
187
|
-
expect(applies).toHaveLength(1);
|
|
188
|
-
// Applying with the agent's slug would CREATE a second share; the
|
|
189
|
-
// toggle must target the existing row's identity.
|
|
190
|
-
expect(applies[0].slug).toBe("help-desk");
|
|
191
|
-
const link = result.sections.find((s) => s.title === "Public chat link");
|
|
192
|
-
expect(link?.items).toEqual(["https://app.stigmer.ai/chat/acme/help-desk"]);
|
|
193
|
-
});
|
|
194
|
-
|
|
195
|
-
it("a plain toggle preserves an org-members-only audience (never reverts to public)", async () => {
|
|
196
|
-
const share = makeShare({
|
|
197
|
-
enabled: false,
|
|
198
|
-
audience: AgentShareAudience.org,
|
|
199
|
-
allowedOrigins: [],
|
|
200
|
-
});
|
|
201
|
-
const { client, applies } = fakeClient(makeAgent(), share);
|
|
202
|
-
|
|
203
|
-
await shareAgent(client, "acme/support-agent", "acme", { enabled: true, ...CLOUD });
|
|
204
|
-
|
|
205
|
-
expect(applies).toHaveLength(1);
|
|
206
|
-
// A re-enable without --audience must keep the org restriction: writing
|
|
207
|
-
// public here would silently expose an internal agent to the internet.
|
|
208
|
-
expect(applies[0].audience).toBe(AgentShareAudience.org);
|
|
209
|
-
});
|
|
210
|
-
});
|
|
211
|
-
|
|
212
|
-
describe("shareAgent audience", () => {
|
|
213
|
-
it("--audience org sets the audience and applies the full spec", async () => {
|
|
214
|
-
const share = makeShare({
|
|
215
|
-
enabled: true,
|
|
216
|
-
allowedOrigins: ["https://example.com"],
|
|
217
|
-
messages: { rateLimited: "Slow down!" },
|
|
218
|
-
});
|
|
219
|
-
const { client, applies } = fakeClient(makeAgent(), share);
|
|
220
|
-
|
|
221
|
-
const result = await shareAgent(client, "acme/support-agent", "acme", {
|
|
222
|
-
enabled: true,
|
|
223
|
-
audience: "org",
|
|
224
|
-
...CLOUD,
|
|
225
|
-
});
|
|
226
|
-
|
|
227
|
-
expect(applies).toHaveLength(1);
|
|
228
|
-
expect(applies[0].audience).toBe(AgentShareAudience.org);
|
|
229
|
-
expect(applies[0].enabled).toBe(true);
|
|
230
|
-
expect(applies[0].allowedOrigins).toEqual(["https://example.com"]);
|
|
231
|
-
expect(applies[0].messages?.rateLimited).toBe("Slow down!");
|
|
232
|
-
|
|
233
|
-
// Org shares print the member link and NO embed snippet (embeds serve
|
|
234
|
-
// anonymous guests, which org shares refuse).
|
|
235
|
-
const link = result.sections.find((s) => s.title === "Member chat link");
|
|
236
|
-
expect(link?.items).toEqual(["https://app.stigmer.ai/chat/acme/support-agent"]);
|
|
237
|
-
expect(result.sections.find((s) => s.title === "Embed on your site")).toBeUndefined();
|
|
238
|
-
expect(result.hints.some((h) => h.includes("signed-in members"))).toBe(true);
|
|
239
|
-
expect(result.hints.some((h) => h.includes("search engines"))).toBe(false);
|
|
240
|
-
});
|
|
241
|
-
|
|
242
|
-
it("--audience public converts an org share back to an explicit public one", async () => {
|
|
243
|
-
const share = makeShare({ enabled: true, audience: AgentShareAudience.org });
|
|
244
|
-
const { client, applies } = fakeClient(makeAgent(), share);
|
|
245
|
-
|
|
246
|
-
await shareAgent(client, "acme/support-agent", "acme", {
|
|
247
|
-
enabled: true,
|
|
248
|
-
audience: "public",
|
|
249
|
-
...CLOUD,
|
|
250
|
-
});
|
|
251
|
-
|
|
252
|
-
expect(applies).toHaveLength(1);
|
|
253
|
-
// Written as the explicit enum value, never left unspecified.
|
|
254
|
-
expect(applies[0].audience).toBe(AgentShareAudience.public);
|
|
255
|
-
});
|
|
256
|
-
|
|
257
|
-
it("an audience change alone triggers a write even when enabled matches", async () => {
|
|
258
|
-
const share = makeShare({ enabled: true });
|
|
259
|
-
const { client, applies } = fakeClient(makeAgent(), share);
|
|
260
|
-
|
|
261
|
-
const result = await shareAgent(client, "acme/support-agent", "acme", {
|
|
262
|
-
enabled: true,
|
|
263
|
-
audience: "org",
|
|
264
|
-
...CLOUD,
|
|
265
|
-
});
|
|
266
|
-
|
|
267
|
-
expect(applies).toHaveLength(1);
|
|
268
|
-
expect(result.message).toContain("Sharing enabled");
|
|
269
|
-
});
|
|
270
|
-
|
|
271
|
-
it("matching enabled AND audience stays idempotent (no write)", async () => {
|
|
272
|
-
const share = makeShare({ enabled: true, audience: AgentShareAudience.org });
|
|
273
|
-
const { client, applies } = fakeClient(makeAgent(), share);
|
|
274
|
-
|
|
275
|
-
const result = await shareAgent(client, "acme/support-agent", "acme", {
|
|
276
|
-
enabled: true,
|
|
277
|
-
audience: "org",
|
|
278
|
-
...CLOUD,
|
|
279
|
-
});
|
|
280
|
-
|
|
281
|
-
expect(applies).toHaveLength(0);
|
|
282
|
-
expect(result.message).toContain("already on");
|
|
283
|
-
});
|
|
284
|
-
});
|
|
285
|
-
|
|
286
|
-
describe("shareAgent idempotency", () => {
|
|
287
|
-
it("skips the write when sharing is already enabled, still reporting the link", async () => {
|
|
288
|
-
const { client, applies } = fakeClient(makeAgent(), makeShare({ enabled: true }));
|
|
289
|
-
|
|
290
|
-
const result = await shareAgent(client, "acme/support-agent", "acme", { enabled: true, ...CLOUD });
|
|
291
|
-
|
|
292
|
-
expect(applies).toHaveLength(0);
|
|
293
|
-
expect(result.message).toContain("already on");
|
|
294
|
-
const link = result.sections.find((s) => s.title === "Public chat link");
|
|
295
|
-
expect(link?.items).toEqual(["https://app.stigmer.ai/chat/acme/support-agent"]);
|
|
296
|
-
});
|
|
297
|
-
|
|
298
|
-
it("skips the write when sharing is already disabled", async () => {
|
|
299
|
-
const { client, applies } = fakeClient(makeAgent(), makeShare({ enabled: false }));
|
|
300
|
-
|
|
301
|
-
const result = await shareAgent(client, "acme/support-agent", "acme", { enabled: false, ...CLOUD });
|
|
302
|
-
|
|
303
|
-
expect(applies).toHaveLength(0);
|
|
304
|
-
expect(result.message).toContain("already off");
|
|
305
|
-
});
|
|
306
|
-
|
|
307
|
-
it("disabling a never-shared agent creates nothing", async () => {
|
|
308
|
-
const { client, applies } = fakeClient(makeAgent(), null);
|
|
309
|
-
|
|
310
|
-
const result = await shareAgent(client, "acme/support-agent", "acme", { enabled: false, ...CLOUD });
|
|
311
|
-
|
|
312
|
-
// Materializing a share row just to mark it disabled would create a
|
|
313
|
-
// resource the owner never asked for.
|
|
314
|
-
expect(applies).toHaveLength(0);
|
|
315
|
-
expect(result.message).toContain("already off");
|
|
316
|
-
});
|
|
317
|
-
});
|
|
318
|
-
|
|
319
|
-
describe("shareAgent output", () => {
|
|
320
|
-
it("builds the link and snippet from the RESOLVED share's org/slug (ID refs included)", async () => {
|
|
321
|
-
const { client } = fakeClient(makeAgent(), makeShare({ enabled: false }));
|
|
322
|
-
|
|
323
|
-
const result = await shareAgent(client, "agt_01ARZ3NDEKTSV4RRFFQ69G5FAV", "", { enabled: true, ...CLOUD });
|
|
324
|
-
|
|
325
|
-
const link = result.sections.find((s) => s.title === "Public chat link");
|
|
326
|
-
expect(link?.items).toEqual(["https://app.stigmer.ai/chat/acme/support-agent"]);
|
|
327
|
-
});
|
|
328
|
-
|
|
329
|
-
it("emits the exact embed snippet the web share dialog emits", async () => {
|
|
330
|
-
const { client } = fakeClient(makeAgent(), makeShare({ enabled: false }));
|
|
331
|
-
|
|
332
|
-
const result = await shareAgent(client, "acme/support-agent", "acme", { enabled: true, ...CLOUD });
|
|
333
|
-
|
|
334
|
-
const embed = result.sections.find((s) => s.title === "Embed on your site");
|
|
335
|
-
expect(embed?.items.join("\n")).toBe(buildEmbedSnippet("https://app.stigmer.ai", "acme", "support-agent"));
|
|
336
|
-
});
|
|
337
|
-
|
|
338
|
-
it("includes the who-pays and indexability hints", async () => {
|
|
339
|
-
const { client } = fakeClient(makeAgent(), makeShare({ enabled: false }));
|
|
340
|
-
|
|
341
|
-
const result = await shareAgent(client, "acme/support-agent", "acme", { enabled: true, ...CLOUD });
|
|
342
|
-
|
|
343
|
-
expect(result.hints.some((h) => h.includes("acme's credits"))).toBe(true);
|
|
344
|
-
expect(result.hints.some((h) => h.includes("search engines"))).toBe(true);
|
|
345
|
-
});
|
|
346
|
-
|
|
347
|
-
it("warns that a local link won't serve visitors (guest chat is Cloud-only)", async () => {
|
|
348
|
-
const { client } = fakeClient(makeAgent(), makeShare({ enabled: false }));
|
|
349
|
-
|
|
350
|
-
const result = await shareAgent(client, "acme/support-agent", "acme", { enabled: true, ...LOCAL });
|
|
351
|
-
|
|
352
|
-
const link = result.sections.find((s) => s.title === "Public chat link");
|
|
353
|
-
expect(link?.items).toEqual(["http://localhost:7234/chat/acme/support-agent"]);
|
|
354
|
-
expect(result.hints.some((h) => h.includes("Stigmer Cloud"))).toBe(true);
|
|
355
|
-
});
|
|
356
|
-
|
|
357
|
-
it("omits the local warning on a cloud backend", async () => {
|
|
358
|
-
const { client } = fakeClient(makeAgent(), makeShare({ enabled: false }));
|
|
359
|
-
|
|
360
|
-
const result = await shareAgent(client, "acme/support-agent", "acme", { enabled: true, ...CLOUD });
|
|
361
|
-
|
|
362
|
-
expect(result.hints.some((h) => h.includes("Stigmer Cloud"))).toBe(false);
|
|
363
|
-
});
|
|
364
|
-
});
|
|
365
|
-
|
|
366
|
-
describe("shareAgent --reset-link (rotatable share token)", () => {
|
|
367
|
-
it("rotates and prints the fresh tokened link and snippet", async () => {
|
|
368
|
-
const { client, applies, rotationCount } = fakeClient(
|
|
369
|
-
makeAgent(),
|
|
370
|
-
makeShare({ enabled: true }),
|
|
371
|
-
{ rotatedToken: "fresh-token" },
|
|
372
|
-
);
|
|
373
|
-
|
|
374
|
-
const result = await shareAgent(client, "acme/support-agent", "acme", {
|
|
375
|
-
enabled: true,
|
|
376
|
-
resetLink: true,
|
|
377
|
-
...CLOUD,
|
|
378
|
-
});
|
|
379
|
-
|
|
380
|
-
// Already enabled: no spec write, exactly one rotation.
|
|
381
|
-
expect(applies).toHaveLength(0);
|
|
382
|
-
expect(rotationCount()).toBe(1);
|
|
383
|
-
expect(result.message).toContain("Share link reset");
|
|
384
|
-
|
|
385
|
-
const link = result.sections.find((s) => s.title === "Public chat link");
|
|
386
|
-
expect(link?.items).toEqual([
|
|
387
|
-
"https://app.stigmer.ai/chat/acme/support-agent?k=fresh-token",
|
|
388
|
-
]);
|
|
389
|
-
const embed = result.sections.find((s) => s.title === "Embed on your site");
|
|
390
|
-
expect(embed?.items.join("\n")).toBe(
|
|
391
|
-
buildEmbedSnippet("https://app.stigmer.ai", "acme", "support-agent", "fresh-token"),
|
|
392
|
-
);
|
|
393
|
-
expect(result.hints.some((h) => h.includes("Re-share the new link"))).toBe(true);
|
|
394
|
-
});
|
|
395
|
-
|
|
396
|
-
it("enable + reset on a never-shared agent creates the share, then rotates it", async () => {
|
|
397
|
-
const { client, applies, rotationCount } = fakeClient(makeAgent(), null, {
|
|
398
|
-
rotatedToken: "fresh-token",
|
|
399
|
-
});
|
|
400
|
-
|
|
401
|
-
const result = await shareAgent(client, "acme/support-agent", "acme", {
|
|
402
|
-
enabled: true,
|
|
403
|
-
resetLink: true,
|
|
404
|
-
...CLOUD,
|
|
405
|
-
});
|
|
406
|
-
|
|
407
|
-
// The rotation needs a share id, which only exists after the create.
|
|
408
|
-
expect(applies).toHaveLength(1);
|
|
409
|
-
expect(rotationCount()).toBe(1);
|
|
410
|
-
const link = result.sections.find((s) => s.title === "Public chat link");
|
|
411
|
-
expect(link?.items).toEqual([
|
|
412
|
-
"https://app.stigmer.ai/chat/acme/support-agent?k=fresh-token",
|
|
413
|
-
]);
|
|
414
|
-
});
|
|
415
|
-
|
|
416
|
-
it("a plain toggle on a locked link keeps printing the existing tokened URL", async () => {
|
|
417
|
-
const { client, rotationCount } = fakeClient(
|
|
418
|
-
makeAgent(),
|
|
419
|
-
makeShare({ enabled: true, shareLinkToken: "existing-token" }),
|
|
420
|
-
);
|
|
421
|
-
|
|
422
|
-
const result = await shareAgent(client, "acme/support-agent", "acme", {
|
|
423
|
-
enabled: true,
|
|
424
|
-
...CLOUD,
|
|
425
|
-
});
|
|
426
|
-
|
|
427
|
-
// No rotation was requested: the current token must ride the link
|
|
428
|
-
// verbatim, or the printed URL would be dead.
|
|
429
|
-
expect(rotationCount()).toBe(0);
|
|
430
|
-
const link = result.sections.find((s) => s.title === "Public chat link");
|
|
431
|
-
expect(link?.items).toEqual([
|
|
432
|
-
"https://app.stigmer.ai/chat/acme/support-agent?k=existing-token",
|
|
433
|
-
]);
|
|
434
|
-
});
|
|
435
|
-
|
|
436
|
-
it("refuses --reset-link for an org-members-only share with actionable guidance", async () => {
|
|
437
|
-
const { client, rotationCount } = fakeClient(
|
|
438
|
-
makeAgent(),
|
|
439
|
-
makeShare({ enabled: true, audience: AgentShareAudience.org }),
|
|
440
|
-
);
|
|
441
|
-
|
|
442
|
-
const err = await shareAgent(client, "acme/support-agent", "acme", {
|
|
443
|
-
enabled: true,
|
|
444
|
-
resetLink: true,
|
|
445
|
-
...CLOUD,
|
|
446
|
-
}).catch((e: unknown) => e);
|
|
447
|
-
|
|
448
|
-
// Org access is gated by live membership — the token is never consulted,
|
|
449
|
-
// so rotating it would be a silent no-op the user did not get.
|
|
450
|
-
expect(err).toBeInstanceOf(UsageError);
|
|
451
|
-
expect((err as Error).message).toContain("public links");
|
|
452
|
-
expect(rotationCount()).toBe(0);
|
|
453
|
-
});
|
|
454
|
-
|
|
455
|
-
it("the member link never carries a token, even when one exists in status", async () => {
|
|
456
|
-
const { client } = fakeClient(
|
|
457
|
-
makeAgent(),
|
|
458
|
-
makeShare({
|
|
459
|
-
enabled: true,
|
|
460
|
-
audience: AgentShareAudience.org,
|
|
461
|
-
shareLinkToken: "existing-token",
|
|
462
|
-
}),
|
|
463
|
-
);
|
|
464
|
-
|
|
465
|
-
const result = await shareAgent(client, "acme/support-agent", "acme", {
|
|
466
|
-
enabled: true,
|
|
467
|
-
...CLOUD,
|
|
468
|
-
});
|
|
469
|
-
|
|
470
|
-
const link = result.sections.find((s) => s.title === "Member chat link");
|
|
471
|
-
expect(link?.items).toEqual(["https://app.stigmer.ai/chat/acme/support-agent"]);
|
|
472
|
-
});
|
|
473
|
-
});
|
|
474
|
-
|
|
475
|
-
describe("shareAgent from another organization's context", () => {
|
|
476
|
-
it("refuses before any write, naming where the share lives and the plugin remedy", async () => {
|
|
477
|
-
// The server would refuse the agent_ref too; the CLI refuses first so
|
|
478
|
-
// the caller reads the remedy rather than a bare FAILED_PRECONDITION.
|
|
479
|
-
const { client, applies } = fakeClient(makeAgent(), null);
|
|
480
|
-
|
|
481
|
-
const err = await shareAgent(client, "acme/support-agent", "consumer-org", {
|
|
482
|
-
enabled: true,
|
|
483
|
-
...CLOUD,
|
|
484
|
-
}).catch((e: unknown) => e);
|
|
485
|
-
|
|
486
|
-
expect(err).toBeInstanceOf(UsageError);
|
|
487
|
-
expect((err as Error).message).toContain("lives in acme, not consumer-org");
|
|
488
|
-
expect((err as Error).message).toContain("install the plugin that carries it");
|
|
489
|
-
expect((err as Error).message).toContain("--org acme");
|
|
490
|
-
expect(classify(err)?.exitCode).toBe(ExitCode.Usage);
|
|
491
|
-
expect(applies).toHaveLength(0);
|
|
492
|
-
});
|
|
493
|
-
});
|
|
494
|
-
|
|
495
|
-
describe("shareAgent errors", () => {
|
|
496
|
-
it("fails fast with org guidance for a bare slug and no org", async () => {
|
|
497
|
-
const { client, applies } = fakeClient(makeAgent(), null);
|
|
498
|
-
|
|
499
|
-
const err = await shareAgent(client, "support-agent", "", { enabled: true, ...CLOUD }).catch((e: unknown) => e);
|
|
500
|
-
|
|
501
|
-
expect(err).toBeInstanceOf(UsageError);
|
|
502
|
-
expect((err as Error).message).toContain("organization not set");
|
|
503
|
-
expect(classify(err)?.exitCode).toBe(ExitCode.Usage);
|
|
504
|
-
expect(applies).toHaveLength(0);
|
|
505
|
-
});
|
|
506
|
-
|
|
507
|
-
it("does not apply the org guard to an ID reference", async () => {
|
|
508
|
-
const { client, applies } = fakeClient(makeAgent(), makeShare({ enabled: false }));
|
|
509
|
-
|
|
510
|
-
await shareAgent(client, "agt_01ARZ3NDEKTSV4RRFFQ69G5FAV", "", { enabled: true, ...CLOUD });
|
|
511
|
-
|
|
512
|
-
expect(applies).toHaveLength(1);
|
|
513
|
-
});
|
|
514
|
-
|
|
515
|
-
it("propagates server rejections (permission denied) unchanged", async () => {
|
|
516
|
-
const denied = new Error("permission denied: can_edit required");
|
|
517
|
-
const { client } = fakeClient(makeAgent(), makeShare({ enabled: false }), { failWith: denied });
|
|
518
|
-
|
|
519
|
-
await expect(shareAgent(client, "acme/support-agent", "acme", { enabled: true, ...CLOUD })).rejects.toThrow(
|
|
520
|
-
/permission denied/,
|
|
521
|
-
);
|
|
522
|
-
});
|
|
523
|
-
});
|