Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions .claude/settings.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,24 @@
{
"permissions": {
"allow": [
"Skill(deep-research)",
"Skill(deep-research:*)",
"WebFetch(domain:www.cloudwego.io)",
"WebFetch(domain:aider.chat)",
"WebFetch(domain:docs.openhands.dev)",
"WebFetch(domain:www.openhands.dev)",
"WebFetch(domain:arxiv.org)",
"WebFetch(domain:blog.stackblitz.com)",
"WebFetch(domain:blog.replit.com)",
"WebFetch(domain:docs.replit.com)",
"WebFetch(domain:developers.openai.com)",
"WebFetch(domain:openai.com)",
"WebFetch(domain:opencode.ai)",
"WebFetch(domain:replit.com)",
"WebFetch(domain:support.bolt.new)",
"WebFetch(domain:cursor.com)",
"WebFetch(domain:*)"
],
"additionalDirectories": [
"/Users/mjudeikis/go/src/github.com/kcp-dev/kcp/pkg/reconciler/apis/apibinding"
]
Expand Down
98 changes: 96 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
.PHONY: dev-edge-create dev-run-edge build test lint fix-lint codegen crds clean certs dev-setup run-dex run-hub run-hub-static run-hub-embedded run-hub-embedded-static run-hub-standalone run-hub-embedded-graphql run-kcp dev-login dev-login-static dev-create-workload dev dev-infra dev-run-kcp path boilerplate verify-boilerplate verify-codegen ldflags tools docker-build docker-build-hub docker-build-agent docker-build-dex docker-build-dev-agent load-dev-agent-image docker-push-dex verify help-dev dev-status dev-clean-hooks helm-build-local helm-push-local helm-clean build-quickstart-provider build-quickstart-provider-portal build-kuery-provider build-kuery-provider-portal run-provider-kuery kuery-db-up kuery-db-down install-provider-kuery init-provider-kuery uninstall-provider-kuery run-provider-quickstart install-provider-quickstart init-provider-quickstart uninstall-provider-quickstart build-infrastructure-provider build-infrastructure-provider-portal codegen-infrastructure-provider run-provider-infrastructure install-provider-infrastructure init-provider-infrastructure uninstall-provider-infrastructure build-app-studio-provider build-app-studio-provider-portal codegen-app-studio-provider app-studio-db-up app-studio-db-down run-provider-app-studio install-provider-app-studio init-provider-app-studio uninstall-provider-app-studio build-code-provider build-code-provider-portal codegen-code-provider run-provider-code install-provider-code init-provider-code uninstall-provider-code build-databricks-provider build-databricks-provider-portal codegen-databricks-provider run-provider-databricks install-provider-databricks init-provider-databricks uninstall-provider-databricks dev-kro-up dev-kro-down dev-kro-seed dev-kro-register-self e2e-infrastructure portal-provider-symlinks build-mcp-provider-portal build-kubernetes-edges-provider-portal build-server-edges-provider-portal e2e-provider e2e-provider-flags e2e-provider-all
.PHONY: dev-edge-create dev-run-edge build test lint fix-lint codegen crds clean certs dev-setup run-dex run-hub run-hub-static run-hub-embedded run-hub-embedded-static run-hub-standalone run-hub-embedded-graphql run-kcp dev-login dev-login-static dev-create-workload dev dev-infra dev-run-kcp path boilerplate verify-boilerplate verify-codegen ldflags tools docker-build docker-build-hub docker-build-agent docker-build-dex docker-build-dev-agent load-dev-agent-image docker-push-dex verify help-dev dev-status dev-clean-hooks helm-build-local helm-push-local helm-clean build-quickstart-provider build-quickstart-provider-portal build-kuery-provider build-kuery-provider-portal run-provider-kuery kuery-db-up kuery-db-down install-provider-kuery init-provider-kuery uninstall-provider-kuery run-provider-quickstart install-provider-quickstart init-provider-quickstart uninstall-provider-quickstart build-infrastructure-provider build-infrastructure-provider-portal codegen-infrastructure-provider run-provider-infrastructure install-provider-infrastructure init-provider-infrastructure uninstall-provider-infrastructure build-app-studio-provider build-app-studio-provider-portal codegen-app-studio-provider app-studio-db-up app-studio-db-down run-provider-app-studio install-provider-app-studio init-provider-app-studio uninstall-provider-app-studio build-agents-provider build-agents-provider-portal codegen-agents-provider run-provider-agents install-provider-agents init-provider-agents uninstall-provider-agents build-code-provider build-code-provider-portal codegen-code-provider run-provider-code install-provider-code init-provider-code uninstall-provider-code build-databricks-provider build-databricks-provider-portal codegen-databricks-provider run-provider-databricks install-provider-databricks init-provider-databricks uninstall-provider-databricks dev-kro-up dev-kro-down dev-kro-seed dev-kro-register-self e2e-infrastructure portal-provider-symlinks build-mcp-provider-portal build-kubernetes-edges-provider-portal build-server-edges-provider-portal e2e-provider e2e-provider-flags e2e-provider-all

BINDIR ?= bin
GOFLAGS ?=
Expand Down Expand Up @@ -139,6 +139,12 @@ build-app-studio-provider-portal: ## Build the App Studio provider's micro-front
build-app-studio-provider: build-app-studio-provider-portal ## Build the App Studio provider binary (portal embedded)
cd providers/app-studio && go build $(GOFLAGS) -o $(CURDIR)/$(BINDIR)/app-studio-provider .

build-agents-provider-portal: ## Build the agents provider's micro-frontend (Vite + TS → portal/dist)
cd providers/agents/portal && npm install --no-audit --no-fund && npm run build

build-agents-provider: build-agents-provider-portal ## Build the agents provider binary (portal embedded)
cd providers/agents && go build $(GOFLAGS) -o $(CURDIR)/$(BINDIR)/agents-provider .

build-code-provider-portal: ## Build the code provider's micro-frontend (Vite + Vue → portal/dist)
cd providers/code/portal && npm install --no-audit --no-fund && npm run build

Expand Down Expand Up @@ -182,12 +188,25 @@ codegen-code-provider: $(CONTROLLER_GEN) $(KCP_APIGEN_GEN) ## Codegen for the co
$(CURDIR)/$(CONTROLLER_GEN) crd paths="./apis/..." \
output:crd:artifacts:config=$(CURDIR)/providers/code/config/crds
./$(KCP_APIGEN_GEN) --input-dir providers/code/config/crds --output-dir providers/code/config/kcp
@for r in connections repositories repositorycommits repositorycheckouts deploykeys collaborators packages; do \
@for r in connections repositories repositorycommits repositorycheckouts repositorybuildstatuses deploykeys collaborators packages; do \
cp providers/code/config/kcp/apiresourceschema-$$r.code.kedge.faros.sh.yaml \
providers/code/deploy/chart/files/schemas/$$r.code.kedge.faros.sh.yaml; \
done
./hack/ensure-boilerplate.sh

codegen-agents-provider: $(CONTROLLER_GEN) $(KCP_APIGEN_GEN) ## Codegen for the agents provider's local API (+ chart schemas)
@mkdir -p providers/agents/config/crds providers/agents/config/kcp providers/agents/deploy/chart/files/schemas
cd providers/agents && \
$(CURDIR)/$(CONTROLLER_GEN) object paths="./apis/..." && \
$(CURDIR)/$(CONTROLLER_GEN) crd paths="./apis/..." \
output:crd:artifacts:config=$(CURDIR)/providers/agents/config/crds
./$(KCP_APIGEN_GEN) --input-dir providers/agents/config/crds --output-dir providers/agents/config/kcp
@for r in agents connections agentschedules agenttriggers agentruns; do \
cp providers/agents/config/kcp/apiresourceschema-$$r.agents.kedge.faros.sh.yaml \
providers/agents/deploy/chart/files/schemas/$$r.agents.kedge.faros.sh.yaml; \
done
./hack/ensure-boilerplate.sh

codegen-app-studio-provider: $(CONTROLLER_GEN) $(KCP_APIGEN_GEN) ## Codegen for the App Studio provider's local API (+ manifest + chart schema)
@mkdir -p providers/app-studio/config/crds providers/app-studio/config/kcp providers/app-studio/deploy/chart/files/schemas
cd providers/app-studio && \
Expand Down Expand Up @@ -902,6 +921,20 @@ APP_STUDIO_POSTGRES_USER ?= appstudio
APP_STUDIO_POSTGRES_PASSWORD ?= appstudio
APP_STUDIO_POSTGRES_DB ?= appstudio

# --- agents provider (long-running personal AI agents) ---
AGENTS_PORT ?= 8087
AGENTS_HUB_URL ?= https://localhost:9443
AGENTS_TOKEN ?= $(STATIC_AUTH_TOKEN)
AGENTS_KCP_KUBECONFIG ?= $(KCP_DATA_DIR)/admin.kubeconfig
AGENTS_KCP_SERVER ?= https://localhost:6443
AGENTS_WORKSPACE_PATH ?= root:kedge:providers:agents
AGENTS_PROVIDER_KUBECONFIG ?= $(KCP_DATA_DIR)/agents-provider.kubeconfig
AGENTS_SCHEMAS_DIR ?= providers/agents/deploy/chart/files/schemas
AGENTS_MANIFEST ?= providers/agents/manifest.yaml
AGENTS_PROVIDER_MANIFEST ?= providers/agents/provider.yaml
# Postgres store backend is not wired yet; dev runs use the in-memory store.
AGENTS_IN_MEMORY_STORE ?= true

## Run the infrastructure provider binary locally. Heartbeats to the hub on
## $(KROMC_HUB_URL); TLS verification skipped (dev cert is self-signed).
## KRO_KUBECONFIG is left unset by default → provider serves the baked-in
Expand Down Expand Up @@ -1129,6 +1162,67 @@ uninstall-provider-app-studio: ## Delete App Studio CatalogEntry
--insecure-skip-tls-verify \
delete -f $(APP_STUDIO_MANIFEST) -f $(APP_STUDIO_PROVIDER_MANIFEST)

## --- agents provider dev targets (mirror app-studio; in-memory store) ---

run-provider-agents: build-agents-provider ## Run the agents provider (requires: make run-hub-embedded-static + make install-provider-agents + make init-provider-agents)
@echo "Starting agents provider on :$(AGENTS_PORT)"
@echo " hub: $(AGENTS_HUB_URL)"
@echo " store: in-memory (non-durable; Postgres backend not wired yet)"
@# Auto-source providers/agents/.env (gitignored) for local overrides.
set -a; [ -f providers/agents/.env ] && . ./providers/agents/.env || true; set +a; \
PORT=$(AGENTS_PORT) \
KEDGE_HUB_URL=$(AGENTS_HUB_URL) \
KEDGE_HUB_TOKEN=$(AGENTS_TOKEN) \
KEDGE_HUB_INSECURE=true \
KEDGE_PROVIDER_NAME=agents \
KEDGE_PROVIDER_KUBECONFIG=$${KEDGE_PROVIDER_KUBECONFIG:-$$( for f in "$(AGENTS_PROVIDER_KUBECONFIG)" "$(AGENTS_KCP_KUBECONFIG)" "$(CURDIR)/tilt-frontproxy.kubeconfig"; do [ -f "$$f" ] && echo "$$f" && break; done )} \
AGENTS_IN_MEMORY_STORE=$(AGENTS_IN_MEMORY_STORE) \
$(BINDIR)/agents-provider

install-provider-agents: ## Apply agents Provider + CatalogEntry into root:kedge:providers
@test -f $(AGENTS_KCP_KUBECONFIG) || { \
echo "kubeconfig not found at $(AGENTS_KCP_KUBECONFIG)"; \
echo "start the hub first with: make run-hub-embedded-static"; \
exit 1; \
}
kubectl --kubeconfig=$(AGENTS_KCP_KUBECONFIG) \
--server=$(AGENTS_KCP_SERVER)/clusters/root:kedge:system:providers \
--insecure-skip-tls-verify \
apply -f $(AGENTS_PROVIDER_MANIFEST) -f $(AGENTS_MANIFEST)

init-provider-agents: build-agents-provider ## Bootstrap agents APIExport + write dev provider kubeconfig
@test -f $(AGENTS_KCP_KUBECONFIG) || { \
echo "kubeconfig not found at $(AGENTS_KCP_KUBECONFIG)"; \
echo "start the hub first with: make run-hub-embedded-static"; \
exit 1; \
}
@echo "Reading provider-token from $(AGENTS_WORKSPACE_PATH) and writing $(AGENTS_PROVIDER_KUBECONFIG)"
@TOKEN=$$(kubectl --kubeconfig=$(AGENTS_KCP_KUBECONFIG) \
--server=$(AGENTS_KCP_SERVER)/clusters/$(AGENTS_WORKSPACE_PATH) \
--insecure-skip-tls-verify \
get secret -n default provider-token -o jsonpath='{.data.token}' | base64 -d); \
test -n "$$TOKEN" || { echo "provider-token Secret empty — wait for the Provider controller to provision the workspace"; exit 1; }; \
mkdir -p $(KCP_DATA_DIR); \
printf 'apiVersion: v1\nkind: Config\nclusters:\n- name: kedge\n cluster:\n server: %s\n insecure-skip-tls-verify: true\ncontexts:\n- name: kedge\n context:\n cluster: kedge\n user: kedge\ncurrent-context: kedge\nusers:\n- name: kedge\n user:\n token: %s\n' \
"$(AGENTS_KCP_SERVER)/clusters/$(AGENTS_WORKSPACE_PATH)" "$$TOKEN" \
> $(AGENTS_PROVIDER_KUBECONFIG)
@echo "Running agents-provider init (creates APIExport + schemas + endpoint slice + bind grant)"
KEDGE_PROVIDER_KUBECONFIG=$(AGENTS_PROVIDER_KUBECONFIG) \
AGENTS_WORKSPACE_PATH=$(AGENTS_WORKSPACE_PATH) \
KEDGE_SCHEMAS_DIR=$(AGENTS_SCHEMAS_DIR) \
$(BINDIR)/agents-provider init

uninstall-provider-agents: ## Delete the agents CatalogEntry + Provider
@test -f $(AGENTS_KCP_KUBECONFIG) || { \
echo "kubeconfig not found at $(AGENTS_KCP_KUBECONFIG)"; \
echo "start the hub first with: make run-hub-embedded-static"; \
exit 1; \
}
-kubectl --kubeconfig=$(AGENTS_KCP_KUBECONFIG) \
--server=$(AGENTS_KCP_SERVER)/clusters/root:kedge:system:providers \
--insecure-skip-tls-verify \
delete -f $(AGENTS_MANIFEST) -f $(AGENTS_PROVIDER_MANIFEST)

# --- Dev agent image (template-native development mode) ---
# The static control binary an init container injects into any dev-mode
# component (docs/app-studio-template-sandboxes.md §2). Scratch image,
Expand Down
66 changes: 66 additions & 0 deletions Tiltfile
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@ go build -o bin/kedge-hub ./cmd/kedge-hub
# management kind cluster that kro runs in
# providers-code — git repository manager (port :8083)
# providers-kuery — fleet query engine (port :8084)
# providers-agents — long-running personal AI agents (port :8087)
#
# Each provider has three resources:
# <name> build + serve; auto-restarts on src change
Expand Down Expand Up @@ -376,6 +377,71 @@ local_resource(
labels=['providers-app-studio'],
)

# --- providers-agents ---
# Long-running personal AI agents (chat, scheduled runs, tools, durable memory).
# Standalone: only hard deps are the hub and a store (in-memory in dev until the
# Postgres backend is wired). No app-studio/infrastructure dependency.
local_resource(
'agents',
cmd='make build-agents-provider',
serve_cmd='make run-provider-agents',
deps=[
'providers/agents/main.go',
'providers/agents/heartbeat.go',
'providers/agents/assets.go',
'providers/agents/init_cmd.go',
'providers/agents/api',
'providers/agents/channels',
'providers/agents/apis',
'providers/agents/client',
'providers/agents/engine',
'providers/agents/llm',
'providers/agents/store',
'providers/agents/tenant',
'providers/agents/go.mod',
'providers/agents/go.sum',
'providers/agents/portal/src',
'providers/agents/portal/package.json',
'providers/agents/portal/vite.config.ts',
'providers/agents/.env',
],
resource_deps=['hub'],
readiness_probe=probe(
period_secs=5,
http_get=http_get_action(port=8087, path='/healthz'),
),
labels=['providers-agents'],
)

local_resource(
'agents-register',
cmd='make install-provider-agents',
trigger_mode=TRIGGER_MODE_MANUAL,
auto_init=False,
resource_deps=['hub'],
labels=['providers-agents'],
)

# Creates the agents APIExport (+ schemas + endpoint slice + bind grant) so
# tenants can Enable it. Run AFTER agents-register.
local_resource(
'agents-init',
cmd='make init-provider-agents',
trigger_mode=TRIGGER_MODE_MANUAL,
auto_init=False,
resource_deps=['hub', 'agents-register'],
labels=['providers-agents'],
)

local_resource(
'agents-unregister',
cmd='make uninstall-provider-agents',
trigger_mode=TRIGGER_MODE_MANUAL,
auto_init=False,
resource_deps=['hub'],
labels=['providers-agents'],
)

# --- Dev agent image (template-native development mode) ---
# The static control binary injected into dev-mode components; owned by the
# infrastructure provider (docs/app-studio-template-sandboxes.md §2).
Expand Down
73 changes: 73 additions & 0 deletions Tiltfile.cluster
Original file line number Diff line number Diff line change
Expand Up @@ -495,6 +495,7 @@ kubectl create secret generic kcp-static-tokens -n default \
# management kind cluster that kro runs in
# providers-code — git repository manager (port :8083)
# providers-kuery — fleet query engine (port :8084)
# providers-agents — long-running personal AI agents (port :8087)
#
# Each provider has three resources:
# <name> build + serve; auto-restarts on src change
Expand Down Expand Up @@ -541,6 +542,7 @@ APP_STUDIO_REWRITE_CMD, APP_STUDIO_MANIFEST_REWRITTEN = rewrite_manifest_cmd('pr
CODE_REWRITE_CMD, CODE_MANIFEST_REWRITTEN = rewrite_manifest_cmd('providers/code/manifest.yaml')
KUERY_REWRITE_CMD, KUERY_MANIFEST_REWRITTEN = rewrite_manifest_cmd('providers/kuery/manifest.yaml')
DATABRICKS_REWRITE_CMD, DATABRICKS_MANIFEST_REWRITTEN = rewrite_manifest_cmd('providers/databricks/manifest.yaml')
AGENTS_REWRITE_CMD, AGENTS_MANIFEST_REWRITTEN = rewrite_manifest_cmd('providers/agents/manifest.yaml')

# --- providers-quickstart ---
local_resource(
Expand Down Expand Up @@ -599,6 +601,77 @@ local_resource(
labels=['providers-quickstart'],
)

# --- providers-agents ---
# Long-running personal AI agents. Same host-binary shape as quickstart; the
# manifest host URL is rewritten to the in-cluster hub. Standalone — only hard
# dep is the hub (in-memory store in dev until the Postgres backend is wired).
local_resource(
'agents',
cmd='make build-agents-provider',
serve_cmd='make run-provider-agents',
deps=[
'providers/agents/main.go',
'providers/agents/heartbeat.go',
'providers/agents/assets.go',
'providers/agents/init_cmd.go',
'providers/agents/api',
'providers/agents/channels',
'providers/agents/apis',
'providers/agents/client',
'providers/agents/engine',
'providers/agents/llm',
'providers/agents/store',
'providers/agents/tenant',
'providers/agents/go.mod',
'providers/agents/portal/src',
'providers/agents/portal/package.json',
'providers/agents/portal/vite.config.ts',
],
resource_deps=['kedge-hub'],
readiness_probe=probe(
period_secs=5,
http_get=http_get_action(port=8087, path='/healthz'),
),
labels=['providers-agents'],
)

local_resource(
'agents-register',
cmd=('{rewrite} && AGENTS_KCP_KUBECONFIG={kc} ' +
'AGENTS_KCP_SERVER={sv} AGENTS_MANIFEST={mf} ' +
'make install-provider-agents').format(
rewrite=AGENTS_REWRITE_CMD, kc=KCP_ADMIN_KUBECONFIG,
sv=KCP_ADMIN_SERVER, mf=AGENTS_MANIFEST_REWRITTEN),
trigger_mode=TRIGGER_MODE_MANUAL,
auto_init=False,
resource_deps=['kedge-hub'],
labels=['providers-agents'],
)

local_resource(
'agents-init',
cmd=('AGENTS_KCP_KUBECONFIG={kc} AGENTS_KCP_SERVER={sv} ' +
'make init-provider-agents').format(
kc=KCP_ADMIN_KUBECONFIG, sv=KCP_ADMIN_SERVER),
trigger_mode=TRIGGER_MODE_MANUAL,
auto_init=False,
resource_deps=['kedge-hub', 'agents-register'],
labels=['providers-agents'],
)

local_resource(
'agents-unregister',
cmd=('{rewrite} && AGENTS_KCP_KUBECONFIG={kc} ' +
'AGENTS_KCP_SERVER={sv} AGENTS_MANIFEST={mf} ' +
'make uninstall-provider-agents').format(
rewrite=AGENTS_REWRITE_CMD, kc=KCP_ADMIN_KUBECONFIG,
sv=KCP_ADMIN_SERVER, mf=AGENTS_MANIFEST_REWRITTEN),
trigger_mode=TRIGGER_MODE_MANUAL,
auto_init=False,
resource_deps=['kedge-hub'],
labels=['providers-agents'],
)

# --- providers-app-studio ---
local_resource(
'app-studio-db',
Expand Down
Loading
Loading