keystone-cli 0.1.0__py3-none-any.whl
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.
- keystone_cli/__init__.py +4 -0
- keystone_cli/__main__.py +24 -0
- keystone_cli/auth/__init__.py +5 -0
- keystone_cli/auth/device_flow.py +197 -0
- keystone_cli/auth/token_store.py +71 -0
- keystone_cli/commands/__init__.py +1 -0
- keystone_cli/commands/agent.py +1017 -0
- keystone_cli/commands/dev.py +57 -0
- keystone_cli/commands/login.py +207 -0
- keystone_cli/commands/workspace.py +87 -0
- keystone_cli/devloop.py +183 -0
- keystone_cli/platform_client.py +75 -0
- keystone_cli/runner.py +87 -0
- keystone_cli/scaffold.py +81 -0
- keystone_cli/templates/blank/README.md.tmpl +25 -0
- keystone_cli/templates/blank/agent.yaml.tmpl +20 -0
- keystone_cli/templates/blank/env.tmpl +10 -0
- keystone_cli/templates/blank/gitignore.tmpl +7 -0
- keystone_cli/templates/blank/pkg/__init__.py.tmpl +0 -0
- keystone_cli/templates/blank/pkg/graph.py.tmpl +33 -0
- keystone_cli/templates/blank/pyproject.toml.tmpl +12 -0
- keystone_cli/templates/hitl/README.md.tmpl +33 -0
- keystone_cli/templates/hitl/agent.yaml.tmpl +33 -0
- keystone_cli/templates/hitl/env.tmpl +10 -0
- keystone_cli/templates/hitl/gitignore.tmpl +7 -0
- keystone_cli/templates/hitl/pkg/__init__.py.tmpl +0 -0
- keystone_cli/templates/hitl/pkg/graph.py.tmpl +115 -0
- keystone_cli/templates/hitl/pyproject.toml.tmpl +12 -0
- keystone_cli/templates/llm/README.md.tmpl +29 -0
- keystone_cli/templates/llm/agent.yaml.tmpl +29 -0
- keystone_cli/templates/llm/env.tmpl +10 -0
- keystone_cli/templates/llm/gitignore.tmpl +7 -0
- keystone_cli/templates/llm/pkg/__init__.py.tmpl +0 -0
- keystone_cli/templates/llm/pkg/graph.py.tmpl +53 -0
- keystone_cli/templates/llm/pyproject.toml.tmpl +12 -0
- keystone_cli/templates/rag-qa/README.md.tmpl +23 -0
- keystone_cli/templates/rag-qa/agent.yaml.tmpl +34 -0
- keystone_cli/templates/rag-qa/env.tmpl +10 -0
- keystone_cli/templates/rag-qa/gitignore.tmpl +7 -0
- keystone_cli/templates/rag-qa/pkg/__init__.py.tmpl +0 -0
- keystone_cli/templates/rag-qa/pkg/graph.py.tmpl +69 -0
- keystone_cli/templates/rag-qa/pyproject.toml.tmpl +12 -0
- keystone_cli/templates/tool-agent/README.md.tmpl +30 -0
- keystone_cli/templates/tool-agent/agent.yaml.tmpl +25 -0
- keystone_cli/templates/tool-agent/env.tmpl +10 -0
- keystone_cli/templates/tool-agent/gitignore.tmpl +7 -0
- keystone_cli/templates/tool-agent/pkg/__init__.py.tmpl +0 -0
- keystone_cli/templates/tool-agent/pkg/graph.py.tmpl +89 -0
- keystone_cli/templates/tool-agent/pyproject.toml.tmpl +15 -0
- keystone_cli-0.1.0.dist-info/METADATA +13 -0
- keystone_cli-0.1.0.dist-info/RECORD +54 -0
- keystone_cli-0.1.0.dist-info/WHEEL +5 -0
- keystone_cli-0.1.0.dist-info/entry_points.txt +2 -0
- keystone_cli-0.1.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# __AGENT_NAME__
|
|
2
|
+
|
|
3
|
+
RAG Q&A agent (scaffolded from the **rag-qa** template): `retrieve` (rag search over a
|
|
4
|
+
knowledge base) → `answer` (LLM grounded in the retrieved chunks).
|
|
5
|
+
|
|
6
|
+
## Before deploying
|
|
7
|
+
Fill `config.RT_AGENT_KB_ID` in `agent.yaml` with a knowledge-base id from your workspace.
|
|
8
|
+
|
|
9
|
+
## Local loop
|
|
10
|
+
```bash
|
|
11
|
+
keystone agent validate .
|
|
12
|
+
keystone dev . --input '{"q": "what is keystone?"}' --offline # iterate: edit → Enter → new behaviour
|
|
13
|
+
keystone agent run . --input '{"q": "what is keystone?"}' --offline # mocked rag + llm
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## Deploy (dev)
|
|
17
|
+
```bash
|
|
18
|
+
keystone login
|
|
19
|
+
keystone agent deploy . --publish
|
|
20
|
+
keystone agent invoke __AGENT_NAME__ --input '{"q": "what is keystone?"}'
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Rebuilds: bump the `# bundle-rev:` line in `agent.yaml` (identical bundles are dedup'd).
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# bundle-rev: 0001 — bump this string to force a rebuild (agent-hub dedups identical bundles by SHA-256)
|
|
2
|
+
# __AGENT_NAME__ — scaffolded by `keystone agent init` (template: rag-qa).
|
|
3
|
+
# Local loop:
|
|
4
|
+
# keystone agent validate .
|
|
5
|
+
# keystone agent run . --input '{"q": "what is keystone?"}' --offline
|
|
6
|
+
name: __AGENT_NAME__
|
|
7
|
+
workspace: __WORKSPACE__
|
|
8
|
+
framework: langgraph@1
|
|
9
|
+
entrypoint: __PKG__.graph:make_graph
|
|
10
|
+
runtime: python3.12
|
|
11
|
+
resources:
|
|
12
|
+
timeout_seconds: 60
|
|
13
|
+
io_schema:
|
|
14
|
+
type: object
|
|
15
|
+
properties:
|
|
16
|
+
q:
|
|
17
|
+
type: string
|
|
18
|
+
required: [q]
|
|
19
|
+
dependencies:
|
|
20
|
+
services: [rag, llm-gateway]
|
|
21
|
+
models: [bedrock/anthropic.claude-sonnet-4-6]
|
|
22
|
+
# The KB(s) this agent queries. Declaring it here is what makes agent-hub AUTO-GRANT the
|
|
23
|
+
# agent `knowledge-base:query` on that KB when you publish — leave it empty and a deployed
|
|
24
|
+
# agent 403s on its first retrieval. Put the SAME id you set in RT_AGENT_KB_ID below.
|
|
25
|
+
# (The grant is on-behalf-of-you, so you must also have access to that KB — own it, or be
|
|
26
|
+
# granted knowledge-base:query.)
|
|
27
|
+
knowledge_bases: [] # e.g. [c2a6346e-432c-4044-a283-1728d828ffb8]
|
|
28
|
+
identity:
|
|
29
|
+
scopes: [rag:search, gateway:chat]
|
|
30
|
+
# Per-agent config — injected into the pod as env by the operator. Fill the KB id in
|
|
31
|
+
# before deploying (find yours: portal → Knowledge Bases, or ask your workspace admin).
|
|
32
|
+
config:
|
|
33
|
+
RT_AGENT_KB_ID: "" # ← same id as knowledge_bases above
|
|
34
|
+
RT_AGENT_MODEL: "bedrock/anthropic.claude-sonnet-4-6"
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# Local-only environment for `__AGENT_NAME__`. NEVER committed (.gitignore) and NEVER packaged —
|
|
2
|
+
# `keystone agent deploy` drops .env* unconditionally, because a bundle goes to S3 and into the
|
|
3
|
+
# agent's image in ECR, where a copy would outlive a revoked key.
|
|
4
|
+
#
|
|
5
|
+
# On the cluster the operator injects these, so leave them empty here unless you run locally.
|
|
6
|
+
|
|
7
|
+
# The agent's platform API key. Create it on the portal (Access policy → API keys) and paste the
|
|
8
|
+
# value shown ONCE. Read automatically: agent-runtime settings use env_prefix="RT_" + env_file=".env",
|
|
9
|
+
# so the RT_ prefix is required — a differently-named variable is IGNORED SILENTLY.
|
|
10
|
+
RT_AGENT_API_KEY=
|
|
File without changes
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"""__AGENT_NAME__ — RAG Q&A agent: ``retrieve`` (rag search) → ``answer`` (grounded chat).
|
|
2
|
+
|
|
3
|
+
Caller identity is forwarded automatically by the runtime (ContextVar) — the agent never
|
|
4
|
+
sets headers. Building-block URLs + the KB id come from ENV (`config:` in agent.yaml is
|
|
5
|
+
injected per-agent; RT_RAG_URL / RT_GATEWAY_URL come from the shared runtime baseline).
|
|
6
|
+
|
|
7
|
+
Local loop:
|
|
8
|
+
keystone agent run . --input '{"q": "what is keystone?"}' --offline
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
import os
|
|
14
|
+
from typing import Any, TypedDict
|
|
15
|
+
|
|
16
|
+
from keystone.agent_sdk.clients import GatewayClient, RAGClient
|
|
17
|
+
from langgraph.graph import StateGraph
|
|
18
|
+
|
|
19
|
+
_SYSTEM = (
|
|
20
|
+
"You are a helpful assistant. Answer the question using ONLY the provided context. "
|
|
21
|
+
"If the context does not contain the answer, say you don't know."
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class State(TypedDict, total=False):
|
|
26
|
+
q: str
|
|
27
|
+
chunks: list[dict[str, Any]]
|
|
28
|
+
answer: str
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def _rag() -> RAGClient:
|
|
32
|
+
# rag terminates auth at Kong and trusts forwarded identity headers — no bearer here.
|
|
33
|
+
return RAGClient(base_url=os.environ.get("RT_RAG_URL", ""))
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def _gateway() -> GatewayClient:
|
|
37
|
+
return GatewayClient(
|
|
38
|
+
base_url=os.environ.get("RT_GATEWAY_URL", ""),
|
|
39
|
+
auth_token=os.environ.get("RT_GATEWAY_TOKEN", ""),
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
async def retrieve(state: State) -> dict[str, Any]:
|
|
44
|
+
kb_id = os.environ.get("RT_AGENT_KB_ID", "")
|
|
45
|
+
result = await _rag().search(query=state["q"], kb_ids=[kb_id] if kb_id else [], top_k=5)
|
|
46
|
+
# rag returns {"results": [{content, chunk_id, score, ...}]} — no envelope.
|
|
47
|
+
return {"chunks": result.get("results", []) if isinstance(result, dict) else []}
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
async def answer(state: State) -> dict[str, str]:
|
|
51
|
+
context = "\n\n".join(c.get("content", "") for c in state.get("chunks", []))
|
|
52
|
+
out = await _gateway().chat(
|
|
53
|
+
messages=[
|
|
54
|
+
{"role": "system", "content": _SYSTEM},
|
|
55
|
+
{"role": "user", "content": f"Context:\n{context}\n\nQuestion: {state['q']}"},
|
|
56
|
+
],
|
|
57
|
+
model=os.environ.get("RT_AGENT_MODEL", "bedrock/anthropic.claude-sonnet-4-6"),
|
|
58
|
+
)
|
|
59
|
+
return {"answer": out["choices"][0]["message"]["content"]}
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def make_graph():
|
|
63
|
+
g = StateGraph(State)
|
|
64
|
+
g.add_node("retrieve", retrieve)
|
|
65
|
+
g.add_node("answer", answer)
|
|
66
|
+
g.set_entry_point("retrieve")
|
|
67
|
+
g.add_edge("retrieve", "answer")
|
|
68
|
+
g.set_finish_point("answer")
|
|
69
|
+
return g
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "__AGENT_NAME__"
|
|
3
|
+
version = "0.1.0"
|
|
4
|
+
requires-python = ">=3.12"
|
|
5
|
+
# Declared for humans/IDEs: the DEPLOYED image is built FROM the platform base image,
|
|
6
|
+
# which already bakes keystone-agent-sdk + langgraph — the server-side (Kaniko) build
|
|
7
|
+
# copies your code only, it does NOT pip-install. Locally, `keystone agent validate/run`
|
|
8
|
+
# execute in the CLI's own environment.
|
|
9
|
+
dependencies = [
|
|
10
|
+
"keystone-agent-sdk>=0.3",
|
|
11
|
+
"langgraph>=1,<2",
|
|
12
|
+
]
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# __AGENT_NAME__
|
|
2
|
+
|
|
3
|
+
Scaffolded from the **tool-agent** template. Three nodes, shaped to show the difference
|
|
4
|
+
between a deterministic step and a real tool:
|
|
5
|
+
|
|
6
|
+
`normalize` (plain function — no tool span) → `analyze` (invokes a `langchain_core`
|
|
7
|
+
`@tool`, which gets its own `execute_tool` span) → `summarize` (LLM over the tool output).
|
|
8
|
+
|
|
9
|
+
Use a plain function for deterministic work the graph controls; use `@tool` when the step
|
|
10
|
+
should appear in traces on its own, or when the model should eventually choose it.
|
|
11
|
+
|
|
12
|
+
## Local loop
|
|
13
|
+
```bash
|
|
14
|
+
keystone agent validate .
|
|
15
|
+
keystone dev . --input '{"text": "keystone agents ship fast"}' --offline # iterate: edit → Enter → new behaviour
|
|
16
|
+
keystone agent run . --input '{"text": "keystone agents ship fast"}' --offline
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Deploy (dev)
|
|
20
|
+
```bash
|
|
21
|
+
keystone login
|
|
22
|
+
keystone agent deploy . --publish
|
|
23
|
+
keystone agent invoke __AGENT_NAME__ --input '{"text": "keystone agents ship fast"}'
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Tips: wrap paid/side-effecting tools in `keystone.agent_sdk.durable_task`; pause for a
|
|
27
|
+
human with `keystone.agent_sdk.request_approval`. Rebuilds: bump `# bundle-rev:`.
|
|
28
|
+
|
|
29
|
+
Note: invoke a tool with `.invoke({...})`. Calling `word_stats.func(...)` bypasses
|
|
30
|
+
LangChain's callback manager, and the tool span disappears.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# bundle-rev: 0001 — bump this string to force a rebuild (agent-hub dedups identical bundles by SHA-256)
|
|
2
|
+
# __AGENT_NAME__ — scaffolded by `keystone agent init` (template: tool-agent).
|
|
3
|
+
# Local loop:
|
|
4
|
+
# keystone agent validate .
|
|
5
|
+
# keystone agent run . --input '{"text": "keystone agents ship fast"}' --offline
|
|
6
|
+
name: __AGENT_NAME__
|
|
7
|
+
workspace: __WORKSPACE__
|
|
8
|
+
framework: langgraph@1
|
|
9
|
+
entrypoint: __PKG__.graph:make_graph
|
|
10
|
+
runtime: python3.12
|
|
11
|
+
resources:
|
|
12
|
+
timeout_seconds: 60
|
|
13
|
+
io_schema:
|
|
14
|
+
type: object
|
|
15
|
+
properties:
|
|
16
|
+
text:
|
|
17
|
+
type: string
|
|
18
|
+
required: [text]
|
|
19
|
+
dependencies:
|
|
20
|
+
services: [llm-gateway]
|
|
21
|
+
models: [bedrock/anthropic.claude-sonnet-4-6]
|
|
22
|
+
identity:
|
|
23
|
+
scopes: [gateway:chat]
|
|
24
|
+
config:
|
|
25
|
+
RT_AGENT_MODEL: "bedrock/anthropic.claude-sonnet-4-6"
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# Local-only environment for `__AGENT_NAME__`. NEVER committed (.gitignore) and NEVER packaged —
|
|
2
|
+
# `keystone agent deploy` drops .env* unconditionally, because a bundle goes to S3 and into the
|
|
3
|
+
# agent's image in ECR, where a copy would outlive a revoked key.
|
|
4
|
+
#
|
|
5
|
+
# On the cluster the operator injects these, so leave them empty here unless you run locally.
|
|
6
|
+
|
|
7
|
+
# The agent's platform API key. Create it on the portal (Access policy → API keys) and paste the
|
|
8
|
+
# value shown ONCE. Read automatically: agent-runtime settings use env_prefix="RT_" + env_file=".env",
|
|
9
|
+
# so the RT_ prefix is required — a differently-named variable is IGNORED SILENTLY.
|
|
10
|
+
RT_AGENT_API_KEY=
|
|
File without changes
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"""__AGENT_NAME__ — a deterministic step, a real tool, then an LLM summary.
|
|
2
|
+
|
|
3
|
+
Two things are easy to confuse, so this scaffold shows both side by side:
|
|
4
|
+
|
|
5
|
+
``normalize`` a DETERMINISTIC STEP — an ordinary Python function in a node. The graph
|
|
6
|
+
decides when it runs. Right for parsers, formatters, calculators.
|
|
7
|
+
``word_stats`` a TOOL — ``langchain_core.tools.tool``. Invoking it goes through
|
|
8
|
+
LangChain's callback manager, which is what makes the platform emit a
|
|
9
|
+
separate ``execute_tool`` span for it.
|
|
10
|
+
|
|
11
|
+
An ordinary function is invisible to tracing. That is not a bug — it is what "ordinary
|
|
12
|
+
function" means. Reach for ``@tool`` when you want the step to show up in a trace on its
|
|
13
|
+
own, or when you later want the model itself to decide when to call it.
|
|
14
|
+
|
|
15
|
+
Wrap paid or side-effecting work in ``keystone.agent_sdk.durable_task`` so a crash-resume
|
|
16
|
+
replays it instead of re-billing it.
|
|
17
|
+
|
|
18
|
+
Local loop:
|
|
19
|
+
keystone agent run . --input '{"text": "keystone agents ship fast"}' --offline
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
from __future__ import annotations
|
|
23
|
+
|
|
24
|
+
import os
|
|
25
|
+
from typing import Any, TypedDict
|
|
26
|
+
|
|
27
|
+
from keystone.agent_sdk.clients import GatewayClient
|
|
28
|
+
from langchain_core.tools import tool
|
|
29
|
+
from langgraph.graph import StateGraph
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class State(TypedDict, total=False):
|
|
33
|
+
text: str
|
|
34
|
+
stats: dict[str, Any]
|
|
35
|
+
summary: str
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
@tool
|
|
39
|
+
def word_stats(text: str) -> dict[str, Any]:
|
|
40
|
+
"""Count the words and characters in the text and find its longest word."""
|
|
41
|
+
words = text.split()
|
|
42
|
+
return {
|
|
43
|
+
"words": len(words),
|
|
44
|
+
"chars": len(text),
|
|
45
|
+
"longest": max(words, key=len) if words else "",
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def normalize(state: State) -> dict[str, str]:
|
|
50
|
+
"""Deterministic step: collapse whitespace. Plain function — no tool span, by design."""
|
|
51
|
+
return {"text": " ".join(state.get("text", "").split())}
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def analyze(state: State) -> dict[str, Any]:
|
|
55
|
+
# `.invoke(...)` is what routes through the callback manager. Calling `word_stats.func(...)`
|
|
56
|
+
# — or an undecorated copy of the function — would skip tracing entirely.
|
|
57
|
+
return {"stats": word_stats.invoke({"text": state.get("text", "")})}
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
async def summarize(state: State) -> dict[str, str]:
|
|
61
|
+
out = await GatewayClient(
|
|
62
|
+
base_url=os.environ.get("RT_GATEWAY_URL", ""),
|
|
63
|
+
auth_token=os.environ.get("RT_GATEWAY_TOKEN", ""),
|
|
64
|
+
).chat(
|
|
65
|
+
messages=[
|
|
66
|
+
{
|
|
67
|
+
"role": "system",
|
|
68
|
+
"content": "Summarize the text analysis in one friendly sentence.",
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"role": "user",
|
|
72
|
+
"content": f"Text: {state.get('text', '')}\nStats: {state.get('stats', {})}",
|
|
73
|
+
},
|
|
74
|
+
],
|
|
75
|
+
model=os.environ.get("RT_AGENT_MODEL", "bedrock/anthropic.claude-sonnet-4-6"),
|
|
76
|
+
)
|
|
77
|
+
return {"summary": out["choices"][0]["message"]["content"]}
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def make_graph():
|
|
81
|
+
g = StateGraph(State)
|
|
82
|
+
g.add_node("normalize", normalize)
|
|
83
|
+
g.add_node("analyze", analyze)
|
|
84
|
+
g.add_node("summarize", summarize)
|
|
85
|
+
g.set_entry_point("normalize")
|
|
86
|
+
g.add_edge("normalize", "analyze")
|
|
87
|
+
g.add_edge("analyze", "summarize")
|
|
88
|
+
g.set_finish_point("summarize")
|
|
89
|
+
return g
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "__AGENT_NAME__"
|
|
3
|
+
version = "0.1.0"
|
|
4
|
+
requires-python = ">=3.12"
|
|
5
|
+
# Declared for humans/IDEs: the DEPLOYED image is built FROM the platform base image,
|
|
6
|
+
# which already bakes keystone-agent-sdk + langgraph — the server-side (Kaniko) build
|
|
7
|
+
# copies your code only, it does NOT pip-install. Locally, `keystone agent validate/run`
|
|
8
|
+
# execute in the CLI's own environment.
|
|
9
|
+
dependencies = [
|
|
10
|
+
"keystone-agent-sdk>=0.3",
|
|
11
|
+
"langgraph>=1,<2",
|
|
12
|
+
# `@tool` lives here. It arrives transitively with langgraph anyway; declared because
|
|
13
|
+
# this agent imports it directly.
|
|
14
|
+
"langchain-core>=1,<2",
|
|
15
|
+
]
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: keystone-cli
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Keystone pro-code agent CLI — validate + run agents locally (FR-06 / FDP-3072, M1). login/deploy = M2.
|
|
5
|
+
Requires-Python: >=3.12
|
|
6
|
+
Requires-Dist: keystone-agent-sdk<0.4,>=0.3
|
|
7
|
+
Requires-Dist: keystone-request-context<0.4,>=0.3
|
|
8
|
+
Requires-Dist: typer<1,>=0.12
|
|
9
|
+
Requires-Dist: httpx<1,>=0.27
|
|
10
|
+
Provides-Extra: dev
|
|
11
|
+
Requires-Dist: pytest<9,>=8; extra == "dev"
|
|
12
|
+
Requires-Dist: pytest-cov<7,>=6; extra == "dev"
|
|
13
|
+
Requires-Dist: ruff==0.15.15; extra == "dev"
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
keystone_cli/__init__.py,sha256=-aiKKu19-axzXgLzrn9Kcu3L1LwrJA1YJVrSUQ5gl2k,257
|
|
2
|
+
keystone_cli/__main__.py,sha256=HkZ5axvf39JZCwMFEsmoOwdx5PklW7TJHBztG9TO3S0,683
|
|
3
|
+
keystone_cli/devloop.py,sha256=mmh0w1UQ6r6o_73osSZ9lPzGI7N-zhBmWPBAzDDUToI,8090
|
|
4
|
+
keystone_cli/platform_client.py,sha256=cIdOm9X9HYzOY5_I-kJj-b9Mbcy75t614gfliVqQLeY,3345
|
|
5
|
+
keystone_cli/runner.py,sha256=5Ku7xlPPz2-bDHUw_TU74g5uHj0ydTVr36LvWcHp5AU,3559
|
|
6
|
+
keystone_cli/scaffold.py,sha256=WYqbZjEEqVdoKUx-M2HUN-jmJBjn0cQlEqL_ZjCXloc,3852
|
|
7
|
+
keystone_cli/auth/__init__.py,sha256=I1Mz7isGsjGB_OEfB-K8cMFr8D_FlUyVcAtM7fHu96A,302
|
|
8
|
+
keystone_cli/auth/device_flow.py,sha256=NJesDn1jz8F_QlMS_l88TAju6MCgNaLuScNpCj8iAuI,8397
|
|
9
|
+
keystone_cli/auth/token_store.py,sha256=_o28-xSx89sHbp0kc2giI4E-K5E1RGitW48CJ0whA9Q,3599
|
|
10
|
+
keystone_cli/commands/__init__.py,sha256=oFTNkqo6ozKI9Bc1PYj9eY3UV2QwhmcqGVfp14RGfLQ,35
|
|
11
|
+
keystone_cli/commands/agent.py,sha256=D4jkyvKOgKyAiI0jak4pxGKLBTehUtuiJ3n2MdaKKWM,50464
|
|
12
|
+
keystone_cli/commands/dev.py,sha256=KguZcl8OKvG4j0vReGMsDcpJv8cJxGFOmpBlluMLN1U,2148
|
|
13
|
+
keystone_cli/commands/login.py,sha256=-T58PIJH6fDxZxFJQvS4s3t45EfFBlOtpOA7eUYm4XU,9037
|
|
14
|
+
keystone_cli/commands/workspace.py,sha256=oxKUU86_jC4ShtDdAAe6JdZCYeyOZa1dZUHv-cFi04k,3417
|
|
15
|
+
keystone_cli/templates/blank/README.md.tmpl,sha256=2iGKv-NAg4Cac_vXy_nSuN23gLY6eF5eRlBR0qfIwDQ,1047
|
|
16
|
+
keystone_cli/templates/blank/agent.yaml.tmpl,sha256=yWABX_689kmaH2oniOp3xewp2S-tfJzFPj4_9WrdJjY,636
|
|
17
|
+
keystone_cli/templates/blank/env.tmpl,sha256=je4pybAr2EOpvP3J37jm1AcvDIbCyDoR3u4IW0cHLhQ,664
|
|
18
|
+
keystone_cli/templates/blank/gitignore.tmpl,sha256=eB2IFyVuVnBvSoZwRyQjmIojEqSKMW6TF3yMIGyPuLM,133
|
|
19
|
+
keystone_cli/templates/blank/pyproject.toml.tmpl,sha256=S6RTmw2IKi_MBM-M9yyPJF8FqiY3cXO7gdmyLTlPf2s,455
|
|
20
|
+
keystone_cli/templates/blank/pkg/__init__.py.tmpl,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
21
|
+
keystone_cli/templates/blank/pkg/graph.py.tmpl,sha256=QgkeiAM4zA7neo8lgEWl7w-y5j7zuFoEBl_-LnVkVpE,871
|
|
22
|
+
keystone_cli/templates/hitl/README.md.tmpl,sha256=ysGEQkc2aR093xyoNjDcxw7-LryLaLh39vWOPz-F42I,1239
|
|
23
|
+
keystone_cli/templates/hitl/agent.yaml.tmpl,sha256=UjYIemHEHzSgNwCsRLzPwdYb5_dUkwvoM4JhSy2KZRE,1252
|
|
24
|
+
keystone_cli/templates/hitl/env.tmpl,sha256=je4pybAr2EOpvP3J37jm1AcvDIbCyDoR3u4IW0cHLhQ,664
|
|
25
|
+
keystone_cli/templates/hitl/gitignore.tmpl,sha256=eB2IFyVuVnBvSoZwRyQjmIojEqSKMW6TF3yMIGyPuLM,133
|
|
26
|
+
keystone_cli/templates/hitl/pyproject.toml.tmpl,sha256=S6RTmw2IKi_MBM-M9yyPJF8FqiY3cXO7gdmyLTlPf2s,455
|
|
27
|
+
keystone_cli/templates/hitl/pkg/__init__.py.tmpl,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
28
|
+
keystone_cli/templates/hitl/pkg/graph.py.tmpl,sha256=rIA-Hal96vsc02mdYDdP4Znxs2t0a-ZvMq3C2r_wTJk,4802
|
|
29
|
+
keystone_cli/templates/llm/README.md.tmpl,sha256=v2tXqDYk9icvXrSMGQlg45Bjh9cDjPj9C9-WVGv35u0,965
|
|
30
|
+
keystone_cli/templates/llm/agent.yaml.tmpl,sha256=uKX6nbwAi8n1tkv4NtfYKbMe2qqWEY7mKFp6C4DBuIU,1016
|
|
31
|
+
keystone_cli/templates/llm/env.tmpl,sha256=je4pybAr2EOpvP3J37jm1AcvDIbCyDoR3u4IW0cHLhQ,664
|
|
32
|
+
keystone_cli/templates/llm/gitignore.tmpl,sha256=eB2IFyVuVnBvSoZwRyQjmIojEqSKMW6TF3yMIGyPuLM,133
|
|
33
|
+
keystone_cli/templates/llm/pyproject.toml.tmpl,sha256=S6RTmw2IKi_MBM-M9yyPJF8FqiY3cXO7gdmyLTlPf2s,455
|
|
34
|
+
keystone_cli/templates/llm/pkg/__init__.py.tmpl,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
35
|
+
keystone_cli/templates/llm/pkg/graph.py.tmpl,sha256=0OWCqXDcApIeWW_6mcDAzpZTG1wB_WCpd4azDZxxqOY,1756
|
|
36
|
+
keystone_cli/templates/rag-qa/README.md.tmpl,sha256=ON6l64BtVSJ5_NhLtVPqrjgIDtsOigp4DtC4ZENGeMw,783
|
|
37
|
+
keystone_cli/templates/rag-qa/agent.yaml.tmpl,sha256=VHdwo06DiFYI3rnnQXZh2QUXEq-06LBYtwE2Wze5tk8,1472
|
|
38
|
+
keystone_cli/templates/rag-qa/env.tmpl,sha256=je4pybAr2EOpvP3J37jm1AcvDIbCyDoR3u4IW0cHLhQ,664
|
|
39
|
+
keystone_cli/templates/rag-qa/gitignore.tmpl,sha256=eB2IFyVuVnBvSoZwRyQjmIojEqSKMW6TF3yMIGyPuLM,133
|
|
40
|
+
keystone_cli/templates/rag-qa/pyproject.toml.tmpl,sha256=S6RTmw2IKi_MBM-M9yyPJF8FqiY3cXO7gdmyLTlPf2s,455
|
|
41
|
+
keystone_cli/templates/rag-qa/pkg/__init__.py.tmpl,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
42
|
+
keystone_cli/templates/rag-qa/pkg/graph.py.tmpl,sha256=t4Y4qfFWTk4JHOC4JJaFIaXWfZGGIOeBJF1SgaJz6f4,2365
|
|
43
|
+
keystone_cli/templates/tool-agent/README.md.tmpl,sha256=UomaxpVFXi9tc4WTmZTzWdRirrZpsBom-to-DZ0ngeY,1241
|
|
44
|
+
keystone_cli/templates/tool-agent/agent.yaml.tmpl,sha256=rNceN7I4lS_DbrCq773yo1qEtjhDa6FB4IAKZl9wg4c,749
|
|
45
|
+
keystone_cli/templates/tool-agent/env.tmpl,sha256=je4pybAr2EOpvP3J37jm1AcvDIbCyDoR3u4IW0cHLhQ,664
|
|
46
|
+
keystone_cli/templates/tool-agent/gitignore.tmpl,sha256=eB2IFyVuVnBvSoZwRyQjmIojEqSKMW6TF3yMIGyPuLM,133
|
|
47
|
+
keystone_cli/templates/tool-agent/pyproject.toml.tmpl,sha256=BvDojT7UOQRVtCYUMGpA_b08P5xKBo5l6fkz80XIOYw,611
|
|
48
|
+
keystone_cli/templates/tool-agent/pkg/__init__.py.tmpl,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
49
|
+
keystone_cli/templates/tool-agent/pkg/graph.py.tmpl,sha256=HeToF39VCw-Rm9yfh0oIAB487qDLxn6GoX2698m7mxQ,3159
|
|
50
|
+
keystone_cli-0.1.0.dist-info/METADATA,sha256=nnRNsNAwrDgHIbE86onWDqkt-ys6GhFG34YsnKZTByA,505
|
|
51
|
+
keystone_cli-0.1.0.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
|
|
52
|
+
keystone_cli-0.1.0.dist-info/entry_points.txt,sha256=HvGzgggOltPLyQwPH28xYWUFX3dAHXolqyYSfGRoANE,55
|
|
53
|
+
keystone_cli-0.1.0.dist-info/top_level.txt,sha256=P5S_uzRQL2KlRkStMrOoBKxi_YkjhXgpvpFa7zPUi34,13
|
|
54
|
+
keystone_cli-0.1.0.dist-info/RECORD,,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
keystone_cli
|