@harnessforce/semconv 0.0.0-bootstrap.0 → 0.1.0
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/LICENSE +201 -0
- package/README.md +106 -0
- package/dist/attributes.d.ts +23 -0
- package/dist/attributes.js +28 -0
- package/dist/attributes.js.map +1 -0
- package/dist/index.d.ts +182 -0
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -0
- package/dist/redaction.d.ts +25 -0
- package/dist/redaction.js +70 -0
- package/dist/redaction.js.map +1 -0
- package/dist/repository.d.ts +1 -0
- package/dist/repository.js +46 -0
- package/dist/repository.js.map +1 -0
- package/dist/schemas/analysis-report.d.ts +47 -0
- package/dist/schemas/analysis-report.js +87 -0
- package/dist/schemas/analysis-report.js.map +1 -0
- package/dist/schemas/common.d.ts +14 -0
- package/dist/schemas/common.js +33 -0
- package/dist/schemas/common.js.map +1 -0
- package/dist/schemas/config-snapshot.d.ts +15 -0
- package/dist/schemas/config-snapshot.js +36 -0
- package/dist/schemas/config-snapshot.js.map +1 -0
- package/dist/schemas/ingest-items.d.ts +36 -0
- package/dist/schemas/ingest-items.js +73 -0
- package/dist/schemas/ingest-items.js.map +1 -0
- package/dist/schemas/session-import.d.ts +23 -0
- package/dist/schemas/session-import.js +15 -0
- package/dist/schemas/session-import.js.map +1 -0
- package/dist/schemas/session-registration.d.ts +25 -0
- package/dist/schemas/session-registration.js +19 -0
- package/dist/schemas/session-registration.js.map +1 -0
- package/dist/schemas/session-usage-summary.d.ts +57 -0
- package/dist/schemas/session-usage-summary.js +32 -0
- package/dist/schemas/session-usage-summary.js.map +1 -0
- package/dist/values.d.ts +4 -0
- package/dist/values.js +52 -0
- package/dist/values.js.map +1 -0
- package/package.json +48 -3
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
// privacy-and-retention.md「Redaction」のパターンの種類。並びは当てる順序である。
|
|
2
|
+
export const REDACTION_KINDS = [
|
|
3
|
+
"private_key",
|
|
4
|
+
"connection_string",
|
|
5
|
+
"jwt",
|
|
6
|
+
"api_key",
|
|
7
|
+
"bearer_token",
|
|
8
|
+
"email",
|
|
9
|
+
"phone",
|
|
10
|
+
];
|
|
11
|
+
const API_KEY_PATTERNS = [
|
|
12
|
+
// Anthropic(sk-ant-)とOpenAI(sk-、sk-proj-)
|
|
13
|
+
"sk-[A-Za-z0-9_-]{20,}",
|
|
14
|
+
"AIza[0-9A-Za-z_-]{35}",
|
|
15
|
+
"gh[pousr]_[A-Za-z0-9]{36,}",
|
|
16
|
+
"github_pat_[A-Za-z0-9_]{22,}",
|
|
17
|
+
"(?:AKIA|ASIA)[0-9A-Z]{16}",
|
|
18
|
+
// HarnessforceのIngestKey(hf_ik_)と、ApiTokenのaccess token(hf_at_)とrefresh token(hf_rt_)
|
|
19
|
+
"hf_(?:ik|at|rt)_[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}_[A-Za-z0-9_-]{43}",
|
|
20
|
+
];
|
|
21
|
+
/**
|
|
22
|
+
* 正規表現の正本(privacy-and-retention.md「Redaction」)。上から順に当て、先に伏せた箇所を後の規則で
|
|
23
|
+
* 二重に数えない。接続文字列はemailより先、API keyはBearerより先に当てる。
|
|
24
|
+
* 電話番号は、UUIDと日付の区切りに一致しないよう、前後に`-`と英数字を許さない。
|
|
25
|
+
* 可変長の先頭を持つ規則は、直前が同じ文字種でない位置からだけ始める。途中の位置から何度も走査し直すと、
|
|
26
|
+
* 処理時間が長さの2乗になるためである。
|
|
27
|
+
* patternはglobalであり、`lastIndex`を持つ。`replace`以外(`test`、`exec`)で使う場合は写しを作る。
|
|
28
|
+
*/
|
|
29
|
+
export const REDACTION_RULES = [
|
|
30
|
+
{
|
|
31
|
+
kind: "private_key",
|
|
32
|
+
pattern: /-----BEGIN [A-Z ]*PRIVATE KEY-----(?:(?!-----BEGIN )[\s\S])*?-----END [A-Z ]*PRIVATE KEY-----/g,
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
kind: "connection_string",
|
|
36
|
+
pattern: /(?<![a-z0-9+.-])[a-z][a-z0-9+.-]*:\/\/[^\s:/@]+:[^\s/@]+@[^\s"'<>]+/gi,
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
kind: "jwt",
|
|
40
|
+
pattern: /(?<![A-Za-z0-9_-])eyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}/g,
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
kind: "api_key",
|
|
44
|
+
pattern: new RegExp(`(?<![A-Za-z0-9])(?:${API_KEY_PATTERNS.join("|")})`, "g"),
|
|
45
|
+
},
|
|
46
|
+
{ kind: "bearer_token", pattern: /\bBearer\s+[A-Za-z0-9._~+/-]{16,}=*/g },
|
|
47
|
+
{
|
|
48
|
+
kind: "email",
|
|
49
|
+
pattern: /(?<![A-Za-z0-9._%+-])[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}/g,
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
kind: "phone",
|
|
53
|
+
pattern: /(?<![\w+])\+[1-9]\d{7,14}(?!\d)|(?<![\w-])0\d{1,4}-\d{1,4}-\d{4}(?![\w-])/g,
|
|
54
|
+
},
|
|
55
|
+
];
|
|
56
|
+
/** 一致した箇所を`[REDACTED:<種類>]`に置き換える。countは置き換えた箇所の数。 */
|
|
57
|
+
export function redactText(text, options = {}) {
|
|
58
|
+
const rules = options.skipPhone
|
|
59
|
+
? REDACTION_RULES.filter(({ kind }) => kind !== "phone")
|
|
60
|
+
: REDACTION_RULES;
|
|
61
|
+
return rules.reduce((current, { kind, pattern }) => {
|
|
62
|
+
let replaced = 0;
|
|
63
|
+
const next = current.text.replace(pattern, () => {
|
|
64
|
+
replaced += 1;
|
|
65
|
+
return `[REDACTED:${kind}]`;
|
|
66
|
+
});
|
|
67
|
+
return { text: next, count: current.count + replaced };
|
|
68
|
+
}, { text, count: 0 });
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=redaction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redaction.js","sourceRoot":"","sources":["../src/redaction.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,MAAM,CAAC,MAAM,eAAe,GAAG;IAC9B,aAAa;IACb,mBAAmB;IACnB,KAAK;IACL,SAAS;IACT,cAAc;IACd,OAAO;IACP,OAAO;CACE,CAAC;AAKX,MAAM,gBAAgB,GAAG;IACxB,0CAA0C;IAC1C,uBAAuB;IACvB,uBAAuB;IACvB,4BAA4B;IAC5B,8BAA8B;IAC9B,2BAA2B;IAC3B,sFAAsF;IACtF,gGAAgG;CAChG,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,eAAe,GAA6B;IACxD;QACC,IAAI,EAAE,aAAa;QACnB,OAAO,EACN,gGAAgG;KACjG;IACD;QACC,IAAI,EAAE,mBAAmB;QACzB,OAAO,EACN,uEAAuE;KACxE;IACD;QACC,IAAI,EAAE,KAAK;QACX,OAAO,EACN,+EAA+E;KAChF;IACD;QACC,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,IAAI,MAAM,CAClB,sBAAsB,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EACnD,GAAG,CACH;KACD;IACD,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,sCAAsC,EAAE;IACzE;QACC,IAAI,EAAE,OAAO;QACb,OAAO,EACN,sEAAsE;KACvE;IACD;QACC,IAAI,EAAE,OAAO;QACb,OAAO,EACN,4EAA4E;KAC7E;CACD,CAAC;AASF,sDAAsD;AACtD,MAAM,UAAU,UAAU,CACzB,IAAY,EACZ,OAAO,GAAkB,EAAE;IAE3B,MAAM,KAAK,GAAG,OAAO,CAAC,SAAS;QAC9B,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,KAAK,OAAO,CAAC;QACxD,CAAC,CAAC,eAAe,CAAC;IACnB,OAAO,KAAK,CAAC,MAAM,CAClB,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE;QAC9B,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE;YAC/C,QAAQ,IAAI,CAAC,CAAC;YACd,OAAO,aAAa,IAAI,GAAG,CAAC;QAC7B,CAAC,CAAC,CAAC;QACH,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,GAAG,QAAQ,EAAE,CAAC;IACxD,CAAC,EACD,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function normalizeRepository(remoteUrl: string): string | undefined;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
// semantic-conventions.md「repositoryの正規化」。<host>/<owner>/<name>の3 segmentにならないremote
|
|
2
|
+
// (local path、`file://`、GitLabのsubgroupなど)はundefinedを返す。
|
|
3
|
+
const SCHEME_URL = /^[a-z][a-z0-9+.-]*:\/\//i;
|
|
4
|
+
// scp形式([user@]host:path)。"host://"は上のURLとして扱う。
|
|
5
|
+
const SCP_LIKE = /^(?:[^@/\s]+@)?([^:/\s]+):(?!\/)(.+)$/;
|
|
6
|
+
const HOST = /^[a-z0-9.-]+$/;
|
|
7
|
+
const SEGMENT = /^[A-Za-z0-9_.-]+$/;
|
|
8
|
+
function splitRemote(remote) {
|
|
9
|
+
if (SCHEME_URL.test(remote)) {
|
|
10
|
+
// URL.canParseはNode.js 18.17以降にしか無く、Node.js 18のhookからも使うためtry/catchで判定する。
|
|
11
|
+
let url;
|
|
12
|
+
try {
|
|
13
|
+
url = new URL(remote);
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
return undefined;
|
|
17
|
+
}
|
|
18
|
+
return url.protocol === "file:"
|
|
19
|
+
? undefined
|
|
20
|
+
: { host: url.hostname, path: url.pathname };
|
|
21
|
+
}
|
|
22
|
+
const scp = SCP_LIKE.exec(remote);
|
|
23
|
+
return scp?.[1] && scp[2] ? { host: scp[1], path: scp[2] } : undefined;
|
|
24
|
+
}
|
|
25
|
+
export function normalizeRepository(remoteUrl) {
|
|
26
|
+
const location = splitRemote(remoteUrl.trim());
|
|
27
|
+
if (!location)
|
|
28
|
+
return undefined;
|
|
29
|
+
const lowerHost = location.host.toLowerCase();
|
|
30
|
+
const host = lowerHost === "ssh.github.com" ? "github.com" : lowerHost;
|
|
31
|
+
const segments = location.path
|
|
32
|
+
.replace(/\/+$/, "")
|
|
33
|
+
.replace(/\.git$/, "")
|
|
34
|
+
.replace(/^\/+/, "")
|
|
35
|
+
.split("/");
|
|
36
|
+
if (segments.length !== 2 ||
|
|
37
|
+
!HOST.test(host) ||
|
|
38
|
+
!segments.every((segment) => SEGMENT.test(segment)))
|
|
39
|
+
return undefined;
|
|
40
|
+
// GitHubはownerとnameの大文字と小文字を区別しない。
|
|
41
|
+
const [owner, name] = host === "github.com"
|
|
42
|
+
? segments.map((segment) => segment.toLowerCase())
|
|
43
|
+
: segments;
|
|
44
|
+
return `${host}/${owner}/${name}`;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repository.js","sourceRoot":"","sources":["../src/repository.ts"],"names":[],"mappings":"AAAA,qFAAqF;AACrF,yDAAyD;AACzD,MAAM,UAAU,GAAG,0BAA0B,CAAC;AAC9C,gDAAgD;AAChD,MAAM,QAAQ,GAAG,uCAAuC,CAAC;AACzD,MAAM,IAAI,GAAG,eAAe,CAAC;AAC7B,MAAM,OAAO,GAAG,mBAAmB,CAAC;AAEpC,SAAS,WAAW,CACnB,MAAc;IAEd,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7B,0EAA0E;QAC1E,IAAI,GAAQ,CAAC;QACb,IAAI,CAAC;YACJ,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;QACvB,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,SAAS,CAAC;QAClB,CAAC;QACD,OAAO,GAAG,CAAC,QAAQ,KAAK,OAAO;YAC9B,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC;IAC/C,CAAC;IACD,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAClC,OAAO,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,SAAiB;IACpD,MAAM,QAAQ,GAAG,WAAW,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;IAC/C,IAAI,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAC;IAChC,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;IAC9C,MAAM,IAAI,GAAG,SAAS,KAAK,gBAAgB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC;IACvE,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI;SAC5B,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;SACnB,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;SACrB,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;SACnB,KAAK,CAAC,GAAG,CAAC,CAAC;IACb,IACC,QAAQ,CAAC,MAAM,KAAK,CAAC;QACrB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;QAChB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAEnD,OAAO,SAAS,CAAC;IAClB,mCAAmC;IACnC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,GAClB,IAAI,KAAK,YAAY;QACpB,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QAClD,CAAC,CAAC,QAAQ,CAAC;IACb,OAAO,GAAG,IAAI,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { type Static, type TSchema } from "@sinclair/typebox";
|
|
2
|
+
export declare const INTERVENTION_KINDS: readonly ["approval", "continue", "ci_relay", "review_relay", "answer", "other"];
|
|
3
|
+
export declare const LOOP_KINDS: readonly ["issue_to_pr", "ci_fix", "review_response", "test_fix", "lint_fix", "dependency_update"];
|
|
4
|
+
export declare const PROPOSAL_KINDS: readonly ["permissions", "hook", "skill", "rule", "agent", "command", "loop_prompt", "mcp_config", "claude_md"];
|
|
5
|
+
export declare const MEASUREMENTS: readonly ["measured", "not_measured"];
|
|
6
|
+
export declare const AnalysisReportSchema: import("@sinclair/typebox").TObject<{
|
|
7
|
+
agent: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"claude_code">, import("@sinclair/typebox").TLiteral<"codex">]>;
|
|
8
|
+
session_id: import("@sinclair/typebox").TString;
|
|
9
|
+
first_prompt_id: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
10
|
+
started_at: import("@sinclair/typebox").TString;
|
|
11
|
+
analyzer_version: import("@sinclair/typebox").TString;
|
|
12
|
+
parser_version: import("@sinclair/typebox").TString;
|
|
13
|
+
interventions: import("@sinclair/typebox").TObject<Record<"answer" | "approval" | "ci_relay" | "continue" | "other" | "review_relay", TSchema>>;
|
|
14
|
+
loops: import("@sinclair/typebox").TObject<Record<"ci_fix" | "dependency_update" | "issue_to_pr" | "lint_fix" | "review_response" | "test_fix", TSchema>>;
|
|
15
|
+
mcp_servers: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TObject<{
|
|
16
|
+
server: import("@sinclair/typebox").TString;
|
|
17
|
+
configured: import("@sinclair/typebox").TBoolean;
|
|
18
|
+
measurement: import("@sinclair/typebox").TLiteral<"measured" | "not_measured">;
|
|
19
|
+
calls: import("@sinclair/typebox").TInteger | import("@sinclair/typebox").TNull;
|
|
20
|
+
failures_measurement: import("@sinclair/typebox").TLiteral<"measured" | "not_measured">;
|
|
21
|
+
failures: import("@sinclair/typebox").TInteger | import("@sinclair/typebox").TNull;
|
|
22
|
+
}>, import("@sinclair/typebox").TObject<{
|
|
23
|
+
server: import("@sinclair/typebox").TString;
|
|
24
|
+
configured: import("@sinclair/typebox").TBoolean;
|
|
25
|
+
measurement: import("@sinclair/typebox").TLiteral<"measured" | "not_measured">;
|
|
26
|
+
calls: import("@sinclair/typebox").TInteger | import("@sinclair/typebox").TNull;
|
|
27
|
+
failures_measurement: import("@sinclair/typebox").TLiteral<"measured" | "not_measured">;
|
|
28
|
+
failures: import("@sinclair/typebox").TInteger | import("@sinclair/typebox").TNull;
|
|
29
|
+
}>, import("@sinclair/typebox").TObject<{
|
|
30
|
+
server: import("@sinclair/typebox").TString;
|
|
31
|
+
configured: import("@sinclair/typebox").TBoolean;
|
|
32
|
+
measurement: import("@sinclair/typebox").TLiteral<"measured" | "not_measured">;
|
|
33
|
+
calls: import("@sinclair/typebox").TInteger | import("@sinclair/typebox").TNull;
|
|
34
|
+
failures_measurement: import("@sinclair/typebox").TLiteral<"measured" | "not_measured">;
|
|
35
|
+
failures: import("@sinclair/typebox").TInteger | import("@sinclair/typebox").TNull;
|
|
36
|
+
}>, import("@sinclair/typebox").TObject<{
|
|
37
|
+
server: import("@sinclair/typebox").TString;
|
|
38
|
+
configured: import("@sinclair/typebox").TBoolean;
|
|
39
|
+
measurement: import("@sinclair/typebox").TLiteral<"measured" | "not_measured">;
|
|
40
|
+
calls: import("@sinclair/typebox").TInteger | import("@sinclair/typebox").TNull;
|
|
41
|
+
failures_measurement: import("@sinclair/typebox").TLiteral<"measured" | "not_measured">;
|
|
42
|
+
failures: import("@sinclair/typebox").TInteger | import("@sinclair/typebox").TNull;
|
|
43
|
+
}>]>>;
|
|
44
|
+
proposals: import("@sinclair/typebox").TObject<Record<"agent" | "claude_md" | "command" | "hook" | "loop_prompt" | "mcp_config" | "permissions" | "rule" | "skill", TSchema>>;
|
|
45
|
+
records_skipped: import("@sinclair/typebox").TInteger;
|
|
46
|
+
}>;
|
|
47
|
+
export type AnalysisReport = Static<typeof AnalysisReportSchema>;
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { Type } from "@sinclair/typebox";
|
|
2
|
+
import { Agent, Count, closed, Instant, SemVer, schemaId, Token, } from "./common.js";
|
|
3
|
+
export const INTERVENTION_KINDS = [
|
|
4
|
+
"approval",
|
|
5
|
+
"continue",
|
|
6
|
+
"ci_relay",
|
|
7
|
+
"review_relay",
|
|
8
|
+
"answer",
|
|
9
|
+
"other",
|
|
10
|
+
];
|
|
11
|
+
export const LOOP_KINDS = [
|
|
12
|
+
"issue_to_pr",
|
|
13
|
+
"ci_fix",
|
|
14
|
+
"review_response",
|
|
15
|
+
"test_fix",
|
|
16
|
+
"lint_fix",
|
|
17
|
+
"dependency_update",
|
|
18
|
+
];
|
|
19
|
+
export const PROPOSAL_KINDS = [
|
|
20
|
+
"permissions",
|
|
21
|
+
"hook",
|
|
22
|
+
"skill",
|
|
23
|
+
"rule",
|
|
24
|
+
"agent",
|
|
25
|
+
"command",
|
|
26
|
+
"loop_prompt",
|
|
27
|
+
"mcp_config",
|
|
28
|
+
"claude_md",
|
|
29
|
+
];
|
|
30
|
+
export const MEASUREMENTS = ["measured", "not_measured"];
|
|
31
|
+
const Seconds = Type.Number({ minimum: 0 });
|
|
32
|
+
// semantic-conventions.md「Analysis report」: measuredでは、中央値の元になる件数が0なら中央値はnull、1以上なら数値。
|
|
33
|
+
// not_measuredでは全項目をnullにし、0と区別する。
|
|
34
|
+
const measuredOrNot = (counted, median, others = {}) => {
|
|
35
|
+
const measured = (count, value) => Type.Object({
|
|
36
|
+
measurement: Type.Literal("measured"),
|
|
37
|
+
[counted]: count,
|
|
38
|
+
...others,
|
|
39
|
+
[median]: value,
|
|
40
|
+
}, closed);
|
|
41
|
+
return Type.Union([
|
|
42
|
+
measured(Type.Literal(0), Type.Null()),
|
|
43
|
+
measured(Type.Integer({ minimum: 1 }), Seconds),
|
|
44
|
+
Type.Object({
|
|
45
|
+
measurement: Type.Literal("not_measured"),
|
|
46
|
+
...Object.fromEntries([counted, ...Object.keys(others), median].map((k) => [
|
|
47
|
+
k,
|
|
48
|
+
Type.Null(),
|
|
49
|
+
])),
|
|
50
|
+
}, closed),
|
|
51
|
+
]);
|
|
52
|
+
};
|
|
53
|
+
const byKind = (kinds, value) => Type.Object(Object.fromEntries(kinds.map((k) => [k, value])), closed);
|
|
54
|
+
const Intervention = measuredOrNot("count", "wait_seconds_median");
|
|
55
|
+
const Loop = measuredOrNot("occurrences", "duration_seconds_median", {
|
|
56
|
+
interventions: Count,
|
|
57
|
+
});
|
|
58
|
+
const mcpVariant = (callsMeasured, failuresMeasured) => Type.Object({
|
|
59
|
+
server: Token(),
|
|
60
|
+
configured: Type.Boolean(),
|
|
61
|
+
measurement: Type.Literal(callsMeasured ? "measured" : "not_measured"),
|
|
62
|
+
calls: callsMeasured ? Count : Type.Null(),
|
|
63
|
+
failures_measurement: Type.Literal(failuresMeasured ? "measured" : "not_measured"),
|
|
64
|
+
failures: failuresMeasured ? Count : Type.Null(),
|
|
65
|
+
}, closed);
|
|
66
|
+
const McpServer = Type.Union([
|
|
67
|
+
mcpVariant(true, true),
|
|
68
|
+
mcpVariant(true, false),
|
|
69
|
+
mcpVariant(false, true),
|
|
70
|
+
mcpVariant(false, false),
|
|
71
|
+
]);
|
|
72
|
+
const ProposalCount = Type.Object({ shown: Count, applied_detected: Count }, closed);
|
|
73
|
+
export const AnalysisReportSchema = Type.Object({
|
|
74
|
+
agent: Agent,
|
|
75
|
+
session_id: Token(),
|
|
76
|
+
// 記録から取れなければ省略(session registrationのfirst_prompt_idと同じ意味)。
|
|
77
|
+
first_prompt_id: Type.Optional(Token()),
|
|
78
|
+
started_at: Instant,
|
|
79
|
+
analyzer_version: SemVer,
|
|
80
|
+
parser_version: SemVer,
|
|
81
|
+
interventions: byKind(INTERVENTION_KINDS, Intervention),
|
|
82
|
+
loops: byKind(LOOP_KINDS, Loop),
|
|
83
|
+
mcp_servers: Type.Array(McpServer),
|
|
84
|
+
proposals: byKind(PROPOSAL_KINDS, ProposalCount),
|
|
85
|
+
records_skipped: Count,
|
|
86
|
+
}, { $id: schemaId("analysis-report"), ...closed });
|
|
87
|
+
//# sourceMappingURL=analysis-report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analysis-report.js","sourceRoot":"","sources":["../../src/schemas/analysis-report.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare const SEMCONV_MAJOR = 0;
|
|
2
|
+
export declare const schemaId: (name: string) => string;
|
|
3
|
+
export declare const Instant: import("@sinclair/typebox").TString;
|
|
4
|
+
export declare const CalendarDate: import("@sinclair/typebox").TString;
|
|
5
|
+
export declare const Sha256Hex: import("@sinclair/typebox").TString;
|
|
6
|
+
export declare const CommitSha: import("@sinclair/typebox").TString;
|
|
7
|
+
export declare const RepositorySlug: import("@sinclair/typebox").TString;
|
|
8
|
+
export declare const SemVer: import("@sinclair/typebox").TString;
|
|
9
|
+
export declare const Token: (maxLength?: number) => import("@sinclair/typebox").TString;
|
|
10
|
+
export declare const Count: import("@sinclair/typebox").TInteger;
|
|
11
|
+
export declare const Agent: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"claude_code">, import("@sinclair/typebox").TLiteral<"codex">]>;
|
|
12
|
+
export declare const closed: {
|
|
13
|
+
readonly additionalProperties: false;
|
|
14
|
+
};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { Type } from "@sinclair/typebox";
|
|
2
|
+
import { INSTANT_PATTERN, TOKEN_PATTERN } from "../values.js";
|
|
3
|
+
// 互換性の単位はmajor(semantic-conventions.md「互換性」)。$idにはmajorだけを含める。
|
|
4
|
+
export const SEMCONV_MAJOR = 0;
|
|
5
|
+
export const schemaId = (name) => `urn:harnessforce:semconv:${SEMCONV_MAJOR}:${name}`;
|
|
6
|
+
export const Instant = Type.String({
|
|
7
|
+
format: "date-time",
|
|
8
|
+
pattern: INSTANT_PATTERN,
|
|
9
|
+
});
|
|
10
|
+
export const CalendarDate = Type.String({
|
|
11
|
+
format: "date",
|
|
12
|
+
pattern: "^\\d{4}-\\d{2}-\\d{2}$",
|
|
13
|
+
});
|
|
14
|
+
export const Sha256Hex = Type.String({ pattern: "^[0-9a-f]{64}$" });
|
|
15
|
+
export const CommitSha = Type.String({
|
|
16
|
+
pattern: "^(?:[0-9a-f]{40}|[0-9a-f]{64})$",
|
|
17
|
+
});
|
|
18
|
+
// <host>/<owner>/<name>(semantic-conventions.md「repositoryの正規化」)。owner/nameだけの2segmentは拒否する。
|
|
19
|
+
export const RepositorySlug = Type.String({
|
|
20
|
+
pattern: "^[a-z0-9.-]+/[A-Za-z0-9_.-]+/[A-Za-z0-9_.-]+$",
|
|
21
|
+
});
|
|
22
|
+
export const SemVer = Type.String({
|
|
23
|
+
pattern: "^\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?$",
|
|
24
|
+
});
|
|
25
|
+
// minLengthとmaxLengthは、JSON Schemaの定義どおりcode pointで数える。
|
|
26
|
+
export const Token = (maxLength = 256) => Type.String({ minLength: 1, maxLength, pattern: TOKEN_PATTERN });
|
|
27
|
+
export const Count = Type.Integer({ minimum: 0 });
|
|
28
|
+
export const Agent = Type.Union([
|
|
29
|
+
Type.Literal("claude_code"),
|
|
30
|
+
Type.Literal("codex"),
|
|
31
|
+
]);
|
|
32
|
+
export const closed = { additionalProperties: false };
|
|
33
|
+
//# sourceMappingURL=common.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"common.js","sourceRoot":"","sources":["../../src/schemas/common.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE9D,+DAA+D;AAC/D,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC;AAC/B,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAE,EAAE,CACxC,4BAA4B,aAAa,IAAI,IAAI,EAAE,CAAC;AAErD,MAAM,CAAC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC;IAClC,MAAM,EAAE,WAAW;IACnB,OAAO,EAAE,eAAe;CACxB,CAAC,CAAC;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC;IACvC,MAAM,EAAE,MAAM;IACd,OAAO,EAAE,wBAAwB;CACjC,CAAC,CAAC;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC,CAAC;AACpE,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC;IACpC,OAAO,EAAE,iCAAiC;CAC1C,CAAC,CAAC;AACH,6FAA6F;AAC7F,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC;IACzC,OAAO,EAAE,+CAA+C;CACxD,CAAC,CAAC;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IACjC,OAAO,EAAE,0CAA0C;CACnD,CAAC,CAAC;AACH,wDAAwD;AACxD,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,SAAS,GAAG,GAAG,EAAE,EAAE,CACxC,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC;AAClE,MAAM,CAAC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;AAClD,MAAM,CAAC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IAC/B,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC;IAC3B,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;CACrB,CAAC,CAAC;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,EAAE,oBAAoB,EAAE,KAAK,EAAW,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type Static } from "@sinclair/typebox";
|
|
2
|
+
export declare const COMPONENT_KINDS: readonly ["skill", "rule", "agent", "command", "hook", "permissions", "mcp_server", "model", "workflow"];
|
|
3
|
+
export declare const CONFIG_SOURCES: readonly ["managed", "user", "repository", "local", "plugin"];
|
|
4
|
+
export declare const ConfigSnapshotSchema: import("@sinclair/typebox").TObject<{
|
|
5
|
+
agent: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"claude_code">, import("@sinclair/typebox").TLiteral<"codex">]>;
|
|
6
|
+
session_id: import("@sinclair/typebox").TString;
|
|
7
|
+
components: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
|
|
8
|
+
kind: import("@sinclair/typebox").TUnion<import("@sinclair/typebox").TLiteral<"agent" | "command" | "hook" | "mcp_server" | "model" | "permissions" | "rule" | "skill" | "workflow">[]>;
|
|
9
|
+
id: import("@sinclair/typebox").TString;
|
|
10
|
+
version: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
11
|
+
hash: import("@sinclair/typebox").TString;
|
|
12
|
+
source: import("@sinclair/typebox").TUnion<import("@sinclair/typebox").TLiteral<"local" | "managed" | "plugin" | "repository" | "user">[]>;
|
|
13
|
+
}>>;
|
|
14
|
+
}>;
|
|
15
|
+
export type ConfigSnapshot = Static<typeof ConfigSnapshotSchema>;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { Type } from "@sinclair/typebox";
|
|
2
|
+
import { Agent, closed, Sha256Hex, schemaId, Token } from "./common.js";
|
|
3
|
+
export const COMPONENT_KINDS = [
|
|
4
|
+
"skill",
|
|
5
|
+
"rule",
|
|
6
|
+
"agent",
|
|
7
|
+
"command",
|
|
8
|
+
"hook",
|
|
9
|
+
"permissions",
|
|
10
|
+
"mcp_server",
|
|
11
|
+
"model",
|
|
12
|
+
"workflow",
|
|
13
|
+
];
|
|
14
|
+
// Claude Codeのsettingsのscopeに対応する収集元(managed/user/repository/local)とplugin。
|
|
15
|
+
export const CONFIG_SOURCES = [
|
|
16
|
+
"managed",
|
|
17
|
+
"user",
|
|
18
|
+
"repository",
|
|
19
|
+
"local",
|
|
20
|
+
"plugin",
|
|
21
|
+
];
|
|
22
|
+
const Component = Type.Object({
|
|
23
|
+
kind: Type.Union(COMPONENT_KINDS.map((k) => Type.Literal(k))),
|
|
24
|
+
id: Token(),
|
|
25
|
+
// permissionsやmodelはversionを持たないため任意とする。
|
|
26
|
+
version: Type.Optional(Token(64)),
|
|
27
|
+
hash: Sha256Hex,
|
|
28
|
+
source: Type.Union(CONFIG_SOURCES.map((s) => Type.Literal(s))),
|
|
29
|
+
}, closed);
|
|
30
|
+
export const ConfigSnapshotSchema = Type.Object({
|
|
31
|
+
// 構成を収集したsession。RunとConfigSnapshotはこのagent/session_idで結ぶ。
|
|
32
|
+
agent: Agent,
|
|
33
|
+
session_id: Token(),
|
|
34
|
+
components: Type.Array(Component, { minItems: 1 }),
|
|
35
|
+
}, { $id: schemaId("config-snapshot"), ...closed });
|
|
36
|
+
//# sourceMappingURL=config-snapshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-snapshot.js","sourceRoot":"","sources":["../../src/schemas/config-snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAExE,MAAM,CAAC,MAAM,eAAe,GAAG;IAC9B,OAAO;IACP,MAAM;IACN,OAAO;IACP,SAAS;IACT,MAAM;IACN,aAAa;IACb,YAAY;IACZ,OAAO;IACP,UAAU;CACD,CAAC;AACX,4EAA4E;AAC5E,MAAM,CAAC,MAAM,cAAc,GAAG;IAC7B,SAAS;IACT,MAAM;IACN,YAAY;IACZ,OAAO;IACP,QAAQ;CACC,CAAC;AAEX,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAC5B;IACC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7D,EAAE,EAAE,KAAK,EAAE;IACX,yCAAyC;IACzC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACjC,IAAI,EAAE,SAAS;IACf,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;CAC9D,EACD,MAAM,CACN,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,CAAC,MAAM,CAC9C;IACC,2DAA2D;IAC3D,KAAK,EAAE,KAAK;IACZ,UAAU,EAAE,KAAK,EAAE;IACnB,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;CAClD,EACD,EAAE,GAAG,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EAAE,GAAG,MAAM,EAAE,CAC/C,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { type Static } from "@sinclair/typebox";
|
|
2
|
+
export declare const STATUS_CATEGORIES: readonly ["backlog", "unstarted", "started", "done", "canceled"];
|
|
3
|
+
export declare const ACTIVITY_EVENT_TYPES: readonly ["issue.created", "issue.status_changed", "issue.assigned", "issue.updated", "pull_request.opened", "pull_request.merged", "pull_request.closed", "review.submitted", "commit.pushed", "ci.completed", "release.published", "run.started", "run.completed", "plan.updated", "decision.recorded", "config.changed", "evaluation.recorded"];
|
|
4
|
+
export declare const ENTITY_TYPES: readonly ["issue", "pull_request", "ci_run", "run", "trace", "artifact"];
|
|
5
|
+
export declare const IngestIssueSchema: import("@sinclair/typebox").TObject<{
|
|
6
|
+
external_id: import("@sinclair/typebox").TString;
|
|
7
|
+
project_key: import("@sinclair/typebox").TString;
|
|
8
|
+
identifier: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
9
|
+
title: import("@sinclair/typebox").TString;
|
|
10
|
+
description: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
11
|
+
status_category: import("@sinclair/typebox").TUnion<import("@sinclair/typebox").TLiteral<string>[]>;
|
|
12
|
+
raw_status: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
13
|
+
is_blocked: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
|
|
14
|
+
assignee: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
15
|
+
priority: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
16
|
+
due_on: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
17
|
+
parent_external_id: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
18
|
+
url: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
19
|
+
source_updated_at: import("@sinclair/typebox").TString;
|
|
20
|
+
}>;
|
|
21
|
+
export type IngestIssue = Static<typeof IngestIssueSchema>;
|
|
22
|
+
export declare const IngestEventSchema: import("@sinclair/typebox").TObject<{
|
|
23
|
+
event_id: import("@sinclair/typebox").TString;
|
|
24
|
+
event_type: import("@sinclair/typebox").TUnion<import("@sinclair/typebox").TLiteral<string>[]>;
|
|
25
|
+
occurred_at: import("@sinclair/typebox").TString;
|
|
26
|
+
actor_type: import("@sinclair/typebox").TUnion<import("@sinclair/typebox").TLiteral<string>[]>;
|
|
27
|
+
actor_id: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
28
|
+
entity: import("@sinclair/typebox").TObject<{
|
|
29
|
+
type: import("@sinclair/typebox").TUnion<import("@sinclair/typebox").TLiteral<string>[]>;
|
|
30
|
+
id: import("@sinclair/typebox").TString;
|
|
31
|
+
}>;
|
|
32
|
+
payload: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRecord<import("@sinclair/typebox").TString, import("@sinclair/typebox").TUnknown>>;
|
|
33
|
+
correlation_id: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
34
|
+
causation_id: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
35
|
+
}>;
|
|
36
|
+
export type IngestEvent = Static<typeof IngestEventSchema>;
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { Type } from "@sinclair/typebox";
|
|
2
|
+
import { EXECUTION_ACTOR_TYPES } from "../attributes.js";
|
|
3
|
+
import { CalendarDate, closed, Instant, schemaId, Token } from "./common.js";
|
|
4
|
+
const literals = (values) => Type.Union(values.map((v) => Type.Literal(v)));
|
|
5
|
+
export const STATUS_CATEGORIES = [
|
|
6
|
+
"backlog",
|
|
7
|
+
"unstarted",
|
|
8
|
+
"started",
|
|
9
|
+
"done",
|
|
10
|
+
"canceled",
|
|
11
|
+
];
|
|
12
|
+
export const ACTIVITY_EVENT_TYPES = [
|
|
13
|
+
"issue.created",
|
|
14
|
+
"issue.status_changed",
|
|
15
|
+
"issue.assigned",
|
|
16
|
+
"issue.updated",
|
|
17
|
+
"pull_request.opened",
|
|
18
|
+
"pull_request.merged",
|
|
19
|
+
"pull_request.closed",
|
|
20
|
+
"review.submitted",
|
|
21
|
+
"commit.pushed",
|
|
22
|
+
"ci.completed",
|
|
23
|
+
"release.published",
|
|
24
|
+
"run.started",
|
|
25
|
+
"run.completed",
|
|
26
|
+
"plan.updated",
|
|
27
|
+
"decision.recorded",
|
|
28
|
+
"config.changed",
|
|
29
|
+
"evaluation.recorded",
|
|
30
|
+
];
|
|
31
|
+
export const ENTITY_TYPES = [
|
|
32
|
+
"issue",
|
|
33
|
+
"pull_request",
|
|
34
|
+
"ci_run",
|
|
35
|
+
"run",
|
|
36
|
+
"trace",
|
|
37
|
+
"artifact",
|
|
38
|
+
];
|
|
39
|
+
export const IngestIssueSchema = Type.Object({
|
|
40
|
+
external_id: Token(),
|
|
41
|
+
// 存在しないkeyの要素は拒否する(Harnessforce側でのDB検証。schemaはToken形式だけを保証する)。
|
|
42
|
+
project_key: Token(),
|
|
43
|
+
identifier: Type.Optional(Token(300)),
|
|
44
|
+
title: Type.String({ minLength: 1, maxLength: 1000 }),
|
|
45
|
+
description: Type.Optional(Type.String({ maxLength: 100_000 })),
|
|
46
|
+
status_category: literals(STATUS_CATEGORIES),
|
|
47
|
+
raw_status: Type.Optional(Type.String({ maxLength: 200 })),
|
|
48
|
+
is_blocked: Type.Optional(Type.Boolean()),
|
|
49
|
+
assignee: Type.Optional(Token()),
|
|
50
|
+
priority: Type.Optional(Type.String({ maxLength: 100 })),
|
|
51
|
+
due_on: Type.Optional(CalendarDate),
|
|
52
|
+
parent_external_id: Type.Optional(Token()),
|
|
53
|
+
// 画面にlinkとして出すため、schemeはhttpとhttpsに限る(semantic-conventions.md「Issue」)。WHATWG URLはschemeを小文字へ揃えるため大文字も許す。
|
|
54
|
+
url: Type.Optional(Type.String({
|
|
55
|
+
format: "uri",
|
|
56
|
+
pattern: "^[Hh][Tt][Tt][Pp][Ss]?:",
|
|
57
|
+
maxLength: 2048,
|
|
58
|
+
})),
|
|
59
|
+
source_updated_at: Instant,
|
|
60
|
+
}, { $id: schemaId("ingest-issue"), ...closed });
|
|
61
|
+
export const IngestEventSchema = Type.Object({
|
|
62
|
+
event_id: Token(),
|
|
63
|
+
event_type: literals(ACTIVITY_EVENT_TYPES),
|
|
64
|
+
occurred_at: Instant,
|
|
65
|
+
actor_type: literals(EXECUTION_ACTOR_TYPES),
|
|
66
|
+
actor_id: Type.Optional(Token()),
|
|
67
|
+
// idは内部IDではなく送信元でのID(sender-side)。解決はingest APIで届いたExternalRefの中だけで行う。
|
|
68
|
+
entity: Type.Object({ type: literals(ENTITY_TYPES), id: Token() }, closed),
|
|
69
|
+
payload: Type.Optional(Type.Record(Type.String(), Type.Unknown())),
|
|
70
|
+
correlation_id: Type.Optional(Token()),
|
|
71
|
+
causation_id: Type.Optional(Token()),
|
|
72
|
+
}, { $id: schemaId("ingest-event"), ...closed });
|
|
73
|
+
//# sourceMappingURL=ingest-items.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ingest-items.js","sourceRoot":"","sources":["../../src/schemas/ingest-items.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type Static } from "@sinclair/typebox";
|
|
2
|
+
export declare const SessionImportSchema: import("@sinclair/typebox").TObject<{
|
|
3
|
+
agent: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"claude_code">, import("@sinclair/typebox").TLiteral<"codex">]>;
|
|
4
|
+
session_id: import("@sinclair/typebox").TString;
|
|
5
|
+
first_prompt_id: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
6
|
+
repository: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
7
|
+
branch: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
8
|
+
commit: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
9
|
+
issue_identifier: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
10
|
+
started_at: import("@sinclair/typebox").TString;
|
|
11
|
+
source: import("@sinclair/typebox").TLiteral<"import">;
|
|
12
|
+
ended_at: import("@sinclair/typebox").TString;
|
|
13
|
+
model: import("@sinclair/typebox").TString;
|
|
14
|
+
input_tokens: import("@sinclair/typebox").TInteger;
|
|
15
|
+
output_tokens: import("@sinclair/typebox").TInteger;
|
|
16
|
+
tool_calls: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
|
|
17
|
+
tool: import("@sinclair/typebox").TString;
|
|
18
|
+
calls: import("@sinclair/typebox").TInteger;
|
|
19
|
+
failures: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TInteger>;
|
|
20
|
+
}>>;
|
|
21
|
+
parser_version: import("@sinclair/typebox").TString;
|
|
22
|
+
}>;
|
|
23
|
+
export type SessionImport = Static<typeof SessionImportSchema>;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Type } from "@sinclair/typebox";
|
|
2
|
+
import { Count, closed, Instant, SemVer, schemaId, Token } from "./common.js";
|
|
3
|
+
import { registrationProperties } from "./session-registration.js";
|
|
4
|
+
const ToolCallSummary = Type.Object({ tool: Token(128), calls: Count, failures: Type.Optional(Count) }, closed);
|
|
5
|
+
export const SessionImportSchema = Type.Object({
|
|
6
|
+
...registrationProperties,
|
|
7
|
+
source: Type.Literal("import"),
|
|
8
|
+
ended_at: Instant,
|
|
9
|
+
model: Token(128),
|
|
10
|
+
input_tokens: Count,
|
|
11
|
+
output_tokens: Count,
|
|
12
|
+
tool_calls: Type.Array(ToolCallSummary),
|
|
13
|
+
parser_version: SemVer,
|
|
14
|
+
}, { $id: schemaId("session-import"), ...closed });
|
|
15
|
+
//# sourceMappingURL=session-import.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-import.js","sourceRoot":"","sources":["../../src/schemas/session-import.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAC9E,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAEnE,MAAM,eAAe,GAAG,IAAI,CAAC,MAAM,CAClC,EAAE,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,EAClE,MAAM,CACN,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAC,MAAM,CAC7C;IACC,GAAG,sBAAsB;IACzB,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;IAC9B,QAAQ,EAAE,OAAO;IACjB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC;IACjB,YAAY,EAAE,KAAK;IACnB,aAAa,EAAE,KAAK;IACpB,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC;IACvC,cAAc,EAAE,MAAM;CACtB,EACD,EAAE,GAAG,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,GAAG,MAAM,EAAE,CAC9C,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { type Static } from "@sinclair/typebox";
|
|
2
|
+
export declare const REGISTRATION_SOURCES: readonly ["hook", "cli", "mcp", "import"];
|
|
3
|
+
export declare const registrationProperties: {
|
|
4
|
+
agent: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"claude_code">, import("@sinclair/typebox").TLiteral<"codex">]>;
|
|
5
|
+
session_id: import("@sinclair/typebox").TString;
|
|
6
|
+
first_prompt_id: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
7
|
+
repository: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
8
|
+
branch: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
9
|
+
commit: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
10
|
+
issue_identifier: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
11
|
+
source: import("@sinclair/typebox").TUnion<import("@sinclair/typebox").TLiteral<"cli" | "hook" | "import" | "mcp">[]>;
|
|
12
|
+
started_at: import("@sinclair/typebox").TString;
|
|
13
|
+
};
|
|
14
|
+
export declare const SessionRegistrationSchema: import("@sinclair/typebox").TObject<{
|
|
15
|
+
agent: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"claude_code">, import("@sinclair/typebox").TLiteral<"codex">]>;
|
|
16
|
+
session_id: import("@sinclair/typebox").TString;
|
|
17
|
+
first_prompt_id: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
18
|
+
repository: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
19
|
+
branch: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
20
|
+
commit: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
21
|
+
issue_identifier: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
22
|
+
source: import("@sinclair/typebox").TUnion<import("@sinclair/typebox").TLiteral<"cli" | "hook" | "import" | "mcp">[]>;
|
|
23
|
+
started_at: import("@sinclair/typebox").TString;
|
|
24
|
+
}>;
|
|
25
|
+
export type SessionRegistration = Static<typeof SessionRegistrationSchema>;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Type } from "@sinclair/typebox";
|
|
2
|
+
import { Agent, CommitSha, closed, Instant, RepositorySlug, schemaId, Token, } from "./common.js";
|
|
3
|
+
export const REGISTRATION_SOURCES = ["hook", "cli", "mcp", "import"];
|
|
4
|
+
export const registrationProperties = {
|
|
5
|
+
agent: Agent,
|
|
6
|
+
session_id: Token(),
|
|
7
|
+
first_prompt_id: Type.Optional(Token()),
|
|
8
|
+
repository: Type.Optional(RepositorySlug),
|
|
9
|
+
branch: Type.Optional(Token()),
|
|
10
|
+
commit: Type.Optional(CommitSha),
|
|
11
|
+
issue_identifier: Type.Optional(Token(300)),
|
|
12
|
+
source: Type.Union(REGISTRATION_SOURCES.map((s) => Type.Literal(s))),
|
|
13
|
+
started_at: Instant,
|
|
14
|
+
};
|
|
15
|
+
export const SessionRegistrationSchema = Type.Object(registrationProperties, {
|
|
16
|
+
$id: schemaId("session-registration"),
|
|
17
|
+
...closed,
|
|
18
|
+
});
|
|
19
|
+
//# sourceMappingURL=session-registration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-registration.js","sourceRoot":"","sources":["../../src/schemas/session-registration.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EACN,KAAK,EACL,SAAS,EACT,MAAM,EACN,OAAO,EACP,cAAc,EACd,QAAQ,EACR,KAAK,GACL,MAAM,aAAa,CAAC;AAErB,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAU,CAAC;AAE9E,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACrC,KAAK,EAAE,KAAK;IACZ,UAAU,EAAE,KAAK,EAAE;IACnB,eAAe,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IACvC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC;IACzC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IAC9B,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;IAChC,gBAAgB,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3C,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACpE,UAAU,EAAE,OAAO;CACnB,CAAC;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAAG,IAAI,CAAC,MAAM,CAAC,sBAAsB,EAAE;IAC5E,GAAG,EAAE,QAAQ,CAAC,sBAAsB,CAAC;IACrC,GAAG,MAAM;CACT,CAAC,CAAC"}
|