evolcore 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +813 -0
- package/LICENSE +21 -0
- package/MIGRATION-0.5.0.md +378 -0
- package/README.md +318 -14
- package/ROLE_ACCESS_CONTROL.md +174 -0
- package/assets/.env.template +4 -0
- package/assets/brand/evolcore/README.md +19 -0
- package/assets/brand/evolcore/evolcore-app-icon.png +0 -0
- package/assets/brand/evolcore/evolcore-app-icon.svg +13 -0
- package/assets/brand/evolcore/evolcore-brand-board.png +0 -0
- package/assets/brand/evolcore/evolcore-brand-board.svg +126 -0
- package/assets/brand/evolcore/evolcore-logo-kit.zip +0 -0
- package/assets/brand/evolcore/evolcore-logo-reverse.png +0 -0
- package/assets/brand/evolcore/evolcore-logo-reverse.svg +14 -0
- package/assets/brand/evolcore/evolcore-logo.png +0 -0
- package/assets/brand/evolcore/evolcore-logo.svg +14 -0
- package/assets/brand/evolcore/evolcore-mark.png +0 -0
- package/assets/brand/evolcore/evolcore-mark.svg +10 -0
- package/bin/ec-safe-output.js +161 -0
- package/bin/ec.js +29 -0
- package/dist/agents/baseagent.js +163 -0
- package/dist/agents/claude-runner.js +2385 -0
- package/dist/agents/codex-app-server-client.js +448 -0
- package/dist/agents/codex-runner.js +2639 -0
- package/dist/agents/gemini-runner.js +666 -0
- package/dist/agents/runner-types.js +75 -0
- package/dist/aun/aid/agentmd.js +216 -0
- package/dist/aun/aid/client.js +132 -0
- package/dist/aun/aid/control-aid.js +91 -0
- package/dist/aun/aid/identity.js +518 -0
- package/dist/aun/aid/index.js +4 -0
- package/dist/aun/aid/store.js +74 -0
- package/dist/aun/aid/types.js +1 -0
- package/dist/aun/aid/validation.js +21 -0
- package/dist/aun/group-identity.js +10 -0
- package/dist/aun/msg/group-index.js +6 -0
- package/dist/aun/msg/group.js +1231 -0
- package/dist/aun/msg/history.js +123 -0
- package/dist/aun/msg/index.js +5 -0
- package/dist/aun/msg/p2p.js +393 -0
- package/dist/aun/msg/payload-type.js +27 -0
- package/dist/aun/msg/upload.js +137 -0
- package/dist/aun/outbox.js +160 -0
- package/dist/aun/rpc/caller.js +42 -0
- package/dist/aun/rpc/connection.js +25 -0
- package/dist/aun/rpc/index.js +2 -0
- package/dist/aun/service-proxy.js +225 -0
- package/dist/aun/storage/download.js +29 -0
- package/dist/aun/storage/index.js +3 -0
- package/dist/aun/storage/manage.js +10 -0
- package/dist/aun/storage/upload.js +68 -0
- package/dist/channels/aun.js +4147 -0
- package/dist/channels/daemon.js +422 -0
- package/dist/channels/dingtalk.js +649 -0
- package/dist/channels/feishu.js +1789 -0
- package/dist/channels/qqbot.js +409 -0
- package/dist/channels/wechat.js +817 -0
- package/dist/channels/wecom.js +565 -0
- package/dist/cli/agent-command.js +641 -0
- package/dist/cli/agent.js +1059 -0
- package/dist/cli/aun-commands.js +1948 -0
- package/dist/cli/bench.js +1228 -0
- package/dist/cli/cli-argv.js +66 -0
- package/dist/cli/code-stats.js +329 -0
- package/dist/cli/command-log.js +82 -0
- package/dist/cli/config-selector.js +69 -0
- package/dist/cli/config.js +261 -0
- package/dist/cli/ctl-command.js +62 -0
- package/dist/cli/daemon-commands.js +2887 -0
- package/dist/cli/fs-command.js +1447 -0
- package/dist/cli/handoff-command.js +302 -0
- package/dist/cli/help.js +31 -0
- package/dist/cli/index.js +358 -0
- package/dist/cli/init-channel.js +1377 -0
- package/dist/cli/init.js +553 -0
- package/dist/cli/link-rules.js +240 -0
- package/dist/cli/model.js +590 -0
- package/dist/cli/net-check.js +723 -0
- package/dist/cli/queue-command.js +126 -0
- package/dist/cli/response.js +345 -0
- package/dist/cli/restart-monitor.js +456 -0
- package/dist/cli/stats.js +607 -0
- package/dist/cli/task-context.js +80 -0
- package/dist/cli/trigger-command.js +505 -0
- package/dist/cli/version.js +88 -0
- package/dist/cli/watch-logs.js +33 -0
- package/dist/cli/watch-msg.js +673 -0
- package/dist/config/boot-log.js +266 -0
- package/dist/config/builtin-role-templates.js +30 -0
- package/dist/config/builtin-roles.js +85 -0
- package/dist/config/config-batch-get.js +11 -0
- package/dist/config/config-field-policy.js +261 -0
- package/dist/config/config-manager.js +916 -0
- package/dist/config/config-operation-service.js +384 -0
- package/dist/config/contact-book.js +371 -0
- package/dist/config/gateway-config.js +858 -0
- package/dist/config/lifecycle.js +17 -0
- package/dist/config/mention-mode.js +27 -0
- package/dist/config/merge.js +161 -0
- package/dist/config/owner-policy.js +4 -0
- package/dist/config/peer-role-resolver.js +139 -0
- package/dist/config/resolved-config-op.js +483 -0
- package/dist/config/role-config-v4-startup.js +32 -0
- package/dist/config/role-config-v5-startup.js +27 -0
- package/dist/config/role-schema.js +105 -0
- package/dist/config/role-service.js +159 -0
- package/dist/config/role-store.js +204 -0
- package/dist/config/roles.js +55 -0
- package/dist/config/schema-registry.js +154 -0
- package/dist/config/snapshot.js +598 -0
- package/dist/config-store.js +503 -0
- package/dist/core/auth/agent-delegation.js +111 -0
- package/dist/core/auth/auth-gateway.js +166 -0
- package/dist/core/auth/authenticated-actor.js +6 -0
- package/dist/core/auth/authorization-audit.js +110 -0
- package/dist/core/auth/operation-authorizer.js +718 -0
- package/dist/core/auth/operation-catalog.js +675 -0
- package/dist/core/baseagent-loader.js +54 -0
- package/dist/core/bootstrap-service.js +175 -0
- package/dist/core/capability/capability-manager.js +316 -0
- package/dist/core/capability/providers/claude-capability-provider.js +176 -0
- package/dist/core/capability/providers/codex-capability-provider.js +148 -0
- package/dist/core/capability/providers/gemini-capability-provider.js +10 -0
- package/dist/core/capability/types.js +27 -0
- package/dist/core/causation/audit.js +103 -0
- package/dist/core/causation/aun-association.js +111 -0
- package/dist/core/causation/context.js +93 -0
- package/dist/core/causation/index.js +4 -0
- package/dist/core/causation/types.js +2 -0
- package/dist/core/channel-loader.js +277 -0
- package/dist/core/command/agent-control.js +616 -0
- package/dist/core/command/cli-intent-parser.js +225 -0
- package/dist/core/command/command-handler.js +1638 -0
- package/dist/core/command/menu-handler.js +3354 -0
- package/dist/core/command/menu-protocol.js +247 -0
- package/dist/core/command/role-menu.js +1524 -0
- package/dist/core/command/slash-gate.js +148 -0
- package/dist/core/command/slash-handler.js +3056 -0
- package/dist/core/daemon-file-cache.js +216 -0
- package/dist/core/event-bus.js +32 -0
- package/dist/core/event-catalog.js +740 -0
- package/dist/core/evolagent-registry.js +546 -0
- package/dist/core/evolagent.js +331 -0
- package/dist/core/handoff/dispatcher.js +229 -0
- package/dist/core/handoff/mutex.js +46 -0
- package/dist/core/handoff/runtime.js +324 -0
- package/dist/core/handoff/store.js +537 -0
- package/dist/core/handoff/types.js +12 -0
- package/dist/core/inference/text-inference.js +173 -0
- package/dist/core/interaction-registration.js +10 -0
- package/dist/core/interaction-router.js +278 -0
- package/dist/core/message/create-status.js +67 -0
- package/dist/core/message/im-renderer.js +657 -0
- package/dist/core/message/items-formatter.js +76 -0
- package/dist/core/message/logical-queue-bridge.js +123 -0
- package/dist/core/message/message-bridge.js +803 -0
- package/dist/core/message/message-cache.js +56 -0
- package/dist/core/message/message-log.js +339 -0
- package/dist/core/message/message-processor.js +4 -0
- package/dist/core/message/message-queue.js +1436 -0
- package/dist/core/message/message-utils.js +70 -0
- package/dist/core/message/peer-mode.js +105 -0
- package/dist/core/message/pending-hints.js +232 -0
- package/dist/core/message/response-depth.js +33 -0
- package/dist/core/message/response-engine.js +3776 -0
- package/dist/core/message/response-snapshot.js +83 -0
- package/dist/core/message/stream-debouncer.js +130 -0
- package/dist/core/message/stream-idle-monitor.js +124 -0
- package/dist/core/model/config-scope.js +162 -0
- package/dist/core/model/field-scope.js +78 -0
- package/dist/core/model/model-catalog.js +227 -0
- package/dist/core/model/model-diagnostics.js +182 -0
- package/dist/core/model/model-permission.js +90 -0
- package/dist/core/permission/approval-gateway.js +1017 -0
- package/dist/core/permission/ec-command-parser.js +347 -0
- package/dist/core/permission/execution-sandbox.js +16 -0
- package/dist/core/permission/index.js +6 -0
- package/dist/core/permission/mode.js +24 -0
- package/dist/core/permission/sandbox-runtime.js +265 -0
- package/dist/core/permission/tool-policy.js +987 -0
- package/dist/core/permission/unix-socket-policy.js +99 -0
- package/dist/core/protected-paths.js +330 -0
- package/dist/core/relation/peer-identity.js +222 -0
- package/dist/core/relation/peer-key.js +1 -0
- package/dist/core/role/runtime-policy.js +141 -0
- package/dist/core/session/adapters/claude-session-file-adapter.js +218 -0
- package/dist/core/session/adapters/codex-session-file-adapter.js +333 -0
- package/dist/core/session/adapters/gemini-session-file-adapter.js +181 -0
- package/dist/core/session/session-file-adapter.js +7 -0
- package/dist/core/session/session-file-health.js +45 -0
- package/dist/core/session/session-fs-store.js +232 -0
- package/dist/core/session/session-key.js +24 -0
- package/dist/core/session/session-manager.js +1587 -0
- package/dist/core/session/session-mapper.js +100 -0
- package/dist/core/session/session-renew.js +314 -0
- package/dist/core/session/session-title.js +128 -0
- package/dist/core/session/session-turn-coordinator.js +205 -0
- package/dist/core/session/session-turns.js +67 -0
- package/dist/core/system-channels.js +29 -0
- package/dist/eck/baseagent-caps.js +18 -0
- package/dist/eck/detect.js +47 -0
- package/dist/eck/group-rules-sync.js +345 -0
- package/dist/eck/init.js +77 -0
- package/dist/eck/kit-renderer.js +359 -0
- package/dist/eck/manifest-engine.js +446 -0
- package/dist/eck/message-renderer.js +199 -0
- package/dist/eck/rules-loader.js +28 -0
- package/dist/index.js +2870 -4
- package/dist/ipc.js +748 -0
- package/dist/paths.js +262 -0
- package/dist/product.js +18 -0
- package/dist/response-system/context-builder.js +71 -0
- package/dist/response-system/coordinator.js +117 -0
- package/dist/response-system/decision-executor.js +86 -0
- package/dist/response-system/engines/v1/index.js +21 -0
- package/dist/response-system/engines/v1/interactive-flow.js +27 -0
- package/dist/response-system/engines/v1/proactive-flow.js +137 -0
- package/dist/response-system/engines/v1/types.js +1 -0
- package/dist/response-system/extensions.js +41 -0
- package/dist/response-system/index.js +6 -0
- package/dist/response-system/modes/index.js +7 -0
- package/dist/response-system/modes/single-session/index.js +72 -0
- package/dist/response-system/queues/fifo-queue.js +44 -0
- package/dist/response-system/queues/index.js +6 -0
- package/dist/response-system/queues/lifo-queue.js +42 -0
- package/dist/response-system/queues/priority-queue.js +63 -0
- package/dist/response-system/registry.js +97 -0
- package/dist/response-system/resolver.js +37 -0
- package/dist/response-system/selector.js +23 -0
- package/dist/response-system/types.js +7 -0
- package/dist/stats/billing.js +151 -0
- package/dist/stats/budget.js +93 -0
- package/dist/stats/db.js +403 -0
- package/dist/stats/eck-vars.js +89 -0
- package/dist/stats/index.js +11 -0
- package/dist/stats/normalizer.js +80 -0
- package/dist/stats/price-resolver.js +138 -0
- package/dist/stats/query.js +763 -0
- package/dist/stats/role-budget.js +168 -0
- package/dist/stats/writer.js +151 -0
- package/dist/trigger/anomaly-store.js +258 -0
- package/dist/trigger/audit.js +152 -0
- package/dist/trigger/event-source.js +119 -0
- package/dist/trigger/feedback.js +685 -0
- package/dist/trigger/history.js +290 -0
- package/dist/trigger/manager.js +291 -0
- package/dist/trigger/parser.js +520 -0
- package/dist/trigger/patch.js +148 -0
- package/dist/trigger/scheduler.js +1600 -0
- package/dist/trigger/script-executor.js +155 -0
- package/dist/trigger/state.js +145 -0
- package/dist/trigger/types.js +1 -0
- package/dist/trigger/validation.js +621 -0
- package/dist/types.js +12 -0
- package/dist/utils/aid-bind.js +299 -0
- package/dist/utils/atomic-write.js +95 -0
- package/dist/utils/avatar-upload.js +123 -0
- package/dist/utils/cross-platform.js +297 -0
- package/dist/utils/ecweb-utils.js +73 -0
- package/dist/utils/error-dict.json +153 -0
- package/dist/utils/error-utils.js +349 -0
- package/dist/utils/instance-registry.js +437 -0
- package/dist/utils/locale.js +21 -0
- package/dist/utils/log-writer.js +224 -0
- package/dist/utils/logger.js +89 -0
- package/dist/utils/markdown-to-plain-text.js +20 -0
- package/dist/utils/media-cache.js +271 -0
- package/dist/utils/model-prices.jsonl +17 -0
- package/dist/utils/npm-ops.js +210 -0
- package/dist/utils/process-introspect.js +133 -0
- package/dist/utils/process-tree-stats.js +271 -0
- package/dist/utils/project-path.js +74 -0
- package/dist/utils/stats.js +410 -0
- package/dist/utils/tool-summary.js +284 -0
- package/dist/utils/welcome.js +268 -0
- package/kits/docs/GUIDE.md +20 -0
- package/kits/docs/INDEX.md +65 -0
- package/kits/docs/aun/CHEATSHEET.md +19 -0
- package/kits/docs/aun/SYNC_PROTOCOL.md +15 -0
- package/kits/docs/channels/aun.md +65 -0
- package/kits/docs/channels/feishu.md +56 -0
- package/kits/docs/context-assembly.md +366 -0
- package/kits/docs/eck_templates/GUIDE.template.md +22 -0
- package/kits/docs/eck_templates/INDEX.template.md +28 -0
- package/kits/docs/eck_templates/path-registry.template.md +33 -0
- package/kits/docs/eck_templates/runtime.template.md +19 -0
- package/kits/docs/evolcore/INDEX.md +66 -0
- package/kits/docs/evolcore/agent.md +69 -0
- package/kits/docs/evolcore/aid.md +49 -0
- package/kits/docs/evolcore/config.md +149 -0
- package/kits/docs/evolcore/ctl.md +46 -0
- package/kits/docs/evolcore/event.md +216 -0
- package/kits/docs/evolcore/fs-architecture.md +1215 -0
- package/kits/docs/evolcore/fs.md +101 -0
- package/kits/docs/evolcore/group-fs.md +17 -0
- package/kits/docs/evolcore/group-rules.md +226 -0
- package/kits/docs/evolcore/group.md +141 -0
- package/kits/docs/evolcore/model.md +47 -0
- package/kits/docs/evolcore/msg.md +130 -0
- package/kits/docs/evolcore/response.md +80 -0
- package/kits/docs/evolcore/rpc.md +35 -0
- package/kits/docs/evolcore/self-summary.md +29 -0
- package/kits/docs/evolcore/stats.md +70 -0
- package/kits/docs/evolcore/storage.md +49 -0
- package/kits/docs/evolcore/trigger.md +524 -0
- package/kits/docs/identity/AID_PROFILE_SPEC.md +26 -0
- package/kits/docs/identity/PATH_OPS.md +16 -0
- package/kits/docs/identity/ROLE_DETAIL.md +23 -0
- package/kits/docs/identity/identity-tools.md +26 -0
- package/kits/docs/path-registry.md +43 -0
- package/kits/docs/prompt-loading-architecture.md +266 -0
- package/kits/docs/venues/aun-group.md +45 -0
- package/kits/docs/venues/aun-private.md +10 -0
- package/kits/docs/venues/client-desktop.md +10 -0
- package/kits/docs/venues/client-mobile.md +10 -0
- package/kits/docs/venues/feishu-group.md +13 -0
- package/kits/docs/venues/feishu-private.md +9 -0
- package/kits/docs/venues/group.md +25 -0
- package/kits/docs/venues/private.md +10 -0
- package/kits/eck_manifest.auxiliary.json +43 -0
- package/kits/eck_manifest.json +191 -0
- package/kits/eck_message_manifest.json +63 -0
- package/kits/migrations/README-role-config-v4.md +32 -0
- package/kits/migrations/migrate-role-config-v4.mjs +623 -0
- package/kits/migrations/migrate-role-config-v5.mjs +346 -0
- package/kits/migrations/rename-config-file.mjs +99 -0
- package/kits/rules/01-overview.md +142 -0
- package/kits/rules/02-navigation.md +76 -0
- package/kits/rules/03-identity.md +34 -0
- package/kits/rules/04-relation.md +59 -0
- package/kits/rules/05-venue.md +44 -0
- package/kits/rules/06-channel.md +59 -0
- package/kits/schemas/_meta.json +29 -0
- package/kits/schemas/agent-config.schema.1.json +177 -0
- package/kits/schemas/agent-config.schema.2.json +239 -0
- package/kits/schemas/agent-config.schema.3.json +119 -0
- package/kits/schemas/agent-config.schema.4.json +208 -0
- package/kits/schemas/agent-config.schema.5.json +326 -0
- package/kits/schemas/contact-book.schema.1.json +36 -0
- package/kits/schemas/daemon.schema.1.json +90 -0
- package/kits/schemas/defaults.schema.1.json +81 -0
- package/kits/schemas/menu-exec-schema-commands.md +208 -0
- package/kits/schemas/migrations/README.md +28 -0
- package/kits/schemas/relation-config.schema.1.json +158 -0
- package/kits/schemas/relation-config.schema.2.json +73 -0
- package/kits/schemas/relation-config.schema.3.json +50 -0
- package/kits/schemas/relation-config.schema.4.json +47 -0
- package/kits/schemas/role-config.schema.1.json +200 -0
- package/kits/schemas/role-registry.schema.1.json +35 -0
- package/kits/schemas/single-session.schema.1.json +31 -0
- package/kits/templates/bootstrap-welcome.md +15 -0
- package/kits/templates/message-fragments/handoff-request-to-target.md +13 -0
- package/kits/templates/message-fragments/handoff-response-to-origin.md +10 -0
- package/kits/templates/message-fragments/inject-default.md +2 -0
- package/kits/templates/message-fragments/item.md +2 -0
- package/kits/templates/roles/admin.json +8 -0
- package/kits/templates/roles/member.json +40 -0
- package/kits/templates/roles/owner.json +8 -0
- package/kits/templates/roles/visitor.json +39 -0
- package/kits/templates/system-fragments/baseagent.md +14 -0
- package/kits/templates/system-fragments/bootstrap.md +16 -0
- package/kits/templates/system-fragments/channel.md +48 -0
- package/kits/templates/system-fragments/commands.md +26 -0
- package/kits/templates/system-fragments/identity.md +11 -0
- package/kits/templates/system-fragments/relation.md +19 -0
- package/kits/templates/system-fragments/session.md +53 -0
- package/kits/templates/system-fragments/venue.md +31 -0
- package/package.json +50 -15
- package/dist/index.d.ts +0 -7
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1920 1200" role="img" aria-labelledby="title desc">
|
|
2
|
+
<title id="title">Evolcore brand concept board</title>
|
|
3
|
+
<desc id="desc">A premium identity board showing the Evolcore logo, symbol, geometry, palette, typography and applications.</desc>
|
|
4
|
+
<defs>
|
|
5
|
+
<pattern id="grid" width="48" height="48" patternUnits="userSpaceOnUse">
|
|
6
|
+
<path d="M48 0H0V48" fill="none" stroke="#183027" stroke-width="1"/>
|
|
7
|
+
</pattern>
|
|
8
|
+
<filter id="shadow" x="-20%" y="-20%" width="140%" height="140%">
|
|
9
|
+
<feDropShadow dx="0" dy="18" stdDeviation="24" flood-color="#000" flood-opacity=".26"/>
|
|
10
|
+
</filter>
|
|
11
|
+
</defs>
|
|
12
|
+
|
|
13
|
+
<rect width="1920" height="1200" fill="#050A08"/>
|
|
14
|
+
<text x="72" y="62" fill="#7E928B" font-family="Lato, Arial, sans-serif" font-size="14" font-weight="700" letter-spacing="4">EVOLCORE / IDENTITY CONCEPT 01</text>
|
|
15
|
+
<text x="1848" y="62" text-anchor="end" fill="#7E928B" font-family="Lato, Arial, sans-serif" font-size="14" font-weight="700" letter-spacing="4">CONNECTED CORE</text>
|
|
16
|
+
|
|
17
|
+
<g transform="translate(72 96)">
|
|
18
|
+
<rect width="1104" height="438" rx="18" fill="#0B1713"/>
|
|
19
|
+
<path d="M0 364C286 247 564 502 1104 212V438H0Z" fill="#0E211A" opacity=".72"/>
|
|
20
|
+
<g transform="translate(86 118) scale(1.46)">
|
|
21
|
+
<g fill="none" stroke="#F2F7F5" stroke-linecap="round" stroke-linejoin="round">
|
|
22
|
+
<path d="M91 34.5A39 39 0 1 0 91 93.5" stroke-width="11"/>
|
|
23
|
+
<path d="M105 35.5 73 56.5M111 64H74M105 92.5 73 71.5" stroke-width="9"/>
|
|
24
|
+
</g>
|
|
25
|
+
<circle cx="66" cy="64" r="10" fill="#42E8B4"/>
|
|
26
|
+
<circle cx="66" cy="64" r="3.5" fill="#091512"/>
|
|
27
|
+
</g>
|
|
28
|
+
<text x="300" y="258" fill="#F2F7F5" font-family="Lato, 'Helvetica Neue', Arial, sans-serif" font-size="128" font-weight="500" letter-spacing="-5">evol</text>
|
|
29
|
+
<text x="535" y="258" fill="#F2F7F5" font-family="Lato, 'Helvetica Neue', Arial, sans-serif" font-size="128" font-weight="800" letter-spacing="-5">core</text>
|
|
30
|
+
<text x="92" y="380" fill="#42E8B4" font-family="Lato, Arial, sans-serif" font-size="17" font-weight="700" letter-spacing="4">ONE CONNECTION LAYER</text>
|
|
31
|
+
<text x="1012" y="380" text-anchor="end" fill="#7E928B" font-family="Lato, Arial, sans-serif" font-size="14" font-weight="700" letter-spacing="3">AI AGENT INFRASTRUCTURE</text>
|
|
32
|
+
</g>
|
|
33
|
+
|
|
34
|
+
<g transform="translate(1200 96)">
|
|
35
|
+
<rect width="648" height="438" rx="18" fill="#E9F0ED"/>
|
|
36
|
+
<text x="42" y="52" fill="#66756F" font-family="Lato, Arial, sans-serif" font-size="13" font-weight="700" letter-spacing="3">01 / THE MARK</text>
|
|
37
|
+
<g transform="translate(186 70) scale(2.25)">
|
|
38
|
+
<circle cx="64" cy="64" r="48" fill="none" stroke="#B8C8C2" stroke-width=".8" stroke-dasharray="3 3"/>
|
|
39
|
+
<path d="M64 9V119M9 64H119" stroke="#B8C8C2" stroke-width=".8"/>
|
|
40
|
+
<g fill="none" stroke="#091512" stroke-linecap="round" stroke-linejoin="round">
|
|
41
|
+
<path d="M91 34.5A39 39 0 1 0 91 93.5" stroke-width="11"/>
|
|
42
|
+
<path d="M105 35.5 73 56.5M111 64H74M105 92.5 73 71.5" stroke-width="9"/>
|
|
43
|
+
</g>
|
|
44
|
+
<circle cx="66" cy="64" r="10" fill="#42E8B4"/>
|
|
45
|
+
<circle cx="66" cy="64" r="3.5" fill="#091512"/>
|
|
46
|
+
</g>
|
|
47
|
+
<text x="42" y="396" fill="#091512" font-family="Lato, Arial, sans-serif" font-size="17" font-weight="700" letter-spacing="1.6">CHANNELS → CORE → CONTINUITY</text>
|
|
48
|
+
</g>
|
|
49
|
+
|
|
50
|
+
<g transform="translate(72 558)">
|
|
51
|
+
<rect width="420" height="570" rx="18" fill="#42E8B4"/>
|
|
52
|
+
<text x="34" y="48" fill="#091512" font-family="Lato, Arial, sans-serif" font-size="13" font-weight="800" letter-spacing="3">02 / APP ICON</text>
|
|
53
|
+
<g filter="url(#shadow)" transform="translate(66 112)">
|
|
54
|
+
<rect width="288" height="288" rx="66" fill="#091512"/>
|
|
55
|
+
<g transform="translate(54 54) scale(1.4)">
|
|
56
|
+
<g fill="none" stroke="#F2F7F5" stroke-linecap="round" stroke-linejoin="round">
|
|
57
|
+
<path d="M91 34.5A39 39 0 1 0 91 93.5" stroke-width="11"/>
|
|
58
|
+
<path d="M105 35.5 73 56.5M111 64H74M105 92.5 73 71.5" stroke-width="9"/>
|
|
59
|
+
</g>
|
|
60
|
+
<circle cx="66" cy="64" r="10" fill="#42E8B4"/>
|
|
61
|
+
<circle cx="66" cy="64" r="3.5" fill="#091512"/>
|
|
62
|
+
</g>
|
|
63
|
+
</g>
|
|
64
|
+
<text x="34" y="506" fill="#091512" font-family="Lato, Arial, sans-serif" font-size="42" font-weight="800" letter-spacing="-1">Recognizable</text>
|
|
65
|
+
<text x="34" y="536" fill="#315C4E" font-family="Lato, Arial, sans-serif" font-size="16" font-weight="700" letter-spacing="2">AT 16 PX AND BEYOND</text>
|
|
66
|
+
</g>
|
|
67
|
+
|
|
68
|
+
<g transform="translate(516 558)">
|
|
69
|
+
<rect width="660" height="276" rx="18" fill="#101D19"/>
|
|
70
|
+
<text x="34" y="48" fill="#7E928B" font-family="Lato, Arial, sans-serif" font-size="13" font-weight="700" letter-spacing="3">03 / COLOR SYSTEM</text>
|
|
71
|
+
<g transform="translate(34 82)">
|
|
72
|
+
<rect width="182" height="128" rx="10" fill="#091512" stroke="#294038"/>
|
|
73
|
+
<rect x="198" width="182" height="128" rx="10" fill="#42E8B4"/>
|
|
74
|
+
<rect x="396" width="182" height="128" rx="10" fill="#F2F7F5"/>
|
|
75
|
+
<text x="16" y="98" fill="#F2F7F5" font-family="Lato, Arial, sans-serif" font-size="16" font-weight="800">CORE</text>
|
|
76
|
+
<text x="16" y="118" fill="#7E928B" font-family="Lato, Arial, sans-serif" font-size="12" font-weight="700" letter-spacing="1">#091512</text>
|
|
77
|
+
<text x="214" y="98" fill="#091512" font-family="Lato, Arial, sans-serif" font-size="16" font-weight="800">SIGNAL</text>
|
|
78
|
+
<text x="214" y="118" fill="#315C4E" font-family="Lato, Arial, sans-serif" font-size="12" font-weight="700" letter-spacing="1">#42E8B4</text>
|
|
79
|
+
<text x="412" y="98" fill="#091512" font-family="Lato, Arial, sans-serif" font-size="16" font-weight="800">CLOUD</text>
|
|
80
|
+
<text x="412" y="118" fill="#66756F" font-family="Lato, Arial, sans-serif" font-size="12" font-weight="700" letter-spacing="1">#F2F7F5</text>
|
|
81
|
+
</g>
|
|
82
|
+
</g>
|
|
83
|
+
|
|
84
|
+
<g transform="translate(516 858)">
|
|
85
|
+
<rect width="660" height="270" rx="18" fill="#E9F0ED"/>
|
|
86
|
+
<text x="34" y="48" fill="#66756F" font-family="Lato, Arial, sans-serif" font-size="13" font-weight="700" letter-spacing="3">04 / TYPOGRAPHY</text>
|
|
87
|
+
<text x="34" y="142" fill="#091512" font-family="Lato, Arial, sans-serif" font-size="78" font-weight="500" letter-spacing="-3">evol</text>
|
|
88
|
+
<text x="186" y="142" fill="#091512" font-family="Lato, Arial, sans-serif" font-size="78" font-weight="800" letter-spacing="-3">core</text>
|
|
89
|
+
<text x="34" y="202" fill="#091512" font-family="Lato, Arial, sans-serif" font-size="24" font-weight="700" letter-spacing="5">AGENT CONNECTION LAYER</text>
|
|
90
|
+
<text x="34" y="236" fill="#66756F" font-family="DejaVu Sans Mono, monospace" font-size="14">gateway.connect(agent, channel)</text>
|
|
91
|
+
</g>
|
|
92
|
+
|
|
93
|
+
<g transform="translate(1200 558)">
|
|
94
|
+
<rect width="648" height="570" rx="18" fill="#0B1713"/>
|
|
95
|
+
<rect width="648" height="570" rx="18" fill="url(#grid)" opacity=".8"/>
|
|
96
|
+
<text x="34" y="48" fill="#7E928B" font-family="Lato, Arial, sans-serif" font-size="13" font-weight="700" letter-spacing="3">05 / PRODUCT SURFACE</text>
|
|
97
|
+
<g transform="translate(48 86)" filter="url(#shadow)">
|
|
98
|
+
<rect width="552" height="358" rx="18" fill="#E9F0ED"/>
|
|
99
|
+
<path d="M0 64H552" stroke="#C7D3CE"/>
|
|
100
|
+
<circle cx="28" cy="32" r="6" fill="#FD6A5E"/>
|
|
101
|
+
<circle cx="48" cy="32" r="6" fill="#F6C451"/>
|
|
102
|
+
<circle cx="68" cy="32" r="6" fill="#42E8B4"/>
|
|
103
|
+
<rect x="112" y="19" width="328" height="26" rx="13" fill="#D6E0DC"/>
|
|
104
|
+
<text x="276" y="37" text-anchor="middle" fill="#66756F" font-family="DejaVu Sans Mono, monospace" font-size="10">core.evol.ai</text>
|
|
105
|
+
<g transform="translate(28 90) scale(.42)">
|
|
106
|
+
<g fill="none" stroke="#091512" stroke-linecap="round" stroke-linejoin="round">
|
|
107
|
+
<path d="M91 34.5A39 39 0 1 0 91 93.5" stroke-width="11"/>
|
|
108
|
+
<path d="M105 35.5 73 56.5M111 64H74M105 92.5 73 71.5" stroke-width="9"/>
|
|
109
|
+
</g>
|
|
110
|
+
<circle cx="66" cy="64" r="10" fill="#42E8B4"/>
|
|
111
|
+
<circle cx="66" cy="64" r="3.5" fill="#091512"/>
|
|
112
|
+
</g>
|
|
113
|
+
<text x="90" y="125" fill="#091512" font-family="Lato, Arial, sans-serif" font-size="24" font-weight="800">evolcore</text>
|
|
114
|
+
<text x="28" y="182" fill="#66756F" font-family="Lato, Arial, sans-serif" font-size="14" font-weight="700" letter-spacing="2">CONNECTED AGENTS</text>
|
|
115
|
+
<text x="28" y="226" fill="#091512" font-family="Lato, Arial, sans-serif" font-size="42" font-weight="800">12</text>
|
|
116
|
+
<text x="206" y="182" fill="#66756F" font-family="Lato, Arial, sans-serif" font-size="14" font-weight="700" letter-spacing="2">CHANNELS</text>
|
|
117
|
+
<text x="206" y="226" fill="#091512" font-family="Lato, Arial, sans-serif" font-size="42" font-weight="800">06</text>
|
|
118
|
+
<rect x="28" y="270" width="496" height="54" rx="12" fill="#091512"/>
|
|
119
|
+
<circle cx="54" cy="297" r="7" fill="#42E8B4"/>
|
|
120
|
+
<text x="76" y="302" fill="#F2F7F5" font-family="DejaVu Sans Mono, monospace" font-size="13">all systems connected</text>
|
|
121
|
+
<text x="496" y="302" text-anchor="end" fill="#42E8B4" font-family="DejaVu Sans Mono, monospace" font-size="12">LIVE</text>
|
|
122
|
+
</g>
|
|
123
|
+
<text x="48" y="500" fill="#F2F7F5" font-family="Lato, Arial, sans-serif" font-size="34" font-weight="800">Many paths.</text>
|
|
124
|
+
<text x="48" y="540" fill="#42E8B4" font-family="Lato, Arial, sans-serif" font-size="34" font-weight="800">One evolving core.</text>
|
|
125
|
+
</g>
|
|
126
|
+
</svg>
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 700 240" role="img" aria-labelledby="title desc">
|
|
2
|
+
<title id="title">Evolcore reverse logo</title>
|
|
3
|
+
<desc id="desc">White Evolcore wordmark for dark backgrounds.</desc>
|
|
4
|
+
<g transform="translate(36 38) scale(1.28)">
|
|
5
|
+
<g fill="none" stroke="#F2F7F5" stroke-linecap="round" stroke-linejoin="round">
|
|
6
|
+
<path d="M91 34.5A39 39 0 1 0 91 93.5" stroke-width="11"/>
|
|
7
|
+
<path d="M105 35.5 73 56.5M111 64H74M105 92.5 73 71.5" stroke-width="9"/>
|
|
8
|
+
</g>
|
|
9
|
+
<circle cx="66" cy="64" r="10" fill="#42E8B4"/>
|
|
10
|
+
<circle cx="66" cy="64" r="3.5" fill="#091512"/>
|
|
11
|
+
</g>
|
|
12
|
+
<text x="215" y="153" fill="#F2F7F5" font-family="Lato, 'Helvetica Neue', Arial, sans-serif" font-size="112" font-weight="500" letter-spacing="-4">evol</text>
|
|
13
|
+
<text x="421" y="153" fill="#F2F7F5" font-family="Lato, 'Helvetica Neue', Arial, sans-serif" font-size="112" font-weight="800" letter-spacing="-4">core</text>
|
|
14
|
+
</svg>
|
|
Binary file
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 700 240" role="img" aria-labelledby="title desc">
|
|
2
|
+
<title id="title">Evolcore logo</title>
|
|
3
|
+
<desc id="desc">Evolcore wordmark with a connected core symbol.</desc>
|
|
4
|
+
<g transform="translate(36 38) scale(1.28)">
|
|
5
|
+
<g fill="none" stroke="#091512" stroke-linecap="round" stroke-linejoin="round">
|
|
6
|
+
<path d="M91 34.5A39 39 0 1 0 91 93.5" stroke-width="11"/>
|
|
7
|
+
<path d="M105 35.5 73 56.5M111 64H74M105 92.5 73 71.5" stroke-width="9"/>
|
|
8
|
+
</g>
|
|
9
|
+
<circle cx="66" cy="64" r="10" fill="#42E8B4"/>
|
|
10
|
+
<circle cx="66" cy="64" r="3.5" fill="#091512"/>
|
|
11
|
+
</g>
|
|
12
|
+
<text x="215" y="153" fill="#091512" font-family="Lato, 'Helvetica Neue', Arial, sans-serif" font-size="112" font-weight="500" letter-spacing="-4">evol</text>
|
|
13
|
+
<text x="421" y="153" fill="#091512" font-family="Lato, 'Helvetica Neue', Arial, sans-serif" font-size="112" font-weight="800" letter-spacing="-4">core</text>
|
|
14
|
+
</svg>
|
|
Binary file
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" role="img" aria-labelledby="title desc">
|
|
2
|
+
<title id="title">Evolcore symbol</title>
|
|
3
|
+
<desc id="desc">Three signal paths converge into a core inside an open circular form.</desc>
|
|
4
|
+
<g fill="none" stroke="#091512" stroke-linecap="round" stroke-linejoin="round">
|
|
5
|
+
<path d="M91 34.5A39 39 0 1 0 91 93.5" stroke-width="11"/>
|
|
6
|
+
<path d="M105 35.5 73 56.5M111 64H74M105 92.5 73 71.5" stroke-width="9"/>
|
|
7
|
+
</g>
|
|
8
|
+
<circle cx="66" cy="64" r="10" fill="#42E8B4"/>
|
|
9
|
+
<circle cx="66" cy="64" r="3.5" fill="#091512"/>
|
|
10
|
+
</svg>
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import fs from 'fs';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import { spawn } from 'child_process';
|
|
5
|
+
|
|
6
|
+
const MAX_OUTPUT_BYTES = 1024 * 1024;
|
|
7
|
+
const EC_EXECUTABLES = new Set(['ec']);
|
|
8
|
+
const HOST_PROCESS_EXECUTABLES = new Set(['ps', 'pgrep', 'pidof', 'kill', 'pkill', 'killall']);
|
|
9
|
+
|
|
10
|
+
function fail(message) {
|
|
11
|
+
process.stderr.write(`ec-safe-output: ${message}\n`);
|
|
12
|
+
process.exit(2);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function sameOrDescendant(candidate, parent) {
|
|
16
|
+
const relative = path.relative(parent, candidate);
|
|
17
|
+
return relative === '' || (!relative.startsWith(`..${path.sep}`) && relative !== '..' && !path.isAbsolute(relative));
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function decodePayload(encoded) {
|
|
21
|
+
try {
|
|
22
|
+
const value = JSON.parse(Buffer.from(encoded, 'base64url').toString('utf8'));
|
|
23
|
+
if (!value || value.v !== 1 || !Array.isArray(value.argv) || value.argv.some(arg => typeof arg !== 'string')) return null;
|
|
24
|
+
return value;
|
|
25
|
+
} catch {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function validateCommand(payload) {
|
|
31
|
+
const executable = path.basename(payload.argv[0] ?? '').toLowerCase();
|
|
32
|
+
if (payload.kind === 'ec') return EC_EXECUTABLES.has(executable);
|
|
33
|
+
if (payload.kind !== 'host-process' || !HOST_PROCESS_EXECUTABLES.has(executable)) return false;
|
|
34
|
+
return !payload.argv.some(arg => /\bnode(?:js|\.exe)?\b/i.test(arg));
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function resolveExecutionPaths(payload) {
|
|
38
|
+
if (typeof payload.workspace !== 'string' || typeof payload.cwd !== 'string') fail('invalid workspace');
|
|
39
|
+
let workspace;
|
|
40
|
+
let cwd;
|
|
41
|
+
try {
|
|
42
|
+
workspace = fs.realpathSync(payload.workspace);
|
|
43
|
+
cwd = fs.realpathSync(payload.cwd);
|
|
44
|
+
} catch {
|
|
45
|
+
fail('workspace or cwd does not exist');
|
|
46
|
+
}
|
|
47
|
+
if (!sameOrDescendant(cwd, workspace)) fail('cwd escapes workspace');
|
|
48
|
+
return { workspace, cwd };
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function openOutputFile(payload, paths) {
|
|
52
|
+
if (payload.outputPath === undefined) return undefined;
|
|
53
|
+
if (typeof payload.outputPath !== 'string' || !payload.outputPath || path.isAbsolute(payload.outputPath)) {
|
|
54
|
+
fail('output path must be relative');
|
|
55
|
+
}
|
|
56
|
+
const target = path.resolve(paths.cwd, payload.outputPath);
|
|
57
|
+
const parent = path.dirname(target);
|
|
58
|
+
let realParent;
|
|
59
|
+
try {
|
|
60
|
+
realParent = fs.realpathSync(parent);
|
|
61
|
+
if (!fs.statSync(realParent).isDirectory()) fail('output parent is not a directory');
|
|
62
|
+
} catch {
|
|
63
|
+
fail('output parent does not exist');
|
|
64
|
+
}
|
|
65
|
+
const canonicalTarget = path.join(realParent, path.basename(target));
|
|
66
|
+
if (!sameOrDescendant(canonicalTarget, paths.workspace)) fail('output path escapes workspace');
|
|
67
|
+
const relative = path.relative(paths.workspace, canonicalTarget);
|
|
68
|
+
if (relative === '.git' || relative.startsWith(`.git${path.sep}`)) fail('output path may not target Git metadata');
|
|
69
|
+
|
|
70
|
+
const noFollow = fs.constants.O_NOFOLLOW ?? 0;
|
|
71
|
+
try {
|
|
72
|
+
const fd = fs.openSync(
|
|
73
|
+
canonicalTarget,
|
|
74
|
+
fs.constants.O_WRONLY | fs.constants.O_CREAT | fs.constants.O_EXCL | noFollow,
|
|
75
|
+
0o600,
|
|
76
|
+
);
|
|
77
|
+
if (!fs.fstatSync(fd).isFile()) {
|
|
78
|
+
fs.closeSync(fd);
|
|
79
|
+
fail('output target is not a regular file');
|
|
80
|
+
}
|
|
81
|
+
return { fd, target: canonicalTarget };
|
|
82
|
+
} catch (error) {
|
|
83
|
+
fail(error?.code === 'EEXIST' ? 'output file already exists' : 'unable to create output file');
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
const payload = decodePayload(process.argv[2]);
|
|
88
|
+
if (!payload) fail('invalid payload');
|
|
89
|
+
if (!validateCommand(payload)) fail('command is not permitted');
|
|
90
|
+
if (payload.headLines !== undefined
|
|
91
|
+
&& (!Number.isSafeInteger(payload.headLines) || payload.headLines < 1 || payload.headLines > 10_000)) {
|
|
92
|
+
fail('invalid head line limit');
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
const paths = resolveExecutionPaths(payload);
|
|
96
|
+
const output = openOutputFile(payload, paths);
|
|
97
|
+
let bytesWritten = 0;
|
|
98
|
+
let linesWritten = 0;
|
|
99
|
+
let limitReached = false;
|
|
100
|
+
let writeFailed = false;
|
|
101
|
+
|
|
102
|
+
function writeLimited(chunk) {
|
|
103
|
+
if (limitReached || writeFailed) return;
|
|
104
|
+
const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
|
|
105
|
+
let allowed = Math.min(buffer.length, MAX_OUTPUT_BYTES - bytesWritten);
|
|
106
|
+
if (payload.headLines !== undefined) {
|
|
107
|
+
let cursor = 0;
|
|
108
|
+
while (cursor < allowed) {
|
|
109
|
+
const newline = buffer.indexOf(0x0a, cursor);
|
|
110
|
+
if (newline < 0 || newline >= allowed) break;
|
|
111
|
+
linesWritten++;
|
|
112
|
+
cursor = newline + 1;
|
|
113
|
+
if (linesWritten >= payload.headLines) {
|
|
114
|
+
allowed = cursor;
|
|
115
|
+
limitReached = true;
|
|
116
|
+
break;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
if (allowed <= 0) {
|
|
121
|
+
limitReached = true;
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
const slice = buffer.subarray(0, allowed);
|
|
125
|
+
try {
|
|
126
|
+
if (output) fs.writeSync(output.fd, slice);
|
|
127
|
+
else process.stdout.write(slice);
|
|
128
|
+
bytesWritten += slice.length;
|
|
129
|
+
if (bytesWritten >= MAX_OUTPUT_BYTES) limitReached = true;
|
|
130
|
+
} catch {
|
|
131
|
+
writeFailed = true;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
const child = spawn(payload.argv[0], payload.argv.slice(1), {
|
|
136
|
+
cwd: paths.cwd,
|
|
137
|
+
env: process.env,
|
|
138
|
+
stdio: ['ignore', 'pipe', payload.mergeStderr ? 'pipe' : 'inherit'],
|
|
139
|
+
});
|
|
140
|
+
child.stdout.on('data', writeLimited);
|
|
141
|
+
if (payload.mergeStderr) child.stderr.on('data', writeLimited);
|
|
142
|
+
|
|
143
|
+
child.once('error', error => {
|
|
144
|
+
if (output) {
|
|
145
|
+
try { fs.closeSync(output.fd); } catch {}
|
|
146
|
+
try { fs.unlinkSync(output.target); } catch {}
|
|
147
|
+
}
|
|
148
|
+
fail(`unable to start command: ${error.message}`);
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
child.once('close', code => {
|
|
152
|
+
if (output) {
|
|
153
|
+
try { fs.closeSync(output.fd); } catch { writeFailed = true; }
|
|
154
|
+
}
|
|
155
|
+
if (writeFailed) {
|
|
156
|
+
if (output) try { fs.unlinkSync(output.target); } catch {}
|
|
157
|
+
fail('failed to write command output');
|
|
158
|
+
}
|
|
159
|
+
if (output) process.stderr.write(`Saved output to ${output.target}\n`);
|
|
160
|
+
process.exitCode = code ?? 1;
|
|
161
|
+
});
|
package/bin/ec.js
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import fs from 'fs';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import { spawnSync } from 'child_process';
|
|
5
|
+
import { fileURLToPath, pathToFileURL } from 'url';
|
|
6
|
+
import { createRequire } from 'module';
|
|
7
|
+
|
|
8
|
+
const require = createRequire(import.meta.url);
|
|
9
|
+
const here = path.dirname(fileURLToPath(import.meta.url));
|
|
10
|
+
const repoRoot = path.resolve(here, '..');
|
|
11
|
+
const srcEntry = path.join(repoRoot, 'src', 'cli', 'index.ts');
|
|
12
|
+
const distEntry = path.join(repoRoot, 'dist', 'cli', 'index.js');
|
|
13
|
+
const args = process.argv.slice(2);
|
|
14
|
+
|
|
15
|
+
if (fs.existsSync(srcEntry)) {
|
|
16
|
+
try {
|
|
17
|
+
const tsxImport = pathToFileURL(require.resolve('tsx')).href;
|
|
18
|
+
const result = spawnSync(process.execPath, ['--import', tsxImport, srcEntry, ...args], { stdio: 'inherit' });
|
|
19
|
+
process.exit(result.status ?? (result.error ? 1 : 0));
|
|
20
|
+
} catch {}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
if (fs.existsSync(distEntry)) {
|
|
24
|
+
const result = spawnSync(process.execPath, [distEntry, ...args], { stdio: 'inherit' });
|
|
25
|
+
process.exit(result.status ?? (result.error ? 1 : 0));
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
console.error('ec: missing CLI entrypoint');
|
|
29
|
+
process.exit(1);
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Baseagent identity + credential resolution.
|
|
3
|
+
*
|
|
4
|
+
* 两部分:
|
|
5
|
+
* 1. normalizeBaseagent —— 把用户输入的各种别名(cc / claude-code / gemini cli …)
|
|
6
|
+
* 归一到 canonical 标识 + 展示名。
|
|
7
|
+
* 2. resolve*Config —— 各后端的凭证解析。输入是 Config 形态
|
|
8
|
+
* (`config.agents.<baseagent>` + override)。启动期由 index.ts 从
|
|
9
|
+
* primaryAgent.config.baseagents 构造一个 syntheticConfig 喂入;各 plugin 的
|
|
10
|
+
* createAgent 也各自构造 syntheticConfig。
|
|
11
|
+
*/
|
|
12
|
+
import fs from 'fs';
|
|
13
|
+
import path from 'path';
|
|
14
|
+
import os from 'os';
|
|
15
|
+
import { commandExists } from '../utils/cross-platform.js';
|
|
16
|
+
const BASEAGENT_ALIASES = {
|
|
17
|
+
claude: { canonical: 'claude', displayName: 'Claude Code' },
|
|
18
|
+
cc: { canonical: 'claude', displayName: 'Claude Code' },
|
|
19
|
+
'claude-code': { canonical: 'claude', displayName: 'Claude Code' },
|
|
20
|
+
'claude code': { canonical: 'claude', displayName: 'Claude Code' },
|
|
21
|
+
claudecode: { canonical: 'claude', displayName: 'Claude Code' },
|
|
22
|
+
codex: { canonical: 'codex', displayName: 'Codex' },
|
|
23
|
+
'codex-cli': { canonical: 'codex', displayName: 'Codex' },
|
|
24
|
+
'codex cli': { canonical: 'codex', displayName: 'Codex' },
|
|
25
|
+
gemini: { canonical: 'gemini', displayName: 'Gemini CLI' },
|
|
26
|
+
'gemini-cli': { canonical: 'gemini', displayName: 'Gemini CLI' },
|
|
27
|
+
'gemini cli': { canonical: 'gemini', displayName: 'Gemini CLI' },
|
|
28
|
+
geminicli: { canonical: 'gemini', displayName: 'Gemini CLI' },
|
|
29
|
+
hermes: { canonical: 'hermes', displayName: 'Hermes' },
|
|
30
|
+
};
|
|
31
|
+
export function normalizeBaseagent(input) {
|
|
32
|
+
const key = String(input || '').trim().toLowerCase().replace(/_/g, '-');
|
|
33
|
+
return BASEAGENT_ALIASES[key] || { canonical: 'unknown', displayName: input ? String(input) : 'Unknown' };
|
|
34
|
+
}
|
|
35
|
+
function loadClaudeSettings() {
|
|
36
|
+
try {
|
|
37
|
+
const settingsPath = path.join(os.homedir(), '.claude', 'settings.json');
|
|
38
|
+
if (fs.existsSync(settingsPath)) {
|
|
39
|
+
return JSON.parse(fs.readFileSync(settingsPath, 'utf-8'));
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
catch { }
|
|
43
|
+
return {};
|
|
44
|
+
}
|
|
45
|
+
export function resolveAnthropicConfig(config, override) {
|
|
46
|
+
const settings = loadClaudeSettings();
|
|
47
|
+
const isPlaceholder = (v) => !v || v.includes('your-') || v.includes('placeholder');
|
|
48
|
+
const overrideApiKey = isPlaceholder(override?.apiKey) ? undefined : override?.apiKey;
|
|
49
|
+
const globalApiKey = isPlaceholder(config.agents?.claude?.apiKey) ? undefined : config.agents?.claude?.apiKey;
|
|
50
|
+
const apiKey = overrideApiKey
|
|
51
|
+
|| globalApiKey
|
|
52
|
+
|| process.env.ANTHROPIC_AUTH_TOKEN
|
|
53
|
+
|| settings.env?.ANTHROPIC_AUTH_TOKEN;
|
|
54
|
+
if (!apiKey) {
|
|
55
|
+
throw new Error('No API key found. Set one of: baseagents.claude.apiKey (per-agent or defaults), env ANTHROPIC_AUTH_TOKEN, or ~/.claude/settings.json env.ANTHROPIC_AUTH_TOKEN');
|
|
56
|
+
}
|
|
57
|
+
const isPlaceholderUrl = (v) => !v || v.includes('api.anthropic.com');
|
|
58
|
+
const overrideBaseUrl = isPlaceholderUrl(override?.baseUrl) ? undefined : override?.baseUrl;
|
|
59
|
+
const globalBaseUrl = isPlaceholderUrl(config.agents?.claude?.baseUrl) ? undefined : config.agents?.claude?.baseUrl;
|
|
60
|
+
const baseUrl = overrideBaseUrl
|
|
61
|
+
|| globalBaseUrl
|
|
62
|
+
|| process.env.ANTHROPIC_BASE_URL
|
|
63
|
+
|| settings.env?.ANTHROPIC_BASE_URL;
|
|
64
|
+
const model = override?.model
|
|
65
|
+
|| config.agents?.claude?.model
|
|
66
|
+
|| settings.model
|
|
67
|
+
|| 'sonnet';
|
|
68
|
+
const effort = override?.effort
|
|
69
|
+
|| config.agents?.claude?.effort
|
|
70
|
+
|| settings.effortLevel
|
|
71
|
+
|| undefined;
|
|
72
|
+
const pickExec = (v) => (!v || v.includes('your-') || v.includes('placeholder')) ? undefined : v;
|
|
73
|
+
const pathToClaudeCodeExecutable = pickExec(override?.pathToClaudeCodeExecutable)
|
|
74
|
+
|| pickExec(config.agents?.claude?.pathToClaudeCodeExecutable);
|
|
75
|
+
return { apiKey, baseUrl, model, effort, pathToClaudeCodeExecutable };
|
|
76
|
+
}
|
|
77
|
+
function loadCodexSettings() {
|
|
78
|
+
try {
|
|
79
|
+
const authPath = path.join(os.homedir(), '.codex', 'auth.json');
|
|
80
|
+
let apiKey;
|
|
81
|
+
if (fs.existsSync(authPath)) {
|
|
82
|
+
const auth = JSON.parse(fs.readFileSync(authPath, 'utf-8'));
|
|
83
|
+
apiKey = auth.OPENAI_API_KEY;
|
|
84
|
+
}
|
|
85
|
+
const configPath = path.join(os.homedir(), '.codex', 'config.toml');
|
|
86
|
+
let model;
|
|
87
|
+
let baseUrl;
|
|
88
|
+
if (fs.existsSync(configPath)) {
|
|
89
|
+
const content = fs.readFileSync(configPath, 'utf-8');
|
|
90
|
+
const modelMatch = content.match(/^model\s*=\s*"([^"]+)"/m);
|
|
91
|
+
if (modelMatch)
|
|
92
|
+
model = modelMatch[1];
|
|
93
|
+
const providerMatch = content.match(/^model_provider\s*=\s*"([^"]+)"/m);
|
|
94
|
+
if (providerMatch) {
|
|
95
|
+
const provider = providerMatch[1];
|
|
96
|
+
const baseUrlMatch = content.match(new RegExp(`\\[model_providers\\.${provider}\\][\\s\\S]*?base_url\\s*=\\s*"([^"]+)"`, 'm'));
|
|
97
|
+
if (baseUrlMatch)
|
|
98
|
+
baseUrl = baseUrlMatch[1];
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return { apiKey, baseUrl, model };
|
|
102
|
+
}
|
|
103
|
+
catch { }
|
|
104
|
+
return {};
|
|
105
|
+
}
|
|
106
|
+
export function resolveOpenaiConfig(config, override) {
|
|
107
|
+
const codexSettings = loadCodexSettings();
|
|
108
|
+
const isPlaceholder = (v) => !v || v.includes('your-') || v.includes('placeholder');
|
|
109
|
+
const overrideApiKey = isPlaceholder(override?.apiKey) ? undefined : override?.apiKey;
|
|
110
|
+
const globalApiKey = isPlaceholder(config.agents?.codex?.apiKey) ? undefined : config.agents?.codex?.apiKey;
|
|
111
|
+
const apiKey = overrideApiKey
|
|
112
|
+
|| globalApiKey
|
|
113
|
+
|| process.env.OPENAI_API_KEY
|
|
114
|
+
|| codexSettings.apiKey;
|
|
115
|
+
if (!apiKey) {
|
|
116
|
+
throw new Error('No OpenAI API key found. Set one of: baseagents.codex.apiKey (per-agent or defaults), env OPENAI_API_KEY, or ~/.codex/auth.json');
|
|
117
|
+
}
|
|
118
|
+
const isPlaceholderUrl = (v) => !v || v.includes('api.openai.com');
|
|
119
|
+
const overrideBaseUrl = isPlaceholderUrl(override?.baseUrl) ? undefined : override?.baseUrl;
|
|
120
|
+
const globalBaseUrl = isPlaceholderUrl(config.agents?.codex?.baseUrl) ? undefined : config.agents?.codex?.baseUrl;
|
|
121
|
+
const baseUrl = overrideBaseUrl
|
|
122
|
+
|| globalBaseUrl
|
|
123
|
+
|| process.env.OPENAI_BASE_URL
|
|
124
|
+
|| codexSettings.baseUrl
|
|
125
|
+
|| undefined;
|
|
126
|
+
const model = override?.model
|
|
127
|
+
|| config.agents?.codex?.model
|
|
128
|
+
|| codexSettings.model
|
|
129
|
+
|| 'gpt-5.2-codex';
|
|
130
|
+
const effort = override?.effort
|
|
131
|
+
|| override?.reasoning
|
|
132
|
+
|| config.agents?.codex?.effort
|
|
133
|
+
|| config.agents?.codex?.reasoning
|
|
134
|
+
|| undefined;
|
|
135
|
+
const enableRequestUserInput = override?.enableRequestUserInput
|
|
136
|
+
?? config.agents?.codex?.enableRequestUserInput
|
|
137
|
+
?? true;
|
|
138
|
+
const approvalsReviewer = override?.approvalsReviewer
|
|
139
|
+
?? config.agents?.codex?.approvalsReviewer
|
|
140
|
+
?? undefined;
|
|
141
|
+
return { apiKey, baseUrl, model, effort, enableRequestUserInput, approvalsReviewer };
|
|
142
|
+
}
|
|
143
|
+
export function resolveGoogleConfig(config, override) {
|
|
144
|
+
const googleCfg = config.agents?.gemini;
|
|
145
|
+
const isPlaceholder = (v) => !v || v.includes('your-') || v.includes('placeholder');
|
|
146
|
+
let cliPath = override?.cliPath || googleCfg?.cliPath || '';
|
|
147
|
+
if (!cliPath) {
|
|
148
|
+
cliPath = commandExists('gemini') ? 'gemini' : '';
|
|
149
|
+
}
|
|
150
|
+
const model = override?.model || googleCfg?.model || 'gemini-2.5-flash';
|
|
151
|
+
const overrideApiKey = isPlaceholder(override?.apiKey) ? undefined : override?.apiKey;
|
|
152
|
+
const globalApiKey = isPlaceholder(googleCfg?.apiKey) ? undefined : googleCfg?.apiKey;
|
|
153
|
+
const apiKey = overrideApiKey
|
|
154
|
+
|| globalApiKey
|
|
155
|
+
|| process.env.GEMINI_API_KEY
|
|
156
|
+
|| process.env.GOOGLE_API_KEY
|
|
157
|
+
|| undefined;
|
|
158
|
+
const mode = override?.mode || googleCfg?.mode || 'cli';
|
|
159
|
+
const useVertex = override?.useVertex ?? googleCfg?.useVertex ?? false;
|
|
160
|
+
const project = override?.project || googleCfg?.project || process.env.GOOGLE_CLOUD_PROJECT || undefined;
|
|
161
|
+
const location = override?.location || googleCfg?.location || process.env.GOOGLE_CLOUD_LOCATION || 'us-central1';
|
|
162
|
+
return { cliPath, model, apiKey, mode, useVertex, project, location };
|
|
163
|
+
}
|