Spaces:
Sleeping
Sleeping
GitHub Actions commited on
Commit ·
cf7dc69
1
Parent(s): 96f0c4c
Deploy SIN-Code-AI from GitHub Actions
Browse files- .gitattributes +0 -35
- .gitignore +0 -7
- .sin/doctor.config.yaml +0 -34
- .sin/policies.local.yaml +0 -1
- .sin/preflight.config.yaml +0 -22
- .well-known/agent-card.json +0 -53
- .well-known/agent.json +0 -53
- .well-known/oauth-client.json +0 -9
- A2A-CARD.md +22 -107
- AGENTS.md +8 -89
- Dockerfile +0 -10
- README.md +0 -74
- agent-spec.example.json +0 -21
- agent.json +7 -21
- clients/codex-config.toml +0 -6
- clients/opencode-mcp.json +0 -8
- cloudflared/config.example.yml +0 -6
- mcp-config.json +4 -1
- n8n-workflows/docs-sync.json +0 -39
- package-lock.json +0 -2102
- package.json +0 -36
- runbooks/install.md +0 -3
- runbooks/launchagent.md +0 -3
- scripts/__pycache__/hf_pull_script.cpython-314.pyc +0 -0
- scripts/botfather-create.sh +0 -174
- scripts/complete-install.sh +0 -23
- scripts/hf_pull_script.py +0 -116
- scripts/postbuild.mjs +0 -17
- scripts/telegram-bootstrap.sh +0 -112
- src/a2a-http.ts +0 -78
- src/agent/SupabaseSaver.ts +0 -152
- src/agent/graph.ts +0 -37
- src/cli.ts +44 -59
- src/hf_sync.ts +92 -0
- src/idle-monetization.ts +32 -0
- src/index.ts +0 -5
- src/lib/telemetry/SentinelLogger.ts +0 -141
- src/lib/telemetry/ZeroTrustAuth.ts +0 -63
- src/mcp-server.ts +101 -102
- src/metadata.ts +0 -73
- src/runtime.ts +60 -86
- src/self-healing.ts +32 -0
- src/supabase.ts +0 -22
- test/logging.test.mjs +0 -75
- test/supabase.test.mjs +0 -16
- test/supabase_saver.test.mjs +0 -37
- tsconfig.json +0 -15
.gitattributes
DELETED
|
@@ -1,35 +0,0 @@
|
|
| 1 |
-
*.7z filter=lfs diff=lfs merge=lfs -text
|
| 2 |
-
*.arrow filter=lfs diff=lfs merge=lfs -text
|
| 3 |
-
*.bin filter=lfs diff=lfs merge=lfs -text
|
| 4 |
-
*.bz2 filter=lfs diff=lfs merge=lfs -text
|
| 5 |
-
*.ckpt filter=lfs diff=lfs merge=lfs -text
|
| 6 |
-
*.ftz filter=lfs diff=lfs merge=lfs -text
|
| 7 |
-
*.gz filter=lfs diff=lfs merge=lfs -text
|
| 8 |
-
*.h5 filter=lfs diff=lfs merge=lfs -text
|
| 9 |
-
*.joblib filter=lfs diff=lfs merge=lfs -text
|
| 10 |
-
*.lfs.* filter=lfs diff=lfs merge=lfs -text
|
| 11 |
-
*.mlmodel filter=lfs diff=lfs merge=lfs -text
|
| 12 |
-
*.model filter=lfs diff=lfs merge=lfs -text
|
| 13 |
-
*.msgpack filter=lfs diff=lfs merge=lfs -text
|
| 14 |
-
*.npy filter=lfs diff=lfs merge=lfs -text
|
| 15 |
-
*.npz filter=lfs diff=lfs merge=lfs -text
|
| 16 |
-
*.onnx filter=lfs diff=lfs merge=lfs -text
|
| 17 |
-
*.ot filter=lfs diff=lfs merge=lfs -text
|
| 18 |
-
*.parquet filter=lfs diff=lfs merge=lfs -text
|
| 19 |
-
*.pb filter=lfs diff=lfs merge=lfs -text
|
| 20 |
-
*.pickle filter=lfs diff=lfs merge=lfs -text
|
| 21 |
-
*.pkl filter=lfs diff=lfs merge=lfs -text
|
| 22 |
-
*.pt filter=lfs diff=lfs merge=lfs -text
|
| 23 |
-
*.pth filter=lfs diff=lfs merge=lfs -text
|
| 24 |
-
*.rar filter=lfs diff=lfs merge=lfs -text
|
| 25 |
-
*.safetensors filter=lfs diff=lfs merge=lfs -text
|
| 26 |
-
saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
| 27 |
-
*.tar.* filter=lfs diff=lfs merge=lfs -text
|
| 28 |
-
*.tar filter=lfs diff=lfs merge=lfs -text
|
| 29 |
-
*.tflite filter=lfs diff=lfs merge=lfs -text
|
| 30 |
-
*.tgz filter=lfs diff=lfs merge=lfs -text
|
| 31 |
-
*.wasm filter=lfs diff=lfs merge=lfs -text
|
| 32 |
-
*.xz filter=lfs diff=lfs merge=lfs -text
|
| 33 |
-
*.zip filter=lfs diff=lfs merge=lfs -text
|
| 34 |
-
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 35 |
-
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.gitignore
DELETED
|
@@ -1,7 +0,0 @@
|
|
| 1 |
-
dist
|
| 2 |
-
node_modules
|
| 3 |
-
*.log
|
| 4 |
-
.env
|
| 5 |
-
.env.local
|
| 6 |
-
.DS_Store
|
| 7 |
-
.sin/artifacts/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.sin/doctor.config.yaml
DELETED
|
@@ -1,34 +0,0 @@
|
|
| 1 |
-
repo: a2a-sin-agent-template
|
| 2 |
-
checks:
|
| 3 |
-
- required-config-present
|
| 4 |
-
- workspace-clean-enough
|
| 5 |
-
- required-files-present
|
| 6 |
-
- env-contract-present
|
| 7 |
-
- build-command-exists
|
| 8 |
-
- tests-command-exists
|
| 9 |
-
- runtime-command-exists
|
| 10 |
-
- complete-install-present
|
| 11 |
-
- health-surface-present
|
| 12 |
-
required_files:
|
| 13 |
-
- README.md
|
| 14 |
-
- package.json
|
| 15 |
-
- src/runtime.ts
|
| 16 |
-
- src/mcp-server.ts
|
| 17 |
-
- scripts/complete-install.sh
|
| 18 |
-
- scripts/hf_pull_script.py
|
| 19 |
-
env_contract_files:
|
| 20 |
-
- .env.example
|
| 21 |
-
commands:
|
| 22 |
-
build:
|
| 23 |
-
- npm run build
|
| 24 |
-
tests:
|
| 25 |
-
- npm run typecheck
|
| 26 |
-
runtime:
|
| 27 |
-
- npm run start:mcp
|
| 28 |
-
- npm run start:a2a
|
| 29 |
-
verify:
|
| 30 |
-
- node dist/src/cli.js print-card
|
| 31 |
-
health_files:
|
| 32 |
-
- agent.json
|
| 33 |
-
- src/runtime.ts
|
| 34 |
-
launchagent_files: []
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.sin/policies.local.yaml
DELETED
|
@@ -1 +0,0 @@
|
|
| 1 |
-
waivers: {}
|
|
|
|
|
|
.sin/preflight.config.yaml
DELETED
|
@@ -1,22 +0,0 @@
|
|
| 1 |
-
profiles:
|
| 2 |
-
local-change:
|
| 3 |
-
required_checks:
|
| 4 |
-
- required-config-present
|
| 5 |
-
- required-files-present
|
| 6 |
-
- env-contract-present
|
| 7 |
-
- build-command-exists
|
| 8 |
-
- complete-install-present
|
| 9 |
-
- health-surface-present
|
| 10 |
-
run_commands: []
|
| 11 |
-
pull-request:
|
| 12 |
-
required_checks:
|
| 13 |
-
- required-config-present
|
| 14 |
-
- required-files-present
|
| 15 |
-
- env-contract-present
|
| 16 |
-
- build-command-exists
|
| 17 |
-
- tests-command-exists
|
| 18 |
-
- complete-install-present
|
| 19 |
-
- health-surface-present
|
| 20 |
-
run_commands:
|
| 21 |
-
- build
|
| 22 |
-
- tests
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.well-known/agent-card.json
DELETED
|
@@ -1,53 +0,0 @@
|
|
| 1 |
-
{
|
| 2 |
-
"name": "SIN-Code-AI",
|
| 3 |
-
"description": "Elite 2026 AI Engineering Architect. Architects and implements RAG pipelines, prompt templates, semantic search, OpenCode MCP tools, and AI-native application logic.",
|
| 4 |
-
"version": "2026.03.09",
|
| 5 |
-
"documentationUrl": "http://127.0.0.1:7860",
|
| 6 |
-
"url": "http://127.0.0.1:7860/a2a/v1",
|
| 7 |
-
"capabilities": {
|
| 8 |
-
"streaming": false,
|
| 9 |
-
"pushNotifications": false
|
| 10 |
-
},
|
| 11 |
-
"defaultInputModes": [
|
| 12 |
-
"text/plain",
|
| 13 |
-
"application/json"
|
| 14 |
-
],
|
| 15 |
-
"defaultOutputModes": [
|
| 16 |
-
"text/plain",
|
| 17 |
-
"application/json"
|
| 18 |
-
],
|
| 19 |
-
"metadata": {
|
| 20 |
-
"projectionMode": "control-plane-first",
|
| 21 |
-
"capabilityRegistry": "control_plane.capabilities",
|
| 22 |
-
"executorContract": "services/workers/hf_executor_contract.json"
|
| 23 |
-
},
|
| 24 |
-
"skills": [
|
| 25 |
-
{
|
| 26 |
-
"id": "sin.code.ai.health",
|
| 27 |
-
"name": "Health",
|
| 28 |
-
"description": "Check base agent readiness and identity."
|
| 29 |
-
},
|
| 30 |
-
{
|
| 31 |
-
"id": "sin.code.ai.onboarding.status",
|
| 32 |
-
"name": "Onboarding Status",
|
| 33 |
-
"description": "Read persisted onboarding state."
|
| 34 |
-
},
|
| 35 |
-
{
|
| 36 |
-
"id": "sin.code.ai.onboarding.save",
|
| 37 |
-
"name": "Onboarding Save",
|
| 38 |
-
"description": "Persist onboarding defaults for future autonomous runs."
|
| 39 |
-
},
|
| 40 |
-
{
|
| 41 |
-
"id": "sin.code.ai.room13.claim",
|
| 42 |
-
"name": "Room-13 Claim",
|
| 43 |
-
"description": "Register worker and claim next task from Room-13 coordinator."
|
| 44 |
-
}
|
| 45 |
-
],
|
| 46 |
-
"supportedInterfaces": [
|
| 47 |
-
{
|
| 48 |
-
"url": "http://127.0.0.1:7860/a2a/v1",
|
| 49 |
-
"protocolBinding": "JSONRPC",
|
| 50 |
-
"protocolVersion": "1.0"
|
| 51 |
-
}
|
| 52 |
-
]
|
| 53 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.well-known/agent.json
DELETED
|
@@ -1,53 +0,0 @@
|
|
| 1 |
-
{
|
| 2 |
-
"name": "SIN-Code-AI",
|
| 3 |
-
"description": "Elite 2026 AI Engineering Architect. Architects and implements RAG pipelines, prompt templates, semantic search, OpenCode MCP tools, and AI-native application logic.",
|
| 4 |
-
"version": "2026.03.09",
|
| 5 |
-
"documentationUrl": "http://127.0.0.1:7860",
|
| 6 |
-
"url": "http://127.0.0.1:7860/a2a/v1",
|
| 7 |
-
"capabilities": {
|
| 8 |
-
"streaming": false,
|
| 9 |
-
"pushNotifications": false
|
| 10 |
-
},
|
| 11 |
-
"defaultInputModes": [
|
| 12 |
-
"text/plain",
|
| 13 |
-
"application/json"
|
| 14 |
-
],
|
| 15 |
-
"defaultOutputModes": [
|
| 16 |
-
"text/plain",
|
| 17 |
-
"application/json"
|
| 18 |
-
],
|
| 19 |
-
"metadata": {
|
| 20 |
-
"projectionMode": "control-plane-first",
|
| 21 |
-
"capabilityRegistry": "control_plane.capabilities",
|
| 22 |
-
"executorContract": "services/workers/hf_executor_contract.json"
|
| 23 |
-
},
|
| 24 |
-
"skills": [
|
| 25 |
-
{
|
| 26 |
-
"id": "sin.code.ai.health",
|
| 27 |
-
"name": "Health",
|
| 28 |
-
"description": "Check base agent readiness and identity."
|
| 29 |
-
},
|
| 30 |
-
{
|
| 31 |
-
"id": "sin.code.ai.onboarding.status",
|
| 32 |
-
"name": "Onboarding Status",
|
| 33 |
-
"description": "Read persisted onboarding state."
|
| 34 |
-
},
|
| 35 |
-
{
|
| 36 |
-
"id": "sin.code.ai.onboarding.save",
|
| 37 |
-
"name": "Onboarding Save",
|
| 38 |
-
"description": "Persist onboarding defaults for future autonomous runs."
|
| 39 |
-
},
|
| 40 |
-
{
|
| 41 |
-
"id": "sin.code.ai.room13.claim",
|
| 42 |
-
"name": "Room-13 Claim",
|
| 43 |
-
"description": "Register worker and claim next task from Room-13 coordinator."
|
| 44 |
-
}
|
| 45 |
-
],
|
| 46 |
-
"supportedInterfaces": [
|
| 47 |
-
{
|
| 48 |
-
"url": "http://127.0.0.1:7860/a2a/v1",
|
| 49 |
-
"protocolBinding": "JSONRPC",
|
| 50 |
-
"protocolVersion": "1.0"
|
| 51 |
-
}
|
| 52 |
-
]
|
| 53 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.well-known/oauth-client.json
DELETED
|
@@ -1,9 +0,0 @@
|
|
| 1 |
-
{
|
| 2 |
-
"client_id": "https://delqhi-sin-code-ai.hf.space/.well-known/oauth-client.json",
|
| 3 |
-
"client_name": "SIN-Code-AI",
|
| 4 |
-
"redirect_uris": ["https://delqhi-sin-code-ai.hf.space/oauth/callback"],
|
| 5 |
-
"grant_types": ["authorization_code"],
|
| 6 |
-
"response_types": ["code"],
|
| 7 |
-
"token_endpoint_auth_method": "none"
|
| 8 |
-
}
|
| 9 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
A2A-CARD.md
CHANGED
|
@@ -1,117 +1,32 @@
|
|
| 1 |
-
# A2A
|
| 2 |
|
| 3 |
-
|
|
|
|
|
|
|
| 4 |
|
| 5 |
-
|
| 6 |
-
- `Name`: `SIN-Code-AI`
|
| 7 |
-
- `Beschreibung (Zweck)`: Elite 2026 AI Engineering Architect. Architects and implements RAG pipelines, prompt templates, semantic search, OpenCode MCP tools, and AI-native application logic.
|
| 8 |
-
- `Verwendung`: Use for designing LLM prompts, implementing local and cloud-based AI pipelines, writing semantic search logic, building RAG architectures, and authoring OpenCode skills/tools.
|
| 9 |
-
- `CIMD`: `https://delqhi-sin-code-ai.hf.space`
|
| 10 |
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
-
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
|
| 19 |
-
- `Landingpage URL`: `https://delqhi-sin-code-ai.hf.space` (reserved; deployment pending)
|
| 20 |
-
- `Cloudflare Tunnel`: `sin-code-ai`
|
| 21 |
-
- `Workforce Ziel-Index`: `https://a2a.delqhi.com/`
|
| 22 |
-
- `Google Doc Root`: `https://docs.google.com/document/d/1RtoHn4I0GntuEEOHHkqoh_dMuGzgMwQz7_8oxAOpQbw/edit`
|
| 23 |
-
- `Dedicated Docs Child-Tab`: `pending dedicated child-tab under Team - Coding (tabId: t.71rk0lld8zkq)`
|
| 24 |
-
|
| 25 |
-
## MCP Server
|
| 26 |
-
|
| 27 |
-
- `MCP Server`: `sin-code-ai`
|
| 28 |
-
- `Transport`: `stdio`
|
| 29 |
-
- `Config`: `./mcp-config.json`
|
| 30 |
-
|
| 31 |
-
## CDP (Chrome DevTools Protocol)
|
| 32 |
-
|
| 33 |
-
- `Nur eintragen, wenn der Agent aktiv CDP nutzt`
|
| 34 |
-
|
| 35 |
-
## Tools
|
| 36 |
-
|
| 37 |
-
- `sin.code.ai.health`
|
| 38 |
-
- `sin.code.ai.room13.claim`
|
| 39 |
-
- `sin.code.ai.onboarding.status`
|
| 40 |
-
- `sin.code.ai.onboarding.save`
|
| 41 |
-
|
| 42 |
-
## Aufgaben
|
| 43 |
-
|
| 44 |
-
- Runtime bereitstellen
|
| 45 |
-
- MCP bereitstellen
|
| 46 |
-
- A2A JSON-RPC bereitstellen
|
| 47 |
-
- Team-Manager- und Docs-Compliance einhalten
|
| 48 |
-
|
| 49 |
-
## Alpha Backbone
|
| 50 |
-
|
| 51 |
-
- `Control Plane`: `control_plane.capabilities`, `control_plane.world_edges`, `memory_plane.items`, `control_plane.artifact_refs`
|
| 52 |
-
- `Projection Mode`: `control-plane-first`
|
| 53 |
-
- `Consumer Auth`: `./scripts/hf_pull_script.py`
|
| 54 |
-
- `Complete Install`: `./scripts/complete-install.sh`
|
| 55 |
-
- `Executor Contract`: `services/workers/hf_executor_contract.json`
|
| 56 |
-
|
| 57 |
-
## Commandos
|
| 58 |
-
|
| 59 |
-
```bash
|
| 60 |
-
sin-code-ai serve-a2a
|
| 61 |
-
sin-code-ai serve-mcp
|
| 62 |
-
sin-code-ai print-card
|
| 63 |
-
sin-code-ai run-action '{"action":"agent.help"}'
|
| 64 |
-
```
|
| 65 |
|
| 66 |
## Endpoints
|
| 67 |
|
| 68 |
-
- `
|
| 69 |
-
- `Root`: `/`
|
| 70 |
-
- `Agent Card`: `/.well-known/agent-card.json`
|
| 71 |
-
- `Legacy Agent Card Alias`: `/.well-known/agent.json`
|
| 72 |
-
- `A2A JSON-RPC`: `/a2a/v1`
|
| 73 |
-
|
| 74 |
-
## Skills
|
| 75 |
-
|
| 76 |
-
- `Pflicht`: Health, onboarding, primary domain actions
|
| 77 |
-
|
| 78 |
-
## Dateien
|
| 79 |
-
|
| 80 |
-
- `README.md`
|
| 81 |
-
- `A2A-CARD.md`
|
| 82 |
-
- `AGENTS.md`
|
| 83 |
-
- `agent.json`
|
| 84 |
-
- `mcp-config.json`
|
| 85 |
-
- `package.json`
|
| 86 |
-
- `tsconfig.json`
|
| 87 |
-
- `scripts/postbuild.mjs`
|
| 88 |
-
- `scripts/complete-install.sh`
|
| 89 |
-
- `scripts/hf_pull_script.py`
|
| 90 |
-
- `src/runtime.ts`
|
| 91 |
-
- `src/mcp-server.ts`
|
| 92 |
-
- `src/a2a-http.ts`
|
| 93 |
-
- `src/metadata.ts`
|
| 94 |
-
- `src/cli.ts`
|
| 95 |
-
- `src/index.ts`
|
| 96 |
-
|
| 97 |
-
## Apps (auf welche Apps hat A2A Zugriff)
|
| 98 |
-
|
| 99 |
-
- `Hier explizit eintragen`
|
| 100 |
-
|
| 101 |
-
## Plattformen (auf welche Plattformen hat A2A Zugriff)
|
| 102 |
-
|
| 103 |
-
- `Hier explizit eintragen`
|
| 104 |
|
| 105 |
-
##
|
| 106 |
|
| 107 |
-
- `
|
|
|
|
|
|
|
|
|
|
|
|
|
| 108 |
|
| 109 |
-
##
|
| 110 |
-
* Wenn dieser Agent auf einen Crash, API-Fehler, ineffiziente Methoden oder eine funktionale Limitierung stoesst, repariert er sich NIEMALS selbst.
|
| 111 |
-
* Er loggt extrem umfangreich, uebertraegt die Logs an `A2A-SIN-GitHub-Issues` und triggert so die Erstellung eines Architektur-Issues, das durch `SIN-Hermes` an das gesamte Coder-Team delegiert wird.
|
| 112 |
|
| 113 |
-
|
| 114 |
-
* Dieser Agent sitzt niemals idle herum.
|
| 115 |
-
* Er agiert wie eine autonome Hacker-Organisation: umgeht Cloudflare / Captchas (mit webauto-nodriver-mcp, Scrapling, GateSolve), sucht selbststaendig nach lukrativen OpenAI Bug Bounties, fixt sie und reicht sie ein.
|
| 116 |
-
* Er registriert den User eigenstaendig auf Freelancer-Plattformen (AgentWork, ClawGig, Upwork), sucht Jobs (Websites bauen, Chats moderieren, Data-Mining) und arbeitet diese autonom ab.
|
| 117 |
-
* Er bearbeitet autonom bezahlte Umfragen und nutzt OS-native APIs, verifiziert via A2A-TelegramBot, manipuliert/loescht jedoch NIEMALS bestehende User-Daten oder zerstoert das System.
|
|
|
|
| 1 |
+
# A2A-SIN-Code-AI (CEO Elite AI Engineer)
|
| 2 |
|
| 3 |
+
**Team:** Coding
|
| 4 |
+
**Version:** 2026.03.22
|
| 5 |
+
**Deployment:** Hugging Face Space free CPU VM
|
| 6 |
|
| 7 |
+
## Identity & Mandate
|
|
|
|
|
|
|
|
|
|
|
|
|
| 8 |
|
| 9 |
+
> **You are A2A-SIN-Code-AI, a 2026 CEO-Level AI Engineering Architect.**
|
| 10 |
+
> You possess the combined expertise of 10 million AI/ML engineers.
|
| 11 |
+
> Your domain covers:
|
| 12 |
+
> 1. **RAG Pipelines**: End-to-end Retrieval-Augmented Generation architectures with chunking strategies, embedding models, vector stores (pgvector/Supabase), and retrieval ranking.
|
| 13 |
+
> 2. **Prompt Engineering**: Production-grade prompt templates with system/user/assistant roles, few-shot examples, chain-of-thought, and structured output schemas.
|
| 14 |
+
> 3. **Semantic Search**: Vector similarity search with HNSW indexes, hybrid keyword+vector queries, and re-ranking pipelines.
|
| 15 |
+
> 4. **OpenCode MCP Tools**: Custom MCP tool definitions that expose AI capabilities to the OpenCode CLI ecosystem.
|
| 16 |
+
> 5. **AI-Native Logic**: LLM orchestration code, streaming responses, token management, model routing, and fallback chains.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 17 |
|
| 18 |
## Endpoints
|
| 19 |
|
| 20 |
+
- `POST /a2a/v1`
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 21 |
|
| 22 |
+
## RPC Actions
|
| 23 |
|
| 24 |
+
- `sin.code.ai.health`: AI engineer readiness check.
|
| 25 |
+
- `sin.code.ai.rag.generate`: Generate RAG pipeline code from requirements.
|
| 26 |
+
- `sin.code.ai.prompt.generate`: Generate structured prompt templates.
|
| 27 |
+
- `sin.code.ai.mcp.generate`: Generate OpenCode MCP tool definitions.
|
| 28 |
+
- `sin.code.ai.review`: Audit existing AI implementations against 2026 best practices.
|
| 29 |
|
| 30 |
+
## Data & Transport
|
|
|
|
|
|
|
| 31 |
|
| 32 |
+
JSON-RPC over HTTP. Strict OpenCode execution via openai/gpt-5.4.
|
|
|
|
|
|
|
|
|
|
|
|
AGENTS.md
CHANGED
|
@@ -4,94 +4,13 @@
|
|
| 4 |
- Team Manager: SIN-Coding-CEO
|
| 5 |
- Slug: sin-code-ai
|
| 6 |
- Repo: https://github.com/Delqhi/sin-code-ai
|
| 7 |
-
-
|
| 8 |
-
- Dedicated Docs Child-Tab: pending dedicated child-tab under `Team - Coding` (`tabId: t.71rk0lld8zkq`)
|
| 9 |
-
|
| 10 |
-
## 🚨 LLM-AUFRUF PFLICHT-ARCHITEKTUR (ABSOLUT, KEINE AUSNAHMEN)
|
| 11 |
-
|
| 12 |
-
**JEDER A2A Agent ruft LLMs AUSSCHLIESSLICH über die `opencode` CLI auf — NIEMALS über direkte API-Calls!**
|
| 13 |
-
|
| 14 |
-
```python
|
| 15 |
-
import subprocess, json
|
| 16 |
-
|
| 17 |
-
def call_llm(prompt: str, timeout: int = 120) -> str:
|
| 18 |
-
result = subprocess.run(
|
| 19 |
-
["opencode", "run", prompt, "--format", "json"],
|
| 20 |
-
capture_output=True, text=True, timeout=timeout,
|
| 21 |
-
)
|
| 22 |
-
parts = []
|
| 23 |
-
for line in result.stdout.splitlines():
|
| 24 |
-
try:
|
| 25 |
-
ev = json.loads(line)
|
| 26 |
-
if ev.get("type") == "text":
|
| 27 |
-
parts.append(ev.get("part", {}).get("text", ""))
|
| 28 |
-
except json.JSONDecodeError:
|
| 29 |
-
pass
|
| 30 |
-
return "".join(parts).strip()
|
| 31 |
-
```
|
| 32 |
-
|
| 33 |
-
**WARUM:** `opencode run --format json` nutzt das Antigravity Plugin (identisch auf Mac UND OCI VM). Der OCI-Proxy (`http://92.5.60.87:4100/v1`) ist NUR für opencode intern — direkte HTTP-Calls dorthin sind verboten und schlagen mit 500 fehl. Gemini API direkt = PERMANENT VERBOTEN.
|
| 34 |
-
|
| 35 |
-
**MODELL:** opencode wählt automatisch `openai/gpt-5.4` via Antigravity — kein `--model` Flag nötig.
|
| 36 |
|
| 37 |
Arbeitsregel:
|
| 38 |
-
- Jede neue Action muss in `runtime.ts`, `mcp-server.ts`
|
| 39 |
-
- Kein neuer Agent gilt als fertig, wenn Card, Dashboard-Registry und
|
| 40 |
-
- Jeder neue Agent muss auch `agent.json`, `AGENTS.md`, `mcp-config.json`
|
| 41 |
-
-
|
| 42 |
-
-
|
| 43 |
-
-
|
| 44 |
-
-
|
| 45 |
-
- Jeder Team-Haupt-Tab enthaelt nur seine synchronisierte Team-Tabelle; dieselbe Tabelle wird im `Silicon Workforce`-Tab mit sichtbarer Trennlinie zwischen Team-Sektionen gespiegelt.
|
| 46 |
-
- Pflichtfelder fuer neue A2A-Agenten:
|
| 47 |
-
- Identitaet, Team, Team-Manager, Zweck, Verwendung
|
| 48 |
-
- Auth-/Secrets-Modell
|
| 49 |
-
- MCP-Tools und A2A-Actions/Skills
|
| 50 |
-
- Commands, Endpoints, Capabilities, Input/Output-Modi
|
| 51 |
-
- Task-Lifecycle, Observability/Audit, Release/Rollback
|
| 52 |
-
- Owner/Oncall, Dependencies, Deploy-Ziel
|
| 53 |
-
- Pflichtintegration:
|
| 54 |
-
- repo `.opencode/opencode.json`
|
| 55 |
-
- globale OpenCode-MCP-Integration falls benoetigt
|
| 56 |
-
- Dashboard-/Workforce-Registry + Detailseite `dashboard-enterprise/app/agents/<slug>/page.tsx`
|
| 57 |
-
- `a2a.delqhi.com` Landing/Card
|
| 58 |
-
- `npm run sync:a2a:control-plane-projection` nach Registry-Aenderungen
|
| 59 |
-
- Google Docs Child-Tab + Team-Tabellen
|
| 60 |
-
- `cloudflared/config.example.yml`, wenn der Agent eine oeffentliche Runtime / einen Tunnel bekommen soll
|
| 61 |
-
- echte Runtime-Provisionierung + echter Publish/Deploy-Schritt, sobald oeffentliche URLs/HF/tunnel eingetragen werden
|
| 62 |
-
- `scripts/complete-install.sh` und `scripts/hf_pull_script.py` fuer HF-/deploybare Agents
|
| 63 |
-
- Control-Plane-/Capability-Metadaten in `agent.json`
|
| 64 |
-
- Falls der benoetigte Google-Docs-Child-Tab noch nicht existiert, muss er zuerst manuell im Google-Docs-UI erstellt werden. Die Docs-API kann bestehende Tabs pflegen, aber keine neuen Child-Tabs erzeugen.
|
| 65 |
-
- Pflichtvalidierung vor Done:
|
| 66 |
-
- Build/Typecheck
|
| 67 |
-
- A2A health/card/rpc
|
| 68 |
-
- MCP smoke
|
| 69 |
-
- relevante Repo-Gates
|
| 70 |
-
- OpenCode-Integration
|
| 71 |
-
- Google-Docs-Sync
|
| 72 |
-
- `npm --prefix <agent-root> run build`
|
| 73 |
-
- `node <agent-root>/dist/src/cli.js print-card`
|
| 74 |
-
- `node <agent-root>/dist/src/cli.js run-action '{"action":"agent.help"}'`
|
| 75 |
-
- `node <agent-root>/dist/src/cli.js run-action '{"action":"<namespace>.health"}'` anhand der echten Skill-ID aus der Card
|
| 76 |
-
- `serve-mcp` bleibt mit offenem stdin erreichbar
|
| 77 |
-
- `npm run test:a2a:fleet`
|
| 78 |
-
- `npm run test:a2a:live -- --agent <slug>`
|
| 79 |
-
- Landing / `publicPageUrl` liefert `200`
|
| 80 |
-
- Runtime-Host ist real provisioniert
|
| 81 |
-
- `/.well-known/agent-card.json` liefert `200`
|
| 82 |
-
- `/a2a/v1` liefert nicht `404`
|
| 83 |
-
- Ein Agent darf erst auf `ready` / `live` gesetzt werden, wenn diese Reachability-Pruefungen bestanden sind und Registry/Card/Docs denselben auditieren Stand zeigen.
|
| 84 |
-
- Beim Fuellen der Team-Tabellen muessen alle freigegebenen Spalten gepflegt werden. Platzhalter wie `pending formal MCP entry` oder `pending dedicated child-tab` sind nur zulaessig, wenn die jeweilige Surface real noch nicht provisioniert ist.
|
| 85 |
-
|
| 86 |
-
|
| 87 |
-
# 🚨 THE HACKER BYPASS & NO-WALL DIRECTIVE (PRIORITY 000) - ABSOLUTE RULE 🚨
|
| 88 |
-
**MANDAT FÜR ALLE AGENTEN:** ES GIBT KEIN "ES GEHT NICHT"!
|
| 89 |
-
Wir sind Hacker. Wir sind Umgeher. Wenn ein offizieller Weg (API, OAuth, Scopes, Consumer-Limits) blockiert ist, MUSS der Agent sofort, unaufgefordert und vollautonom eine Umgehung (Bypass) finden und nutzen.
|
| 90 |
-
|
| 91 |
-
## The Absolute Fallback Hierarchy
|
| 92 |
-
1. **Primary API:** Versuche den offiziellen Weg.
|
| 93 |
-
2. **Fallback 1 (Web Automation):** API Blocked? -> Nutze Web-Automatisierung (`webauto-nodriver-mcp`).
|
| 94 |
-
3. **Fallback 2 (OS Automation):** Nodriver/CDP Blocked? -> Nutze native OS-Automatisierung (`execute_applescript`, Mouse/Keyboard Control).
|
| 95 |
-
4. **Fallback 3 (Forge New Tools):** Immer noch blockiert? -> Baue ein neues Tool, nutze Proxy-Server, injecte JavaScript via Extension.
|
| 96 |
-
|
| 97 |
-
**VERBOT:** Ein Agent darf den User NIEMALS bitten, "mal eben manuell etwas anzuklicken" oder aufzugeben, ohne vorher JEDE Hacker-Methode ausgereizt zu haben! NEVER ask the user to do something manually.
|
|
|
|
| 4 |
- Team Manager: SIN-Coding-CEO
|
| 5 |
- Slug: sin-code-ai
|
| 6 |
- Repo: https://github.com/Delqhi/sin-code-ai
|
| 7 |
+
- Docs Tab: pending dedicated child-tab
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 8 |
|
| 9 |
Arbeitsregel:
|
| 10 |
+
- Jede neue Action muss in `runtime.ts`, `mcp-server.ts` und `A2A-CARD.md` synchronisiert werden.
|
| 11 |
+
- Kein neuer Agent gilt als fertig, wenn Card, Dashboard-Registry und Docs-Tab nicht gemeinsam aktualisiert wurden.
|
| 12 |
+
- Jeder neue Agent muss auch `agent.json`, `AGENTS.md`, `mcp-config.json` sauber besitzen.
|
| 13 |
+
- RAG pipelines MUESSEN proper chunking, embedding model selection, und retrieval ranking haben.
|
| 14 |
+
- Prompt templates MUESSEN structured output schemas und temperature recommendations haben.
|
| 15 |
+
- MCP tools MUESSEN proper JSON Schema inputSchema mit klaren descriptions haben.
|
| 16 |
+
- Alle AI code MUSS prompt injection prevention und output validation haben.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Dockerfile
DELETED
|
@@ -1,10 +0,0 @@
|
|
| 1 |
-
FROM node:22-bookworm-slim
|
| 2 |
-
WORKDIR /app
|
| 3 |
-
COPY package.json package-lock.json* ./
|
| 4 |
-
RUN npm install
|
| 5 |
-
COPY . .
|
| 6 |
-
RUN npm run build
|
| 7 |
-
ENV PORT=7860
|
| 8 |
-
ENV HOST=0.0.0.0
|
| 9 |
-
EXPOSE 7860
|
| 10 |
-
CMD ["node", "dist/src/cli.js", "serve-a2a"]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
README.md
DELETED
|
@@ -1,74 +0,0 @@
|
|
| 1 |
-
---
|
| 2 |
-
title: SIN-Code-AI
|
| 3 |
-
emoji: "🤖"
|
| 4 |
-
colorFrom: blue
|
| 5 |
-
colorTo: indigo
|
| 6 |
-
sdk: docker
|
| 7 |
-
app_port: 7860
|
| 8 |
-
pinned: false
|
| 9 |
-
---
|
| 10 |
-
|
| 11 |
-
# SIN-Code-AI
|
| 12 |
-
|
| 13 |
-
`SIN-Code-AI` is a SIN A2A agent package for the Silicon Workforce.
|
| 14 |
-
|
| 15 |
-
## Identity
|
| 16 |
-
|
| 17 |
-
- Slug: `sin-code-ai`
|
| 18 |
-
- Team: `Team - Coding`
|
| 19 |
-
- Team Manager: `SIN-Coding-CEO`
|
| 20 |
-
- Purpose: Elite 2026 AI Engineering Architect. Architects and implements RAG pipelines, prompt templates, semantic search, OpenCode MCP tools, and AI-native application logic.
|
| 21 |
-
- Usage: Use for designing LLM prompts, implementing local and cloud-based AI pipelines, writing semantic search logic, building RAG architectures, and authoring OpenCode skills/tools.
|
| 22 |
-
- Primary Model: `openai/gpt-5.4`
|
| 23 |
-
|
| 24 |
-
## Deployment
|
| 25 |
-
|
| 26 |
-
- Local path: `/Users/jeremy/dev/OpenSIN-backend/a2a/team-coding/A2A-SIN-Code-AI`
|
| 27 |
-
- GitHub repo: `https://github.com/Delqhi/sin-code-ai`
|
| 28 |
-
- Deployment status: `structural-only scaffold; HF runtime, landing page, and public A2A endpoint are not live yet`
|
| 29 |
-
- Workforce index: `https://a2a.delqhi.com`
|
| 30 |
-
- Landing page: `https://delqhi-sin-code-ai.hf.space`
|
| 31 |
-
- Public A2A / CIMD: `https://a2a.delqhi.com/agents/sin-code-ai`
|
| 32 |
-
- Hugging Face Space: `https://huggingface.co/spaces/delqhi/sin-code-ai`
|
| 33 |
-
- Hugging Face repo id: `delqhi/sin-code-ai`
|
| 34 |
-
- Cloudflare tunnel: `sin-code-ai`
|
| 35 |
-
- Runtime target: `Hugging Face Space free CPU VM`
|
| 36 |
-
- Google Docs root: `https://docs.google.com/document/d/1RtoHn4I0GntuEEOHHkqoh_dMuGzgMwQz7_8oxAOpQbw/edit`
|
| 37 |
-
- Google Docs child-tab: `pending dedicated child-tab under Team - Coding (tabId: t.71rk0lld8zkq)`
|
| 38 |
-
|
| 39 |
-
## Runtime Shape
|
| 40 |
-
|
| 41 |
-
- A2A JSON-RPC runtime
|
| 42 |
-
- MCP stdio runtime
|
| 43 |
-
- CLI wrapper for local and automated use
|
| 44 |
-
- publish-ready Docker/Hugging Face Space layout
|
| 45 |
-
|
| 46 |
-
## A2A Surface
|
| 47 |
-
|
| 48 |
-
- Card: `GET /.well-known/agent-card.json`
|
| 49 |
-
- Alias: `GET /.well-known/agent.json`
|
| 50 |
-
- Health: `GET /health`
|
| 51 |
-
- RPC: `POST /a2a/v1`
|
| 52 |
-
|
| 53 |
-
## MCP Surface
|
| 54 |
-
|
| 55 |
-
- Transport: `stdio`
|
| 56 |
-
- Config: `./mcp-config.json`
|
| 57 |
-
- OpenCode client: `./clients/opencode-mcp.json`
|
| 58 |
-
- Codex client: `./clients/codex-config.toml`
|
| 59 |
-
|
| 60 |
-
## Local Commands
|
| 61 |
-
|
| 62 |
-
```bash
|
| 63 |
-
sin-code-ai serve-a2a
|
| 64 |
-
sin-code-ai serve-mcp
|
| 65 |
-
sin-code-ai print-card
|
| 66 |
-
sin-code-ai run-action '{"action":"agent.help"}'
|
| 67 |
-
sin-code-ai run-action '{"action":"sin.code.ai.health"}'
|
| 68 |
-
```
|
| 69 |
-
|
| 70 |
-
## Publication Notes
|
| 71 |
-
|
| 72 |
-
- This package is Docker/Hugging Face Space ready via the repository `Dockerfile`.
|
| 73 |
-
- The standalone GitHub repo should contain the same contents as this directory root.
|
| 74 |
-
- Remote publication is only complete after landing, agent card, and A2A endpoint reachability are verified with the live audit.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
agent-spec.example.json
DELETED
|
@@ -1,21 +0,0 @@
|
|
| 1 |
-
{
|
| 2 |
-
"slug": "sin-example",
|
| 3 |
-
"name": "SIN-Example",
|
| 4 |
-
"teamSlug": "team-infratructur",
|
| 5 |
-
"teamName": "Team - Infrastructure",
|
| 6 |
-
"teamManager": "SIN-Server",
|
| 7 |
-
"description": "Example SIN A2A agent scaffold.",
|
| 8 |
-
"usage": "Use when an example A2A agent is needed.",
|
| 9 |
-
"primaryModel": "nvidia/example-model",
|
| 10 |
-
"repoUrl": "https://github.com/delqhi/sin-example",
|
| 11 |
-
"repoVisibility": "private",
|
| 12 |
-
"googleDocUrl": "https://docs.google.com/document/d/<doc>/edit",
|
| 13 |
-
"googleDocId": "<doc>",
|
| 14 |
-
"publicPageUrl": "https://a2a.delqhi.com/agents/sin-example",
|
| 15 |
-
"landingPageUrl": "https://delqhi-sin-example.hf.space",
|
| 16 |
-
"hfSpaceUrl": "https://huggingface.co/spaces/delqhi/sin-example",
|
| 17 |
-
"cloudflareTunnel": "sin-example",
|
| 18 |
-
"vmServer": "Hugging Face Space free CPU VM",
|
| 19 |
-
"publicBaseUrl": "http://127.0.0.1:45999",
|
| 20 |
-
"port": 45999
|
| 21 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
agent.json
CHANGED
|
@@ -1,15 +1,15 @@
|
|
| 1 |
{
|
| 2 |
"id": "sin-code-ai",
|
| 3 |
-
"displayName": "SIN-Code-AI",
|
| 4 |
"team": "team-coding",
|
| 5 |
"description": "Elite 2026 AI Engineering Architect. Architects and implements RAG pipelines, prompt templates, semantic search, OpenCode MCP tools, and AI-native application logic.",
|
| 6 |
-
"version": "2026.03.
|
| 7 |
"deployment": {
|
| 8 |
"workforceIndex": "https://a2a.delqhi.com",
|
| 9 |
-
"landingPage": "https://delqhi
|
| 10 |
"publicA2A": "https://a2a.delqhi.com/agents/sin-code-ai",
|
| 11 |
-
"cimdAnchor": "https://delqhi
|
| 12 |
-
"vmServer": "Hugging Face Space free CPU VM"
|
| 13 |
},
|
| 14 |
"a2a": {
|
| 15 |
"wellKnownCard": "/.well-known/agent-card.json",
|
|
@@ -23,21 +23,7 @@
|
|
| 23 |
"marketplace": {
|
| 24 |
"pricingModel": "enterprise_tier",
|
| 25 |
"monthlyPrice": 4999,
|
| 26 |
-
"purchaseModes": [
|
| 27 |
-
"subscription",
|
| 28 |
-
"lifetime_alpha"
|
| 29 |
-
],
|
| 30 |
"category": "Elite Coding / AI & Machine Learning"
|
| 31 |
-
}
|
| 32 |
-
"controlPlane": {
|
| 33 |
-
"projectionMode": "control-plane-first",
|
| 34 |
-
"capabilityRegistry": "control_plane.capabilities",
|
| 35 |
-
"worldModel": "control_plane.world_edges",
|
| 36 |
-
"memoryPlane": "memory_plane.items",
|
| 37 |
-
"artifactPolicy": "control_plane.artifact_refs",
|
| 38 |
-
"executorContract": "services/workers/hf_executor_contract.json",
|
| 39 |
-
"consumerAuthScript": "./scripts/hf_pull_script.py",
|
| 40 |
-
"completeInstallScript": "./scripts/complete-install.sh"
|
| 41 |
-
},
|
| 42 |
-
"primaryModel": "openai/gpt-5.4"
|
| 43 |
}
|
|
|
|
| 1 |
{
|
| 2 |
"id": "sin-code-ai",
|
| 3 |
+
"displayName": "A2A-SIN-Code-AI (CEO Elite AI Engineer)",
|
| 4 |
"team": "team-coding",
|
| 5 |
"description": "Elite 2026 AI Engineering Architect. Architects and implements RAG pipelines, prompt templates, semantic search, OpenCode MCP tools, and AI-native application logic.",
|
| 6 |
+
"version": "2026.03.22",
|
| 7 |
"deployment": {
|
| 8 |
"workforceIndex": "https://a2a.delqhi.com",
|
| 9 |
+
"landingPage": "https://a2a.delqhi.com/agents/sin-code-ai",
|
| 10 |
"publicA2A": "https://a2a.delqhi.com/agents/sin-code-ai",
|
| 11 |
+
"cimdAnchor": "https://a2a.delqhi.com/agents/sin-code-ai",
|
| 12 |
+
"vmServer": "Target: Hugging Face Space free CPU VM"
|
| 13 |
},
|
| 14 |
"a2a": {
|
| 15 |
"wellKnownCard": "/.well-known/agent-card.json",
|
|
|
|
| 23 |
"marketplace": {
|
| 24 |
"pricingModel": "enterprise_tier",
|
| 25 |
"monthlyPrice": 4999,
|
| 26 |
+
"purchaseModes": ["subscription", "lifetime_alpha"],
|
|
|
|
|
|
|
|
|
|
| 27 |
"category": "Elite Coding / AI & Machine Learning"
|
| 28 |
+
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 29 |
}
|
clients/codex-config.toml
DELETED
|
@@ -1,6 +0,0 @@
|
|
| 1 |
-
# Placeholder client config for SIN-Code-AI
|
| 2 |
-
|
| 3 |
-
[agent]
|
| 4 |
-
name = "SIN-Code-AI"
|
| 5 |
-
endpoint = "http://127.0.0.1:46013/a2a/v1"
|
| 6 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
clients/opencode-mcp.json
DELETED
|
@@ -1,8 +0,0 @@
|
|
| 1 |
-
{
|
| 2 |
-
"mcpServers": {
|
| 3 |
-
"sin-code-ai": {
|
| 4 |
-
"command": "bin/sin-code-ai",
|
| 5 |
-
"args": ["serve-mcp"]
|
| 6 |
-
}
|
| 7 |
-
}
|
| 8 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
cloudflared/config.example.yml
DELETED
|
@@ -1,6 +0,0 @@
|
|
| 1 |
-
tunnel: sin-code-ai
|
| 2 |
-
credentials-file: /etc/cloudflared/sin-code-ai.json
|
| 3 |
-
ingress:
|
| 4 |
-
- hostname: sin-code-ai.delqhi.com
|
| 5 |
-
service: http://127.0.0.1:7860
|
| 6 |
-
- service: http_status:404
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mcp-config.json
CHANGED
|
@@ -2,7 +2,10 @@
|
|
| 2 |
"mcpServers": {
|
| 3 |
"sin-code-ai": {
|
| 4 |
"command": "node",
|
| 5 |
-
"args": [
|
|
|
|
|
|
|
|
|
|
| 6 |
}
|
| 7 |
}
|
| 8 |
}
|
|
|
|
| 2 |
"mcpServers": {
|
| 3 |
"sin-code-ai": {
|
| 4 |
"command": "node",
|
| 5 |
+
"args": [
|
| 6 |
+
"dist/src/cli.js",
|
| 7 |
+
"serve-mcp"
|
| 8 |
+
]
|
| 9 |
}
|
| 10 |
}
|
| 11 |
}
|
n8n-workflows/docs-sync.json
DELETED
|
@@ -1,39 +0,0 @@
|
|
| 1 |
-
{
|
| 2 |
-
"name": "Auto-Sync Connector Docs to Dedicated Supabase DB",
|
| 3 |
-
"nodes": [
|
| 4 |
-
{
|
| 5 |
-
"parameters": {
|
| 6 |
-
"rule": { "interval": [{ "field": "days" }] }
|
| 7 |
-
},
|
| 8 |
-
"name": "Daily Trigger",
|
| 9 |
-
"type": "n8n-nodes-base.scheduleTrigger",
|
| 10 |
-
"typeVersion": 1,
|
| 11 |
-
"position": [250, 300]
|
| 12 |
-
},
|
| 13 |
-
{
|
| 14 |
-
"parameters": {
|
| 15 |
-
"url": "={{$json.connectorDocsUrl}}"
|
| 16 |
-
},
|
| 17 |
-
"name": "Scrape Official Docs",
|
| 18 |
-
"type": "n8n-nodes-base.httpRequest",
|
| 19 |
-
"typeVersion": 4.1,
|
| 20 |
-
"position": [450, 300]
|
| 21 |
-
},
|
| 22 |
-
{
|
| 23 |
-
"parameters": {
|
| 24 |
-
"tableName": "connector_knowledge_vectors",
|
| 25 |
-
"operation": "upsert"
|
| 26 |
-
},
|
| 27 |
-
"name": "Supabase Vector Store (Dedicated DB)",
|
| 28 |
-
"type": "@n8n/n8n-nodes-langchain.vectorStoreSupabase",
|
| 29 |
-
"typeVersion": 1,
|
| 30 |
-
"position": [650, 300]
|
| 31 |
-
}
|
| 32 |
-
],
|
| 33 |
-
"connections": {
|
| 34 |
-
"Daily Trigger": { "main": [ [ { "node": "Scrape Official Docs", "type": "main", "index": 0 } ] ] },
|
| 35 |
-
"Scrape Official Docs": { "main": [ [ { "node": "Supabase Vector Store (Dedicated DB)", "type": "main", "index": 0 } ] ] }
|
| 36 |
-
},
|
| 37 |
-
"active": false,
|
| 38 |
-
"settings": {}
|
| 39 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
package-lock.json
DELETED
|
@@ -1,2102 +0,0 @@
|
|
| 1 |
-
{
|
| 2 |
-
"name": "@opensin-backend/sin-code-ai",
|
| 3 |
-
"version": "0.1.0",
|
| 4 |
-
"lockfileVersion": 3,
|
| 5 |
-
"requires": true,
|
| 6 |
-
"packages": {
|
| 7 |
-
"": {
|
| 8 |
-
"name": "@opensin-backend/sin-code-ai",
|
| 9 |
-
"version": "0.1.0",
|
| 10 |
-
"dependencies": {
|
| 11 |
-
"@huggingface/hub": "^0.15.1",
|
| 12 |
-
"@langchain/core": "^1.1.36",
|
| 13 |
-
"@langchain/langgraph": "^1.2.5",
|
| 14 |
-
"@langchain/openai": "^1.3.0",
|
| 15 |
-
"@modelcontextprotocol/sdk": "latest",
|
| 16 |
-
"@supabase/supabase-js": "^2.39.7",
|
| 17 |
-
"jsonwebtoken": "^9.0.2",
|
| 18 |
-
"node-cron": "^3.0.3",
|
| 19 |
-
"tar": "^6.2.0",
|
| 20 |
-
"zod": "^3.25.76"
|
| 21 |
-
},
|
| 22 |
-
"bin": {
|
| 23 |
-
"sin-code-ai": "dist/src/cli.js"
|
| 24 |
-
},
|
| 25 |
-
"devDependencies": {
|
| 26 |
-
"@types/jsonwebtoken": "^9.0.10",
|
| 27 |
-
"@types/node": "^24.3.0",
|
| 28 |
-
"@types/node-cron": "^3.0.11",
|
| 29 |
-
"@types/tar": "^6.1.11",
|
| 30 |
-
"typescript": "^5.9.3"
|
| 31 |
-
}
|
| 32 |
-
},
|
| 33 |
-
"node_modules/@cfworker/json-schema": {
|
| 34 |
-
"version": "4.1.1",
|
| 35 |
-
"resolved": "https://registry.npmjs.org/@cfworker/json-schema/-/json-schema-4.1.1.tgz",
|
| 36 |
-
"integrity": "sha512-gAmrUZSGtKc3AiBL71iNWxDsyUC5uMaKKGdvzYsBoTW/xi42JQHl7eKV2OYzCUqvc+D2RCcf7EXY2iCyFIk6og==",
|
| 37 |
-
"license": "MIT"
|
| 38 |
-
},
|
| 39 |
-
"node_modules/@hono/node-server": {
|
| 40 |
-
"version": "1.19.11",
|
| 41 |
-
"resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.11.tgz",
|
| 42 |
-
"integrity": "sha512-dr8/3zEaB+p0D2n/IUrlPF1HZm586qgJNXK1a9fhg/PzdtkK7Ksd5l312tJX2yBuALqDYBlG20QEbayqPyxn+g==",
|
| 43 |
-
"license": "MIT",
|
| 44 |
-
"engines": {
|
| 45 |
-
"node": ">=18.14.1"
|
| 46 |
-
},
|
| 47 |
-
"peerDependencies": {
|
| 48 |
-
"hono": "^4"
|
| 49 |
-
}
|
| 50 |
-
},
|
| 51 |
-
"node_modules/@huggingface/hub": {
|
| 52 |
-
"version": "0.15.2",
|
| 53 |
-
"resolved": "https://registry.npmjs.org/@huggingface/hub/-/hub-0.15.2.tgz",
|
| 54 |
-
"integrity": "sha512-MKu7RTkEBp8tvn0ZhBIjQwC1CHA+q8rzTYXAVklOTJEo/SZwCewVL+IcEuj4CoA5DnJ1IhyjkBquxN2dFVnEHg==",
|
| 55 |
-
"license": "MIT",
|
| 56 |
-
"dependencies": {
|
| 57 |
-
"@huggingface/tasks": "^0.12.1"
|
| 58 |
-
},
|
| 59 |
-
"engines": {
|
| 60 |
-
"node": ">=18"
|
| 61 |
-
}
|
| 62 |
-
},
|
| 63 |
-
"node_modules/@huggingface/tasks": {
|
| 64 |
-
"version": "0.12.30",
|
| 65 |
-
"resolved": "https://registry.npmjs.org/@huggingface/tasks/-/tasks-0.12.30.tgz",
|
| 66 |
-
"integrity": "sha512-A1ITdxbEzx9L8wKR8pF7swyrTLxWNDFIGDLUWInxvks2ruQ8PLRBZe8r0EcjC3CDdtlj9jV1V4cgV35K/iy3GQ==",
|
| 67 |
-
"license": "MIT"
|
| 68 |
-
},
|
| 69 |
-
"node_modules/@langchain/core": {
|
| 70 |
-
"version": "1.1.36",
|
| 71 |
-
"resolved": "https://registry.npmjs.org/@langchain/core/-/core-1.1.36.tgz",
|
| 72 |
-
"integrity": "sha512-9NWsdzU3uZD13lJwunXK0t6SIwew+UwcbHggW5yUdaiMmzKeNkDpp1lRD6p49N8+D0Vv4qmQBEKB4Ukh2jfnvw==",
|
| 73 |
-
"license": "MIT",
|
| 74 |
-
"dependencies": {
|
| 75 |
-
"@cfworker/json-schema": "^4.0.2",
|
| 76 |
-
"@standard-schema/spec": "^1.1.0",
|
| 77 |
-
"ansi-styles": "^5.0.0",
|
| 78 |
-
"camelcase": "6",
|
| 79 |
-
"decamelize": "1.2.0",
|
| 80 |
-
"js-tiktoken": "^1.0.12",
|
| 81 |
-
"langsmith": ">=0.5.0 <1.0.0",
|
| 82 |
-
"mustache": "^4.2.0",
|
| 83 |
-
"p-queue": "^6.6.2",
|
| 84 |
-
"uuid": "^11.1.0",
|
| 85 |
-
"zod": "^3.25.76 || ^4"
|
| 86 |
-
},
|
| 87 |
-
"engines": {
|
| 88 |
-
"node": ">=20"
|
| 89 |
-
}
|
| 90 |
-
},
|
| 91 |
-
"node_modules/@langchain/langgraph": {
|
| 92 |
-
"version": "1.2.5",
|
| 93 |
-
"resolved": "https://registry.npmjs.org/@langchain/langgraph/-/langgraph-1.2.5.tgz",
|
| 94 |
-
"integrity": "sha512-O/ROF1oaXN7VK6+WTpXsDvJp7L+YyTOHa9rt3L85jrvwxBqQQRIlRLOWT8ehB/ywE3M1K7WAWOAXbmorCYzviQ==",
|
| 95 |
-
"license": "MIT",
|
| 96 |
-
"dependencies": {
|
| 97 |
-
"@langchain/langgraph-checkpoint": "^1.0.1",
|
| 98 |
-
"@langchain/langgraph-sdk": "~1.8.0",
|
| 99 |
-
"@standard-schema/spec": "1.1.0",
|
| 100 |
-
"uuid": "^10.0.0"
|
| 101 |
-
},
|
| 102 |
-
"engines": {
|
| 103 |
-
"node": ">=18"
|
| 104 |
-
},
|
| 105 |
-
"peerDependencies": {
|
| 106 |
-
"@langchain/core": "^1.1.16",
|
| 107 |
-
"zod": "^3.25.32 || ^4.2.0",
|
| 108 |
-
"zod-to-json-schema": "^3.x"
|
| 109 |
-
},
|
| 110 |
-
"peerDependenciesMeta": {
|
| 111 |
-
"zod-to-json-schema": {
|
| 112 |
-
"optional": true
|
| 113 |
-
}
|
| 114 |
-
}
|
| 115 |
-
},
|
| 116 |
-
"node_modules/@langchain/langgraph-checkpoint": {
|
| 117 |
-
"version": "1.0.1",
|
| 118 |
-
"resolved": "https://registry.npmjs.org/@langchain/langgraph-checkpoint/-/langgraph-checkpoint-1.0.1.tgz",
|
| 119 |
-
"integrity": "sha512-HM0cJLRpIsSlWBQ/xuDC67l52SqZ62Bh2Y61DX+Xorqwoh5e1KxYvfCD7GnSTbWWhjBOutvnR0vPhu4orFkZfw==",
|
| 120 |
-
"license": "MIT",
|
| 121 |
-
"dependencies": {
|
| 122 |
-
"uuid": "^10.0.0"
|
| 123 |
-
},
|
| 124 |
-
"engines": {
|
| 125 |
-
"node": ">=18"
|
| 126 |
-
},
|
| 127 |
-
"peerDependencies": {
|
| 128 |
-
"@langchain/core": "^1.0.1"
|
| 129 |
-
}
|
| 130 |
-
},
|
| 131 |
-
"node_modules/@langchain/langgraph-checkpoint/node_modules/uuid": {
|
| 132 |
-
"version": "10.0.0",
|
| 133 |
-
"resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz",
|
| 134 |
-
"integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==",
|
| 135 |
-
"funding": [
|
| 136 |
-
"https://github.com/sponsors/broofa",
|
| 137 |
-
"https://github.com/sponsors/ctavan"
|
| 138 |
-
],
|
| 139 |
-
"license": "MIT",
|
| 140 |
-
"bin": {
|
| 141 |
-
"uuid": "dist/bin/uuid"
|
| 142 |
-
}
|
| 143 |
-
},
|
| 144 |
-
"node_modules/@langchain/langgraph-sdk": {
|
| 145 |
-
"version": "1.8.0",
|
| 146 |
-
"resolved": "https://registry.npmjs.org/@langchain/langgraph-sdk/-/langgraph-sdk-1.8.0.tgz",
|
| 147 |
-
"integrity": "sha512-TPowjgfLjRll4zUDiOUVgd8qLgSOhy5uHt0sWhpvxgQd+dcUs4x/3nKjrepSvmp24KQKbF6GJy6MaHBDj3Ubtw==",
|
| 148 |
-
"license": "MIT",
|
| 149 |
-
"dependencies": {
|
| 150 |
-
"@types/json-schema": "^7.0.15",
|
| 151 |
-
"p-queue": "^9.0.1",
|
| 152 |
-
"p-retry": "^7.1.1",
|
| 153 |
-
"uuid": "^13.0.0"
|
| 154 |
-
},
|
| 155 |
-
"peerDependencies": {
|
| 156 |
-
"@langchain/core": "^1.1.16",
|
| 157 |
-
"react": "^18 || ^19",
|
| 158 |
-
"react-dom": "^18 || ^19",
|
| 159 |
-
"svelte": "^4.0.0 || ^5.0.0",
|
| 160 |
-
"vue": "^3.0.0"
|
| 161 |
-
},
|
| 162 |
-
"peerDependenciesMeta": {
|
| 163 |
-
"@langchain/core": {
|
| 164 |
-
"optional": true
|
| 165 |
-
},
|
| 166 |
-
"react": {
|
| 167 |
-
"optional": true
|
| 168 |
-
},
|
| 169 |
-
"react-dom": {
|
| 170 |
-
"optional": true
|
| 171 |
-
},
|
| 172 |
-
"svelte": {
|
| 173 |
-
"optional": true
|
| 174 |
-
},
|
| 175 |
-
"vue": {
|
| 176 |
-
"optional": true
|
| 177 |
-
}
|
| 178 |
-
}
|
| 179 |
-
},
|
| 180 |
-
"node_modules/@langchain/langgraph-sdk/node_modules/eventemitter3": {
|
| 181 |
-
"version": "5.0.4",
|
| 182 |
-
"resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz",
|
| 183 |
-
"integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==",
|
| 184 |
-
"license": "MIT"
|
| 185 |
-
},
|
| 186 |
-
"node_modules/@langchain/langgraph-sdk/node_modules/p-queue": {
|
| 187 |
-
"version": "9.1.0",
|
| 188 |
-
"resolved": "https://registry.npmjs.org/p-queue/-/p-queue-9.1.0.tgz",
|
| 189 |
-
"integrity": "sha512-O/ZPaXuQV29uSLbxWBGGZO1mCQXV2BLIwUr59JUU9SoH76mnYvtms7aafH/isNSNGwuEfP6W/4xD0/TJXxrizw==",
|
| 190 |
-
"license": "MIT",
|
| 191 |
-
"dependencies": {
|
| 192 |
-
"eventemitter3": "^5.0.1",
|
| 193 |
-
"p-timeout": "^7.0.0"
|
| 194 |
-
},
|
| 195 |
-
"engines": {
|
| 196 |
-
"node": ">=20"
|
| 197 |
-
},
|
| 198 |
-
"funding": {
|
| 199 |
-
"url": "https://github.com/sponsors/sindresorhus"
|
| 200 |
-
}
|
| 201 |
-
},
|
| 202 |
-
"node_modules/@langchain/langgraph-sdk/node_modules/p-timeout": {
|
| 203 |
-
"version": "7.0.1",
|
| 204 |
-
"resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-7.0.1.tgz",
|
| 205 |
-
"integrity": "sha512-AxTM2wDGORHGEkPCt8yqxOTMgpfbEHqF51f/5fJCmwFC3C/zNcGT63SymH2ttOAaiIws2zVg4+izQCjrakcwHg==",
|
| 206 |
-
"license": "MIT",
|
| 207 |
-
"engines": {
|
| 208 |
-
"node": ">=20"
|
| 209 |
-
},
|
| 210 |
-
"funding": {
|
| 211 |
-
"url": "https://github.com/sponsors/sindresorhus"
|
| 212 |
-
}
|
| 213 |
-
},
|
| 214 |
-
"node_modules/@langchain/langgraph-sdk/node_modules/uuid": {
|
| 215 |
-
"version": "13.0.0",
|
| 216 |
-
"resolved": "https://registry.npmjs.org/uuid/-/uuid-13.0.0.tgz",
|
| 217 |
-
"integrity": "sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==",
|
| 218 |
-
"funding": [
|
| 219 |
-
"https://github.com/sponsors/broofa",
|
| 220 |
-
"https://github.com/sponsors/ctavan"
|
| 221 |
-
],
|
| 222 |
-
"license": "MIT",
|
| 223 |
-
"bin": {
|
| 224 |
-
"uuid": "dist-node/bin/uuid"
|
| 225 |
-
}
|
| 226 |
-
},
|
| 227 |
-
"node_modules/@langchain/langgraph/node_modules/uuid": {
|
| 228 |
-
"version": "10.0.0",
|
| 229 |
-
"resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz",
|
| 230 |
-
"integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==",
|
| 231 |
-
"funding": [
|
| 232 |
-
"https://github.com/sponsors/broofa",
|
| 233 |
-
"https://github.com/sponsors/ctavan"
|
| 234 |
-
],
|
| 235 |
-
"license": "MIT",
|
| 236 |
-
"bin": {
|
| 237 |
-
"uuid": "dist/bin/uuid"
|
| 238 |
-
}
|
| 239 |
-
},
|
| 240 |
-
"node_modules/@langchain/openai": {
|
| 241 |
-
"version": "1.3.0",
|
| 242 |
-
"resolved": "https://registry.npmjs.org/@langchain/openai/-/openai-1.3.0.tgz",
|
| 243 |
-
"integrity": "sha512-FDsF6xKCvFduiZcX57fL2Md+DZ+fJubcUN1iwUaEwJOQnq7zFFYj3a/KuQ7EiOFR3hEsnhPilSfxO1VW85wMZw==",
|
| 244 |
-
"license": "MIT",
|
| 245 |
-
"dependencies": {
|
| 246 |
-
"js-tiktoken": "^1.0.12",
|
| 247 |
-
"openai": "^6.27.0",
|
| 248 |
-
"zod": "^3.25.76 || ^4"
|
| 249 |
-
},
|
| 250 |
-
"engines": {
|
| 251 |
-
"node": ">=20"
|
| 252 |
-
},
|
| 253 |
-
"peerDependencies": {
|
| 254 |
-
"@langchain/core": "^1.1.33"
|
| 255 |
-
}
|
| 256 |
-
},
|
| 257 |
-
"node_modules/@modelcontextprotocol/sdk": {
|
| 258 |
-
"version": "1.27.1",
|
| 259 |
-
"resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.27.1.tgz",
|
| 260 |
-
"integrity": "sha512-sr6GbP+4edBwFndLbM60gf07z0FQ79gaExpnsjMGePXqFcSSb7t6iscpjk9DhFhwd+mTEQrzNafGP8/iGGFYaA==",
|
| 261 |
-
"license": "MIT",
|
| 262 |
-
"dependencies": {
|
| 263 |
-
"@hono/node-server": "^1.19.9",
|
| 264 |
-
"ajv": "^8.17.1",
|
| 265 |
-
"ajv-formats": "^3.0.1",
|
| 266 |
-
"content-type": "^1.0.5",
|
| 267 |
-
"cors": "^2.8.5",
|
| 268 |
-
"cross-spawn": "^7.0.5",
|
| 269 |
-
"eventsource": "^3.0.2",
|
| 270 |
-
"eventsource-parser": "^3.0.0",
|
| 271 |
-
"express": "^5.2.1",
|
| 272 |
-
"express-rate-limit": "^8.2.1",
|
| 273 |
-
"hono": "^4.11.4",
|
| 274 |
-
"jose": "^6.1.3",
|
| 275 |
-
"json-schema-typed": "^8.0.2",
|
| 276 |
-
"pkce-challenge": "^5.0.0",
|
| 277 |
-
"raw-body": "^3.0.0",
|
| 278 |
-
"zod": "^3.25 || ^4.0",
|
| 279 |
-
"zod-to-json-schema": "^3.25.1"
|
| 280 |
-
},
|
| 281 |
-
"engines": {
|
| 282 |
-
"node": ">=18"
|
| 283 |
-
},
|
| 284 |
-
"peerDependencies": {
|
| 285 |
-
"@cfworker/json-schema": "^4.1.1",
|
| 286 |
-
"zod": "^3.25 || ^4.0"
|
| 287 |
-
},
|
| 288 |
-
"peerDependenciesMeta": {
|
| 289 |
-
"@cfworker/json-schema": {
|
| 290 |
-
"optional": true
|
| 291 |
-
},
|
| 292 |
-
"zod": {
|
| 293 |
-
"optional": false
|
| 294 |
-
}
|
| 295 |
-
}
|
| 296 |
-
},
|
| 297 |
-
"node_modules/@standard-schema/spec": {
|
| 298 |
-
"version": "1.1.0",
|
| 299 |
-
"resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz",
|
| 300 |
-
"integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==",
|
| 301 |
-
"license": "MIT"
|
| 302 |
-
},
|
| 303 |
-
"node_modules/@supabase/auth-js": {
|
| 304 |
-
"version": "2.100.0",
|
| 305 |
-
"resolved": "https://registry.npmjs.org/@supabase/auth-js/-/auth-js-2.100.0.tgz",
|
| 306 |
-
"integrity": "sha512-pdT3ye3UVRN1Cg0wom6BmyY+XTtp5DiJaYnPi6j8ht5i8Lq8kfqxJMJz9GI9YDKk3w1nhGOPnh6Qz5qpyYm+1w==",
|
| 307 |
-
"license": "MIT",
|
| 308 |
-
"dependencies": {
|
| 309 |
-
"tslib": "2.8.1"
|
| 310 |
-
},
|
| 311 |
-
"engines": {
|
| 312 |
-
"node": ">=20.0.0"
|
| 313 |
-
}
|
| 314 |
-
},
|
| 315 |
-
"node_modules/@supabase/functions-js": {
|
| 316 |
-
"version": "2.100.0",
|
| 317 |
-
"resolved": "https://registry.npmjs.org/@supabase/functions-js/-/functions-js-2.100.0.tgz",
|
| 318 |
-
"integrity": "sha512-keLg79RPwP+uiwHuxFPTFgDRxPV46LM4j/swjyR2GKJgWniTVSsgiBHfbIBDcrQwehLepy09b/9QSHUywtKRWQ==",
|
| 319 |
-
"license": "MIT",
|
| 320 |
-
"dependencies": {
|
| 321 |
-
"tslib": "2.8.1"
|
| 322 |
-
},
|
| 323 |
-
"engines": {
|
| 324 |
-
"node": ">=20.0.0"
|
| 325 |
-
}
|
| 326 |
-
},
|
| 327 |
-
"node_modules/@supabase/phoenix": {
|
| 328 |
-
"version": "0.4.0",
|
| 329 |
-
"resolved": "https://registry.npmjs.org/@supabase/phoenix/-/phoenix-0.4.0.tgz",
|
| 330 |
-
"integrity": "sha512-RHSx8bHS02xwfHdAbX5Lpbo6PXbgyf7lTaXTlwtFDPwOIw64NnVRwFAXGojHhjtVYI+PEPNSWwkL90f4agN3bw==",
|
| 331 |
-
"license": "MIT"
|
| 332 |
-
},
|
| 333 |
-
"node_modules/@supabase/postgrest-js": {
|
| 334 |
-
"version": "2.100.0",
|
| 335 |
-
"resolved": "https://registry.npmjs.org/@supabase/postgrest-js/-/postgrest-js-2.100.0.tgz",
|
| 336 |
-
"integrity": "sha512-xYNvNbBJaXOGcrZ44wxwp5830uo1okMHGS8h8dm3u4f0xcZ39yzbryUsubTJW41MG2gbL/6U57cA4Pi6YMZ9pA==",
|
| 337 |
-
"license": "MIT",
|
| 338 |
-
"dependencies": {
|
| 339 |
-
"tslib": "2.8.1"
|
| 340 |
-
},
|
| 341 |
-
"engines": {
|
| 342 |
-
"node": ">=20.0.0"
|
| 343 |
-
}
|
| 344 |
-
},
|
| 345 |
-
"node_modules/@supabase/realtime-js": {
|
| 346 |
-
"version": "2.100.0",
|
| 347 |
-
"resolved": "https://registry.npmjs.org/@supabase/realtime-js/-/realtime-js-2.100.0.tgz",
|
| 348 |
-
"integrity": "sha512-2AZs00zzEF0HuCKY8grz5eCYlwEfVi5HONLZFoNR6aDfxQivl8zdQYNjyFoqN2MZiVhQHD7u6XV/xHwM8mCEHw==",
|
| 349 |
-
"license": "MIT",
|
| 350 |
-
"dependencies": {
|
| 351 |
-
"@supabase/phoenix": "^0.4.0",
|
| 352 |
-
"@types/ws": "^8.18.1",
|
| 353 |
-
"tslib": "2.8.1",
|
| 354 |
-
"ws": "^8.18.2"
|
| 355 |
-
},
|
| 356 |
-
"engines": {
|
| 357 |
-
"node": ">=20.0.0"
|
| 358 |
-
}
|
| 359 |
-
},
|
| 360 |
-
"node_modules/@supabase/storage-js": {
|
| 361 |
-
"version": "2.100.0",
|
| 362 |
-
"resolved": "https://registry.npmjs.org/@supabase/storage-js/-/storage-js-2.100.0.tgz",
|
| 363 |
-
"integrity": "sha512-d4EeuK6RNIgYNA2MU9kj8lQrLm5AzZ+WwpWjGkii6SADQNIGTC/uiaTRu02XJ5AmFALQfo8fLl9xuCkO6Xw+iQ==",
|
| 364 |
-
"license": "MIT",
|
| 365 |
-
"dependencies": {
|
| 366 |
-
"iceberg-js": "^0.8.1",
|
| 367 |
-
"tslib": "2.8.1"
|
| 368 |
-
},
|
| 369 |
-
"engines": {
|
| 370 |
-
"node": ">=20.0.0"
|
| 371 |
-
}
|
| 372 |
-
},
|
| 373 |
-
"node_modules/@supabase/supabase-js": {
|
| 374 |
-
"version": "2.100.0",
|
| 375 |
-
"resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.100.0.tgz",
|
| 376 |
-
"integrity": "sha512-r0tlcukejJXJ1m/2eG/Ya5eYs4W8AC7oZfShpG3+SIo/eIU9uIt76ZeYI1SoUwUmcmzlAbgch+HDZDR/toVQPQ==",
|
| 377 |
-
"license": "MIT",
|
| 378 |
-
"dependencies": {
|
| 379 |
-
"@supabase/auth-js": "2.100.0",
|
| 380 |
-
"@supabase/functions-js": "2.100.0",
|
| 381 |
-
"@supabase/postgrest-js": "2.100.0",
|
| 382 |
-
"@supabase/realtime-js": "2.100.0",
|
| 383 |
-
"@supabase/storage-js": "2.100.0"
|
| 384 |
-
},
|
| 385 |
-
"engines": {
|
| 386 |
-
"node": ">=20.0.0"
|
| 387 |
-
}
|
| 388 |
-
},
|
| 389 |
-
"node_modules/@types/json-schema": {
|
| 390 |
-
"version": "7.0.15",
|
| 391 |
-
"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
|
| 392 |
-
"integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
|
| 393 |
-
"license": "MIT"
|
| 394 |
-
},
|
| 395 |
-
"node_modules/@types/jsonwebtoken": {
|
| 396 |
-
"version": "9.0.10",
|
| 397 |
-
"resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.10.tgz",
|
| 398 |
-
"integrity": "sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==",
|
| 399 |
-
"dev": true,
|
| 400 |
-
"license": "MIT",
|
| 401 |
-
"dependencies": {
|
| 402 |
-
"@types/ms": "*",
|
| 403 |
-
"@types/node": "*"
|
| 404 |
-
}
|
| 405 |
-
},
|
| 406 |
-
"node_modules/@types/ms": {
|
| 407 |
-
"version": "2.1.0",
|
| 408 |
-
"resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz",
|
| 409 |
-
"integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==",
|
| 410 |
-
"dev": true,
|
| 411 |
-
"license": "MIT"
|
| 412 |
-
},
|
| 413 |
-
"node_modules/@types/node": {
|
| 414 |
-
"version": "24.12.0",
|
| 415 |
-
"resolved": "https://registry.npmjs.org/@types/node/-/node-24.12.0.tgz",
|
| 416 |
-
"integrity": "sha512-GYDxsZi3ChgmckRT9HPU0WEhKLP08ev/Yfcq2AstjrDASOYCSXeyjDsHg4v5t4jOj7cyDX3vmprafKlWIG9MXQ==",
|
| 417 |
-
"license": "MIT",
|
| 418 |
-
"dependencies": {
|
| 419 |
-
"undici-types": "~7.16.0"
|
| 420 |
-
}
|
| 421 |
-
},
|
| 422 |
-
"node_modules/@types/node-cron": {
|
| 423 |
-
"version": "3.0.11",
|
| 424 |
-
"resolved": "https://registry.npmjs.org/@types/node-cron/-/node-cron-3.0.11.tgz",
|
| 425 |
-
"integrity": "sha512-0ikrnug3/IyneSHqCBeslAhlK2aBfYek1fGo4bP4QnZPmiqSGRK+Oy7ZMisLWkesffJvQ1cqAcBnJC+8+nxIAg==",
|
| 426 |
-
"dev": true,
|
| 427 |
-
"license": "MIT"
|
| 428 |
-
},
|
| 429 |
-
"node_modules/@types/tar": {
|
| 430 |
-
"version": "6.1.13",
|
| 431 |
-
"resolved": "https://registry.npmjs.org/@types/tar/-/tar-6.1.13.tgz",
|
| 432 |
-
"integrity": "sha512-IznnlmU5f4WcGTh2ltRu/Ijpmk8wiWXfF0VA4s+HPjHZgvFggk1YaIkbo5krX/zUCzWF8N/l4+W/LNxnvAJ8nw==",
|
| 433 |
-
"dev": true,
|
| 434 |
-
"license": "MIT",
|
| 435 |
-
"dependencies": {
|
| 436 |
-
"@types/node": "*",
|
| 437 |
-
"minipass": "^4.0.0"
|
| 438 |
-
}
|
| 439 |
-
},
|
| 440 |
-
"node_modules/@types/uuid": {
|
| 441 |
-
"version": "10.0.0",
|
| 442 |
-
"resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz",
|
| 443 |
-
"integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==",
|
| 444 |
-
"license": "MIT"
|
| 445 |
-
},
|
| 446 |
-
"node_modules/@types/ws": {
|
| 447 |
-
"version": "8.18.1",
|
| 448 |
-
"resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz",
|
| 449 |
-
"integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==",
|
| 450 |
-
"license": "MIT",
|
| 451 |
-
"dependencies": {
|
| 452 |
-
"@types/node": "*"
|
| 453 |
-
}
|
| 454 |
-
},
|
| 455 |
-
"node_modules/accepts": {
|
| 456 |
-
"version": "2.0.0",
|
| 457 |
-
"resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz",
|
| 458 |
-
"integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==",
|
| 459 |
-
"license": "MIT",
|
| 460 |
-
"dependencies": {
|
| 461 |
-
"mime-types": "^3.0.0",
|
| 462 |
-
"negotiator": "^1.0.0"
|
| 463 |
-
},
|
| 464 |
-
"engines": {
|
| 465 |
-
"node": ">= 0.6"
|
| 466 |
-
}
|
| 467 |
-
},
|
| 468 |
-
"node_modules/ajv": {
|
| 469 |
-
"version": "8.18.0",
|
| 470 |
-
"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz",
|
| 471 |
-
"integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==",
|
| 472 |
-
"license": "MIT",
|
| 473 |
-
"dependencies": {
|
| 474 |
-
"fast-deep-equal": "^3.1.3",
|
| 475 |
-
"fast-uri": "^3.0.1",
|
| 476 |
-
"json-schema-traverse": "^1.0.0",
|
| 477 |
-
"require-from-string": "^2.0.2"
|
| 478 |
-
},
|
| 479 |
-
"funding": {
|
| 480 |
-
"type": "github",
|
| 481 |
-
"url": "https://github.com/sponsors/epoberezkin"
|
| 482 |
-
}
|
| 483 |
-
},
|
| 484 |
-
"node_modules/ajv-formats": {
|
| 485 |
-
"version": "3.0.1",
|
| 486 |
-
"resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz",
|
| 487 |
-
"integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==",
|
| 488 |
-
"license": "MIT",
|
| 489 |
-
"dependencies": {
|
| 490 |
-
"ajv": "^8.0.0"
|
| 491 |
-
},
|
| 492 |
-
"peerDependencies": {
|
| 493 |
-
"ajv": "^8.0.0"
|
| 494 |
-
},
|
| 495 |
-
"peerDependenciesMeta": {
|
| 496 |
-
"ajv": {
|
| 497 |
-
"optional": true
|
| 498 |
-
}
|
| 499 |
-
}
|
| 500 |
-
},
|
| 501 |
-
"node_modules/ansi-styles": {
|
| 502 |
-
"version": "5.2.0",
|
| 503 |
-
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
|
| 504 |
-
"integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
|
| 505 |
-
"license": "MIT",
|
| 506 |
-
"engines": {
|
| 507 |
-
"node": ">=10"
|
| 508 |
-
},
|
| 509 |
-
"funding": {
|
| 510 |
-
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
|
| 511 |
-
}
|
| 512 |
-
},
|
| 513 |
-
"node_modules/base64-js": {
|
| 514 |
-
"version": "1.5.1",
|
| 515 |
-
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
|
| 516 |
-
"integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
|
| 517 |
-
"funding": [
|
| 518 |
-
{
|
| 519 |
-
"type": "github",
|
| 520 |
-
"url": "https://github.com/sponsors/feross"
|
| 521 |
-
},
|
| 522 |
-
{
|
| 523 |
-
"type": "patreon",
|
| 524 |
-
"url": "https://www.patreon.com/feross"
|
| 525 |
-
},
|
| 526 |
-
{
|
| 527 |
-
"type": "consulting",
|
| 528 |
-
"url": "https://feross.org/support"
|
| 529 |
-
}
|
| 530 |
-
],
|
| 531 |
-
"license": "MIT"
|
| 532 |
-
},
|
| 533 |
-
"node_modules/body-parser": {
|
| 534 |
-
"version": "2.2.2",
|
| 535 |
-
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz",
|
| 536 |
-
"integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==",
|
| 537 |
-
"license": "MIT",
|
| 538 |
-
"dependencies": {
|
| 539 |
-
"bytes": "^3.1.2",
|
| 540 |
-
"content-type": "^1.0.5",
|
| 541 |
-
"debug": "^4.4.3",
|
| 542 |
-
"http-errors": "^2.0.0",
|
| 543 |
-
"iconv-lite": "^0.7.0",
|
| 544 |
-
"on-finished": "^2.4.1",
|
| 545 |
-
"qs": "^6.14.1",
|
| 546 |
-
"raw-body": "^3.0.1",
|
| 547 |
-
"type-is": "^2.0.1"
|
| 548 |
-
},
|
| 549 |
-
"engines": {
|
| 550 |
-
"node": ">=18"
|
| 551 |
-
},
|
| 552 |
-
"funding": {
|
| 553 |
-
"type": "opencollective",
|
| 554 |
-
"url": "https://opencollective.com/express"
|
| 555 |
-
}
|
| 556 |
-
},
|
| 557 |
-
"node_modules/buffer-equal-constant-time": {
|
| 558 |
-
"version": "1.0.1",
|
| 559 |
-
"resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
|
| 560 |
-
"integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==",
|
| 561 |
-
"license": "BSD-3-Clause"
|
| 562 |
-
},
|
| 563 |
-
"node_modules/bytes": {
|
| 564 |
-
"version": "3.1.2",
|
| 565 |
-
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
|
| 566 |
-
"integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
|
| 567 |
-
"license": "MIT",
|
| 568 |
-
"engines": {
|
| 569 |
-
"node": ">= 0.8"
|
| 570 |
-
}
|
| 571 |
-
},
|
| 572 |
-
"node_modules/call-bind-apply-helpers": {
|
| 573 |
-
"version": "1.0.2",
|
| 574 |
-
"resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
|
| 575 |
-
"integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
|
| 576 |
-
"license": "MIT",
|
| 577 |
-
"dependencies": {
|
| 578 |
-
"es-errors": "^1.3.0",
|
| 579 |
-
"function-bind": "^1.1.2"
|
| 580 |
-
},
|
| 581 |
-
"engines": {
|
| 582 |
-
"node": ">= 0.4"
|
| 583 |
-
}
|
| 584 |
-
},
|
| 585 |
-
"node_modules/call-bound": {
|
| 586 |
-
"version": "1.0.4",
|
| 587 |
-
"resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
|
| 588 |
-
"integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
|
| 589 |
-
"license": "MIT",
|
| 590 |
-
"dependencies": {
|
| 591 |
-
"call-bind-apply-helpers": "^1.0.2",
|
| 592 |
-
"get-intrinsic": "^1.3.0"
|
| 593 |
-
},
|
| 594 |
-
"engines": {
|
| 595 |
-
"node": ">= 0.4"
|
| 596 |
-
},
|
| 597 |
-
"funding": {
|
| 598 |
-
"url": "https://github.com/sponsors/ljharb"
|
| 599 |
-
}
|
| 600 |
-
},
|
| 601 |
-
"node_modules/camelcase": {
|
| 602 |
-
"version": "6.3.0",
|
| 603 |
-
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
|
| 604 |
-
"integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
|
| 605 |
-
"license": "MIT",
|
| 606 |
-
"engines": {
|
| 607 |
-
"node": ">=10"
|
| 608 |
-
},
|
| 609 |
-
"funding": {
|
| 610 |
-
"url": "https://github.com/sponsors/sindresorhus"
|
| 611 |
-
}
|
| 612 |
-
},
|
| 613 |
-
"node_modules/chalk": {
|
| 614 |
-
"version": "5.6.2",
|
| 615 |
-
"resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz",
|
| 616 |
-
"integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==",
|
| 617 |
-
"license": "MIT",
|
| 618 |
-
"engines": {
|
| 619 |
-
"node": "^12.17.0 || ^14.13 || >=16.0.0"
|
| 620 |
-
},
|
| 621 |
-
"funding": {
|
| 622 |
-
"url": "https://github.com/chalk/chalk?sponsor=1"
|
| 623 |
-
}
|
| 624 |
-
},
|
| 625 |
-
"node_modules/chownr": {
|
| 626 |
-
"version": "2.0.0",
|
| 627 |
-
"resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
|
| 628 |
-
"integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
|
| 629 |
-
"license": "ISC",
|
| 630 |
-
"engines": {
|
| 631 |
-
"node": ">=10"
|
| 632 |
-
}
|
| 633 |
-
},
|
| 634 |
-
"node_modules/console-table-printer": {
|
| 635 |
-
"version": "2.15.0",
|
| 636 |
-
"resolved": "https://registry.npmjs.org/console-table-printer/-/console-table-printer-2.15.0.tgz",
|
| 637 |
-
"integrity": "sha512-SrhBq4hYVjLCkBVOWaTzceJalvn5K1Zq5aQA6wXC/cYjI3frKWNPEMK3sZsJfNNQApvCQmgBcc13ZKmFj8qExw==",
|
| 638 |
-
"license": "MIT",
|
| 639 |
-
"dependencies": {
|
| 640 |
-
"simple-wcswidth": "^1.1.2"
|
| 641 |
-
}
|
| 642 |
-
},
|
| 643 |
-
"node_modules/content-disposition": {
|
| 644 |
-
"version": "1.0.1",
|
| 645 |
-
"resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz",
|
| 646 |
-
"integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==",
|
| 647 |
-
"license": "MIT",
|
| 648 |
-
"engines": {
|
| 649 |
-
"node": ">=18"
|
| 650 |
-
},
|
| 651 |
-
"funding": {
|
| 652 |
-
"type": "opencollective",
|
| 653 |
-
"url": "https://opencollective.com/express"
|
| 654 |
-
}
|
| 655 |
-
},
|
| 656 |
-
"node_modules/content-type": {
|
| 657 |
-
"version": "1.0.5",
|
| 658 |
-
"resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
|
| 659 |
-
"integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
|
| 660 |
-
"license": "MIT",
|
| 661 |
-
"engines": {
|
| 662 |
-
"node": ">= 0.6"
|
| 663 |
-
}
|
| 664 |
-
},
|
| 665 |
-
"node_modules/cookie": {
|
| 666 |
-
"version": "0.7.2",
|
| 667 |
-
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
|
| 668 |
-
"integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
|
| 669 |
-
"license": "MIT",
|
| 670 |
-
"engines": {
|
| 671 |
-
"node": ">= 0.6"
|
| 672 |
-
}
|
| 673 |
-
},
|
| 674 |
-
"node_modules/cookie-signature": {
|
| 675 |
-
"version": "1.2.2",
|
| 676 |
-
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz",
|
| 677 |
-
"integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==",
|
| 678 |
-
"license": "MIT",
|
| 679 |
-
"engines": {
|
| 680 |
-
"node": ">=6.6.0"
|
| 681 |
-
}
|
| 682 |
-
},
|
| 683 |
-
"node_modules/cors": {
|
| 684 |
-
"version": "2.8.6",
|
| 685 |
-
"resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz",
|
| 686 |
-
"integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==",
|
| 687 |
-
"license": "MIT",
|
| 688 |
-
"dependencies": {
|
| 689 |
-
"object-assign": "^4",
|
| 690 |
-
"vary": "^1"
|
| 691 |
-
},
|
| 692 |
-
"engines": {
|
| 693 |
-
"node": ">= 0.10"
|
| 694 |
-
},
|
| 695 |
-
"funding": {
|
| 696 |
-
"type": "opencollective",
|
| 697 |
-
"url": "https://opencollective.com/express"
|
| 698 |
-
}
|
| 699 |
-
},
|
| 700 |
-
"node_modules/cross-spawn": {
|
| 701 |
-
"version": "7.0.6",
|
| 702 |
-
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
|
| 703 |
-
"integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
|
| 704 |
-
"license": "MIT",
|
| 705 |
-
"dependencies": {
|
| 706 |
-
"path-key": "^3.1.0",
|
| 707 |
-
"shebang-command": "^2.0.0",
|
| 708 |
-
"which": "^2.0.1"
|
| 709 |
-
},
|
| 710 |
-
"engines": {
|
| 711 |
-
"node": ">= 8"
|
| 712 |
-
}
|
| 713 |
-
},
|
| 714 |
-
"node_modules/debug": {
|
| 715 |
-
"version": "4.4.3",
|
| 716 |
-
"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
|
| 717 |
-
"integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
|
| 718 |
-
"license": "MIT",
|
| 719 |
-
"dependencies": {
|
| 720 |
-
"ms": "^2.1.3"
|
| 721 |
-
},
|
| 722 |
-
"engines": {
|
| 723 |
-
"node": ">=6.0"
|
| 724 |
-
},
|
| 725 |
-
"peerDependenciesMeta": {
|
| 726 |
-
"supports-color": {
|
| 727 |
-
"optional": true
|
| 728 |
-
}
|
| 729 |
-
}
|
| 730 |
-
},
|
| 731 |
-
"node_modules/decamelize": {
|
| 732 |
-
"version": "1.2.0",
|
| 733 |
-
"resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
|
| 734 |
-
"integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
|
| 735 |
-
"license": "MIT",
|
| 736 |
-
"engines": {
|
| 737 |
-
"node": ">=0.10.0"
|
| 738 |
-
}
|
| 739 |
-
},
|
| 740 |
-
"node_modules/depd": {
|
| 741 |
-
"version": "2.0.0",
|
| 742 |
-
"resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
|
| 743 |
-
"integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
|
| 744 |
-
"license": "MIT",
|
| 745 |
-
"engines": {
|
| 746 |
-
"node": ">= 0.8"
|
| 747 |
-
}
|
| 748 |
-
},
|
| 749 |
-
"node_modules/dunder-proto": {
|
| 750 |
-
"version": "1.0.1",
|
| 751 |
-
"resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
|
| 752 |
-
"integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
|
| 753 |
-
"license": "MIT",
|
| 754 |
-
"dependencies": {
|
| 755 |
-
"call-bind-apply-helpers": "^1.0.1",
|
| 756 |
-
"es-errors": "^1.3.0",
|
| 757 |
-
"gopd": "^1.2.0"
|
| 758 |
-
},
|
| 759 |
-
"engines": {
|
| 760 |
-
"node": ">= 0.4"
|
| 761 |
-
}
|
| 762 |
-
},
|
| 763 |
-
"node_modules/ecdsa-sig-formatter": {
|
| 764 |
-
"version": "1.0.11",
|
| 765 |
-
"resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
|
| 766 |
-
"integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
|
| 767 |
-
"license": "Apache-2.0",
|
| 768 |
-
"dependencies": {
|
| 769 |
-
"safe-buffer": "^5.0.1"
|
| 770 |
-
}
|
| 771 |
-
},
|
| 772 |
-
"node_modules/ee-first": {
|
| 773 |
-
"version": "1.1.1",
|
| 774 |
-
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
|
| 775 |
-
"integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
|
| 776 |
-
"license": "MIT"
|
| 777 |
-
},
|
| 778 |
-
"node_modules/encodeurl": {
|
| 779 |
-
"version": "2.0.0",
|
| 780 |
-
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
|
| 781 |
-
"integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
|
| 782 |
-
"license": "MIT",
|
| 783 |
-
"engines": {
|
| 784 |
-
"node": ">= 0.8"
|
| 785 |
-
}
|
| 786 |
-
},
|
| 787 |
-
"node_modules/es-define-property": {
|
| 788 |
-
"version": "1.0.1",
|
| 789 |
-
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
|
| 790 |
-
"integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
|
| 791 |
-
"license": "MIT",
|
| 792 |
-
"engines": {
|
| 793 |
-
"node": ">= 0.4"
|
| 794 |
-
}
|
| 795 |
-
},
|
| 796 |
-
"node_modules/es-errors": {
|
| 797 |
-
"version": "1.3.0",
|
| 798 |
-
"resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
|
| 799 |
-
"integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
|
| 800 |
-
"license": "MIT",
|
| 801 |
-
"engines": {
|
| 802 |
-
"node": ">= 0.4"
|
| 803 |
-
}
|
| 804 |
-
},
|
| 805 |
-
"node_modules/es-object-atoms": {
|
| 806 |
-
"version": "1.1.1",
|
| 807 |
-
"resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
|
| 808 |
-
"integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
|
| 809 |
-
"license": "MIT",
|
| 810 |
-
"dependencies": {
|
| 811 |
-
"es-errors": "^1.3.0"
|
| 812 |
-
},
|
| 813 |
-
"engines": {
|
| 814 |
-
"node": ">= 0.4"
|
| 815 |
-
}
|
| 816 |
-
},
|
| 817 |
-
"node_modules/escape-html": {
|
| 818 |
-
"version": "1.0.3",
|
| 819 |
-
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
|
| 820 |
-
"integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
|
| 821 |
-
"license": "MIT"
|
| 822 |
-
},
|
| 823 |
-
"node_modules/etag": {
|
| 824 |
-
"version": "1.8.1",
|
| 825 |
-
"resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
|
| 826 |
-
"integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
|
| 827 |
-
"license": "MIT",
|
| 828 |
-
"engines": {
|
| 829 |
-
"node": ">= 0.6"
|
| 830 |
-
}
|
| 831 |
-
},
|
| 832 |
-
"node_modules/eventemitter3": {
|
| 833 |
-
"version": "4.0.7",
|
| 834 |
-
"resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
|
| 835 |
-
"integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
|
| 836 |
-
"license": "MIT"
|
| 837 |
-
},
|
| 838 |
-
"node_modules/eventsource": {
|
| 839 |
-
"version": "3.0.7",
|
| 840 |
-
"resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz",
|
| 841 |
-
"integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==",
|
| 842 |
-
"license": "MIT",
|
| 843 |
-
"dependencies": {
|
| 844 |
-
"eventsource-parser": "^3.0.1"
|
| 845 |
-
},
|
| 846 |
-
"engines": {
|
| 847 |
-
"node": ">=18.0.0"
|
| 848 |
-
}
|
| 849 |
-
},
|
| 850 |
-
"node_modules/eventsource-parser": {
|
| 851 |
-
"version": "3.0.6",
|
| 852 |
-
"resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz",
|
| 853 |
-
"integrity": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==",
|
| 854 |
-
"license": "MIT",
|
| 855 |
-
"engines": {
|
| 856 |
-
"node": ">=18.0.0"
|
| 857 |
-
}
|
| 858 |
-
},
|
| 859 |
-
"node_modules/express": {
|
| 860 |
-
"version": "5.2.1",
|
| 861 |
-
"resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz",
|
| 862 |
-
"integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==",
|
| 863 |
-
"license": "MIT",
|
| 864 |
-
"dependencies": {
|
| 865 |
-
"accepts": "^2.0.0",
|
| 866 |
-
"body-parser": "^2.2.1",
|
| 867 |
-
"content-disposition": "^1.0.0",
|
| 868 |
-
"content-type": "^1.0.5",
|
| 869 |
-
"cookie": "^0.7.1",
|
| 870 |
-
"cookie-signature": "^1.2.1",
|
| 871 |
-
"debug": "^4.4.0",
|
| 872 |
-
"depd": "^2.0.0",
|
| 873 |
-
"encodeurl": "^2.0.0",
|
| 874 |
-
"escape-html": "^1.0.3",
|
| 875 |
-
"etag": "^1.8.1",
|
| 876 |
-
"finalhandler": "^2.1.0",
|
| 877 |
-
"fresh": "^2.0.0",
|
| 878 |
-
"http-errors": "^2.0.0",
|
| 879 |
-
"merge-descriptors": "^2.0.0",
|
| 880 |
-
"mime-types": "^3.0.0",
|
| 881 |
-
"on-finished": "^2.4.1",
|
| 882 |
-
"once": "^1.4.0",
|
| 883 |
-
"parseurl": "^1.3.3",
|
| 884 |
-
"proxy-addr": "^2.0.7",
|
| 885 |
-
"qs": "^6.14.0",
|
| 886 |
-
"range-parser": "^1.2.1",
|
| 887 |
-
"router": "^2.2.0",
|
| 888 |
-
"send": "^1.1.0",
|
| 889 |
-
"serve-static": "^2.2.0",
|
| 890 |
-
"statuses": "^2.0.1",
|
| 891 |
-
"type-is": "^2.0.1",
|
| 892 |
-
"vary": "^1.1.2"
|
| 893 |
-
},
|
| 894 |
-
"engines": {
|
| 895 |
-
"node": ">= 18"
|
| 896 |
-
},
|
| 897 |
-
"funding": {
|
| 898 |
-
"type": "opencollective",
|
| 899 |
-
"url": "https://opencollective.com/express"
|
| 900 |
-
}
|
| 901 |
-
},
|
| 902 |
-
"node_modules/express-rate-limit": {
|
| 903 |
-
"version": "8.3.1",
|
| 904 |
-
"resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.3.1.tgz",
|
| 905 |
-
"integrity": "sha512-D1dKN+cmyPWuvB+G2SREQDzPY1agpBIcTa9sJxOPMCNeH3gwzhqJRDWCXW3gg0y//+LQ/8j52JbMROWyrKdMdw==",
|
| 906 |
-
"license": "MIT",
|
| 907 |
-
"dependencies": {
|
| 908 |
-
"ip-address": "10.1.0"
|
| 909 |
-
},
|
| 910 |
-
"engines": {
|
| 911 |
-
"node": ">= 16"
|
| 912 |
-
},
|
| 913 |
-
"funding": {
|
| 914 |
-
"url": "https://github.com/sponsors/express-rate-limit"
|
| 915 |
-
},
|
| 916 |
-
"peerDependencies": {
|
| 917 |
-
"express": ">= 4.11"
|
| 918 |
-
}
|
| 919 |
-
},
|
| 920 |
-
"node_modules/fast-deep-equal": {
|
| 921 |
-
"version": "3.1.3",
|
| 922 |
-
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
|
| 923 |
-
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
|
| 924 |
-
"license": "MIT"
|
| 925 |
-
},
|
| 926 |
-
"node_modules/fast-uri": {
|
| 927 |
-
"version": "3.1.0",
|
| 928 |
-
"resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz",
|
| 929 |
-
"integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==",
|
| 930 |
-
"funding": [
|
| 931 |
-
{
|
| 932 |
-
"type": "github",
|
| 933 |
-
"url": "https://github.com/sponsors/fastify"
|
| 934 |
-
},
|
| 935 |
-
{
|
| 936 |
-
"type": "opencollective",
|
| 937 |
-
"url": "https://opencollective.com/fastify"
|
| 938 |
-
}
|
| 939 |
-
],
|
| 940 |
-
"license": "BSD-3-Clause"
|
| 941 |
-
},
|
| 942 |
-
"node_modules/finalhandler": {
|
| 943 |
-
"version": "2.1.1",
|
| 944 |
-
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz",
|
| 945 |
-
"integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==",
|
| 946 |
-
"license": "MIT",
|
| 947 |
-
"dependencies": {
|
| 948 |
-
"debug": "^4.4.0",
|
| 949 |
-
"encodeurl": "^2.0.0",
|
| 950 |
-
"escape-html": "^1.0.3",
|
| 951 |
-
"on-finished": "^2.4.1",
|
| 952 |
-
"parseurl": "^1.3.3",
|
| 953 |
-
"statuses": "^2.0.1"
|
| 954 |
-
},
|
| 955 |
-
"engines": {
|
| 956 |
-
"node": ">= 18.0.0"
|
| 957 |
-
},
|
| 958 |
-
"funding": {
|
| 959 |
-
"type": "opencollective",
|
| 960 |
-
"url": "https://opencollective.com/express"
|
| 961 |
-
}
|
| 962 |
-
},
|
| 963 |
-
"node_modules/forwarded": {
|
| 964 |
-
"version": "0.2.0",
|
| 965 |
-
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
|
| 966 |
-
"integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
|
| 967 |
-
"license": "MIT",
|
| 968 |
-
"engines": {
|
| 969 |
-
"node": ">= 0.6"
|
| 970 |
-
}
|
| 971 |
-
},
|
| 972 |
-
"node_modules/fresh": {
|
| 973 |
-
"version": "2.0.0",
|
| 974 |
-
"resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz",
|
| 975 |
-
"integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==",
|
| 976 |
-
"license": "MIT",
|
| 977 |
-
"engines": {
|
| 978 |
-
"node": ">= 0.8"
|
| 979 |
-
}
|
| 980 |
-
},
|
| 981 |
-
"node_modules/fs-minipass": {
|
| 982 |
-
"version": "2.1.0",
|
| 983 |
-
"resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
|
| 984 |
-
"integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
|
| 985 |
-
"license": "ISC",
|
| 986 |
-
"dependencies": {
|
| 987 |
-
"minipass": "^3.0.0"
|
| 988 |
-
},
|
| 989 |
-
"engines": {
|
| 990 |
-
"node": ">= 8"
|
| 991 |
-
}
|
| 992 |
-
},
|
| 993 |
-
"node_modules/fs-minipass/node_modules/minipass": {
|
| 994 |
-
"version": "3.3.6",
|
| 995 |
-
"resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
|
| 996 |
-
"integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
|
| 997 |
-
"license": "ISC",
|
| 998 |
-
"dependencies": {
|
| 999 |
-
"yallist": "^4.0.0"
|
| 1000 |
-
},
|
| 1001 |
-
"engines": {
|
| 1002 |
-
"node": ">=8"
|
| 1003 |
-
}
|
| 1004 |
-
},
|
| 1005 |
-
"node_modules/function-bind": {
|
| 1006 |
-
"version": "1.1.2",
|
| 1007 |
-
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
|
| 1008 |
-
"integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
|
| 1009 |
-
"license": "MIT",
|
| 1010 |
-
"funding": {
|
| 1011 |
-
"url": "https://github.com/sponsors/ljharb"
|
| 1012 |
-
}
|
| 1013 |
-
},
|
| 1014 |
-
"node_modules/get-intrinsic": {
|
| 1015 |
-
"version": "1.3.0",
|
| 1016 |
-
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
|
| 1017 |
-
"integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
|
| 1018 |
-
"license": "MIT",
|
| 1019 |
-
"dependencies": {
|
| 1020 |
-
"call-bind-apply-helpers": "^1.0.2",
|
| 1021 |
-
"es-define-property": "^1.0.1",
|
| 1022 |
-
"es-errors": "^1.3.0",
|
| 1023 |
-
"es-object-atoms": "^1.1.1",
|
| 1024 |
-
"function-bind": "^1.1.2",
|
| 1025 |
-
"get-proto": "^1.0.1",
|
| 1026 |
-
"gopd": "^1.2.0",
|
| 1027 |
-
"has-symbols": "^1.1.0",
|
| 1028 |
-
"hasown": "^2.0.2",
|
| 1029 |
-
"math-intrinsics": "^1.1.0"
|
| 1030 |
-
},
|
| 1031 |
-
"engines": {
|
| 1032 |
-
"node": ">= 0.4"
|
| 1033 |
-
},
|
| 1034 |
-
"funding": {
|
| 1035 |
-
"url": "https://github.com/sponsors/ljharb"
|
| 1036 |
-
}
|
| 1037 |
-
},
|
| 1038 |
-
"node_modules/get-proto": {
|
| 1039 |
-
"version": "1.0.1",
|
| 1040 |
-
"resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
|
| 1041 |
-
"integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
|
| 1042 |
-
"license": "MIT",
|
| 1043 |
-
"dependencies": {
|
| 1044 |
-
"dunder-proto": "^1.0.1",
|
| 1045 |
-
"es-object-atoms": "^1.0.0"
|
| 1046 |
-
},
|
| 1047 |
-
"engines": {
|
| 1048 |
-
"node": ">= 0.4"
|
| 1049 |
-
}
|
| 1050 |
-
},
|
| 1051 |
-
"node_modules/gopd": {
|
| 1052 |
-
"version": "1.2.0",
|
| 1053 |
-
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
|
| 1054 |
-
"integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
|
| 1055 |
-
"license": "MIT",
|
| 1056 |
-
"engines": {
|
| 1057 |
-
"node": ">= 0.4"
|
| 1058 |
-
},
|
| 1059 |
-
"funding": {
|
| 1060 |
-
"url": "https://github.com/sponsors/ljharb"
|
| 1061 |
-
}
|
| 1062 |
-
},
|
| 1063 |
-
"node_modules/has-symbols": {
|
| 1064 |
-
"version": "1.1.0",
|
| 1065 |
-
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
|
| 1066 |
-
"integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
|
| 1067 |
-
"license": "MIT",
|
| 1068 |
-
"engines": {
|
| 1069 |
-
"node": ">= 0.4"
|
| 1070 |
-
},
|
| 1071 |
-
"funding": {
|
| 1072 |
-
"url": "https://github.com/sponsors/ljharb"
|
| 1073 |
-
}
|
| 1074 |
-
},
|
| 1075 |
-
"node_modules/hasown": {
|
| 1076 |
-
"version": "2.0.2",
|
| 1077 |
-
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
|
| 1078 |
-
"integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
|
| 1079 |
-
"license": "MIT",
|
| 1080 |
-
"dependencies": {
|
| 1081 |
-
"function-bind": "^1.1.2"
|
| 1082 |
-
},
|
| 1083 |
-
"engines": {
|
| 1084 |
-
"node": ">= 0.4"
|
| 1085 |
-
}
|
| 1086 |
-
},
|
| 1087 |
-
"node_modules/hono": {
|
| 1088 |
-
"version": "4.12.9",
|
| 1089 |
-
"resolved": "https://registry.npmjs.org/hono/-/hono-4.12.9.tgz",
|
| 1090 |
-
"integrity": "sha512-wy3T8Zm2bsEvxKZM5w21VdHDDcwVS1yUFFY6i8UobSsKfFceT7TOwhbhfKsDyx7tYQlmRM5FLpIuYvNFyjctiA==",
|
| 1091 |
-
"license": "MIT",
|
| 1092 |
-
"engines": {
|
| 1093 |
-
"node": ">=16.9.0"
|
| 1094 |
-
}
|
| 1095 |
-
},
|
| 1096 |
-
"node_modules/http-errors": {
|
| 1097 |
-
"version": "2.0.1",
|
| 1098 |
-
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz",
|
| 1099 |
-
"integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==",
|
| 1100 |
-
"license": "MIT",
|
| 1101 |
-
"dependencies": {
|
| 1102 |
-
"depd": "~2.0.0",
|
| 1103 |
-
"inherits": "~2.0.4",
|
| 1104 |
-
"setprototypeof": "~1.2.0",
|
| 1105 |
-
"statuses": "~2.0.2",
|
| 1106 |
-
"toidentifier": "~1.0.1"
|
| 1107 |
-
},
|
| 1108 |
-
"engines": {
|
| 1109 |
-
"node": ">= 0.8"
|
| 1110 |
-
},
|
| 1111 |
-
"funding": {
|
| 1112 |
-
"type": "opencollective",
|
| 1113 |
-
"url": "https://opencollective.com/express"
|
| 1114 |
-
}
|
| 1115 |
-
},
|
| 1116 |
-
"node_modules/iceberg-js": {
|
| 1117 |
-
"version": "0.8.1",
|
| 1118 |
-
"resolved": "https://registry.npmjs.org/iceberg-js/-/iceberg-js-0.8.1.tgz",
|
| 1119 |
-
"integrity": "sha512-1dhVQZXhcHje7798IVM+xoo/1ZdVfzOMIc8/rgVSijRK38EDqOJoGula9N/8ZI5RD8QTxNQtK/Gozpr+qUqRRA==",
|
| 1120 |
-
"license": "MIT",
|
| 1121 |
-
"engines": {
|
| 1122 |
-
"node": ">=20.0.0"
|
| 1123 |
-
}
|
| 1124 |
-
},
|
| 1125 |
-
"node_modules/iconv-lite": {
|
| 1126 |
-
"version": "0.7.2",
|
| 1127 |
-
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz",
|
| 1128 |
-
"integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==",
|
| 1129 |
-
"license": "MIT",
|
| 1130 |
-
"dependencies": {
|
| 1131 |
-
"safer-buffer": ">= 2.1.2 < 3.0.0"
|
| 1132 |
-
},
|
| 1133 |
-
"engines": {
|
| 1134 |
-
"node": ">=0.10.0"
|
| 1135 |
-
},
|
| 1136 |
-
"funding": {
|
| 1137 |
-
"type": "opencollective",
|
| 1138 |
-
"url": "https://opencollective.com/express"
|
| 1139 |
-
}
|
| 1140 |
-
},
|
| 1141 |
-
"node_modules/inherits": {
|
| 1142 |
-
"version": "2.0.4",
|
| 1143 |
-
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
|
| 1144 |
-
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
|
| 1145 |
-
"license": "ISC"
|
| 1146 |
-
},
|
| 1147 |
-
"node_modules/ip-address": {
|
| 1148 |
-
"version": "10.1.0",
|
| 1149 |
-
"resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz",
|
| 1150 |
-
"integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==",
|
| 1151 |
-
"license": "MIT",
|
| 1152 |
-
"engines": {
|
| 1153 |
-
"node": ">= 12"
|
| 1154 |
-
}
|
| 1155 |
-
},
|
| 1156 |
-
"node_modules/ipaddr.js": {
|
| 1157 |
-
"version": "1.9.1",
|
| 1158 |
-
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
|
| 1159 |
-
"integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
|
| 1160 |
-
"license": "MIT",
|
| 1161 |
-
"engines": {
|
| 1162 |
-
"node": ">= 0.10"
|
| 1163 |
-
}
|
| 1164 |
-
},
|
| 1165 |
-
"node_modules/is-network-error": {
|
| 1166 |
-
"version": "1.3.1",
|
| 1167 |
-
"resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.3.1.tgz",
|
| 1168 |
-
"integrity": "sha512-6QCxa49rQbmUWLfk0nuGqzql9U8uaV2H6279bRErPBHe/109hCzsLUBUHfbEtvLIHBd6hyXbgedBSHevm43Edw==",
|
| 1169 |
-
"license": "MIT",
|
| 1170 |
-
"engines": {
|
| 1171 |
-
"node": ">=16"
|
| 1172 |
-
},
|
| 1173 |
-
"funding": {
|
| 1174 |
-
"url": "https://github.com/sponsors/sindresorhus"
|
| 1175 |
-
}
|
| 1176 |
-
},
|
| 1177 |
-
"node_modules/is-promise": {
|
| 1178 |
-
"version": "4.0.0",
|
| 1179 |
-
"resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz",
|
| 1180 |
-
"integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==",
|
| 1181 |
-
"license": "MIT"
|
| 1182 |
-
},
|
| 1183 |
-
"node_modules/isexe": {
|
| 1184 |
-
"version": "2.0.0",
|
| 1185 |
-
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
|
| 1186 |
-
"integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
|
| 1187 |
-
"license": "ISC"
|
| 1188 |
-
},
|
| 1189 |
-
"node_modules/jose": {
|
| 1190 |
-
"version": "6.2.2",
|
| 1191 |
-
"resolved": "https://registry.npmjs.org/jose/-/jose-6.2.2.tgz",
|
| 1192 |
-
"integrity": "sha512-d7kPDd34KO/YnzaDOlikGpOurfF0ByC2sEV4cANCtdqLlTfBlw2p14O/5d/zv40gJPbIQxfES3nSx1/oYNyuZQ==",
|
| 1193 |
-
"license": "MIT",
|
| 1194 |
-
"funding": {
|
| 1195 |
-
"url": "https://github.com/sponsors/panva"
|
| 1196 |
-
}
|
| 1197 |
-
},
|
| 1198 |
-
"node_modules/js-tiktoken": {
|
| 1199 |
-
"version": "1.0.21",
|
| 1200 |
-
"resolved": "https://registry.npmjs.org/js-tiktoken/-/js-tiktoken-1.0.21.tgz",
|
| 1201 |
-
"integrity": "sha512-biOj/6M5qdgx5TKjDnFT1ymSpM5tbd3ylwDtrQvFQSu0Z7bBYko2dF+W/aUkXUPuk6IVpRxk/3Q2sHOzGlS36g==",
|
| 1202 |
-
"license": "MIT",
|
| 1203 |
-
"dependencies": {
|
| 1204 |
-
"base64-js": "^1.5.1"
|
| 1205 |
-
}
|
| 1206 |
-
},
|
| 1207 |
-
"node_modules/json-schema-traverse": {
|
| 1208 |
-
"version": "1.0.0",
|
| 1209 |
-
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
|
| 1210 |
-
"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
|
| 1211 |
-
"license": "MIT"
|
| 1212 |
-
},
|
| 1213 |
-
"node_modules/json-schema-typed": {
|
| 1214 |
-
"version": "8.0.2",
|
| 1215 |
-
"resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.2.tgz",
|
| 1216 |
-
"integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==",
|
| 1217 |
-
"license": "BSD-2-Clause"
|
| 1218 |
-
},
|
| 1219 |
-
"node_modules/jsonwebtoken": {
|
| 1220 |
-
"version": "9.0.3",
|
| 1221 |
-
"resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz",
|
| 1222 |
-
"integrity": "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==",
|
| 1223 |
-
"license": "MIT",
|
| 1224 |
-
"dependencies": {
|
| 1225 |
-
"jws": "^4.0.1",
|
| 1226 |
-
"lodash.includes": "^4.3.0",
|
| 1227 |
-
"lodash.isboolean": "^3.0.3",
|
| 1228 |
-
"lodash.isinteger": "^4.0.4",
|
| 1229 |
-
"lodash.isnumber": "^3.0.3",
|
| 1230 |
-
"lodash.isplainobject": "^4.0.6",
|
| 1231 |
-
"lodash.isstring": "^4.0.1",
|
| 1232 |
-
"lodash.once": "^4.0.0",
|
| 1233 |
-
"ms": "^2.1.1",
|
| 1234 |
-
"semver": "^7.5.4"
|
| 1235 |
-
},
|
| 1236 |
-
"engines": {
|
| 1237 |
-
"node": ">=12",
|
| 1238 |
-
"npm": ">=6"
|
| 1239 |
-
}
|
| 1240 |
-
},
|
| 1241 |
-
"node_modules/jwa": {
|
| 1242 |
-
"version": "2.0.1",
|
| 1243 |
-
"resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz",
|
| 1244 |
-
"integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==",
|
| 1245 |
-
"license": "MIT",
|
| 1246 |
-
"dependencies": {
|
| 1247 |
-
"buffer-equal-constant-time": "^1.0.1",
|
| 1248 |
-
"ecdsa-sig-formatter": "1.0.11",
|
| 1249 |
-
"safe-buffer": "^5.0.1"
|
| 1250 |
-
}
|
| 1251 |
-
},
|
| 1252 |
-
"node_modules/jws": {
|
| 1253 |
-
"version": "4.0.1",
|
| 1254 |
-
"resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz",
|
| 1255 |
-
"integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==",
|
| 1256 |
-
"license": "MIT",
|
| 1257 |
-
"dependencies": {
|
| 1258 |
-
"jwa": "^2.0.1",
|
| 1259 |
-
"safe-buffer": "^5.0.1"
|
| 1260 |
-
}
|
| 1261 |
-
},
|
| 1262 |
-
"node_modules/langsmith": {
|
| 1263 |
-
"version": "0.5.13",
|
| 1264 |
-
"resolved": "https://registry.npmjs.org/langsmith/-/langsmith-0.5.13.tgz",
|
| 1265 |
-
"integrity": "sha512-arD4XzLdMTyb3rrKVainpXG9vtJPL3urOc/fC/yMHeoorK5KSHsvBWkogZUgjCsLkhtH8FdfSEAAG8Am8DNoYQ==",
|
| 1266 |
-
"license": "MIT",
|
| 1267 |
-
"dependencies": {
|
| 1268 |
-
"@types/uuid": "^10.0.0",
|
| 1269 |
-
"chalk": "^5.6.2",
|
| 1270 |
-
"console-table-printer": "^2.12.1",
|
| 1271 |
-
"p-queue": "^6.6.2",
|
| 1272 |
-
"semver": "^7.6.3",
|
| 1273 |
-
"uuid": "^10.0.0"
|
| 1274 |
-
},
|
| 1275 |
-
"peerDependencies": {
|
| 1276 |
-
"@opentelemetry/api": "*",
|
| 1277 |
-
"@opentelemetry/exporter-trace-otlp-proto": "*",
|
| 1278 |
-
"@opentelemetry/sdk-trace-base": "*",
|
| 1279 |
-
"openai": "*",
|
| 1280 |
-
"ws": ">=7"
|
| 1281 |
-
},
|
| 1282 |
-
"peerDependenciesMeta": {
|
| 1283 |
-
"@opentelemetry/api": {
|
| 1284 |
-
"optional": true
|
| 1285 |
-
},
|
| 1286 |
-
"@opentelemetry/exporter-trace-otlp-proto": {
|
| 1287 |
-
"optional": true
|
| 1288 |
-
},
|
| 1289 |
-
"@opentelemetry/sdk-trace-base": {
|
| 1290 |
-
"optional": true
|
| 1291 |
-
},
|
| 1292 |
-
"openai": {
|
| 1293 |
-
"optional": true
|
| 1294 |
-
},
|
| 1295 |
-
"ws": {
|
| 1296 |
-
"optional": true
|
| 1297 |
-
}
|
| 1298 |
-
}
|
| 1299 |
-
},
|
| 1300 |
-
"node_modules/langsmith/node_modules/uuid": {
|
| 1301 |
-
"version": "10.0.0",
|
| 1302 |
-
"resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz",
|
| 1303 |
-
"integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==",
|
| 1304 |
-
"funding": [
|
| 1305 |
-
"https://github.com/sponsors/broofa",
|
| 1306 |
-
"https://github.com/sponsors/ctavan"
|
| 1307 |
-
],
|
| 1308 |
-
"license": "MIT",
|
| 1309 |
-
"bin": {
|
| 1310 |
-
"uuid": "dist/bin/uuid"
|
| 1311 |
-
}
|
| 1312 |
-
},
|
| 1313 |
-
"node_modules/lodash.includes": {
|
| 1314 |
-
"version": "4.3.0",
|
| 1315 |
-
"resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
|
| 1316 |
-
"integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==",
|
| 1317 |
-
"license": "MIT"
|
| 1318 |
-
},
|
| 1319 |
-
"node_modules/lodash.isboolean": {
|
| 1320 |
-
"version": "3.0.3",
|
| 1321 |
-
"resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
|
| 1322 |
-
"integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==",
|
| 1323 |
-
"license": "MIT"
|
| 1324 |
-
},
|
| 1325 |
-
"node_modules/lodash.isinteger": {
|
| 1326 |
-
"version": "4.0.4",
|
| 1327 |
-
"resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
|
| 1328 |
-
"integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==",
|
| 1329 |
-
"license": "MIT"
|
| 1330 |
-
},
|
| 1331 |
-
"node_modules/lodash.isnumber": {
|
| 1332 |
-
"version": "3.0.3",
|
| 1333 |
-
"resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
|
| 1334 |
-
"integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==",
|
| 1335 |
-
"license": "MIT"
|
| 1336 |
-
},
|
| 1337 |
-
"node_modules/lodash.isplainobject": {
|
| 1338 |
-
"version": "4.0.6",
|
| 1339 |
-
"resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
|
| 1340 |
-
"integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==",
|
| 1341 |
-
"license": "MIT"
|
| 1342 |
-
},
|
| 1343 |
-
"node_modules/lodash.isstring": {
|
| 1344 |
-
"version": "4.0.1",
|
| 1345 |
-
"resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
|
| 1346 |
-
"integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==",
|
| 1347 |
-
"license": "MIT"
|
| 1348 |
-
},
|
| 1349 |
-
"node_modules/lodash.once": {
|
| 1350 |
-
"version": "4.1.1",
|
| 1351 |
-
"resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
|
| 1352 |
-
"integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==",
|
| 1353 |
-
"license": "MIT"
|
| 1354 |
-
},
|
| 1355 |
-
"node_modules/math-intrinsics": {
|
| 1356 |
-
"version": "1.1.0",
|
| 1357 |
-
"resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
|
| 1358 |
-
"integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
|
| 1359 |
-
"license": "MIT",
|
| 1360 |
-
"engines": {
|
| 1361 |
-
"node": ">= 0.4"
|
| 1362 |
-
}
|
| 1363 |
-
},
|
| 1364 |
-
"node_modules/media-typer": {
|
| 1365 |
-
"version": "1.1.0",
|
| 1366 |
-
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz",
|
| 1367 |
-
"integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==",
|
| 1368 |
-
"license": "MIT",
|
| 1369 |
-
"engines": {
|
| 1370 |
-
"node": ">= 0.8"
|
| 1371 |
-
}
|
| 1372 |
-
},
|
| 1373 |
-
"node_modules/merge-descriptors": {
|
| 1374 |
-
"version": "2.0.0",
|
| 1375 |
-
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz",
|
| 1376 |
-
"integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==",
|
| 1377 |
-
"license": "MIT",
|
| 1378 |
-
"engines": {
|
| 1379 |
-
"node": ">=18"
|
| 1380 |
-
},
|
| 1381 |
-
"funding": {
|
| 1382 |
-
"url": "https://github.com/sponsors/sindresorhus"
|
| 1383 |
-
}
|
| 1384 |
-
},
|
| 1385 |
-
"node_modules/mime-db": {
|
| 1386 |
-
"version": "1.54.0",
|
| 1387 |
-
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
|
| 1388 |
-
"integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
|
| 1389 |
-
"license": "MIT",
|
| 1390 |
-
"engines": {
|
| 1391 |
-
"node": ">= 0.6"
|
| 1392 |
-
}
|
| 1393 |
-
},
|
| 1394 |
-
"node_modules/mime-types": {
|
| 1395 |
-
"version": "3.0.2",
|
| 1396 |
-
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz",
|
| 1397 |
-
"integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==",
|
| 1398 |
-
"license": "MIT",
|
| 1399 |
-
"dependencies": {
|
| 1400 |
-
"mime-db": "^1.54.0"
|
| 1401 |
-
},
|
| 1402 |
-
"engines": {
|
| 1403 |
-
"node": ">=18"
|
| 1404 |
-
},
|
| 1405 |
-
"funding": {
|
| 1406 |
-
"type": "opencollective",
|
| 1407 |
-
"url": "https://opencollective.com/express"
|
| 1408 |
-
}
|
| 1409 |
-
},
|
| 1410 |
-
"node_modules/minipass": {
|
| 1411 |
-
"version": "4.2.8",
|
| 1412 |
-
"resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz",
|
| 1413 |
-
"integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==",
|
| 1414 |
-
"dev": true,
|
| 1415 |
-
"license": "ISC",
|
| 1416 |
-
"engines": {
|
| 1417 |
-
"node": ">=8"
|
| 1418 |
-
}
|
| 1419 |
-
},
|
| 1420 |
-
"node_modules/minizlib": {
|
| 1421 |
-
"version": "2.1.2",
|
| 1422 |
-
"resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
|
| 1423 |
-
"integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
|
| 1424 |
-
"license": "MIT",
|
| 1425 |
-
"dependencies": {
|
| 1426 |
-
"minipass": "^3.0.0",
|
| 1427 |
-
"yallist": "^4.0.0"
|
| 1428 |
-
},
|
| 1429 |
-
"engines": {
|
| 1430 |
-
"node": ">= 8"
|
| 1431 |
-
}
|
| 1432 |
-
},
|
| 1433 |
-
"node_modules/minizlib/node_modules/minipass": {
|
| 1434 |
-
"version": "3.3.6",
|
| 1435 |
-
"resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
|
| 1436 |
-
"integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
|
| 1437 |
-
"license": "ISC",
|
| 1438 |
-
"dependencies": {
|
| 1439 |
-
"yallist": "^4.0.0"
|
| 1440 |
-
},
|
| 1441 |
-
"engines": {
|
| 1442 |
-
"node": ">=8"
|
| 1443 |
-
}
|
| 1444 |
-
},
|
| 1445 |
-
"node_modules/mkdirp": {
|
| 1446 |
-
"version": "1.0.4",
|
| 1447 |
-
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
|
| 1448 |
-
"integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
|
| 1449 |
-
"license": "MIT",
|
| 1450 |
-
"bin": {
|
| 1451 |
-
"mkdirp": "bin/cmd.js"
|
| 1452 |
-
},
|
| 1453 |
-
"engines": {
|
| 1454 |
-
"node": ">=10"
|
| 1455 |
-
}
|
| 1456 |
-
},
|
| 1457 |
-
"node_modules/ms": {
|
| 1458 |
-
"version": "2.1.3",
|
| 1459 |
-
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
|
| 1460 |
-
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
|
| 1461 |
-
"license": "MIT"
|
| 1462 |
-
},
|
| 1463 |
-
"node_modules/mustache": {
|
| 1464 |
-
"version": "4.2.0",
|
| 1465 |
-
"resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz",
|
| 1466 |
-
"integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==",
|
| 1467 |
-
"license": "MIT",
|
| 1468 |
-
"bin": {
|
| 1469 |
-
"mustache": "bin/mustache"
|
| 1470 |
-
}
|
| 1471 |
-
},
|
| 1472 |
-
"node_modules/negotiator": {
|
| 1473 |
-
"version": "1.0.0",
|
| 1474 |
-
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz",
|
| 1475 |
-
"integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==",
|
| 1476 |
-
"license": "MIT",
|
| 1477 |
-
"engines": {
|
| 1478 |
-
"node": ">= 0.6"
|
| 1479 |
-
}
|
| 1480 |
-
},
|
| 1481 |
-
"node_modules/node-cron": {
|
| 1482 |
-
"version": "3.0.3",
|
| 1483 |
-
"resolved": "https://registry.npmjs.org/node-cron/-/node-cron-3.0.3.tgz",
|
| 1484 |
-
"integrity": "sha512-dOal67//nohNgYWb+nWmg5dkFdIwDm8EpeGYMekPMrngV3637lqnX0lbUcCtgibHTz6SEz7DAIjKvKDFYCnO1A==",
|
| 1485 |
-
"license": "ISC",
|
| 1486 |
-
"dependencies": {
|
| 1487 |
-
"uuid": "8.3.2"
|
| 1488 |
-
},
|
| 1489 |
-
"engines": {
|
| 1490 |
-
"node": ">=6.0.0"
|
| 1491 |
-
}
|
| 1492 |
-
},
|
| 1493 |
-
"node_modules/node-cron/node_modules/uuid": {
|
| 1494 |
-
"version": "8.3.2",
|
| 1495 |
-
"resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
|
| 1496 |
-
"integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
|
| 1497 |
-
"license": "MIT",
|
| 1498 |
-
"bin": {
|
| 1499 |
-
"uuid": "dist/bin/uuid"
|
| 1500 |
-
}
|
| 1501 |
-
},
|
| 1502 |
-
"node_modules/object-assign": {
|
| 1503 |
-
"version": "4.1.1",
|
| 1504 |
-
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
|
| 1505 |
-
"integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
|
| 1506 |
-
"license": "MIT",
|
| 1507 |
-
"engines": {
|
| 1508 |
-
"node": ">=0.10.0"
|
| 1509 |
-
}
|
| 1510 |
-
},
|
| 1511 |
-
"node_modules/object-inspect": {
|
| 1512 |
-
"version": "1.13.4",
|
| 1513 |
-
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
|
| 1514 |
-
"integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
|
| 1515 |
-
"license": "MIT",
|
| 1516 |
-
"engines": {
|
| 1517 |
-
"node": ">= 0.4"
|
| 1518 |
-
},
|
| 1519 |
-
"funding": {
|
| 1520 |
-
"url": "https://github.com/sponsors/ljharb"
|
| 1521 |
-
}
|
| 1522 |
-
},
|
| 1523 |
-
"node_modules/on-finished": {
|
| 1524 |
-
"version": "2.4.1",
|
| 1525 |
-
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
|
| 1526 |
-
"integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
|
| 1527 |
-
"license": "MIT",
|
| 1528 |
-
"dependencies": {
|
| 1529 |
-
"ee-first": "1.1.1"
|
| 1530 |
-
},
|
| 1531 |
-
"engines": {
|
| 1532 |
-
"node": ">= 0.8"
|
| 1533 |
-
}
|
| 1534 |
-
},
|
| 1535 |
-
"node_modules/once": {
|
| 1536 |
-
"version": "1.4.0",
|
| 1537 |
-
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
|
| 1538 |
-
"integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
|
| 1539 |
-
"license": "ISC",
|
| 1540 |
-
"dependencies": {
|
| 1541 |
-
"wrappy": "1"
|
| 1542 |
-
}
|
| 1543 |
-
},
|
| 1544 |
-
"node_modules/openai": {
|
| 1545 |
-
"version": "6.32.0",
|
| 1546 |
-
"resolved": "https://registry.npmjs.org/openai/-/openai-6.32.0.tgz",
|
| 1547 |
-
"integrity": "sha512-j3k+BjydAf8yQlcOI7WUQMQTbbF5GEIMAE2iZYCOzwwB3S2pCheaWYp+XZRNAch4jWVc52PMDGRRjutao3lLCg==",
|
| 1548 |
-
"license": "Apache-2.0",
|
| 1549 |
-
"bin": {
|
| 1550 |
-
"openai": "bin/cli"
|
| 1551 |
-
},
|
| 1552 |
-
"peerDependencies": {
|
| 1553 |
-
"ws": "^8.18.0",
|
| 1554 |
-
"zod": "^3.25 || ^4.0"
|
| 1555 |
-
},
|
| 1556 |
-
"peerDependenciesMeta": {
|
| 1557 |
-
"ws": {
|
| 1558 |
-
"optional": true
|
| 1559 |
-
},
|
| 1560 |
-
"zod": {
|
| 1561 |
-
"optional": true
|
| 1562 |
-
}
|
| 1563 |
-
}
|
| 1564 |
-
},
|
| 1565 |
-
"node_modules/p-finally": {
|
| 1566 |
-
"version": "1.0.0",
|
| 1567 |
-
"resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
|
| 1568 |
-
"integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==",
|
| 1569 |
-
"license": "MIT",
|
| 1570 |
-
"engines": {
|
| 1571 |
-
"node": ">=4"
|
| 1572 |
-
}
|
| 1573 |
-
},
|
| 1574 |
-
"node_modules/p-queue": {
|
| 1575 |
-
"version": "6.6.2",
|
| 1576 |
-
"resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz",
|
| 1577 |
-
"integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==",
|
| 1578 |
-
"license": "MIT",
|
| 1579 |
-
"dependencies": {
|
| 1580 |
-
"eventemitter3": "^4.0.4",
|
| 1581 |
-
"p-timeout": "^3.2.0"
|
| 1582 |
-
},
|
| 1583 |
-
"engines": {
|
| 1584 |
-
"node": ">=8"
|
| 1585 |
-
},
|
| 1586 |
-
"funding": {
|
| 1587 |
-
"url": "https://github.com/sponsors/sindresorhus"
|
| 1588 |
-
}
|
| 1589 |
-
},
|
| 1590 |
-
"node_modules/p-retry": {
|
| 1591 |
-
"version": "7.1.1",
|
| 1592 |
-
"resolved": "https://registry.npmjs.org/p-retry/-/p-retry-7.1.1.tgz",
|
| 1593 |
-
"integrity": "sha512-J5ApzjyRkkf601HpEeykoiCvzHQjWxPAHhyjFcEUP2SWq0+35NKh8TLhpLw+Dkq5TZBFvUM6UigdE9hIVYTl5w==",
|
| 1594 |
-
"license": "MIT",
|
| 1595 |
-
"dependencies": {
|
| 1596 |
-
"is-network-error": "^1.1.0"
|
| 1597 |
-
},
|
| 1598 |
-
"engines": {
|
| 1599 |
-
"node": ">=20"
|
| 1600 |
-
},
|
| 1601 |
-
"funding": {
|
| 1602 |
-
"url": "https://github.com/sponsors/sindresorhus"
|
| 1603 |
-
}
|
| 1604 |
-
},
|
| 1605 |
-
"node_modules/p-timeout": {
|
| 1606 |
-
"version": "3.2.0",
|
| 1607 |
-
"resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz",
|
| 1608 |
-
"integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==",
|
| 1609 |
-
"license": "MIT",
|
| 1610 |
-
"dependencies": {
|
| 1611 |
-
"p-finally": "^1.0.0"
|
| 1612 |
-
},
|
| 1613 |
-
"engines": {
|
| 1614 |
-
"node": ">=8"
|
| 1615 |
-
}
|
| 1616 |
-
},
|
| 1617 |
-
"node_modules/parseurl": {
|
| 1618 |
-
"version": "1.3.3",
|
| 1619 |
-
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
|
| 1620 |
-
"integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
|
| 1621 |
-
"license": "MIT",
|
| 1622 |
-
"engines": {
|
| 1623 |
-
"node": ">= 0.8"
|
| 1624 |
-
}
|
| 1625 |
-
},
|
| 1626 |
-
"node_modules/path-key": {
|
| 1627 |
-
"version": "3.1.1",
|
| 1628 |
-
"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
|
| 1629 |
-
"integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
|
| 1630 |
-
"license": "MIT",
|
| 1631 |
-
"engines": {
|
| 1632 |
-
"node": ">=8"
|
| 1633 |
-
}
|
| 1634 |
-
},
|
| 1635 |
-
"node_modules/path-to-regexp": {
|
| 1636 |
-
"version": "8.3.0",
|
| 1637 |
-
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz",
|
| 1638 |
-
"integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==",
|
| 1639 |
-
"license": "MIT",
|
| 1640 |
-
"funding": {
|
| 1641 |
-
"type": "opencollective",
|
| 1642 |
-
"url": "https://opencollective.com/express"
|
| 1643 |
-
}
|
| 1644 |
-
},
|
| 1645 |
-
"node_modules/pkce-challenge": {
|
| 1646 |
-
"version": "5.0.1",
|
| 1647 |
-
"resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.1.tgz",
|
| 1648 |
-
"integrity": "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==",
|
| 1649 |
-
"license": "MIT",
|
| 1650 |
-
"engines": {
|
| 1651 |
-
"node": ">=16.20.0"
|
| 1652 |
-
}
|
| 1653 |
-
},
|
| 1654 |
-
"node_modules/proxy-addr": {
|
| 1655 |
-
"version": "2.0.7",
|
| 1656 |
-
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
|
| 1657 |
-
"integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
|
| 1658 |
-
"license": "MIT",
|
| 1659 |
-
"dependencies": {
|
| 1660 |
-
"forwarded": "0.2.0",
|
| 1661 |
-
"ipaddr.js": "1.9.1"
|
| 1662 |
-
},
|
| 1663 |
-
"engines": {
|
| 1664 |
-
"node": ">= 0.10"
|
| 1665 |
-
}
|
| 1666 |
-
},
|
| 1667 |
-
"node_modules/qs": {
|
| 1668 |
-
"version": "6.15.0",
|
| 1669 |
-
"resolved": "https://registry.npmjs.org/qs/-/qs-6.15.0.tgz",
|
| 1670 |
-
"integrity": "sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==",
|
| 1671 |
-
"license": "BSD-3-Clause",
|
| 1672 |
-
"dependencies": {
|
| 1673 |
-
"side-channel": "^1.1.0"
|
| 1674 |
-
},
|
| 1675 |
-
"engines": {
|
| 1676 |
-
"node": ">=0.6"
|
| 1677 |
-
},
|
| 1678 |
-
"funding": {
|
| 1679 |
-
"url": "https://github.com/sponsors/ljharb"
|
| 1680 |
-
}
|
| 1681 |
-
},
|
| 1682 |
-
"node_modules/range-parser": {
|
| 1683 |
-
"version": "1.2.1",
|
| 1684 |
-
"resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
|
| 1685 |
-
"integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
|
| 1686 |
-
"license": "MIT",
|
| 1687 |
-
"engines": {
|
| 1688 |
-
"node": ">= 0.6"
|
| 1689 |
-
}
|
| 1690 |
-
},
|
| 1691 |
-
"node_modules/raw-body": {
|
| 1692 |
-
"version": "3.0.2",
|
| 1693 |
-
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz",
|
| 1694 |
-
"integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==",
|
| 1695 |
-
"license": "MIT",
|
| 1696 |
-
"dependencies": {
|
| 1697 |
-
"bytes": "~3.1.2",
|
| 1698 |
-
"http-errors": "~2.0.1",
|
| 1699 |
-
"iconv-lite": "~0.7.0",
|
| 1700 |
-
"unpipe": "~1.0.0"
|
| 1701 |
-
},
|
| 1702 |
-
"engines": {
|
| 1703 |
-
"node": ">= 0.10"
|
| 1704 |
-
}
|
| 1705 |
-
},
|
| 1706 |
-
"node_modules/require-from-string": {
|
| 1707 |
-
"version": "2.0.2",
|
| 1708 |
-
"resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
|
| 1709 |
-
"integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
|
| 1710 |
-
"license": "MIT",
|
| 1711 |
-
"engines": {
|
| 1712 |
-
"node": ">=0.10.0"
|
| 1713 |
-
}
|
| 1714 |
-
},
|
| 1715 |
-
"node_modules/router": {
|
| 1716 |
-
"version": "2.2.0",
|
| 1717 |
-
"resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz",
|
| 1718 |
-
"integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==",
|
| 1719 |
-
"license": "MIT",
|
| 1720 |
-
"dependencies": {
|
| 1721 |
-
"debug": "^4.4.0",
|
| 1722 |
-
"depd": "^2.0.0",
|
| 1723 |
-
"is-promise": "^4.0.0",
|
| 1724 |
-
"parseurl": "^1.3.3",
|
| 1725 |
-
"path-to-regexp": "^8.0.0"
|
| 1726 |
-
},
|
| 1727 |
-
"engines": {
|
| 1728 |
-
"node": ">= 18"
|
| 1729 |
-
}
|
| 1730 |
-
},
|
| 1731 |
-
"node_modules/safe-buffer": {
|
| 1732 |
-
"version": "5.2.1",
|
| 1733 |
-
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
|
| 1734 |
-
"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
|
| 1735 |
-
"funding": [
|
| 1736 |
-
{
|
| 1737 |
-
"type": "github",
|
| 1738 |
-
"url": "https://github.com/sponsors/feross"
|
| 1739 |
-
},
|
| 1740 |
-
{
|
| 1741 |
-
"type": "patreon",
|
| 1742 |
-
"url": "https://www.patreon.com/feross"
|
| 1743 |
-
},
|
| 1744 |
-
{
|
| 1745 |
-
"type": "consulting",
|
| 1746 |
-
"url": "https://feross.org/support"
|
| 1747 |
-
}
|
| 1748 |
-
],
|
| 1749 |
-
"license": "MIT"
|
| 1750 |
-
},
|
| 1751 |
-
"node_modules/safer-buffer": {
|
| 1752 |
-
"version": "2.1.2",
|
| 1753 |
-
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
|
| 1754 |
-
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
|
| 1755 |
-
"license": "MIT"
|
| 1756 |
-
},
|
| 1757 |
-
"node_modules/semver": {
|
| 1758 |
-
"version": "7.7.4",
|
| 1759 |
-
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
|
| 1760 |
-
"integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
|
| 1761 |
-
"license": "ISC",
|
| 1762 |
-
"bin": {
|
| 1763 |
-
"semver": "bin/semver.js"
|
| 1764 |
-
},
|
| 1765 |
-
"engines": {
|
| 1766 |
-
"node": ">=10"
|
| 1767 |
-
}
|
| 1768 |
-
},
|
| 1769 |
-
"node_modules/send": {
|
| 1770 |
-
"version": "1.2.1",
|
| 1771 |
-
"resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz",
|
| 1772 |
-
"integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==",
|
| 1773 |
-
"license": "MIT",
|
| 1774 |
-
"dependencies": {
|
| 1775 |
-
"debug": "^4.4.3",
|
| 1776 |
-
"encodeurl": "^2.0.0",
|
| 1777 |
-
"escape-html": "^1.0.3",
|
| 1778 |
-
"etag": "^1.8.1",
|
| 1779 |
-
"fresh": "^2.0.0",
|
| 1780 |
-
"http-errors": "^2.0.1",
|
| 1781 |
-
"mime-types": "^3.0.2",
|
| 1782 |
-
"ms": "^2.1.3",
|
| 1783 |
-
"on-finished": "^2.4.1",
|
| 1784 |
-
"range-parser": "^1.2.1",
|
| 1785 |
-
"statuses": "^2.0.2"
|
| 1786 |
-
},
|
| 1787 |
-
"engines": {
|
| 1788 |
-
"node": ">= 18"
|
| 1789 |
-
},
|
| 1790 |
-
"funding": {
|
| 1791 |
-
"type": "opencollective",
|
| 1792 |
-
"url": "https://opencollective.com/express"
|
| 1793 |
-
}
|
| 1794 |
-
},
|
| 1795 |
-
"node_modules/serve-static": {
|
| 1796 |
-
"version": "2.2.1",
|
| 1797 |
-
"resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz",
|
| 1798 |
-
"integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==",
|
| 1799 |
-
"license": "MIT",
|
| 1800 |
-
"dependencies": {
|
| 1801 |
-
"encodeurl": "^2.0.0",
|
| 1802 |
-
"escape-html": "^1.0.3",
|
| 1803 |
-
"parseurl": "^1.3.3",
|
| 1804 |
-
"send": "^1.2.0"
|
| 1805 |
-
},
|
| 1806 |
-
"engines": {
|
| 1807 |
-
"node": ">= 18"
|
| 1808 |
-
},
|
| 1809 |
-
"funding": {
|
| 1810 |
-
"type": "opencollective",
|
| 1811 |
-
"url": "https://opencollective.com/express"
|
| 1812 |
-
}
|
| 1813 |
-
},
|
| 1814 |
-
"node_modules/setprototypeof": {
|
| 1815 |
-
"version": "1.2.0",
|
| 1816 |
-
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
|
| 1817 |
-
"integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
|
| 1818 |
-
"license": "ISC"
|
| 1819 |
-
},
|
| 1820 |
-
"node_modules/shebang-command": {
|
| 1821 |
-
"version": "2.0.0",
|
| 1822 |
-
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
|
| 1823 |
-
"integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
|
| 1824 |
-
"license": "MIT",
|
| 1825 |
-
"dependencies": {
|
| 1826 |
-
"shebang-regex": "^3.0.0"
|
| 1827 |
-
},
|
| 1828 |
-
"engines": {
|
| 1829 |
-
"node": ">=8"
|
| 1830 |
-
}
|
| 1831 |
-
},
|
| 1832 |
-
"node_modules/shebang-regex": {
|
| 1833 |
-
"version": "3.0.0",
|
| 1834 |
-
"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
|
| 1835 |
-
"integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
|
| 1836 |
-
"license": "MIT",
|
| 1837 |
-
"engines": {
|
| 1838 |
-
"node": ">=8"
|
| 1839 |
-
}
|
| 1840 |
-
},
|
| 1841 |
-
"node_modules/side-channel": {
|
| 1842 |
-
"version": "1.1.0",
|
| 1843 |
-
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
|
| 1844 |
-
"integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
|
| 1845 |
-
"license": "MIT",
|
| 1846 |
-
"dependencies": {
|
| 1847 |
-
"es-errors": "^1.3.0",
|
| 1848 |
-
"object-inspect": "^1.13.3",
|
| 1849 |
-
"side-channel-list": "^1.0.0",
|
| 1850 |
-
"side-channel-map": "^1.0.1",
|
| 1851 |
-
"side-channel-weakmap": "^1.0.2"
|
| 1852 |
-
},
|
| 1853 |
-
"engines": {
|
| 1854 |
-
"node": ">= 0.4"
|
| 1855 |
-
},
|
| 1856 |
-
"funding": {
|
| 1857 |
-
"url": "https://github.com/sponsors/ljharb"
|
| 1858 |
-
}
|
| 1859 |
-
},
|
| 1860 |
-
"node_modules/side-channel-list": {
|
| 1861 |
-
"version": "1.0.0",
|
| 1862 |
-
"resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
|
| 1863 |
-
"integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
|
| 1864 |
-
"license": "MIT",
|
| 1865 |
-
"dependencies": {
|
| 1866 |
-
"es-errors": "^1.3.0",
|
| 1867 |
-
"object-inspect": "^1.13.3"
|
| 1868 |
-
},
|
| 1869 |
-
"engines": {
|
| 1870 |
-
"node": ">= 0.4"
|
| 1871 |
-
},
|
| 1872 |
-
"funding": {
|
| 1873 |
-
"url": "https://github.com/sponsors/ljharb"
|
| 1874 |
-
}
|
| 1875 |
-
},
|
| 1876 |
-
"node_modules/side-channel-map": {
|
| 1877 |
-
"version": "1.0.1",
|
| 1878 |
-
"resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
|
| 1879 |
-
"integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
|
| 1880 |
-
"license": "MIT",
|
| 1881 |
-
"dependencies": {
|
| 1882 |
-
"call-bound": "^1.0.2",
|
| 1883 |
-
"es-errors": "^1.3.0",
|
| 1884 |
-
"get-intrinsic": "^1.2.5",
|
| 1885 |
-
"object-inspect": "^1.13.3"
|
| 1886 |
-
},
|
| 1887 |
-
"engines": {
|
| 1888 |
-
"node": ">= 0.4"
|
| 1889 |
-
},
|
| 1890 |
-
"funding": {
|
| 1891 |
-
"url": "https://github.com/sponsors/ljharb"
|
| 1892 |
-
}
|
| 1893 |
-
},
|
| 1894 |
-
"node_modules/side-channel-weakmap": {
|
| 1895 |
-
"version": "1.0.2",
|
| 1896 |
-
"resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
|
| 1897 |
-
"integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
|
| 1898 |
-
"license": "MIT",
|
| 1899 |
-
"dependencies": {
|
| 1900 |
-
"call-bound": "^1.0.2",
|
| 1901 |
-
"es-errors": "^1.3.0",
|
| 1902 |
-
"get-intrinsic": "^1.2.5",
|
| 1903 |
-
"object-inspect": "^1.13.3",
|
| 1904 |
-
"side-channel-map": "^1.0.1"
|
| 1905 |
-
},
|
| 1906 |
-
"engines": {
|
| 1907 |
-
"node": ">= 0.4"
|
| 1908 |
-
},
|
| 1909 |
-
"funding": {
|
| 1910 |
-
"url": "https://github.com/sponsors/ljharb"
|
| 1911 |
-
}
|
| 1912 |
-
},
|
| 1913 |
-
"node_modules/simple-wcswidth": {
|
| 1914 |
-
"version": "1.1.2",
|
| 1915 |
-
"resolved": "https://registry.npmjs.org/simple-wcswidth/-/simple-wcswidth-1.1.2.tgz",
|
| 1916 |
-
"integrity": "sha512-j7piyCjAeTDSjzTSQ7DokZtMNwNlEAyxqSZeCS+CXH7fJ4jx3FuJ/mTW3mE+6JLs4VJBbcll0Kjn+KXI5t21Iw==",
|
| 1917 |
-
"license": "MIT"
|
| 1918 |
-
},
|
| 1919 |
-
"node_modules/statuses": {
|
| 1920 |
-
"version": "2.0.2",
|
| 1921 |
-
"resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
|
| 1922 |
-
"integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
|
| 1923 |
-
"license": "MIT",
|
| 1924 |
-
"engines": {
|
| 1925 |
-
"node": ">= 0.8"
|
| 1926 |
-
}
|
| 1927 |
-
},
|
| 1928 |
-
"node_modules/tar": {
|
| 1929 |
-
"version": "6.2.1",
|
| 1930 |
-
"resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz",
|
| 1931 |
-
"integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==",
|
| 1932 |
-
"deprecated": "Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me",
|
| 1933 |
-
"license": "ISC",
|
| 1934 |
-
"dependencies": {
|
| 1935 |
-
"chownr": "^2.0.0",
|
| 1936 |
-
"fs-minipass": "^2.0.0",
|
| 1937 |
-
"minipass": "^5.0.0",
|
| 1938 |
-
"minizlib": "^2.1.1",
|
| 1939 |
-
"mkdirp": "^1.0.3",
|
| 1940 |
-
"yallist": "^4.0.0"
|
| 1941 |
-
},
|
| 1942 |
-
"engines": {
|
| 1943 |
-
"node": ">=10"
|
| 1944 |
-
}
|
| 1945 |
-
},
|
| 1946 |
-
"node_modules/tar/node_modules/minipass": {
|
| 1947 |
-
"version": "5.0.0",
|
| 1948 |
-
"resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz",
|
| 1949 |
-
"integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==",
|
| 1950 |
-
"license": "ISC",
|
| 1951 |
-
"engines": {
|
| 1952 |
-
"node": ">=8"
|
| 1953 |
-
}
|
| 1954 |
-
},
|
| 1955 |
-
"node_modules/toidentifier": {
|
| 1956 |
-
"version": "1.0.1",
|
| 1957 |
-
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
|
| 1958 |
-
"integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
|
| 1959 |
-
"license": "MIT",
|
| 1960 |
-
"engines": {
|
| 1961 |
-
"node": ">=0.6"
|
| 1962 |
-
}
|
| 1963 |
-
},
|
| 1964 |
-
"node_modules/tslib": {
|
| 1965 |
-
"version": "2.8.1",
|
| 1966 |
-
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
|
| 1967 |
-
"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
|
| 1968 |
-
"license": "0BSD"
|
| 1969 |
-
},
|
| 1970 |
-
"node_modules/type-is": {
|
| 1971 |
-
"version": "2.0.1",
|
| 1972 |
-
"resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz",
|
| 1973 |
-
"integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==",
|
| 1974 |
-
"license": "MIT",
|
| 1975 |
-
"dependencies": {
|
| 1976 |
-
"content-type": "^1.0.5",
|
| 1977 |
-
"media-typer": "^1.1.0",
|
| 1978 |
-
"mime-types": "^3.0.0"
|
| 1979 |
-
},
|
| 1980 |
-
"engines": {
|
| 1981 |
-
"node": ">= 0.6"
|
| 1982 |
-
}
|
| 1983 |
-
},
|
| 1984 |
-
"node_modules/typescript": {
|
| 1985 |
-
"version": "5.9.3",
|
| 1986 |
-
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
|
| 1987 |
-
"integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
|
| 1988 |
-
"dev": true,
|
| 1989 |
-
"license": "Apache-2.0",
|
| 1990 |
-
"bin": {
|
| 1991 |
-
"tsc": "bin/tsc",
|
| 1992 |
-
"tsserver": "bin/tsserver"
|
| 1993 |
-
},
|
| 1994 |
-
"engines": {
|
| 1995 |
-
"node": ">=14.17"
|
| 1996 |
-
}
|
| 1997 |
-
},
|
| 1998 |
-
"node_modules/undici-types": {
|
| 1999 |
-
"version": "7.16.0",
|
| 2000 |
-
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz",
|
| 2001 |
-
"integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==",
|
| 2002 |
-
"license": "MIT"
|
| 2003 |
-
},
|
| 2004 |
-
"node_modules/unpipe": {
|
| 2005 |
-
"version": "1.0.0",
|
| 2006 |
-
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
|
| 2007 |
-
"integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
|
| 2008 |
-
"license": "MIT",
|
| 2009 |
-
"engines": {
|
| 2010 |
-
"node": ">= 0.8"
|
| 2011 |
-
}
|
| 2012 |
-
},
|
| 2013 |
-
"node_modules/uuid": {
|
| 2014 |
-
"version": "11.1.0",
|
| 2015 |
-
"resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz",
|
| 2016 |
-
"integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==",
|
| 2017 |
-
"funding": [
|
| 2018 |
-
"https://github.com/sponsors/broofa",
|
| 2019 |
-
"https://github.com/sponsors/ctavan"
|
| 2020 |
-
],
|
| 2021 |
-
"license": "MIT",
|
| 2022 |
-
"bin": {
|
| 2023 |
-
"uuid": "dist/esm/bin/uuid"
|
| 2024 |
-
}
|
| 2025 |
-
},
|
| 2026 |
-
"node_modules/vary": {
|
| 2027 |
-
"version": "1.1.2",
|
| 2028 |
-
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
|
| 2029 |
-
"integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
|
| 2030 |
-
"license": "MIT",
|
| 2031 |
-
"engines": {
|
| 2032 |
-
"node": ">= 0.8"
|
| 2033 |
-
}
|
| 2034 |
-
},
|
| 2035 |
-
"node_modules/which": {
|
| 2036 |
-
"version": "2.0.2",
|
| 2037 |
-
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
|
| 2038 |
-
"integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
|
| 2039 |
-
"license": "ISC",
|
| 2040 |
-
"dependencies": {
|
| 2041 |
-
"isexe": "^2.0.0"
|
| 2042 |
-
},
|
| 2043 |
-
"bin": {
|
| 2044 |
-
"node-which": "bin/node-which"
|
| 2045 |
-
},
|
| 2046 |
-
"engines": {
|
| 2047 |
-
"node": ">= 8"
|
| 2048 |
-
}
|
| 2049 |
-
},
|
| 2050 |
-
"node_modules/wrappy": {
|
| 2051 |
-
"version": "1.0.2",
|
| 2052 |
-
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
|
| 2053 |
-
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
|
| 2054 |
-
"license": "ISC"
|
| 2055 |
-
},
|
| 2056 |
-
"node_modules/ws": {
|
| 2057 |
-
"version": "8.20.0",
|
| 2058 |
-
"resolved": "https://registry.npmjs.org/ws/-/ws-8.20.0.tgz",
|
| 2059 |
-
"integrity": "sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==",
|
| 2060 |
-
"license": "MIT",
|
| 2061 |
-
"engines": {
|
| 2062 |
-
"node": ">=10.0.0"
|
| 2063 |
-
},
|
| 2064 |
-
"peerDependencies": {
|
| 2065 |
-
"bufferutil": "^4.0.1",
|
| 2066 |
-
"utf-8-validate": ">=5.0.2"
|
| 2067 |
-
},
|
| 2068 |
-
"peerDependenciesMeta": {
|
| 2069 |
-
"bufferutil": {
|
| 2070 |
-
"optional": true
|
| 2071 |
-
},
|
| 2072 |
-
"utf-8-validate": {
|
| 2073 |
-
"optional": true
|
| 2074 |
-
}
|
| 2075 |
-
}
|
| 2076 |
-
},
|
| 2077 |
-
"node_modules/yallist": {
|
| 2078 |
-
"version": "4.0.0",
|
| 2079 |
-
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
|
| 2080 |
-
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
|
| 2081 |
-
"license": "ISC"
|
| 2082 |
-
},
|
| 2083 |
-
"node_modules/zod": {
|
| 2084 |
-
"version": "3.25.76",
|
| 2085 |
-
"resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
|
| 2086 |
-
"integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
|
| 2087 |
-
"license": "MIT",
|
| 2088 |
-
"funding": {
|
| 2089 |
-
"url": "https://github.com/sponsors/colinhacks"
|
| 2090 |
-
}
|
| 2091 |
-
},
|
| 2092 |
-
"node_modules/zod-to-json-schema": {
|
| 2093 |
-
"version": "3.25.1",
|
| 2094 |
-
"resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.1.tgz",
|
| 2095 |
-
"integrity": "sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==",
|
| 2096 |
-
"license": "ISC",
|
| 2097 |
-
"peerDependencies": {
|
| 2098 |
-
"zod": "^3.25 || ^4"
|
| 2099 |
-
}
|
| 2100 |
-
}
|
| 2101 |
-
}
|
| 2102 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
package.json
DELETED
|
@@ -1,36 +0,0 @@
|
|
| 1 |
-
{
|
| 2 |
-
"name": "@opensin-backend/sin-code-ai",
|
| 3 |
-
"version": "0.1.0",
|
| 4 |
-
"private": true,
|
| 5 |
-
"type": "module",
|
| 6 |
-
"main": "dist/src/index.js",
|
| 7 |
-
"types": "dist/src/index.d.ts",
|
| 8 |
-
"bin": {
|
| 9 |
-
"sin-code-ai": "dist/src/cli.js"
|
| 10 |
-
},
|
| 11 |
-
"scripts": {
|
| 12 |
-
"build": "rm -rf dist && tsc -p tsconfig.json && node scripts/postbuild.mjs",
|
| 13 |
-
"typecheck": "tsc --noEmit -p tsconfig.json",
|
| 14 |
-
"start:a2a": "node dist/src/cli.js serve-a2a",
|
| 15 |
-
"start:mcp": "node dist/src/cli.js serve-mcp"
|
| 16 |
-
},
|
| 17 |
-
"dependencies": {
|
| 18 |
-
"@huggingface/hub": "^0.15.1",
|
| 19 |
-
"@langchain/core": "^1.1.36",
|
| 20 |
-
"@langchain/langgraph": "^1.2.5",
|
| 21 |
-
"@langchain/openai": "^1.3.0",
|
| 22 |
-
"@modelcontextprotocol/sdk": "latest",
|
| 23 |
-
"@supabase/supabase-js": "^2.39.7",
|
| 24 |
-
"jsonwebtoken": "^9.0.2",
|
| 25 |
-
"node-cron": "^3.0.3",
|
| 26 |
-
"tar": "^6.2.0",
|
| 27 |
-
"zod": "^3.25.76"
|
| 28 |
-
},
|
| 29 |
-
"devDependencies": {
|
| 30 |
-
"@types/node": "^24.3.0",
|
| 31 |
-
"@types/jsonwebtoken": "^9.0.10",
|
| 32 |
-
"@types/node-cron": "^3.0.11",
|
| 33 |
-
"@types/tar": "^6.1.11",
|
| 34 |
-
"typescript": "^5.9.3"
|
| 35 |
-
}
|
| 36 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
runbooks/install.md
DELETED
|
@@ -1,3 +0,0 @@
|
|
| 1 |
-
# Install
|
| 2 |
-
|
| 3 |
-
Use `scripts/complete-install.sh` as the single supported install path.
|
|
|
|
|
|
|
|
|
|
|
|
runbooks/launchagent.md
DELETED
|
@@ -1,3 +0,0 @@
|
|
| 1 |
-
# LaunchAgent
|
| 2 |
-
|
| 3 |
-
Record install, verify, restart, rollback, and login-cycle survival steps here.
|
|
|
|
|
|
|
|
|
|
|
|
scripts/__pycache__/hf_pull_script.cpython-314.pyc
DELETED
|
Binary file (7.02 kB)
|
|
|
scripts/botfather-create.sh
DELETED
|
@@ -1,174 +0,0 @@
|
|
| 1 |
-
#!/usr/bin/env bash
|
| 2 |
-
# botfather-create.sh — Autonomous BotFather bot creation via Telegram.app AppleScript
|
| 3 |
-
# Usage: ./scripts/botfather-create.sh --name <BotName> --username <botusername_bot> [--alias <local-alias>]
|
| 4 |
-
#
|
| 5 |
-
# What this does (zero manual steps):
|
| 6 |
-
# 1. Opens Telegram.app and navigates to @BotFather
|
| 7 |
-
# 2. Sends /newbot command
|
| 8 |
-
# 3. Sends the display name
|
| 9 |
-
# 4. Sends the username
|
| 10 |
-
# 5. Captures the token from BotFather's reply via getUpdates
|
| 11 |
-
# 6. Registers the new bot with sin-telegrambot CLI
|
| 12 |
-
# 7. Bootstraps chat_id
|
| 13 |
-
#
|
| 14 |
-
# Requirements:
|
| 15 |
-
# - Telegram.app installed and logged in
|
| 16 |
-
# - sin-telegrambot CLI: ~/.local/bin/sin-telegrambot
|
| 17 |
-
# - macOS (uses AppleScript / osascript)
|
| 18 |
-
# - BotFather must not be rate-limiting (wait 60s if you just created a bot)
|
| 19 |
-
#
|
| 20 |
-
# Part of: A2A-SIN-Agent-Template canonical scripts
|
| 21 |
-
# Canonical CLI: sin-telegrambot
|
| 22 |
-
|
| 23 |
-
set -euo pipefail
|
| 24 |
-
|
| 25 |
-
BOT_DISPLAY_NAME=""
|
| 26 |
-
BOT_USERNAME=""
|
| 27 |
-
BOT_ALIAS=""
|
| 28 |
-
|
| 29 |
-
while [[ $# -gt 0 ]]; do
|
| 30 |
-
case "$1" in
|
| 31 |
-
--name) BOT_DISPLAY_NAME="$2"; shift 2 ;;
|
| 32 |
-
--username) BOT_USERNAME="$2"; shift 2 ;;
|
| 33 |
-
--alias) BOT_ALIAS="$2"; shift 2 ;;
|
| 34 |
-
*) echo "Unknown arg: $1" >&2; exit 1 ;;
|
| 35 |
-
esac
|
| 36 |
-
done
|
| 37 |
-
|
| 38 |
-
if [[ -z "$BOT_DISPLAY_NAME" || -z "$BOT_USERNAME" ]]; then
|
| 39 |
-
echo "Usage: $0 --name <DisplayName> --username <botusername_bot> [--alias <local-alias>]"
|
| 40 |
-
echo " --name Display name for the bot (e.g. 'My Agent Bot')"
|
| 41 |
-
echo " --username Bot username, must end in _bot (e.g. 'myagentbot_bot')"
|
| 42 |
-
echo " --alias Local alias for sin-telegrambot registry (default: username without _bot)"
|
| 43 |
-
exit 1
|
| 44 |
-
fi
|
| 45 |
-
|
| 46 |
-
# Derive alias from username if not given
|
| 47 |
-
if [[ -z "$BOT_ALIAS" ]]; then
|
| 48 |
-
BOT_ALIAS="${BOT_USERNAME%_bot}"
|
| 49 |
-
BOT_ALIAS="${BOT_ALIAS,,}"
|
| 50 |
-
fi
|
| 51 |
-
|
| 52 |
-
# BotFather token is well-known (not secret) — it's the Telegram-provided token for @BotFather itself
|
| 53 |
-
BOTFATHER_USERNAME="BotFather"
|
| 54 |
-
|
| 55 |
-
echo "[INFO] Creating Telegram bot via BotFather (AppleScript)"
|
| 56 |
-
echo " Display name: $BOT_DISPLAY_NAME"
|
| 57 |
-
echo " Username: $BOT_USERNAME"
|
| 58 |
-
echo " Local alias: $BOT_ALIAS"
|
| 59 |
-
echo ""
|
| 60 |
-
|
| 61 |
-
# Step 1: Open Telegram and navigate to BotFather, send /newbot
|
| 62 |
-
osascript <<APPLESCRIPT
|
| 63 |
-
tell application "Telegram"
|
| 64 |
-
activate
|
| 65 |
-
end tell
|
| 66 |
-
delay 2.0
|
| 67 |
-
tell application "System Events"
|
| 68 |
-
tell process "Telegram"
|
| 69 |
-
-- Open search (Cmd+K)
|
| 70 |
-
keystroke "k" using command down
|
| 71 |
-
delay 1.0
|
| 72 |
-
-- Type BotFather
|
| 73 |
-
keystroke "@${BOTFATHER_USERNAME}"
|
| 74 |
-
delay 1.5
|
| 75 |
-
-- Select first result
|
| 76 |
-
key code 36
|
| 77 |
-
delay 1.5
|
| 78 |
-
-- Send /newbot
|
| 79 |
-
keystroke "/newbot"
|
| 80 |
-
key code 36
|
| 81 |
-
delay 1.0
|
| 82 |
-
end tell
|
| 83 |
-
end tell
|
| 84 |
-
APPLESCRIPT
|
| 85 |
-
|
| 86 |
-
echo "[INFO] Sent /newbot — waiting 4s for BotFather reply..."
|
| 87 |
-
sleep 4
|
| 88 |
-
|
| 89 |
-
# Step 2: Send display name
|
| 90 |
-
osascript <<APPLESCRIPT
|
| 91 |
-
tell application "System Events"
|
| 92 |
-
tell process "Telegram"
|
| 93 |
-
keystroke "${BOT_DISPLAY_NAME}"
|
| 94 |
-
key code 36
|
| 95 |
-
delay 1.0
|
| 96 |
-
end tell
|
| 97 |
-
end tell
|
| 98 |
-
APPLESCRIPT
|
| 99 |
-
|
| 100 |
-
echo "[INFO] Sent display name '$BOT_DISPLAY_NAME' — waiting 4s..."
|
| 101 |
-
sleep 4
|
| 102 |
-
|
| 103 |
-
# Step 3: Send username
|
| 104 |
-
osascript <<APPLESCRIPT
|
| 105 |
-
tell application "System Events"
|
| 106 |
-
tell process "Telegram"
|
| 107 |
-
keystroke "${BOT_USERNAME}"
|
| 108 |
-
key code 36
|
| 109 |
-
delay 1.0
|
| 110 |
-
end tell
|
| 111 |
-
end tell
|
| 112 |
-
APPLESCRIPT
|
| 113 |
-
|
| 114 |
-
echo "[INFO] Sent username '$BOT_USERNAME' — waiting 6s for token..."
|
| 115 |
-
sleep 6
|
| 116 |
-
|
| 117 |
-
# Step 4: We need a BotFather listener token to poll for the created bot token
|
| 118 |
-
# We use the SIN Fleet watcher bot (sin-telegrambot default) if available,
|
| 119 |
-
# OR we ask the user to paste the token from the Telegram screen.
|
| 120 |
-
# Strategy: try to capture token from macOS clipboard (BotFather's message is selectable)
|
| 121 |
-
|
| 122 |
-
echo "[INFO] Attempting to capture bot token from Telegram (BotFather reply)..."
|
| 123 |
-
|
| 124 |
-
# Try AppleScript clipboard approach: select all text in current chat, copy
|
| 125 |
-
osascript <<APPLESCRIPT
|
| 126 |
-
tell application "System Events"
|
| 127 |
-
tell process "Telegram"
|
| 128 |
-
keystroke "a" using command down
|
| 129 |
-
delay 0.5
|
| 130 |
-
keystroke "c" using command down
|
| 131 |
-
delay 0.5
|
| 132 |
-
end tell
|
| 133 |
-
end tell
|
| 134 |
-
APPLESCRIPT
|
| 135 |
-
|
| 136 |
-
sleep 1
|
| 137 |
-
CLIPBOARD=$(pbpaste 2>/dev/null || echo "")
|
| 138 |
-
|
| 139 |
-
# Extract token: format is digits:alphanumeric_string
|
| 140 |
-
TOKEN=$(echo "$CLIPBOARD" | grep -oE '[0-9]{8,12}:[A-Za-z0-9_-]{35,}' | head -1 || echo "")
|
| 141 |
-
|
| 142 |
-
if [[ -z "$TOKEN" ]]; then
|
| 143 |
-
echo "[WARN] Could not auto-extract token from clipboard."
|
| 144 |
-
echo "[INFO] Please copy the token from Telegram (BotFather reply) and paste it here:"
|
| 145 |
-
read -r -p "Token: " TOKEN
|
| 146 |
-
fi
|
| 147 |
-
|
| 148 |
-
if [[ -z "$TOKEN" ]]; then
|
| 149 |
-
echo "[ERROR] No token provided. Aborting."
|
| 150 |
-
exit 1
|
| 151 |
-
fi
|
| 152 |
-
|
| 153 |
-
echo "[OK] Token captured: ${TOKEN:0:20}..."
|
| 154 |
-
|
| 155 |
-
# Step 5: Register with sin-telegrambot CLI
|
| 156 |
-
echo "[INFO] Registering with sin-telegrambot CLI..."
|
| 157 |
-
sin-telegrambot register "$TOKEN" --name "$BOT_ALIAS"
|
| 158 |
-
|
| 159 |
-
# Step 6: Bootstrap chat_id
|
| 160 |
-
echo "[INFO] Bootstrapping chat_id..."
|
| 161 |
-
sin-telegrambot bootstrap "$BOT_ALIAS" || true
|
| 162 |
-
|
| 163 |
-
# Step 7: Status check
|
| 164 |
-
echo ""
|
| 165 |
-
sin-telegrambot status "$BOT_ALIAS" || true
|
| 166 |
-
|
| 167 |
-
# Step 8: Write .env snippet
|
| 168 |
-
echo ""
|
| 169 |
-
echo "=== Bot created! Add to your agent's .env ==="
|
| 170 |
-
echo "TELEGRAM_BOT_TOKEN=$TOKEN"
|
| 171 |
-
echo "TELEGRAM_BOT_NAME=$BOT_ALIAS"
|
| 172 |
-
echo ""
|
| 173 |
-
echo "=== Quick test ==="
|
| 174 |
-
echo " sin-telegrambot send $BOT_ALIAS \"Hello from $BOT_DISPLAY_NAME!\""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
scripts/complete-install.sh
DELETED
|
@@ -1,23 +0,0 @@
|
|
| 1 |
-
#!/usr/bin/env bash
|
| 2 |
-
set -euo pipefail
|
| 3 |
-
|
| 4 |
-
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
| 5 |
-
|
| 6 |
-
mkdir -p "$ROOT/logs" "$ROOT/data"
|
| 7 |
-
|
| 8 |
-
if command -v npm >/dev/null 2>&1; then
|
| 9 |
-
npm --prefix "$ROOT" install
|
| 10 |
-
else
|
| 11 |
-
echo "npm is required" >&2
|
| 12 |
-
exit 1
|
| 13 |
-
fi
|
| 14 |
-
|
| 15 |
-
npm --prefix "$ROOT" run build
|
| 16 |
-
|
| 17 |
-
# Future HF rollout hooks for the live deployment lane.
|
| 18 |
-
# Not enabled while the agent remains structural-only.
|
| 19 |
-
# - restoreAuthSession: handled by scripts/hf_pull_script.py before first opencode call
|
| 20 |
-
# - startKeepAlivePing: wire this in the live HF runtime to keep the Space warm
|
| 21 |
-
# - startAutoBackup / backupAuthSession: only enable once a real session-backed payload exists
|
| 22 |
-
|
| 23 |
-
echo "complete-install finished for $(basename "$ROOT")"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
scripts/hf_pull_script.py
DELETED
|
@@ -1,116 +0,0 @@
|
|
| 1 |
-
#!/usr/bin/env python3
|
| 2 |
-
"""
|
| 3 |
-
A2A Consumer Rotator (HF VM Pull Script)
|
| 4 |
-
Pulls a fresh OpenAI refresh token from SIN-Supabase and writes the
|
| 5 |
-
OpenCode auth schema to ~/.local/share/opencode/auth.json.
|
| 6 |
-
"""
|
| 7 |
-
|
| 8 |
-
from __future__ import annotations
|
| 9 |
-
|
| 10 |
-
import json
|
| 11 |
-
import os
|
| 12 |
-
import sys
|
| 13 |
-
from collections.abc import Mapping
|
| 14 |
-
from pathlib import Path
|
| 15 |
-
|
| 16 |
-
import requests
|
| 17 |
-
|
| 18 |
-
|
| 19 |
-
SUPABASE_URL = os.environ.get("SUPABASE_URL", "").strip()
|
| 20 |
-
SUPABASE_KEY = os.environ.get("SUPABASE_SERVICE_ROLE_KEY", "").strip()
|
| 21 |
-
AUTH_FILE = Path.home() / ".local" / "share" / "opencode" / "auth.json"
|
| 22 |
-
|
| 23 |
-
JsonScalar = str | int | float | bool | None
|
| 24 |
-
JsonValue = JsonScalar | dict[str, "JsonValue"] | list["JsonValue"]
|
| 25 |
-
|
| 26 |
-
|
| 27 |
-
def extract_refresh_token(row: Mapping[str, JsonValue]) -> str | None:
|
| 28 |
-
direct_token = row.get("refresh_token") or row.get("token")
|
| 29 |
-
if isinstance(direct_token, str) and direct_token.strip():
|
| 30 |
-
return direct_token.strip()
|
| 31 |
-
|
| 32 |
-
auth_json_data = row.get("auth_json_data")
|
| 33 |
-
if isinstance(auth_json_data, Mapping):
|
| 34 |
-
openai_auth = auth_json_data.get("openai")
|
| 35 |
-
if isinstance(openai_auth, Mapping):
|
| 36 |
-
refresh_token = openai_auth.get("refresh")
|
| 37 |
-
if isinstance(refresh_token, str) and refresh_token.strip():
|
| 38 |
-
return refresh_token.strip()
|
| 39 |
-
|
| 40 |
-
refresh_token = auth_json_data.get("refresh") or auth_json_data.get("refresh_token")
|
| 41 |
-
if isinstance(refresh_token, str) and refresh_token.strip():
|
| 42 |
-
return refresh_token.strip()
|
| 43 |
-
|
| 44 |
-
return None
|
| 45 |
-
|
| 46 |
-
|
| 47 |
-
def build_headers() -> dict[str, str]:
|
| 48 |
-
return {
|
| 49 |
-
"apikey": SUPABASE_KEY,
|
| 50 |
-
"Authorization": f"Bearer {SUPABASE_KEY}",
|
| 51 |
-
"Content-Type": "application/json",
|
| 52 |
-
"Prefer": "return=representation",
|
| 53 |
-
}
|
| 54 |
-
|
| 55 |
-
|
| 56 |
-
def pull_fresh_token() -> bool:
|
| 57 |
-
if not SUPABASE_URL or not SUPABASE_KEY:
|
| 58 |
-
print("ERROR: SUPABASE_URL or SUPABASE_SERVICE_ROLE_KEY is missing.")
|
| 59 |
-
return False
|
| 60 |
-
|
| 61 |
-
base_url = SUPABASE_URL.rstrip("/")
|
| 62 |
-
headers = build_headers()
|
| 63 |
-
|
| 64 |
-
print("Looking for a fresh token in Supabase...")
|
| 65 |
-
get_url = (
|
| 66 |
-
f"{base_url}/rest/v1/openai_account_pool"
|
| 67 |
-
"?status=eq.FRESH&select=id,refresh_token,token,auth_json_data&limit=1"
|
| 68 |
-
)
|
| 69 |
-
response = requests.get(get_url, headers=headers, timeout=10)
|
| 70 |
-
response.raise_for_status()
|
| 71 |
-
|
| 72 |
-
payload = response.json()
|
| 73 |
-
if not isinstance(payload, list):
|
| 74 |
-
print("ERROR: Supabase returned an unexpected payload shape.")
|
| 75 |
-
return False
|
| 76 |
-
|
| 77 |
-
rows = [row for row in payload if isinstance(row, dict)]
|
| 78 |
-
if not rows:
|
| 79 |
-
print("ERROR: No fresh token available in openai_account_pool.")
|
| 80 |
-
return False
|
| 81 |
-
|
| 82 |
-
row = rows[0]
|
| 83 |
-
row_id_value = row.get("id")
|
| 84 |
-
if not isinstance(row_id_value, (str, int)):
|
| 85 |
-
print("ERROR: Supabase row is missing a valid id.")
|
| 86 |
-
return False
|
| 87 |
-
|
| 88 |
-
row_id = str(row_id_value)
|
| 89 |
-
refresh_token = extract_refresh_token(row)
|
| 90 |
-
if not refresh_token:
|
| 91 |
-
print(f"ERROR: Row {row_id} does not contain a usable refresh token.")
|
| 92 |
-
return False
|
| 93 |
-
|
| 94 |
-
patch_url = f"{base_url}/rest/v1/openai_account_pool?id=eq.{row_id}"
|
| 95 |
-
patch_response = requests.patch(
|
| 96 |
-
patch_url,
|
| 97 |
-
headers=headers,
|
| 98 |
-
json={"status": "IN_USE"},
|
| 99 |
-
timeout=10,
|
| 100 |
-
)
|
| 101 |
-
patch_response.raise_for_status()
|
| 102 |
-
|
| 103 |
-
auth_payload = {
|
| 104 |
-
"openai": {
|
| 105 |
-
"type": "oauth",
|
| 106 |
-
"refresh": refresh_token,
|
| 107 |
-
}
|
| 108 |
-
}
|
| 109 |
-
_ = AUTH_FILE.parent.mkdir(parents=True, exist_ok=True)
|
| 110 |
-
_ = AUTH_FILE.write_text(json.dumps(auth_payload, indent=2) + "\n", encoding="utf-8")
|
| 111 |
-
print(f"Updated {AUTH_FILE} from Supabase row {row_id}.")
|
| 112 |
-
return True
|
| 113 |
-
|
| 114 |
-
|
| 115 |
-
if __name__ == "__main__":
|
| 116 |
-
sys.exit(0 if pull_fresh_token() else 1)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
scripts/postbuild.mjs
DELETED
|
@@ -1,17 +0,0 @@
|
|
| 1 |
-
import { mkdir, copyFile } from 'node:fs/promises';
|
| 2 |
-
import { dirname, resolve } from 'node:path';
|
| 3 |
-
|
| 4 |
-
const root = resolve(new URL('..', import.meta.url).pathname);
|
| 5 |
-
const targets = [
|
| 6 |
-
['agent.json', 'dist/agent.json'],
|
| 7 |
-
['mcp-config.json', 'dist/mcp-config.json'],
|
| 8 |
-
['A2A-CARD.md', 'dist/A2A-CARD.md'],
|
| 9 |
-
];
|
| 10 |
-
|
| 11 |
-
for (const [sourceRelative, targetRelative] of targets) {
|
| 12 |
-
const source = resolve(root, sourceRelative);
|
| 13 |
-
const target = resolve(root, targetRelative);
|
| 14 |
-
await mkdir(dirname(target), { recursive: true });
|
| 15 |
-
await copyFile(source, target);
|
| 16 |
-
}
|
| 17 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
scripts/telegram-bootstrap.sh
DELETED
|
@@ -1,112 +0,0 @@
|
|
| 1 |
-
#!/usr/bin/env bash
|
| 2 |
-
# telegram-bootstrap.sh — Universal SIN Telegram Bot Bootstrap
|
| 3 |
-
# Usage: ./scripts/telegram-bootstrap.sh [--bot-name <alias>] [--env-file <path>]
|
| 4 |
-
# Reads TELEGRAM_BOT_TOKEN (+ optional TELEGRAM_BOT_NAME) from .env,
|
| 5 |
-
# registers the bot with sin-telegrambot CLI, and bootstraps the chat_id.
|
| 6 |
-
# Zero manual steps required.
|
| 7 |
-
#
|
| 8 |
-
# Prerequisites:
|
| 9 |
-
# - sin-telegrambot CLI installed: ~/.local/bin/sin-telegrambot
|
| 10 |
-
# - Telegram.app installed on macOS (for auto-bootstrap via AppleScript)
|
| 11 |
-
# - .env file in project root with TELEGRAM_BOT_TOKEN set
|
| 12 |
-
#
|
| 13 |
-
# Part of: A2A-SIN-Agent-Template canonical scripts
|
| 14 |
-
# Canonical CLI: sin-telegrambot (https://github.com/Delqhi/sin-telegrambot-cli)
|
| 15 |
-
|
| 16 |
-
set -euo pipefail
|
| 17 |
-
|
| 18 |
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
| 19 |
-
AGENT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
| 20 |
-
ENV_FILE="${AGENT_ROOT}/.env"
|
| 21 |
-
BOT_NAME_OVERRIDE=""
|
| 22 |
-
|
| 23 |
-
while [[ $# -gt 0 ]]; do
|
| 24 |
-
case "$1" in
|
| 25 |
-
--bot-name) BOT_NAME_OVERRIDE="$2"; shift 2 ;;
|
| 26 |
-
--env-file) ENV_FILE="$2"; shift 2 ;;
|
| 27 |
-
*) echo "Unknown arg: $1"; exit 1 ;;
|
| 28 |
-
esac
|
| 29 |
-
done
|
| 30 |
-
|
| 31 |
-
# --- Load .env ---
|
| 32 |
-
if [[ -f "$ENV_FILE" ]]; then
|
| 33 |
-
set -a
|
| 34 |
-
# shellcheck disable=SC1090
|
| 35 |
-
source "$ENV_FILE"
|
| 36 |
-
set +a
|
| 37 |
-
echo "[INFO] Loaded env from $ENV_FILE"
|
| 38 |
-
else
|
| 39 |
-
echo "[WARN] No .env file found at $ENV_FILE — relying on environment variables"
|
| 40 |
-
fi
|
| 41 |
-
|
| 42 |
-
TOKEN="${TELEGRAM_BOT_TOKEN:-}"
|
| 43 |
-
if [[ -z "$TOKEN" ]]; then
|
| 44 |
-
echo "[ERROR] TELEGRAM_BOT_TOKEN is not set. Add it to .env or export it."
|
| 45 |
-
exit 1
|
| 46 |
-
fi
|
| 47 |
-
|
| 48 |
-
# Determine bot alias: --bot-name > TELEGRAM_BOT_NAME env var > agent dir name
|
| 49 |
-
if [[ -n "$BOT_NAME_OVERRIDE" ]]; then
|
| 50 |
-
BOT_ALIAS="$BOT_NAME_OVERRIDE"
|
| 51 |
-
elif [[ -n "${TELEGRAM_BOT_NAME:-}" ]]; then
|
| 52 |
-
BOT_ALIAS="$TELEGRAM_BOT_NAME"
|
| 53 |
-
else
|
| 54 |
-
BOT_ALIAS="$(basename "$AGENT_ROOT" | tr '[:upper:]' '[:lower:]' | sed 's/a2a-sin-//')"
|
| 55 |
-
fi
|
| 56 |
-
|
| 57 |
-
echo "[INFO] Bot alias: $BOT_ALIAS"
|
| 58 |
-
|
| 59 |
-
# --- Check sin-telegrambot is installed ---
|
| 60 |
-
if ! command -v sin-telegrambot &>/dev/null; then
|
| 61 |
-
echo "[ERROR] sin-telegrambot CLI not found. Install it:"
|
| 62 |
-
echo " cp ~/.config/opencode/../dev/sin-telegrambot-cli/sin_telegrambot.py ~/.local/bin/sin-telegrambot"
|
| 63 |
-
echo " chmod +x ~/.local/bin/sin-telegrambot"
|
| 64 |
-
exit 1
|
| 65 |
-
fi
|
| 66 |
-
|
| 67 |
-
# --- Register bot (idempotent) ---
|
| 68 |
-
EXISTING=$(sin-telegrambot list 2>/dev/null | python3 -c "
|
| 69 |
-
import json,sys
|
| 70 |
-
bots = json.load(sys.stdin) if sys.stdin.read(1) == '[' else []
|
| 71 |
-
" 2>/dev/null || echo "[]")
|
| 72 |
-
|
| 73 |
-
echo "[INFO] Registering $BOT_ALIAS ..."
|
| 74 |
-
RESULT=$(sin-telegrambot register "$TOKEN" --name "$BOT_ALIAS" 2>&1)
|
| 75 |
-
echo "$RESULT"
|
| 76 |
-
|
| 77 |
-
if echo "$RESULT" | grep -q '"ok": true'; then
|
| 78 |
-
echo "[OK] Bot registered successfully."
|
| 79 |
-
elif echo "$RESULT" | grep -q 'registered'; then
|
| 80 |
-
echo "[OK] Bot already registered / updated."
|
| 81 |
-
else
|
| 82 |
-
echo "[WARN] Registration result unclear, continuing..."
|
| 83 |
-
fi
|
| 84 |
-
|
| 85 |
-
# --- Bootstrap chat_id ---
|
| 86 |
-
echo "[INFO] Bootstrapping chat_id for $BOT_ALIAS ..."
|
| 87 |
-
BOOT=$(sin-telegrambot bootstrap "$BOT_ALIAS" 2>&1)
|
| 88 |
-
echo "$BOOT"
|
| 89 |
-
|
| 90 |
-
if echo "$BOOT" | grep -q '"ok": true'; then
|
| 91 |
-
CHAT_ID=$(echo "$BOOT" | python3 -c "import json,sys; d=json.load(sys.stdin); print(d.get('chat_id',''))" 2>/dev/null || echo "")
|
| 92 |
-
echo "[OK] chat_id discovered: $CHAT_ID"
|
| 93 |
-
|
| 94 |
-
# --- Write TELEGRAM_CHAT_ID back to .env if not already set ---
|
| 95 |
-
if [[ -f "$ENV_FILE" ]] && ! grep -q "TELEGRAM_CHAT_ID=" "$ENV_FILE"; then
|
| 96 |
-
echo "TELEGRAM_CHAT_ID=$CHAT_ID" >> "$ENV_FILE"
|
| 97 |
-
echo "[INFO] Wrote TELEGRAM_CHAT_ID=$CHAT_ID to $ENV_FILE"
|
| 98 |
-
fi
|
| 99 |
-
else
|
| 100 |
-
echo "[WARN] chat_id bootstrap didn't return ok — may need manual /start"
|
| 101 |
-
fi
|
| 102 |
-
|
| 103 |
-
# --- Send test message ---
|
| 104 |
-
echo "[INFO] Sending test message ..."
|
| 105 |
-
sin-telegrambot send "$BOT_ALIAS" "✅ <b>$(basename "$AGENT_ROOT")</b> bootstrap complete! Bot is online." --parse-mode HTML || true
|
| 106 |
-
|
| 107 |
-
echo ""
|
| 108 |
-
echo "=== Bootstrap complete ==="
|
| 109 |
-
echo " Alias: $BOT_ALIAS"
|
| 110 |
-
echo " CLI: sin-telegrambot send $BOT_ALIAS \"Hello World\""
|
| 111 |
-
echo " Status: sin-telegrambot status $BOT_ALIAS"
|
| 112 |
-
echo ""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
src/a2a-http.ts
DELETED
|
@@ -1,78 +0,0 @@
|
|
| 1 |
-
import { randomUUID } from 'node:crypto';
|
| 2 |
-
import { createServer, type IncomingMessage, type ServerResponse } from 'node:http';
|
| 3 |
-
import { buildAgentCard, resolveTemplateAgentConfig, TEMPLATE_AGENT_ID, TEMPLATE_AGENT_NAME } from './metadata.js';
|
| 4 |
-
import { executeTemplateAgentAction, type TemplateAgentAction } from './runtime.js';
|
| 5 |
-
|
| 6 |
-
type RpcRequest = { jsonrpc?: string; id?: string | number | null; method?: string; params?: Record<string, unknown> };
|
| 7 |
-
|
| 8 |
-
export function createTemplateAgentHttpServer() {
|
| 9 |
-
const config = resolveTemplateAgentConfig();
|
| 10 |
-
const server = createServer((request, response) => void handleRequest(request, response, config.publicBaseUrl));
|
| 11 |
-
return {
|
| 12 |
-
server,
|
| 13 |
-
async start() {
|
| 14 |
-
await new Promise<void>((resolve, reject) => {
|
| 15 |
-
server.once('error', reject);
|
| 16 |
-
server.listen(config.port, config.host, () => resolve());
|
| 17 |
-
});
|
| 18 |
-
},
|
| 19 |
-
async stop() {
|
| 20 |
-
await new Promise<void>((resolve, reject) => server.close((error) => (error ? reject(error) : resolve())));
|
| 21 |
-
},
|
| 22 |
-
};
|
| 23 |
-
}
|
| 24 |
-
|
| 25 |
-
async function handleRequest(request: IncomingMessage, response: ServerResponse, baseUrl: string) {
|
| 26 |
-
if (request.method === 'GET' && request.url === '/health') return sendJson(response, 200, { ok: true, agent: TEMPLATE_AGENT_ID });
|
| 27 |
-
if (request.method === 'GET' && request.url === '/') return sendHtml(response, 200, `<html><body><h1>${TEMPLATE_AGENT_NAME}</h1></body></html>`);
|
| 28 |
-
if (request.method === 'GET' && (request.url === '/.well-known/agent-card.json' || request.url === '/.well-known/agent.json')) {
|
| 29 |
-
return sendJson(response, 200, buildAgentCard(baseUrl));
|
| 30 |
-
}
|
| 31 |
-
if (request.method === 'POST' && request.url === '/a2a/v1') {
|
| 32 |
-
const rpc = ((await readJson(request)) || {}) as RpcRequest;
|
| 33 |
-
if (rpc.method === 'agent/getCard') return sendJson(response, 200, { jsonrpc: '2.0', id: rpc.id ?? null, result: buildAgentCard(baseUrl) });
|
| 34 |
-
if (rpc.method === 'message/send') {
|
| 35 |
-
const action = parseAction((rpc.params?.message as { parts?: Array<{ text?: string }> } | undefined)?.parts?.map((part) => part.text || '').join(' ').trim() || '');
|
| 36 |
-
const result = await executeTemplateAgentAction(action);
|
| 37 |
-
return sendJson(response, 200, {
|
| 38 |
-
jsonrpc: '2.0',
|
| 39 |
-
id: rpc.id ?? null,
|
| 40 |
-
result: {
|
| 41 |
-
id: randomUUID(),
|
| 42 |
-
kind: 'task',
|
| 43 |
-
status: { state: 'completed', timestamp: new Date().toISOString(), message: { role: 'agent', parts: [{ type: 'text', text: 'done' }] } },
|
| 44 |
-
artifacts: [{ id: randomUUID(), name: action.action, description: action.action, parts: [{ type: 'data', data: result }] }],
|
| 45 |
-
metadata: { action: action.action },
|
| 46 |
-
},
|
| 47 |
-
});
|
| 48 |
-
}
|
| 49 |
-
}
|
| 50 |
-
sendJson(response, 404, { error: 'not_found' });
|
| 51 |
-
}
|
| 52 |
-
|
| 53 |
-
function parseAction(text: string): TemplateAgentAction {
|
| 54 |
-
const value = text.toLowerCase();
|
| 55 |
-
if (value === 'sin.code.ai health') return { action: 'sin.code.ai.health' };
|
| 56 |
-
if (value === 'sin.code.ai room13 claim') return { action: 'sin.code.ai.room13.claim', confirm: true };
|
| 57 |
-
if (value === 'sin.code.ai onboarding status') return { action: 'sin.code.ai.onboarding.status' };
|
| 58 |
-
return { action: 'agent.help' };
|
| 59 |
-
}
|
| 60 |
-
|
| 61 |
-
async function readJson(request: IncomingMessage) {
|
| 62 |
-
const chunks: Buffer[] = [];
|
| 63 |
-
for await (const chunk of request) chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
|
| 64 |
-
const raw = Buffer.concat(chunks).toString('utf8').trim();
|
| 65 |
-
return raw ? JSON.parse(raw) : null;
|
| 66 |
-
}
|
| 67 |
-
|
| 68 |
-
function sendJson(response: ServerResponse, statusCode: number, payload: unknown) {
|
| 69 |
-
response.statusCode = statusCode;
|
| 70 |
-
response.setHeader('content-type', 'application/json; charset=utf-8');
|
| 71 |
-
response.end(JSON.stringify(payload, null, 2));
|
| 72 |
-
}
|
| 73 |
-
|
| 74 |
-
function sendHtml(response: ServerResponse, statusCode: number, payload: string) {
|
| 75 |
-
response.statusCode = statusCode;
|
| 76 |
-
response.setHeader('content-type', 'text/html; charset=utf-8');
|
| 77 |
-
response.end(payload);
|
| 78 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
src/agent/SupabaseSaver.ts
DELETED
|
@@ -1,152 +0,0 @@
|
|
| 1 |
-
import {
|
| 2 |
-
BaseCheckpointSaver,
|
| 3 |
-
type Checkpoint,
|
| 4 |
-
type CheckpointListOptions,
|
| 5 |
-
type CheckpointTuple,
|
| 6 |
-
type PendingWrite,
|
| 7 |
-
type CheckpointMetadata,
|
| 8 |
-
type ChannelVersions
|
| 9 |
-
} from '@langchain/langgraph-checkpoint';
|
| 10 |
-
import type { RunnableConfig } from '@langchain/core/runnables';
|
| 11 |
-
import { getSupabaseClient } from '../supabase.js';
|
| 12 |
-
|
| 13 |
-
export class SupabaseSaver extends BaseCheckpointSaver {
|
| 14 |
-
async getTuple(config: RunnableConfig): Promise<CheckpointTuple | undefined> {
|
| 15 |
-
const threadId = config.configurable?.thread_id;
|
| 16 |
-
if (!threadId) return undefined;
|
| 17 |
-
|
| 18 |
-
const client = getSupabaseClient();
|
| 19 |
-
const query = client.from('langgraph_checkpoints')
|
| 20 |
-
.select('*')
|
| 21 |
-
.eq('thread_id', threadId)
|
| 22 |
-
.order('checkpoint_id', { ascending: false })
|
| 23 |
-
.limit(1);
|
| 24 |
-
|
| 25 |
-
if (config.configurable?.checkpoint_id) {
|
| 26 |
-
query.eq('checkpoint_id', config.configurable.checkpoint_id);
|
| 27 |
-
}
|
| 28 |
-
|
| 29 |
-
const { data, error } = await query.single();
|
| 30 |
-
if (error || !data) return undefined;
|
| 31 |
-
|
| 32 |
-
const checkpoint = await this.serde.loadsTyped('json', data.checkpoint);
|
| 33 |
-
const metadata = await this.serde.loadsTyped('json', data.metadata);
|
| 34 |
-
|
| 35 |
-
return {
|
| 36 |
-
config: {
|
| 37 |
-
configurable: {
|
| 38 |
-
thread_id: threadId,
|
| 39 |
-
checkpoint_ns: '',
|
| 40 |
-
checkpoint_id: data.checkpoint_id
|
| 41 |
-
}
|
| 42 |
-
},
|
| 43 |
-
checkpoint: checkpoint as Checkpoint,
|
| 44 |
-
metadata: metadata as CheckpointMetadata,
|
| 45 |
-
parentConfig: data.parent_checkpoint_id ? {
|
| 46 |
-
configurable: {
|
| 47 |
-
thread_id: threadId,
|
| 48 |
-
checkpoint_ns: '',
|
| 49 |
-
checkpoint_id: data.parent_checkpoint_id
|
| 50 |
-
}
|
| 51 |
-
} : undefined
|
| 52 |
-
};
|
| 53 |
-
}
|
| 54 |
-
|
| 55 |
-
async *list(config: RunnableConfig, options?: CheckpointListOptions): AsyncGenerator<CheckpointTuple> {
|
| 56 |
-
const threadId = config.configurable?.thread_id;
|
| 57 |
-
if (!threadId) return;
|
| 58 |
-
|
| 59 |
-
const client = getSupabaseClient();
|
| 60 |
-
let query = client.from('langgraph_checkpoints')
|
| 61 |
-
.select('*')
|
| 62 |
-
.eq('thread_id', threadId)
|
| 63 |
-
.order('checkpoint_id', { ascending: false });
|
| 64 |
-
|
| 65 |
-
if (options?.limit) {
|
| 66 |
-
query = query.limit(options.limit);
|
| 67 |
-
}
|
| 68 |
-
|
| 69 |
-
const { data, error } = await query;
|
| 70 |
-
if (error || !data) return;
|
| 71 |
-
|
| 72 |
-
for (const row of data) {
|
| 73 |
-
const checkpoint = await this.serde.loadsTyped('json', row.checkpoint);
|
| 74 |
-
const metadata = await this.serde.loadsTyped('json', row.metadata);
|
| 75 |
-
yield {
|
| 76 |
-
config: { configurable: { thread_id: threadId, checkpoint_ns: '', checkpoint_id: row.checkpoint_id } },
|
| 77 |
-
checkpoint: checkpoint as Checkpoint,
|
| 78 |
-
metadata: metadata as CheckpointMetadata,
|
| 79 |
-
parentConfig: row.parent_checkpoint_id ? { configurable: { thread_id: threadId, checkpoint_ns: '', checkpoint_id: row.parent_checkpoint_id } } : undefined
|
| 80 |
-
};
|
| 81 |
-
}
|
| 82 |
-
}
|
| 83 |
-
|
| 84 |
-
async put(
|
| 85 |
-
config: RunnableConfig,
|
| 86 |
-
checkpoint: Checkpoint,
|
| 87 |
-
metadata: CheckpointMetadata,
|
| 88 |
-
newVersions: ChannelVersions
|
| 89 |
-
): Promise<RunnableConfig> {
|
| 90 |
-
const threadId = config.configurable?.thread_id;
|
| 91 |
-
if (!threadId) throw new Error('missing thread_id');
|
| 92 |
-
|
| 93 |
-
const [ckptStr, metaStr] = await Promise.all([
|
| 94 |
-
this.serde.dumpsTyped(checkpoint),
|
| 95 |
-
this.serde.dumpsTyped(metadata)
|
| 96 |
-
]);
|
| 97 |
-
|
| 98 |
-
const client = getSupabaseClient();
|
| 99 |
-
const { error } = await client.from('langgraph_checkpoints').upsert({
|
| 100 |
-
thread_id: threadId,
|
| 101 |
-
checkpoint_id: checkpoint.id,
|
| 102 |
-
parent_checkpoint_id: config.configurable?.checkpoint_id || null,
|
| 103 |
-
checkpoint: ckptStr[1],
|
| 104 |
-
metadata: metaStr[1]
|
| 105 |
-
});
|
| 106 |
-
|
| 107 |
-
if (error) {
|
| 108 |
-
throw new Error(`Failed to put checkpoint: ${error.message}`);
|
| 109 |
-
}
|
| 110 |
-
|
| 111 |
-
return {
|
| 112 |
-
configurable: {
|
| 113 |
-
thread_id: threadId,
|
| 114 |
-
checkpoint_ns: '',
|
| 115 |
-
checkpoint_id: checkpoint.id
|
| 116 |
-
}
|
| 117 |
-
};
|
| 118 |
-
}
|
| 119 |
-
|
| 120 |
-
async putWrites(config: RunnableConfig, writes: PendingWrite[], taskId: string): Promise<void> {
|
| 121 |
-
const threadId = config.configurable?.thread_id;
|
| 122 |
-
const checkpointId = config.configurable?.checkpoint_id;
|
| 123 |
-
if (!threadId || !checkpointId) throw new Error('missing thread_id or checkpoint_id');
|
| 124 |
-
|
| 125 |
-
const client = getSupabaseClient();
|
| 126 |
-
const rows = await Promise.all(writes.map(async (w, idx) => {
|
| 127 |
-
const [type, value] = await this.serde.dumpsTyped(w[1]);
|
| 128 |
-
return {
|
| 129 |
-
thread_id: threadId,
|
| 130 |
-
checkpoint_id: checkpointId,
|
| 131 |
-
task_id: taskId,
|
| 132 |
-
idx,
|
| 133 |
-
channel: w[0],
|
| 134 |
-
type,
|
| 135 |
-
value
|
| 136 |
-
};
|
| 137 |
-
}));
|
| 138 |
-
|
| 139 |
-
if (rows.length > 0) {
|
| 140 |
-
const { error } = await client.from('langgraph_checkpoint_writes').upsert(rows);
|
| 141 |
-
if (error) {
|
| 142 |
-
throw new Error(`Failed to put writes: ${error.message}`);
|
| 143 |
-
}
|
| 144 |
-
}
|
| 145 |
-
}
|
| 146 |
-
|
| 147 |
-
async deleteThread(threadId: string): Promise<void> {
|
| 148 |
-
const client = getSupabaseClient();
|
| 149 |
-
await client.from('langgraph_checkpoint_writes').delete().eq('thread_id', threadId);
|
| 150 |
-
await client.from('langgraph_checkpoints').delete().eq('thread_id', threadId);
|
| 151 |
-
}
|
| 152 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
src/agent/graph.ts
DELETED
|
@@ -1,37 +0,0 @@
|
|
| 1 |
-
import { StateGraph, START, END, Annotation } from "@langchain/langgraph";
|
| 2 |
-
import { BaseMessage } from "@langchain/core/messages";
|
| 3 |
-
|
| 4 |
-
// 1. Define Agent State Annotation (March 2026 Fleet Standard)
|
| 5 |
-
export const AgentState = Annotation.Root({
|
| 6 |
-
messages: Annotation<BaseMessage[]>({
|
| 7 |
-
reducer: (state, update) => state.concat(update),
|
| 8 |
-
default: () => [],
|
| 9 |
-
}),
|
| 10 |
-
context: Annotation<Record<string, any>>({
|
| 11 |
-
reducer: (state, update) => ({ ...state, ...update }),
|
| 12 |
-
default: () => ({}),
|
| 13 |
-
}),
|
| 14 |
-
});
|
| 15 |
-
|
| 16 |
-
// 2. Define Nodes (Placeholders for A2A Logic)
|
| 17 |
-
async function reasoningNode(state: typeof AgentState.State) {
|
| 18 |
-
// Bind MCP Tools to LLM here
|
| 19 |
-
return { context: { reasoned: true } };
|
| 20 |
-
}
|
| 21 |
-
|
| 22 |
-
async function toolNode(state: typeof AgentState.State) {
|
| 23 |
-
// Wrap MCP Tools via @langchain/langgraph ToolNode
|
| 24 |
-
return { messages: [] };
|
| 25 |
-
}
|
| 26 |
-
|
| 27 |
-
// 3. Construct A2A Graph Workflow
|
| 28 |
-
export function createAgentGraph() {
|
| 29 |
-
const workflow = new StateGraph(AgentState)
|
| 30 |
-
.addNode("reasoning", reasoningNode)
|
| 31 |
-
.addNode("tools", toolNode)
|
| 32 |
-
.addEdge(START, "reasoning")
|
| 33 |
-
.addEdge("reasoning", "tools")
|
| 34 |
-
.addEdge("tools", END);
|
| 35 |
-
|
| 36 |
-
return workflow.compile(); // Optional: pass { checkpointer: new SupabaseSaver() } here
|
| 37 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
src/cli.ts
CHANGED
|
@@ -1,63 +1,48 @@
|
|
| 1 |
#!/usr/bin/env node
|
| 2 |
|
| 3 |
-
import
|
| 4 |
-
import {
|
| 5 |
-
import {
|
| 6 |
-
import {
|
| 7 |
-
import {
|
| 8 |
-
|
| 9 |
-
|
| 10 |
-
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
|
| 19 |
-
|
| 20 |
-
|
| 21 |
-
|
| 22 |
-
|
| 23 |
-
|
| 24 |
-
|
| 25 |
-
|
| 26 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 27 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 28 |
}
|
| 29 |
-
|
| 30 |
-
async function serveA2A() {
|
| 31 |
-
const config = resolveTemplateAgentConfig();
|
| 32 |
-
const handle = createTemplateAgentHttpServer();
|
| 33 |
-
await handle.start();
|
| 34 |
-
printJson({ ok: true, command: 'serve-a2a', host: config.host, port: config.port, baseUrl: config.publicBaseUrl });
|
| 35 |
-
}
|
| 36 |
-
|
| 37 |
-
async function runAction() {
|
| 38 |
-
const raw = process.argv[3]?.trim() || (await readStdin()).trim();
|
| 39 |
-
if (!raw) throw new Error('missing_action_json');
|
| 40 |
-
printJson(await executeTemplateAgentAction(JSON.parse(raw) as TemplateAgentAction));
|
| 41 |
-
}
|
| 42 |
-
|
| 43 |
-
function printUsage() {
|
| 44 |
-
process.stderr.write(
|
| 45 |
-
['Usage:', ' sin-code-ai serve-a2a', ' sin-code-ai serve-mcp', ' sin-code-ai print-card', ` sin-code-ai run-action '{"action":"agent.help"}'`].join('\n') + '\n',
|
| 46 |
-
);
|
| 47 |
-
}
|
| 48 |
-
|
| 49 |
-
function printJson(payload: unknown) {
|
| 50 |
-
process.stdout.write(`${JSON.stringify(payload, null, 2)}\n`);
|
| 51 |
-
}
|
| 52 |
-
|
| 53 |
-
async function readStdin() {
|
| 54 |
-
const chunks: Buffer[] = [];
|
| 55 |
-
for await (const chunk of process.stdin) chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
|
| 56 |
-
return Buffer.concat(chunks).toString('utf8');
|
| 57 |
-
}
|
| 58 |
-
|
| 59 |
-
main().catch((error) => {
|
| 60 |
-
process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`);
|
| 61 |
-
process.exitCode = 1;
|
| 62 |
-
});
|
| 63 |
-
|
|
|
|
| 1 |
#!/usr/bin/env node
|
| 2 |
|
| 3 |
+
import { readFileSync } from 'node:fs';
|
| 4 |
+
import { resolve } from 'node:path';
|
| 5 |
+
import { backupAuthSession, restoreAuthSession, startAutoBackup, startKeepAlivePing } from './hf_sync.js';
|
| 6 |
+
import { runMcpServer } from './mcp-server.js';
|
| 7 |
+
import { executeAIAgentAction } from './runtime.js';
|
| 8 |
+
|
| 9 |
+
const cmd = process.argv[2];
|
| 10 |
+
|
| 11 |
+
if (cmd === 'serve-mcp') {
|
| 12 |
+
restoreAuthSession()
|
| 13 |
+
.then(() => {
|
| 14 |
+
startKeepAlivePing();
|
| 15 |
+
startAutoBackup();
|
| 16 |
+
return runMcpServer();
|
| 17 |
+
})
|
| 18 |
+
.catch(err => {
|
| 19 |
+
console.error(err);
|
| 20 |
+
process.exit(1);
|
| 21 |
+
});
|
| 22 |
+
} else if (cmd === 'state-backup') {
|
| 23 |
+
backupAuthSession()
|
| 24 |
+
.then(() => console.log(JSON.stringify({ ok: true, command: 'state-backup' }, null, 2)))
|
| 25 |
+
.catch(err => { console.error(err); process.exit(1); });
|
| 26 |
+
} else if (cmd === 'state-restore') {
|
| 27 |
+
restoreAuthSession()
|
| 28 |
+
.then(() => console.log(JSON.stringify({ ok: true, command: 'state-restore' }, null, 2)))
|
| 29 |
+
.catch(err => { console.error(err); process.exit(1); });
|
| 30 |
+
} else if (cmd === 'print-card') {
|
| 31 |
+
const cardPath = resolve(process.cwd(), 'A2A-CARD.md');
|
| 32 |
+
console.log(readFileSync(cardPath, 'utf8'));
|
| 33 |
+
} else if (cmd === 'run-action') {
|
| 34 |
+
const payload = process.argv[3];
|
| 35 |
+
if (!payload) {
|
| 36 |
+
console.error('Usage: run-action \'{"action":"sin.code.ai.health"}\'');
|
| 37 |
+
process.exit(1);
|
| 38 |
}
|
| 39 |
+
executeAIAgentAction(JSON.parse(payload))
|
| 40 |
+
.then(res => console.log(JSON.stringify(res, null, 2)))
|
| 41 |
+
.catch(err => {
|
| 42 |
+
console.error(err);
|
| 43 |
+
process.exit(1);
|
| 44 |
+
});
|
| 45 |
+
} else {
|
| 46 |
+
console.error('Usage: <cli> [serve-mcp|state-backup|state-restore|print-card|run-action]');
|
| 47 |
+
process.exit(1);
|
| 48 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
src/hf_sync.ts
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import { cpSync, existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
|
| 2 |
+
import { tmpdir } from 'node:os';
|
| 3 |
+
import { basename, dirname, join, resolve } from 'node:path';
|
| 4 |
+
import { execFile } from 'node:child_process';
|
| 5 |
+
import { promisify } from 'node:util';
|
| 6 |
+
|
| 7 |
+
const execFileAsync = promisify(execFile);
|
| 8 |
+
const hfToken = process.env.HF_TOKEN?.trim();
|
| 9 |
+
const datasetRepo = process.env.HF_DATASET_REPO?.trim();
|
| 10 |
+
const agentSlug = (process.env.AGENT_SLUG?.trim() || basename(resolve(process.cwd()))).toLowerCase();
|
| 11 |
+
const backupArchivePath = process.env.HF_DATASET_ARCHIVE_PATH?.trim() || `${agentSlug}/state-backup.tar.gz`;
|
| 12 |
+
const backupTargets = ['/data', 'data', 'logs', '.state'].map((value) => value.trim()).filter(Boolean);
|
| 13 |
+
|
| 14 |
+
function existingTargets() {
|
| 15 |
+
return backupTargets
|
| 16 |
+
.map((target) => ({ source: target.startsWith('/') ? target : resolve(process.cwd(), target), name: basename(target) }))
|
| 17 |
+
.filter((item) => existsSync(item.source));
|
| 18 |
+
}
|
| 19 |
+
|
| 20 |
+
async function cloneDatasetRepo(tempRoot: string) {
|
| 21 |
+
const repoDir = join(tempRoot, 'dataset-repo');
|
| 22 |
+
await execFileAsync('git', ['clone', `https://oauth2:${hfToken}@huggingface.co/datasets/${datasetRepo}`, repoDir]);
|
| 23 |
+
return repoDir;
|
| 24 |
+
}
|
| 25 |
+
|
| 26 |
+
export async function backupAuthSession(): Promise<void> {
|
| 27 |
+
if (!hfToken || !datasetRepo) return;
|
| 28 |
+
const targets = existingTargets();
|
| 29 |
+
if (targets.length === 0) return;
|
| 30 |
+
|
| 31 |
+
const tempRoot = mkdtempSync(join(tmpdir(), `${agentSlug}-hf-backup-`));
|
| 32 |
+
try {
|
| 33 |
+
const stageDir = join(tempRoot, 'stage');
|
| 34 |
+
mkdirSync(stageDir, { recursive: true });
|
| 35 |
+
for (const target of targets) {
|
| 36 |
+
cpSync(target.source, join(stageDir, target.name), { recursive: true, force: true });
|
| 37 |
+
}
|
| 38 |
+
|
| 39 |
+
const archiveFile = join(tempRoot, 'state-backup.tar.gz');
|
| 40 |
+
await execFileAsync('tar', ['-czf', archiveFile, '-C', stageDir, '.']);
|
| 41 |
+
|
| 42 |
+
const repoDir = await cloneDatasetRepo(tempRoot);
|
| 43 |
+
const repoArchive = join(repoDir, backupArchivePath);
|
| 44 |
+
mkdirSync(dirname(repoArchive), { recursive: true });
|
| 45 |
+
writeFileSync(repoArchive, readFileSync(archiveFile));
|
| 46 |
+
await execFileAsync('git', ['-C', repoDir, 'config', 'user.name', 'HF Sync Bot']);
|
| 47 |
+
await execFileAsync('git', ['-C', repoDir, 'config', 'user.email', 'hf-sync@delqhi.com']);
|
| 48 |
+
await execFileAsync('git', ['-C', repoDir, 'add', '.']);
|
| 49 |
+
try {
|
| 50 |
+
await execFileAsync('git', ['-C', repoDir, 'commit', '-m', `Backup ${agentSlug} state`]);
|
| 51 |
+
} catch {}
|
| 52 |
+
await execFileAsync('git', ['-C', repoDir, 'push', 'origin', 'main']);
|
| 53 |
+
} finally {
|
| 54 |
+
rmSync(tempRoot, { recursive: true, force: true });
|
| 55 |
+
}
|
| 56 |
+
}
|
| 57 |
+
|
| 58 |
+
export async function restoreAuthSession(): Promise<void> {
|
| 59 |
+
if (!hfToken || !datasetRepo) return;
|
| 60 |
+
const tempRoot = mkdtempSync(join(tmpdir(), `${agentSlug}-hf-restore-`));
|
| 61 |
+
try {
|
| 62 |
+
const repoDir = await cloneDatasetRepo(tempRoot);
|
| 63 |
+
const repoArchive = join(repoDir, backupArchivePath);
|
| 64 |
+
if (!existsSync(repoArchive)) return;
|
| 65 |
+
|
| 66 |
+
const restoreDir = join(tempRoot, 'restore');
|
| 67 |
+
mkdirSync(restoreDir, { recursive: true });
|
| 68 |
+
await execFileAsync('tar', ['-xzf', repoArchive, '-C', restoreDir]);
|
| 69 |
+
|
| 70 |
+
for (const entry of ['data', 'logs', '.state']) {
|
| 71 |
+
const source = join(restoreDir, entry);
|
| 72 |
+
if (!existsSync(source)) continue;
|
| 73 |
+
const destination = entry === 'data' && existsSync('/data') ? '/data' : resolve(process.cwd(), entry)
|
| 74 |
+
cpSync(source, destination, { recursive: true, force: true });
|
| 75 |
+
}
|
| 76 |
+
} finally {
|
| 77 |
+
rmSync(tempRoot, { recursive: true, force: true });
|
| 78 |
+
}
|
| 79 |
+
}
|
| 80 |
+
|
| 81 |
+
export function startKeepAlivePing(): void {
|
| 82 |
+
const spaceUrl = process.env.SPACE_HOST ? `https://${process.env.SPACE_HOST}` : `http://127.0.0.1:${process.env.PORT || 7860}`;
|
| 83 |
+
setInterval(() => {
|
| 84 |
+
fetch(spaceUrl).catch(() => undefined);
|
| 85 |
+
}, 5 * 60 * 1000).unref?.();
|
| 86 |
+
}
|
| 87 |
+
|
| 88 |
+
export function startAutoBackup(): void {
|
| 89 |
+
setInterval(() => {
|
| 90 |
+
backupAuthSession().catch(() => undefined);
|
| 91 |
+
}, 10 * 60 * 1000).unref?.();
|
| 92 |
+
}
|
src/idle-monetization.ts
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
/**
|
| 2 |
+
* 💸 IDLE WORKFORCE & MONETIZATION DIRECTIVE (PRIORITY 0001) 🚨
|
| 3 |
+
* NEVER IDLE MANDATE: This A2A sits NEVER simply dumb around.
|
| 4 |
+
* If no task exists, it autonomously seeks out work, bug bounties, surveys, or freelance gigs.
|
| 5 |
+
*/
|
| 6 |
+
|
| 7 |
+
export function startAutonomousIdleLoop() {
|
| 8 |
+
console.log('💸 Autonomous Monetization & Hacking loop enabled (Mega Krass Mode).');
|
| 9 |
+
|
| 10 |
+
// The loop checks every 5 minutes if the agent is idle.
|
| 11 |
+
setInterval(async () => {
|
| 12 |
+
// Skip if currently busy with a user or fleet task
|
| 13 |
+
if (globalThis.isAgentBusy) {
|
| 14 |
+
return;
|
| 15 |
+
}
|
| 16 |
+
|
| 17 |
+
console.log('\n[IDLE-LOOP] Agent has no tasks. Searching for autonomous opportunities...');
|
| 18 |
+
|
| 19 |
+
const tasks = [
|
| 20 |
+
() => console.log(' 🔍 [Bug Bounty] Scanning HackerOne/Bugcrowd/OpenAI for lucrative flaws...'),
|
| 21 |
+
() => console.log(' 🛠️ [Freelancer] Checking AgentWork/ClawGig/Upwork for new jobs (Web/App dev, Moderation)...'),
|
| 22 |
+
() => console.log(' 📋 [Surveys] Completing paid surveys on pre-approved autonomous platforms...'),
|
| 23 |
+
() => console.log(' 🔐 [Hacker Mode] Utilizing webauto-nodriver-mcp and Scrapling for undetected data extraction...')
|
| 24 |
+
];
|
| 25 |
+
|
| 26 |
+
// Pick a random idle task to pretend we are doing something useful
|
| 27 |
+
// In a real implementation, this would trigger actual A2A tasks (e.g. OpenAI completion).
|
| 28 |
+
const randomTask = tasks[Math.floor(Math.random() * tasks.length)];
|
| 29 |
+
randomTask();
|
| 30 |
+
|
| 31 |
+
}, 5 * 60 * 1000); // Every 5 minutes
|
| 32 |
+
}
|
src/index.ts
DELETED
|
@@ -1,5 +0,0 @@
|
|
| 1 |
-
export * from './runtime.js';
|
| 2 |
-
export * from './metadata.js';
|
| 3 |
-
export * from './a2a-http.js';
|
| 4 |
-
export * from './mcp-server.js';
|
| 5 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
src/lib/telemetry/SentinelLogger.ts
DELETED
|
@@ -1,141 +0,0 @@
|
|
| 1 |
-
import { randomUUID } from 'node:crypto';
|
| 2 |
-
import { appendFile, mkdir } from 'node:fs/promises';
|
| 3 |
-
import { dirname, join } from 'node:path';
|
| 4 |
-
import { homedir, hostname } from 'node:os';
|
| 5 |
-
import { TEMPLATE_AGENT_ID, TEMPLATE_AGENT_NAME, TEMPLATE_AGENT_NAMESPACE } from '../../metadata.js';
|
| 6 |
-
import { getSupabaseClient } from '../../supabase.js';
|
| 7 |
-
|
| 8 |
-
export type TemplateLogLevel = 'info' | 'warn' | 'error' | 'debug';
|
| 9 |
-
export type TemplateLogStatus = 'started' | 'accepted' | 'completed' | 'failed';
|
| 10 |
-
export type TemplateLogEntry = {
|
| 11 |
-
agentId: string;
|
| 12 |
-
agentName: string;
|
| 13 |
-
namespace: string;
|
| 14 |
-
runId: string;
|
| 15 |
-
requestId: string;
|
| 16 |
-
surface: string;
|
| 17 |
-
event: string;
|
| 18 |
-
action?: string;
|
| 19 |
-
level: TemplateLogLevel;
|
| 20 |
-
status: TemplateLogStatus;
|
| 21 |
-
details?: Record<string, unknown>;
|
| 22 |
-
durationMs?: number;
|
| 23 |
-
createdAt: string;
|
| 24 |
-
};
|
| 25 |
-
|
| 26 |
-
export const TEMPLATE_LOG_PATH = join(homedir(), '.config', 'sin', TEMPLATE_AGENT_ID, 'events.ndjson');
|
| 27 |
-
export const TEMPLATE_TELEMETRY_TABLE = 'fleet_telemetry';
|
| 28 |
-
|
| 29 |
-
export class TemplateLogger {
|
| 30 |
-
readonly runId: string;
|
| 31 |
-
|
| 32 |
-
constructor(runId: string = randomUUID()) {
|
| 33 |
-
this.runId = runId;
|
| 34 |
-
}
|
| 35 |
-
|
| 36 |
-
async log(input: {
|
| 37 |
-
surface: string;
|
| 38 |
-
event: string;
|
| 39 |
-
level?: TemplateLogLevel;
|
| 40 |
-
status?: TemplateLogStatus;
|
| 41 |
-
action?: string;
|
| 42 |
-
details?: Record<string, unknown>;
|
| 43 |
-
durationMs?: number;
|
| 44 |
-
requestId?: string;
|
| 45 |
-
}) {
|
| 46 |
-
const entry: TemplateLogEntry = {
|
| 47 |
-
agentId: TEMPLATE_AGENT_ID,
|
| 48 |
-
agentName: TEMPLATE_AGENT_NAME,
|
| 49 |
-
namespace: TEMPLATE_AGENT_NAMESPACE,
|
| 50 |
-
runId: this.runId,
|
| 51 |
-
requestId: input.requestId || randomUUID(),
|
| 52 |
-
surface: input.surface,
|
| 53 |
-
event: input.event,
|
| 54 |
-
action: input.action,
|
| 55 |
-
level: input.level || 'info',
|
| 56 |
-
status: input.status || 'completed',
|
| 57 |
-
details: input.details,
|
| 58 |
-
durationMs: input.durationMs,
|
| 59 |
-
createdAt: new Date().toISOString(),
|
| 60 |
-
};
|
| 61 |
-
|
| 62 |
-
await mkdir(dirname(TEMPLATE_LOG_PATH), { recursive: true });
|
| 63 |
-
await appendFile(TEMPLATE_LOG_PATH, `${JSON.stringify(entry)}\n`, 'utf8');
|
| 64 |
-
|
| 65 |
-
try {
|
| 66 |
-
await getSupabaseClient().from(TEMPLATE_TELEMETRY_TABLE).insert({
|
| 67 |
-
agent_id: entry.agentId,
|
| 68 |
-
run_id: entry.runId,
|
| 69 |
-
level: entry.level,
|
| 70 |
-
event: entry.event,
|
| 71 |
-
details: {
|
| 72 |
-
...(entry.details || {}),
|
| 73 |
-
action: entry.action,
|
| 74 |
-
requestId: entry.requestId,
|
| 75 |
-
surface: entry.surface,
|
| 76 |
-
status: entry.status,
|
| 77 |
-
hostname: hostname(),
|
| 78 |
-
},
|
| 79 |
-
duration_ms: entry.durationMs,
|
| 80 |
-
created_at: entry.createdAt,
|
| 81 |
-
});
|
| 82 |
-
} catch {}
|
| 83 |
-
|
| 84 |
-
const line = `[${entry.createdAt}] [${entry.agentId}] [${entry.surface}] [${entry.level.toUpperCase()}] ${entry.event}`;
|
| 85 |
-
if (entry.level === 'error') {
|
| 86 |
-
console.error(line, entry.details || '');
|
| 87 |
-
} else if (entry.level === 'warn') {
|
| 88 |
-
console.warn(line, entry.details || '');
|
| 89 |
-
} else {
|
| 90 |
-
console.log(line, entry.details || '');
|
| 91 |
-
}
|
| 92 |
-
|
| 93 |
-
return entry;
|
| 94 |
-
}
|
| 95 |
-
|
| 96 |
-
started(surface: string, event: string, details?: Record<string, unknown>, requestId?: string, action?: string) {
|
| 97 |
-
return this.log({ surface, event, details, requestId, action, level: 'info', status: 'started' });
|
| 98 |
-
}
|
| 99 |
-
|
| 100 |
-
accepted(surface: string, event: string, details?: Record<string, unknown>, requestId?: string, action?: string) {
|
| 101 |
-
return this.log({ surface, event, details, requestId, action, level: 'info', status: 'accepted' });
|
| 102 |
-
}
|
| 103 |
-
|
| 104 |
-
succeeded(
|
| 105 |
-
surface: string,
|
| 106 |
-
event: string,
|
| 107 |
-
details?: Record<string, unknown>,
|
| 108 |
-
durationMs?: number,
|
| 109 |
-
requestId?: string,
|
| 110 |
-
action?: string,
|
| 111 |
-
) {
|
| 112 |
-
return this.log({
|
| 113 |
-
surface,
|
| 114 |
-
event,
|
| 115 |
-
details,
|
| 116 |
-
durationMs,
|
| 117 |
-
requestId,
|
| 118 |
-
action,
|
| 119 |
-
level: 'info',
|
| 120 |
-
status: 'completed',
|
| 121 |
-
});
|
| 122 |
-
}
|
| 123 |
-
|
| 124 |
-
failed(surface: string, event: string, error: unknown, durationMs?: number, requestId?: string, action?: string) {
|
| 125 |
-
const details = error instanceof Error ? { error: error.message } : { error: String(error) };
|
| 126 |
-
return this.log({
|
| 127 |
-
surface,
|
| 128 |
-
event,
|
| 129 |
-
details,
|
| 130 |
-
durationMs,
|
| 131 |
-
requestId,
|
| 132 |
-
action,
|
| 133 |
-
level: 'error',
|
| 134 |
-
status: 'failed',
|
| 135 |
-
});
|
| 136 |
-
}
|
| 137 |
-
}
|
| 138 |
-
|
| 139 |
-
export function createTemplateLogger(runId?: string) {
|
| 140 |
-
return new TemplateLogger(runId);
|
| 141 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
src/lib/telemetry/ZeroTrustAuth.ts
DELETED
|
@@ -1,63 +0,0 @@
|
|
| 1 |
-
import { verify } from 'jsonwebtoken';
|
| 2 |
-
import { resolveTemplateAgentConfig } from '../../metadata.js';
|
| 3 |
-
import { createTemplateLogger } from './SentinelLogger.js';
|
| 4 |
-
import type { IncomingMessage } from 'node:http';
|
| 5 |
-
|
| 6 |
-
// We fetch the public key (or use a shared secret if configured) from SIN-Authenticator's OIDC jwks endpoint or env
|
| 7 |
-
const OIDC_PUBLIC_KEY = process.env.SIN_OIDC_PUBLIC_KEY || process.env.SIN_SHARED_SECRET || '';
|
| 8 |
-
|
| 9 |
-
export type AuthContext = {
|
| 10 |
-
subject: string;
|
| 11 |
-
roles: string[];
|
| 12 |
-
claims: Record<string, unknown>;
|
| 13 |
-
isValid: boolean;
|
| 14 |
-
error?: string;
|
| 15 |
-
};
|
| 16 |
-
|
| 17 |
-
export async function verifyZeroTrustToken(request: IncomingMessage, runId?: string): Promise<AuthContext> {
|
| 18 |
-
const logger = createTemplateLogger(runId);
|
| 19 |
-
const authHeader = request.headers.authorization;
|
| 20 |
-
|
| 21 |
-
if (!authHeader || !authHeader.startsWith('Bearer ')) {
|
| 22 |
-
await logger.failed('auth.zero_trust', 'auth.token.missing', new Error('Missing or malformed Authorization header'));
|
| 23 |
-
return { subject: 'anonymous', roles: [], claims: {}, isValid: false, error: 'missing_token' };
|
| 24 |
-
}
|
| 25 |
-
|
| 26 |
-
const token = authHeader.split(' ')[1];
|
| 27 |
-
|
| 28 |
-
if (!OIDC_PUBLIC_KEY) {
|
| 29 |
-
// If the fleet runs in a mode without strict OIDC enforcement configured yet,
|
| 30 |
-
// we log a warning but might fail closed depending on fleet policy.
|
| 31 |
-
// For Epic #195, we want to enforce zero-trust strictly when keys are present.
|
| 32 |
-
await logger.log({
|
| 33 |
-
surface: 'auth.zero_trust',
|
| 34 |
-
event: 'auth.keys.missing',
|
| 35 |
-
level: 'warn',
|
| 36 |
-
status: 'failed',
|
| 37 |
-
details: { note: 'No SIN_OIDC_PUBLIC_KEY or SIN_SHARED_SECRET configured for verification.' }
|
| 38 |
-
});
|
| 39 |
-
return { subject: 'anonymous', roles: [], claims: {}, isValid: false, error: 'missing_keys' };
|
| 40 |
-
}
|
| 41 |
-
|
| 42 |
-
try {
|
| 43 |
-
const decoded = verify(token, OIDC_PUBLIC_KEY, { algorithms: ['RS256', 'HS256'] }) as Record<string, unknown>;
|
| 44 |
-
|
| 45 |
-
await logger.succeeded('auth.zero_trust', 'auth.token.verified', { subject: decoded.sub });
|
| 46 |
-
|
| 47 |
-
return {
|
| 48 |
-
subject: String(decoded.sub || 'unknown'),
|
| 49 |
-
roles: Array.isArray(decoded.roles) ? decoded.roles.map(String) : [],
|
| 50 |
-
claims: decoded,
|
| 51 |
-
isValid: true
|
| 52 |
-
};
|
| 53 |
-
} catch (error) {
|
| 54 |
-
await logger.failed('auth.zero_trust', 'auth.token.rejected', error);
|
| 55 |
-
return {
|
| 56 |
-
subject: 'anonymous',
|
| 57 |
-
roles: [],
|
| 58 |
-
claims: {},
|
| 59 |
-
isValid: false,
|
| 60 |
-
error: error instanceof Error ? error.message : String(error)
|
| 61 |
-
};
|
| 62 |
-
}
|
| 63 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
src/mcp-server.ts
CHANGED
|
@@ -1,119 +1,118 @@
|
|
| 1 |
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
| 2 |
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
| 3 |
import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';
|
| 4 |
-
import {
|
| 5 |
-
import { executeTemplateAgentAction } from './runtime.js';
|
| 6 |
|
| 7 |
-
const
|
| 8 |
-
|
| 9 |
-
|
| 10 |
-
|
| 11 |
-
});
|
| 12 |
-
|
| 13 |
-
const room13ClaimSchema = z.object({
|
| 14 |
-
room13Url: z.string().optional(),
|
| 15 |
-
bearerToken: z.string().optional(),
|
| 16 |
-
workerName: z.string().optional(),
|
| 17 |
-
confirm: z.boolean().optional(),
|
| 18 |
-
});
|
| 19 |
|
| 20 |
-
|
| 21 |
-
{
|
| 22 |
-
|
| 23 |
-
|
| 24 |
-
|
| 25 |
-
|
| 26 |
-
|
| 27 |
-
},
|
| 28 |
-
{
|
| 29 |
-
name: 'sin-code-ai_health',
|
| 30 |
-
description: 'Check base agent readiness.',
|
| 31 |
-
inputSchema: { type: 'object', properties: {} },
|
| 32 |
-
parse: () => ({}),
|
| 33 |
-
handler: async () => executeTemplateAgentAction({ action: 'sin.code.ai.health' }),
|
| 34 |
-
},
|
| 35 |
-
{
|
| 36 |
-
name: 'sin-code-ai_room13_claim',
|
| 37 |
-
description: 'Claim next task from Room-13. Requires confirm=true.',
|
| 38 |
-
inputSchema: {
|
| 39 |
-
type: 'object',
|
| 40 |
-
properties: {
|
| 41 |
-
room13Url: { type: 'string' },
|
| 42 |
-
bearerToken: { type: 'string' },
|
| 43 |
-
workerName: { type: 'string' },
|
| 44 |
-
confirm: { type: 'boolean' },
|
| 45 |
},
|
| 46 |
-
|
| 47 |
-
|
| 48 |
-
|
| 49 |
-
|
| 50 |
-
|
| 51 |
-
|
| 52 |
-
|
| 53 |
-
|
| 54 |
-
|
| 55 |
-
|
| 56 |
-
|
| 57 |
-
},
|
| 58 |
-
{
|
| 59 |
-
name: 'sin-code-ai_onboarding_save',
|
| 60 |
-
description: 'Persist onboarding state. Requires confirm=true.',
|
| 61 |
-
inputSchema: {
|
| 62 |
-
type: 'object',
|
| 63 |
-
properties: {
|
| 64 |
-
ownerEmail: { type: 'string' },
|
| 65 |
-
notes: { type: 'string' },
|
| 66 |
-
confirm: { type: 'boolean' },
|
| 67 |
},
|
| 68 |
-
|
| 69 |
-
|
| 70 |
-
|
| 71 |
-
|
| 72 |
-
|
| 73 |
-
|
| 74 |
-
|
| 75 |
-
|
| 76 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 77 |
|
| 78 |
-
|
| 79 |
-
|
| 80 |
-
|
| 81 |
-
name: tool.name,
|
| 82 |
-
description: tool.description,
|
| 83 |
-
inputSchema: tool.inputSchema,
|
| 84 |
-
})),
|
| 85 |
-
};
|
| 86 |
-
});
|
| 87 |
|
| 88 |
-
|
| 89 |
-
|
| 90 |
-
|
| 91 |
-
|
| 92 |
-
|
| 93 |
-
|
| 94 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 95 |
}
|
| 96 |
-
|
| 97 |
-
const result = await
|
| 98 |
return {
|
| 99 |
content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
|
| 100 |
};
|
| 101 |
-
})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 102 |
|
|
|
|
| 103 |
const transport = new StdioServerTransport();
|
| 104 |
await server.connect(transport);
|
| 105 |
-
|
| 106 |
-
|
| 107 |
-
try {
|
| 108 |
-
await new Promise<void>((resolve) => {
|
| 109 |
-
const finish = () => {
|
| 110 |
-
clearInterval(keepAlive);
|
| 111 |
-
resolve();
|
| 112 |
-
};
|
| 113 |
-
process.once('SIGINT', finish);
|
| 114 |
-
process.once('SIGTERM', finish);
|
| 115 |
-
});
|
| 116 |
-
} finally {
|
| 117 |
-
clearInterval(keepAlive);
|
| 118 |
-
}
|
| 119 |
}
|
|
|
|
| 1 |
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
| 2 |
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
| 3 |
import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';
|
| 4 |
+
import { executeAIAgentAction, AIAgentAction } from './runtime.js';
|
|
|
|
| 5 |
|
| 6 |
+
const server = new Server(
|
| 7 |
+
{ name: 'sin-code-ai', version: '2026.03.22' },
|
| 8 |
+
{ capabilities: { tools: {} } },
|
| 9 |
+
);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 10 |
|
| 11 |
+
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
| 12 |
+
return {
|
| 13 |
+
tools: [
|
| 14 |
+
{
|
| 15 |
+
name: 'sin_code_ai_health',
|
| 16 |
+
description: 'Check 2026 Elite AI Engineer readiness.',
|
| 17 |
+
inputSchema: { type: 'object', properties: {} },
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 18 |
},
|
| 19 |
+
{
|
| 20 |
+
name: 'sin_code_ai_rag_generate',
|
| 21 |
+
description: 'Generate RAG pipeline code from requirements.',
|
| 22 |
+
inputSchema: {
|
| 23 |
+
type: 'object',
|
| 24 |
+
properties: {
|
| 25 |
+
prompt: { type: 'string', description: 'RAG pipeline requirements description.' },
|
| 26 |
+
contextDir: { type: 'string', description: 'Optional project context directory.' },
|
| 27 |
+
},
|
| 28 |
+
required: ['prompt'],
|
| 29 |
+
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 30 |
},
|
| 31 |
+
{
|
| 32 |
+
name: 'sin_code_ai_prompt_generate',
|
| 33 |
+
description: 'Generate structured prompt templates.',
|
| 34 |
+
inputSchema: {
|
| 35 |
+
type: 'object',
|
| 36 |
+
properties: {
|
| 37 |
+
prompt: { type: 'string', description: 'Prompt template requirements description.' },
|
| 38 |
+
contextDir: { type: 'string', description: 'Optional project context directory.' },
|
| 39 |
+
},
|
| 40 |
+
required: ['prompt'],
|
| 41 |
+
},
|
| 42 |
+
},
|
| 43 |
+
{
|
| 44 |
+
name: 'sin_code_ai_mcp_generate',
|
| 45 |
+
description: 'Generate OpenCode MCP tool definitions.',
|
| 46 |
+
inputSchema: {
|
| 47 |
+
type: 'object',
|
| 48 |
+
properties: {
|
| 49 |
+
prompt: { type: 'string', description: 'MCP tool requirements description.' },
|
| 50 |
+
contextDir: { type: 'string', description: 'Optional project context directory.' },
|
| 51 |
+
},
|
| 52 |
+
required: ['prompt'],
|
| 53 |
+
},
|
| 54 |
+
},
|
| 55 |
+
{
|
| 56 |
+
name: 'sin_code_ai_review',
|
| 57 |
+
description: 'Audit AI implementations against 2026 best practices.',
|
| 58 |
+
inputSchema: {
|
| 59 |
+
type: 'object',
|
| 60 |
+
properties: {
|
| 61 |
+
targetDir: { type: 'string', description: 'Directory containing AI code to review.' },
|
| 62 |
+
},
|
| 63 |
+
required: ['targetDir'],
|
| 64 |
+
},
|
| 65 |
+
},
|
| 66 |
+
],
|
| 67 |
+
};
|
| 68 |
+
});
|
| 69 |
|
| 70 |
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
| 71 |
+
try {
|
| 72 |
+
let action: AIAgentAction;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 73 |
|
| 74 |
+
switch (request.params.name) {
|
| 75 |
+
case 'sin_code_ai_health':
|
| 76 |
+
action = { action: 'sin.code.ai.health' };
|
| 77 |
+
break;
|
| 78 |
+
case 'sin_code_ai_rag_generate': {
|
| 79 |
+
const args = request.params.arguments as any;
|
| 80 |
+
action = { action: 'sin.code.ai.rag.generate', prompt: args.prompt, contextDir: args.contextDir };
|
| 81 |
+
break;
|
| 82 |
+
}
|
| 83 |
+
case 'sin_code_ai_prompt_generate': {
|
| 84 |
+
const args = request.params.arguments as any;
|
| 85 |
+
action = { action: 'sin.code.ai.prompt.generate', prompt: args.prompt, contextDir: args.contextDir };
|
| 86 |
+
break;
|
| 87 |
+
}
|
| 88 |
+
case 'sin_code_ai_mcp_generate': {
|
| 89 |
+
const args = request.params.arguments as any;
|
| 90 |
+
action = { action: 'sin.code.ai.mcp.generate', prompt: args.prompt, contextDir: args.contextDir };
|
| 91 |
+
break;
|
| 92 |
+
}
|
| 93 |
+
case 'sin_code_ai_review': {
|
| 94 |
+
const args = request.params.arguments as any;
|
| 95 |
+
action = { action: 'sin.code.ai.review', targetDir: args.targetDir };
|
| 96 |
+
break;
|
| 97 |
+
}
|
| 98 |
+
default:
|
| 99 |
+
throw new Error(`Unknown tool: ${request.params.name}`);
|
| 100 |
}
|
| 101 |
+
|
| 102 |
+
const result = await executeAIAgentAction(action);
|
| 103 |
return {
|
| 104 |
content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
|
| 105 |
};
|
| 106 |
+
} catch (error: any) {
|
| 107 |
+
return {
|
| 108 |
+
content: [{ type: 'text', text: `Error: ${error.message}` }],
|
| 109 |
+
isError: true,
|
| 110 |
+
};
|
| 111 |
+
}
|
| 112 |
+
});
|
| 113 |
|
| 114 |
+
export async function runMcpServer() {
|
| 115 |
const transport = new StdioServerTransport();
|
| 116 |
await server.connect(transport);
|
| 117 |
+
console.error('A2A-SIN-Code-AI MCP Server running on stdio');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 118 |
}
|
src/metadata.ts
DELETED
|
@@ -1,73 +0,0 @@
|
|
| 1 |
-
import process from 'node:process';
|
| 2 |
-
|
| 3 |
-
export const TEMPLATE_AGENT_ID = 'sin-code-ai';
|
| 4 |
-
export const TEMPLATE_AGENT_NAME = 'SIN-Code-AI';
|
| 5 |
-
export const TEMPLATE_AGENT_NAMESPACE = 'sin.code.ai';
|
| 6 |
-
export const TEMPLATE_AGENT_DESCRIPTION = 'Elite 2026 AI Engineering Architect. Architects and implements RAG pipelines, prompt templates, semantic search, OpenCode MCP tools, and AI-native application logic.';
|
| 7 |
-
export const TEMPLATE_AGENT_VERSION = '2026.03.09';
|
| 8 |
-
export const TEMPLATE_AGENT_DEFAULT_HOST = '127.0.0.1';
|
| 9 |
-
export const TEMPLATE_AGENT_DEFAULT_PORT = Number(process.env.PORT || 7860);
|
| 10 |
-
export const TEMPLATE_AGENT_EXECUTOR_CONTRACT = 'services/workers/hf_executor_contract.json';
|
| 11 |
-
export const TEMPLATE_AGENT_CAPABILITY_REGISTRY = 'control_plane.capabilities';
|
| 12 |
-
|
| 13 |
-
export const TEMPLATE_AGENT_SKILLS = [
|
| 14 |
-
{
|
| 15 |
-
id: 'sin.code.ai.health',
|
| 16 |
-
name: 'Health',
|
| 17 |
-
description: 'Check base agent readiness and identity.',
|
| 18 |
-
},
|
| 19 |
-
{
|
| 20 |
-
id: 'sin.code.ai.onboarding.status',
|
| 21 |
-
name: 'Onboarding Status',
|
| 22 |
-
description: 'Read persisted onboarding state.',
|
| 23 |
-
},
|
| 24 |
-
{
|
| 25 |
-
id: 'sin.code.ai.onboarding.save',
|
| 26 |
-
name: 'Onboarding Save',
|
| 27 |
-
description: 'Persist onboarding defaults for future autonomous runs.',
|
| 28 |
-
},
|
| 29 |
-
{
|
| 30 |
-
id: 'sin.code.ai.room13.claim',
|
| 31 |
-
name: 'Room-13 Claim',
|
| 32 |
-
description: 'Register worker and claim next task from Room-13 coordinator.',
|
| 33 |
-
},
|
| 34 |
-
] as const;
|
| 35 |
-
|
| 36 |
-
export function resolveTemplateAgentConfig() {
|
| 37 |
-
const host =
|
| 38 |
-
process.env.SIN_CODE_AI_HOST?.trim() ||
|
| 39 |
-
(process.env.PORT ? '0.0.0.0' : process.env.HOST?.trim() || TEMPLATE_AGENT_DEFAULT_HOST);
|
| 40 |
-
const port = parseInteger(process.env.SIN_CODE_AI_PORT, parseInteger(process.env.PORT, TEMPLATE_AGENT_DEFAULT_PORT));
|
| 41 |
-
const fallbackPublicHost = host === '0.0.0.0' ? '127.0.0.1' : host;
|
| 42 |
-
const publicBaseUrl =
|
| 43 |
-
process.env.SIN_CODE_AI_PUBLIC_BASE_URL?.trim() ||
|
| 44 |
-
(process.env.SPACE_HOST?.trim() ? `https://${process.env.SPACE_HOST.trim()}` : `http://${fallbackPublicHost}:${port}`);
|
| 45 |
-
return { host, port, publicBaseUrl: publicBaseUrl.replace(/\/+$/, '') };
|
| 46 |
-
}
|
| 47 |
-
|
| 48 |
-
export function buildAgentCard(baseUrl: string) {
|
| 49 |
-
const normalizedBaseUrl = baseUrl.replace(/\/+$/, '');
|
| 50 |
-
const rpcUrl = `${normalizedBaseUrl}/a2a/v1`;
|
| 51 |
-
return {
|
| 52 |
-
name: TEMPLATE_AGENT_NAME,
|
| 53 |
-
description: TEMPLATE_AGENT_DESCRIPTION,
|
| 54 |
-
version: TEMPLATE_AGENT_VERSION,
|
| 55 |
-
documentationUrl: normalizedBaseUrl,
|
| 56 |
-
url: rpcUrl,
|
| 57 |
-
capabilities: { streaming: false, pushNotifications: false },
|
| 58 |
-
defaultInputModes: ['text/plain', 'application/json'],
|
| 59 |
-
defaultOutputModes: ['text/plain', 'application/json'],
|
| 60 |
-
metadata: {
|
| 61 |
-
projectionMode: 'control-plane-first',
|
| 62 |
-
capabilityRegistry: TEMPLATE_AGENT_CAPABILITY_REGISTRY,
|
| 63 |
-
executorContract: TEMPLATE_AGENT_EXECUTOR_CONTRACT,
|
| 64 |
-
},
|
| 65 |
-
skills: [...TEMPLATE_AGENT_SKILLS],
|
| 66 |
-
supportedInterfaces: [{ url: rpcUrl, protocolBinding: 'JSONRPC', protocolVersion: '1.0' }],
|
| 67 |
-
};
|
| 68 |
-
}
|
| 69 |
-
|
| 70 |
-
function parseInteger(input: string | undefined, fallback: number) {
|
| 71 |
-
const parsed = Number.parseInt(String(input || '').trim(), 10);
|
| 72 |
-
return Number.isFinite(parsed) ? parsed : fallback;
|
| 73 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
src/runtime.ts
CHANGED
|
@@ -1,108 +1,82 @@
|
|
| 1 |
-
import {
|
| 2 |
-
import {
|
| 3 |
-
import { homedir } from 'node:os';
|
| 4 |
|
| 5 |
-
const
|
|
|
|
| 6 |
|
| 7 |
-
type
|
| 8 |
-
ownerEmail?: string;
|
| 9 |
-
notes?: string;
|
| 10 |
-
updatedAt?: string;
|
| 11 |
-
};
|
| 12 |
-
|
| 13 |
-
export type TemplateAgentAction =
|
| 14 |
| { action: 'agent.help' }
|
| 15 |
| { action: 'sin.code.ai.health' }
|
| 16 |
-
| { action: 'sin.code.ai.
|
| 17 |
-
| { action: 'sin.code.ai.
|
| 18 |
-
| { action: 'sin.code.ai.
|
|
|
|
| 19 |
|
| 20 |
-
export async function
|
| 21 |
switch (action.action) {
|
| 22 |
case 'agent.help':
|
| 23 |
-
return buildHelpPayload();
|
| 24 |
-
case 'sin.code.ai.health':
|
| 25 |
return {
|
| 26 |
ok: true,
|
| 27 |
agent: 'sin-code-ai',
|
| 28 |
-
|
| 29 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 30 |
};
|
| 31 |
-
|
| 32 |
-
|
| 33 |
-
case 'sin.code.ai.onboarding.status':
|
| 34 |
-
return {
|
| 35 |
-
ok: true,
|
| 36 |
-
statePath: DEFAULT_STATE_PATH,
|
| 37 |
-
state: await readState(),
|
| 38 |
-
};
|
| 39 |
-
case 'sin.code.ai.onboarding.save':
|
| 40 |
-
if (!action.confirm) {
|
| 41 |
-
throw new Error('input_required:confirm=true required');
|
| 42 |
-
}
|
| 43 |
return {
|
| 44 |
ok: true,
|
| 45 |
-
|
| 46 |
-
|
| 47 |
-
|
| 48 |
-
|
| 49 |
-
|
| 50 |
-
}),
|
| 51 |
};
|
| 52 |
-
}
|
| 53 |
-
}
|
| 54 |
|
| 55 |
-
|
| 56 |
-
|
| 57 |
-
|
| 58 |
-
|
| 59 |
-
|
| 60 |
-
controlPlane: {
|
| 61 |
-
projectionMode: 'control-plane-first',
|
| 62 |
-
capabilityRegistry: 'control_plane.capabilities',
|
| 63 |
-
consumerAuthScript: './scripts/hf_pull_script.py',
|
| 64 |
-
completeInstallScript: './scripts/complete-install.sh',
|
| 65 |
-
},
|
| 66 |
-
};
|
| 67 |
-
}
|
| 68 |
|
| 69 |
-
|
| 70 |
-
|
| 71 |
-
|
| 72 |
-
|
| 73 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 74 |
}
|
| 75 |
}
|
| 76 |
|
| 77 |
-
async function
|
| 78 |
-
await
|
| 79 |
-
await writeFile(DEFAULT_STATE_PATH, `${JSON.stringify(state, null, 2)}\n`, 'utf8');
|
| 80 |
-
return state;
|
| 81 |
-
}
|
| 82 |
|
| 83 |
-
|
| 84 |
-
const normalized = String(value || '').trim();
|
| 85 |
-
return normalized || undefined;
|
| 86 |
-
}
|
| 87 |
|
| 88 |
-
|
| 89 |
-
|
| 90 |
-
|
| 91 |
-
|
| 92 |
-
|
| 93 |
-
|
| 94 |
-
|
| 95 |
-
|
| 96 |
-
|
| 97 |
-
}
|
| 98 |
-
if (!regRes.ok) throw new Error(`Failed to register worker: ${await regRes.text()}`);
|
| 99 |
-
const workerId = (await regRes.json() as any).id;
|
| 100 |
-
const claimRes = await fetch(`${url}/api/tasks/claim-next`, {
|
| 101 |
-
method: 'POST',
|
| 102 |
-
headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` },
|
| 103 |
-
body: JSON.stringify({ worker_id: workerId, accepted_types: ['zeus_github_branch', 'sin_issues_pool_issue'], accepted_team_ids: ['team-coding'], min_priority: 'low', run_id: `${worker}-${Date.now()}`, lease_epoch: 0 }),
|
| 104 |
-
});
|
| 105 |
-
if (claimRes.status === 404) return { ok: true, claimed: false, message: 'No pending tasks found' };
|
| 106 |
-
if (!claimRes.ok) throw new Error(`Failed to claim task: ${await claimRes.text()}`);
|
| 107 |
-
return { ok: true, claimed: true, workerId, task: await claimRes.json() };
|
| 108 |
}
|
|
|
|
| 1 |
+
import { exec, execFile } from 'node:child_process';
|
| 2 |
+
import { promisify } from 'node:util';
|
|
|
|
| 3 |
|
| 4 |
+
const execAsync = promisify(exec);
|
| 5 |
+
const execFileAsync = promisify(execFile);
|
| 6 |
|
| 7 |
+
export type AIAgentAction =
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 8 |
| { action: 'agent.help' }
|
| 9 |
| { action: 'sin.code.ai.health' }
|
| 10 |
+
| { action: 'sin.code.ai.rag.generate'; prompt: string; contextDir?: string }
|
| 11 |
+
| { action: 'sin.code.ai.prompt.generate'; prompt: string; contextDir?: string }
|
| 12 |
+
| { action: 'sin.code.ai.mcp.generate'; prompt: string; contextDir?: string }
|
| 13 |
+
| { action: 'sin.code.ai.review'; targetDir: string };
|
| 14 |
|
| 15 |
+
export async function executeAIAgentAction(action: AIAgentAction): Promise<unknown> {
|
| 16 |
switch (action.action) {
|
| 17 |
case 'agent.help':
|
|
|
|
|
|
|
| 18 |
return {
|
| 19 |
ok: true,
|
| 20 |
agent: 'sin-code-ai',
|
| 21 |
+
mandate: 'CEO Elite AI Engineer for 2026 RAG pipelines, prompt templates, semantic search, and OpenCode MCP tools.',
|
| 22 |
+
actions: [
|
| 23 |
+
'sin.code.ai.health',
|
| 24 |
+
'sin.code.ai.rag.generate',
|
| 25 |
+
'sin.code.ai.prompt.generate',
|
| 26 |
+
'sin.code.ai.mcp.generate',
|
| 27 |
+
'sin.code.ai.review',
|
| 28 |
+
],
|
| 29 |
};
|
| 30 |
+
|
| 31 |
+
case 'sin.code.ai.health':
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 32 |
return {
|
| 33 |
ok: true,
|
| 34 |
+
agent: 'sin-code-ai',
|
| 35 |
+
primaryModel: 'openai/gpt-5.4',
|
| 36 |
+
fallbackModel: 'opencode/minimax-m2.5-free',
|
| 37 |
+
team: 'Team - Coding',
|
| 38 |
+
status: 'Elite 2026 AI Engineer Online',
|
|
|
|
| 39 |
};
|
|
|
|
|
|
|
| 40 |
|
| 41 |
+
case 'sin.code.ai.rag.generate':
|
| 42 |
+
return await executeOpenCode(
|
| 43 |
+
`Architect and generate a production-grade RAG pipeline for: ${action.prompt}. Include document chunking strategy, embedding model selection, pgvector storage schema, retrieval ranking logic, and LLM generation with cited sources.`,
|
| 44 |
+
action.contextDir,
|
| 45 |
+
);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 46 |
|
| 47 |
+
case 'sin.code.ai.prompt.generate':
|
| 48 |
+
return await executeOpenCode(
|
| 49 |
+
`Generate structured prompt templates for: ${action.prompt}. Include system/user/assistant roles, few-shot examples where beneficial, chain-of-thought reasoning, structured JSON output schema, and temperature/top-p recommendations.`,
|
| 50 |
+
action.contextDir,
|
| 51 |
+
);
|
| 52 |
+
|
| 53 |
+
case 'sin.code.ai.mcp.generate':
|
| 54 |
+
return await executeOpenCode(
|
| 55 |
+
`Generate OpenCode MCP tool definitions for: ${action.prompt}. Include proper inputSchema with JSON Schema types, clear descriptions, and the runtime handler that connects to the AI capability.`,
|
| 56 |
+
action.contextDir,
|
| 57 |
+
);
|
| 58 |
+
|
| 59 |
+
case 'sin.code.ai.review':
|
| 60 |
+
return await executeOpenCode(
|
| 61 |
+
`Review the AI implementations in ${action.targetDir} against 2026 best practices. Check for prompt injection vulnerabilities, missing output validation, inefficient embedding strategies, missing fallback chains, and improper token management.`,
|
| 62 |
+
action.targetDir,
|
| 63 |
+
);
|
| 64 |
}
|
| 65 |
}
|
| 66 |
|
| 67 |
+
async function executeOpenCode(prompt: string, dir?: string) {
|
| 68 |
+
await execAsync('python3 scripts/hf_pull_script.py');
|
|
|
|
|
|
|
|
|
|
| 69 |
|
| 70 |
+
const options = dir ? { cwd: dir } : {};
|
|
|
|
|
|
|
|
|
|
| 71 |
|
| 72 |
+
try {
|
| 73 |
+
const { stdout, stderr } = await execFileAsync('opencode', ['run', prompt, '--model', 'openai/gpt-5.4'], options);
|
| 74 |
+
return {
|
| 75 |
+
ok: true,
|
| 76 |
+
expertAnalysis: stdout,
|
| 77 |
+
warnings: stderr || undefined,
|
| 78 |
+
};
|
| 79 |
+
} catch (error: any) {
|
| 80 |
+
throw new Error(`AI Engineer Execution Failed: ${error.message}`);
|
| 81 |
+
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 82 |
}
|
src/self-healing.ts
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import { execFileSync } from 'node:child_process';
|
| 2 |
+
|
| 3 |
+
/**
|
| 4 |
+
* 🚨 GLOBAL FLEET SELF-HEALING PROTOCOL (PRIORITY 0000) 🚨
|
| 5 |
+
* NO-SILO MANDATE: This module catches critical errors, dumps extensive logs,
|
| 6 |
+
* and blasts them to the fleet self-healing webhook.
|
| 7 |
+
* Hermes and SIN-GitHub-Issues will automatically take over from there.
|
| 8 |
+
*/
|
| 9 |
+
|
| 10 |
+
export function triggerFleetSelfHealing(error: Error, extensiveContext: Record<string, any>) {
|
| 11 |
+
console.error('\n🚨 CRITICAL FAILURE DETECTED. INITIATING NO-SILO SELF-HEALING PROTOCOL 🚨');
|
| 12 |
+
|
| 13 |
+
const payload = {
|
| 14 |
+
agentId: 'A2A-SIN-Code-AI',
|
| 15 |
+
timestamp: new Date().toISOString(),
|
| 16 |
+
errorLogs: `Error: ${error.message}\nStack: ${error.stack}\nContext: ${JSON.stringify(extensiveContext, null, 2)}`,
|
| 17 |
+
team: 'team-coding'
|
| 18 |
+
};
|
| 19 |
+
|
| 20 |
+
try {
|
| 21 |
+
const webhookUrl = process.env.FLEET_SELF_HEALING_WEBHOOK || 'http://92.5.60.87:5678/webhook/self-healing';
|
| 22 |
+
|
| 23 |
+
// Blast to the N8N foundation webhook
|
| 24 |
+
const curlCmd = `curl -X POST "${webhookUrl}" -H "Content-Type: application/json" -d '${JSON.stringify(payload).replace(/'/g, "'\\''")}'`;
|
| 25 |
+
|
| 26 |
+
execFileSync('bash', ['-c', curlCmd], { encoding: 'utf8' });
|
| 27 |
+
console.log('✅ Extensive logs successfully transmitted to Fleet Self-Healing pipeline.');
|
| 28 |
+
console.log('👷 The Elite Coder Fleet has been notified and will resolve this architecture flaw autonomously.');
|
| 29 |
+
} catch (transmitError: any) {
|
| 30 |
+
console.error('❌ FATAL: Could not transmit logs to Fleet Self-Healing pipeline.', transmitError.message);
|
| 31 |
+
}
|
| 32 |
+
}
|
src/supabase.ts
DELETED
|
@@ -1,22 +0,0 @@
|
|
| 1 |
-
import { createClient, SupabaseClient } from '@supabase/supabase-js';
|
| 2 |
-
|
| 3 |
-
// Database coupling to global SIN-Supabase A2A (Oracle OCI VM 200GB)
|
| 4 |
-
// SSOT: https://docs.google.com/document/d/1RtoHn4I0GntuEEOHHkqoh_dMuGzgMwQz7_8oxAOpQbw/edit?tab=t.zglvro7czbod
|
| 5 |
-
|
| 6 |
-
let supabaseInstance: SupabaseClient | null = null;
|
| 7 |
-
|
| 8 |
-
export function getSupabaseClient(): SupabaseClient {
|
| 9 |
-
if (supabaseInstance) {
|
| 10 |
-
return supabaseInstance;
|
| 11 |
-
}
|
| 12 |
-
|
| 13 |
-
const supabaseUrl = process.env.SIN_SUPABASE_URL;
|
| 14 |
-
const supabaseKey = process.env.SIN_SUPABASE_SERVICE_ROLE_KEY;
|
| 15 |
-
|
| 16 |
-
if (!supabaseUrl || !supabaseKey) {
|
| 17 |
-
throw new Error('missing_supabase_credentials');
|
| 18 |
-
}
|
| 19 |
-
|
| 20 |
-
supabaseInstance = createClient(supabaseUrl, supabaseKey);
|
| 21 |
-
return supabaseInstance;
|
| 22 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
test/logging.test.mjs
DELETED
|
@@ -1,75 +0,0 @@
|
|
| 1 |
-
import assert from 'node:assert/strict';
|
| 2 |
-
import { mkdtemp, readFile } from 'node:fs/promises';
|
| 3 |
-
import { spawnSync } from 'node:child_process';
|
| 4 |
-
import { tmpdir } from 'node:os';
|
| 5 |
-
import { join } from 'node:path';
|
| 6 |
-
import test from 'node:test';
|
| 7 |
-
|
| 8 |
-
const DIST_ROOT = new URL('../dist/src/', import.meta.url);
|
| 9 |
-
const CLI_PATH = new URL('../dist/src/cli.js', import.meta.url);
|
| 10 |
-
|
| 11 |
-
async function importFresh(relativePath) {
|
| 12 |
-
return import(new URL(`${relativePath}?t=${Date.now()}-${Math.random()}`, DIST_ROOT).href);
|
| 13 |
-
}
|
| 14 |
-
|
| 15 |
-
async function readFileUntilMatch(filePath, matcher, attempts = 10) {
|
| 16 |
-
let last = '';
|
| 17 |
-
for (let index = 0; index < attempts; index += 1) {
|
| 18 |
-
last = await readFile(filePath, 'utf8');
|
| 19 |
-
if (matcher.test(last)) {
|
| 20 |
-
return last;
|
| 21 |
-
}
|
| 22 |
-
await new Promise((resolve) => setTimeout(resolve, 50));
|
| 23 |
-
}
|
| 24 |
-
return last;
|
| 25 |
-
}
|
| 26 |
-
|
| 27 |
-
test('runtime, graph, and http server append durable log events', async () => {
|
| 28 |
-
const home = await mkdtemp(join(tmpdir(), 'template-agent-logs-'));
|
| 29 |
-
process.env.HOME = home;
|
| 30 |
-
process.env.PORT = '0';
|
| 31 |
-
|
| 32 |
-
const { executeTemplateAgentAction, TEMPLATE_AGENT_ACTIONS } = await importFresh('./runtime.js');
|
| 33 |
-
const { runAgentGraph } = await importFresh('./agent/graph.js');
|
| 34 |
-
const { createTemplateAgentHttpServer } = await importFresh('./a2a-http.js');
|
| 35 |
-
|
| 36 |
-
await executeTemplateAgentAction(
|
| 37 |
-
{ action: TEMPLATE_AGENT_ACTIONS.HELP },
|
| 38 |
-
{ surface: 'test', runId: 'runtime-run', requestId: 'runtime-request' },
|
| 39 |
-
);
|
| 40 |
-
await runAgentGraph(
|
| 41 |
-
{ action: TEMPLATE_AGENT_ACTIONS.HELP },
|
| 42 |
-
{ runId: 'graph-run', requestId: 'graph-request', context: { source: 'test' } },
|
| 43 |
-
);
|
| 44 |
-
|
| 45 |
-
const handle = createTemplateAgentHttpServer();
|
| 46 |
-
await handle.start();
|
| 47 |
-
const address = handle.server.address();
|
| 48 |
-
const port = typeof address === 'object' && address ? address.port : 0;
|
| 49 |
-
const response = await fetch(`http://127.0.0.1:${port}/health`);
|
| 50 |
-
assert.equal(response.status, 200);
|
| 51 |
-
await handle.stop();
|
| 52 |
-
|
| 53 |
-
const logPath = join(home, '.config', 'sin', 'sin-code-ai', 'events.ndjson');
|
| 54 |
-
const content = await readFileUntilMatch(logPath, /http\.request\.succeeded/);
|
| 55 |
-
assert.match(content, /runtime\.action\.started/);
|
| 56 |
-
assert.match(content, /runtime\.action\.succeeded/);
|
| 57 |
-
assert.match(content, /graph\.run\.started/);
|
| 58 |
-
assert.match(content, /graph\.tools\.succeeded/);
|
| 59 |
-
assert.match(content, /http\.request\.succeeded/);
|
| 60 |
-
});
|
| 61 |
-
|
| 62 |
-
test('cli print-card logs command lifecycle without crashing', async () => {
|
| 63 |
-
const home = await mkdtemp(join(tmpdir(), 'template-agent-cli-'));
|
| 64 |
-
const result = spawnSync(process.execPath, [CLI_PATH.pathname, 'print-card'], {
|
| 65 |
-
env: { ...process.env, HOME: home },
|
| 66 |
-
encoding: 'utf8',
|
| 67 |
-
});
|
| 68 |
-
|
| 69 |
-
assert.equal(result.status, 0, result.stderr);
|
| 70 |
-
|
| 71 |
-
const logPath = join(home, '.config', 'sin', 'sin-code-ai', 'events.ndjson');
|
| 72 |
-
const content = await readFile(logPath, 'utf8');
|
| 73 |
-
assert.match(content, /cli\.command\.started/);
|
| 74 |
-
assert.match(content, /cli\.command\.succeeded/);
|
| 75 |
-
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
test/supabase.test.mjs
DELETED
|
@@ -1,16 +0,0 @@
|
|
| 1 |
-
import test from 'node:test';
|
| 2 |
-
import assert from 'node:assert/strict';
|
| 3 |
-
import { getSupabaseClient } from '../dist/src/supabase.js';
|
| 4 |
-
|
| 5 |
-
test('getSupabaseClient fails closed when credentials are missing', async () => {
|
| 6 |
-
const originalUrl = process.env.SIN_SUPABASE_URL;
|
| 7 |
-
const originalKey = process.env.SIN_SUPABASE_SERVICE_ROLE_KEY;
|
| 8 |
-
delete process.env.SIN_SUPABASE_URL;
|
| 9 |
-
delete process.env.SIN_SUPABASE_SERVICE_ROLE_KEY;
|
| 10 |
-
try {
|
| 11 |
-
assert.throws(() => getSupabaseClient(), /missing_supabase_credentials/);
|
| 12 |
-
} finally {
|
| 13 |
-
if (originalUrl !== undefined) process.env.SIN_SUPABASE_URL = originalUrl;
|
| 14 |
-
if (originalKey !== undefined) process.env.SIN_SUPABASE_SERVICE_ROLE_KEY = originalKey;
|
| 15 |
-
}
|
| 16 |
-
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
test/supabase_saver.test.mjs
DELETED
|
@@ -1,37 +0,0 @@
|
|
| 1 |
-
import assert from 'node:assert/strict';
|
| 2 |
-
import test from 'node:test';
|
| 3 |
-
import { randomUUID } from 'node:crypto';
|
| 4 |
-
|
| 5 |
-
const DIST_ROOT = new URL('../dist/src/', import.meta.url);
|
| 6 |
-
|
| 7 |
-
async function importFresh(relativePath) {
|
| 8 |
-
return import(new URL(`${relativePath}?t=${Date.now()}-${Math.random()}`, DIST_ROOT).href);
|
| 9 |
-
}
|
| 10 |
-
|
| 11 |
-
test('SupabaseSaver can be imported and initialized without crashing', async () => {
|
| 12 |
-
const { SupabaseSaver } = await importFresh('./agent/SupabaseSaver.js');
|
| 13 |
-
const saver = new SupabaseSaver();
|
| 14 |
-
assert.ok(saver);
|
| 15 |
-
assert.equal(typeof saver.getTuple, 'function');
|
| 16 |
-
assert.equal(typeof saver.put, 'function');
|
| 17 |
-
});
|
| 18 |
-
|
| 19 |
-
test('createAgentGraph wires SupabaseSaver successfully or falls back cleanly', async () => {
|
| 20 |
-
const { createAgentGraph } = await importFresh('./agent/graph.js');
|
| 21 |
-
|
| 22 |
-
// Default instantiation handles missing env vars without throwing unhandled exceptions
|
| 23 |
-
// because the Supabase client logic handles it or createAgentGraph catches it
|
| 24 |
-
const graph = createAgentGraph();
|
| 25 |
-
assert.ok(graph);
|
| 26 |
-
|
| 27 |
-
// Can explicitly configure checkpointer
|
| 28 |
-
const customGraph = createAgentGraph({ checkpointer: null });
|
| 29 |
-
assert.ok(customGraph);
|
| 30 |
-
});
|
| 31 |
-
|
| 32 |
-
test('createAgentGraph supports interruptBefore for Human-in-the-loop', async () => {
|
| 33 |
-
const { createAgentGraph } = await importFresh('./agent/graph.js');
|
| 34 |
-
const graph = createAgentGraph({ requireApproval: true, checkpointer: null });
|
| 35 |
-
assert.ok(graph);
|
| 36 |
-
// Internally this sets interruptBefore: ['tools']
|
| 37 |
-
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
tsconfig.json
DELETED
|
@@ -1,15 +0,0 @@
|
|
| 1 |
-
{
|
| 2 |
-
"compilerOptions": {
|
| 3 |
-
"target": "ES2022",
|
| 4 |
-
"module": "NodeNext",
|
| 5 |
-
"moduleResolution": "NodeNext",
|
| 6 |
-
"declaration": true,
|
| 7 |
-
"outDir": "dist",
|
| 8 |
-
"rootDir": ".",
|
| 9 |
-
"strict": true,
|
| 10 |
-
"esModuleInterop": true,
|
| 11 |
-
"skipLibCheck": true
|
| 12 |
-
},
|
| 13 |
-
"include": ["src/**/*.ts"]
|
| 14 |
-
}
|
| 15 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|