adaria-ai 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 +21 -0
- package/apps.example.yaml +65 -0
- package/dist/agent/audit.d.ts +16 -0
- package/dist/agent/audit.d.ts.map +1 -0
- package/dist/agent/audit.js +42 -0
- package/dist/agent/audit.js.map +1 -0
- package/dist/agent/claude.d.ts +62 -0
- package/dist/agent/claude.d.ts.map +1 -0
- package/dist/agent/claude.js +297 -0
- package/dist/agent/claude.js.map +1 -0
- package/dist/agent/conversation-summary.d.ts +29 -0
- package/dist/agent/conversation-summary.d.ts.map +1 -0
- package/dist/agent/conversation-summary.js +221 -0
- package/dist/agent/conversation-summary.js.map +1 -0
- package/dist/agent/core.d.ts +81 -0
- package/dist/agent/core.d.ts.map +1 -0
- package/dist/agent/core.js +527 -0
- package/dist/agent/core.js.map +1 -0
- package/dist/agent/mcp-launcher.d.ts +42 -0
- package/dist/agent/mcp-launcher.d.ts.map +1 -0
- package/dist/agent/mcp-launcher.js +38 -0
- package/dist/agent/mcp-launcher.js.map +1 -0
- package/dist/agent/mcp-manager.d.ts +81 -0
- package/dist/agent/mcp-manager.d.ts.map +1 -0
- package/dist/agent/mcp-manager.js +136 -0
- package/dist/agent/mcp-manager.js.map +1 -0
- package/dist/agent/memory.d.ts +10 -0
- package/dist/agent/memory.d.ts.map +1 -0
- package/dist/agent/memory.js +95 -0
- package/dist/agent/memory.js.map +1 -0
- package/dist/agent/safety.d.ts +45 -0
- package/dist/agent/safety.d.ts.map +1 -0
- package/dist/agent/safety.js +71 -0
- package/dist/agent/safety.js.map +1 -0
- package/dist/agent/session.d.ts +27 -0
- package/dist/agent/session.d.ts.map +1 -0
- package/dist/agent/session.js +124 -0
- package/dist/agent/session.js.map +1 -0
- package/dist/agent/tool-descriptions.d.ts +8 -0
- package/dist/agent/tool-descriptions.d.ts.map +1 -0
- package/dist/agent/tool-descriptions.js +26 -0
- package/dist/agent/tool-descriptions.js.map +1 -0
- package/dist/cli/analyze.d.ts +8 -0
- package/dist/cli/analyze.d.ts.map +1 -0
- package/dist/cli/analyze.js +114 -0
- package/dist/cli/analyze.js.map +1 -0
- package/dist/cli/daemon.d.ts +2 -0
- package/dist/cli/daemon.d.ts.map +1 -0
- package/dist/cli/daemon.js +91 -0
- package/dist/cli/daemon.js.map +1 -0
- package/dist/cli/doctor.d.ts +2 -0
- package/dist/cli/doctor.d.ts.map +1 -0
- package/dist/cli/doctor.js +198 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/init.d.ts +3 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +459 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/logs.d.ts +4 -0
- package/dist/cli/logs.d.ts.map +1 -0
- package/dist/cli/logs.js +50 -0
- package/dist/cli/logs.js.map +1 -0
- package/dist/cli/monitor-cmd.d.ts +11 -0
- package/dist/cli/monitor-cmd.d.ts.map +1 -0
- package/dist/cli/monitor-cmd.js +59 -0
- package/dist/cli/monitor-cmd.js.map +1 -0
- package/dist/cli/start.d.ts +11 -0
- package/dist/cli/start.d.ts.map +1 -0
- package/dist/cli/start.js +103 -0
- package/dist/cli/start.js.map +1 -0
- package/dist/cli/status.d.ts +9 -0
- package/dist/cli/status.d.ts.map +1 -0
- package/dist/cli/status.js +49 -0
- package/dist/cli/status.js.map +1 -0
- package/dist/cli/stop.d.ts +2 -0
- package/dist/cli/stop.d.ts.map +1 -0
- package/dist/cli/stop.js +34 -0
- package/dist/cli/stop.js.map +1 -0
- package/dist/collectors/appstore.d.ts +51 -0
- package/dist/collectors/appstore.d.ts.map +1 -0
- package/dist/collectors/appstore.js +166 -0
- package/dist/collectors/appstore.js.map +1 -0
- package/dist/collectors/arden-tts.d.ts +60 -0
- package/dist/collectors/arden-tts.d.ts.map +1 -0
- package/dist/collectors/arden-tts.js +83 -0
- package/dist/collectors/arden-tts.js.map +1 -0
- package/dist/collectors/asomobile.d.ts +37 -0
- package/dist/collectors/asomobile.d.ts.map +1 -0
- package/dist/collectors/asomobile.js +88 -0
- package/dist/collectors/asomobile.js.map +1 -0
- package/dist/collectors/eodin-blog.d.ts +90 -0
- package/dist/collectors/eodin-blog.d.ts.map +1 -0
- package/dist/collectors/eodin-blog.js +238 -0
- package/dist/collectors/eodin-blog.js.map +1 -0
- package/dist/collectors/eodin-sdk.d.ts +60 -0
- package/dist/collectors/eodin-sdk.d.ts.map +1 -0
- package/dist/collectors/eodin-sdk.js +112 -0
- package/dist/collectors/eodin-sdk.js.map +1 -0
- package/dist/collectors/fridgify-recipes.d.ts +65 -0
- package/dist/collectors/fridgify-recipes.d.ts.map +1 -0
- package/dist/collectors/fridgify-recipes.js +111 -0
- package/dist/collectors/fridgify-recipes.js.map +1 -0
- package/dist/collectors/playstore.d.ts +46 -0
- package/dist/collectors/playstore.d.ts.map +1 -0
- package/dist/collectors/playstore.js +140 -0
- package/dist/collectors/playstore.js.map +1 -0
- package/dist/collectors/youtube.d.ts +44 -0
- package/dist/collectors/youtube.d.ts.map +1 -0
- package/dist/collectors/youtube.js +107 -0
- package/dist/collectors/youtube.js.map +1 -0
- package/dist/config/apps-schema.d.ts +94 -0
- package/dist/config/apps-schema.d.ts.map +1 -0
- package/dist/config/apps-schema.js +66 -0
- package/dist/config/apps-schema.js.map +1 -0
- package/dist/config/keychain.d.ts +14 -0
- package/dist/config/keychain.d.ts.map +1 -0
- package/dist/config/keychain.js +89 -0
- package/dist/config/keychain.js.map +1 -0
- package/dist/config/load-apps.d.ts +16 -0
- package/dist/config/load-apps.d.ts.map +1 -0
- package/dist/config/load-apps.js +38 -0
- package/dist/config/load-apps.js.map +1 -0
- package/dist/config/schema.d.ts +306 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +220 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/config/store.d.ts +38 -0
- package/dist/config/store.d.ts.map +1 -0
- package/dist/config/store.js +180 -0
- package/dist/config/store.js.map +1 -0
- package/dist/db/queries.d.ts +304 -0
- package/dist/db/queries.d.ts.map +1 -0
- package/dist/db/queries.js +327 -0
- package/dist/db/queries.js.map +1 -0
- package/dist/db/schema.d.ts +15 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +252 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +86 -0
- package/dist/index.js.map +1 -0
- package/dist/messenger/adapter.d.ts +63 -0
- package/dist/messenger/adapter.d.ts.map +1 -0
- package/dist/messenger/adapter.js +7 -0
- package/dist/messenger/adapter.js.map +1 -0
- package/dist/messenger/factory.d.ts +12 -0
- package/dist/messenger/factory.d.ts.map +1 -0
- package/dist/messenger/factory.js +9 -0
- package/dist/messenger/factory.js.map +1 -0
- package/dist/messenger/slack.d.ts +30 -0
- package/dist/messenger/slack.d.ts.map +1 -0
- package/dist/messenger/slack.js +309 -0
- package/dist/messenger/slack.js.map +1 -0
- package/dist/messenger/split.d.ts +17 -0
- package/dist/messenger/split.d.ts.map +1 -0
- package/dist/messenger/split.js +56 -0
- package/dist/messenger/split.js.map +1 -0
- package/dist/orchestrator/dashboard.d.ts +67 -0
- package/dist/orchestrator/dashboard.d.ts.map +1 -0
- package/dist/orchestrator/dashboard.js +113 -0
- package/dist/orchestrator/dashboard.js.map +1 -0
- package/dist/orchestrator/monitor.d.ts +37 -0
- package/dist/orchestrator/monitor.d.ts.map +1 -0
- package/dist/orchestrator/monitor.js +236 -0
- package/dist/orchestrator/monitor.js.map +1 -0
- package/dist/orchestrator/types.d.ts +82 -0
- package/dist/orchestrator/types.d.ts.map +1 -0
- package/dist/orchestrator/types.js +12 -0
- package/dist/orchestrator/types.js.map +1 -0
- package/dist/orchestrator/weekly.d.ts +66 -0
- package/dist/orchestrator/weekly.d.ts.map +1 -0
- package/dist/orchestrator/weekly.js +376 -0
- package/dist/orchestrator/weekly.js.map +1 -0
- package/dist/prompts/loader.d.ts +18 -0
- package/dist/prompts/loader.d.ts.map +1 -0
- package/dist/prompts/loader.js +28 -0
- package/dist/prompts/loader.js.map +1 -0
- package/dist/security/auth.d.ts +14 -0
- package/dist/security/auth.d.ts.map +1 -0
- package/dist/security/auth.js +14 -0
- package/dist/security/auth.js.map +1 -0
- package/dist/security/prompt-guard.d.ts +21 -0
- package/dist/security/prompt-guard.d.ts.map +1 -0
- package/dist/security/prompt-guard.js +54 -0
- package/dist/security/prompt-guard.js.map +1 -0
- package/dist/skills/aso.d.ts +60 -0
- package/dist/skills/aso.d.ts.map +1 -0
- package/dist/skills/aso.js +322 -0
- package/dist/skills/aso.js.map +1 -0
- package/dist/skills/content.d.ts +25 -0
- package/dist/skills/content.d.ts.map +1 -0
- package/dist/skills/content.js +90 -0
- package/dist/skills/content.js.map +1 -0
- package/dist/skills/index.d.ts +65 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +90 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/onboarding.d.ts +58 -0
- package/dist/skills/onboarding.d.ts.map +1 -0
- package/dist/skills/onboarding.js +274 -0
- package/dist/skills/onboarding.js.map +1 -0
- package/dist/skills/registry.d.ts +24 -0
- package/dist/skills/registry.d.ts.map +1 -0
- package/dist/skills/registry.js +66 -0
- package/dist/skills/registry.js.map +1 -0
- package/dist/skills/review.d.ts +33 -0
- package/dist/skills/review.d.ts.map +1 -0
- package/dist/skills/review.js +236 -0
- package/dist/skills/review.js.map +1 -0
- package/dist/skills/sdk-request.d.ts +30 -0
- package/dist/skills/sdk-request.d.ts.map +1 -0
- package/dist/skills/sdk-request.js +72 -0
- package/dist/skills/sdk-request.js.map +1 -0
- package/dist/skills/seo-blog.d.ts +64 -0
- package/dist/skills/seo-blog.d.ts.map +1 -0
- package/dist/skills/seo-blog.js +268 -0
- package/dist/skills/seo-blog.js.map +1 -0
- package/dist/skills/short-form.d.ts +28 -0
- package/dist/skills/short-form.d.ts.map +1 -0
- package/dist/skills/short-form.js +121 -0
- package/dist/skills/short-form.js.map +1 -0
- package/dist/skills/social-publish.d.ts +32 -0
- package/dist/skills/social-publish.d.ts.map +1 -0
- package/dist/skills/social-publish.js +133 -0
- package/dist/skills/social-publish.js.map +1 -0
- package/dist/social/base.d.ts +47 -0
- package/dist/social/base.d.ts.map +1 -0
- package/dist/social/base.js +26 -0
- package/dist/social/base.js.map +1 -0
- package/dist/social/facebook.d.ts +27 -0
- package/dist/social/facebook.d.ts.map +1 -0
- package/dist/social/facebook.js +166 -0
- package/dist/social/facebook.js.map +1 -0
- package/dist/social/factory.d.ts +26 -0
- package/dist/social/factory.d.ts.map +1 -0
- package/dist/social/factory.js +32 -0
- package/dist/social/factory.js.map +1 -0
- package/dist/social/linkedin.d.ts +26 -0
- package/dist/social/linkedin.d.ts.map +1 -0
- package/dist/social/linkedin.js +190 -0
- package/dist/social/linkedin.js.map +1 -0
- package/dist/social/threads.d.ts +21 -0
- package/dist/social/threads.d.ts.map +1 -0
- package/dist/social/threads.js +122 -0
- package/dist/social/threads.js.map +1 -0
- package/dist/social/tiktok.d.ts +23 -0
- package/dist/social/tiktok.d.ts.map +1 -0
- package/dist/social/tiktok.js +110 -0
- package/dist/social/tiktok.js.map +1 -0
- package/dist/social/twitter.d.ts +30 -0
- package/dist/social/twitter.d.ts.map +1 -0
- package/dist/social/twitter.js +189 -0
- package/dist/social/twitter.js.map +1 -0
- package/dist/social/youtube.d.ts +21 -0
- package/dist/social/youtube.d.ts.map +1 -0
- package/dist/social/youtube.js +108 -0
- package/dist/social/youtube.js.map +1 -0
- package/dist/tools/app-info.d.ts +7 -0
- package/dist/tools/app-info.d.ts.map +1 -0
- package/dist/tools/app-info.js +53 -0
- package/dist/tools/app-info.js.map +1 -0
- package/dist/tools/collector-fetch.d.ts +11 -0
- package/dist/tools/collector-fetch.d.ts.map +1 -0
- package/dist/tools/collector-fetch.js +101 -0
- package/dist/tools/collector-fetch.js.map +1 -0
- package/dist/tools/db-query.d.ts +29 -0
- package/dist/tools/db-query.d.ts.map +1 -0
- package/dist/tools/db-query.js +159 -0
- package/dist/tools/db-query.js.map +1 -0
- package/dist/tools/skill-result.d.ts +8 -0
- package/dist/tools/skill-result.d.ts.map +1 -0
- package/dist/tools/skill-result.js +63 -0
- package/dist/tools/skill-result.js.map +1 -0
- package/dist/tools/tool-host.d.ts +12 -0
- package/dist/tools/tool-host.d.ts.map +1 -0
- package/dist/tools/tool-host.js +124 -0
- package/dist/tools/tool-host.js.map +1 -0
- package/dist/types/collectors.d.ts +198 -0
- package/dist/types/collectors.d.ts.map +1 -0
- package/dist/types/collectors.js +28 -0
- package/dist/types/collectors.js.map +1 -0
- package/dist/types/skill.d.ts +60 -0
- package/dist/types/skill.d.ts.map +1 -0
- package/dist/types/skill.js +9 -0
- package/dist/types/skill.js.map +1 -0
- package/dist/utils/circuit-breaker.d.ts +26 -0
- package/dist/utils/circuit-breaker.d.ts.map +1 -0
- package/dist/utils/circuit-breaker.js +67 -0
- package/dist/utils/circuit-breaker.js.map +1 -0
- package/dist/utils/errors.d.ts +44 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +75 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/escape.d.ts +11 -0
- package/dist/utils/escape.d.ts.map +1 -0
- package/dist/utils/escape.js +19 -0
- package/dist/utils/escape.js.map +1 -0
- package/dist/utils/logger.d.ts +19 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +93 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/parse-json.d.ts +13 -0
- package/dist/utils/parse-json.d.ts.map +1 -0
- package/dist/utils/parse-json.js +61 -0
- package/dist/utils/parse-json.js.map +1 -0
- package/dist/utils/paths.d.ts +14 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +19 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/utils/rate-limiter.d.ts +20 -0
- package/dist/utils/rate-limiter.d.ts.map +1 -0
- package/dist/utils/rate-limiter.js +47 -0
- package/dist/utils/rate-limiter.js.map +1 -0
- package/dist/utils/retry.d.ts +26 -0
- package/dist/utils/retry.d.ts.map +1 -0
- package/dist/utils/retry.js +61 -0
- package/dist/utils/retry.js.map +1 -0
- package/launchd/.gitkeep +0 -0
- package/launchd/com.adaria-ai.daemon.plist.template +62 -0
- package/launchd/com.adaria-ai.monitor.plist.template +41 -0
- package/launchd/com.adaria-ai.weekly.plist.template +43 -0
- package/package.json +72 -0
- package/prompts/aso-description.md +44 -0
- package/prompts/aso-inapp-events.md +20 -0
- package/prompts/aso-metadata.md +34 -0
- package/prompts/aso-screenshots.md +20 -0
- package/prompts/onboarding-hypotheses.md +38 -0
- package/prompts/onboarding-review-timing.md +24 -0
- package/prompts/review-clustering.md +19 -0
- package/prompts/review-replies.md +18 -0
- package/prompts/review-sentiment.md +16 -0
- package/prompts/seo-blog-fridgify-recipe.md +116 -0
- package/prompts/seo-blog.md +69 -0
- package/prompts/short-form-ideas.md +50 -0
- package/prompts/social-publish.md +46 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Woojin Ahn
|
|
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,21 @@
|
|
|
1
|
+
# adaria-ai
|
|
2
|
+
|
|
3
|
+
Single-user marketing operations agent for the Adaria.ai app portfolio (Fridgify, Arden TTS, Tempy). Runs as a macOS launchd daemon, receives commands and free-form questions via Slack, orchestrates data collection from 8 marketing sources, dispatches Claude-powered analysis skills, and delivers weekly briefings with approval-gated write actions.
|
|
4
|
+
|
|
5
|
+
**Status:** pre-release (M0 bootstrap). Not yet published to npm. See [`docs/growth-agent/`](./docs/growth-agent/) for the full plan — start with `prd.md` and `checklist.md`.
|
|
6
|
+
|
|
7
|
+
## Profiles and safety
|
|
8
|
+
|
|
9
|
+
Every credential the agent uses flows through `adaria-ai init`. The wizard writes `$ADARIA_HOME/config.yaml` and stores secrets in the macOS Keychain under a service prefix derived from `$ADARIA_HOME`, so you can run a **dev profile** and the production daemon side by side on the same machine without either clobbering the other:
|
|
10
|
+
|
|
11
|
+
- **Production** (default): `$HOME/.adaria` — Keychain service `adaria-ai`
|
|
12
|
+
- **Dev profile**: `$HOME/.adaria-dev` — Keychain service `adaria-ai-dev`
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
# 1. Seed a dev profile once with live (or scoped-down) credentials:
|
|
16
|
+
npm run init:dev
|
|
17
|
+
# 2. Exercise every configured collector against real APIs:
|
|
18
|
+
npm run smoke:collectors:dev
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Real `config.yaml` and `apps.yaml` files never live inside the repository — they are ignored by Git and sit only under `$HOME/.adaria*`. The `files` field in `package.json` ships only `dist/`, `src/`, `prompts/`, `launchd/`, `apps.example.yaml`, `README.md`, and `LICENSE`, and `npm run prepublishOnly` runs `check:tarball-secrets`, which rips open the candidate tarball and refuses to publish if it finds anything that looks like a Slack token, Anthropic key, Google API key, or PEM private key block.
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# adaria-ai apps.yaml
|
|
2
|
+
#
|
|
3
|
+
# One entry per app in the portfolio. Skills and orchestrators iterate
|
|
4
|
+
# over every `active: true` app. Copy this file to `~/.adaria/apps.yaml`
|
|
5
|
+
# (or edit the path your `adaria-ai init` printed) and tailor it.
|
|
6
|
+
#
|
|
7
|
+
# Global collector credentials (App Store Connect key pair, Play service
|
|
8
|
+
# account, API keys, tokens) live in `config.yaml.collectors` — NOT
|
|
9
|
+
# here. This file only holds per-app identifiers and metadata.
|
|
10
|
+
|
|
11
|
+
apps:
|
|
12
|
+
- id: fridgify
|
|
13
|
+
name: Fridgify
|
|
14
|
+
platform: [ios, android]
|
|
15
|
+
appStoreId: "123456789"
|
|
16
|
+
playStorePackage: com.eodin.fridgify
|
|
17
|
+
eodinSdkAppId: fridgify
|
|
18
|
+
asoMobileId: "123456789"
|
|
19
|
+
youtubeChannelId: ""
|
|
20
|
+
primaryKeywords:
|
|
21
|
+
- fridge manager
|
|
22
|
+
- food tracker
|
|
23
|
+
- expiry date
|
|
24
|
+
competitors:
|
|
25
|
+
- fridgee
|
|
26
|
+
- grocy
|
|
27
|
+
- myfoodbudget
|
|
28
|
+
locale: [ko, en, ja]
|
|
29
|
+
features:
|
|
30
|
+
fridgifyRecipes: true
|
|
31
|
+
active: true
|
|
32
|
+
|
|
33
|
+
- id: arden
|
|
34
|
+
name: Arden
|
|
35
|
+
platform: [ios, android]
|
|
36
|
+
appStoreId: "987654321"
|
|
37
|
+
playStorePackage: com.eodin.arden
|
|
38
|
+
eodinSdkAppId: arden
|
|
39
|
+
asoMobileId: "987654321"
|
|
40
|
+
youtubeChannelId: ""
|
|
41
|
+
primaryKeywords:
|
|
42
|
+
- tts
|
|
43
|
+
- text to speech
|
|
44
|
+
- voice generator
|
|
45
|
+
competitors:
|
|
46
|
+
- naturalreader
|
|
47
|
+
- speechify
|
|
48
|
+
locale: [ko, en]
|
|
49
|
+
active: true
|
|
50
|
+
|
|
51
|
+
- id: tempy
|
|
52
|
+
name: Tempy
|
|
53
|
+
platform: [ios]
|
|
54
|
+
appStoreId: "111222333"
|
|
55
|
+
eodinSdkAppId: tempy
|
|
56
|
+
asoMobileId: "111222333"
|
|
57
|
+
primaryKeywords:
|
|
58
|
+
- temperature
|
|
59
|
+
- weather widget
|
|
60
|
+
- thermometer
|
|
61
|
+
competitors:
|
|
62
|
+
- weatherbug
|
|
63
|
+
- thermometer++
|
|
64
|
+
locale: [ko, en, ja]
|
|
65
|
+
active: true
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface AuditEntry {
|
|
2
|
+
timestamp?: string;
|
|
3
|
+
type: "command" | "execution" | "result" | "error" | "approval";
|
|
4
|
+
userId?: string;
|
|
5
|
+
platform?: string;
|
|
6
|
+
content: string;
|
|
7
|
+
metadata?: Record<string, unknown>;
|
|
8
|
+
}
|
|
9
|
+
export declare function maskSecrets(text: string): string;
|
|
10
|
+
/**
|
|
11
|
+
* Appends one JSON line to $ADARIA_HOME/audit.jsonl.
|
|
12
|
+
* Creates the file with 0600 on first write; relies on ensureAdariaDir() to
|
|
13
|
+
* have tightened $ADARIA_HOME to 0700 earlier in daemon startup.
|
|
14
|
+
*/
|
|
15
|
+
export declare function writeAuditLog(entry: AuditEntry, shouldMask?: boolean): Promise<void>;
|
|
16
|
+
//# sourceMappingURL=audit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/agent/audit.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,UAAU;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,OAAO,GAAG,UAAU,CAAC;IAChE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAUD,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAShD;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,KAAK,EAAE,UAAU,EACjB,UAAU,UAAO,GAChB,OAAO,CAAC,IAAI,CAAC,CASf"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Append-only audit log at $ADARIA_HOME/audit.jsonl.
|
|
3
|
+
*
|
|
4
|
+
* Every Claude invocation, skill dispatch, approval click, and user-facing
|
|
5
|
+
* error should produce one entry. Secret patterns are masked before write.
|
|
6
|
+
*/
|
|
7
|
+
import fs from "node:fs/promises";
|
|
8
|
+
import { AUDIT_PATH } from "../utils/paths.js";
|
|
9
|
+
const SECRET_PATTERNS = [
|
|
10
|
+
/xoxb-[a-zA-Z0-9-]+/g, // Slack bot token
|
|
11
|
+
/xapp-[a-zA-Z0-9-]+/g, // Slack app token
|
|
12
|
+
/ntn_[a-zA-Z0-9]+/g, // Notion API key
|
|
13
|
+
/sk-ant-[a-zA-Z0-9-]+/g, // Anthropic API key
|
|
14
|
+
/sk-[a-zA-Z0-9]{20,}/g, // Generic API key
|
|
15
|
+
];
|
|
16
|
+
export function maskSecrets(text) {
|
|
17
|
+
let masked = text;
|
|
18
|
+
for (const pattern of SECRET_PATTERNS) {
|
|
19
|
+
masked = masked.replace(pattern, (match) => {
|
|
20
|
+
if (match.length <= 8)
|
|
21
|
+
return "***";
|
|
22
|
+
return match.slice(0, 4) + "***" + match.slice(-4);
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
return masked;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Appends one JSON line to $ADARIA_HOME/audit.jsonl.
|
|
29
|
+
* Creates the file with 0600 on first write; relies on ensureAdariaDir() to
|
|
30
|
+
* have tightened $ADARIA_HOME to 0700 earlier in daemon startup.
|
|
31
|
+
*/
|
|
32
|
+
export async function writeAuditLog(entry, shouldMask = true) {
|
|
33
|
+
const record = {
|
|
34
|
+
...entry,
|
|
35
|
+
content: shouldMask ? maskSecrets(entry.content) : entry.content,
|
|
36
|
+
timestamp: entry.timestamp ?? new Date().toISOString(),
|
|
37
|
+
};
|
|
38
|
+
await fs.appendFile(AUDIT_PATH, JSON.stringify(record) + "\n", {
|
|
39
|
+
mode: 0o600,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/agent/audit.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAW/C,MAAM,eAAe,GAAa;IAChC,qBAAqB,EAAE,kBAAkB;IACzC,qBAAqB,EAAE,kBAAkB;IACzC,mBAAmB,EAAE,iBAAiB;IACtC,uBAAuB,EAAE,oBAAoB;IAC7C,sBAAsB,EAAE,kBAAkB;CAC3C,CAAC;AAEF,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,IAAI,MAAM,GAAG,IAAI,CAAC;IAClB,KAAK,MAAM,OAAO,IAAI,eAAe,EAAE,CAAC;QACtC,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACzC,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC;gBAAE,OAAO,KAAK,CAAC;YACpC,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,KAAiB,EACjB,UAAU,GAAG,IAAI;IAEjB,MAAM,MAAM,GAAG;QACb,GAAG,KAAK;QACR,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO;QAChE,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACvD,CAAC;IACF,MAAM,EAAE,CAAC,UAAU,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE;QAC7D,IAAI,EAAE,KAAK;KACZ,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { CircuitBreaker } from "../utils/circuit-breaker.js";
|
|
2
|
+
export interface ClaudeCliOptions {
|
|
3
|
+
prompt: string;
|
|
4
|
+
systemPrompt?: string;
|
|
5
|
+
mcpConfigPath?: string;
|
|
6
|
+
timeoutMs?: number;
|
|
7
|
+
onToolUse?: (status: string) => void;
|
|
8
|
+
/** Thinking/reasoning deltas streamed as Claude produces them. */
|
|
9
|
+
onThinking?: (text: string) => void;
|
|
10
|
+
/** Start a new session with this UUID. */
|
|
11
|
+
sessionId?: string;
|
|
12
|
+
/** Resume an existing session by its UUID. */
|
|
13
|
+
resumeSessionId?: string;
|
|
14
|
+
/** Path or name of the Claude CLI binary (default: 'claude'). */
|
|
15
|
+
cliBinary?: string;
|
|
16
|
+
/** Max tool-use turns per invocation (maps to `--max-turns`). */
|
|
17
|
+
maxTurns?: number;
|
|
18
|
+
}
|
|
19
|
+
export interface ClaudeCliResult {
|
|
20
|
+
result: string;
|
|
21
|
+
exitCode: number;
|
|
22
|
+
}
|
|
23
|
+
export interface ClaudeJsonMessage {
|
|
24
|
+
type: string;
|
|
25
|
+
subtype?: string;
|
|
26
|
+
result?: string;
|
|
27
|
+
content?: Array<{
|
|
28
|
+
type: string;
|
|
29
|
+
text?: string;
|
|
30
|
+
}>;
|
|
31
|
+
[key: string]: unknown;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Default timeout for reactive Slack calls. The weekly orchestrator (M6)
|
|
35
|
+
* overrides this to 15 minutes per call when running long analyses.
|
|
36
|
+
*/
|
|
37
|
+
export declare const DEFAULT_TIMEOUT_MS = 120000;
|
|
38
|
+
/** Checks whether the Claude CLI binary is installed on PATH. */
|
|
39
|
+
export declare function checkClaudeCli(binary?: string): Promise<boolean>;
|
|
40
|
+
/** Checks whether the Claude CLI is authenticated via `claude auth status`. */
|
|
41
|
+
export declare function checkClaudeCliAuth(binary?: string): Promise<boolean>;
|
|
42
|
+
/** Exposes circuit-breaker state for `adaria-ai doctor` / health checks. */
|
|
43
|
+
export declare function getClaudeCircuitState(): ReturnType<CircuitBreaker["getState"]>;
|
|
44
|
+
/**
|
|
45
|
+
* Invokes the Claude Code CLI as a subprocess.
|
|
46
|
+
* Runs `claude -p --output-format stream-json` and parses the NDJSON
|
|
47
|
+
* response. Protected by a circuit breaker to fail fast when the CLI is
|
|
48
|
+
* unavailable or repeatedly crashing.
|
|
49
|
+
*/
|
|
50
|
+
export declare function invokeClaudeCli(options: ClaudeCliOptions): Promise<ClaudeCliResult>;
|
|
51
|
+
/**
|
|
52
|
+
* Parses one stream-json event and fires tool-use / thinking callbacks.
|
|
53
|
+
* Handles both legacy json format (assistant messages) and the newer
|
|
54
|
+
* stream-json format (`stream_event`).
|
|
55
|
+
*/
|
|
56
|
+
export declare function parseStreamEvent(msg: Record<string, unknown>, onToolUse?: (status: string) => void, onThinking?: (text: string) => void): void;
|
|
57
|
+
/**
|
|
58
|
+
* Parses Claude CLI stream-json output and extracts the final text result.
|
|
59
|
+
* Supports both legacy json format and stream-json format.
|
|
60
|
+
*/
|
|
61
|
+
export declare function parseClaudeJsonOutput(output: string): string;
|
|
62
|
+
//# sourceMappingURL=claude.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../src/agent/claude.ts"],"names":[],"mappings":"AAuBA,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAY7D,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,kEAAkE;IAClE,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,0CAA0C;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8CAA8C;IAC9C,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iEAAiE;IACjE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iEAAiE;IACjE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjD,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;GAGG;AACH,eAAO,MAAM,kBAAkB,SAAU,CAAC;AAE1C,iEAAiE;AACjE,wBAAsB,cAAc,CAAC,MAAM,SAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAOxE;AAED,+EAA+E;AAC/E,wBAAsB,kBAAkB,CAAC,MAAM,SAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAc5E;AAwDD,4EAA4E;AAC5E,wBAAgB,qBAAqB,IAAI,UAAU,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAE9E;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,eAAe,CAAC,CAE1B;AAwJD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,EACpC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAClC,IAAI,CAiCN;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CA2C5D"}
|
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude CLI runner.
|
|
3
|
+
*
|
|
4
|
+
* Ports pilot-ai's `src/agent/claude.ts` with four M1 adaptations:
|
|
5
|
+
*
|
|
6
|
+
* 1. Default timeout dropped from 15 min to 120 s. Reactive Slack
|
|
7
|
+
* mentions shouldn't block the daemon for 15 minutes. The weekly
|
|
8
|
+
* orchestrator (M6) passes `timeoutMs: 15 * 60 * 1000` explicitly.
|
|
9
|
+
* 2. `cwd` parameter dropped — adaria-ai has no concept of projects.
|
|
10
|
+
* 3. `DEFAULT_ALLOWED_TOOLS` export dropped — pilot-ai's code already
|
|
11
|
+
* notes it's unused (--dangerously-skip-permissions covers it), and
|
|
12
|
+
* adaria-ai doesn't register Bash/Read/Write tool *wrappers* either.
|
|
13
|
+
* 4. `invokeClaudeApi` (Anthropic SDK fallback) dropped. The config
|
|
14
|
+
* schema keeps `mode: 'cli' | 'api'` for forward-compat, but M1
|
|
15
|
+
* ships only the CLI path. A later milestone will re-add the API
|
|
16
|
+
* fallback if we ever need it (so far the CLI has been adequate).
|
|
17
|
+
*
|
|
18
|
+
* Everything else — circuit breaker, stream-json parsing, tool-use
|
|
19
|
+
* status callbacks, thinking deltas, session --resume, CLAUDECODE env
|
|
20
|
+
* strip — is preserved.
|
|
21
|
+
*/
|
|
22
|
+
import { spawn, execFile } from "node:child_process";
|
|
23
|
+
import { promisify } from "node:util";
|
|
24
|
+
import { CircuitBreaker } from "../utils/circuit-breaker.js";
|
|
25
|
+
import { error as logError } from "../utils/logger.js";
|
|
26
|
+
import { maskSecrets } from "./audit.js";
|
|
27
|
+
const execFileAsync = promisify(execFile);
|
|
28
|
+
/** Circuit breaker for Claude CLI invocations. */
|
|
29
|
+
const claudeCircuit = new CircuitBreaker({
|
|
30
|
+
failureThreshold: 3,
|
|
31
|
+
resetTimeout: 120_000,
|
|
32
|
+
});
|
|
33
|
+
/**
|
|
34
|
+
* Default timeout for reactive Slack calls. The weekly orchestrator (M6)
|
|
35
|
+
* overrides this to 15 minutes per call when running long analyses.
|
|
36
|
+
*/
|
|
37
|
+
export const DEFAULT_TIMEOUT_MS = 120_000;
|
|
38
|
+
/** Checks whether the Claude CLI binary is installed on PATH. */
|
|
39
|
+
export async function checkClaudeCli(binary = "claude") {
|
|
40
|
+
try {
|
|
41
|
+
await execFileAsync("which", [binary]);
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/** Checks whether the Claude CLI is authenticated via `claude auth status`. */
|
|
49
|
+
export async function checkClaudeCliAuth(binary = "claude") {
|
|
50
|
+
try {
|
|
51
|
+
const env = { ...process.env };
|
|
52
|
+
delete env["CLAUDECODE"];
|
|
53
|
+
const { stdout } = await execFileAsync(binary, ["auth", "status"], {
|
|
54
|
+
timeout: 5_000,
|
|
55
|
+
env,
|
|
56
|
+
});
|
|
57
|
+
return (stdout.includes('"loggedIn": true') || stdout.includes('"loggedIn":true'));
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/** Maps Claude tool names to user-friendly status descriptions. */
|
|
64
|
+
function describeToolUse(toolName, input) {
|
|
65
|
+
switch (toolName) {
|
|
66
|
+
case "Bash": {
|
|
67
|
+
const cmd = typeof input?.["command"] === "string"
|
|
68
|
+
? input["command"].slice(0, 60)
|
|
69
|
+
: "";
|
|
70
|
+
if (cmd.startsWith("gh "))
|
|
71
|
+
return `🔍 Checking GitHub... \`${cmd}\``;
|
|
72
|
+
if (cmd.startsWith("git "))
|
|
73
|
+
return `📂 Checking git history...`;
|
|
74
|
+
if (cmd.startsWith("curl ") || cmd.startsWith("wget "))
|
|
75
|
+
return `🌐 Fetching URL...`;
|
|
76
|
+
if (cmd.startsWith("npm ") || cmd.startsWith("npx "))
|
|
77
|
+
return `📦 Running npm...`;
|
|
78
|
+
return `⚡ Running: \`${cmd || "command"}\``;
|
|
79
|
+
}
|
|
80
|
+
case "Read":
|
|
81
|
+
return `📖 Reading file...`;
|
|
82
|
+
case "Write":
|
|
83
|
+
return `✏️ Writing file...`;
|
|
84
|
+
case "Edit":
|
|
85
|
+
case "MultiEdit":
|
|
86
|
+
return `✏️ Editing file...`;
|
|
87
|
+
case "Glob":
|
|
88
|
+
return `🔍 Searching files...`;
|
|
89
|
+
case "Grep":
|
|
90
|
+
return `🔍 Searching code...`;
|
|
91
|
+
case "LS":
|
|
92
|
+
return `📂 Listing directory...`;
|
|
93
|
+
case "WebSearch": {
|
|
94
|
+
const q = typeof input?.["query"] === "string"
|
|
95
|
+
? input["query"].slice(0, 50)
|
|
96
|
+
: "";
|
|
97
|
+
return q ? `🌐 Searching: "${q}"` : `🌐 Searching the web...`;
|
|
98
|
+
}
|
|
99
|
+
case "WebFetch":
|
|
100
|
+
return `🌐 Fetching web page...`;
|
|
101
|
+
case "Task":
|
|
102
|
+
return `🧠 Delegating sub-task...`;
|
|
103
|
+
case "NotebookRead":
|
|
104
|
+
case "NotebookEdit":
|
|
105
|
+
return `📓 Working with notebook...`;
|
|
106
|
+
default:
|
|
107
|
+
if (toolName.startsWith("mcp__adaria__")) {
|
|
108
|
+
return `🔧 Using ${toolName.slice("mcp__adaria__".length)}...`;
|
|
109
|
+
}
|
|
110
|
+
return `🔧 Using ${toolName}...`;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/** Exposes circuit-breaker state for `adaria-ai doctor` / health checks. */
|
|
114
|
+
export function getClaudeCircuitState() {
|
|
115
|
+
return claudeCircuit.getState();
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Invokes the Claude Code CLI as a subprocess.
|
|
119
|
+
* Runs `claude -p --output-format stream-json` and parses the NDJSON
|
|
120
|
+
* response. Protected by a circuit breaker to fail fast when the CLI is
|
|
121
|
+
* unavailable or repeatedly crashing.
|
|
122
|
+
*/
|
|
123
|
+
export async function invokeClaudeCli(options) {
|
|
124
|
+
return claudeCircuit.execute(() => invokeClaudeCliInner(options));
|
|
125
|
+
}
|
|
126
|
+
async function invokeClaudeCliInner(options) {
|
|
127
|
+
const { prompt, systemPrompt, mcpConfigPath, timeoutMs = DEFAULT_TIMEOUT_MS, onToolUse, onThinking, sessionId, resumeSessionId, cliBinary = "claude", maxTurns, } = options;
|
|
128
|
+
const args = [];
|
|
129
|
+
// Session management: --resume takes precedence (continuing existing
|
|
130
|
+
// session). --dangerously-skip-permissions: adaria-ai runs headless from
|
|
131
|
+
// launchd — nobody is sitting at the terminal to approve CLI prompts.
|
|
132
|
+
// Security is provided by the Slack allowlist (src/security/auth.ts)
|
|
133
|
+
// and by ApprovalManager for write paths.
|
|
134
|
+
if (resumeSessionId) {
|
|
135
|
+
args.push("-p", "--resume", resumeSessionId, "--output-format", "stream-json", "--verbose", "--dangerously-skip-permissions");
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
args.push("-p", "--output-format", "stream-json", "--verbose", "--dangerously-skip-permissions");
|
|
139
|
+
if (sessionId) {
|
|
140
|
+
args.push("--session-id", sessionId);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
if (systemPrompt) {
|
|
144
|
+
args.push("--append-system-prompt", systemPrompt);
|
|
145
|
+
}
|
|
146
|
+
// NOTE: --allowedTools is intentionally NOT used.
|
|
147
|
+
// --dangerously-skip-permissions already permits all tools.
|
|
148
|
+
// Combining --allowedTools with bypass mode is buggy (GitHub #12232)
|
|
149
|
+
// and can silently block MCP tools.
|
|
150
|
+
if (maxTurns) {
|
|
151
|
+
args.push("--max-turns", String(maxTurns));
|
|
152
|
+
}
|
|
153
|
+
if (mcpConfigPath) {
|
|
154
|
+
args.push("--mcp-config", mcpConfigPath);
|
|
155
|
+
}
|
|
156
|
+
// Prompt goes via stdin to avoid OS arg-length limits.
|
|
157
|
+
return new Promise((resolve, reject) => {
|
|
158
|
+
const env = { ...process.env };
|
|
159
|
+
delete env["CLAUDECODE"];
|
|
160
|
+
const child = spawn(cliBinary, args, {
|
|
161
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
162
|
+
timeout: timeoutMs,
|
|
163
|
+
env,
|
|
164
|
+
});
|
|
165
|
+
child.stdin.write(prompt);
|
|
166
|
+
child.stdin.end();
|
|
167
|
+
let stdout = "";
|
|
168
|
+
let stderr = "";
|
|
169
|
+
let lineBuffer = "";
|
|
170
|
+
child.stdout.on("data", (data) => {
|
|
171
|
+
const chunk = data.toString();
|
|
172
|
+
stdout += chunk;
|
|
173
|
+
if (onToolUse || onThinking) {
|
|
174
|
+
lineBuffer += chunk;
|
|
175
|
+
// Prevent unbounded buffer growth (max 1MB). Truncate to the
|
|
176
|
+
// nearest newline boundary so we never hand half a JSON object
|
|
177
|
+
// to `JSON.parse` — otherwise a single pathological long line
|
|
178
|
+
// eats tool_use events for the rest of the stream (M1 claude
|
|
179
|
+
// review MED #1).
|
|
180
|
+
if (lineBuffer.length > 1_048_576) {
|
|
181
|
+
const lastNl = lineBuffer.lastIndexOf("\n", 524_288);
|
|
182
|
+
lineBuffer = lastNl >= 0 ? lineBuffer.slice(lastNl + 1) : "";
|
|
183
|
+
logError("[claude-cli] stream buffer overflow; dropped leading content");
|
|
184
|
+
}
|
|
185
|
+
const lines = lineBuffer.split("\n");
|
|
186
|
+
lineBuffer = lines.pop() ?? "";
|
|
187
|
+
for (const line of lines) {
|
|
188
|
+
if (!line.trim())
|
|
189
|
+
continue;
|
|
190
|
+
try {
|
|
191
|
+
const msg = JSON.parse(line);
|
|
192
|
+
parseStreamEvent(msg, onToolUse, onThinking);
|
|
193
|
+
}
|
|
194
|
+
catch {
|
|
195
|
+
// Not valid JSON yet — skip.
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
});
|
|
200
|
+
child.stderr.on("data", (data) => {
|
|
201
|
+
const chunk = data.toString();
|
|
202
|
+
stderr += chunk;
|
|
203
|
+
// Mask secrets before writing to the disk log. Pilot-ai's plain
|
|
204
|
+
// console.error didn't persist, but adaria-ai's logger writes to
|
|
205
|
+
// $ADARIA_HOME/logs/ so an MCP server that dumps an auth header
|
|
206
|
+
// in its stderr would land at-rest on disk (M1 claude review MED #2).
|
|
207
|
+
for (const line of chunk.split("\n")) {
|
|
208
|
+
if (line.trim()) {
|
|
209
|
+
logError(`[claude-cli] ${maskSecrets(line)}`);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
});
|
|
213
|
+
child.on("error", (err) => {
|
|
214
|
+
reject(new Error(`Claude CLI execution failed: ${err.message}`));
|
|
215
|
+
});
|
|
216
|
+
child.on("close", (code) => {
|
|
217
|
+
const exitCode = code ?? 1;
|
|
218
|
+
if (exitCode !== 0 && !stdout) {
|
|
219
|
+
reject(new Error(`Claude CLI error (exit ${String(exitCode)}): ${stderr || "Unknown error"}`));
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
const result = parseClaudeJsonOutput(stdout);
|
|
223
|
+
resolve({ result, exitCode });
|
|
224
|
+
});
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Parses one stream-json event and fires tool-use / thinking callbacks.
|
|
229
|
+
* Handles both legacy json format (assistant messages) and the newer
|
|
230
|
+
* stream-json format (`stream_event`).
|
|
231
|
+
*/
|
|
232
|
+
export function parseStreamEvent(msg, onToolUse, onThinking) {
|
|
233
|
+
if (msg["type"] === "assistant") {
|
|
234
|
+
const topContent = msg.content;
|
|
235
|
+
const wrapped = msg["message"];
|
|
236
|
+
const nestedContent = wrapped?.["content"];
|
|
237
|
+
const content = topContent ?? nestedContent;
|
|
238
|
+
if (onToolUse && Array.isArray(content)) {
|
|
239
|
+
for (const block of content) {
|
|
240
|
+
const b = block;
|
|
241
|
+
if (b["type"] === "tool_use" && typeof b["name"] === "string") {
|
|
242
|
+
onToolUse(describeToolUse(b["name"], b["input"]));
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
if (onThinking && msg["type"] === "content_block_delta") {
|
|
248
|
+
const delta = msg["delta"];
|
|
249
|
+
if (delta?.["type"] === "thinking_delta" &&
|
|
250
|
+
typeof delta["thinking"] === "string") {
|
|
251
|
+
onThinking(delta["thinking"]);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Parses Claude CLI stream-json output and extracts the final text result.
|
|
257
|
+
* Supports both legacy json format and stream-json format.
|
|
258
|
+
*/
|
|
259
|
+
export function parseClaudeJsonOutput(output) {
|
|
260
|
+
const lines = output.trim().split("\n").filter(Boolean);
|
|
261
|
+
const texts = [];
|
|
262
|
+
for (const line of lines) {
|
|
263
|
+
try {
|
|
264
|
+
const msg = JSON.parse(line);
|
|
265
|
+
// Legacy json format: assistant messages with content blocks.
|
|
266
|
+
if (msg.type === "assistant" && Array.isArray(msg.content)) {
|
|
267
|
+
for (const block of msg.content) {
|
|
268
|
+
if (block.type === "text" && block.text) {
|
|
269
|
+
texts.push(block.text);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
// stream-json format: assistant message wrapper.
|
|
274
|
+
if (msg.type === "assistant" && msg["message"]) {
|
|
275
|
+
const message = msg["message"];
|
|
276
|
+
const content = message["content"];
|
|
277
|
+
if (Array.isArray(content)) {
|
|
278
|
+
for (const block of content) {
|
|
279
|
+
if (block.type === "text" && block.text) {
|
|
280
|
+
texts.push(block.text);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
// Terminal result message (both formats).
|
|
286
|
+
if (msg.type === "result" && typeof msg.result === "string") {
|
|
287
|
+
texts.push(msg.result);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
catch {
|
|
291
|
+
// Not JSON — treat as raw text.
|
|
292
|
+
texts.push(line);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
return texts.join("\n") || output;
|
|
296
|
+
}
|
|
297
|
+
//# sourceMappingURL=claude.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/agent/claude.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export interface TurnSummary {
|
|
2
|
+
/** User message (truncated to 500 chars) */
|
|
3
|
+
userMessage: string;
|
|
4
|
+
/** Agent action summary (truncated to ~800 chars) */
|
|
5
|
+
agentAction: string;
|
|
6
|
+
/** ISO timestamp */
|
|
7
|
+
timestamp: string;
|
|
8
|
+
}
|
|
9
|
+
export interface ConversationSummary {
|
|
10
|
+
/** Unique key: platform:channelId:threadId */
|
|
11
|
+
threadKey: string;
|
|
12
|
+
/** Recent turn summaries (FIFO, max 15) */
|
|
13
|
+
turns: TurnSummary[];
|
|
14
|
+
/** Accumulated key decisions */
|
|
15
|
+
keyDecisions: string[];
|
|
16
|
+
/** Accumulated modified file paths */
|
|
17
|
+
modifiedFiles: string[];
|
|
18
|
+
/** ISO timestamp of last update */
|
|
19
|
+
lastUpdated: string;
|
|
20
|
+
}
|
|
21
|
+
export declare function loadSummary(platform: string, channelId: string, threadId: string): Promise<ConversationSummary | null>;
|
|
22
|
+
export declare function saveSummary(summary: ConversationSummary): Promise<void>;
|
|
23
|
+
export declare function extractActionSummary(agentResponse: string): string;
|
|
24
|
+
export declare function extractModifiedFiles(agentResponse: string): string[];
|
|
25
|
+
export declare function extractKeyDecisions(agentResponse: string): string[];
|
|
26
|
+
export declare function updateConversationSummary(platform: string, channelId: string, threadId: string, rawUserMessage: string, rawAgentResponse: string): Promise<void>;
|
|
27
|
+
export declare function getConversationSummaryText(platform: string, channelId: string, threadId: string): Promise<string | null>;
|
|
28
|
+
export declare function cleanupExpiredSummaries(): Promise<number>;
|
|
29
|
+
//# sourceMappingURL=conversation-summary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation-summary.d.ts","sourceRoot":"","sources":["../../src/agent/conversation-summary.ts"],"names":[],"mappings":"AAcA,MAAM,WAAW,WAAW;IAC1B,4CAA4C;IAC5C,WAAW,EAAE,MAAM,CAAC;IACpB,qDAAqD;IACrD,WAAW,EAAE,MAAM,CAAC;IACpB,oBAAoB;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,8CAA8C;IAC9C,SAAS,EAAE,MAAM,CAAC;IAClB,2CAA2C;IAC3C,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,gCAAgC;IAChC,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,sCAAsC;IACtC,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,mCAAmC;IACnC,WAAW,EAAE,MAAM,CAAC;CACrB;AAsBD,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CASrC;AAED,wBAAsB,WAAW,CAC/B,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAMf;AAED,wBAAgB,oBAAoB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CA+BlE;AAED,wBAAgB,oBAAoB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,EAAE,CAkBpE;AAED,wBAAgB,mBAAmB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,EAAE,CAoBnE;AAED,wBAAsB,yBAAyB,CAC7C,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,MAAM,EACtB,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,IAAI,CAAC,CAkDf;AAED,wBAAsB,0BAA0B,CAC9C,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAyCxB;AAED,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,MAAM,CAAC,CAyB/D"}
|