@chozzz/vargos 3.1.5 → 3.2.1
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/CONTRIBUTING.md +2 -3
- package/README.md +25 -34
- package/dist/.templates/workspace/AGENTS.md +2 -2
- package/dist/boot.d.ts +5 -0
- package/dist/boot.d.ts.map +1 -1
- package/dist/boot.js +62 -87
- package/dist/boot.js.map +1 -1
- package/dist/cli/channels.d.ts +6 -23
- package/dist/cli/channels.d.ts.map +1 -1
- package/dist/cli/channels.js +15 -124
- package/dist/cli/channels.js.map +1 -1
- package/dist/cli/chat.d.ts +6 -0
- package/dist/cli/chat.d.ts.map +1 -0
- package/dist/cli/chat.js +49 -0
- package/dist/cli/chat.js.map +1 -0
- package/dist/cli/onboard.d.ts.map +1 -1
- package/dist/cli/onboard.js +2 -8
- package/dist/cli/onboard.js.map +1 -1
- package/dist/cli.d.ts +9 -7
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +207 -290
- package/dist/cli.js.map +1 -1
- package/dist/core/bus.d.ts +32 -0
- package/dist/core/bus.d.ts.map +1 -0
- package/dist/core/bus.js +133 -0
- package/dist/core/bus.js.map +1 -0
- package/dist/core/cli.d.ts +38 -0
- package/dist/core/cli.d.ts.map +1 -0
- package/dist/core/cli.js +199 -0
- package/dist/core/cli.js.map +1 -0
- package/dist/core/errors.d.ts +21 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +30 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/loader.d.ts +31 -0
- package/dist/core/loader.d.ts.map +1 -0
- package/dist/core/loader.js +73 -0
- package/dist/core/loader.js.map +1 -0
- package/dist/core/local.d.ts +12 -0
- package/dist/core/local.d.ts.map +1 -0
- package/dist/core/local.js +23 -0
- package/dist/core/local.js.map +1 -0
- package/dist/core/rpc-server.d.ts +11 -0
- package/dist/core/rpc-server.d.ts.map +1 -0
- package/dist/core/rpc-server.js +69 -0
- package/dist/core/rpc-server.js.map +1 -0
- package/dist/core/services.d.ts +8 -0
- package/dist/core/services.d.ts.map +1 -0
- package/dist/core/services.js +33 -0
- package/dist/core/services.js.map +1 -0
- package/dist/core/types.d.ts +63 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +2 -0
- package/dist/core/types.js.map +1 -0
- package/dist/edge/mcp/index.d.ts +11 -11
- package/dist/edge/mcp/index.d.ts.map +1 -1
- package/dist/edge/mcp/index.js +24 -28
- package/dist/edge/mcp/index.js.map +1 -1
- package/dist/edge/webhooks/index.d.ts +8 -14
- package/dist/edge/webhooks/index.d.ts.map +1 -1
- package/dist/edge/webhooks/index.js +140 -194
- package/dist/edge/webhooks/index.js.map +1 -1
- package/dist/lib/logger.d.ts +2 -3
- package/dist/lib/logger.d.ts.map +1 -1
- package/dist/lib/logger.js +1 -1
- package/dist/lib/logger.js.map +1 -1
- package/dist/lib/paginate.d.ts +5 -1
- package/dist/lib/paginate.d.ts.map +1 -1
- package/dist/lib/retry.js +1 -1
- package/dist/lib/retry.js.map +1 -1
- package/dist/lib/util.d.ts +16 -0
- package/dist/lib/util.d.ts.map +1 -0
- package/dist/lib/util.js +63 -0
- package/dist/lib/util.js.map +1 -0
- package/dist/scripts/verify-core.d.ts +8 -0
- package/dist/scripts/verify-core.d.ts.map +1 -0
- package/dist/scripts/verify-core.js +191 -0
- package/dist/scripts/verify-core.js.map +1 -0
- package/dist/services/agent/index.d.ts +14 -18
- package/dist/services/agent/index.d.ts.map +1 -1
- package/dist/services/agent/index.js +469 -530
- package/dist/services/agent/index.js.map +1 -1
- package/dist/services/agent/tools.d.ts +3 -3
- package/dist/services/agent/tools.d.ts.map +1 -1
- package/dist/services/agent/tools.js +11 -19
- package/dist/services/agent/tools.js.map +1 -1
- package/dist/services/agent/types.d.ts +1 -1
- package/dist/services/agent/types.d.ts.map +1 -1
- package/dist/services/{channels → channel}/base-adapter.d.ts +5 -6
- package/dist/services/channel/base-adapter.d.ts.map +1 -0
- package/dist/services/channel/base-adapter.js.map +1 -0
- package/dist/services/channel/debounce.d.ts.map +1 -0
- package/dist/services/channel/debounce.js.map +1 -0
- package/dist/services/channel/dedupe.d.ts.map +1 -0
- package/dist/services/channel/dedupe.js.map +1 -0
- package/dist/services/channel/delivery.d.ts.map +1 -0
- package/dist/services/{channels → channel}/delivery.js +1 -1
- package/dist/services/channel/delivery.js.map +1 -0
- package/dist/services/{channels → channel}/index.d.ts +14 -17
- package/dist/services/channel/index.d.ts.map +1 -0
- package/dist/services/channel/index.js +354 -0
- package/dist/services/channel/index.js.map +1 -0
- package/dist/services/channel/link-expand.d.ts.map +1 -0
- package/dist/services/channel/link-expand.js.map +1 -0
- package/dist/services/channel/media-paths.d.ts.map +1 -0
- package/dist/services/channel/media-paths.js.map +1 -0
- package/dist/services/{channels → channel}/pipeline.d.ts +1 -1
- package/dist/services/channel/pipeline.d.ts.map +1 -0
- package/dist/services/channel/pipeline.js.map +1 -0
- package/dist/services/channel/provider-loader.d.ts.map +1 -0
- package/dist/services/channel/provider-loader.js.map +1 -0
- package/dist/services/channel/providers/telegram/adapter.d.ts.map +1 -0
- package/dist/services/{channels → channel}/providers/telegram/adapter.js +1 -1
- package/dist/services/channel/providers/telegram/adapter.js.map +1 -0
- package/dist/services/channel/providers/telegram/index.d.ts.map +1 -0
- package/dist/services/channel/providers/telegram/index.js.map +1 -0
- package/dist/services/channel/providers/telegram/normalizer.d.ts.map +1 -0
- package/dist/services/channel/providers/telegram/normalizer.js.map +1 -0
- package/dist/services/channel/providers/telegram/types.d.ts.map +1 -0
- package/dist/services/channel/providers/telegram/types.js.map +1 -0
- package/dist/services/channel/providers/whatsapp/adapter.d.ts.map +1 -0
- package/dist/services/channel/providers/whatsapp/adapter.js.map +1 -0
- package/dist/services/channel/providers/whatsapp/index.d.ts.map +1 -0
- package/dist/services/channel/providers/whatsapp/index.js.map +1 -0
- package/dist/services/channel/providers/whatsapp/normalizer.d.ts.map +1 -0
- package/dist/services/channel/providers/whatsapp/normalizer.js.map +1 -0
- package/dist/services/channel/providers/whatsapp/session.d.ts.map +1 -0
- package/dist/services/channel/providers/whatsapp/session.js.map +1 -0
- package/dist/services/channel/providers/whatsapp/types.d.ts.map +1 -0
- package/dist/services/channel/providers/whatsapp/types.js.map +1 -0
- package/dist/services/channel/reconnect.d.ts.map +1 -0
- package/dist/services/channel/reconnect.js.map +1 -0
- package/dist/services/channel/status-reactions.d.ts.map +1 -0
- package/dist/services/channel/status-reactions.js.map +1 -0
- package/dist/services/{channels → channel}/types.d.ts +1 -1
- package/dist/services/channel/types.d.ts.map +1 -0
- package/dist/services/channel/types.js.map +1 -0
- package/dist/services/channel/typing-state.d.ts.map +1 -0
- package/dist/services/channel/typing-state.js.map +1 -0
- package/dist/services/config/index.d.ts +45 -46
- package/dist/services/config/index.d.ts.map +1 -1
- package/dist/services/config/index.js +89 -182
- package/dist/services/config/index.js.map +1 -1
- package/dist/services/config/schemas/cron.d.ts +3 -3
- package/dist/services/config/schemas/providers.d.ts +12 -12
- package/dist/services/config/schemas/webhooks.d.ts +2 -2
- package/dist/services/cron/index.d.ts +16 -19
- package/dist/services/cron/index.d.ts.map +1 -1
- package/dist/services/cron/index.js +340 -396
- package/dist/services/cron/index.js.map +1 -1
- package/dist/services/log/index.d.ts +9 -8
- package/dist/services/log/index.d.ts.map +1 -1
- package/dist/services/log/index.js +71 -123
- package/dist/services/log/index.js.map +1 -1
- package/dist/services/{mcp-client → mcp}/index.d.ts +9 -11
- package/dist/services/mcp/index.d.ts.map +1 -0
- package/dist/services/{mcp-client → mcp}/index.js +19 -35
- package/dist/services/mcp/index.js.map +1 -0
- package/dist/services/media/index.d.ts +9 -13
- package/dist/services/media/index.d.ts.map +1 -1
- package/dist/services/media/index.js +53 -105
- package/dist/services/media/index.js.map +1 -1
- package/dist/services/memory/index.d.ts +12 -18
- package/dist/services/memory/index.d.ts.map +1 -1
- package/dist/services/memory/index.js +70 -132
- package/dist/services/memory/index.js.map +1 -1
- package/dist/services/web/index.d.ts +7 -7
- package/dist/services/web/index.d.ts.map +1 -1
- package/dist/services/web/index.js +41 -86
- package/dist/services/web/index.js.map +1 -1
- package/package.json +3 -2
- package/dist/gateway/bus.d.ts +0 -50
- package/dist/gateway/bus.d.ts.map +0 -1
- package/dist/gateway/bus.js +0 -2
- package/dist/gateway/bus.js.map +0 -1
- package/dist/gateway/decorators.d.ts +0 -40
- package/dist/gateway/decorators.d.ts.map +0 -1
- package/dist/gateway/decorators.js +0 -43
- package/dist/gateway/decorators.js.map +0 -1
- package/dist/gateway/emitter.d.ts +0 -52
- package/dist/gateway/emitter.d.ts.map +0 -1
- package/dist/gateway/emitter.js +0 -304
- package/dist/gateway/emitter.js.map +0 -1
- package/dist/gateway/events.d.ts +0 -329
- package/dist/gateway/events.d.ts.map +0 -1
- package/dist/gateway/events.js +0 -7
- package/dist/gateway/events.js.map +0 -1
- package/dist/gateway/tcp-server.d.ts +0 -7
- package/dist/gateway/tcp-server.d.ts.map +0 -1
- package/dist/gateway/tcp-server.js +0 -118
- package/dist/gateway/tcp-server.js.map +0 -1
- package/dist/lib/id.d.ts +0 -3
- package/dist/lib/id.d.ts.map +0 -1
- package/dist/lib/id.js +0 -5
- package/dist/lib/id.js.map +0 -1
- package/dist/lib/sleep.d.ts +0 -6
- package/dist/lib/sleep.d.ts.map +0 -1
- package/dist/lib/sleep.js +0 -22
- package/dist/lib/sleep.js.map +0 -1
- package/dist/lib/strip-markdown.d.ts +0 -7
- package/dist/lib/strip-markdown.d.ts.map +0 -1
- package/dist/lib/strip-markdown.js +0 -32
- package/dist/lib/strip-markdown.js.map +0 -1
- package/dist/lib/timeout.d.ts +0 -6
- package/dist/lib/timeout.d.ts.map +0 -1
- package/dist/lib/timeout.js +0 -11
- package/dist/lib/timeout.js.map +0 -1
- package/dist/lib/truncate.d.ts +0 -11
- package/dist/lib/truncate.d.ts.map +0 -1
- package/dist/lib/truncate.js +0 -17
- package/dist/lib/truncate.js.map +0 -1
- package/dist/services/channels/base-adapter.d.ts.map +0 -1
- package/dist/services/channels/base-adapter.js.map +0 -1
- package/dist/services/channels/debounce.d.ts.map +0 -1
- package/dist/services/channels/debounce.js.map +0 -1
- package/dist/services/channels/dedupe.d.ts.map +0 -1
- package/dist/services/channels/dedupe.js.map +0 -1
- package/dist/services/channels/delivery.d.ts.map +0 -1
- package/dist/services/channels/delivery.js.map +0 -1
- package/dist/services/channels/index.d.ts.map +0 -1
- package/dist/services/channels/index.js +0 -413
- package/dist/services/channels/index.js.map +0 -1
- package/dist/services/channels/link-expand.d.ts.map +0 -1
- package/dist/services/channels/link-expand.js.map +0 -1
- package/dist/services/channels/media-paths.d.ts.map +0 -1
- package/dist/services/channels/media-paths.js.map +0 -1
- package/dist/services/channels/pipeline.d.ts.map +0 -1
- package/dist/services/channels/pipeline.js.map +0 -1
- package/dist/services/channels/provider-loader.d.ts.map +0 -1
- package/dist/services/channels/provider-loader.js.map +0 -1
- package/dist/services/channels/providers/telegram/adapter.d.ts.map +0 -1
- package/dist/services/channels/providers/telegram/adapter.js.map +0 -1
- package/dist/services/channels/providers/telegram/index.d.ts.map +0 -1
- package/dist/services/channels/providers/telegram/index.js.map +0 -1
- package/dist/services/channels/providers/telegram/normalizer.d.ts.map +0 -1
- package/dist/services/channels/providers/telegram/normalizer.js.map +0 -1
- package/dist/services/channels/providers/telegram/types.d.ts.map +0 -1
- package/dist/services/channels/providers/telegram/types.js.map +0 -1
- package/dist/services/channels/providers/whatsapp/adapter.d.ts.map +0 -1
- package/dist/services/channels/providers/whatsapp/adapter.js.map +0 -1
- package/dist/services/channels/providers/whatsapp/index.d.ts.map +0 -1
- package/dist/services/channels/providers/whatsapp/index.js.map +0 -1
- package/dist/services/channels/providers/whatsapp/normalizer.d.ts.map +0 -1
- package/dist/services/channels/providers/whatsapp/normalizer.js.map +0 -1
- package/dist/services/channels/providers/whatsapp/session.d.ts.map +0 -1
- package/dist/services/channels/providers/whatsapp/session.js.map +0 -1
- package/dist/services/channels/providers/whatsapp/types.d.ts.map +0 -1
- package/dist/services/channels/providers/whatsapp/types.js.map +0 -1
- package/dist/services/channels/reconnect.d.ts.map +0 -1
- package/dist/services/channels/reconnect.js.map +0 -1
- package/dist/services/channels/status-reactions.d.ts.map +0 -1
- package/dist/services/channels/status-reactions.js.map +0 -1
- package/dist/services/channels/types.d.ts.map +0 -1
- package/dist/services/channels/types.js.map +0 -1
- package/dist/services/channels/typing-state.d.ts.map +0 -1
- package/dist/services/channels/typing-state.js.map +0 -1
- package/dist/services/mcp-client/index.d.ts.map +0 -1
- package/dist/services/mcp-client/index.js.map +0 -1
- /package/dist/services/{channels → channel}/base-adapter.js +0 -0
- /package/dist/services/{channels → channel}/debounce.d.ts +0 -0
- /package/dist/services/{channels → channel}/debounce.js +0 -0
- /package/dist/services/{channels → channel}/dedupe.d.ts +0 -0
- /package/dist/services/{channels → channel}/dedupe.js +0 -0
- /package/dist/services/{channels → channel}/delivery.d.ts +0 -0
- /package/dist/services/{channels → channel}/link-expand.d.ts +0 -0
- /package/dist/services/{channels → channel}/link-expand.js +0 -0
- /package/dist/services/{channels → channel}/media-paths.d.ts +0 -0
- /package/dist/services/{channels → channel}/media-paths.js +0 -0
- /package/dist/services/{channels → channel}/pipeline.js +0 -0
- /package/dist/services/{channels → channel}/provider-loader.d.ts +0 -0
- /package/dist/services/{channels → channel}/provider-loader.js +0 -0
- /package/dist/services/{channels → channel}/providers/telegram/adapter.d.ts +0 -0
- /package/dist/services/{channels → channel}/providers/telegram/index.d.ts +0 -0
- /package/dist/services/{channels → channel}/providers/telegram/index.js +0 -0
- /package/dist/services/{channels → channel}/providers/telegram/normalizer.d.ts +0 -0
- /package/dist/services/{channels → channel}/providers/telegram/normalizer.js +0 -0
- /package/dist/services/{channels → channel}/providers/telegram/types.d.ts +0 -0
- /package/dist/services/{channels → channel}/providers/telegram/types.js +0 -0
- /package/dist/services/{channels → channel}/providers/whatsapp/adapter.d.ts +0 -0
- /package/dist/services/{channels → channel}/providers/whatsapp/adapter.js +0 -0
- /package/dist/services/{channels → channel}/providers/whatsapp/index.d.ts +0 -0
- /package/dist/services/{channels → channel}/providers/whatsapp/index.js +0 -0
- /package/dist/services/{channels → channel}/providers/whatsapp/normalizer.d.ts +0 -0
- /package/dist/services/{channels → channel}/providers/whatsapp/normalizer.js +0 -0
- /package/dist/services/{channels → channel}/providers/whatsapp/session.d.ts +0 -0
- /package/dist/services/{channels → channel}/providers/whatsapp/session.js +0 -0
- /package/dist/services/{channels → channel}/providers/whatsapp/types.d.ts +0 -0
- /package/dist/services/{channels → channel}/providers/whatsapp/types.js +0 -0
- /package/dist/services/{channels → channel}/reconnect.d.ts +0 -0
- /package/dist/services/{channels → channel}/reconnect.js +0 -0
- /package/dist/services/{channels → channel}/status-reactions.d.ts +0 -0
- /package/dist/services/{channels → channel}/status-reactions.js +0 -0
- /package/dist/services/{channels → channel}/types.js +0 -0
- /package/dist/services/{channels → channel}/typing-state.d.ts +0 -0
- /package/dist/services/{channels → channel}/typing-state.js +0 -0
package/CONTRIBUTING.md
CHANGED
|
@@ -50,9 +50,8 @@ pnpm lint # ESLint + typecheck
|
|
|
50
50
|
|
|
51
51
|
For deeper understanding of the project:
|
|
52
52
|
|
|
53
|
-
- [Architecture
|
|
54
|
-
- [
|
|
55
|
-
- [API Reference](./docs/api-reference.md) — Complete bus RPC reference
|
|
53
|
+
- [Architecture](./docs/architecture.md) — bus registry, service contract, surfaces, hot reload
|
|
54
|
+
- [Extending](./docs/extending.md) — add tools, skills, providers
|
|
56
55
|
- [Debugging](./docs/debugging.md) — Debug modes and logging
|
|
57
56
|
|
|
58
57
|
## Project Status
|
package/README.md
CHANGED
|
@@ -33,22 +33,20 @@ After setup: `vargos start` boots the server, `vargos onboard` re-runs the wizar
|
|
|
33
33
|
|
|
34
34
|
## Architecture
|
|
35
35
|
|
|
36
|
+
One **bus** owns one **registry** of methods. The CLI, the agent's tools, and the JSON-RPC
|
|
37
|
+
server are all projections of that registry — register a method once, it appears everywhere.
|
|
38
|
+
|
|
36
39
|
```
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
↓ ↓ ↓
|
|
44
|
-
┌─────────┐ ┌──────────┐ ┌────────────┐
|
|
45
|
-
│ Config │ │ Agent │ │ CLI │
|
|
46
|
-
│ Log │ │ Channels │ │ External │
|
|
47
|
-
│ Memory │ │ Cron │ │ Clients │
|
|
48
|
-
└─────────┘ └──────────┘ └────────────┘
|
|
40
|
+
CLI Agent tools JSON-RPC :9000
|
|
41
|
+
\ | /
|
|
42
|
+
└────────── Bus (registry) ───────┘
|
|
43
|
+
│
|
|
44
|
+
config · log · web · memory · media · agent · channel · cron · mcp
|
|
45
|
+
(services/<name>/ — discovered from disk, loaded by the bus)
|
|
49
46
|
```
|
|
50
47
|
|
|
51
|
-
Services are isolated — no shared state,
|
|
48
|
+
Services are isolated — no shared state, no cross-imports; they talk only via `bus.call` /
|
|
49
|
+
`bus.emit`. See [Architecture](./docs/architecture.md).
|
|
52
50
|
|
|
53
51
|
## Key Concepts
|
|
54
52
|
|
|
@@ -61,7 +59,7 @@ Services are isolated — no shared state, communication only through internal A
|
|
|
61
59
|
|
|
62
60
|
### Message Handling
|
|
63
61
|
|
|
64
|
-
Messages go through a simple pipeline: **receive → process → execute → respond**. The agent has access to all Vargos tools and your workspace context. See [
|
|
62
|
+
Messages go through a simple pipeline: **receive → process → execute → respond**. The agent has access to all Vargos tools and your workspace context. See [Usage](./docs/usage.md) for details.
|
|
65
63
|
|
|
66
64
|
## Documentation
|
|
67
65
|
|
|
@@ -69,48 +67,41 @@ Messages go through a simple pipeline: **receive → process → execute → res
|
|
|
69
67
|
|-----|-------------|
|
|
70
68
|
| [Getting Started](./docs/getting-started.md) | Install, first run, config wizard |
|
|
71
69
|
| [Configuration](./docs/configuration.md) | Full config reference |
|
|
72
|
-
| [
|
|
73
|
-
| [
|
|
74
|
-
| [
|
|
75
|
-
| [
|
|
76
|
-
| [
|
|
77
|
-
| [Troubleshooting](./docs/usage/troubleshooting.md) | Common issues and fixes |
|
|
70
|
+
| [Architecture](./docs/architecture.md) | Bus registry, service contract, surfaces, hot reload |
|
|
71
|
+
| [Usage](./docs/usage.md) | Channels, sessions, MCP, runtime, personas, workspace files |
|
|
72
|
+
| [Extending](./docs/extending.md) | Add tools, skills, providers |
|
|
73
|
+
| [Examples](./docs/examples.md) | MCP integration, scheduled research, multi-channel |
|
|
74
|
+
| [Debugging](./docs/debugging.md) | Debug modes and logging |
|
|
78
75
|
| [Roadmap](./docs/ROADMAP.md) | Planned features |
|
|
79
76
|
|
|
80
|
-
### Examples
|
|
81
|
-
|
|
82
|
-
- [MCP Integration](./docs/examples/mcp-integration.md) — Connect external tool servers
|
|
83
|
-
- [Scheduled Research](./docs/examples/scheduled-research.md) — Daily reports via cron
|
|
84
|
-
- [Multi-Channel Presence](./docs/examples/multi-channel-presence.md) — WhatsApp + Telegram + CLI
|
|
85
|
-
- [Architecture Deep Dive](./docs/architecture/bus-design.md) — Event bus patterns
|
|
86
|
-
- [Extending](./docs/extending/) — Tools, skills, providers
|
|
87
|
-
|
|
88
77
|
## Usage
|
|
89
78
|
|
|
90
79
|
```bash
|
|
91
80
|
vargos # First-run wizard or help
|
|
92
|
-
vargos start # Boot the
|
|
81
|
+
vargos start # Boot the daemon (bus + all services + JSON-RPC :9000)
|
|
82
|
+
vargos <service> # List a service's methods (e.g. vargos channel)
|
|
83
|
+
vargos <service> --help # Methods, descriptions, arg shapes
|
|
84
|
+
vargos <service> <method> … # Invoke a method (e.g. vargos channel send <to> "<msg>")
|
|
93
85
|
vargos onboard # Re-run setup wizard
|
|
94
|
-
vargos config # Show current configuration
|
|
95
86
|
```
|
|
96
87
|
|
|
97
88
|
## Development
|
|
98
89
|
|
|
99
90
|
```bash
|
|
100
91
|
pnpm install # Install deps
|
|
101
|
-
pnpm start #
|
|
92
|
+
pnpm start # Boot the daemon (alias: vargos start)
|
|
102
93
|
pnpm chat # Pi SDK interactive REPL bound to ~/.vargos/agent
|
|
103
|
-
pnpm seed # Re-seed .templates/ → ~/.vargos/ (idempotent)
|
|
104
94
|
pnpm cli # Run the CLI entrypoint directly (tsx cli.ts)
|
|
105
|
-
pnpm
|
|
95
|
+
pnpm verify # Run the core acceptance checks (scripts/verify-core.ts)
|
|
106
96
|
pnpm run test:run # Tests (single run)
|
|
107
97
|
pnpm run typecheck # TypeScript check
|
|
108
98
|
pnpm lint # ESLint + typecheck
|
|
109
99
|
pnpm build # Clean + compile + copy templates → dist/
|
|
100
|
+
```
|
|
110
101
|
|
|
111
102
|
## Contributing
|
|
112
103
|
|
|
113
|
-
See [CONTRIBUTING.md](./CONTRIBUTING.md) for architecture
|
|
104
|
+
See [CONTRIBUTING.md](./CONTRIBUTING.md) for architecture and development guidelines.
|
|
114
105
|
|
|
115
106
|
## License
|
|
116
107
|
|
|
@@ -43,7 +43,7 @@ A good long-running job:
|
|
|
43
43
|
Notify with the CLI — it reaches the running gateway and handles the channel key format for you:
|
|
44
44
|
|
|
45
45
|
```bash
|
|
46
|
-
vargos
|
|
46
|
+
vargos channel send "${SESSION_KEY}" "✅ Job done — log: /tmp/job.log"
|
|
47
47
|
```
|
|
48
48
|
|
|
49
49
|
That is shorthand for the raw gateway call:
|
|
@@ -56,7 +56,7 @@ Detach so the work survives the run, and notify on exit:
|
|
|
56
56
|
|
|
57
57
|
```bash
|
|
58
58
|
nohup bash -c 'my_command > /tmp/job.log 2>&1; \
|
|
59
|
-
vargos
|
|
59
|
+
vargos channel send "${SESSION_KEY}" "Job finished (exit $?) — log: /tmp/job.log"' >/dev/null 2>&1 &
|
|
60
60
|
echo "Started PID $! → /tmp/job.log"
|
|
61
61
|
```
|
|
62
62
|
|
package/dist/boot.d.ts
CHANGED
|
@@ -1,2 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Daemon entry. Builds the bus, loads services from disk via the loader (so reload
|
|
3
|
+
* picks up new code), registers lifecycle methods, starts the JSON-RPC surface, and
|
|
4
|
+
* signals readiness. The supervisor (index.ts) respawns this on RESTART_EXIT_CODE.
|
|
5
|
+
*/
|
|
1
6
|
export {};
|
|
2
7
|
//# sourceMappingURL=boot.d.ts.map
|
package/dist/boot.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"boot.d.ts","sourceRoot":"","sources":["../boot.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"boot.d.ts","sourceRoot":"","sources":["../boot.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
package/dist/boot.js
CHANGED
|
@@ -1,114 +1,89 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Daemon entry. Builds the bus, loads services from disk via the loader (so reload
|
|
3
|
+
* picks up new code), registers lifecycle methods, starts the JSON-RPC surface, and
|
|
4
|
+
* signals readiness. The supervisor (index.ts) respawns this on RESTART_EXIT_CODE.
|
|
5
|
+
*/
|
|
6
|
+
import path from 'node:path';
|
|
7
|
+
import { fileURLToPath } from 'node:url';
|
|
8
|
+
import { z } from 'zod';
|
|
9
|
+
import { EmitterBus } from './core/bus.js';
|
|
10
|
+
import { ServiceLoader } from './core/loader.js';
|
|
11
|
+
import { discoverServices } from './core/services.js';
|
|
12
|
+
import { startRpcServer } from './core/rpc-server.js';
|
|
3
13
|
import { createLogger } from './lib/logger.js';
|
|
4
14
|
import { seedDataDir } from './lib/templates.js';
|
|
5
15
|
import { runMigrations } from './lib/migrate.js';
|
|
6
|
-
import { z } from 'zod';
|
|
7
|
-
// ── Boot order ────────────────────────────────────────────────────────────────
|
|
8
|
-
// Each entry: [label, () => import(module)]
|
|
9
|
-
// Comment out services not yet built — add them back as they land.
|
|
10
|
-
const SERVICES = [
|
|
11
|
-
['config', () => import('./services/config/index.js')],
|
|
12
|
-
['log', () => import('./services/log/index.js')],
|
|
13
|
-
['web', () => import('./services/web/index.js')],
|
|
14
|
-
['memory', () => import('./services/memory/index.js')],
|
|
15
|
-
['media', () => import('./services/media/index.js')],
|
|
16
|
-
['agent', () => import('./services/agent/index.js')],
|
|
17
|
-
['channels', () => import('./services/channels/index.js')],
|
|
18
|
-
['cron', () => import('./services/cron/index.js')],
|
|
19
|
-
['mcp-client', () => import('./services/mcp-client/index.js')],
|
|
20
|
-
// ['webhooks', () => import('./edge/webhooks/index.js')],
|
|
21
|
-
// ['mcp', () => import('./edge/mcp/index.js')],
|
|
22
|
-
];
|
|
23
|
-
// Fail fast on a duplicated label — each service boots exactly once.
|
|
24
|
-
const labels = SERVICES.map(([label]) => label);
|
|
25
|
-
if (new Set(labels).size !== labels.length) {
|
|
26
|
-
throw new Error(`duplicate service label in SERVICES: ${labels.join(', ')}`);
|
|
27
|
-
}
|
|
28
|
-
// ── Boot ──────────────────────────────────────────────────────────────────────
|
|
29
16
|
const RESTART_EXIT_CODE = 42;
|
|
30
|
-
const bus = new EventEmitterBus();
|
|
31
17
|
const log = createLogger('boot');
|
|
32
|
-
const
|
|
33
|
-
|
|
34
|
-
const
|
|
35
|
-
|
|
36
|
-
bus
|
|
37
|
-
|
|
18
|
+
const here = path.dirname(fileURLToPath(import.meta.url));
|
|
19
|
+
const ext = import.meta.url.endsWith('.ts') ? 'ts' : 'js';
|
|
20
|
+
const specs = discoverServices(here, ext);
|
|
21
|
+
const bus = new EmitterBus();
|
|
22
|
+
const loader = new ServiceLoader(bus);
|
|
23
|
+
let rpcStop;
|
|
24
|
+
const drain = async () => {
|
|
25
|
+
await loader.disposeAll();
|
|
26
|
+
if (rpcStop)
|
|
27
|
+
await rpcStop();
|
|
28
|
+
};
|
|
29
|
+
// ── Lifecycle methods (need the loader) ─────────────────────────────────────────
|
|
30
|
+
bus.register('bus.restart', {
|
|
31
|
+
description: 'Reload one service from disk in-process (same PID). Picks up new code after a git pull without killing the process; other services keep running.',
|
|
32
|
+
schema: z.object({ service: z.string().describe('Service name, e.g. "channel", "memory", "agent"') }),
|
|
33
|
+
cli: { positional: ['service'] },
|
|
34
|
+
}, async (p) => {
|
|
35
|
+
await loader.restart(p.service);
|
|
36
|
+
return { ok: true };
|
|
37
|
+
});
|
|
38
|
+
bus.register('bus.status', {
|
|
39
|
+
description: 'List loaded services.',
|
|
40
|
+
schema: z.object({}),
|
|
41
|
+
}, () => ({ services: loader.names().map(name => ({ name, status: 'running' })) }));
|
|
42
|
+
bus.register('bus.restartProcess', {
|
|
43
|
+
description: 'Restart the whole process via the supervisor — reloads all services and transitive deps from disk. Returns immediately; teardown runs after the response is sent.',
|
|
44
|
+
schema: z.object({}),
|
|
45
|
+
}, () => {
|
|
46
|
+
setImmediate(async () => {
|
|
47
|
+
log.info('process restart requested — draining and exiting');
|
|
48
|
+
await drain();
|
|
49
|
+
process.exit(RESTART_EXIT_CODE);
|
|
50
|
+
});
|
|
51
|
+
return { ok: true };
|
|
52
|
+
});
|
|
53
|
+
// ── Boot sequence ───────────────────────────────────────────────────────────────
|
|
38
54
|
await seedDataDir(log);
|
|
39
|
-
// Apply pending one-time data migrations (run-once, tracked in ~/.vargos/.migrations.json).
|
|
40
55
|
await runMigrations(log);
|
|
41
|
-
for (const
|
|
56
|
+
for (const spec of specs) {
|
|
42
57
|
try {
|
|
43
|
-
|
|
44
|
-
const { stop } = await boot(bus);
|
|
45
|
-
if (stop)
|
|
46
|
-
serviceStops.set(label, stop);
|
|
47
|
-
// Per-service restart via bus.restart({ service }). The cached module is reused,
|
|
48
|
-
// so this resets in-memory state but does NOT reload code — bus.bootstrap()
|
|
49
|
-
// un-wires the old instance's listeners, restartProcess reloads code from disk.
|
|
50
|
-
bus.onRestart(label, async () => {
|
|
51
|
-
log.info(`restarting "${label}" — re-instantiating from cached module`);
|
|
52
|
-
await serviceStops.get(label)?.();
|
|
53
|
-
const { boot: reBoot } = await load();
|
|
54
|
-
const { stop: newStop } = await reBoot(bus);
|
|
55
|
-
if (newStop)
|
|
56
|
-
serviceStops.set(label, newStop);
|
|
57
|
-
else
|
|
58
|
-
serviceStops.delete(label);
|
|
59
|
-
log.info(` ✅ "${label}" restarted`);
|
|
60
|
-
});
|
|
61
|
-
log.info(` ✅ "${label}" service booted`);
|
|
58
|
+
await loader.load(spec);
|
|
62
59
|
}
|
|
63
60
|
catch (err) {
|
|
64
|
-
log.error(`❌ failed to
|
|
61
|
+
log.error(`❌ failed to load ${spec.name}: ${err instanceof Error ? err.message : String(err)}`);
|
|
65
62
|
process.exit(1);
|
|
66
63
|
}
|
|
67
64
|
}
|
|
68
|
-
// Start TCP server for CLI access
|
|
69
65
|
const config = await bus.call('config.get', {});
|
|
70
|
-
const
|
|
71
|
-
const
|
|
66
|
+
const host = config.gateway.host ?? process.env.BUS_HOST ?? '127.0.0.1';
|
|
67
|
+
const port = parseInt(config.gateway.port ? String(config.gateway.port) : (process.env.BUS_PORT || '9000'), 10);
|
|
72
68
|
try {
|
|
73
|
-
|
|
74
|
-
tcpStop = await startTCPServer(bus, tcpHost, tcpPort, socketTimeoutMs);
|
|
69
|
+
rpcStop = await startRpcServer(bus, host, port, config.gateway.requestTimeout ?? 35 * 60 * 1000);
|
|
75
70
|
}
|
|
76
71
|
catch (err) {
|
|
77
|
-
log.error(`failed to start
|
|
72
|
+
log.error(`failed to start RPC server: ${err instanceof Error ? err.message : String(err)}`);
|
|
78
73
|
process.exit(1);
|
|
79
74
|
}
|
|
80
|
-
// Signal that boot is complete — deferred startup can proceed
|
|
81
75
|
bus.emit('bus.onReady', {});
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
// ── Process restart (registered as a runtime tool) ──────────────────────────
|
|
85
|
-
// Returns ok immediately; cleanup + exit happen on the next tick so the caller
|
|
86
|
-
// (e.g. an agent) receives the response before the process exits. The supervisor
|
|
87
|
-
// (index.ts) respawns this process on RESTART_EXIT_CODE.
|
|
88
|
-
bus.registerTool('bus.restartProcess', async () => {
|
|
89
|
-
setImmediate(async () => {
|
|
90
|
-
log.info('process restart requested — draining and exiting');
|
|
91
|
-
await drain();
|
|
92
|
-
process.exit(RESTART_EXIT_CODE);
|
|
93
|
-
});
|
|
94
|
-
return { ok: true };
|
|
95
|
-
}, {
|
|
96
|
-
description: 'Restart the entire vargos process. The supervisor respawns boot.ts so new code from disk (e.g. after git pull or npm update) takes effect. Returns immediately; teardown runs after the response is sent.',
|
|
97
|
-
schema: z.object({}).default({}),
|
|
98
|
-
});
|
|
99
|
-
// ── Global error handlers ────────────────────────────────────────────────────
|
|
100
|
-
// Prevent undici socket errors (UND_ERR_SOCKET "other side closed") from
|
|
101
|
-
// crashing the process when LLM providers close connections after streaming.
|
|
76
|
+
log.info(`✅ ${specs.length} services ready: ${specs.map(s => s.name).join(', ')}`);
|
|
77
|
+
// ── Process-level handlers ──────────────────────────────────────────────────────
|
|
102
78
|
process.on('uncaughtException', (err) => {
|
|
79
|
+
// undici "other side closed" and similar stream teardown noise must not crash the daemon.
|
|
103
80
|
log.error(`uncaughtException: ${err.stack ?? err.message ?? err}`);
|
|
104
|
-
// Do NOT exit — most undici/stream errors are non-fatal teardown noise.
|
|
105
81
|
});
|
|
106
|
-
|
|
107
|
-
process.on('SIGTERM', shutdown);
|
|
108
|
-
process.on('SIGINT', shutdown);
|
|
109
|
-
async function shutdown() {
|
|
82
|
+
const shutdown = async () => {
|
|
110
83
|
log.info('shutting down');
|
|
111
84
|
await drain();
|
|
112
85
|
process.exit(0);
|
|
113
|
-
}
|
|
86
|
+
};
|
|
87
|
+
process.on('SIGTERM', shutdown);
|
|
88
|
+
process.on('SIGINT', shutdown);
|
|
114
89
|
//# sourceMappingURL=boot.js.map
|
package/dist/boot.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"boot.js","sourceRoot":"","sources":["../boot.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"boot.js","sourceRoot":"","sources":["../boot.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/channels.d.ts
CHANGED
|
@@ -1,38 +1,21 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Channel
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* listChannels() → array of { id, type, botToken? }
|
|
6
|
-
* registerChannel() → upsert into config.json (returns whether it was newly created)
|
|
7
|
-
* deregisterChannel() → remove from config.json
|
|
8
|
-
* pairWhatsApp() → standalone QR pairing (stops after connected)
|
|
9
|
-
* sendChannelMessage() → deliver a message via the running gateway (channel.send)
|
|
2
|
+
* Channel setup helpers for the onboard wizard. Writes config.json directly because
|
|
3
|
+
* onboarding runs before any daemon exists. Live channel ops go through the bus
|
|
4
|
+
* (`vargos channel …` / RpcClient), not here.
|
|
10
5
|
*/
|
|
11
6
|
import type { ChannelEntry } from '../services/config/schemas/channels.js';
|
|
12
|
-
export interface ChannelInfo {
|
|
13
|
-
id: string;
|
|
14
|
-
type: ChannelEntry['type'];
|
|
15
|
-
botToken?: string;
|
|
16
|
-
enabled?: boolean;
|
|
17
|
-
registered?: boolean;
|
|
18
|
-
}
|
|
19
7
|
export interface RegisterChannelParams {
|
|
20
8
|
id: string;
|
|
21
9
|
type: ChannelEntry['type'];
|
|
22
10
|
botToken?: string;
|
|
23
11
|
}
|
|
24
|
-
export declare function listChannels(): ChannelInfo[];
|
|
25
12
|
/**
|
|
26
|
-
* Upsert a channel into config.json. Idempotent: re-registering an existing id
|
|
27
|
-
*
|
|
28
|
-
* `register whatsapp <id>` can mean "ensure set up, then (re)pair".
|
|
29
|
-
* Returns whether the entry was newly created.
|
|
13
|
+
* Upsert a channel into config.json. Idempotent: re-registering an existing id leaves
|
|
14
|
+
* it in place (refreshing the bot token if supplied). Returns whether it was created.
|
|
30
15
|
*/
|
|
31
16
|
export declare function registerChannel(params: RegisterChannelParams): {
|
|
32
17
|
created: boolean;
|
|
33
18
|
};
|
|
34
|
-
|
|
19
|
+
/** Standalone WhatsApp QR pairing (loads Baileys only when called). */
|
|
35
20
|
export declare function pairWhatsApp(id: string): Promise<void>;
|
|
36
|
-
/** Deliver a message to a channel session via the running gateway. */
|
|
37
|
-
export declare function sendChannelMessage(sessionKey: string, text: string): Promise<boolean>;
|
|
38
21
|
//# sourceMappingURL=channels.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"channels.d.ts","sourceRoot":"","sources":["../../cli/channels.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"channels.d.ts","sourceRoot":"","sources":["../../cli/channels.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wCAAwC,CAAC;AAE3E,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAgBD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,qBAAqB,GAAG;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,CAkBnF;AAED,uEAAuE;AACvE,wBAAsB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAuB5D"}
|
package/dist/cli/channels.js
CHANGED
|
@@ -1,60 +1,21 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Channel
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* listChannels() → array of { id, type, botToken? }
|
|
6
|
-
* registerChannel() → upsert into config.json (returns whether it was newly created)
|
|
7
|
-
* deregisterChannel() → remove from config.json
|
|
8
|
-
* pairWhatsApp() → standalone QR pairing (stops after connected)
|
|
9
|
-
* sendChannelMessage() → deliver a message via the running gateway (channel.send)
|
|
2
|
+
* Channel setup helpers for the onboard wizard. Writes config.json directly because
|
|
3
|
+
* onboarding runs before any daemon exists. Live channel ops go through the bus
|
|
4
|
+
* (`vargos channel …` / RpcClient), not here.
|
|
10
5
|
*/
|
|
11
|
-
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
12
|
-
import { createConnection } from 'node:net';
|
|
13
6
|
import path from 'node:path';
|
|
14
7
|
import { getDataPaths } from '../lib/paths.js';
|
|
8
|
+
import { readJson, writeJson } from '../lib/util.js';
|
|
15
9
|
function readConfig() {
|
|
16
10
|
const { configFile } = getDataPaths();
|
|
17
|
-
|
|
18
|
-
return {};
|
|
19
|
-
try {
|
|
20
|
-
return JSON.parse(readFileSync(configFile, 'utf-8'));
|
|
21
|
-
}
|
|
22
|
-
catch {
|
|
23
|
-
return {};
|
|
24
|
-
}
|
|
11
|
+
return readJson(configFile) ?? {};
|
|
25
12
|
}
|
|
26
13
|
function writeConfig(config) {
|
|
27
|
-
|
|
28
|
-
if (!existsSync(path.dirname(configFile))) {
|
|
29
|
-
mkdirSync(path.dirname(configFile), { recursive: true });
|
|
30
|
-
}
|
|
31
|
-
writeFileSync(configFile, JSON.stringify(config, null, 2), { mode: 0o600 });
|
|
32
|
-
}
|
|
33
|
-
// ── Public API ────────────────────────────────────────────────────────────────
|
|
34
|
-
export function listChannels() {
|
|
35
|
-
const config = readConfig();
|
|
36
|
-
const channels = (config.channels ?? []);
|
|
37
|
-
return channels.map((ch) => {
|
|
38
|
-
const info = {
|
|
39
|
-
id: String(ch.id ?? ''),
|
|
40
|
-
type: ch.type ?? 'whatsapp',
|
|
41
|
-
enabled: ch.enabled !== false,
|
|
42
|
-
};
|
|
43
|
-
if (ch.botToken != null)
|
|
44
|
-
info['botToken'] = String(ch.botToken);
|
|
45
|
-
// WhatsApp: check if paired (creds.json exists)
|
|
46
|
-
if (info.type === 'whatsapp') {
|
|
47
|
-
const authDir = path.join(getDataPaths().channelsDir, info.id);
|
|
48
|
-
info.registered = existsSync(path.join(authDir, 'creds.json'));
|
|
49
|
-
}
|
|
50
|
-
return info;
|
|
51
|
-
});
|
|
14
|
+
writeJson(getDataPaths().configFile, config);
|
|
52
15
|
}
|
|
53
16
|
/**
|
|
54
|
-
* Upsert a channel into config.json. Idempotent: re-registering an existing id
|
|
55
|
-
*
|
|
56
|
-
* `register whatsapp <id>` can mean "ensure set up, then (re)pair".
|
|
57
|
-
* Returns whether the entry was newly created.
|
|
17
|
+
* Upsert a channel into config.json. Idempotent: re-registering an existing id leaves
|
|
18
|
+
* it in place (refreshing the bot token if supplied). Returns whether it was created.
|
|
58
19
|
*/
|
|
59
20
|
export function registerChannel(params) {
|
|
60
21
|
const config = readConfig();
|
|
@@ -67,11 +28,7 @@ export function registerChannel(params) {
|
|
|
67
28
|
writeConfig(config);
|
|
68
29
|
return { created: false };
|
|
69
30
|
}
|
|
70
|
-
const entry = {
|
|
71
|
-
id: params.id,
|
|
72
|
-
type: params.type,
|
|
73
|
-
enabled: true,
|
|
74
|
-
};
|
|
31
|
+
const entry = { id: params.id, type: params.type, enabled: true };
|
|
75
32
|
if (params.botToken)
|
|
76
33
|
entry['botToken'] = params.botToken;
|
|
77
34
|
channels.push(entry);
|
|
@@ -79,96 +36,30 @@ export function registerChannel(params) {
|
|
|
79
36
|
writeConfig(config);
|
|
80
37
|
return { created: true };
|
|
81
38
|
}
|
|
82
|
-
|
|
83
|
-
const config = readConfig();
|
|
84
|
-
const channels = (config.channels ?? []);
|
|
85
|
-
const idx = channels.findIndex((c) => c.id === id);
|
|
86
|
-
if (idx === -1)
|
|
87
|
-
throw new Error(`Channel "${id}" not found.`);
|
|
88
|
-
channels.splice(idx, 1);
|
|
89
|
-
config.channels = channels;
|
|
90
|
-
writeConfig(config);
|
|
91
|
-
}
|
|
92
|
-
// ── WhatsApp standalone pairing ───────────────────────────────────────────────
|
|
39
|
+
/** Standalone WhatsApp QR pairing (loads Baileys only when called). */
|
|
93
40
|
export async function pairWhatsApp(id) {
|
|
94
41
|
const authDir = path.join(getDataPaths().channelsDir, id);
|
|
95
|
-
|
|
96
|
-
const { createWhatsAppSocket } = await import('../services/channels/providers/whatsapp/session.js');
|
|
42
|
+
const { createWhatsAppSocket } = await import('../services/channel/providers/whatsapp/session.js');
|
|
97
43
|
return new Promise((resolve, reject) => {
|
|
98
44
|
createWhatsAppSocket(authDir, {
|
|
99
|
-
onQR: () => {
|
|
100
|
-
// QR printed automatically by qrcode-terminal inside session.ts
|
|
101
|
-
},
|
|
45
|
+
onQR: () => { },
|
|
102
46
|
onConnected: (name) => {
|
|
103
47
|
console.log(`\n✅ Connected as ${name}`);
|
|
104
48
|
console.log(` Credentials saved to ${authDir}/creds.json\n`);
|
|
105
49
|
resolve();
|
|
106
50
|
},
|
|
107
51
|
onDisconnected: (reason) => {
|
|
108
|
-
if (reason === 'logged_out')
|
|
52
|
+
if (reason === 'logged_out')
|
|
109
53
|
reject(new Error('Pairing failed — device logged out. Try again.'));
|
|
110
|
-
|
|
111
|
-
else if (reason === 'forbidden') {
|
|
54
|
+
else if (reason === 'forbidden')
|
|
112
55
|
reject(new Error('Pairing failed — access forbidden.'));
|
|
113
|
-
}
|
|
114
56
|
else {
|
|
115
|
-
// Connection closed for other reasons — may still have succeeded
|
|
116
57
|
console.log(`\n⚠ Connection closed (${reason}). If you scanned the QR, pairing may have succeeded.`);
|
|
117
58
|
resolve();
|
|
118
59
|
}
|
|
119
60
|
},
|
|
120
|
-
onMessage: () => {
|
|
121
|
-
// Ignore messages during pairing
|
|
122
|
-
},
|
|
123
|
-
}).then(() => {
|
|
124
|
-
// Socket created, wait for onConnected to resolve
|
|
125
|
-
// If the process exits before onConnected, the promise rejects via onDisconnected
|
|
61
|
+
onMessage: () => { },
|
|
126
62
|
}).catch(reject);
|
|
127
63
|
});
|
|
128
64
|
}
|
|
129
|
-
// ── Gateway client (talks to a running `vargos start`) ─────────────────────────
|
|
130
|
-
/** Resolve the gateway address from config.json, mirroring boot.ts defaults. */
|
|
131
|
-
function gatewayAddress() {
|
|
132
|
-
const gw = (readConfig().gateway ?? {});
|
|
133
|
-
const host = gw.host ?? process.env.BUS_HOST ?? '127.0.0.1';
|
|
134
|
-
const port = gw.port ?? (process.env.BUS_PORT ? parseInt(process.env.BUS_PORT, 10) : 9000);
|
|
135
|
-
return { host, port };
|
|
136
|
-
}
|
|
137
|
-
/** Send one JSON-RPC request to the gateway and resolve with its result. */
|
|
138
|
-
function gatewayCall(method, params) {
|
|
139
|
-
const { host, port } = gatewayAddress();
|
|
140
|
-
return new Promise((resolve, reject) => {
|
|
141
|
-
const socket = createConnection({ host, port }, () => {
|
|
142
|
-
socket.write(JSON.stringify({ jsonrpc: '2.0', method, params, id: 1 }) + '\n');
|
|
143
|
-
});
|
|
144
|
-
let buffer = '';
|
|
145
|
-
socket.on('data', (chunk) => {
|
|
146
|
-
buffer += chunk.toString();
|
|
147
|
-
const nl = buffer.indexOf('\n');
|
|
148
|
-
if (nl === -1)
|
|
149
|
-
return; // wait for the full line
|
|
150
|
-
socket.end();
|
|
151
|
-
try {
|
|
152
|
-
const res = JSON.parse(buffer.slice(0, nl));
|
|
153
|
-
if (res.error)
|
|
154
|
-
reject(new Error(res.error.message ?? 'gateway error'));
|
|
155
|
-
else
|
|
156
|
-
resolve(res.result);
|
|
157
|
-
}
|
|
158
|
-
catch (err) {
|
|
159
|
-
reject(err instanceof Error ? err : new Error(String(err)));
|
|
160
|
-
}
|
|
161
|
-
});
|
|
162
|
-
socket.setTimeout(10_000, () => {
|
|
163
|
-
socket.destroy();
|
|
164
|
-
reject(new Error(`gateway not reachable at ${host}:${port} — is "vargos start" running?`));
|
|
165
|
-
});
|
|
166
|
-
socket.on('error', (err) => reject(new Error(`gateway not reachable at ${host}:${port} — is "vargos start" running? (${err.message})`)));
|
|
167
|
-
});
|
|
168
|
-
}
|
|
169
|
-
/** Deliver a message to a channel session via the running gateway. */
|
|
170
|
-
export async function sendChannelMessage(sessionKey, text) {
|
|
171
|
-
const result = await gatewayCall('channel.send', { sessionKey, text });
|
|
172
|
-
return result?.sent === true;
|
|
173
|
-
}
|
|
174
65
|
//# sourceMappingURL=channels.js.map
|
package/dist/cli/channels.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"channels.js","sourceRoot":"","sources":["../../cli/channels.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"channels.js","sourceRoot":"","sources":["../../cli/channels.ts"],"names":[],"mappings":"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"}
|