@josharsh/demon-cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +130 -0
- package/dist/actions/base.d.ts +4 -0
- package/dist/actions/base.d.ts.map +1 -0
- package/dist/actions/base.js +32 -0
- package/dist/actions/base.js.map +1 -0
- package/dist/actions/file.d.ts +7 -0
- package/dist/actions/file.d.ts.map +1 -0
- package/dist/actions/file.js +35 -0
- package/dist/actions/file.js.map +1 -0
- package/dist/actions/github.d.ts +7 -0
- package/dist/actions/github.d.ts.map +1 -0
- package/dist/actions/github.js +125 -0
- package/dist/actions/github.js.map +1 -0
- package/dist/actions/index.d.ts +5 -0
- package/dist/actions/index.d.ts.map +1 -0
- package/dist/actions/index.js +22 -0
- package/dist/actions/index.js.map +1 -0
- package/dist/actions/log.d.ts +7 -0
- package/dist/actions/log.d.ts.map +1 -0
- package/dist/actions/log.js +30 -0
- package/dist/actions/log.js.map +1 -0
- package/dist/actions/notify.d.ts +11 -0
- package/dist/actions/notify.d.ts.map +1 -0
- package/dist/actions/notify.js +34 -0
- package/dist/actions/notify.js.map +1 -0
- package/dist/actions/script.d.ts +7 -0
- package/dist/actions/script.d.ts.map +1 -0
- package/dist/actions/script.js +46 -0
- package/dist/actions/script.js.map +1 -0
- package/dist/actions/slack.d.ts +7 -0
- package/dist/actions/slack.d.ts.map +1 -0
- package/dist/actions/slack.js +47 -0
- package/dist/actions/slack.js.map +1 -0
- package/dist/actions/webhook.d.ts +7 -0
- package/dist/actions/webhook.d.ts.map +1 -0
- package/dist/actions/webhook.js +41 -0
- package/dist/actions/webhook.js.map +1 -0
- package/dist/adapters/clock.d.ts +3 -0
- package/dist/adapters/clock.d.ts.map +1 -0
- package/dist/adapters/clock.js +8 -0
- package/dist/adapters/clock.js.map +1 -0
- package/dist/adapters/fs-kv.d.ts +3 -0
- package/dist/adapters/fs-kv.d.ts.map +1 -0
- package/dist/adapters/fs-kv.js +34 -0
- package/dist/adapters/fs-kv.js.map +1 -0
- package/dist/adapters/keys.d.ts +3 -0
- package/dist/adapters/keys.d.ts.map +1 -0
- package/dist/adapters/keys.js +17 -0
- package/dist/adapters/keys.js.map +1 -0
- package/dist/commands/ensure-provider.d.ts +7 -0
- package/dist/commands/ensure-provider.d.ts.map +1 -0
- package/dist/commands/ensure-provider.js +121 -0
- package/dist/commands/ensure-provider.js.map +1 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +196 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/inspect.d.ts +7 -0
- package/dist/commands/inspect.d.ts.map +1 -0
- package/dist/commands/inspect.js +97 -0
- package/dist/commands/inspect.js.map +1 -0
- package/dist/commands/install.d.ts +3 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.js +192 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/logs.d.ts +8 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +103 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/providers.d.ts +5 -0
- package/dist/commands/providers.d.ts.map +1 -0
- package/dist/commands/providers.js +251 -0
- package/dist/commands/providers.js.map +1 -0
- package/dist/commands/ps.d.ts +2 -0
- package/dist/commands/ps.d.ts.map +1 -0
- package/dist/commands/ps.js +87 -0
- package/dist/commands/ps.js.map +1 -0
- package/dist/commands/secrets.d.ts +9 -0
- package/dist/commands/secrets.d.ts.map +1 -0
- package/dist/commands/secrets.js +97 -0
- package/dist/commands/secrets.js.map +1 -0
- package/dist/commands/start.d.ts +10 -0
- package/dist/commands/start.d.ts.map +1 -0
- package/dist/commands/start.js +238 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/commands/status.d.ts +2 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +69 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/stop.d.ts +6 -0
- package/dist/commands/stop.d.ts.map +1 -0
- package/dist/commands/stop.js +43 -0
- package/dist/commands/stop.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +253 -0
- package/dist/index.js.map +1 -0
- package/dist/providers/config.d.ts +8 -0
- package/dist/providers/config.d.ts.map +1 -0
- package/dist/providers/config.js +31 -0
- package/dist/providers/config.js.map +1 -0
- package/dist/providers/credentials.d.ts +5 -0
- package/dist/providers/credentials.d.ts.map +1 -0
- package/dist/providers/credentials.js +69 -0
- package/dist/providers/credentials.js.map +1 -0
- package/dist/providers/registry.d.ts +12 -0
- package/dist/providers/registry.d.ts.map +1 -0
- package/dist/providers/registry.js +58 -0
- package/dist/providers/registry.js.map +1 -0
- package/dist/providers/secrets.d.ts +9 -0
- package/dist/providers/secrets.d.ts.map +1 -0
- package/dist/providers/secrets.js +44 -0
- package/dist/providers/secrets.js.map +1 -0
- package/dist/providers/system-auth.d.ts +8 -0
- package/dist/providers/system-auth.d.ts.map +1 -0
- package/dist/providers/system-auth.js +168 -0
- package/dist/providers/system-auth.js.map +1 -0
- package/dist/runtime/daemon.d.ts +10 -0
- package/dist/runtime/daemon.d.ts.map +1 -0
- package/dist/runtime/daemon.js +264 -0
- package/dist/runtime/daemon.js.map +1 -0
- package/dist/runtime/supervisor.d.ts +6 -0
- package/dist/runtime/supervisor.d.ts.map +1 -0
- package/dist/runtime/supervisor.js +45 -0
- package/dist/runtime/supervisor.js.map +1 -0
- package/dist/types.d.ts +27 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/logger.d.ts +4 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +44 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/manifest.d.ts +5 -0
- package/dist/utils/manifest.d.ts.map +1 -0
- package/dist/utils/manifest.js +276 -0
- package/dist/utils/manifest.js.map +1 -0
- package/dist/utils/paths.d.ts +13 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +52 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/utils/time.d.ts +11 -0
- package/dist/utils/time.d.ts.map +1 -0
- package/dist/utils/time.js +40 -0
- package/dist/utils/time.js.map +1 -0
- package/dist/watchers/base.d.ts +3 -0
- package/dist/watchers/base.d.ts.map +1 -0
- package/dist/watchers/base.js +20 -0
- package/dist/watchers/base.js.map +1 -0
- package/dist/watchers/filesystem.d.ts +12 -0
- package/dist/watchers/filesystem.d.ts.map +1 -0
- package/dist/watchers/filesystem.js +211 -0
- package/dist/watchers/filesystem.js.map +1 -0
- package/dist/watchers/github.d.ts +3 -0
- package/dist/watchers/github.d.ts.map +1 -0
- package/dist/watchers/github.js +322 -0
- package/dist/watchers/github.js.map +1 -0
- package/dist/watchers/http.d.ts +13 -0
- package/dist/watchers/http.d.ts.map +1 -0
- package/dist/watchers/http.js +149 -0
- package/dist/watchers/http.js.map +1 -0
- package/dist/watchers/index.d.ts +8 -0
- package/dist/watchers/index.d.ts.map +1 -0
- package/dist/watchers/index.js +25 -0
- package/dist/watchers/index.js.map +1 -0
- package/examples/README.md +9 -0
- package/examples/codebase-guardian.yaml +22 -0
- package/examples/competitor-watch.yaml +18 -0
- package/examples/founder-sentinel.md +126 -0
- package/examples/founder-sentinel.yaml +27 -0
- package/package.json +62 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Harsh
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
# demon
|
|
2
|
+
|
|
3
|
+
**Run AI that watches and acts on its own judgment — instead of waiting to be called.**
|
|
4
|
+
|
|
5
|
+
**[demon.josharsh.com](https://demon.josharsh.com)** · [GitHub](https://github.com/josharsh/demon) · by [Harsh Joshi](https://github.com/josharsh) · MIT
|
|
6
|
+
|
|
7
|
+
An agent is a function: you invoke it, it runs, it returns, it's gone. A demon is a process: it stays running, watches a domain you give it, and acts only when something actually warrants it. Same LLM underneath — a different shape around it.
|
|
8
|
+
|
|
9
|
+
You reach for an agent when you know what to ask. You reach for a demon for the things you'd never think to ask about in time: the PR that's been sitting four days, the error rate creeping up after a deploy, the customer who went quiet before renewal. Noticing is the job. An agent can't notice — it waits to be called.
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
Agent Demon
|
|
13
|
+
───────────────────────── ─────────────────────────
|
|
14
|
+
you trigger it it triggers itself
|
|
15
|
+
driven by a task driven by a purpose
|
|
16
|
+
finishes and exits runs continuously
|
|
17
|
+
starts fresh each time accumulates memory
|
|
18
|
+
the LLM runs the show the process calls the LLM
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Quickstart
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
npm install -g @josharsh/demon-cli
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Describe what to watch in plain English. On first run, demon asks once which AI provider to use (or detects a key you already have):
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
demon start "watch open PRs on my-org/my-repo and flag the ones that need attention"
|
|
33
|
+
|
|
34
|
+
demon ps # what's running
|
|
35
|
+
demon logs my-demon --follow # watch it think
|
|
36
|
+
demon stop my-demon
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
That's the whole loop. A process, watching, with a purpose — quiet until something matters.
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## It's real. Here's one running.
|
|
44
|
+
|
|
45
|
+
This is unedited output from a demon watching a live GitHub repo, reasoning with Claude:
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
cycle #1 ACTED PR #564 is a dependabot bump (shell-quote 1.8.3→1.8.4),
|
|
49
|
+
one file, +6/−6, sitting since yesterday — flagged as a baseline.
|
|
50
|
+
cycle #2 WAITED Nothing new. #564 was already flagged last cycle.
|
|
51
|
+
cycle #3 WAITED No change. Still just #564, no movement.
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
It acted once, then held — because it *remembered* it had already flagged that PR. That restraint is the point. A demon that pings you every cycle is just a cron job with a language model stapled on.
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## How it works
|
|
59
|
+
|
|
60
|
+
Every cycle, the process does one thing: **observe → judge → act, or wait.**
|
|
61
|
+
|
|
62
|
+
- **Watchers** observe a domain — GitHub PRs / CI / commits, an HTTP endpoint, a filesystem path.
|
|
63
|
+
- The **LLM** is asked a single question: *given my purpose and what I just observed, does anything warrant acting?* Most cycles, the honest answer is no, and it sleeps.
|
|
64
|
+
- **Actions** fire only when it decides to act — a notification, a webhook, a Slack message, a script, a GitHub comment.
|
|
65
|
+
- **Memory** is three layers: a raw event log, a bi-temporal fact store (when a fact stops being true is recorded, not erased — so nothing drifts), and a periodically-compressed narrative. A demon that's watched your repo for a week is worth more than one started this morning.
|
|
66
|
+
|
|
67
|
+
Define it in five lines if you'd rather be precise than describe:
|
|
68
|
+
|
|
69
|
+
```yaml
|
|
70
|
+
name: pr-sentinel
|
|
71
|
+
purpose: Flag open PRs that are stale, oversized, or missing tests.
|
|
72
|
+
watch:
|
|
73
|
+
- type: github_prs
|
|
74
|
+
repo: my-org/my-repo
|
|
75
|
+
interval: 15m
|
|
76
|
+
action_mode: dry_run # log what it *would* do; switch to `auto` when you trust it
|
|
77
|
+
actions:
|
|
78
|
+
- provider: notify
|
|
79
|
+
action: send
|
|
80
|
+
model: claude-sonnet-4-6
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
Providers: Anthropic, OpenAI, OpenRouter, Groq, Gemini, Mistral, or local via Ollama — `demon providers add <name>` (it'll use a key from your environment or `gh` if you have one).
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## Embed it
|
|
88
|
+
|
|
89
|
+
The CLI is a host around a portable engine. The engine runs anywhere — Node, the browser, the edge — with no native dependencies:
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
npm install @josharsh/demon
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
```ts
|
|
96
|
+
import { runLoop, createLLMProvider, createMemoryKV } from '@josharsh/demon'
|
|
97
|
+
// supply your own watchers, actions, storage, clock — and it's a demon.
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
The website demo is the same engine, running a demon in your browser that watches *you*.
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## What this is, and isn't
|
|
105
|
+
|
|
106
|
+
- It **is** infrastructure for long-running, judgment-driven AI processes. Bring your own model.
|
|
107
|
+
- It **is not** an agent framework, a workflow engine, or a model provider. It wraps the loop, the memory, and the action layer around whatever LLM you point it at.
|
|
108
|
+
- It is **v0.1**. The engine is tested and has run against real repositories. Rough edges remain: `cautious` mode currently behaves like `auto`, reboot-persistence (`demon install`) is macOS/Linux only, and running a demon against a paid model on a short interval costs real tokens — set intervals deliberately.
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## Commands
|
|
113
|
+
|
|
114
|
+
| | |
|
|
115
|
+
|---|---|
|
|
116
|
+
| `demon start <intent\|file.yaml>` | start a demon (plain English or a manifest) |
|
|
117
|
+
| `demon ps` | list demons and their state |
|
|
118
|
+
| `demon logs <name> [--follow]` | stream its decisions |
|
|
119
|
+
| `demon inspect <name>` | reasoning + action history |
|
|
120
|
+
| `demon stop <name>` | stop it |
|
|
121
|
+
| `demon install <name>` | auto-start on reboot (launchd / systemd) |
|
|
122
|
+
| `demon providers add <name>` | connect an AI provider |
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
## License
|
|
127
|
+
|
|
128
|
+
MIT.
|
|
129
|
+
|
|
130
|
+
*Agents do work. Demons are present.*
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { ActionProvider } from '../types.js';
|
|
2
|
+
export declare function createActionProvider(providerName: string, _credentials: Record<string, string>): ActionProvider;
|
|
3
|
+
export declare function getBuiltinProviders(): Map<string, ActionProvider>;
|
|
4
|
+
//# sourceMappingURL=base.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/actions/base.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAmB5C,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACnC,cAAc,CAQhB;AAED,wBAAgB,mBAAmB,IAAI,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAOjE"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { GitHubActionProvider } from './github.js';
|
|
2
|
+
import { SlackActionProvider } from './slack.js';
|
|
3
|
+
import { WebhookActionProvider } from './webhook.js';
|
|
4
|
+
import { LogActionProvider } from './log.js';
|
|
5
|
+
import { ScriptActionProvider } from './script.js';
|
|
6
|
+
import { FileActionProvider } from './file.js';
|
|
7
|
+
import { NotifyActionProvider } from './notify.js';
|
|
8
|
+
const ALL_PROVIDERS = {
|
|
9
|
+
github: () => new GitHubActionProvider(),
|
|
10
|
+
slack: () => new SlackActionProvider(),
|
|
11
|
+
webhook: () => new WebhookActionProvider(),
|
|
12
|
+
log: () => new LogActionProvider(),
|
|
13
|
+
script: () => new ScriptActionProvider(),
|
|
14
|
+
file: () => new FileActionProvider(),
|
|
15
|
+
notify: () => new NotifyActionProvider(),
|
|
16
|
+
};
|
|
17
|
+
export function createActionProvider(providerName, _credentials) {
|
|
18
|
+
const factory = ALL_PROVIDERS[providerName];
|
|
19
|
+
if (!factory) {
|
|
20
|
+
throw new Error(`Unknown action provider: "${providerName}". Available: ${Object.keys(ALL_PROVIDERS).join(', ')}`);
|
|
21
|
+
}
|
|
22
|
+
return factory();
|
|
23
|
+
}
|
|
24
|
+
export function getBuiltinProviders() {
|
|
25
|
+
const builtins = new Map();
|
|
26
|
+
// notify is always available — no credentials needed
|
|
27
|
+
for (const name of ['log', 'webhook', 'script', 'file', 'notify']) {
|
|
28
|
+
builtins.set(name, ALL_PROVIDERS[name]());
|
|
29
|
+
}
|
|
30
|
+
return builtins;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/actions/base.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAC5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAA;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAElD,MAAM,aAAa,GAAyC;IAC1D,MAAM,EAAG,GAAG,EAAE,CAAC,IAAI,oBAAoB,EAAE;IACzC,KAAK,EAAI,GAAG,EAAE,CAAC,IAAI,mBAAmB,EAAE;IACxC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,qBAAqB,EAAE;IAC1C,GAAG,EAAM,GAAG,EAAE,CAAC,IAAI,iBAAiB,EAAE;IACtC,MAAM,EAAG,GAAG,EAAE,CAAC,IAAI,oBAAoB,EAAE;IACzC,IAAI,EAAK,GAAG,EAAE,CAAC,IAAI,kBAAkB,EAAE;IACvC,MAAM,EAAG,GAAG,EAAE,CAAC,IAAI,oBAAoB,EAAE;CAC1C,CAAA;AAED,MAAM,UAAU,oBAAoB,CAClC,YAAoB,EACpB,YAAoC;IAEpC,MAAM,OAAO,GAAG,aAAa,CAAC,YAAY,CAAC,CAAA;IAC3C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,6BAA6B,YAAY,iBAAiB,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAClG,CAAA;IACH,CAAC;IACD,OAAO,OAAO,EAAE,CAAA;AAClB,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,MAAM,QAAQ,GAAgC,IAAI,GAAG,EAAE,CAAA;IACvD,qDAAqD;IACrD,KAAK,MAAM,IAAI,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAU,EAAE,CAAC;QAC3E,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAC3C,CAAC;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { ActionProvider, ActionInstruction } from '../types.js';
|
|
2
|
+
export declare class FileActionProvider implements ActionProvider {
|
|
3
|
+
readonly provider = "file";
|
|
4
|
+
getAvailableActions(): string[];
|
|
5
|
+
execute(instruction: ActionInstruction, _credentials: Record<string, string>): Promise<unknown>;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=file.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file.d.ts","sourceRoot":"","sources":["../../src/actions/file.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAE/D,qBAAa,kBAAmB,YAAW,cAAc;IACvD,QAAQ,CAAC,QAAQ,UAAS;IAE1B,mBAAmB,IAAI,MAAM,EAAE;IAIzB,OAAO,CACX,WAAW,EAAE,iBAAiB,EAC9B,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACnC,OAAO,CAAC,OAAO,CAAC;CAgCpB"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import fs from 'fs-extra';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
export class FileActionProvider {
|
|
4
|
+
provider = 'file';
|
|
5
|
+
getAvailableActions() {
|
|
6
|
+
return ['write', 'append'];
|
|
7
|
+
}
|
|
8
|
+
async execute(instruction, _credentials) {
|
|
9
|
+
const { action, params } = instruction;
|
|
10
|
+
const { path: filePath, content, append } = params;
|
|
11
|
+
if (!filePath)
|
|
12
|
+
throw new Error('file action requires a "path" parameter');
|
|
13
|
+
if (content === undefined)
|
|
14
|
+
throw new Error('file action requires a "content" parameter');
|
|
15
|
+
const resolved = path.resolve(process.cwd(), filePath);
|
|
16
|
+
switch (action) {
|
|
17
|
+
case 'append': {
|
|
18
|
+
await fs.ensureDir(path.dirname(resolved));
|
|
19
|
+
await fs.appendFile(resolved, content);
|
|
20
|
+
return { appended: true, path: resolved };
|
|
21
|
+
}
|
|
22
|
+
case 'write':
|
|
23
|
+
default: {
|
|
24
|
+
await fs.ensureDir(path.dirname(resolved));
|
|
25
|
+
if (append) {
|
|
26
|
+
await fs.appendFile(resolved, content);
|
|
27
|
+
return { appended: true, path: resolved };
|
|
28
|
+
}
|
|
29
|
+
await fs.outputFile(resolved, content);
|
|
30
|
+
return { written: true, path: resolved };
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file.js","sourceRoot":"","sources":["../../src/actions/file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAA;AACzB,OAAO,IAAI,MAAM,MAAM,CAAA;AAGvB,MAAM,OAAO,kBAAkB;IACpB,QAAQ,GAAG,MAAM,CAAA;IAE1B,mBAAmB;QACjB,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;IAC5B,CAAC;IAED,KAAK,CAAC,OAAO,CACX,WAA8B,EAC9B,YAAoC;QAEpC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,WAAW,CAAA;QACtC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAI3C,CAAA;QAED,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAA;QACzE,IAAI,OAAO,KAAK,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAA;QAExF,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAA;QAEtD,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAA;gBAC1C,MAAM,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;gBACtC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAA;YAC3C,CAAC;YAED,KAAK,OAAO,CAAC;YACb,OAAO,CAAC,CAAC,CAAC;gBACR,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAA;gBAC1C,IAAI,MAAM,EAAE,CAAC;oBACX,MAAM,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;oBACtC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAA;gBAC3C,CAAC;gBACD,MAAM,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;gBACtC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAA;YAC1C,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { ActionProvider, ActionInstruction } from '../types.js';
|
|
2
|
+
export declare class GitHubActionProvider implements ActionProvider {
|
|
3
|
+
readonly provider = "github";
|
|
4
|
+
getAvailableActions(): string[];
|
|
5
|
+
execute(instruction: ActionInstruction, credentials: Record<string, string>): Promise<unknown>;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=github.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../../src/actions/github.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAE/D,qBAAa,oBAAqB,YAAW,cAAc;IACzD,QAAQ,CAAC,QAAQ,YAAW;IAE5B,mBAAmB,IAAI,MAAM,EAAE;IAiBzB,OAAO,CACX,WAAW,EAAE,iBAAiB,EAC9B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAClC,OAAO,CAAC,OAAO,CAAC;CA8JpB"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { Octokit } from '@octokit/rest';
|
|
2
|
+
export class GitHubActionProvider {
|
|
3
|
+
provider = 'github';
|
|
4
|
+
getAvailableActions() {
|
|
5
|
+
return [
|
|
6
|
+
'post_comment',
|
|
7
|
+
'open_issue',
|
|
8
|
+
'close_issue',
|
|
9
|
+
'add_label',
|
|
10
|
+
'request_review',
|
|
11
|
+
'create_pr',
|
|
12
|
+
// legacy aliases kept for backwards compat
|
|
13
|
+
'comment',
|
|
14
|
+
'label',
|
|
15
|
+
'close_pr',
|
|
16
|
+
'approve_pr',
|
|
17
|
+
'merge_pr',
|
|
18
|
+
];
|
|
19
|
+
}
|
|
20
|
+
async execute(instruction, credentials) {
|
|
21
|
+
const token = credentials.token ?? process.env.GITHUB_TOKEN;
|
|
22
|
+
if (!token) {
|
|
23
|
+
throw new Error('GitHub token not configured. Run: demon providers add github');
|
|
24
|
+
}
|
|
25
|
+
const octokit = new Octokit({ auth: token });
|
|
26
|
+
const { action, params } = instruction;
|
|
27
|
+
switch (action) {
|
|
28
|
+
// ── spec actions ──────────────────────────────────────────────────────
|
|
29
|
+
case 'post_comment': {
|
|
30
|
+
const { repo, number, body } = params;
|
|
31
|
+
const [owner, repoName] = repo.split('/');
|
|
32
|
+
const result = await octokit.issues.createComment({
|
|
33
|
+
owner,
|
|
34
|
+
repo: repoName,
|
|
35
|
+
issue_number: number,
|
|
36
|
+
body,
|
|
37
|
+
});
|
|
38
|
+
return { commentId: result.data.id, url: result.data.html_url };
|
|
39
|
+
}
|
|
40
|
+
case 'open_issue': {
|
|
41
|
+
const { repo, title, body, labels } = params;
|
|
42
|
+
const [owner, repoName] = repo.split('/');
|
|
43
|
+
const result = await octokit.issues.create({
|
|
44
|
+
owner,
|
|
45
|
+
repo: repoName,
|
|
46
|
+
title,
|
|
47
|
+
body,
|
|
48
|
+
labels,
|
|
49
|
+
});
|
|
50
|
+
return { issueNumber: result.data.number, url: result.data.html_url };
|
|
51
|
+
}
|
|
52
|
+
case 'close_issue': {
|
|
53
|
+
const { repo, number, comment } = params;
|
|
54
|
+
const [owner, repoName] = repo.split('/');
|
|
55
|
+
if (comment) {
|
|
56
|
+
await octokit.issues.createComment({
|
|
57
|
+
owner,
|
|
58
|
+
repo: repoName,
|
|
59
|
+
issue_number: number,
|
|
60
|
+
body: comment,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
await octokit.issues.update({ owner, repo: repoName, issue_number: number, state: 'closed' });
|
|
64
|
+
return { closed: true };
|
|
65
|
+
}
|
|
66
|
+
case 'add_label': {
|
|
67
|
+
const { repo, number, label } = params;
|
|
68
|
+
const [owner, repoName] = repo.split('/');
|
|
69
|
+
await octokit.issues.addLabels({ owner, repo: repoName, issue_number: number, labels: [label] });
|
|
70
|
+
return { labeled: true, label };
|
|
71
|
+
}
|
|
72
|
+
case 'request_review': {
|
|
73
|
+
const { repo, number, reviewers } = params;
|
|
74
|
+
const [owner, repoName] = repo.split('/');
|
|
75
|
+
await octokit.pulls.requestReviewers({ owner, repo: repoName, pull_number: number, reviewers });
|
|
76
|
+
return { reviewRequested: true, reviewers };
|
|
77
|
+
}
|
|
78
|
+
case 'create_pr': {
|
|
79
|
+
const { repo, title, body, head, base } = params;
|
|
80
|
+
const [owner, repoName] = repo.split('/');
|
|
81
|
+
const result = await octokit.pulls.create({ owner, repo: repoName, title, body, head, base });
|
|
82
|
+
return { prNumber: result.data.number, url: result.data.html_url };
|
|
83
|
+
}
|
|
84
|
+
// ── legacy aliases ────────────────────────────────────────────────────
|
|
85
|
+
case 'comment': {
|
|
86
|
+
const { repo, issue_number, body } = params;
|
|
87
|
+
const [owner, repoName] = repo.split('/');
|
|
88
|
+
const result = await octokit.issues.createComment({ owner, repo: repoName, issue_number, body });
|
|
89
|
+
return { commentId: result.data.id, url: result.data.html_url };
|
|
90
|
+
}
|
|
91
|
+
case 'label': {
|
|
92
|
+
const { repo, issue_number, labels } = params;
|
|
93
|
+
const [owner, repoName] = repo.split('/');
|
|
94
|
+
await octokit.issues.addLabels({ owner, repo: repoName, issue_number, labels });
|
|
95
|
+
return { labeled: true, labels };
|
|
96
|
+
}
|
|
97
|
+
case 'close_pr': {
|
|
98
|
+
const { repo, pull_number } = params;
|
|
99
|
+
const [owner, repoName] = repo.split('/');
|
|
100
|
+
await octokit.pulls.update({ owner, repo: repoName, pull_number, state: 'closed' });
|
|
101
|
+
return { closed: true };
|
|
102
|
+
}
|
|
103
|
+
case 'approve_pr': {
|
|
104
|
+
const { repo, pull_number } = params;
|
|
105
|
+
const [owner, repoName] = repo.split('/');
|
|
106
|
+
const result = await octokit.pulls.createReview({ owner, repo: repoName, pull_number, event: 'APPROVE' });
|
|
107
|
+
return { reviewId: result.data.id };
|
|
108
|
+
}
|
|
109
|
+
case 'merge_pr': {
|
|
110
|
+
const { repo, pull_number, merge_method } = params;
|
|
111
|
+
const [owner, repoName] = repo.split('/');
|
|
112
|
+
const result = await octokit.pulls.merge({
|
|
113
|
+
owner,
|
|
114
|
+
repo: repoName,
|
|
115
|
+
pull_number,
|
|
116
|
+
merge_method: merge_method ?? 'squash',
|
|
117
|
+
});
|
|
118
|
+
return { merged: result.data.merged, sha: result.data.sha };
|
|
119
|
+
}
|
|
120
|
+
default:
|
|
121
|
+
throw new Error(`Unknown GitHub action: "${action}". Available: ${this.getAvailableActions().join(', ')}`);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=github.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github.js","sourceRoot":"","sources":["../../src/actions/github.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { ActionInstruction } from '../types.js';
|
|
2
|
+
export { createActionProvider, getBuiltinProviders } from './base.js';
|
|
3
|
+
export declare function getActionProvider(providerName: string): import("../types.js").ActionProvider;
|
|
4
|
+
export declare function executeAction(instruction: ActionInstruction, dryRun: boolean): Promise<unknown>;
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/actions/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAI/C,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAA;AAErE,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,wCAErD;AAED,wBAAsB,aAAa,CACjC,WAAW,EAAE,iBAAiB,EAC9B,MAAM,EAAE,OAAO,GACd,OAAO,CAAC,OAAO,CAAC,CAgBlB"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { createActionProvider } from './base.js';
|
|
2
|
+
import { loadProviderCredentials } from '../commands/providers.js';
|
|
3
|
+
export { createActionProvider, getBuiltinProviders } from './base.js';
|
|
4
|
+
export function getActionProvider(providerName) {
|
|
5
|
+
return createActionProvider(providerName, {});
|
|
6
|
+
}
|
|
7
|
+
export async function executeAction(instruction, dryRun) {
|
|
8
|
+
const provider = getActionProvider(instruction.provider);
|
|
9
|
+
const credentials = await loadProviderCredentials(instruction.provider);
|
|
10
|
+
if (dryRun) {
|
|
11
|
+
return {
|
|
12
|
+
dryRun: true,
|
|
13
|
+
wouldExecute: {
|
|
14
|
+
provider: instruction.provider,
|
|
15
|
+
action: instruction.action,
|
|
16
|
+
params: instruction.params,
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
return provider.execute(instruction, credentials);
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/actions/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAA;AAChD,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAA;AAElE,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAA;AAErE,MAAM,UAAU,iBAAiB,CAAC,YAAoB;IACpD,OAAO,oBAAoB,CAAC,YAAY,EAAE,EAAE,CAAC,CAAA;AAC/C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,WAA8B,EAC9B,MAAe;IAEf,MAAM,QAAQ,GAAG,iBAAiB,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAA;IACxD,MAAM,WAAW,GAAG,MAAM,uBAAuB,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAA;IAEvE,IAAI,MAAM,EAAE,CAAC;QACX,OAAO;YACL,MAAM,EAAE,IAAI;YACZ,YAAY,EAAE;gBACZ,QAAQ,EAAE,WAAW,CAAC,QAAQ;gBAC9B,MAAM,EAAE,WAAW,CAAC,MAAM;gBAC1B,MAAM,EAAE,WAAW,CAAC,MAAM;aAC3B;SACF,CAAA;IACH,CAAC;IAED,OAAO,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,WAAW,CAAC,CAAA;AACnD,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { ActionProvider, ActionInstruction } from '../types.js';
|
|
2
|
+
export declare class LogActionProvider implements ActionProvider {
|
|
3
|
+
readonly provider = "log";
|
|
4
|
+
getAvailableActions(): string[];
|
|
5
|
+
execute(instruction: ActionInstruction, _credentials: Record<string, string>): Promise<unknown>;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=log.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log.d.ts","sourceRoot":"","sources":["../../src/actions/log.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAG/D,qBAAa,iBAAkB,YAAW,cAAc;IACtD,QAAQ,CAAC,QAAQ,SAAQ;IAEzB,mBAAmB,IAAI,MAAM,EAAE;IAIzB,OAAO,CACX,WAAW,EAAE,iBAAiB,EAC9B,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACnC,OAAO,CAAC,OAAO,CAAC;CAyBpB"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { createLogger } from '../utils/logger.js';
|
|
2
|
+
export class LogActionProvider {
|
|
3
|
+
provider = 'log';
|
|
4
|
+
getAvailableActions() {
|
|
5
|
+
return ['info', 'warn', 'error'];
|
|
6
|
+
}
|
|
7
|
+
async execute(instruction, _credentials) {
|
|
8
|
+
const { action, params } = instruction;
|
|
9
|
+
const demonName = params.demonName ?? 'demon';
|
|
10
|
+
const logger = createLogger(demonName);
|
|
11
|
+
const message = params.message ?? JSON.stringify(params);
|
|
12
|
+
const meta = { ...params };
|
|
13
|
+
delete meta.message;
|
|
14
|
+
delete meta.demonName;
|
|
15
|
+
switch (action) {
|
|
16
|
+
case 'warn':
|
|
17
|
+
logger.warn(message, meta);
|
|
18
|
+
break;
|
|
19
|
+
case 'error':
|
|
20
|
+
logger.error(message, meta);
|
|
21
|
+
break;
|
|
22
|
+
case 'info':
|
|
23
|
+
default:
|
|
24
|
+
logger.info(message, meta);
|
|
25
|
+
break;
|
|
26
|
+
}
|
|
27
|
+
return { logged: true, level: action, message };
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=log.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log.js","sourceRoot":"","sources":["../../src/actions/log.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEjD,MAAM,OAAO,iBAAiB;IACnB,QAAQ,GAAG,KAAK,CAAA;IAEzB,mBAAmB;QACjB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAA;IAClC,CAAC;IAED,KAAK,CAAC,OAAO,CACX,WAA8B,EAC9B,YAAoC;QAEpC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,WAAW,CAAA;QACtC,MAAM,SAAS,GAAI,MAAM,CAAC,SAAoB,IAAI,OAAO,CAAA;QACzD,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,CAAA;QACtC,MAAM,OAAO,GAAI,MAAM,CAAC,OAAkB,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;QAEpE,MAAM,IAAI,GAAG,EAAE,GAAG,MAAM,EAAE,CAAA;QAC1B,OAAO,IAAI,CAAC,OAAO,CAAA;QACnB,OAAO,IAAI,CAAC,SAAS,CAAA;QAErB,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,MAAM;gBACT,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;gBAC1B,MAAK;YACP,KAAK,OAAO;gBACV,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;gBAC3B,MAAK;YACP,KAAK,MAAM,CAAC;YACZ;gBACE,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;gBAC1B,MAAK;QACT,CAAC;QAED,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAA;IACjD,CAAC;CACF"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ActionProvider } from '../types.js';
|
|
2
|
+
export declare class NotifyActionProvider implements ActionProvider {
|
|
3
|
+
readonly provider = "notify";
|
|
4
|
+
getAvailableActions(): string[];
|
|
5
|
+
execute(instruction: {
|
|
6
|
+
provider: string;
|
|
7
|
+
action: string;
|
|
8
|
+
params: Record<string, unknown>;
|
|
9
|
+
}, _credentials: Record<string, string>): Promise<unknown>;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=notify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notify.d.ts","sourceRoot":"","sources":["../../src/actions/notify.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAE5C,qBAAa,oBAAqB,YAAW,cAAc;IACzD,QAAQ,CAAC,QAAQ,YAAW;IAE5B,mBAAmB,IAAI,MAAM,EAAE;IAIzB,OAAO,CACX,WAAW,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,EAClF,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACnC,OAAO,CAAC,OAAO,CAAC;CAyBpB"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { execSync } from 'child_process';
|
|
2
|
+
export class NotifyActionProvider {
|
|
3
|
+
provider = 'notify';
|
|
4
|
+
getAvailableActions() {
|
|
5
|
+
return ['send', 'alert'];
|
|
6
|
+
}
|
|
7
|
+
async execute(instruction, _credentials) {
|
|
8
|
+
const { action, params } = instruction;
|
|
9
|
+
const title = String(params.title ?? 'Demon');
|
|
10
|
+
const message = String(params.message ?? params.body ?? params.text ?? '');
|
|
11
|
+
const subtitle = params.subtitle ? String(params.subtitle) : undefined;
|
|
12
|
+
if (process.platform !== 'darwin') {
|
|
13
|
+
// Fallback for non-Mac: just log it
|
|
14
|
+
console.log(`[notify] ${title}: ${message}`);
|
|
15
|
+
return { platform: process.platform, fallback: 'logged' };
|
|
16
|
+
}
|
|
17
|
+
if (action === 'alert') {
|
|
18
|
+
// Blocking dialog — use sparingly
|
|
19
|
+
const script = `display alert "${esc(title)}" message "${esc(message)}"`;
|
|
20
|
+
execSync(`osascript -e '${script}'`, { stdio: 'pipe' });
|
|
21
|
+
return { sent: true, type: 'alert' };
|
|
22
|
+
}
|
|
23
|
+
// Default: banner notification (non-blocking)
|
|
24
|
+
const subtitlePart = subtitle ? ` subtitle "${esc(subtitle)}"` : '';
|
|
25
|
+
const script = `display notification "${esc(message)}" with title "${esc(title)}"${subtitlePart}`;
|
|
26
|
+
execSync(`osascript -e '${script}'`, { stdio: 'pipe' });
|
|
27
|
+
return { sent: true, type: 'notification' };
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
// Escape single quotes and backslashes for osascript strings
|
|
31
|
+
function esc(s) {
|
|
32
|
+
return s.replace(/\\/g, '\\\\').replace(/"/g, '\\"').replace(/'/g, '’');
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=notify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notify.js","sourceRoot":"","sources":["../../src/actions/notify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAGxC,MAAM,OAAO,oBAAoB;IACtB,QAAQ,GAAG,QAAQ,CAAA;IAE5B,mBAAmB;QACjB,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC1B,CAAC;IAED,KAAK,CAAC,OAAO,CACX,WAAkF,EAClF,YAAoC;QAEpC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,WAAW,CAAA;QACtC,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,OAAO,CAAC,CAAA;QAC7C,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAA;QAC1E,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QAEtE,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAClC,oCAAoC;YACpC,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,KAAK,OAAO,EAAE,CAAC,CAAA;YAC5C,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAA;QAC3D,CAAC;QAED,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;YACvB,kCAAkC;YAClC,MAAM,MAAM,GAAG,kBAAkB,GAAG,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,OAAO,CAAC,GAAG,CAAA;YACxE,QAAQ,CAAC,iBAAiB,MAAM,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;YACvD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAA;QACtC,CAAC;QAED,8CAA8C;QAC9C,MAAM,YAAY,GAAG,QAAQ,CAAC,CAAC,CAAC,cAAc,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;QACnE,MAAM,MAAM,GAAG,yBAAyB,GAAG,CAAC,OAAO,CAAC,iBAAiB,GAAG,CAAC,KAAK,CAAC,IAAI,YAAY,EAAE,CAAA;QACjG,QAAQ,CAAC,iBAAiB,MAAM,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;QACvD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,EAAE,CAAA;IAC7C,CAAC;CACF;AAED,6DAA6D;AAC7D,SAAS,GAAG,CAAC,CAAS;IACpB,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;AACzE,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { ActionProvider, ActionInstruction } from '../types.js';
|
|
2
|
+
export declare class ScriptActionProvider implements ActionProvider {
|
|
3
|
+
readonly provider = "script";
|
|
4
|
+
getAvailableActions(): string[];
|
|
5
|
+
execute(instruction: ActionInstruction, _credentials: Record<string, string>): Promise<unknown>;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=script.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"script.d.ts","sourceRoot":"","sources":["../../src/actions/script.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAI/D,qBAAa,oBAAqB,YAAW,cAAc;IACzD,QAAQ,CAAC,QAAQ,YAAW;IAE5B,mBAAmB,IAAI,MAAM,EAAE;IAIzB,OAAO,CACX,WAAW,EAAE,iBAAiB,EAC9B,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACnC,OAAO,CAAC,OAAO,CAAC;CA6CpB"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { exec } from 'child_process';
|
|
2
|
+
import { promisify } from 'util';
|
|
3
|
+
const execAsync = promisify(exec);
|
|
4
|
+
export class ScriptActionProvider {
|
|
5
|
+
provider = 'script';
|
|
6
|
+
getAvailableActions() {
|
|
7
|
+
return ['run'];
|
|
8
|
+
}
|
|
9
|
+
async execute(instruction, _credentials) {
|
|
10
|
+
const { params } = instruction;
|
|
11
|
+
// `command` takes precedence; `script` and `path` are aliases
|
|
12
|
+
const cmd = params.command ??
|
|
13
|
+
params.script ??
|
|
14
|
+
params.path;
|
|
15
|
+
if (!cmd) {
|
|
16
|
+
throw new Error('script action requires a "command", "script", or "path" parameter');
|
|
17
|
+
}
|
|
18
|
+
// Merge process env with any explicit env map from params
|
|
19
|
+
const extraEnv = params.env ?? {};
|
|
20
|
+
const env = {
|
|
21
|
+
...process.env,
|
|
22
|
+
...extraEnv,
|
|
23
|
+
};
|
|
24
|
+
// Expose remaining string params as DEMON_* env vars
|
|
25
|
+
for (const [key, value] of Object.entries(params)) {
|
|
26
|
+
if (typeof value === 'string' &&
|
|
27
|
+
!['command', 'script', 'path', 'timeout'].includes(key)) {
|
|
28
|
+
env[`DEMON_${key.toUpperCase()}`] = value;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
const timeout = typeof params.timeout === 'number' ? params.timeout : 30_000;
|
|
32
|
+
try {
|
|
33
|
+
const { stdout, stderr } = await execAsync(cmd, { env, timeout });
|
|
34
|
+
return {
|
|
35
|
+
exitCode: 0,
|
|
36
|
+
stdout: stdout.slice(0, 2000),
|
|
37
|
+
stderr: stderr.slice(0, 500),
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
const execErr = err;
|
|
42
|
+
throw new Error(`Script failed (exit ${execErr.code ?? 1}): ${execErr.stderr ?? execErr.message}`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=script.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"script.js","sourceRoot":"","sources":["../../src/actions/script.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAA;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAA;AAGhC,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAA;AAEjC,MAAM,OAAO,oBAAoB;IACtB,QAAQ,GAAG,QAAQ,CAAA;IAE5B,mBAAmB;QACjB,OAAO,CAAC,KAAK,CAAC,CAAA;IAChB,CAAC;IAED,KAAK,CAAC,OAAO,CACX,WAA8B,EAC9B,YAAoC;QAEpC,MAAM,EAAE,MAAM,EAAE,GAAG,WAAW,CAAA;QAC9B,8DAA8D;QAC9D,MAAM,GAAG,GACN,MAAM,CAAC,OAA8B;YACrC,MAAM,CAAC,MAA6B;YACpC,MAAM,CAAC,IAA2B,CAAA;QAErC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAA;QACtF,CAAC;QAED,0DAA0D;QAC1D,MAAM,QAAQ,GAAI,MAAM,CAAC,GAA0C,IAAI,EAAE,CAAA;QACzE,MAAM,GAAG,GAA2B;YAClC,GAAI,OAAO,CAAC,GAA8B;YAC1C,GAAG,QAAQ;SACZ,CAAA;QAED,qDAAqD;QACrD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAClD,IACE,OAAO,KAAK,KAAK,QAAQ;gBACzB,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EACvD,CAAC;gBACD,GAAG,CAAC,SAAS,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC,GAAG,KAAK,CAAA;YAC3C,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAAG,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAA;QAE5E,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAA;YACjE,OAAO;gBACL,QAAQ,EAAE,CAAC;gBACX,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;gBAC7B,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;aAC7B,CAAA;QACH,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,OAAO,GAAG,GAA2E,CAAA;YAC3F,MAAM,IAAI,KAAK,CACb,uBAAuB,OAAO,CAAC,IAAI,IAAI,CAAC,MAAM,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,OAAO,EAAE,CAClF,CAAA;QACH,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { ActionProvider, ActionInstruction } from '../types.js';
|
|
2
|
+
export declare class SlackActionProvider implements ActionProvider {
|
|
3
|
+
readonly provider = "slack";
|
|
4
|
+
getAvailableActions(): string[];
|
|
5
|
+
execute(instruction: ActionInstruction, credentials: Record<string, string>): Promise<unknown>;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=slack.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slack.d.ts","sourceRoot":"","sources":["../../src/actions/slack.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAE/D,qBAAa,mBAAoB,YAAW,cAAc;IACxD,QAAQ,CAAC,QAAQ,WAAU;IAE3B,mBAAmB,IAAI,MAAM,EAAE;IAIzB,OAAO,CACX,WAAW,EAAE,iBAAiB,EAC9B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAClC,OAAO,CAAC,OAAO,CAAC;CAkDpB"}
|