qaas-python 0.2.2__py3-none-any.whl → 0.2.3__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.
- qaas/cli.py +16 -23
- qaas/conductor.py +12 -7
- qaas/config.py +4 -2
- qaas/defaults/config/agents/arbiter.yaml +0 -1
- qaas/defaults/config/agents/cartographer.yaml +0 -1
- qaas/defaults/config/agents/clerk.yaml +0 -1
- qaas/defaults/config/agents/conduit.yaml +0 -1
- qaas/defaults/config/agents/forge.yaml +0 -1
- qaas/defaults/config/agents/mender.yaml +0 -1
- qaas/defaults/config/agents/proof.yaml +0 -1
- qaas/defaults/config/agents/surface.yaml +0 -1
- qaas/defaults/config/agents/vault.yaml +0 -1
- qaas/defaults/config/agents/warden.yaml +0 -4
- qaas/defaults/config/system.yaml +5 -14
- {qaas_python-0.2.2.dist-info → qaas_python-0.2.3.dist-info}/METADATA +1 -1
- {qaas_python-0.2.2.dist-info → qaas_python-0.2.3.dist-info}/RECORD +19 -19
- {qaas_python-0.2.2.dist-info → qaas_python-0.2.3.dist-info}/WHEEL +0 -0
- {qaas_python-0.2.2.dist-info → qaas_python-0.2.3.dist-info}/entry_points.txt +0 -0
- {qaas_python-0.2.2.dist-info → qaas_python-0.2.3.dist-info}/licenses/LICENSE +0 -0
qaas/cli.py
CHANGED
|
@@ -500,14 +500,18 @@ def validate(config_dir: Path | None = ConfigDir) -> None:
|
|
|
500
500
|
# never dispatched. The mode meant for every pull request could not file a
|
|
501
501
|
# ticket. It took a live run to notice; this check makes it free.
|
|
502
502
|
for mode_name, mode in sorted(cfg.run_modes.items()):
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
503
|
+
# Only meaningful when both sides declare a cap. The shipped config
|
|
504
|
+
# declares none, so this check simply does not fire there.
|
|
505
|
+
agent_caps = [
|
|
506
|
+
cfg.agents[a].max_budget_usd for a in mode.agents
|
|
507
|
+
if a in cfg.agents and cfg.agents[a].max_budget_usd is not None
|
|
508
|
+
]
|
|
509
|
+
needed = sum(agent_caps)
|
|
510
|
+
if mode.max_budget_usd is not None and agent_caps and needed > mode.max_budget_usd:
|
|
507
511
|
missing = [a for a in mode.agents if a in cfg.agents][-1]
|
|
508
512
|
problems.append(
|
|
509
|
-
f"mode '{mode_name}': agents
|
|
510
|
-
f"
|
|
513
|
+
f"mode '{mode_name}': the agents' caps exceed the mode's cap, so "
|
|
514
|
+
f"its cap, so the run stops before it reaches "
|
|
511
515
|
f"{missing} and files nothing. Raise max_budget_usd or drop an agent"
|
|
512
516
|
)
|
|
513
517
|
|
|
@@ -567,7 +571,7 @@ def validate(config_dir: Path | None = ConfigDir) -> None:
|
|
|
567
571
|
filing = "" if rm.files_tickets else " [dim](no filing)[/dim]"
|
|
568
572
|
console.print(
|
|
569
573
|
f"[bold]{mode}[/bold]: {', '.join(rm.agents)} "
|
|
570
|
-
f"[dim]
|
|
574
|
+
f"[dim]{rm.max_wall_clock_s}s[/dim]{filing}"
|
|
571
575
|
)
|
|
572
576
|
|
|
573
577
|
if notes:
|
|
@@ -834,7 +838,7 @@ def runs(root: Path = Root, limit: int = 10) -> None:
|
|
|
834
838
|
console.print("[dim]no runs yet[/dim]")
|
|
835
839
|
return
|
|
836
840
|
table = Table(header_style="bold")
|
|
837
|
-
for col in ("run", "envelopes", "agents"
|
|
841
|
+
for col in ("run", "envelopes", "agents"):
|
|
838
842
|
table.add_column(col)
|
|
839
843
|
for run_id in ids:
|
|
840
844
|
store = RunStore(run_id, root)
|
|
@@ -843,7 +847,6 @@ def runs(root: Path = Root, limit: int = 10) -> None:
|
|
|
843
847
|
run_id,
|
|
844
848
|
str(len(store.envelopes())),
|
|
845
849
|
str(len(results)),
|
|
846
|
-
f"${store.total_cost_usd():.2f}",
|
|
847
850
|
)
|
|
848
851
|
console.print(table)
|
|
849
852
|
|
|
@@ -872,9 +875,6 @@ def show(run_id: str, root: Path = Root) -> None:
|
|
|
872
875
|
header.append(f"started {summary.started:%Y-%m-%d %H:%M:%S}Z")
|
|
873
876
|
if summary.duration_s is not None:
|
|
874
877
|
header.append(f"duration {summary.duration_s:.0f}s")
|
|
875
|
-
header.append(f"cost ${summary.cost_usd:.2f}")
|
|
876
|
-
if summary.budget_usd:
|
|
877
|
-
header.append(f"of ${summary.budget_usd:.2f} budget")
|
|
878
878
|
console.print(" " + " ".join(header))
|
|
879
879
|
if summary.target_sha:
|
|
880
880
|
dirty = " [yellow](dirty tree)[/yellow]" if summary.target_dirty else ""
|
|
@@ -960,7 +960,6 @@ def trace(
|
|
|
960
960
|
table.add_column("agent", style="cyan")
|
|
961
961
|
table.add_column("kind")
|
|
962
962
|
table.add_column("detail", overflow="fold")
|
|
963
|
-
table.add_column("cost", justify="right", style="dim")
|
|
964
963
|
for row in trace_mod.timeline(entries):
|
|
965
964
|
label = f"{row.kind} ×{row.count}" if row.count > 1 else row.kind
|
|
966
965
|
table.add_row(
|
|
@@ -968,7 +967,6 @@ def trace(
|
|
|
968
967
|
row.agent,
|
|
969
968
|
f"[{KIND_STYLE.get(row.kind, 'white')}]{label}[/]",
|
|
970
969
|
row.detail,
|
|
971
|
-
f"${row.cost_usd:.2f}" if row.cost_usd is not None else "",
|
|
972
970
|
)
|
|
973
971
|
console.print(table)
|
|
974
972
|
console.print(f"\n[dim]{len(entries)} entries[/dim]")
|
|
@@ -1082,7 +1080,7 @@ def run(
|
|
|
1082
1080
|
rm = cfg.run_modes[mode]
|
|
1083
1081
|
console.print(
|
|
1084
1082
|
f"[bold]{mode}[/bold] — {len(specs)} agents, "
|
|
1085
|
-
f"
|
|
1083
|
+
f"concurrency {rm.max_concurrency}"
|
|
1086
1084
|
)
|
|
1087
1085
|
|
|
1088
1086
|
if dry_run:
|
|
@@ -1093,7 +1091,7 @@ def run(
|
|
|
1093
1091
|
d = describe(spec, prompt_dirs)
|
|
1094
1092
|
console.print(
|
|
1095
1093
|
f" [bold]{spec.name:14s}[/bold] {spec.model:18s} effort={spec.effort:7s} "
|
|
1096
|
-
f"turns<={spec.max_turns
|
|
1094
|
+
f"turns<={spec.max_turns}"
|
|
1097
1095
|
)
|
|
1098
1096
|
console.print(f" tools: {', '.join(d['allowed_tools'])}")
|
|
1099
1097
|
console.print(f" prompt: {d['prompt_chars']} chars")
|
|
@@ -1101,11 +1099,11 @@ def run(
|
|
|
1101
1099
|
|
|
1102
1100
|
def on_event(kind: str, detail: dict) -> None:
|
|
1103
1101
|
if kind == "agent_started":
|
|
1104
|
-
console.print(f"[dim]->[/dim] {detail.get('agent')}
|
|
1102
|
+
console.print(f"[dim]->[/dim] {detail.get('agent')}")
|
|
1105
1103
|
elif kind == "finished":
|
|
1106
1104
|
console.print(
|
|
1107
1105
|
f"[dim]<-[/dim] {detail.get('agent')} "
|
|
1108
|
-
f"[dim]
|
|
1106
|
+
f"[dim]{detail.get('envelopes', 0)} findings[/dim]"
|
|
1109
1107
|
)
|
|
1110
1108
|
elif kind == "stopped":
|
|
1111
1109
|
console.print(f"[yellow]stopped: {detail.get('reason')}[/yellow]")
|
|
@@ -1172,11 +1170,6 @@ def score(
|
|
|
1172
1170
|
table.add_row("false positives", f"{s['false_positives']} ({s['false_positive_rate']:.0%})")
|
|
1173
1171
|
table.add_row("duplicates", f"{s['duplicates']} ({s['duplicate_rate']:.0%})")
|
|
1174
1172
|
table.add_row("severity agreement", f"{s['severity_agreement']:.0%}")
|
|
1175
|
-
table.add_row("cost", f"${s['cost_usd']:.2f}")
|
|
1176
|
-
table.add_row(
|
|
1177
|
-
"cost per accepted",
|
|
1178
|
-
f"${s['cost_per_accepted']:.2f}" if s["cost_per_accepted"] is not None else "-",
|
|
1179
|
-
)
|
|
1180
1173
|
console.print(table)
|
|
1181
1174
|
|
|
1182
1175
|
if card.matches:
|
qaas/conductor.py
CHANGED
|
@@ -110,7 +110,7 @@ class RunReport:
|
|
|
110
110
|
class Budget:
|
|
111
111
|
"""The spend and wall-clock governor. Checked before every dispatch."""
|
|
112
112
|
|
|
113
|
-
def __init__(self, max_usd: float, max_seconds: int, *, already_spent: float = 0.0):
|
|
113
|
+
def __init__(self, max_usd: float | None, max_seconds: int, *, already_spent: float = 0.0):
|
|
114
114
|
self.max_usd = max_usd
|
|
115
115
|
self.max_seconds = max_seconds
|
|
116
116
|
#: What this run has already cost, including earlier invocations.
|
|
@@ -130,23 +130,28 @@ class Budget:
|
|
|
130
130
|
return time.monotonic() - self.started
|
|
131
131
|
|
|
132
132
|
@property
|
|
133
|
-
def remaining_usd(self) -> float:
|
|
134
|
-
return max(0.0, self.max_usd - self.spent)
|
|
133
|
+
def remaining_usd(self) -> float | None:
|
|
134
|
+
return None if self.max_usd is None else max(0.0, self.max_usd - self.spent)
|
|
135
135
|
|
|
136
136
|
def spend(self, amount: float) -> None:
|
|
137
137
|
self.spent += amount
|
|
138
138
|
|
|
139
139
|
def check(self) -> None:
|
|
140
|
-
|
|
140
|
+
# `max_usd is None` means no spend ceiling -- the shipped config sets
|
|
141
|
+
# none, because a dollar figure bakes one vendor's pricing into a tool
|
|
142
|
+
# meant to run against local models too. The wall-clock cap and each
|
|
143
|
+
# agent's `max_turns` still bound a run; those are model-agnostic.
|
|
144
|
+
if self.max_usd is not None and self.spent >= self.max_usd:
|
|
141
145
|
raise BudgetExceeded(f"spend cap reached: ${self.spent:.2f} of ${self.max_usd:.2f}")
|
|
142
146
|
if self.elapsed >= self.max_seconds:
|
|
143
147
|
raise BudgetExceeded(
|
|
144
148
|
f"wall-clock cap reached: {self.elapsed:.0f}s of {self.max_seconds}s"
|
|
145
149
|
)
|
|
146
150
|
|
|
147
|
-
def allowance(self, spec: AgentSpec) -> float:
|
|
148
|
-
"""What this agent may spend
|
|
149
|
-
|
|
151
|
+
def allowance(self, spec: AgentSpec) -> float | None:
|
|
152
|
+
"""What this agent may spend, or None when neither it nor the run caps it."""
|
|
153
|
+
caps = [c for c in (spec.max_budget_usd, self.remaining_usd) if c is not None]
|
|
154
|
+
return max(0.01, min(caps)) if caps else None
|
|
150
155
|
|
|
151
156
|
|
|
152
157
|
class Conductor:
|
qaas/config.py
CHANGED
|
@@ -74,7 +74,8 @@ class AgentSpec(BaseModel):
|
|
|
74
74
|
model: str = "claude-opus-5"
|
|
75
75
|
effort: Literal["low", "medium", "high", "xhigh", "max"] = "high"
|
|
76
76
|
max_turns: int = 40
|
|
77
|
-
max_budget_usd: float =
|
|
77
|
+
max_budget_usd: float | None = None
|
|
78
|
+
|
|
78
79
|
|
|
79
80
|
mcp_servers: list[str] = Field(default_factory=list)
|
|
80
81
|
builtin_tools: list[str] = Field(default_factory=list)
|
|
@@ -165,7 +166,8 @@ class RunMode(BaseModel):
|
|
|
165
166
|
|
|
166
167
|
trigger: str
|
|
167
168
|
agents: list[str]
|
|
168
|
-
max_budget_usd: float =
|
|
169
|
+
max_budget_usd: float | None = None
|
|
170
|
+
|
|
169
171
|
max_wall_clock_s: int = 3600
|
|
170
172
|
max_concurrency: int = 3
|
|
171
173
|
files_tickets: bool = True
|
|
@@ -9,7 +9,6 @@ prompt: ARBITER.md
|
|
|
9
9
|
model: claude-opus-5
|
|
10
10
|
effort: high
|
|
11
11
|
max_turns: 50
|
|
12
|
-
max_budget_usd: 3.0
|
|
13
12
|
mcp_servers: [envelope, vcs, contract_diff, test_runner]
|
|
14
13
|
builtin_tools: [Read, Grep, Glob]
|
|
15
14
|
skills: [adversarial-review, root-cause-vs-symptom, regression-risk-scoring, test-quality-audit]
|
|
@@ -10,7 +10,6 @@ prompt: MENDER.md
|
|
|
10
10
|
model: claude-opus-5
|
|
11
11
|
effort: high
|
|
12
12
|
max_turns: 80
|
|
13
|
-
max_budget_usd: 5.0
|
|
14
13
|
mcp_servers: [envelope, test_runner, env_control, vcs, tracker, contract_diff]
|
|
15
14
|
builtin_tools: [Read, Grep, Glob, Write, Edit, Bash]
|
|
16
15
|
skills: [test-first-fix, minimal-diff-discipline, root-cause-vs-symptom, rollback-plan-authoring]
|
|
@@ -9,10 +9,6 @@ prompt: WARDEN.md
|
|
|
9
9
|
model: claude-opus-5
|
|
10
10
|
effort: high
|
|
11
11
|
max_turns: 60
|
|
12
|
-
# Measured: WARDEN exhausted $3.00 on its first real run against the demo app
|
|
13
|
-
# and was killed mid-audit. Building the endpoint-by-role matrix and actually
|
|
14
|
-
# impersonating each role costs more than reading a spec does.
|
|
15
|
-
max_budget_usd: 5.0
|
|
16
12
|
mcp_servers: [envelope, env_control, defect_memory]
|
|
17
13
|
builtin_tools: [Read, Grep, Glob]
|
|
18
14
|
policy: {}
|
qaas/defaults/config/system.yaml
CHANGED
|
@@ -9,6 +9,11 @@ target:
|
|
|
9
9
|
tracker: local # local | jira -- swap to file against real Jira
|
|
10
10
|
vcs: local # local | github
|
|
11
11
|
|
|
12
|
+
# No spend cap by default. A dollar figure bakes one vendor's pricing into
|
|
13
|
+
# the config, and this is meant to run against local models too. `max_turns`
|
|
14
|
+
# is the model-agnostic bound. Set `max_budget_usd` here if you want a
|
|
15
|
+
# ceiling; the governor enforces one whenever it is present.
|
|
16
|
+
|
|
12
17
|
thresholds:
|
|
13
18
|
min_confidence_to_file: 0.6 # §7 confidence gate
|
|
14
19
|
max_findings_per_agent_run: 25 # §8.3 loop breaker: pause and escalate, don't file
|
|
@@ -21,30 +26,18 @@ run_modes:
|
|
|
21
26
|
pr-check:
|
|
22
27
|
trigger: pull_request
|
|
23
28
|
agents: [CARTOGRAPHER, CONDUIT, SURFACE, FORGE, CLERK]
|
|
24
|
-
# Was 6.0, which this roster could not complete. Measured on a real run:
|
|
25
|
-
# CARTOGRAPHER $0.69 + CONDUIT $2.25 + SURFACE $3.16 = $6.09, so the governor
|
|
26
|
-
# stopped the run before FORGE or CLERK ever dispatched. The mode meant to
|
|
27
|
-
# run on every pull request could not file a ticket, and it failed silently:
|
|
28
|
-
# agents ran, findings landed in the ledger, nothing errored. `qaas validate`
|
|
29
|
-
# now refuses a mode whose agents cannot fit inside its cap.
|
|
30
|
-
max_budget_usd: 16.0
|
|
31
29
|
max_wall_clock_s: 900
|
|
32
30
|
max_concurrency: 2
|
|
33
31
|
|
|
34
32
|
nightly:
|
|
35
33
|
trigger: cron
|
|
36
34
|
agents: [CARTOGRAPHER, CONDUIT, SURFACE, VAULT, WARDEN, FORGE, CLERK]
|
|
37
|
-
# FORGE runs once per finding, so the deep sweep's budget scales with how
|
|
38
|
-
# much discovery found, not with the number of agents. Measured: discovery
|
|
39
|
-
# ~$6, then roughly $1-2 per finding reproduced.
|
|
40
|
-
max_budget_usd: 50.0
|
|
41
35
|
max_wall_clock_s: 7200
|
|
42
36
|
max_concurrency: 3
|
|
43
37
|
|
|
44
38
|
incident:
|
|
45
39
|
trigger: alert
|
|
46
40
|
agents: [CONDUIT]
|
|
47
|
-
max_budget_usd: 4.0
|
|
48
41
|
max_wall_clock_s: 600
|
|
49
42
|
max_concurrency: 2
|
|
50
43
|
files_tickets: false # §9: diagnostic only, read-only, no filing
|
|
@@ -55,7 +48,6 @@ run_modes:
|
|
|
55
48
|
fix-cycle:
|
|
56
49
|
trigger: agent_ready_ticket
|
|
57
50
|
agents: [PROOF, MENDER, ARBITER]
|
|
58
|
-
max_budget_usd: 20.0
|
|
59
51
|
max_wall_clock_s: 3600
|
|
60
52
|
max_concurrency: 1
|
|
61
53
|
|
|
@@ -64,6 +56,5 @@ run_modes:
|
|
|
64
56
|
full-loop:
|
|
65
57
|
trigger: on_demand
|
|
66
58
|
agents: [CARTOGRAPHER, CONDUIT, SURFACE, VAULT, WARDEN, FORGE, CLERK, MENDER, ARBITER, PROOF]
|
|
67
|
-
max_budget_usd: 70.0
|
|
68
59
|
max_wall_clock_s: 10800
|
|
69
60
|
max_concurrency: 3
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: qaas-python
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.3
|
|
4
4
|
Summary: A multi-agent QA system: finds real defects, reproduces them, files tickets, fixes them, and proves the fix
|
|
5
5
|
Project-URL: Homepage, https://github.com/allaabdella2-us/qa-multi-agent-system
|
|
6
6
|
Project-URL: Repository, https://github.com/allaabdella2-us/qa-multi-agent-system
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
qaas/cli.py,sha256=
|
|
2
|
-
qaas/conductor.py,sha256=
|
|
3
|
-
qaas/config.py,sha256=
|
|
1
|
+
qaas/cli.py,sha256=JFCTa5rRK9i6rIyiBhofT4Jr31FdrDDOEFnbnTRCCUo,64939
|
|
2
|
+
qaas/conductor.py,sha256=Ft6QVkUCSiIzHEsrsOghkQhZrSyfcfmEEUY4np6bqYw,24650
|
|
3
|
+
qaas/config.py,sha256=bYJuErdUutD6oFAMIFPtskShQtwol5hLKkqYA2Q8Gmo,17545
|
|
4
4
|
qaas/discover.py,sha256=L5ejBsYs_s41OWAL-Dhc8VlQ5EWw2hGayWTDzfj05R8,8524
|
|
5
5
|
qaas/envelope.py,sha256=IiqyOy96CHZw2A0pSDWBNIg6yQ2MzfcwkpQWmgMNvzY,9095
|
|
6
6
|
qaas/guardrails.py,sha256=4JIQGFnQpQeIU92c2_E7PQFwXBnQnzolurwp6Zf-Cnk,18797
|
|
@@ -16,17 +16,17 @@ qaas/trace.py,sha256=V-uFqh1iCYRqgWL3VzDbRdHgAkwLsr1uRFfwwycWZ94,11461
|
|
|
16
16
|
qaas/adapters/__init__.py,sha256=bw2pqtDqhZGP730gwV28BJ-8TF-rhanwCEjdIizjP6A,882
|
|
17
17
|
qaas/adapters/tracker.py,sha256=K1U7weiA_K2MM58yji3WQn3PEATVqDD9_qcRbrcZwik,54348
|
|
18
18
|
qaas/adapters/vcs.py,sha256=9su-4QLLxR6yTyLZWCJAky9BROJci80M5jV6nGo6pjg,19430
|
|
19
|
-
qaas/defaults/config/system.yaml,sha256=
|
|
20
|
-
qaas/defaults/config/agents/arbiter.yaml,sha256=
|
|
21
|
-
qaas/defaults/config/agents/cartographer.yaml,sha256=
|
|
22
|
-
qaas/defaults/config/agents/clerk.yaml,sha256=
|
|
23
|
-
qaas/defaults/config/agents/conduit.yaml,sha256=
|
|
24
|
-
qaas/defaults/config/agents/forge.yaml,sha256
|
|
25
|
-
qaas/defaults/config/agents/mender.yaml,sha256
|
|
26
|
-
qaas/defaults/config/agents/proof.yaml,sha256=
|
|
27
|
-
qaas/defaults/config/agents/surface.yaml,sha256=
|
|
28
|
-
qaas/defaults/config/agents/vault.yaml,sha256=
|
|
29
|
-
qaas/defaults/config/agents/warden.yaml,sha256=
|
|
19
|
+
qaas/defaults/config/system.yaml,sha256=iMOdpuA0ds3VQTFvCAzjDpXgH0ZZ0F45oVluJxNSSsM,2322
|
|
20
|
+
qaas/defaults/config/agents/arbiter.yaml,sha256=nRajKdxgis7YnJq6SOJ6t6Ics2SdF67D5rHfWjQjAUo,719
|
|
21
|
+
qaas/defaults/config/agents/cartographer.yaml,sha256=3X7Y3_xGOxLzvoV1LHupdLLLkZo_sEcVh_hBDjcSO6o,752
|
|
22
|
+
qaas/defaults/config/agents/clerk.yaml,sha256=PHS20Ge7BVnSiia5OTEY1WXasbXgMNaqN7iJvAwStU0,748
|
|
23
|
+
qaas/defaults/config/agents/conduit.yaml,sha256=haYnhoN_4nC2QVwolimY8LjVoQ67uMaJiWINgj2QbwE,708
|
|
24
|
+
qaas/defaults/config/agents/forge.yaml,sha256=-qk_fu0muJQdJb7coxjC780ySQ0Vscx6px_ARRGYFgU,859
|
|
25
|
+
qaas/defaults/config/agents/mender.yaml,sha256=Koryb7a3m9lJexxutTs0ORN3KVWKWGthqW_6nTWBgbo,2162
|
|
26
|
+
qaas/defaults/config/agents/proof.yaml,sha256=J_kvh851zcvT-4JBj8WwpHmwvdswG5fUe7veBGkQuFU,833
|
|
27
|
+
qaas/defaults/config/agents/surface.yaml,sha256=_HLA5Orb3m2Hj2tNAY5PtYciQzKimtm6B_H4LxA2noA,512
|
|
28
|
+
qaas/defaults/config/agents/vault.yaml,sha256=9xtggyEnP1D3Cn5HUQ5ZtbvwuQ97jAeWR56scrPxbvw,775
|
|
29
|
+
qaas/defaults/config/agents/warden.yaml,sha256=GGO90G71JGtkHkkoevxemjTj_-HPzj4eGcrrdKFbFsQ,763
|
|
30
30
|
qaas/mcp/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
31
31
|
qaas/mcp/context.py,sha256=Z45wQuP0nIZOmM5GTfxs6KHxFckLQ61H4zbsVqiVqr8,2551
|
|
32
32
|
qaas/mcp/contract_diff.py,sha256=efuma0WQSnxHC0NE7adF_8ctCZoovdB4k080QdiEJK8,43942
|
|
@@ -78,8 +78,8 @@ qaas/prompts/SURFACE.md,sha256=cZ9df27bXXRh39yEkwByyxvHskpcNmh6HvC9C3Jt83Y,2220
|
|
|
78
78
|
qaas/prompts/VAULT.md,sha256=Ansowimx-wMbinQkn9_gGgZFmvmMFMc9v_N8s2Ahws4,2915
|
|
79
79
|
qaas/prompts/WARDEN.md,sha256=39KsbwWRwe7mtjYEik1owBIDgu4qyD52UHG_T_7gTMw,2950
|
|
80
80
|
qaas/prompts/_shared.md,sha256=lN_s_rAmakhGuyRuWItC--iyy-Er6ohT_dzGeE_g-fo,2620
|
|
81
|
-
qaas_python-0.2.
|
|
82
|
-
qaas_python-0.2.
|
|
83
|
-
qaas_python-0.2.
|
|
84
|
-
qaas_python-0.2.
|
|
85
|
-
qaas_python-0.2.
|
|
81
|
+
qaas_python-0.2.3.dist-info/METADATA,sha256=xrDJZ-XXq8PELDmzdINfRrsI2JiGStY57LzeOA9F9X0,15528
|
|
82
|
+
qaas_python-0.2.3.dist-info/WHEEL,sha256=zOwg4jB6zX2kU910N-cMawjivD6tO8NEWvE12je1bVk,87
|
|
83
|
+
qaas_python-0.2.3.dist-info/entry_points.txt,sha256=6UScfruyhP9N_xGx3tXJGkaoAiB36dkINuKyOH6OkK4,38
|
|
84
|
+
qaas_python-0.2.3.dist-info/licenses/LICENSE,sha256=pHWke5oMtv7PLjIQbN6hRa31J0AKj51VCd5TCTUbbX0,1069
|
|
85
|
+
qaas_python-0.2.3.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|